diff options
Diffstat (limited to 'drivers/gpu/drm/drm_modes.c')
-rw-r--r-- | drivers/gpu/drm/drm_modes.c | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 5a8033fda4e3..f6b7c0e36a1a 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c | |||
@@ -773,24 +773,23 @@ EXPORT_SYMBOL(drm_mode_hsync); | |||
773 | int drm_mode_vrefresh(const struct drm_display_mode *mode) | 773 | int drm_mode_vrefresh(const struct drm_display_mode *mode) |
774 | { | 774 | { |
775 | int refresh = 0; | 775 | int refresh = 0; |
776 | unsigned int calc_val; | ||
777 | 776 | ||
778 | if (mode->vrefresh > 0) | 777 | if (mode->vrefresh > 0) |
779 | refresh = mode->vrefresh; | 778 | refresh = mode->vrefresh; |
780 | else if (mode->htotal > 0 && mode->vtotal > 0) { | 779 | else if (mode->htotal > 0 && mode->vtotal > 0) { |
781 | int vtotal; | 780 | unsigned int num, den; |
782 | vtotal = mode->vtotal; | 781 | |
783 | /* work out vrefresh the value will be x1000 */ | 782 | num = mode->clock * 1000; |
784 | calc_val = (mode->clock * 1000); | 783 | den = mode->htotal * mode->vtotal; |
785 | calc_val /= mode->htotal; | ||
786 | refresh = (calc_val + vtotal / 2) / vtotal; | ||
787 | 784 | ||
788 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | 785 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
789 | refresh *= 2; | 786 | num *= 2; |
790 | if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | 787 | if (mode->flags & DRM_MODE_FLAG_DBLSCAN) |
791 | refresh /= 2; | 788 | den *= 2; |
792 | if (mode->vscan > 1) | 789 | if (mode->vscan > 1) |
793 | refresh /= mode->vscan; | 790 | den *= mode->vscan; |
791 | |||
792 | refresh = DIV_ROUND_CLOSEST(num, den); | ||
794 | } | 793 | } |
795 | return refresh; | 794 | return refresh; |
796 | } | 795 | } |
@@ -1596,12 +1595,8 @@ int drm_mode_convert_umode(struct drm_device *dev, | |||
1596 | struct drm_display_mode *out, | 1595 | struct drm_display_mode *out, |
1597 | const struct drm_mode_modeinfo *in) | 1596 | const struct drm_mode_modeinfo *in) |
1598 | { | 1597 | { |
1599 | int ret = -EINVAL; | 1598 | if (in->clock > INT_MAX || in->vrefresh > INT_MAX) |
1600 | 1599 | return -ERANGE; | |
1601 | if (in->clock > INT_MAX || in->vrefresh > INT_MAX) { | ||
1602 | ret = -ERANGE; | ||
1603 | goto out; | ||
1604 | } | ||
1605 | 1600 | ||
1606 | out->clock = in->clock; | 1601 | out->clock = in->clock; |
1607 | out->hdisplay = in->hdisplay; | 1602 | out->hdisplay = in->hdisplay; |
@@ -1622,14 +1617,11 @@ int drm_mode_convert_umode(struct drm_device *dev, | |||
1622 | 1617 | ||
1623 | out->status = drm_mode_validate_driver(dev, out); | 1618 | out->status = drm_mode_validate_driver(dev, out); |
1624 | if (out->status != MODE_OK) | 1619 | if (out->status != MODE_OK) |
1625 | goto out; | 1620 | return -EINVAL; |
1626 | 1621 | ||
1627 | drm_mode_set_crtcinfo(out, CRTC_INTERLACE_HALVE_V); | 1622 | drm_mode_set_crtcinfo(out, CRTC_INTERLACE_HALVE_V); |
1628 | 1623 | ||
1629 | ret = 0; | 1624 | return 0; |
1630 | |||
1631 | out: | ||
1632 | return ret; | ||
1633 | } | 1625 | } |
1634 | 1626 | ||
1635 | /** | 1627 | /** |