diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/omapdrm/displays/connector-hdmi.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_connector.c | 33 |
3 files changed, 29 insertions, 18 deletions
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c index 84cc68388940..6f2364afb14a 100644 --- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c +++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c | |||
@@ -137,13 +137,8 @@ static int hdmic_read_edid(struct omap_dss_device *dssdev, | |||
137 | static bool hdmic_detect(struct omap_dss_device *dssdev) | 137 | static bool hdmic_detect(struct omap_dss_device *dssdev) |
138 | { | 138 | { |
139 | struct panel_drv_data *ddata = to_panel_data(dssdev); | 139 | struct panel_drv_data *ddata = to_panel_data(dssdev); |
140 | struct omap_dss_device *src = dssdev->src; | ||
141 | bool connected; | ||
142 | 140 | ||
143 | connected = gpiod_get_value_cansleep(ddata->hpd_gpio); | 141 | return gpiod_get_value_cansleep(ddata->hpd_gpio); |
144 | if (!connected && src->ops->hdmi.lost_hotplug) | ||
145 | src->ops->hdmi.lost_hotplug(src); | ||
146 | return connected; | ||
147 | } | 142 | } |
148 | 143 | ||
149 | static void hdmic_register_hpd_cb(struct omap_dss_device *dssdev, | 144 | static void hdmic_register_hpd_cb(struct omap_dss_device *dssdev, |
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c index d6d08148a3e5..da97d357bde7 100644 --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c | |||
@@ -130,13 +130,8 @@ static int tpd_read_edid(struct omap_dss_device *dssdev, | |||
130 | static bool tpd_detect(struct omap_dss_device *dssdev) | 130 | static bool tpd_detect(struct omap_dss_device *dssdev) |
131 | { | 131 | { |
132 | struct panel_drv_data *ddata = to_panel_data(dssdev); | 132 | struct panel_drv_data *ddata = to_panel_data(dssdev); |
133 | struct omap_dss_device *src = dssdev->src; | ||
134 | bool connected; | ||
135 | 133 | ||
136 | connected = gpiod_get_value_cansleep(ddata->hpd_gpio); | 134 | return gpiod_get_value_cansleep(ddata->hpd_gpio); |
137 | if (!connected && src->ops->hdmi.lost_hotplug) | ||
138 | src->ops->hdmi.lost_hotplug(src); | ||
139 | return connected; | ||
140 | } | 135 | } |
141 | 136 | ||
142 | static void tpd_register_hpd_cb(struct omap_dss_device *dssdev, | 137 | static void tpd_register_hpd_cb(struct omap_dss_device *dssdev, |
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: |