From 46ae2655667cba4479d80713709f378f3c458b8e Mon Sep 17 00:00:00 2001 From: "xinliang.liu" Date: Thu, 20 Aug 2015 10:34:08 +0800 Subject: drm: hisilicon: Filter out unsupport modes and reorder modes according to testing 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 Signed-off-by: Guodong.Xu --- drivers/gpu/drm/hisilicon/hisi_drm_dsi.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) 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; } -- cgit v1.2.3