aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_connector.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-05-30 14:46:44 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2018-09-03 09:13:29 -0400
commit18412b667c96d1a5210f33191e128866a72cea07 (patch)
treeca07dc5a58fca60f9ee4b054bd54272d09ae950d /drivers/gpu/drm/omapdrm/omap_connector.c
parenta21a8f3c93e1a95cc811a1297ec60aa455a6c523 (diff)
drm/omap: Merge HPD enable operation with HPD callback registration
The omap_dss_device .enable_hpd() and .disable_hpd() are used to enable and disable hot-plug detection at omapdrm probe and remove time. This is required to avoid reporting hot-plug detection events before the DRM infrastructure is ready to accept them, as that could result in crashes or other malfunction. Hot-plug event reporting is conditioned by both HPD being enabled through the .enable_hpd() operation and by the HPD callback being registered though the .register_hpd_cb() operation. We thus don't need a separate enable operation if we can guarantee that callbacks won't be registered too early. HPD callbacks are registered at connector initialization time, which is too early to start reporting HPD events. There's however nothing blocking a move of callback registration to a later time when the omapdrm driver calls the HPD enable operations. Do so, and remove the HPD enable operation completely from 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.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index cd33995b0b1a..e77427d81eb9 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -30,6 +30,7 @@
30struct omap_connector { 30struct omap_connector {
31 struct drm_connector base; 31 struct drm_connector base;
32 struct omap_dss_device *dssdev; 32 struct omap_dss_device *dssdev;
33 struct omap_dss_device *hpd;
33 bool hdmi_mode; 34 bool hdmi_mode;
34}; 35};
35 36
@@ -50,6 +51,25 @@ static void omap_connector_hpd_cb(void *cb_data,
50 drm_kms_helper_hotplug_event(dev); 51 drm_kms_helper_hotplug_event(dev);
51} 52}
52 53
54void omap_connector_enable_hpd(struct drm_connector *connector)
55{
56 struct omap_connector *omap_connector = to_omap_connector(connector);
57 struct omap_dss_device *hpd = omap_connector->hpd;
58
59 if (hpd)
60 hpd->ops->register_hpd_cb(hpd, omap_connector_hpd_cb,
61 omap_connector);
62}
63
64void omap_connector_disable_hpd(struct drm_connector *connector)
65{
66 struct omap_connector *omap_connector = to_omap_connector(connector);
67 struct omap_dss_device *hpd = omap_connector->hpd;
68
69 if (hpd)
70 hpd->ops->unregister_hpd_cb(hpd);
71}
72
53bool omap_connector_get_hdmi_mode(struct drm_connector *connector) 73bool omap_connector_get_hdmi_mode(struct drm_connector *connector)
54{ 74{
55 struct omap_connector *omap_connector = to_omap_connector(connector); 75 struct omap_connector *omap_connector = to_omap_connector(connector);
@@ -109,14 +129,15 @@ static enum drm_connector_status omap_connector_detect(
109static void omap_connector_destroy(struct drm_connector *connector) 129static void omap_connector_destroy(struct drm_connector *connector)
110{ 130{
111 struct omap_connector *omap_connector = to_omap_connector(connector); 131 struct omap_connector *omap_connector = to_omap_connector(connector);
112 struct omap_dss_device *dssdev;
113 132
114 DBG("%s", omap_connector->dssdev->name); 133 DBG("%s", omap_connector->dssdev->name);
115 134
116 if (connector->polled == DRM_CONNECTOR_POLL_HPD) { 135 if (omap_connector->hpd) {
117 dssdev = omap_connector_find_device(connector, 136 struct omap_dss_device *hpd = omap_connector->hpd;
118 OMAP_DSS_DEVICE_OP_HPD); 137
119 dssdev->ops->unregister_hpd_cb(dssdev); 138 hpd->ops->unregister_hpd_cb(hpd);
139 omapdss_device_put(hpd);
140 omap_connector->hpd = NULL;
120 } 141 }
121 142
122 drm_connector_unregister(connector); 143 drm_connector_unregister(connector);
@@ -298,8 +319,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
298 */ 319 */
299 dssdev = omap_connector_find_device(connector, OMAP_DSS_DEVICE_OP_HPD); 320 dssdev = omap_connector_find_device(connector, OMAP_DSS_DEVICE_OP_HPD);
300 if (dssdev) { 321 if (dssdev) {
301 dssdev->ops->register_hpd_cb(dssdev, omap_connector_hpd_cb, 322 omap_connector->hpd = omapdss_device_get(dssdev);
302 omap_connector);
303 connector->polled = DRM_CONNECTOR_POLL_HPD; 323 connector->polled = DRM_CONNECTOR_POLL_HPD;
304 } else { 324 } else {
305 dssdev = omap_connector_find_device(connector, 325 dssdev = omap_connector_find_device(connector,