diff options
| author | Adam Jackson <ajax@redhat.com> | 2012-05-23 16:26:54 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2012-05-29 11:16:38 -0400 |
| commit | bc42aabc6a01b92b0f961d65671564e0e1cd7592 (patch) | |
| tree | 33ed0b015ed36051ef50a842af29771694c0eb95 | |
| parent | 1c780f2cfec8b533b9cfda77209b4e3e7adaddbf (diff) | |
drm/edid/quirks: ViewSonic VA2026w
Entirely new class of fail for this one. The detailed timings are for
normal CVT but the monitor really wanted CVT-R.
Bugzilla: http://bugzilla.redhat/com/516471
Signed-off-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/drm_edid.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 608bddfc7e35..c3b5139eba7f 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
| @@ -66,6 +66,8 @@ | |||
| 66 | #define EDID_QUIRK_FIRST_DETAILED_PREFERRED (1 << 5) | 66 | #define EDID_QUIRK_FIRST_DETAILED_PREFERRED (1 << 5) |
| 67 | /* use +hsync +vsync for detailed mode */ | 67 | /* use +hsync +vsync for detailed mode */ |
| 68 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) | 68 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) |
| 69 | /* Force reduced-blanking timings for detailed modes */ | ||
| 70 | #define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7) | ||
| 69 | 71 | ||
| 70 | struct detailed_mode_closure { | 72 | struct detailed_mode_closure { |
| 71 | struct drm_connector *connector; | 73 | struct drm_connector *connector; |
| @@ -120,6 +122,9 @@ static struct edid_quirk { | |||
| 120 | /* Samsung SyncMaster 22[5-6]BW */ | 122 | /* Samsung SyncMaster 22[5-6]BW */ |
| 121 | { "SAM", 596, EDID_QUIRK_PREFER_LARGE_60 }, | 123 | { "SAM", 596, EDID_QUIRK_PREFER_LARGE_60 }, |
| 122 | { "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 }, | 124 | { "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 }, |
| 125 | |||
| 126 | /* ViewSonic VA2026w */ | ||
| 127 | { "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING }, | ||
| 123 | }; | 128 | }; |
| 124 | 129 | ||
| 125 | /*** DDC fetch and block validation ***/ | 130 | /*** DDC fetch and block validation ***/ |
| @@ -885,12 +890,19 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | |||
| 885 | "Wrong Hsync/Vsync pulse width\n"); | 890 | "Wrong Hsync/Vsync pulse width\n"); |
| 886 | return NULL; | 891 | return NULL; |
| 887 | } | 892 | } |
| 893 | |||
| 894 | if (quirks & EDID_QUIRK_FORCE_REDUCED_BLANKING) { | ||
| 895 | mode = drm_cvt_mode(dev, hactive, vactive, 60, true, false, false); | ||
| 896 | if (!mode) | ||
| 897 | return NULL; | ||
| 898 | |||
| 899 | goto set_size; | ||
| 900 | } | ||
| 901 | |||
| 888 | mode = drm_mode_create(dev); | 902 | mode = drm_mode_create(dev); |
| 889 | if (!mode) | 903 | if (!mode) |
| 890 | return NULL; | 904 | return NULL; |
| 891 | 905 | ||
| 892 | mode->type = DRM_MODE_TYPE_DRIVER; | ||
| 893 | |||
| 894 | if (quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH) | 906 | if (quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH) |
| 895 | timing->pixel_clock = cpu_to_le16(1088); | 907 | timing->pixel_clock = cpu_to_le16(1088); |
| 896 | 908 | ||
| @@ -914,8 +926,6 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | |||
| 914 | 926 | ||
| 915 | drm_mode_do_interlace_quirk(mode, pt); | 927 | drm_mode_do_interlace_quirk(mode, pt); |
| 916 | 928 | ||
| 917 | drm_mode_set_name(mode); | ||
| 918 | |||
| 919 | if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) { | 929 | if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) { |
| 920 | pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE; | 930 | pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE; |
| 921 | } | 931 | } |
| @@ -925,6 +935,7 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | |||
| 925 | mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ? | 935 | mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ? |
| 926 | DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; | 936 | DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; |
| 927 | 937 | ||
| 938 | set_size: | ||
| 928 | mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4; | 939 | mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4; |
| 929 | mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8; | 940 | mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8; |
| 930 | 941 | ||
| @@ -938,6 +949,9 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | |||
| 938 | mode->height_mm = edid->height_cm * 10; | 949 | mode->height_mm = edid->height_cm * 10; |
| 939 | } | 950 | } |
| 940 | 951 | ||
| 952 | mode->type = DRM_MODE_TYPE_DRIVER; | ||
| 953 | drm_mode_set_name(mode); | ||
| 954 | |||
| 941 | return mode; | 955 | return mode; |
| 942 | } | 956 | } |
| 943 | 957 | ||
