diff options
author | Dave Airlie <airlied@linux.ie> | 2007-04-23 09:10:46 +1000 |
---|---|---|
committer | Dave Airlie <airlied@linux.ie> | 2007-04-23 09:10:46 +1000 |
commit | 0f3c5148f02bd98411095fdc8059207fa17b4a7d (patch) | |
tree | 48d69709e71f0c8d6120913c78f52e46119b265e | |
parent | 97b5599982c76915b0750c6ef0a270639b02a6f2 (diff) |
fixup vrefresh reporting, it should now be *1000 in userspace
-rw-r--r-- | linux-core/drm_crtc.c | 2 | ||||
-rw-r--r-- | linux-core/drm_modes.c | 14 | ||||
-rw-r--r-- | shared-core/drm.h | 2 |
3 files changed, 14 insertions, 4 deletions
diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index a099a6dc..f95facce 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -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; diff --git a/linux-core/drm_modes.c b/linux-core/drm_modes.c index 648e85e5..54c25137 100644 --- a/linux-core/drm_modes.c +++ b/linux-core/drm_modes.c @@ -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) diff --git a/shared-core/drm.h b/shared-core/drm.h index b55640e1..d42bf73a 100644 --- a/shared-core/drm.h +++ b/shared-core/drm.h @@ -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]; |