diff options
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index e64eb6bbce1a..f84a98f2e373 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -480,6 +480,26 @@ static struct drm_display_mode drm_dmt_modes[] = { | |||
480 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, | 480 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, |
481 | }; | 481 | }; |
482 | 482 | ||
483 | static struct drm_display_mode *drm_find_dmt(struct drm_device *dev, | ||
484 | int hsize, int vsize, int fresh) | ||
485 | { | ||
486 | int i, count; | ||
487 | struct drm_display_mode *ptr, *mode; | ||
488 | |||
489 | count = sizeof(drm_dmt_modes) / sizeof(struct drm_display_mode); | ||
490 | mode = NULL; | ||
491 | for (i = 0; i < count; i++) { | ||
492 | ptr = &drm_dmt_modes[i]; | ||
493 | if (hsize == ptr->hdisplay && | ||
494 | vsize == ptr->vdisplay && | ||
495 | fresh == drm_mode_vrefresh(ptr)) { | ||
496 | /* get the expected default mode */ | ||
497 | mode = drm_mode_duplicate(dev, ptr); | ||
498 | break; | ||
499 | } | ||
500 | } | ||
501 | return mode; | ||
502 | } | ||
483 | /** | 503 | /** |
484 | * drm_mode_std - convert standard mode info (width, height, refresh) into mode | 504 | * drm_mode_std - convert standard mode info (width, height, refresh) into mode |
485 | * @t: standard timing params | 505 | * @t: standard timing params |
@@ -516,16 +536,22 @@ struct drm_display_mode *drm_mode_std(struct drm_device *dev, | |||
516 | vsize = (hsize * 4) / 5; | 536 | vsize = (hsize * 4) / 5; |
517 | else | 537 | else |
518 | vsize = (hsize * 9) / 16; | 538 | vsize = (hsize * 9) / 16; |
519 | 539 | /* HDTV hack */ | |
540 | if (hsize == 1360 && vsize == 765 && vrefresh_rate == 60) { | ||
541 | mode = drm_cvt_mode(dev, hsize, vsize, vrefresh_rate, 0, 0); | ||
542 | mode->hdisplay = 1366; | ||
543 | mode->vsync_start = mode->vsync_start - 1; | ||
544 | mode->vsync_end = mode->vsync_end - 1; | ||
545 | return mode; | ||
546 | } | ||
520 | mode = NULL; | 547 | mode = NULL; |
548 | /* check whether it can be found in default mode table */ | ||
549 | mode = drm_find_dmt(dev, hsize, vsize, vrefresh_rate); | ||
550 | if (mode) | ||
551 | return mode; | ||
552 | |||
521 | switch (timing_level) { | 553 | switch (timing_level) { |
522 | case LEVEL_DMT: | 554 | case LEVEL_DMT: |
523 | mode = drm_mode_create(dev); | ||
524 | if (mode) { | ||
525 | mode->hdisplay = hsize; | ||
526 | mode->vdisplay = vsize; | ||
527 | drm_mode_set_name(mode); | ||
528 | } | ||
529 | break; | 555 | break; |
530 | case LEVEL_GTF: | 556 | case LEVEL_GTF: |
531 | mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0); | 557 | mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0); |