aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2014-03-19 09:53:13 -0400
committerDave Airlie <airlied@redhat.com>2014-04-03 20:07:03 -0400
commitc683f427bdc43525f61e26609d34e799e7ea4c12 (patch)
tree892b82a65d347f4a50ef0fb42cd77e44274a2917
parentdeadcb36f49bee9b3010382ffe4fe4f5c439f1c5 (diff)
drm: Prefer noninterlace cmdline mode unless explicitly specified
Currently drm_pick_cmdline_mode() doesn't care about the interlace when the given mode line has no "i" suffix. That is, when there are multiple entries for the same resolution, an interlace mode might be picked up just depending on the assigned order, and there is no way to exclude it. This patch changes the logic for the mode selection, to prefer the noninterlace mode unless the interlace mode is explicitly given. When no matching mode is found, it still tries the interlace mode as fallback. Signed-off-by: Takashi Iwai <tiwai@suse.de> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 9795c0636da2..04d3fd3658f3 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1159,6 +1159,7 @@ struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *f
1159{ 1159{
1160 struct drm_cmdline_mode *cmdline_mode; 1160 struct drm_cmdline_mode *cmdline_mode;
1161 struct drm_display_mode *mode = NULL; 1161 struct drm_display_mode *mode = NULL;
1162 bool prefer_non_interlace;
1162 1163
1163 cmdline_mode = &fb_helper_conn->cmdline_mode; 1164 cmdline_mode = &fb_helper_conn->cmdline_mode;
1164 if (cmdline_mode->specified == false) 1165 if (cmdline_mode->specified == false)
@@ -1170,6 +1171,8 @@ struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *f
1170 if (cmdline_mode->rb || cmdline_mode->margins) 1171 if (cmdline_mode->rb || cmdline_mode->margins)
1171 goto create_mode; 1172 goto create_mode;
1172 1173
1174 prefer_non_interlace = !cmdline_mode->interlace;
1175 again:
1173 list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) { 1176 list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
1174 /* check width/height */ 1177 /* check width/height */
1175 if (mode->hdisplay != cmdline_mode->xres || 1178 if (mode->hdisplay != cmdline_mode->xres ||
@@ -1184,10 +1187,18 @@ struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *f
1184 if (cmdline_mode->interlace) { 1187 if (cmdline_mode->interlace) {
1185 if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) 1188 if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
1186 continue; 1189 continue;
1190 } else if (prefer_non_interlace) {
1191 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1192 continue;
1187 } 1193 }
1188 return mode; 1194 return mode;
1189 } 1195 }
1190 1196
1197 if (prefer_non_interlace) {
1198 prefer_non_interlace = false;
1199 goto again;
1200 }
1201
1191create_mode: 1202create_mode:
1192 mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev, 1203 mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev,
1193 cmdline_mode); 1204 cmdline_mode);