aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/omapdrm/displays/connector-dvi.c15
-rw-r--r--drivers/gpu/drm/omapdrm/displays/connector-hdmi.c11
-rw-r--r--drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c13
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi4.c1
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi5.c1
-rw-r--r--drivers/gpu/drm/omapdrm/omap_connector.c101
6 files changed, 65 insertions, 77 deletions
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 6be260ff6458..eae4108330f1 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -166,12 +166,6 @@ static int dvic_read_edid(struct omap_dss_device *dssdev,
166 struct panel_drv_data *ddata = to_panel_data(dssdev); 166 struct panel_drv_data *ddata = to_panel_data(dssdev);
167 int r, l, bytes_read; 167 int r, l, bytes_read;
168 168
169 if (ddata->hpd_gpio && !gpiod_get_value_cansleep(ddata->hpd_gpio))
170 return -ENODEV;
171
172 if (!ddata->i2c_adapter)
173 return -ENODEV;
174
175 l = min(EDID_LENGTH, len); 169 l = min(EDID_LENGTH, len);
176 r = dvic_ddc_read(ddata->i2c_adapter, edid, l, 0); 170 r = dvic_ddc_read(ddata->i2c_adapter, edid, l, 0);
177 if (r) 171 if (r)
@@ -341,10 +335,11 @@ static int dvic_probe(struct platform_device *pdev)
341 dssdev->of_ports = BIT(0); 335 dssdev->of_ports = BIT(0);
342 336
343 if (ddata->hpd_gpio) 337 if (ddata->hpd_gpio)
344 dssdev->ops_flags = OMAP_DSS_DEVICE_OP_DETECT 338 dssdev->ops_flags |= OMAP_DSS_DEVICE_OP_DETECT
345 | OMAP_DSS_DEVICE_OP_HPD; 339 | OMAP_DSS_DEVICE_OP_HPD;
346 else if (ddata->i2c_adapter) 340 if (ddata->i2c_adapter)
347 dssdev->ops_flags = OMAP_DSS_DEVICE_OP_DETECT; 341 dssdev->ops_flags |= OMAP_DSS_DEVICE_OP_DETECT
342 | OMAP_DSS_DEVICE_OP_EDID;
348 343
349 omapdss_display_init(dssdev); 344 omapdss_display_init(dssdev);
350 omapdss_device_register(dssdev); 345 omapdss_device_register(dssdev);
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 6f2364afb14a..16dc22edcb8e 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -15,8 +15,6 @@
15#include <linux/platform_device.h> 15#include <linux/platform_device.h>
16#include <linux/slab.h> 16#include <linux/slab.h>
17 17
18#include <drm/drm_edid.h>
19
20#include "../dss/omapdss.h" 18#include "../dss/omapdss.h"
21 19
22static const struct videomode hdmic_default_vm = { 20static const struct videomode hdmic_default_vm = {
@@ -126,14 +124,6 @@ static int hdmic_check_timings(struct omap_dss_device *dssdev,
126 return src->ops->check_timings(src, vm); 124 return src->ops->check_timings(src, vm);
127} 125}
128 126
129static int hdmic_read_edid(struct omap_dss_device *dssdev,
130 u8 *edid, int len)
131{
132 struct omap_dss_device *src = dssdev->src;
133
134 return src->ops->read_edid(src, edid, len);
135}
136
137static bool hdmic_detect(struct omap_dss_device *dssdev) 127static bool hdmic_detect(struct omap_dss_device *dssdev)
138{ 128{
139 struct panel_drv_data *ddata = to_panel_data(dssdev); 129 struct panel_drv_data *ddata = to_panel_data(dssdev);
@@ -190,7 +180,6 @@ static const struct omap_dss_device_ops hdmic_ops = {
190 .get_timings = hdmic_get_timings, 180 .get_timings = hdmic_get_timings,
191 .check_timings = hdmic_check_timings, 181 .check_timings = hdmic_check_timings,
192 182
193 .read_edid = hdmic_read_edid,
194 .detect = hdmic_detect, 183 .detect = hdmic_detect,
195 .register_hpd_cb = hdmic_register_hpd_cb, 184 .register_hpd_cb = hdmic_register_hpd_cb,
196 .unregister_hpd_cb = hdmic_unregister_hpd_cb, 185 .unregister_hpd_cb = hdmic_unregister_hpd_cb,
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index da97d357bde7..3ce1c935a48c 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -115,18 +115,6 @@ static int tpd_check_timings(struct omap_dss_device *dssdev,
115 return src->ops->check_timings(src, vm); 115 return src->ops->check_timings(src, vm);
116} 116}
117 117
118static int tpd_read_edid(struct omap_dss_device *dssdev,
119 u8 *edid, int len)
120{
121 struct panel_drv_data *ddata = to_panel_data(dssdev);
122 struct omap_dss_device *src = dssdev->src;
123
124 if (!gpiod_get_value_cansleep(ddata->hpd_gpio))
125 return -ENODEV;
126
127 return src->ops->read_edid(src, edid, len);
128}
129
130static bool tpd_detect(struct omap_dss_device *dssdev) 118static bool tpd_detect(struct omap_dss_device *dssdev)
131{ 119{
132 struct panel_drv_data *ddata = to_panel_data(dssdev); 120 struct panel_drv_data *ddata = to_panel_data(dssdev);
@@ -180,7 +168,6 @@ static const struct omap_dss_device_ops tpd_ops = {
180 .disable = tpd_disable, 168 .disable = tpd_disable,
181 .check_timings = tpd_check_timings, 169 .check_timings = tpd_check_timings,
182 .set_timings = tpd_set_timings, 170 .set_timings = tpd_set_timings,
183 .read_edid = tpd_read_edid,
184 .detect = tpd_detect, 171 .detect = tpd_detect,
185 .register_hpd_cb = tpd_register_hpd_cb, 172 .register_hpd_cb = tpd_register_hpd_cb,
186 .unregister_hpd_cb = tpd_unregister_hpd_cb, 173 .unregister_hpd_cb = tpd_unregister_hpd_cb,
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index bebce93fed3e..c92564300446 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -711,6 +711,7 @@ static int hdmi4_init_output(struct omap_hdmi *hdmi)
711 out->ops = &hdmi_ops; 711 out->ops = &hdmi_ops;
712 out->owner = THIS_MODULE; 712 out->owner = THIS_MODULE;
713 out->of_ports = BIT(0); 713 out->of_ports = BIT(0);
714 out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;
714 715
715 out->next = omapdss_of_find_connected_device(out->dev->of_node, 0); 716 out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
716 if (IS_ERR(out->next)) { 717 if (IS_ERR(out->next)) {
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 7c07e0208107..2aaa8ee61662 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -703,6 +703,7 @@ static int hdmi5_init_output(struct omap_hdmi *hdmi)
703 out->ops = &hdmi_ops; 703 out->ops = &hdmi_ops;
704 out->owner = THIS_MODULE; 704 out->owner = THIS_MODULE;
705 out->of_ports = BIT(0); 705 out->of_ports = BIT(0);
706 out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;
706 707
707 out->next = omapdss_of_find_connected_device(out->dev->of_node, 0); 708 out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
708 if (IS_ERR(out->next)) { 709 if (IS_ERR(out->next)) {
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 344414ef3962..5091991363d6 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -170,65 +170,80 @@ static void omap_connector_destroy(struct drm_connector *connector)
170 170
171#define MAX_EDID 512 171#define MAX_EDID 512
172 172
173static int omap_connector_get_modes_edid(struct drm_connector *connector,
174 struct omap_dss_device *dssdev)
175{
176 struct omap_connector *omap_connector = to_omap_connector(connector);
177 enum drm_connector_status status;
178 void *edid;
179 int n;
180
181 status = omap_connector_detect(connector, false);
182 if (status != connector_status_connected)
183 goto no_edid;
184
185 edid = kzalloc(MAX_EDID, GFP_KERNEL);
186 if (!edid)
187 goto no_edid;
188
189 if (dssdev->ops->read_edid(dssdev, edid, MAX_EDID) <= 0 ||
190 !drm_edid_is_valid(edid)) {
191 kfree(edid);
192 goto no_edid;
193 }
194
195 drm_connector_update_edid_property(connector, edid);
196 n = drm_add_edid_modes(connector, edid);
197
198 omap_connector->hdmi_mode = drm_detect_hdmi_monitor(edid);
199
200 kfree(edid);
201 return n;
202
203no_edid:
204 drm_connector_update_edid_property(connector, NULL);
205 return 0;
206}
207
173static int omap_connector_get_modes(struct drm_connector *connector) 208static int omap_connector_get_modes(struct drm_connector *connector)
174{ 209{
175 struct omap_connector *omap_connector = to_omap_connector(connector); 210 struct omap_connector *omap_connector = to_omap_connector(connector);
176 struct omap_dss_device *dssdev = omap_connector->dssdev; 211 struct omap_dss_device *dssdev;
177 struct drm_device *dev = connector->dev; 212 struct drm_display_mode *mode;
178 int n = 0; 213 struct videomode vm = {0};
179 214
180 DBG("%s", omap_connector->dssdev->name); 215 DBG("%s", omap_connector->dssdev->name);
181 216
182 /* if display exposes EDID, then we parse that in the normal way to 217 /*
183 * build table of supported modes.. otherwise (ie. fixed resolution 218 * If display exposes EDID, then we parse that in the normal way to
219 * build table of supported modes. Otherwise (ie. fixed resolution
184 * LCD panels) we just return a single mode corresponding to the 220 * LCD panels) we just return a single mode corresponding to the
185 * currently configured timings: 221 * currently configured timings.
186 */ 222 */
187 if (dssdev->ops->read_edid) { 223 dssdev = omap_connector_find_device(connector,
188 void *edid = kzalloc(MAX_EDID, GFP_KERNEL); 224 OMAP_DSS_DEVICE_OP_EDID);
189 225 if (dssdev)
190 if (!edid) 226 return omap_connector_get_modes_edid(connector, dssdev);
191 return 0;
192
193 if ((dssdev->ops->read_edid(dssdev, edid, MAX_EDID) > 0) &&
194 drm_edid_is_valid(edid)) {
195 drm_connector_update_edid_property(
196 connector, edid);
197 n = drm_add_edid_modes(connector, edid);
198
199 omap_connector->hdmi_mode =
200 drm_detect_hdmi_monitor(edid);
201 } else {
202 drm_connector_update_edid_property(
203 connector, NULL);
204 }
205
206 kfree(edid);
207 } else {
208 struct drm_display_mode *mode = drm_mode_create(dev);
209 struct videomode vm = {0};
210 227
211 if (!mode) 228 mode = drm_mode_create(connector->dev);
212 return 0; 229 if (!mode)
230 return 0;
213 231
214 dssdev->ops->get_timings(dssdev, &vm); 232 dssdev = omap_connector->dssdev;
233 dssdev->ops->get_timings(dssdev, &vm);
215 234
216 drm_display_mode_from_videomode(&vm, mode); 235 drm_display_mode_from_videomode(&vm, mode);
217 236
218 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; 237 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
219 drm_mode_set_name(mode); 238 drm_mode_set_name(mode);
220 drm_mode_probed_add(connector, mode); 239 drm_mode_probed_add(connector, mode);
221 240
222 if (dssdev->driver && dssdev->driver->get_size) { 241 if (dssdev->driver && dssdev->driver->get_size)
223 dssdev->driver->get_size(dssdev, 242 dssdev->driver->get_size(dssdev,
224 &connector->display_info.width_mm, 243 &connector->display_info.width_mm,
225 &connector->display_info.height_mm); 244 &connector->display_info.height_mm);
226 }
227 245
228 n = 1; 246 return 1;
229 }
230
231 return n;
232} 247}
233 248
234static int omap_connector_mode_valid(struct drm_connector *connector, 249static int omap_connector_mode_valid(struct drm_connector *connector,