From 5a14a0ba3adde2324af8c72e80a8d37b38e7ba4e Mon Sep 17 00:00:00 2001 From: Archit Taneja Date: Tue, 26 Mar 2013 19:15:20 +0530 Subject: [PATCH] --- yaml --- r: 371374 b: refs/heads/master c: bddabbe174cfb6f944baaf13ed5b93c6ee89ec3d h: refs/heads/master v: v3 --- [refs] | 2 +- .../drivers/gpu/drm/omapdrm/omap_connector.c | 27 +++++++++++++++++-- trunk/drivers/gpu/drm/omapdrm/omap_encoder.c | 17 ++++++++++-- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index bc42e86fe0b1..3ed2fb67d19c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 581382e31090aa2459e8046e0bafb0f1daa2ecd8 +refs/heads/master: bddabbe174cfb6f944baaf13ed5b93c6ee89ec3d diff --git a/trunk/drivers/gpu/drm/omapdrm/omap_connector.c b/trunk/drivers/gpu/drm/omapdrm/omap_connector.c index c451c41a7a7d..912759daf562 100644 --- a/trunk/drivers/gpu/drm/omapdrm/omap_connector.c +++ b/trunk/drivers/gpu/drm/omapdrm/omap_connector.c @@ -110,6 +110,11 @@ static enum drm_connector_status omap_connector_detect( ret = connector_status_connected; else ret = connector_status_disconnected; + } else if (dssdev->type == OMAP_DISPLAY_TYPE_DPI || + dssdev->type == OMAP_DISPLAY_TYPE_DBI || + dssdev->type == OMAP_DISPLAY_TYPE_SDI || + dssdev->type == OMAP_DISPLAY_TYPE_DSI) { + ret = connector_status_connected; } else { ret = connector_status_unknown; } @@ -189,12 +194,30 @@ static int omap_connector_mode_valid(struct drm_connector *connector, struct omap_video_timings timings = {0}; struct drm_device *dev = connector->dev; struct drm_display_mode *new_mode; - int ret = MODE_BAD; + int r, ret = MODE_BAD; copy_timings_drm_to_omap(&timings, mode); mode->vrefresh = drm_mode_vrefresh(mode); - if (!dssdrv->check_timings(dssdev, &timings)) { + /* + * if the panel driver doesn't have a check_timings, it's most likely + * a fixed resolution panel, check if the timings match with the + * panel's timings + */ + if (dssdrv->check_timings) { + r = dssdrv->check_timings(dssdev, &timings); + } else { + struct omap_video_timings t = {0}; + + dssdrv->get_timings(dssdev, &t); + + if (memcmp(&timings, &t, sizeof(struct omap_video_timings))) + r = -EINVAL; + else + r = 0; + } + + if (!r) { /* check if vrefresh is still valid */ new_mode = drm_mode_duplicate(dev, mode); new_mode->clock = timings.pixel_clock; diff --git a/trunk/drivers/gpu/drm/omapdrm/omap_encoder.c b/trunk/drivers/gpu/drm/omapdrm/omap_encoder.c index 21d126d0317e..18be00dd7b5e 100644 --- a/trunk/drivers/gpu/drm/omapdrm/omap_encoder.c +++ b/trunk/drivers/gpu/drm/omapdrm/omap_encoder.c @@ -128,13 +128,26 @@ int omap_encoder_update(struct drm_encoder *encoder, dssdev->output->manager = mgr; - ret = dssdrv->check_timings(dssdev, timings); + if (dssdrv->check_timings) { + ret = dssdrv->check_timings(dssdev, timings); + } else { + struct omap_video_timings t = {0}; + + dssdrv->get_timings(dssdev, &t); + + if (memcmp(timings, &t, sizeof(struct omap_video_timings))) + ret = -EINVAL; + else + ret = 0; + } + if (ret) { dev_err(dev->dev, "could not set timings: %d\n", ret); return ret; } - dssdrv->set_timings(dssdev, timings); + if (dssdrv->set_timings) + dssdrv->set_timings(dssdev, timings); return 0; }