aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_connector.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-05-28 09:49:36 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2018-09-03 09:13:29 -0400
commitf2ea55775e0591aa292e2e8d9707d0196df73d61 (patch)
tree45cb7751f3ca59ded0ebca0edbc410f8a3e9652a /drivers/gpu/drm/omapdrm/omap_connector.c
parent09e5bb6d5b94929d9b0c17eec56c2f5d19886514 (diff)
drm/omap: Don't call .detect() operation recursively
Instead of calling the .detect() operation recursively from the display device back to the first device that provides hot plug detection support, iterate over the devices manually in the DRM connector .detect() implementation. This moves the complexity to a single central location and simplifies the logic in omap_dss_device drivers. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_connector.c')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_connector.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index f9cc04c7c0fa..4729af395156 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -61,26 +61,36 @@ static enum drm_connector_status omap_connector_detect(
61 struct drm_connector *connector, bool force) 61 struct drm_connector *connector, bool force)
62{ 62{
63 struct omap_connector *omap_connector = to_omap_connector(connector); 63 struct omap_connector *omap_connector = to_omap_connector(connector);
64 struct omap_dss_device *dssdev = omap_connector->dssdev; 64 struct omap_dss_device *dssdev;
65 enum drm_connector_status ret; 65 enum drm_connector_status status;
66
67 for (dssdev = omap_connector->dssdev; dssdev; dssdev = dssdev->src) {
68 if (dssdev->ops_flags & OMAP_DSS_DEVICE_OP_DETECT)
69 break;
70 }
66 71
67 if (dssdev->ops->detect) { 72 if (dssdev) {
68 if (dssdev->ops->detect(dssdev)) 73 if (dssdev->ops->detect(dssdev))
69 ret = connector_status_connected; 74 status = connector_status_connected;
70 else 75 else
71 ret = connector_status_disconnected; 76 status = connector_status_disconnected;
72 } else if (dssdev->type == OMAP_DISPLAY_TYPE_DPI ||
73 dssdev->type == OMAP_DISPLAY_TYPE_DBI ||
74 dssdev->type == OMAP_DISPLAY_TYPE_SDI ||
75 dssdev->type == OMAP_DISPLAY_TYPE_DSI) {
76 ret = connector_status_connected;
77 } else { 77 } else {
78 ret = connector_status_unknown; 78 switch (omap_connector->dssdev->type) {
79 case OMAP_DISPLAY_TYPE_DPI:
80 case OMAP_DISPLAY_TYPE_DBI:
81 case OMAP_DISPLAY_TYPE_SDI:
82 case OMAP_DISPLAY_TYPE_DSI:
83 status = connector_status_connected;
84 break;
85 default:
86 status = connector_status_unknown;
87 break;
88 }
79 } 89 }
80 90
81 VERB("%s: %d (force=%d)", omap_connector->dssdev->name, ret, force); 91 VERB("%s: %d (force=%d)", omap_connector->dssdev->name, status, force);
82 92
83 return ret; 93 return status;
84} 94}
85 95
86static void omap_connector_destroy(struct drm_connector *connector) 96static void omap_connector_destroy(struct drm_connector *connector)