On Thu, Jan 15, 2026 at 09:29:10AM +0200, Dmitry Baryshkov wrote: > From: Jessica Zhang <[email protected]> > > Currently, we queue an event for signalling HPD connect/disconnect. This > can mean a delay in plug/unplug handling and notifying DRM core when a > hotplug happens. > > Drop EV_USER_NOTIFICATION and signal the IRQ event as part of hotplug > handling. > > Signed-off-by: Jessica Zhang <[email protected]> > Signed-off-by: Dmitry Baryshkov <[email protected]> > --- > drivers/gpu/drm/msm/dp/dp_display.c | 28 ++++++++-------------------- > drivers/gpu/drm/msm/dp/dp_display.h | 1 + > drivers/gpu/drm/msm/dp/dp_drm.c | 2 ++ > 3 files changed, 11 insertions(+), 20 deletions(-) > > diff --git a/drivers/gpu/drm/msm/dp/dp_display.c > b/drivers/gpu/drm/msm/dp/dp_display.c > index 3184066adb15..e0b424ac861a 100644 > --- a/drivers/gpu/drm/msm/dp/dp_display.c > +++ b/drivers/gpu/drm/msm/dp/dp_display.c > @@ -58,7 +58,6 @@ enum { > EV_HPD_PLUG_INT, > EV_IRQ_HPD_INT, > EV_HPD_UNPLUG_INT, > - EV_USER_NOTIFICATION, > }; > > #define EVENT_TIMEOUT (HZ/10) /* 100ms */ > @@ -343,17 +342,6 @@ static const struct component_ops > msm_dp_display_comp_ops = { > .unbind = msm_dp_display_unbind, > }; > > -static void msm_dp_display_send_hpd_event(struct msm_dp *msm_dp_display) > -{ > - struct msm_dp_display_private *dp; > - struct drm_connector *connector; > - > - dp = container_of(msm_dp_display, struct msm_dp_display_private, > msm_dp_display); > - > - connector = dp->msm_dp_display.connector; > - drm_helper_hpd_irq_event(connector->dev); > -} > - > static int msm_dp_display_send_hpd_notification(struct > msm_dp_display_private *dp, > bool hpd) > { > @@ -377,7 +365,11 @@ static int msm_dp_display_send_hpd_notification(struct > msm_dp_display_private *d > > drm_dbg_dp(dp->drm_dev, "type=%d hpd=%d\n", > dp->msm_dp_display.connector_type, hpd); > - msm_dp_display_send_hpd_event(&dp->msm_dp_display); > + > + drm_bridge_hpd_notify(dp->msm_dp_display.bridge, > + hpd ? > + connector_status_connected : > + connector_status_disconnected);
Last time we tried this, we where out of sync with the link_ready in detect. So, I'm still wondering about that if (!link_ready) return disconnected; in the detect function. With a reliable detect method, this looks good though. Reviewed-by: Bjorn Andersson <[email protected]> Regards, Bjorn > > return 0; > } > @@ -437,7 +429,7 @@ static int msm_dp_display_process_hpd_high(struct > msm_dp_display_private *dp) > > msm_dp_link_reset_phy_params_vx_px(dp->link); > > - msm_dp_add_event(dp, EV_USER_NOTIFICATION, true, 0); > + msm_dp_display_send_hpd_notification(dp, true); > > end: > return rc; > @@ -506,7 +498,7 @@ static int msm_dp_display_notify_disconnect(struct device > *dev) > { > struct msm_dp_display_private *dp = dev_get_dp_display_private(dev); > > - msm_dp_add_event(dp, EV_USER_NOTIFICATION, false, 0); > + msm_dp_display_send_hpd_notification(dp, false); > > return 0; > } > @@ -527,7 +519,7 @@ static int > msm_dp_display_handle_port_status_changed(struct msm_dp_display_priva > drm_dbg_dp(dp->drm_dev, "sink count is zero, nothing to do\n"); > if (dp->hpd_state != ST_DISCONNECTED) { > dp->hpd_state = ST_DISCONNECT_PENDING; > - msm_dp_add_event(dp, EV_USER_NOTIFICATION, false, 0); > + msm_dp_display_send_hpd_notification(dp, false); > } > } else { > if (dp->hpd_state == ST_DISCONNECTED) { > @@ -1121,10 +1113,6 @@ static int hpd_event_thread(void *data) > case EV_IRQ_HPD_INT: > msm_dp_irq_hpd_handle(msm_dp_priv, todo->data); > break; > - case EV_USER_NOTIFICATION: > - msm_dp_display_send_hpd_notification(msm_dp_priv, > - todo->data); > - break; > default: > break; > } > diff --git a/drivers/gpu/drm/msm/dp/dp_display.h > b/drivers/gpu/drm/msm/dp/dp_display.h > index cc6e2cab36e9..60094061c102 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; > + struct drm_bridge *bridge; > bool link_ready; > bool audio_enabled; > bool power_on; > diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c > index e4622c85fb66..f935093c4df4 100644 > --- a/drivers/gpu/drm/msm/dp/dp_drm.c > +++ b/drivers/gpu/drm/msm/dp/dp_drm.c > @@ -340,6 +340,8 @@ int msm_dp_bridge_init(struct msm_dp *msm_dp_display, > struct drm_device *dev, > } > } > > + msm_dp_display->bridge = bridge; > + > return 0; > } > > > -- > 2.47.3 > >
