On Sat, Mar 13, 2010 at 02:47:52PM +0000, James Simmons wrote: > > For the fbdev layer the you have your struct fb_var_screeninfo and also > struct fb_videomode. The struct fb_videomode was developed for the modes > database we have. Struct fb_var_screeninfo is more than just resolution > data which is why we create struct fb_videomode. The really nice thing > is that the conversion from fb_var to fb_videomode always fixes the > pixclock to the proper values so you don't need the pixclock = 0 work > around. I tested this patch with the intelfb driver and had no problem. > I have used it in the past with a KMS enabled tdfx drver I wrote. In the > future this function can be used for fbdev level mode setting. Please try > it out and i hope it can be merged. Thanks. > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index 5054970..467ac68 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -581,6 +581,60 @@ int drm_fb_helper_setcolreg(unsigned regno, > } > EXPORT_SYMBOL(drm_fb_helper_setcolreg); > > +void drm_display_mode_to_fbmode(struct drm_display_mode *mode, > + struct fb_videomode *fbmode) > +{ > + fbmode->xres = mode->hdisplay; > + fbmode->yres = mode->vdisplay; > + fbmode->right_margin = mode->hsync_start - mode->hdisplay; > + fbmode->lower_margin = mode->vsync_start - mode->vdisplay; > + fbmode->hsync_len = mode->hsync_end - mode->hsync_start; > + fbmode->vsync_len = mode->vsync_end - mode->vsync_start; > + fbmode->left_margin = mode->htotal - mode->hsync_end; > + fbmode->upper_margin = mode->vtotal - mode->vsync_end; > + fbmode->refresh = mode->vrefresh; > + fbmode->name = mode->name; Is there some guarantee that mode won't be freed before fbmode? That would leave fbmode->name pointing to invalid memory. > + > + if (mode->flags & DRM_MODE_FLAG_INTERLACE) > + fbmode->vmode |= FB_VMODE_INTERLACED; > + > + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) > + fbmode->vmode |= FB_VMODE_DOUBLE; > + What about the sync flags? > + /* Doing a var to fb_videomode always create a proper pixclock > + * we can trust, but the reverse is not true. So we create > + * a proper pixclock from the refresh rate wanted. */ > + fbmode->pixclock = mode->vrefresh * mode->vtotal; > + fbmode->pixclock *= mode->htotal; > + fbmode->pixclock /= 1000; > + fbmode->pixclock = KHZ2PICOS(fbmode->pixclock); > +} > +EXPORT_SYMBOL(drm_display_mode_to_fbmode); > + > +void fbmode_to_drm_display_mode(struct fb_videomode *fbmode, > + struct drm_display_mode *mode) > +{ > + mode->hdisplay = fbmode->xres; > + mode->vdisplay = fbmode->yres; > + mode->hsync_start = mode->hdisplay + fbmode->right_margin; > + mode->vsync_start = mode->vdisplay + fbmode->lower_margin; > + mode->hsync_end = mode->hsync_start + fbmode->hsync_len; > + mode->vsync_end = mode->vsync_start + fbmode->vsync_len; > + mode->htotal = mode->hsync_end + fbmode->left_margin; > + mode->vtotal = mode->vsync_end + fbmode->upper_margin; > + mode->vrefresh = fbmode->refresh; > + mode->clock = PICOS2KHZ(fbmode->pixclock); > + > + if ((fbmode->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) > + mode->flags |= DRM_MODE_FLAG_INTERLACE; > + > + if ((fbmode->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) > + mode->flags |= DRM_MODE_FLAG_DBLSCAN; Is interlaced+dblscan considered an invalid combination? The conversion to the other direction didn't make that assumption. -- Ville Syrjälä syrjala@xxxxxx http://www.sci.fi/~syrjala/ -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html