Quoting Kuogee Hsieh (2022-01-14 13:11:47)
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.cWhen is this condition false? The irq isn't unmasked until the core has
index 7cc4d21..7cd6222 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -696,12 +699,9 @@ static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data)
* dp core (ahb/aux clks) must be initialized before
* irq_hpd be handled
*/
- if (dp->core_initialized) {
- ret = dp_display_usbpd_attention_cb(&dp->pdev->dev);
- if (ret == -ECONNRESET) { /* cable unplugged */
- dp->core_initialized = false;
- }
- }
+ if (dp->core_initialized)
been initialized. On the resume path I suppose the irq is enabled in
dp_display_host_init() calling dp_ctrl_reset_irq_ctrl(), and then we
could immediately get the interrupt but it will block on the event_mutex
lock.
+ dp_display_usbpd_attention_cb(&dp->pdev->dev);I fail to see where this condition happens. Can we suspend the device
+
DRM_DEBUG_DP("hpd_state=%d\n", state);
mutex_unlock(&dp->event_mutex);
@@ -1363,14 +1373,16 @@ static int dp_pm_suspend(struct device *dev)
if (dp_power_clk_status(dp->power, DP_CTRL_PM))
dp_ctrl_off_link_stream(dp->ctrl);
+ dp_display_host_phy_exit(dp);
+
+ /* host_init will be called at pm_resume */
dp_display_host_deinit(dp);
+ } else {
+ dp_display_host_phy_exit(dp);
without the irq being installed?
}
dp->hpd_state = ST_SUSPENDED;
- /* host_init will be called at pm_resume */
- dp->core_initialized = false;
-
DRM_DEBUG_DP("After, core_inited=%d power_on=%d\n",
dp->core_initialized, dp_display->power_on);