diff options
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 40 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_modes.c | 11 |
2 files changed, 39 insertions, 12 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); |
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index ab6e70eadc58..49404ce1666e 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c | |||
@@ -566,7 +566,9 @@ EXPORT_SYMBOL(drm_mode_height); | |||
566 | * FIXME: why is this needed? shouldn't vrefresh be set already? | 566 | * FIXME: why is this needed? shouldn't vrefresh be set already? |
567 | * | 567 | * |
568 | * RETURNS: | 568 | * RETURNS: |
569 | * Vertical refresh rate of @mode x 1000. For precision reasons. | 569 | * Vertical refresh rate. It will be the result of actual value plus 0.5. |
570 | * If it is 70.288, it will return 70Hz. | ||
571 | * If it is 59.6, it will return 60Hz. | ||
570 | */ | 572 | */ |
571 | int drm_mode_vrefresh(struct drm_display_mode *mode) | 573 | int drm_mode_vrefresh(struct drm_display_mode *mode) |
572 | { | 574 | { |
@@ -576,14 +578,13 @@ int drm_mode_vrefresh(struct drm_display_mode *mode) | |||
576 | if (mode->vrefresh > 0) | 578 | if (mode->vrefresh > 0) |
577 | refresh = mode->vrefresh; | 579 | refresh = mode->vrefresh; |
578 | else if (mode->htotal > 0 && mode->vtotal > 0) { | 580 | else if (mode->htotal > 0 && mode->vtotal > 0) { |
581 | int vtotal; | ||
582 | vtotal = mode->vtotal; | ||
579 | /* work out vrefresh the value will be x1000 */ | 583 | /* work out vrefresh the value will be x1000 */ |
580 | calc_val = (mode->clock * 1000); | 584 | calc_val = (mode->clock * 1000); |
581 | |||
582 | calc_val /= mode->htotal; | 585 | calc_val /= mode->htotal; |
583 | calc_val *= 1000; | 586 | refresh = (calc_val + vtotal / 2) / vtotal; |
584 | calc_val /= mode->vtotal; | ||
585 | 587 | ||
586 | refresh = calc_val; | ||
587 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | 588 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
588 | refresh *= 2; | 589 | refresh *= 2; |
589 | if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | 590 | if (mode->flags & DRM_MODE_FLAG_DBLSCAN) |