]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
drm/omap: Notify all devices in the pipeline of output disconnection
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 13 Sep 2018 00:45:06 +0000 (03:45 +0300)
committerStefan Bader <stefan.bader@canonical.com>
Tue, 13 Aug 2019 12:11:36 +0000 (14:11 +0200)
BugLink: https://bugs.launchpad.net/bugs/1837517
[ Upstream commit 27a7e3e18419869cdcc414a404f3fe66f1b4e644 ]

For HDMI pipelines, when the output gets disconnected the device
handling CEC needs to be notified. Instead of guessing which device that
would be (and sometimes getting it wrong), notify all devices in the
pipeline.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
drivers/gpu/drm/omapdrm/omap_connector.c

index b81302c4bf9e6d49a678ff8e34829b8c0bc7dbc3..a45f925cb19a99ef983fb330d49b819518f418ae 100644 (file)
@@ -36,18 +36,22 @@ struct omap_connector {
 };
 
 static void omap_connector_hpd_notify(struct drm_connector *connector,
-                                     struct omap_dss_device *src,
                                      enum drm_connector_status status)
 {
-       if (status == connector_status_disconnected) {
-               /*
-                * If the source is an HDMI encoder, notify it of disconnection.
-                * This is required to let the HDMI encoder reset any internal
-                * state related to connection status, such as the CEC address.
-                */
-               if (src && src->type == OMAP_DISPLAY_TYPE_HDMI &&
-                   src->ops->hdmi.lost_hotplug)
-                       src->ops->hdmi.lost_hotplug(src);
+       struct omap_connector *omap_connector = to_omap_connector(connector);
+       struct omap_dss_device *dssdev;
+
+       if (status != connector_status_disconnected)
+               return;
+
+       /*
+        * Notify all devics in the pipeline of disconnection. This is required
+        * to let the HDMI encoders reset their internal state related to
+        * connection status, such as the CEC address.
+        */
+       for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
+               if (dssdev->ops && dssdev->ops->hdmi.lost_hotplug)
+                       dssdev->ops->hdmi.lost_hotplug(dssdev);
        }
 }
 
@@ -67,7 +71,7 @@ static void omap_connector_hpd_cb(void *cb_data,
        if (old_status == status)
                return;
 
-       omap_connector_hpd_notify(connector, omap_connector->hpd, status);
+       omap_connector_hpd_notify(connector, status);
 
        drm_kms_helper_hotplug_event(dev);
 }
@@ -128,7 +132,7 @@ static enum drm_connector_status omap_connector_detect(
                       ? connector_status_connected
                       : connector_status_disconnected;
 
-               omap_connector_hpd_notify(connector, dssdev->src, status);
+               omap_connector_hpd_notify(connector, status);
        } else {
                switch (omap_connector->display->type) {
                case OMAP_DISPLAY_TYPE_DPI: