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.c 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)
When is this condition false? The irq isn't unmasked until the core has 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);
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);
I fail to see where this condition happens. Can we suspend the device 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);