fixup vrefresh reporting, it should now be *1000 in userspace
authorDave Airlie <airlied@linux.ie>
Sun, 22 Apr 2007 23:10:46 +0000 (09:10 +1000)
committerDave Airlie <airlied@linux.ie>
Sun, 22 Apr 2007 23:10:46 +0000 (09:10 +1000)
linux-core/drm_crtc.c
linux-core/drm_modes.c
shared-core/drm.h

index a099a6d..f95facc 100644 (file)
@@ -1085,7 +1085,7 @@ void drm_crtc_convert_to_umode(struct drm_mode_modeinfo *out, struct drm_display
        out->vsync_end = in->vsync_end;
        out->vtotal = in->vtotal;
        out->vscan = in->vscan;
-       
+       out->vrefresh = in->vrefresh;
        out->flags = in->flags;
        strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN);
        out->name[DRM_DISPLAY_MODE_LEN-1] = 0;
index 648e85e..54c2513 100644 (file)
@@ -47,7 +47,7 @@ void drm_mode_debug_printmodeline(struct drm_device *dev,
                                  struct drm_display_mode *mode)
 {
        DRM_DEBUG("Modeline %d:\"%s\" %d %d %d %d %d %d %d %d %d %d\n",
-                 mode->mode_id, mode->name, mode->vrefresh / 1000, mode->clock,
+                 mode->mode_id, mode->name, mode->vrefresh, mode->clock,
                  mode->hdisplay, mode->hsync_start,
                  mode->hsync_end, mode->htotal,
                  mode->vdisplay, mode->vsync_start,
@@ -144,16 +144,24 @@ EXPORT_SYMBOL(drm_mode_height);
  * FIXME: why is this needed?
  *
  * RETURNS:
- * Vertical refresh rate of @mode.
+ * Vertical refresh rate of @mode x 1000. For precision reasons.
  */
 int drm_mode_vrefresh(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) {
-               refresh = ((mode->clock * 1000) * 1000) / mode->htotal / mode->vtotal;
+               /* work out vrefresh the value will be x1000 */
+               calc_val = (mode->clock * 1000);
+
+               calc_val /= mode->htotal;
+               calc_val *= 1000;
+               calc_val /= mode->vtotal;
+
+               refresh = calc_val;
                if (mode->flags & V_INTERLACE)
                        refresh *= 2;
                if (mode->flags & V_DBLSCAN)
index b55640e..d42bf73 100644 (file)
@@ -905,6 +905,8 @@ struct drm_mode_modeinfo {
        unsigned short hdisplay, hsync_start, hsync_end, htotal, hskew;
        unsigned short vdisplay, vsync_start, vsync_end, vtotal, vscan;
 
+       unsigned int vrefresh; /* vertical refresh * 1000 */
+
        unsigned int flags;
 
        char name[DRM_DISPLAY_MODE_LEN];