int drm_mode_vrefresh(const struct drm_display_mode *mode)
 {
        int refresh = 0;
-       unsigned int calc_val;
 
        if (mode->vrefresh > 0)
                refresh = mode->vrefresh;
        else if (mode->htotal > 0 && mode->vtotal > 0) {
-               int vtotal;
-               vtotal = mode->vtotal;
-               /* work out vrefresh the value will be x1000 */
-               calc_val = (mode->clock * 1000);
-               calc_val /= mode->htotal;
-               refresh = (calc_val + vtotal / 2) / vtotal;
+               unsigned int num, den;
+
+               num = mode->clock * 1000;
+               den = mode->htotal * mode->vtotal;
 
                if (mode->flags & DRM_MODE_FLAG_INTERLACE)
-                       refresh *= 2;
+                       num *= 2;
                if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
-                       refresh /= 2;
+                       den *= 2;
                if (mode->vscan > 1)
-                       refresh /= mode->vscan;
+                       den *= mode->vscan;
+
+               refresh = DIV_ROUND_CLOSEST(num, den);
        }
        return refresh;
 }