diff mbox

[v7,5/8] fbmon: add videomode helpers

Message ID 1351675689-26814-6-git-send-email-s.trumtrar@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Steffen Trumtrar Oct. 31, 2012, 9:28 a.m. UTC
Add a function to convert from the generic videomode to a fb_videomode.

Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
---
 drivers/video/fbmon.c |   36 ++++++++++++++++++++++++++++++++++++
 include/linux/fb.h    |    2 ++
 2 files changed, 38 insertions(+)

Comments

Manjunathappa, Prakash Oct. 31, 2012, 3:30 p.m. UTC | #1
Hi Steffen,

On Wed, Oct 31, 2012 at 14:58:05, Steffen Trumtrar wrote:
> Add a function to convert from the generic videomode to a fb_videomode.
> 
> Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
> ---
>  drivers/video/fbmon.c |   36 ++++++++++++++++++++++++++++++++++++
>  include/linux/fb.h    |    2 ++
>  2 files changed, 38 insertions(+)
> 
> diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c
> index cef6557..b9e6ab3 100644
> --- a/drivers/video/fbmon.c
> +++ b/drivers/video/fbmon.c
> @@ -1373,6 +1373,42 @@ int fb_get_mode(int flags, u32 val, struct fb_var_screeninfo *var, struct fb_inf
>  	kfree(timings);
>  	return err;
>  }
> +
> +#if IS_ENABLED(CONFIG_VIDEOMODE)
> +int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode)
> +{
> +	fbmode->xres = vm->hactive;
> +	fbmode->left_margin = vm->hback_porch;
> +	fbmode->right_margin = vm->hfront_porch;
> +	fbmode->hsync_len = vm->hsync_len;
> +
> +	fbmode->yres = vm->vactive;
> +	fbmode->upper_margin = vm->vback_porch;
> +	fbmode->lower_margin = vm->vfront_porch;
> +	fbmode->vsync_len = vm->vsync_len;
> +
> +	fbmode->pixclock = KHZ2PICOS(vm->pixelclock / 1000);
> +
> +	fbmode->sync = 0;
> +	fbmode->vmode = 0;
> +	if (vm->hah)
> +		fbmode->sync |= FB_SYNC_HOR_HIGH_ACT;
> +	if (vm->vah)
> +		fbmode->sync |= FB_SYNC_VERT_HIGH_ACT;
> +	if (vm->interlaced)
> +		fbmode->vmode |= FB_VMODE_INTERLACED;
> +	if (vm->doublescan)
> +		fbmode->vmode |= FB_VMODE_DOUBLE;
> +

"pixelclk-inverted" property of the panel is not percolated fb_videomode.
Please let me know if I am missing something.

Thanks,
Prakash

> +	fbmode->refresh = 60;
> +	fbmode->flag = 0;
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(videomode_to_fb_videomode);
> +#endif
> +
> +
>  #else
>  int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var)
>  {
> diff --git a/include/linux/fb.h b/include/linux/fb.h
> index c7a9571..46c665b 100644
> --- a/include/linux/fb.h
> +++ b/include/linux/fb.h
> @@ -714,6 +714,8 @@ extern void fb_destroy_modedb(struct fb_videomode *modedb);
>  extern int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb);
>  extern unsigned char *fb_ddc_read(struct i2c_adapter *adapter);
>  
> +extern int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode);
> +
>  /* drivers/video/modedb.c */
>  #define VESA_MODEDB_SIZE 34
>  extern void fb_var_to_videomode(struct fb_videomode *mode,
> -- 
> 1.7.10.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
Steffen Trumtrar Oct. 31, 2012, 4:49 p.m. UTC | #2
Hi Prakash!

On Wed, Oct 31, 2012 at 03:30:03PM +0000, Manjunathappa, Prakash wrote:
> Hi Steffen,
> 
> On Wed, Oct 31, 2012 at 14:58:05, Steffen Trumtrar wrote:
> > Add a function to convert from the generic videomode to a fb_videomode.
> > 
> > Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
> > ---
> >  drivers/video/fbmon.c |   36 ++++++++++++++++++++++++++++++++++++
> >  include/linux/fb.h    |    2 ++
> >  2 files changed, 38 insertions(+)
> > 
> > diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c
> > index cef6557..b9e6ab3 100644
> > --- a/drivers/video/fbmon.c
> > +++ b/drivers/video/fbmon.c
> > @@ -1373,6 +1373,42 @@ int fb_get_mode(int flags, u32 val, struct fb_var_screeninfo *var, struct fb_inf
> >  	kfree(timings);
> >  	return err;
> >  }
> > +
> > +#if IS_ENABLED(CONFIG_VIDEOMODE)
> > +int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode)
> > +{
> > +	fbmode->xres = vm->hactive;
> > +	fbmode->left_margin = vm->hback_porch;
> > +	fbmode->right_margin = vm->hfront_porch;
> > +	fbmode->hsync_len = vm->hsync_len;
> > +
> > +	fbmode->yres = vm->vactive;
> > +	fbmode->upper_margin = vm->vback_porch;
> > +	fbmode->lower_margin = vm->vfront_porch;
> > +	fbmode->vsync_len = vm->vsync_len;
> > +
> > +	fbmode->pixclock = KHZ2PICOS(vm->pixelclock / 1000);
> > +
> > +	fbmode->sync = 0;
> > +	fbmode->vmode = 0;
> > +	if (vm->hah)
> > +		fbmode->sync |= FB_SYNC_HOR_HIGH_ACT;
> > +	if (vm->vah)
> > +		fbmode->sync |= FB_SYNC_VERT_HIGH_ACT;
> > +	if (vm->interlaced)
> > +		fbmode->vmode |= FB_VMODE_INTERLACED;
> > +	if (vm->doublescan)
> > +		fbmode->vmode |= FB_VMODE_DOUBLE;
> > +
> 
> "pixelclk-inverted" property of the panel is not percolated fb_videomode.
> Please let me know if I am missing something.
> 

You are right. I forgot that :(

Regards,
Steffen
Steffen Trumtrar Nov. 8, 2012, 9:25 p.m. UTC | #3
Hi!

On Wed, Oct 31, 2012 at 03:30:03PM +0000, Manjunathappa, Prakash wrote:
> Hi Steffen,
> 
> On Wed, Oct 31, 2012 at 14:58:05, Steffen Trumtrar wrote:
> > +#if IS_ENABLED(CONFIG_VIDEOMODE)
> > +int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode)
> > +{
> > +	fbmode->xres = vm->hactive;
> > +	fbmode->left_margin = vm->hback_porch;
> > +	fbmode->right_margin = vm->hfront_porch;
> > +	fbmode->hsync_len = vm->hsync_len;
> > +
> > +	fbmode->yres = vm->vactive;
> > +	fbmode->upper_margin = vm->vback_porch;
> > +	fbmode->lower_margin = vm->vfront_porch;
> > +	fbmode->vsync_len = vm->vsync_len;
> > +
> > +	fbmode->pixclock = KHZ2PICOS(vm->pixelclock / 1000);
> > +
> > +	fbmode->sync = 0;
> > +	fbmode->vmode = 0;
> > +	if (vm->hah)
> > +		fbmode->sync |= FB_SYNC_HOR_HIGH_ACT;
> > +	if (vm->vah)
> > +		fbmode->sync |= FB_SYNC_VERT_HIGH_ACT;
> > +	if (vm->interlaced)
> > +		fbmode->vmode |= FB_VMODE_INTERLACED;
> > +	if (vm->doublescan)
> > +		fbmode->vmode |= FB_VMODE_DOUBLE;
> > +
> 
> "pixelclk-inverted" property of the panel is not percolated fb_videomode.
> Please let me know if I am missing something.
> 

The next version is almost finished. Only thing I'm missing is this.
And I actually do not know which flag would represent an inverted pixelclock
in fb_videomode. Does anybody have any idea what I have to do here?

	if (vm->pixelclk_pol)
		fbmode->sync = ???

That's as far as I have come and I don't see a flag that seems right.
Is this even a valid property of fb_videomode?

Regards,
Steffen
Manjunathappa, Prakash Nov. 9, 2012, 4:54 p.m. UTC | #4
Hi Steffen,

On Fri, Nov 09, 2012 at 02:55:45, Steffen Trumtrar wrote:
> Hi!
> 
> On Wed, Oct 31, 2012 at 03:30:03PM +0000, Manjunathappa, Prakash wrote:
> > Hi Steffen,
> > 
> > On Wed, Oct 31, 2012 at 14:58:05, Steffen Trumtrar wrote:
> > > +#if IS_ENABLED(CONFIG_VIDEOMODE)
> > > +int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode)
> > > +{
> > > +	fbmode->xres = vm->hactive;
> > > +	fbmode->left_margin = vm->hback_porch;
> > > +	fbmode->right_margin = vm->hfront_porch;
> > > +	fbmode->hsync_len = vm->hsync_len;
> > > +
> > > +	fbmode->yres = vm->vactive;
> > > +	fbmode->upper_margin = vm->vback_porch;
> > > +	fbmode->lower_margin = vm->vfront_porch;
> > > +	fbmode->vsync_len = vm->vsync_len;
> > > +
> > > +	fbmode->pixclock = KHZ2PICOS(vm->pixelclock / 1000);
> > > +
> > > +	fbmode->sync = 0;
> > > +	fbmode->vmode = 0;
> > > +	if (vm->hah)
> > > +		fbmode->sync |= FB_SYNC_HOR_HIGH_ACT;
> > > +	if (vm->vah)
> > > +		fbmode->sync |= FB_SYNC_VERT_HIGH_ACT;
> > > +	if (vm->interlaced)
> > > +		fbmode->vmode |= FB_VMODE_INTERLACED;
> > > +	if (vm->doublescan)
> > > +		fbmode->vmode |= FB_VMODE_DOUBLE;
> > > +
> > 
> > "pixelclk-inverted" property of the panel is not percolated fb_videomode.
> > Please let me know if I am missing something.
> > 
> 
> The next version is almost finished. Only thing I'm missing is this.
> And I actually do not know which flag would represent an inverted pixelclock
> in fb_videomode. Does anybody have any idea what I have to do here?
> 
> 	if (vm->pixelclk_pol)
> 		fbmode->sync = ???
> 
> That's as far as I have come and I don't see a flag that seems right.
> Is this even a valid property of fb_videomode?
> 

Thanks for considering it, I see IMX addresses it as proprietary FB_SYNC_ flag.
FB_SYNC_CLK_INVERT: arch/arm/plat-mxc/include/mach/mx3fb.h

Thanks,
Prakash
Steffen Trumtrar Nov. 9, 2012, 7:31 p.m. UTC | #5
Hi!

On Fri, Nov 09, 2012 at 04:54:16PM +0000, Manjunathappa, Prakash wrote:
> Hi Steffen,
> 
> On Fri, Nov 09, 2012 at 02:55:45, Steffen Trumtrar wrote:
> > Hi!
> > 
> > On Wed, Oct 31, 2012 at 03:30:03PM +0000, Manjunathappa, Prakash wrote:
> > > Hi Steffen,
> > > 
> > > On Wed, Oct 31, 2012 at 14:58:05, Steffen Trumtrar wrote:
> > > > +#if IS_ENABLED(CONFIG_VIDEOMODE)
> > > > +int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode)
> > > > +{
> > > > +	fbmode->xres = vm->hactive;
> > > > +	fbmode->left_margin = vm->hback_porch;
> > > > +	fbmode->right_margin = vm->hfront_porch;
> > > > +	fbmode->hsync_len = vm->hsync_len;
> > > > +
> > > > +	fbmode->yres = vm->vactive;
> > > > +	fbmode->upper_margin = vm->vback_porch;
> > > > +	fbmode->lower_margin = vm->vfront_porch;
> > > > +	fbmode->vsync_len = vm->vsync_len;
> > > > +
> > > > +	fbmode->pixclock = KHZ2PICOS(vm->pixelclock / 1000);
> > > > +
> > > > +	fbmode->sync = 0;
> > > > +	fbmode->vmode = 0;
> > > > +	if (vm->hah)
> > > > +		fbmode->sync |= FB_SYNC_HOR_HIGH_ACT;
> > > > +	if (vm->vah)
> > > > +		fbmode->sync |= FB_SYNC_VERT_HIGH_ACT;
> > > > +	if (vm->interlaced)
> > > > +		fbmode->vmode |= FB_VMODE_INTERLACED;
> > > > +	if (vm->doublescan)
> > > > +		fbmode->vmode |= FB_VMODE_DOUBLE;
> > > > +
> > > 
> > > "pixelclk-inverted" property of the panel is not percolated fb_videomode.
> > > Please let me know if I am missing something.
> > > 
> > 
> > The next version is almost finished. Only thing I'm missing is this.
> > And I actually do not know which flag would represent an inverted pixelclock
> > in fb_videomode. Does anybody have any idea what I have to do here?
> > 
> > 	if (vm->pixelclk_pol)
> > 		fbmode->sync = ???
> > 
> > That's as far as I have come and I don't see a flag that seems right.
> > Is this even a valid property of fb_videomode?
> > 
> 
> Thanks for considering it, I see IMX addresses it as proprietary FB_SYNC_ flag.
> FB_SYNC_CLK_INVERT: arch/arm/plat-mxc/include/mach/mx3fb.h
> 

No problem. So, it seems this flag has to be set in some imx-specific
videomode_to_fb_videomode function. It is included in the
struct videomode, so that should be no problem. But it will not be
part of this series.

Regards,
Steffen
Laurent Pinchart Nov. 12, 2012, 11:46 a.m. UTC | #6
Hi Steffen,

On Friday 09 November 2012 20:31:33 Steffen Trumtrar wrote:
> On Fri, Nov 09, 2012 at 04:54:16PM +0000, Manjunathappa, Prakash wrote:
> > On Fri, Nov 09, 2012 at 02:55:45, Steffen Trumtrar wrote:
> > > On Wed, Oct 31, 2012 at 03:30:03PM +0000, Manjunathappa, Prakash wrote:
> > > > On Wed, Oct 31, 2012 at 14:58:05, Steffen Trumtrar wrote:
> > > > > +#if IS_ENABLED(CONFIG_VIDEOMODE)
> > > > > +int videomode_to_fb_videomode(struct videomode *vm, struct
> > > > > fb_videomode *fbmode) +{
> > > > > +	fbmode->xres = vm->hactive;
> > > > > +	fbmode->left_margin = vm->hback_porch;
> > > > > +	fbmode->right_margin = vm->hfront_porch;
> > > > > +	fbmode->hsync_len = vm->hsync_len;
> > > > > +
> > > > > +	fbmode->yres = vm->vactive;
> > > > > +	fbmode->upper_margin = vm->vback_porch;
> > > > > +	fbmode->lower_margin = vm->vfront_porch;
> > > > > +	fbmode->vsync_len = vm->vsync_len;
> > > > > +
> > > > > +	fbmode->pixclock = KHZ2PICOS(vm->pixelclock / 1000);
> > > > > +
> > > > > +	fbmode->sync = 0;
> > > > > +	fbmode->vmode = 0;
> > > > > +	if (vm->hah)
> > > > > +		fbmode->sync |= FB_SYNC_HOR_HIGH_ACT;
> > > > > +	if (vm->vah)
> > > > > +		fbmode->sync |= FB_SYNC_VERT_HIGH_ACT;
> > > > > +	if (vm->interlaced)
> > > > > +		fbmode->vmode |= FB_VMODE_INTERLACED;
> > > > > +	if (vm->doublescan)
> > > > > +		fbmode->vmode |= FB_VMODE_DOUBLE;
> > > > > +
> > > > 
> > > > "pixelclk-inverted" property of the panel is not percolated
> > > > fb_videomode.
> > > > Please let me know if I am missing something.
> > > 
> > > The next version is almost finished. Only thing I'm missing is this.
> > > And I actually do not know which flag would represent an inverted
> > > pixelclock in fb_videomode. Does anybody have any idea what I have to
> > > do here?> > 
> > > 	if (vm->pixelclk_pol)
> > > 	
> > > 		fbmode->sync = ???
> > > 
> > > That's as far as I have come and I don't see a flag that seems right.
> > > Is this even a valid property of fb_videomode?
> > 
> > Thanks for considering it, I see IMX addresses it as proprietary FB_SYNC_
> > flag. FB_SYNC_CLK_INVERT: arch/arm/plat-mxc/include/mach/mx3fb.h
> 
> No problem. So, it seems this flag has to be set in some imx-specific
> videomode_to_fb_videomode function. It is included in the
> struct videomode, so that should be no problem. But it will not be
> part of this series.

A possible solution would be to standardize the FB_SYNC_CLK_INVERT flag in 
fbdev, but that's in my opinion out of scope of this patch series. iMX3 
developers, feel free to send patches :-)
diff mbox

Patch

diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c
index cef6557..b9e6ab3 100644
--- a/drivers/video/fbmon.c
+++ b/drivers/video/fbmon.c
@@ -1373,6 +1373,42 @@  int fb_get_mode(int flags, u32 val, struct fb_var_screeninfo *var, struct fb_inf
 	kfree(timings);
 	return err;
 }
+
+#if IS_ENABLED(CONFIG_VIDEOMODE)
+int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode)
+{
+	fbmode->xres = vm->hactive;
+	fbmode->left_margin = vm->hback_porch;
+	fbmode->right_margin = vm->hfront_porch;
+	fbmode->hsync_len = vm->hsync_len;
+
+	fbmode->yres = vm->vactive;
+	fbmode->upper_margin = vm->vback_porch;
+	fbmode->lower_margin = vm->vfront_porch;
+	fbmode->vsync_len = vm->vsync_len;
+
+	fbmode->pixclock = KHZ2PICOS(vm->pixelclock / 1000);
+
+	fbmode->sync = 0;
+	fbmode->vmode = 0;
+	if (vm->hah)
+		fbmode->sync |= FB_SYNC_HOR_HIGH_ACT;
+	if (vm->vah)
+		fbmode->sync |= FB_SYNC_VERT_HIGH_ACT;
+	if (vm->interlaced)
+		fbmode->vmode |= FB_VMODE_INTERLACED;
+	if (vm->doublescan)
+		fbmode->vmode |= FB_VMODE_DOUBLE;
+
+	fbmode->refresh = 60;
+	fbmode->flag = 0;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(videomode_to_fb_videomode);
+#endif
+
+
 #else
 int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var)
 {
diff --git a/include/linux/fb.h b/include/linux/fb.h
index c7a9571..46c665b 100644
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -714,6 +714,8 @@  extern void fb_destroy_modedb(struct fb_videomode *modedb);
 extern int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb);
 extern unsigned char *fb_ddc_read(struct i2c_adapter *adapter);
 
+extern int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode);
+
 /* drivers/video/modedb.c */
 #define VESA_MODEDB_SIZE 34
 extern void fb_var_to_videomode(struct fb_videomode *mode,