aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_modes.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 4157250140b0..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}