diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_connector.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_connector.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c index 302f2ed245d0..b8317b697083 100644 --- a/drivers/gpu/drm/omapdrm/omap_connector.c +++ b/drivers/gpu/drm/omapdrm/omap_connector.c | |||
@@ -218,20 +218,41 @@ static int omap_connector_get_modes(struct drm_connector *connector) | |||
218 | 218 | ||
219 | /* | 219 | /* |
220 | * If display exposes EDID, then we parse that in the normal way to | 220 | * If display exposes EDID, then we parse that in the normal way to |
221 | * build table of supported modes. Otherwise (ie. fixed resolution | 221 | * build table of supported modes. |
222 | * LCD panels) we just return a single mode corresponding to the | ||
223 | * currently configured timings. | ||
224 | */ | 222 | */ |
225 | dssdev = omap_connector_find_device(connector, | 223 | dssdev = omap_connector_find_device(connector, |
226 | OMAP_DSS_DEVICE_OP_EDID); | 224 | OMAP_DSS_DEVICE_OP_EDID); |
227 | if (dssdev) | 225 | if (dssdev) |
228 | return omap_connector_get_modes_edid(connector, dssdev); | 226 | return omap_connector_get_modes_edid(connector, dssdev); |
229 | 227 | ||
228 | /* | ||
229 | * Otherwise we have either a fixed resolution panel or an output that | ||
230 | * doesn't support modes discovery (e.g. DVI or VGA with the DDC bus | ||
231 | * unconnected, or analog TV). Start by querying the size. | ||
232 | */ | ||
233 | dssdev = omap_connector->display; | ||
234 | if (dssdev->driver && dssdev->driver->get_size) | ||
235 | dssdev->driver->get_size(dssdev, | ||
236 | &connector->display_info.width_mm, | ||
237 | &connector->display_info.height_mm); | ||
238 | |||
239 | /* | ||
240 | * Iterate over the pipeline to find the first device that can provide | ||
241 | * timing information. If we can't find any, we just let the KMS core | ||
242 | * add the default modes. | ||
243 | */ | ||
244 | for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) { | ||
245 | if (dssdev->ops->get_timings) | ||
246 | break; | ||
247 | } | ||
248 | if (!dssdev) | ||
249 | return 0; | ||
250 | |||
251 | /* Add a single mode corresponding to the fixed panel timings. */ | ||
230 | mode = drm_mode_create(connector->dev); | 252 | mode = drm_mode_create(connector->dev); |
231 | if (!mode) | 253 | if (!mode) |
232 | return 0; | 254 | return 0; |
233 | 255 | ||
234 | dssdev = omap_connector->display; | ||
235 | dssdev->ops->get_timings(dssdev, &vm); | 256 | dssdev->ops->get_timings(dssdev, &vm); |
236 | 257 | ||
237 | drm_display_mode_from_videomode(&vm, mode); | 258 | drm_display_mode_from_videomode(&vm, mode); |
@@ -240,11 +261,6 @@ static int omap_connector_get_modes(struct drm_connector *connector) | |||
240 | drm_mode_set_name(mode); | 261 | drm_mode_set_name(mode); |
241 | drm_mode_probed_add(connector, mode); | 262 | drm_mode_probed_add(connector, mode); |
242 | 263 | ||
243 | if (dssdev->driver && dssdev->driver->get_size) | ||
244 | dssdev->driver->get_size(dssdev, | ||
245 | &connector->display_info.width_mm, | ||
246 | &connector->display_info.height_mm); | ||
247 | |||
248 | return 1; | 264 | return 1; |
249 | } | 265 | } |
250 | 266 | ||