|
@@ -773,24 +773,23 @@ EXPORT_SYMBOL(drm_mode_hsync);
|
|
int drm_mode_vrefresh(const struct drm_display_mode *mode)
|
|
int drm_mode_vrefresh(const struct drm_display_mode *mode)
|
|
{
|
|
{
|
|
int refresh = 0;
|
|
int refresh = 0;
|
|
- unsigned int calc_val;
|
|
|
|
|
|
|
|
if (mode->vrefresh > 0)
|
|
if (mode->vrefresh > 0)
|
|
refresh = mode->vrefresh;
|
|
refresh = mode->vrefresh;
|
|
else if (mode->htotal > 0 && mode->vtotal > 0) {
|
|
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)
|
|
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
|
- refresh *= 2;
|
|
|
|
|
|
+ num *= 2;
|
|
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
|
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
|
- refresh /= 2;
|
|
|
|
|
|
+ den *= 2;
|
|
if (mode->vscan > 1)
|
|
if (mode->vscan > 1)
|
|
- refresh /= mode->vscan;
|
|
|
|
|
|
+ den *= mode->vscan;
|
|
|
|
+
|
|
|
|
+ refresh = DIV_ROUND_CLOSEST(num, den);
|
|
}
|
|
}
|
|
return refresh;
|
|
return refresh;
|
|
}
|
|
}
|