aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2013-11-13 18:53:15 -0500
committerDave Airlie <airlied@redhat.com>2013-11-13 18:53:15 -0500
commitad40f83f5a89f6d723fd4db424b531f8dd7d3b49 (patch)
tree8b385b01c57a46da34ef92bcd31a5e97cf8c8903 /drivers/gpu/drm
parentb95b49168fc53d1fe5cf0dd4c5e89e927980f9ad (diff)
parent339d202cde8e63113124d8931203f5bdb3343f27 (diff)
Merge branch 'drm-next-3.13' of git://people.freedesktop.org/~agd5f/linux into drm-next
One last patch I keep forgetting to include. Fix for EDID quirk handling. Been on the list and reviewed for several months now, I just keep forgetting about it. * 'drm-next-3.13' of git://people.freedesktop.org/~agd5f/linux: drm/edid: compare actual vrefresh for all modes for quirks
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/drm_edid.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 2f325bcd0708..fb7cf0e796f6 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1329,7 +1329,7 @@ static u32 edid_get_quirks(struct edid *edid)
1329} 1329}
1330 1330
1331#define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay) 1331#define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay)
1332#define MODE_REFRESH_DIFF(m,r) (abs((m)->vrefresh - target_refresh)) 1332#define MODE_REFRESH_DIFF(c,t) (abs((c) - (t)))
1333 1333
1334/** 1334/**
1335 * edid_fixup_preferred - set preferred modes based on quirk list 1335 * edid_fixup_preferred - set preferred modes based on quirk list
@@ -1344,6 +1344,7 @@ static void edid_fixup_preferred(struct drm_connector *connector,
1344{ 1344{
1345 struct drm_display_mode *t, *cur_mode, *preferred_mode; 1345 struct drm_display_mode *t, *cur_mode, *preferred_mode;
1346 int target_refresh = 0; 1346 int target_refresh = 0;
1347 int cur_vrefresh, preferred_vrefresh;
1347 1348
1348 if (list_empty(&connector->probed_modes)) 1349 if (list_empty(&connector->probed_modes))
1349 return; 1350 return;
@@ -1366,10 +1367,14 @@ static void edid_fixup_preferred(struct drm_connector *connector,
1366 if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode)) 1367 if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
1367 preferred_mode = cur_mode; 1368 preferred_mode = cur_mode;
1368 1369
1370 cur_vrefresh = cur_mode->vrefresh ?
1371 cur_mode->vrefresh : drm_mode_vrefresh(cur_mode);
1372 preferred_vrefresh = preferred_mode->vrefresh ?
1373 preferred_mode->vrefresh : drm_mode_vrefresh(preferred_mode);
1369 /* At a given size, try to get closest to target refresh */ 1374 /* At a given size, try to get closest to target refresh */
1370 if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) && 1375 if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
1371 MODE_REFRESH_DIFF(cur_mode, target_refresh) < 1376 MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) <
1372 MODE_REFRESH_DIFF(preferred_mode, target_refresh)) { 1377 MODE_REFRESH_DIFF(preferred_vrefresh, target_refresh)) {
1373 preferred_mode = cur_mode; 1378 preferred_mode = cur_mode;
1374 } 1379 }
1375 } 1380 }