aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_modes.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_modes.c')
-rw-r--r--drivers/gpu/drm/drm_modes.c34
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);
773int drm_mode_vrefresh(const struct drm_display_mode *mode) 773int 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
1631out:
1632 return ret;
1633} 1625}
1634 1626
1635/** 1627/**