On the HPD (Hot Plug Detect) path this change makes use of the connector
status to notify all connectors, rather than just first one found that
suffered a status change.

Similarly on the polling side, this also takes into consideration
sending per-connector udev hotplug events.

Signed-off-by: Marius Vlad <[email protected]>
---
 drivers/gpu/drm/drm_probe_helper.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_probe_helper.c 
b/drivers/gpu/drm/drm_probe_helper.c
index f0474368e98d..63960f589b6b 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -861,8 +861,14 @@ static void output_poll_execute(struct work_struct *work)
        mutex_unlock(&dev->mode_config.mutex);
 
 out:
-       if (changed)
-               drm_kms_helper_hotplug_event(dev);
+       if (changed) {
+               drm_connector_list_iter_begin(dev, &conn_iter);
+               drm_for_each_connector_iter(connector, &conn_iter) {
+                       if (connector->status_changed)
+                               
drm_kms_helper_connector_hotplug_event(connector);
+               }
+               drm_connector_list_iter_end(&conn_iter);
+       }
 
        if (repoll)
                schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD);
@@ -1124,10 +1130,16 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev)
        drm_connector_list_iter_end(&conn_iter);
        mutex_unlock(&dev->mode_config.mutex);
 
-       if (changed == 1)
+       if (changed == 1) {
                drm_kms_helper_connector_hotplug_event(first_changed_connector);
-       else if (changed > 0)
-               drm_kms_helper_hotplug_event(dev);
+       } else if (changed > 0) {
+               drm_connector_list_iter_begin(dev, &conn_iter);
+               drm_for_each_connector_iter(connector, &conn_iter) {
+                       if (connector->status_changed)
+                               
drm_kms_helper_connector_hotplug_event(connector);
+               }
+               drm_connector_list_iter_end(&conn_iter);
+       }
 
        if (first_changed_connector)
                drm_connector_put(first_changed_connector);
-- 
2.47.2

Reply via email to