* Mutex protects extcon and interrupt functions from interfering
         * each other.
         */
+       struct mutex irq_lock;
        struct mutex extcon_lock;
        struct mutex mode_lock; /* used to bridge_detect */
        struct mutex aux_lock; /* used to aux data transfers */
        enum hdcp_state hdcp_status;
        struct delayed_work hdcp_work;
        struct work_struct hdcp_wait_ksv_list;
-       struct completion wait_edid_complete;
+       struct completion extcon_completion;
        u8 auto_train_retry;
        bool hdcp_desired;
        bool is_repeater;
                             it6505->hpd_state ? "high" : "low");
 
        if (it6505->hpd_state) {
-               wait_for_completion_timeout(&it6505->wait_edid_complete,
-                                           msecs_to_jiffies(6000));
+               wait_for_completion_timeout(&it6505->extcon_completion,
+                                           msecs_to_jiffies(1000));
                it6505_aux_on(it6505);
                if (it6505->dpcd[0] == 0) {
                        it6505_get_dpcd(it6505, DP_DPCD_REV, it6505->dpcd,
        };
        int int_status[3], i;
 
-       msleep(100);
-       mutex_lock(&it6505->extcon_lock);
+       mutex_lock(&it6505->irq_lock);
 
        if (it6505->enable_drv_hold || !it6505->powered)
                goto unlock;
        }
 
 unlock:
-       mutex_unlock(&it6505->extcon_lock);
+       mutex_unlock(&it6505->irq_lock);
 
        return IRQ_HANDLED;
 }
                 */
                if (ret)
                        it6505_poweron(it6505);
+
+               complete_all(&it6505->extcon_completion);
        } else {
                DRM_DEV_DEBUG_DRIVER(dev, "start to power off");
                pm_runtime_put_sync(dev);
+               reinit_completion(&it6505->extcon_completion);
 
                drm_helper_hpd_irq_event(it6505->bridge.dev);
                memset(it6505->dpcd, 0, sizeof(it6505->dpcd));
        if (!it6505)
                return -ENOMEM;
 
+       mutex_init(&it6505->irq_lock);
        mutex_init(&it6505->extcon_lock);
        mutex_init(&it6505->mode_lock);
        mutex_init(&it6505->aux_lock);
        INIT_WORK(&it6505->link_works, it6505_link_training_work);
        INIT_WORK(&it6505->hdcp_wait_ksv_list, it6505_hdcp_wait_ksv_list);
        INIT_DELAYED_WORK(&it6505->hdcp_work, it6505_hdcp_work);
-       init_completion(&it6505->wait_edid_complete);
+       init_completion(&it6505->extcon_completion);
        memset(it6505->dpcd, 0, sizeof(it6505->dpcd));
        it6505->powered = false;
        it6505->enable_drv_hold = DEFAULT_DRV_HOLD;