The DP MST framework already generates the required hotplug events for
MST topology changes.

Suppress connector hotplug event generation from the bridge connector
path while MST is active, and continue propagating HPD notifications to
the DP driver.

Signed-off-by: Yongxing Mou <[email protected]>
---
 drivers/gpu/drm/display/drm_bridge_connector.c | 6 ++++--
 drivers/gpu/drm/msm/dp/dp_display.c            | 9 ++++++++-
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c 
b/drivers/gpu/drm/display/drm_bridge_connector.c
index 7334d6677604..82ed0dc450ab 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -162,6 +162,7 @@ static void drm_bridge_connector_handle_hpd(struct 
drm_bridge_connector *drm_bri
 {
        struct drm_connector *connector = &drm_bridge_connector->base;
        struct drm_device *dev = connector->dev;
+       bool send_hotplug = true;
 
        /*
         * IRQ-only notification: extra_status carries the event but
@@ -179,9 +180,10 @@ static void drm_bridge_connector_handle_hpd(struct 
drm_bridge_connector *drm_bri
        connector->status = status;
        mutex_unlock(&dev->mode_config.mutex);
 
-       drm_bridge_connector_hpd_notify(connector, status, extra_status, NULL);
+       drm_bridge_connector_hpd_notify(connector, status, extra_status, 
&send_hotplug);
 
-       drm_kms_helper_connector_hotplug_event(connector);
+       if (send_hotplug)
+               drm_kms_helper_connector_hotplug_event(connector);
 }
 
 static void drm_bridge_connector_hpd_cb(void *cb_data,
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c 
b/drivers/gpu/drm/msm/dp/dp_display.c
index 6835c68fe510..bc93b566fbca 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -1790,10 +1790,17 @@ void msm_dp_bridge_hpd_notify(struct drm_bridge *bridge,
                        msm_dp_hpd_plug_handle(dp);
                } else {
                        msm_dp_hpd_plug_handle(dp);
+                       /* mst_active is set in plug_handle; suppress SST 
hotplug */
+                       if (send_hotplug && msm_dp_display->mst_active)
+                               *send_hotplug = false;
                }
        } else {
-               if (hpd_link_status == ISR_DISCONNECTED)
+               if (!msm_dp_display->mst_active) {
                        msm_dp_hpd_unplug_handle(dp);
+               } else if (send_hotplug) {
+                       msm_dp_hpd_unplug_handle(dp);
+                       *send_hotplug = false;
+               }
        }
 
        pm_runtime_put_sync(&msm_dp_display->pdev->dev);

-- 
2.43.0

Reply via email to