diff options
-rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index 1c3a8c557140..4c93b7b8560f 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c | |||
@@ -42,6 +42,26 @@ static struct drm_display_mode std_modes[] = { | |||
42 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, | 42 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
43 | }; | 43 | }; |
44 | 44 | ||
45 | static void drm_mode_validate_flag(struct drm_connector *connector, | ||
46 | int flags) | ||
47 | { | ||
48 | struct drm_display_mode *mode, *t; | ||
49 | |||
50 | if (flags == (DRM_MODE_FLAG_DBLSCAN | DRM_MODE_FLAG_INTERLACE)) | ||
51 | return; | ||
52 | |||
53 | list_for_each_entry_safe(mode, t, &connector->modes, head) { | ||
54 | if ((mode->flags & DRM_MODE_FLAG_INTERLACE) && | ||
55 | !(flags & DRM_MODE_FLAG_INTERLACE)) | ||
56 | mode->status = MODE_NO_INTERLACE; | ||
57 | if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) && | ||
58 | !(flags & DRM_MODE_FLAG_DBLSCAN)) | ||
59 | mode->status = MODE_NO_DBLESCAN; | ||
60 | } | ||
61 | |||
62 | return; | ||
63 | } | ||
64 | |||
45 | /** | 65 | /** |
46 | * drm_helper_probe_connector_modes - get complete set of display modes | 66 | * drm_helper_probe_connector_modes - get complete set of display modes |
47 | * @dev: DRM device | 67 | * @dev: DRM device |
@@ -72,6 +92,7 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector, | |||
72 | struct drm_connector_helper_funcs *connector_funcs = | 92 | struct drm_connector_helper_funcs *connector_funcs = |
73 | connector->helper_private; | 93 | connector->helper_private; |
74 | int count = 0; | 94 | int count = 0; |
95 | int mode_flags = 0; | ||
75 | 96 | ||
76 | DRM_DEBUG("%s\n", drm_get_connector_name(connector)); | 97 | DRM_DEBUG("%s\n", drm_get_connector_name(connector)); |
77 | /* set all modes to the unverified state */ | 98 | /* set all modes to the unverified state */ |
@@ -96,6 +117,13 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector, | |||
96 | if (maxX && maxY) | 117 | if (maxX && maxY) |
97 | drm_mode_validate_size(dev, &connector->modes, maxX, | 118 | drm_mode_validate_size(dev, &connector->modes, maxX, |
98 | maxY, 0); | 119 | maxY, 0); |
120 | |||
121 | if (connector->interlace_allowed) | ||
122 | mode_flags |= DRM_MODE_FLAG_INTERLACE; | ||
123 | if (connector->doublescan_allowed) | ||
124 | mode_flags |= DRM_MODE_FLAG_DBLSCAN; | ||
125 | drm_mode_validate_flag(connector, mode_flags); | ||
126 | |||
99 | list_for_each_entry_safe(mode, t, &connector->modes, head) { | 127 | list_for_each_entry_safe(mode, t, &connector->modes, head) { |
100 | if (mode->status == MODE_OK) | 128 | if (mode->status == MODE_OK) |
101 | mode->status = connector_funcs->mode_valid(connector, | 129 | mode->status = connector_funcs->mode_valid(connector, |