Message ID | 1353426896-6045-5-git-send-email-s.trumtrar@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 2012-11-20 17:54, Steffen Trumtrar wrote: > Add helper to get fb_videomode from devicetree. > > Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de> > Reviewed-by: Thierry Reding <thierry.reding@avionic-design.de> > Acked-by: Thierry Reding <thierry.reding@avionic-design.de> > Tested-by: Thierry Reding <thierry.reding@avionic-design.de> > Tested-by: Philipp Zabel <p.zabel@pengutronix.de> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/video/fbmon.c | 42 +++++++++++++++++++++++++++++++++++++++++- > include/linux/fb.h | 7 +++++++ > 2 files changed, 48 insertions(+), 1 deletion(-) > diff --git a/include/linux/fb.h b/include/linux/fb.h > index 920cbe3..41b5e49 100644 > --- a/include/linux/fb.h > +++ b/include/linux/fb.h > @@ -15,6 +15,8 @@ > #include <linux/slab.h> > #include <asm/io.h> > #include <linux/videomode.h> > +#include <linux/of.h> > +#include <linux/of_videomode.h> Guess what? =) To be honest, I don't know what the general opinion is about including header files from header files. But I always leave them out if they are not strictly needed. > struct vm_area_struct; > struct fb_info; > @@ -715,6 +717,11 @@ 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); > > +#if IS_ENABLED(CONFIG_OF_VIDEOMODE) > +extern int of_get_fb_videomode(const struct device_node *np, > + struct fb_videomode *fb, > + unsigned int index); > +#endif > #if IS_ENABLED(CONFIG_VIDEOMODE) > extern int fb_videomode_from_videomode(const struct videomode *vm, > struct fb_videomode *fbmode); Do you really need these #ifs in the header files? They do make it look a bit messy. If somebody uses the functions and CONFIG_VIDEOMODE is not enabled, he'll get a linker error anyway. Tomi
Hi Tomi, On Wednesday 21 November 2012 14:49:30 Tomi Valkeinen wrote: > On 2012-11-20 17:54, Steffen Trumtrar wrote: > > Add helper to get fb_videomode from devicetree. > > > > Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de> > > Reviewed-by: Thierry Reding <thierry.reding@avionic-design.de> > > Acked-by: Thierry Reding <thierry.reding@avionic-design.de> > > Tested-by: Thierry Reding <thierry.reding@avionic-design.de> > > Tested-by: Philipp Zabel <p.zabel@pengutronix.de> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > --- > > > > drivers/video/fbmon.c | 42 +++++++++++++++++++++++++++++++++++++++++- > > include/linux/fb.h | 7 +++++++ > > 2 files changed, 48 insertions(+), 1 deletion(-) > > > > diff --git a/include/linux/fb.h b/include/linux/fb.h > > index 920cbe3..41b5e49 100644 > > --- a/include/linux/fb.h > > +++ b/include/linux/fb.h > > @@ -15,6 +15,8 @@ > > > > #include <linux/slab.h> > > #include <asm/io.h> > > #include <linux/videomode.h> > > > > +#include <linux/of.h> > > +#include <linux/of_videomode.h> > > Guess what? =) > > To be honest, I don't know what the general opinion is about including > header files from header files. But I always leave them out if they are > not strictly needed. I agree, I favor structure declaration as well when possible. > > struct vm_area_struct; > > struct fb_info; > > > > @@ -715,6 +717,11 @@ 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); > > > > +#if IS_ENABLED(CONFIG_OF_VIDEOMODE) > > +extern int of_get_fb_videomode(const struct device_node *np, > > + struct fb_videomode *fb, > > + unsigned int index); > > +#endif > > > > #if IS_ENABLED(CONFIG_VIDEOMODE) > > extern int fb_videomode_from_videomode(const struct videomode *vm, > > > > struct fb_videomode *fbmode); > > Do you really need these #ifs in the header files? They do make it look > a bit messy. If somebody uses the functions and CONFIG_VIDEOMODE is not > enabled, he'll get a linker error anyway.
On Wed, Nov 21, 2012 at 02:49:30PM +0200, Tomi Valkeinen wrote: > On 2012-11-20 17:54, Steffen Trumtrar wrote: > > Add helper to get fb_videomode from devicetree. > > > > Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de> > > Reviewed-by: Thierry Reding <thierry.reding@avionic-design.de> > > Acked-by: Thierry Reding <thierry.reding@avionic-design.de> > > Tested-by: Thierry Reding <thierry.reding@avionic-design.de> > > Tested-by: Philipp Zabel <p.zabel@pengutronix.de> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > --- > > drivers/video/fbmon.c | 42 +++++++++++++++++++++++++++++++++++++++++- > > include/linux/fb.h | 7 +++++++ > > 2 files changed, 48 insertions(+), 1 deletion(-) > > > > diff --git a/include/linux/fb.h b/include/linux/fb.h > > index 920cbe3..41b5e49 100644 > > --- a/include/linux/fb.h > > +++ b/include/linux/fb.h > > @@ -15,6 +15,8 @@ > > #include <linux/slab.h> > > #include <asm/io.h> > > #include <linux/videomode.h> > > +#include <linux/of.h> > > +#include <linux/of_videomode.h> > > Guess what? =) > > To be honest, I don't know what the general opinion is about including > header files from header files. But I always leave them out if they are > not strictly needed. > Okay. Seems to fit with the rest of the file; > > struct vm_area_struct; > > struct fb_info; > > @@ -715,6 +717,11 @@ 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); > > > > +#if IS_ENABLED(CONFIG_OF_VIDEOMODE) > > +extern int of_get_fb_videomode(const struct device_node *np, > > + struct fb_videomode *fb, > > + unsigned int index); > > +#endif > > #if IS_ENABLED(CONFIG_VIDEOMODE) > > extern int fb_videomode_from_videomode(const struct videomode *vm, > > struct fb_videomode *fbmode); > > Do you really need these #ifs in the header files? They do make it look > a bit messy. If somebody uses the functions and CONFIG_VIDEOMODE is not > enabled, he'll get a linker error anyway. > Well, I don't remember at the moment who requested this, but it was not my idea to put them there. So, this is a matter of style I guess. But maybe I understood that wrong. Regards, Steffen
On 2012-11-21 18:24, Steffen Trumtrar wrote: > On Wed, Nov 21, 2012 at 02:49:30PM +0200, Tomi Valkeinen wrote: >>> @@ -715,6 +717,11 @@ 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); >>> >>> +#if IS_ENABLED(CONFIG_OF_VIDEOMODE) >>> +extern int of_get_fb_videomode(const struct device_node *np, >>> + struct fb_videomode *fb, >>> + unsigned int index); >>> +#endif >>> #if IS_ENABLED(CONFIG_VIDEOMODE) >>> extern int fb_videomode_from_videomode(const struct videomode *vm, >>> struct fb_videomode *fbmode); >> >> Do you really need these #ifs in the header files? They do make it look >> a bit messy. If somebody uses the functions and CONFIG_VIDEOMODE is not >> enabled, he'll get a linker error anyway. >> > > Well, I don't remember at the moment who requested this, but it was not my > idea to put them there. So, this is a matter of style I guess. > But maybe I understood that wrong. Right, one reviewer says this way, and another says that way =). With the header files I've made I only use #ifs with #else, when I want to give a static inline empty/no-op implementation for the function in case the feature is not compiled into the kernel. As you said, matter of taste. Up to you. Tomi
diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c index c1939a6..16c353c 100644 --- a/drivers/video/fbmon.c +++ b/drivers/video/fbmon.c @@ -31,7 +31,7 @@ #include <linux/pci.h> #include <linux/slab.h> #include <video/edid.h> -#include <linux/videomode.h> +#include <linux/of_videomode.h> #ifdef CONFIG_PPC_OF #include <asm/prom.h> #include <asm/pci-bridge.h> @@ -1418,6 +1418,46 @@ int fb_videomode_from_videomode(const struct videomode *vm, EXPORT_SYMBOL_GPL(fb_videomode_from_videomode); #endif +#if IS_ENABLED(CONFIG_OF_VIDEOMODE) +static inline void dump_fb_videomode(const struct fb_videomode *m) +{ + pr_debug("fb_videomode = %ux%u@%uHz (%ukHz) %u %u %u %u %u %u %u %u %u\n", + m->xres, m->yres, m->refresh, m->pixclock, m->left_margin, + m->right_margin, m->upper_margin, m->lower_margin, + m->hsync_len, m->vsync_len, m->sync, m->vmode, m->flag); +} + +/** + * of_get_fb_videomode - get a fb_videomode from devicetree + * @np: device_node with the timing specification + * @fb: will be set to the return value + * @index: index into the list of display timings in devicetree + * + * DESCRIPTION: + * This function is expensive and should only be used, if only one mode is to be + * read from DT. To get multiple modes start with of_get_display_timings ond + * work with that instead. + */ +int of_get_fb_videomode(const struct device_node *np, struct fb_videomode *fb, + unsigned int index) +{ + struct videomode vm; + int ret; + + ret = of_get_videomode(np, &vm, index); + if (ret) + return ret; + + fb_videomode_from_videomode(&vm, fb); + + pr_info("%s: got %dx%d display mode from %s\n", __func__, vm.hactive, + vm.vactive, np->name); + dump_fb_videomode(fb); + + return 0; +} +EXPORT_SYMBOL_GPL(of_get_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 920cbe3..41b5e49 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -15,6 +15,8 @@ #include <linux/slab.h> #include <asm/io.h> #include <linux/videomode.h> +#include <linux/of.h> +#include <linux/of_videomode.h> struct vm_area_struct; struct fb_info; @@ -715,6 +717,11 @@ 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); +#if IS_ENABLED(CONFIG_OF_VIDEOMODE) +extern int of_get_fb_videomode(const struct device_node *np, + struct fb_videomode *fb, + unsigned int index); +#endif #if IS_ENABLED(CONFIG_VIDEOMODE) extern int fb_videomode_from_videomode(const struct videomode *vm, struct fb_videomode *fbmode);