ST_CONNECT_PENDING,
        ST_CONNECTED,
        ST_DISCONNECT_PENDING,
-       ST_SUSPEND_PENDING,
+       ST_DISPLAY_OFF,
        ST_SUSPENDED,
 };
 
        mutex_lock(&dp->event_mutex);
 
        state =  dp->hpd_state;
-       if (state == ST_SUSPEND_PENDING) {
+       if (state == ST_DISPLAY_OFF || state == ST_SUSPENDED) {
                mutex_unlock(&dp->event_mutex);
                return 0;
        }
        hpd->hpd_high = 1;
 
        ret = dp_display_usbpd_configure_cb(&dp->pdev->dev);
-       if (ret) {      /* failed */
+       if (ret) {      /* link train failed */
                hpd->hpd_high = 0;
                dp->hpd_state = ST_DISCONNECTED;
+       } else {
+               /* start sentinel checking in case of missing uevent */
+               dp_add_event(dp, EV_CONNECT_PENDING_TIMEOUT, 0, tout);
        }
 
-       /* start sanity checking */
-       dp_add_event(dp, EV_CONNECT_PENDING_TIMEOUT, 0, tout);
-
        mutex_unlock(&dp->event_mutex);
 
        /* uevent will complete connection part */
        mutex_lock(&dp->event_mutex);
 
        state = dp->hpd_state;
-       if (state == ST_SUSPEND_PENDING) {
-               mutex_unlock(&dp->event_mutex);
-               return 0;
-       }
-
        if (state == ST_DISCONNECT_PENDING || state == ST_DISCONNECTED) {
                mutex_unlock(&dp->event_mutex);
                return 0;
         */
        dp_display_usbpd_disconnect_cb(&dp->pdev->dev);
 
-       /* start sanity checking */
+       /* start sentinel checking in case of missing uevent */
        dp_add_event(dp, EV_DISCONNECT_PENDING_TIMEOUT, 0, DP_TIMEOUT_5_SECOND);
 
        /* signal the disconnect event early to ensure proper teardown */
 
        /* irq_hpd can happen at either connected or disconnected state */
        state =  dp->hpd_state;
-       if (state == ST_SUSPEND_PENDING) {
+       if (state == ST_DISPLAY_OFF) {
                mutex_unlock(&dp->event_mutex);
                return 0;
        }
                }
 
                if (hpd_isr_status & DP_DP_IRQ_HPD_INT_MASK) {
-                       /* delete connect pending event first */
+                       /* stop sentinel connect pending checking */
                        dp_del_event(dp, EV_CONNECT_PENDING_TIMEOUT);
                        dp_add_event(dp, EV_IRQ_HPD_INT, 0, 0);
                }
 
        status = dp_catalog_hpd_get_state_status(dp->catalog);
 
-       if (status) {
+       if (status)
                dp->dp_display.is_connected = true;
-       } else {
+       else
                dp->dp_display.is_connected = false;
-               /* make sure next resume host_init be called */
-               dp->core_initialized = false;
-       }
 
        mutex_unlock(&dp->event_mutex);
 
 
        dp->hpd_state = ST_SUSPENDED;
 
+       /* host_init will be called at pm_resume */
+       dp->core_initialized = false;
+
        mutex_unlock(&dp->event_mutex);
 
        return 0;
 
        mutex_lock(&dp_display->event_mutex);
 
+       /* stop sentinel checking */
        dp_del_event(dp_display, EV_CONNECT_PENDING_TIMEOUT);
 
        rc = dp_display_set_mode(dp, &dp_display->dp_mode);
 
        state =  dp_display->hpd_state;
 
-       if (state == ST_SUSPEND_PENDING)
+       if (state == ST_DISPLAY_OFF)
                dp_display_host_init(dp_display);
 
        dp_display_enable(dp_display, 0);
                dp_display_unprepare(dp);
        }
 
-       if (state == ST_SUSPEND_PENDING)
+       /* manual kick off plug event to train link */
+       if (state == ST_DISPLAY_OFF)
                dp_add_event(dp_display, EV_IRQ_HPD_INT, 0, 0);
 
        /* completed connection */
 
        mutex_lock(&dp_display->event_mutex);
 
+       /* stop sentinel checking */
        dp_del_event(dp_display, EV_DISCONNECT_PENDING_TIMEOUT);
 
        dp_display_disable(dp_display, 0);
                /* completed disconnection */
                dp_display->hpd_state = ST_DISCONNECTED;
        } else {
-               dp_display->hpd_state = ST_SUSPEND_PENDING;
+               dp_display->hpd_state = ST_DISPLAY_OFF;
        }
 
        mutex_unlock(&dp_display->event_mutex);