diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_connector.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_connector.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c index e77427d81eb9..344414ef3962 100644 --- a/drivers/gpu/drm/omapdrm/omap_connector.c +++ b/drivers/gpu/drm/omapdrm/omap_connector.c | |||
@@ -34,6 +34,22 @@ struct omap_connector { | |||
34 | bool hdmi_mode; | 34 | bool hdmi_mode; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | static void omap_connector_hpd_notify(struct drm_connector *connector, | ||
38 | struct omap_dss_device *src, | ||
39 | enum drm_connector_status status) | ||
40 | { | ||
41 | if (status == connector_status_disconnected) { | ||
42 | /* | ||
43 | * If the source is an HDMI encoder, notify it of disconnection. | ||
44 | * This is required to let the HDMI encoder reset any internal | ||
45 | * state related to connection status, such as the CEC address. | ||
46 | */ | ||
47 | if (src && src->type == OMAP_DISPLAY_TYPE_HDMI && | ||
48 | src->ops->hdmi.lost_hotplug) | ||
49 | src->ops->hdmi.lost_hotplug(src); | ||
50 | } | ||
51 | } | ||
52 | |||
37 | static void omap_connector_hpd_cb(void *cb_data, | 53 | static void omap_connector_hpd_cb(void *cb_data, |
38 | enum drm_connector_status status) | 54 | enum drm_connector_status status) |
39 | { | 55 | { |
@@ -47,8 +63,12 @@ static void omap_connector_hpd_cb(void *cb_data, | |||
47 | connector->status = status; | 63 | connector->status = status; |
48 | mutex_unlock(&dev->mode_config.mutex); | 64 | mutex_unlock(&dev->mode_config.mutex); |
49 | 65 | ||
50 | if (old_status != status) | 66 | if (old_status == status) |
51 | drm_kms_helper_hotplug_event(dev); | 67 | return; |
68 | |||
69 | omap_connector_hpd_notify(connector, omap_connector->hpd, status); | ||
70 | |||
71 | drm_kms_helper_hotplug_event(dev); | ||
52 | } | 72 | } |
53 | 73 | ||
54 | void omap_connector_enable_hpd(struct drm_connector *connector) | 74 | void omap_connector_enable_hpd(struct drm_connector *connector) |
@@ -103,10 +123,11 @@ static enum drm_connector_status omap_connector_detect( | |||
103 | OMAP_DSS_DEVICE_OP_DETECT); | 123 | OMAP_DSS_DEVICE_OP_DETECT); |
104 | 124 | ||
105 | if (dssdev) { | 125 | if (dssdev) { |
106 | if (dssdev->ops->detect(dssdev)) | 126 | status = dssdev->ops->detect(dssdev) |
107 | status = connector_status_connected; | 127 | ? connector_status_connected |
108 | else | 128 | : connector_status_disconnected; |
109 | status = connector_status_disconnected; | 129 | |
130 | omap_connector_hpd_notify(connector, dssdev->src, status); | ||
110 | } else { | 131 | } else { |
111 | switch (omap_connector->dssdev->type) { | 132 | switch (omap_connector->dssdev->type) { |
112 | case OMAP_DISPLAY_TYPE_DPI: | 133 | case OMAP_DISPLAY_TYPE_DPI: |