summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@linux.ie>2007-04-23 09:10:46 +1000
committerDave Airlie <airlied@linux.ie>2007-04-23 09:10:46 +1000
commit0f3c5148f02bd98411095fdc8059207fa17b4a7d (patch)
tree48d69709e71f0c8d6120913c78f52e46119b265e
parent97b5599982c76915b0750c6ef0a270639b02a6f2 (diff)
fixup vrefresh reporting, it should now be *1000 in userspace
-rw-r--r--linux-core/drm_crtc.c2
-rw-r--r--linux-core/drm_modes.c14
-rw-r--r--shared-core/drm.h2
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];