|
@@ -1159,6 +1159,7 @@ struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *f
|
|
|
{
|
|
|
struct drm_cmdline_mode *cmdline_mode;
|
|
|
struct drm_display_mode *mode = NULL;
|
|
|
+ bool prefer_non_interlace;
|
|
|
|
|
|
cmdline_mode = &fb_helper_conn->cmdline_mode;
|
|
|
if (cmdline_mode->specified == false)
|
|
@@ -1170,6 +1171,8 @@ struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *f
|
|
|
if (cmdline_mode->rb || cmdline_mode->margins)
|
|
|
goto create_mode;
|
|
|
|
|
|
+ prefer_non_interlace = !cmdline_mode->interlace;
|
|
|
+ again:
|
|
|
list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
|
|
|
/* check width/height */
|
|
|
if (mode->hdisplay != cmdline_mode->xres ||
|
|
@@ -1184,10 +1187,18 @@ struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *f
|
|
|
if (cmdline_mode->interlace) {
|
|
|
if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
|
|
|
continue;
|
|
|
+ } else if (prefer_non_interlace) {
|
|
|
+ if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
|
|
+ continue;
|
|
|
}
|
|
|
return mode;
|
|
|
}
|
|
|
|
|
|
+ if (prefer_non_interlace) {
|
|
|
+ prefer_non_interlace = false;
|
|
|
+ goto again;
|
|
|
+ }
|
|
|
+
|
|
|
create_mode:
|
|
|
mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev,
|
|
|
cmdline_mode);
|