On Fri, Jul 11, 2025 at 05:58:06PM -0700, Jessica Zhang wrote: > Add a boolean to track whether the DP cable is physically plugged in.
I think there is more than that. Other drivers check that there is actually something connected (so checking the sink count, etc.). See Mediatek or IT6505 drivers, they have simple examples. > Signed-off-by: Jessica Zhang <jessica.zh...@oss.qualcomm.com> > --- > drivers/gpu/drm/msm/dp/dp_display.c | 11 ++++++++++- > drivers/gpu/drm/msm/dp/dp_display.h | 1 + > 2 files changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/msm/dp/dp_display.c > b/drivers/gpu/drm/msm/dp/dp_display.c > index d87d47cc7ec3..6945df782f7b 100644 > --- a/drivers/gpu/drm/msm/dp/dp_display.c > +++ b/drivers/gpu/drm/msm/dp/dp_display.c > @@ -531,6 +531,7 @@ static int > msm_dp_display_handle_port_status_changed(struct msm_dp_display_priva > rc = msm_dp_display_process_hpd_high(dp); > if (rc) > dp->hpd_state = ST_DISCONNECTED; > + dp->msm_dp_display.connected = true; > } > } > > @@ -604,6 +605,8 @@ static int msm_dp_hpd_plug_handle(struct > msm_dp_display_private *dp, u32 data) > return 0; > } > > + dp->msm_dp_display.connected = true; > + > if (state == ST_DISCONNECT_PENDING) { > /* wait until ST_DISCONNECTED */ > msm_dp_add_event(dp, EV_HPD_PLUG_INT, 0, 1); /* delay = 1 */ > @@ -621,6 +624,7 @@ static int msm_dp_hpd_plug_handle(struct > msm_dp_display_private *dp, u32 data) > ret = msm_dp_display_usbpd_configure_cb(&pdev->dev); > if (ret) { /* link train failed */ > dp->hpd_state = ST_DISCONNECTED; > + dp->msm_dp_display.connected = false; > pm_runtime_put_sync(&pdev->dev); > } else { > dp->hpd_state = ST_MAINLINK_READY; > @@ -662,6 +666,8 @@ static int msm_dp_hpd_unplug_handle(struct > msm_dp_display_private *dp, u32 data) > drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n", > dp->msm_dp_display.connector_type, state); > > + dp->msm_dp_display.connected = false; > + > /* unplugged, no more irq_hpd handle */ > msm_dp_del_event(dp, EV_IRQ_HPD_INT); > > @@ -680,6 +686,7 @@ static int msm_dp_hpd_unplug_handle(struct > msm_dp_display_private *dp, u32 data) > msm_dp_ctrl_off_link(dp->ctrl); > msm_dp_display_host_phy_exit(dp); > dp->hpd_state = ST_DISCONNECTED; > + dp->msm_dp_display.connected = false; > msm_dp_display_notify_disconnect(&dp->msm_dp_display.pdev->dev); > pm_runtime_put_sync(&pdev->dev); > mutex_unlock(&dp->event_mutex); > @@ -1596,8 +1603,10 @@ void msm_dp_bridge_atomic_enable(struct drm_bridge > *drm_bridge, > return; > } > > - if (dp->is_edp) > + if (dp->is_edp) { > msm_dp_hpd_plug_handle(msm_dp_display, 0); > + dp->connected = true; > + } So, are we returning 'disconnected' for eDP panels up to the atomic_enable() point? Then nobody will ever enable it. > > mutex_lock(&msm_dp_display->event_mutex); > if (pm_runtime_resume_and_get(&dp->pdev->dev)) { > diff --git a/drivers/gpu/drm/msm/dp/dp_display.h > b/drivers/gpu/drm/msm/dp/dp_display.h > index cc6e2cab36e9..68bd8be19463 100644 > --- a/drivers/gpu/drm/msm/dp/dp_display.h > +++ b/drivers/gpu/drm/msm/dp/dp_display.h > @@ -16,6 +16,7 @@ struct msm_dp { > struct platform_device *pdev; > struct drm_connector *connector; > struct drm_bridge *next_bridge; > + bool connected; > bool link_ready; > bool audio_enabled; > bool power_on; > > -- > 2.50.1 > -- With best wishes Dmitry