diff options
| author | Adam Jackson <ajax@redhat.com> | 2012-05-23 16:26:54 -0400 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2012-05-29 16:16:38 +0100 | 
| commit | bc42aabc6a01b92b0f961d65671564e0e1cd7592 (patch) | |
| tree | 33ed0b015ed36051ef50a842af29771694c0eb95 /drivers/gpu/drm/drm_edid.c | |
| parent | 1c780f2cfec8b533b9cfda77209b4e3e7adaddbf (diff) | |
| download | olio-linux-3.10-bc42aabc6a01b92b0f961d65671564e0e1cd7592.tar.xz olio-linux-3.10-bc42aabc6a01b92b0f961d65671564e0e1cd7592.zip  | |
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>
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
| -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 608bddfc7e3..c3b5139eba7 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -66,6 +66,8 @@  #define EDID_QUIRK_FIRST_DETAILED_PREFERRED	(1 << 5)  /* use +hsync +vsync for detailed mode */  #define EDID_QUIRK_DETAILED_SYNC_PP		(1 << 6) +/* Force reduced-blanking timings for detailed modes */ +#define EDID_QUIRK_FORCE_REDUCED_BLANKING	(1 << 7)  struct detailed_mode_closure {  	struct drm_connector *connector; @@ -120,6 +122,9 @@ static struct edid_quirk {  	/* Samsung SyncMaster 22[5-6]BW */  	{ "SAM", 596, EDID_QUIRK_PREFER_LARGE_60 },  	{ "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 }, + +	/* ViewSonic VA2026w */ +	{ "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING },  };  /*** DDC fetch and block validation ***/ @@ -885,12 +890,19 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,  				"Wrong Hsync/Vsync pulse width\n");  		return NULL;  	} + +	if (quirks & EDID_QUIRK_FORCE_REDUCED_BLANKING) { +		mode = drm_cvt_mode(dev, hactive, vactive, 60, true, false, false); +		if (!mode) +			return NULL; + +		goto set_size; +	} +  	mode = drm_mode_create(dev);  	if (!mode)  		return NULL; -	mode->type = DRM_MODE_TYPE_DRIVER; -  	if (quirks & EDID_QUIRK_135_CLOCK_TOO_HIGH)  		timing->pixel_clock = cpu_to_le16(1088); @@ -914,8 +926,6 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,  	drm_mode_do_interlace_quirk(mode, pt); -	drm_mode_set_name(mode); -  	if (quirks & EDID_QUIRK_DETAILED_SYNC_PP) {  		pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE;  	} @@ -925,6 +935,7 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,  	mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ?  		DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; +set_size:  	mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4;  	mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8; @@ -938,6 +949,9 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,  		mode->height_mm = edid->height_cm * 10;  	} +	mode->type = DRM_MODE_TYPE_DRIVER; +	drm_mode_set_name(mode); +  	return mode;  }  |