diff options
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/displays/connector-dvi.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/displays/connector-hdmi.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/hdmi4.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/hdmi5.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_connector.c | 101 |
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 | ||
| 22 | static const struct videomode hdmic_default_vm = { | 20 | static 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 | ||
| 129 | static 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 | |||
| 137 | static bool hdmic_detect(struct omap_dss_device *dssdev) | 127 | static 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 | ||
| 118 | static 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 | |||
| 130 | static bool tpd_detect(struct omap_dss_device *dssdev) | 118 | static 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 | ||
| 173 | static 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 | |||
| 203 | no_edid: | ||
| 204 | drm_connector_update_edid_property(connector, NULL); | ||
| 205 | return 0; | ||
| 206 | } | ||
| 207 | |||
| 173 | static int omap_connector_get_modes(struct drm_connector *connector) | 208 | static 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 | ||
| 234 | static int omap_connector_mode_valid(struct drm_connector *connector, | 249 | static int omap_connector_mode_valid(struct drm_connector *connector, |
