]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/msm/dp: Drop EV_USER_NOTIFICATION
authorJessica Zhang <jessica.zhang@oss.qualcomm.com>
Sun, 24 May 2026 10:33:33 +0000 (13:33 +0300)
committerDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Fri, 29 May 2026 11:58:52 +0000 (14:58 +0300)
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 <jessica.zhang@oss.qualcomm.com>
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Acked-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Tested-by: Val Packett <val@packett.cool> # x1e80100-dell-latitude-7455
Tested-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> # Hamoa IOT EVK, QCS8300 Ride
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Patchwork: https://patchwork.freedesktop.org/patch/727607/
Link: https://lore.kernel.org/r/20260524-hpd-refactor-v6-5-cf3ab488dd7b@oss.qualcomm.com
drivers/gpu/drm/msm/dp/dp_display.c
drivers/gpu/drm/msm/dp/dp_display.h
drivers/gpu/drm/msm/dp/dp_drm.c

index 1745735b3eb27afe36c93618a2a2153e8c1f8af2..8bf8c4099bbcb1718ae64900754087977ccdd0f1 100644 (file)
@@ -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 */
@@ -344,17 +343,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)
 {
@@ -378,7 +366,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);
 
        return 0;
 }
@@ -438,7 +430,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;
@@ -507,7 +499,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;
 }
@@ -528,7 +520,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) {
@@ -1122,10 +1114,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;
                }
index cc6e2cab36e9c0b1527ff292e547cbb4d69fd95c..60094061c1029bc7a06ffaa80d9403b40aa07eb1 100644 (file)
@@ -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;
index e4622c85fb66a3abdff90af3f56fd0bf56461026..f935093c4df4681770ab487916584cc76834b0d0 100644 (file)
@@ -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;
 }