summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxinliang.liu <xinliang.liu@linaro.org>2015-08-20 10:34:08 +0800
committerGuodong Xu <guodong.xu@linaro.org>2015-09-08 20:40:08 +0800
commit46ae2655667cba4479d80713709f378f3c458b8e (patch)
tree90d089334c662f732d9d541b85212073e6004fa8
parentbe08a9b9169c0fe7a3b87843cbfe9ecf9d0fefeb (diff)
drm: hisilicon: Filter out unsupport modes and reorder modes according to testingworking-hdmi-test-0908-01
1. Filter out DRM_MODE_FLAG_INTERLACE modes. 2. Filter out unsupport pixel clock modes. 3. Support these modes as high priority if exist in EDID: 1920x1200 16:10 Monitor 1920x1080 16:9 TV 1680x1050 16:10 Monitor 1280x1024 5:4 Monitor 1280x720 16:9 TV 800x600 4:3 TV Signed-off-by: xinliang.liu <xinliang.liu@linaro.org> Signed-off-by: Guodong.Xu <guodong.xu@linaro.org>
-rw-r--r--drivers/gpu/drm/hisilicon/hisi_drm_dsi.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/gpu/drm/hisilicon/hisi_drm_dsi.c b/drivers/gpu/drm/hisilicon/hisi_drm_dsi.c
index fac1e026ebbd..d0ec2e490417 100644
--- a/drivers/gpu/drm/hisilicon/hisi_drm_dsi.c
+++ b/drivers/gpu/drm/hisilicon/hisi_drm_dsi.c
@@ -1012,6 +1012,14 @@ static int hisi_drm_connector_mode_valid(struct drm_connector *connector,
struct drm_encoder *encoder = &dsi->base.base;
struct drm_encoder_slave_funcs *sfuncs = get_slave_funcs(encoder);
int ret = MODE_OK;
+ int vrate;
+
+ if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+ return MODE_NO_INTERLACE;
+
+ /* pixel clock support range is (1190494208/64, 1190494208)Hz */
+ if (mode->clock < 18602 || mode->clock > 1190494)
+ return MODE_CLOCK_RANGE;
if (sfuncs->mode_valid) {
ret = sfuncs->mode_valid(encoder, mode);
@@ -1019,6 +1027,22 @@ static int hisi_drm_connector_mode_valid(struct drm_connector *connector,
return ret;
}
+ /*
+ * some work well modes which want to add prefer type
+ * others will clear prefer
+ */
+ vrate = mode->vrefresh = drm_mode_vrefresh(mode);
+ if ((mode->hdisplay == 1920 && mode->vdisplay == 1200 && vrate == 59) ||
+ (mode->hdisplay == 1920 && mode->vdisplay == 1080) ||
+ (mode->hdisplay == 1680 && mode->vdisplay == 1050 && vrate == 59) ||
+ (mode->hdisplay == 1280 && mode->vdisplay == 1024 && vrate == 60) ||
+ (mode->hdisplay == 1280 && mode->vdisplay == 720 &&
+ (vrate == 60 || vrate == 59 || vrate == 50)) ||
+ (mode->hdisplay == 800 && mode->vdisplay == 600 && vrate == 60))
+ mode->type |= DRM_MODE_TYPE_PREFERRED;
+ else
+ mode->type &= ~DRM_MODE_TYPE_PREFERRED;
+
DRM_DEBUG_DRIVER("exit success. ret=%d\n", ret);
return ret;
}