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, |
