sa1100fb cleanups
Subsystems (3)
cover sa1100fb cleanups
Here's another bunch of SA11x0 stuff - its framebuffer driver. This set of patches fixes some section mismatch warnings, moves the board configuration out to the board files, converts the Shannon stuff to use gpiolib rather than poking at GPDR/GPSR/GPCR directly.
The function hooks for LCD and backlight power control are moved into the platform data passed from the board, eliminating the global function pointers.
This series will conflict with the previous series (in the case of Assabet, the conflict is quite large) so I'd prefer to keep this in my tree for the next merge window.
arch/arm/mach-sa1100/assabet.c | 130 ++++++-- arch/arm/mach-sa1100/collie.c | 17 + arch/arm/mach-sa1100/generic.c | 14 +- arch/arm/mach-sa1100/generic.h | 6 +- arch/arm/mach-sa1100/h3100.c | 23 ++- arch/arm/mach-sa1100/h3600.c | 32 ++- arch/arm/mach-sa1100/include/mach/shannon.h | 2 +- arch/arm/mach-sa1100/lart.c | 79 +++++ arch/arm/mach-sa1100/shannon.c | 17 + drivers/video/sa1100fb.c | 433 +++++++-------------------- drivers/video/sa1100fb.h | 67 +---- include/video/sa1100fb.h | 63 ++++
PATCH 1/13 FB: sa1100: avoid section mismatch warnings
WARNING: drivers/video/built-in.o(.devinit.text+0x58): Section mismatch in reference from the function sa1100fb_probe() to the function .init.text:sa1100fb_init_fbinfo() The function __devinit sa1100fb_probe() references
a function __init sa1100fb_init_fbinfo().
If sa1100fb_init_fbinfo is only used by sa1100fb_probe then
annotate sa1100fb_init_fbinfo with a matching annotation.
WARNING: drivers/video/built-in.o(.devinit.text+0x258): Section mismatch in reference from the function sa1100fb_init_fbinfo() to the (unknown reference) .init.data:(unknown) The function __devinit sa1100fb_init_fbinfo() references
a (unknown reference) __initdata (unknown).
If (unknown) is only used by sa1100fb_init_fbinfo then
annotate (unknown) with a matching annotation.
WARNING: drivers/video/built-in.o(.devinit.text+0x26c): Section mismatch in reference from the function sa1100fb_init_fbinfo() to the (unknown reference) .init.data:(unknown) The function __devinit sa1100fb_init_fbinfo() references
a (unknown reference) __initdata (unknown).
If (unknown) is only used by sa1100fb_init_fbinfo then
annotate (unknown) with a matching annotation.
WARNING: drivers/video/built-in.o(.devinit.text+0x270): Section mismatch in reference from the function sa1100fb_init_fbinfo() to the (unknown reference) .init.data:(unknown) The function __devinit sa1100fb_init_fbinfo() references
a (unknown reference) __initdata (unknown).
If (unknown) is only used by sa1100fb_init_fbinfo then
annotate (unknown) with a matching annotation.
WARNING: drivers/video/built-in.o(.devinit.text+0x278): Section mismatch in reference from the function sa1100fb_init_fbinfo() to the (unknown reference) .init.data:(unknown) The function __devinit sa1100fb_init_fbinfo() references
a (unknown reference) __initdata (unknown).
If (unknown) is only used by sa1100fb_init_fbinfo then
annotate (unknown) with a matching annotation.
--- drivers/video/sa1100fb.c | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-)
drivers/video/sa1100fb.c +14 -14
@@ -227,7 +227,7 @@ static struct sa1100fb_rgb def_rgb_16 = {* takes an RGB666 signal, but we provide it with an RGB565 signal * instead (def_rgb_16). */ -static struct sa1100fb_mach_info lq039q2ds54_info__initdata = { +static struct sa1100fb_mach_info lq039q2ds54_info__devinitdata = { .pixclock =171521 , .bpp =16 , .xres =320 , .yres =240 ,
@@ -241,7 +241,7 @@ static struct sa1100fb_mach_info lq039q2ds54_info __initdata = { .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), };#else -static struct sa1100fb_mach_info pal_info__initdata = { +static struct sa1100fb_mach_info pal_info__devinitdata = { .pixclock =67797 , .bpp =16 , .xres = 640, .yres = 512,
@@ -256,7 +256,7 @@ static struct sa1100fb_mach_info pal_info __initdata = {#endif #ifdef CONFIG_SA1100_H3600 -static struct sa1100fb_mach_info h3600_info__initdata = { +static struct sa1100fb_mach_info h3600_info__devinitdata = { .pixclock =174757 , .bpp =16 , .xres = 320, .yres = 240,
@@ -279,7 +279,7 @@ static struct sa1100fb_rgb h3600_rgb_16 = {#endif #ifdef CONFIG_SA1100_H3100 -static struct sa1100fb_mach_info h3100_info__initdata = { +static struct sa1100fb_mach_info h3100_info__devinitdata = { .pixclock =406977 , .bpp =4 , .xres = 320, .yres = 240,
@@ -297,7 +297,7 @@ static struct sa1100fb_mach_info h3100_info __initdata = {#endif #ifdef CONFIG_SA1100_COLLIE -static struct sa1100fb_mach_info collie_info__initdata = { +static struct sa1100fb_mach_info collie_info__devinitdata = { .pixclock =171521 , .bpp =16 , .xres = 320, .yres = 240,
@@ -313,7 +313,7 @@ static struct sa1100fb_mach_info collie_info __initdata = {#endif #ifdef LART_GREY_LCD -static struct sa1100fb_mach_info lart_grey_info__initdata = { +static struct sa1100fb_mach_info lart_grey_info__devinitdata = { .pixclock =150000 , .bpp =4 , .xres = 320, .yres = 240,
@@ -329,7 +329,7 @@ static struct sa1100fb_mach_info lart_grey_info __initdata = { };#endif #ifdef LART_COLOR_LCD -static struct sa1100fb_mach_info lart_color_info__initdata = { +static struct sa1100fb_mach_info lart_color_info__devinitdata = { .pixclock =150000 , .bpp =16 , .xres = 320, .yres = 240,
@@ -342,7 +342,7 @@ static struct sa1100fb_mach_info lart_color_info __initdata = { };#endif #ifdef LART_VIDEO_OUT -static struct sa1100fb_mach_info lart_video_info__initdata = { +static struct sa1100fb_mach_info lart_video_info__devinitdata = { .pixclock =39721 , .bpp =16 , .xres = 640, .yres = 480,
@@ -358,7 +358,7 @@ static struct sa1100fb_mach_info lart_video_info __initdata = {#endif #ifdef LART_KIT01_LCD -static struct sa1100fb_mach_info lart_kit01_info__initdata = { +static struct sa1100fb_mach_info lart_kit01_info__devinitdata = { .pixclock =63291 , .bpp =16 , .xres = 640, .yres = 480,
@@ -372,7 +372,7 @@ static struct sa1100fb_mach_info lart_kit01_info __initdata = {#endif #ifdef CONFIG_SA1100_SHANNON -static struct sa1100fb_mach_info shannon_info__initdata = { +static struct sa1100fb_mach_info shannon_info__devinitdata = { .pixclock =152500 , .bpp =8 , .xres = 640, .yres = 480,
@@ -389,7 +389,7 @@ static struct sa1100fb_mach_info shannon_info __initdata = { -static struct sa1100fb_mach_info *__init +static struct sa1100fb_mach_info *__devinit sa1100fb_get_machine_info (struct sa1100fb_info *fbi) {struct sa1100fb_mach_info *inf =NULL ;
@@ -1318,7 +1318,7 @@ static int sa1100fb_resume(struct platform_device *dev)* cache. Once this area is remapped, all virtual memory * access to the video memory should occur at the new region. */ -static int __init sa1100fb_map_video_memory (struct sa1100fb_info *fbi) +static int __devinit sa1100fb_map_video_memory (struct sa1100fb_info *fbi) {/* * We reserve one page for the palette, plus the size
@@ -1344,7 +1344,7 @@ static int __init sa1100fb_map_video_memory(struct sa1100fb_info *fbi) }/* Fake monspecs to fill in fbinfo structure */ -static struct fb_monspecs monspecs__initdata = { +static struct fb_monspecs monspecs__devinitdata = { .hfmin =30000 , .hfmax =70000 , .vfmin =50 ,
@@ -1352,7 +1352,7 @@ static struct fb_monspecs monspecs __initdata = { }; -static struct sa1100fb_info *__init sa1100fb_init_fbinfo (struct device *dev) +static struct sa1100fb_info *__devinit sa1100fb_init_fbinfo (struct device *dev) {struct sa1100fb_mach_info *inf;struct sa1100fb_info *fbi;
Signature · 1 line
1.7.4.4
PATCH 2/13 FB: sa1100: add .owner initializer to driver structure
In reply to Russell King - ARM LinuxAnnotate the driver structure with the .owner field, to allow the module to be associated with the driver.
--- drivers/video/sa1100fb.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/video/sa1100fb.c +1 -0
@@ -1505,6 +1505,7 @@ static struct platform_driver sa1100fb_driver = { .resume = sa1100fb_resume, .driver = { .name = "sa11x0-fb", + .owner = THIS_MODULE, }, };
Signature · 1 line
1.7.4.4
PATCH 3/13 FB: sa1100: constify rgb structures
In reply to Russell King - ARM LinuxThe rgb structures should only be read and never written. Constify them.
--- drivers/video/sa1100fb.c | 8 ++++---- drivers/video/sa1100fb.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-)
drivers/video/sa1100fb.c +4 -4
@@ -199,21 +199,21 @@extern void (*sa1100fb_backlight_power)(int on);extern void (*sa1100fb_lcd_power)(int on); -static struct sa1100fb_rgb rgb_4 = { +static const struct sa1100fb_rgb rgb_4 = { .red = { .offset =0 , .length =4 , }, .green = { .offset =0 , .length =4 , }, .blue = { .offset =0 , .length =4 , }, .transp = { .offset =0 , .length =0 , }, }; -static struct sa1100fb_rgb rgb_8 = { +static const struct sa1100fb_rgb rgb_8 = { .red = { .offset =0 , .length =8 , }, .green = { .offset =0 , .length =8 , }, .blue = { .offset =0 , .length =8 , }, .transp = { .offset =0 , .length =0 , }, }; -static struct sa1100fb_rgb def_rgb_16 = { +static const struct sa1100fb_rgb def_rgb_16 = { .red = { .offset =11 , .length =5 , }, .green = { .offset =5 , .length =6 , }, .blue = { .offset =0 , .length =5 , },
@@ -270,7 +270,7 @@ static struct sa1100fb_mach_info h3600_info __devinitdata = { .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), }; -static struct sa1100fb_rgb h3600_rgb_16 = { +static const struct sa1100fb_rgb h3600_rgb_16 = { .red = { .offset =12 , .length =4 , }, .green = { .offset =7 , .length =4 , }, .blue = { .offset =1 , .length =4 , },
drivers/video/sa1100fb.h +1 -1
@@ -65,7 +65,7 @@ struct sa1100fb_lcd_reg {struct sa1100fb_info {struct fb_info fb;struct device *dev; -struct sa1100fb_rgb *rgb[NR_RGB ]; +const struct sa1100fb_rgb *rgb[NR_RGB ];u_int max_bpp;u_int max_xres;
Signature · 1 line
1.7.4.4
PATCH 4/13 FB: sa1100: convert printks to dev_xxx()
In reply to Russell King - ARM LinuxUse the dev_xxx() macros for driver kernel message output, rather than open coded printk() with KERN_ levels etc. Remove DPRINTK().
--- drivers/video/sa1100fb.c | 72 +++++++++++++++++++++------------------------ drivers/video/sa1100fb.h | 9 ------ 2 files changed, 34 insertions(+), 47 deletions(-)
drivers/video/sa1100fb.c +34 -38
@@ -184,10 +184,6 @@#include <mach/shannon.h> /* -* debugging? -*/ -#define DEBUG 0 -/* * Complain if VAR is out of range. */ #define DEBUG_VAR 1
@@ -614,7 +610,7 @@ sa1100fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) var->xres_virtual =max (var->xres_virtual, var->xres); var->yres_virtual =max (var->yres_virtual, var->yres); -DPRINTK ("var->bits_per_pixel=%d\n" , var->bits_per_pixel); +dev_dbg (fbi->dev,"var->bits_per_pixel=%d\n" , var->bits_per_pixel);switch (var->bits_per_pixel) {case 4 : rgbidx =RGB_4 ;
@@ -638,16 +634,16 @@ sa1100fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) var->blue = fbi->rgb[rgbidx]->blue; var->transp = fbi->rgb[rgbidx]->transp; -DPRINTK ("RGBT length = %d:%d:%d:%d\n" , +dev_dbg (fbi->dev,"RGBT length = %d:%d:%d:%d\n" , var->red.length, var->green.length, var->blue.length, var->transp.length); -DPRINTK ("RGBT offset = %d:%d:%d:%d\n" , +dev_dbg (fbi->dev,"RGBT offset = %d:%d:%d:%d\n" , var->red.offset, var->green.offset, var->blue.offset, var->transp.offset);#ifdef CONFIG_CPU_FREQ -printk (KERN_DEBUG "dma period = %d ps, clock = %d kHz\n" , +dev_dbg (fbi->dev,"dma period = %d ps, clock = %d kHz\n" ,sa1100fb_display_dma_period (var),cpufreq_get (smp_processor_id ()));#endif
@@ -683,7 +679,7 @@ static int sa1100fb_set_par(struct fb_info *info)struct fb_var_screeninfo *var = &info->var;unsigned long palette_mem_size; -DPRINTK ("set_par\n" ); +dev_dbg (fbi->dev,"set_par\n" );if (var->bits_per_pixel ==16 ) fbi->fb.fix.visual =FB_VISUAL_TRUECOLOR ;
@@ -704,7 +700,7 @@ static int sa1100fb_set_par(struct fb_info *info) palette_mem_size = fbi->palette_size *sizeof (u16); -DPRINTK ("palette_mem_size = 0x%08lx\n" , (u_long ) palette_mem_size); +dev_dbg (fbi->dev,"palette_mem_size = 0x%08lx\n" , palette_mem_size); fbi->palette_cpu = (u16 *)(fbi->map_cpu +PAGE_SIZE - palette_mem_size); fbi->palette_dma = fbi->map_dma +PAGE_SIZE - palette_mem_size;
@@ -775,7 +771,7 @@ static int sa1100fb_blank(int blank, struct fb_info *info)struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;int i; -DPRINTK ("sa1100fb_blank: blank=%d\n" , blank); +dev_dbg (fbi->dev,"sa1100fb_blank: blank=%d\n" , blank);switch (blank) {case FB_BLANK_POWERDOWN :
@@ -863,39 +859,39 @@ static int sa1100fb_activate_var(struct fb_var_screeninfo *var, struct sa1100fb_u_int half_screen_size, yres, pcd;u_long flags; -DPRINTK ("Configuring SA1100 LCD\n" ); +dev_dbg (fbi->dev,"Configuring SA1100 LCD\n" ); -DPRINTK ("var: xres=%d hslen=%d lm=%d rm=%d\n" , +dev_dbg (fbi->dev,"var: xres=%d hslen=%d lm=%d rm=%d\n" , var->xres, var->hsync_len, var->left_margin, var->right_margin); -DPRINTK ("var: yres=%d vslen=%d um=%d bm=%d\n" , +dev_dbg (fbi->dev,"var: yres=%d vslen=%d um=%d bm=%d\n" , var->yres, var->vsync_len, var->upper_margin, var->lower_margin);#if DEBUG_VAR if (var->xres <16 || var->xres >1024 ) -printk (KERN_ERR "%s: invalid xres %d\n" , +dev_err (fbi->dev,"%s: invalid xres %d\n" , fbi->fb.fix.id, var->xres);if (var->hsync_len <1 || var->hsync_len >64 ) -printk (KERN_ERR "%s: invalid hsync_len %d\n" , +dev_err (fbi->dev,"%s: invalid hsync_len %d\n" , fbi->fb.fix.id, var->hsync_len);if (var->left_margin <1 || var->left_margin >255 ) -printk (KERN_ERR "%s: invalid left_margin %d\n" , +dev_err (fbi->dev,"%s: invalid left_margin %d\n" , fbi->fb.fix.id, var->left_margin);if (var->right_margin <1 || var->right_margin >255 ) -printk (KERN_ERR "%s: invalid right_margin %d\n" , +dev_err (fbi->dev,"%s: invalid right_margin %d\n" , fbi->fb.fix.id, var->right_margin);if (var->yres <1 || var->yres >1024 ) -printk (KERN_ERR "%s: invalid yres %d\n" , +dev_err (fbi->dev,"%s: invalid yres %d\n" , fbi->fb.fix.id, var->yres);if (var->vsync_len <1 || var->vsync_len >64 ) -printk (KERN_ERR "%s: invalid vsync_len %d\n" , +dev_err (fbi->dev,"%s: invalid vsync_len %d\n" , fbi->fb.fix.id, var->vsync_len);if (var->upper_margin <0 || var->upper_margin >255 ) -printk (KERN_ERR "%s: invalid upper_margin %d\n" , +dev_err (fbi->dev,"%s: invalid upper_margin %d\n" , fbi->fb.fix.id, var->upper_margin);if (var->lower_margin <0 || var->lower_margin >255 ) -printk (KERN_ERR "%s: invalid lower_margin %d\n" , +dev_err (fbi->dev,"%s: invalid lower_margin %d\n" , fbi->fb.fix.id, var->lower_margin);#endif
@@ -928,10 +924,10 @@ static int sa1100fb_activate_var(struct fb_var_screeninfo *var, struct sa1100fb_ (var->sync &FB_SYNC_HOR_HIGH_ACT ? LCCR3_HorSnchH : LCCR3_HorSnchL) | (var->sync &FB_SYNC_VERT_HIGH_ACT ? LCCR3_VrtSnchH : LCCR3_VrtSnchL); -DPRINTK ("nlccr0 = 0x%08lx\n" , new_regs.lccr0); -DPRINTK ("nlccr1 = 0x%08lx\n" , new_regs.lccr1); -DPRINTK ("nlccr2 = 0x%08lx\n" , new_regs.lccr2); -DPRINTK ("nlccr3 = 0x%08lx\n" , new_regs.lccr3); +dev_dbg (fbi->dev,"nlccr0 = 0x%08lx\n" , new_regs.lccr0); +dev_dbg (fbi->dev,"nlccr1 = 0x%08lx\n" , new_regs.lccr1); +dev_dbg (fbi->dev,"nlccr2 = 0x%08lx\n" , new_regs.lccr2); +dev_dbg (fbi->dev,"nlccr3 = 0x%08lx\n" , new_regs.lccr3); half_screen_size = var->bits_per_pixel; half_screen_size = half_screen_size * var->xres * var->yres /16 ;
@@ -967,7 +963,7 @@ static int sa1100fb_activate_var(struct fb_var_screeninfo *var, struct sa1100fb_*/ static inline void __sa1100fb_backlight_power (struct sa1100fb_info *fbi,int on) { -DPRINTK ("backlight o%s\n" , on ?"n" :"ff" ); +dev_dbg (fbi->dev,"backlight o%s\n" , on ?"n" :"ff" );if (sa1100fb_backlight_power)sa1100fb_backlight_power (on);
@@ -975,7 +971,7 @@ static inline void __sa1100fb_backlight_power(struct sa1100fb_info *fbi, int on)static inline void __sa1100fb_lcd_power (struct sa1100fb_info *fbi,int on) { -DPRINTK ("LCD power o%s\n" , on ?"n" :"ff" ); +dev_dbg (fbi->dev,"LCD power o%s\n" , on ?"n" :"ff" );if (sa1100fb_lcd_power)sa1100fb_lcd_power (on);
@@ -1015,7 +1011,7 @@ static void sa1100fb_setup_gpio(struct sa1100fb_info *fbi)static void sa1100fb_enable_controller (struct sa1100fb_info *fbi) { -DPRINTK ("Enabling LCD controller\n" ); +dev_dbg (fbi->dev,"Enabling LCD controller\n" );/* * Make sure the mode bits are present in the first palette entry
@@ -1037,19 +1033,19 @@ static void sa1100fb_enable_controller(struct sa1100fb_info *fbi)GPSR |=SHANNON_GPIO_DISP_EN ; } -DPRINTK ("DBAR1 = 0x%08x\n" ,DBAR1 ); -DPRINTK ("DBAR2 = 0x%08x\n" ,DBAR2 ); -DPRINTK ("LCCR0 = 0x%08x\n" ,LCCR0 ); -DPRINTK ("LCCR1 = 0x%08x\n" ,LCCR1 ); -DPRINTK ("LCCR2 = 0x%08x\n" ,LCCR2 ); -DPRINTK ("LCCR3 = 0x%08x\n" ,LCCR3 ); +dev_dbg (fbi->dev,"DBAR1 = 0x%08lx\n" ,DBAR1 ); +dev_dbg (fbi->dev,"DBAR2 = 0x%08lx\n" ,DBAR2 ); +dev_dbg (fbi->dev,"LCCR0 = 0x%08lx\n" ,LCCR0 ); +dev_dbg (fbi->dev,"LCCR1 = 0x%08lx\n" ,LCCR1 ); +dev_dbg (fbi->dev,"LCCR2 = 0x%08lx\n" ,LCCR2 ); +dev_dbg (fbi->dev,"LCCR3 = 0x%08lx\n" ,LCCR3 ); }static void sa1100fb_disable_controller (struct sa1100fb_info *fbi) {DECLARE_WAITQUEUE (wait, current); -DPRINTK ("Disabling LCD controller\n" ); +dev_dbg (fbi->dev,"Disabling LCD controller\n" );if (machine_is_shannon ()) {GPCR |=SHANNON_GPIO_DISP_EN ;
@@ -1268,7 +1264,7 @@ sa1100fb_freq_policy(struct notifier_block *nb, unsigned long val,switch (val) {case CPUFREQ_ADJUST :case CPUFREQ_INCOMPATIBLE : -printk (KERN_DEBUG "min dma period: %d ps, " +dev_dbg (fbi->dev,"min dma period: %d ps, " "new clock %d kHz\n" ,sa1100fb_min_dma_period (fbi), policy->max);/* todo: fill in min/max values */
@@ -1459,7 +1455,7 @@ static int __devinit sa1100fb_probe(struct platform_device *pdev) ret =request_irq (irq, sa1100fb_handle_irq,0 ,"LCD" , fbi);if (ret) { -printk (KERN_ERR "sa1100fb: request_irq failed: %d\n" , ret); +dev_err (&pdev->dev,"request_irq failed: %d\n" , ret); goto failed; }
drivers/video/sa1100fb.h +0 -9
@@ -130,15 +130,6 @@ struct sa1100fb_info {#define SA1100_NAME "SA1100"/* -* Debug macros -*/ -#if DEBUG -# define DPRINTK(fmt, args...) printk("%s: " fmt, __func__ , ## args) -#else -# define DPRINTK(fmt, args...) -#endif - -/* * Minimum X and Y resolutions */ #define MIN_XRES 64
Signature · 1 line
1.7.4.4
PATCH 5/13 FB: sa1100: combine RGB bitfield overrides into sa1100fb_mach_info
In reply to Russell King - ARM LinuxAllow the sa1100fb_mach_info structure to carry the RGB bitfield overrides, rather than requiring them to be separately initialized in sa1100fb_get_machine_info().
--- drivers/video/sa1100fb.c | 21 ++++++++++++++------- drivers/video/sa1100fb.h | 22 ++++++++++------------ 2 files changed, 24 insertions(+), 19 deletions(-)
drivers/video/sa1100fb.c +14 -7
@@ -252,6 +252,13 @@ static struct sa1100fb_mach_info pal_info __devinitdata = {#endif #ifdef CONFIG_SA1100_H3600 +static const struct sa1100fb_rgb h3600_rgb_16 = { + .red = { .offset =12 , .length =4 , }, + .green = { .offset =7 , .length =4 , }, + .blue = { .offset =1 , .length =4 , }, + .transp = { .offset =0 , .length =0 , }, +}; +static struct sa1100fb_mach_info h3600_info__devinitdata = { .pixclock =174757 , .bpp =16 , .xres = 320, .yres = 240,
@@ -264,13 +271,8 @@ static struct sa1100fb_mach_info h3600_info __devinitdata = { .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), -}; -static const struct sa1100fb_rgb h3600_rgb_16 = { - .red = { .offset =12 , .length =4 , }, - .green = { .offset =7 , .length =4 , }, - .blue = { .offset =1 , .length =4 , }, - .transp = { .offset =0 , .length =0 , }, + .rgb[RGB_16] = &h3600_rgb_16, };#endif
@@ -413,7 +415,6 @@ sa1100fb_get_machine_info(struct sa1100fb_info *fbi)#ifdef CONFIG_SA1100_H3600 if (machine_is_h3600 ()) { inf = &h3600_info; - fbi->rgb[RGB_16 ] = &h3600_rgb_16; }#endif #ifdef CONFIG_SA1100_COLLIE
@@ -1352,6 +1353,7 @@ static struct sa1100fb_info * __devinit sa1100fb_init_fbinfo(struct device *dev) {struct sa1100fb_mach_info *inf;struct sa1100fb_info *fbi; +unsigned i; fbi =kmalloc (sizeof (struct sa1100fb_info ) +sizeof (u32) *16 ,GFP_KERNEL );
@@ -1424,6 +1426,11 @@ static struct sa1100fb_info * __devinit sa1100fb_init_fbinfo(struct device *dev) fbi->fb.fix.smem_len = fbi->max_xres * fbi->max_yres * fbi->max_bpp /8 ; +/* Copy the RGB bitfield overrides */ +for (i =0 ; i <NR_RGB ; i++) +if (inf->rgb[i]) + fbi->rgb[i] = inf->rgb[i]; +init_waitqueue_head (&fbi->ctrlr_wait);INIT_WORK (&fbi->task, sa1100fb_task);mutex_init (&fbi->ctrlr_lock);
drivers/video/sa1100fb.h +10 -12
@@ -10,10 +10,12 @@* for more details. */ -/* -* These are the bitfields for each -* display depth that we support. -*/ +#define RGB_4 0 +#define RGB_8 1 +#define RGB_16 2 +#define NR_RGB 3 + +/* These are the bitfields for each display depth that we support. */ struct sa1100fb_rgb {struct fb_bitfield red;struct fb_bitfield green;
@@ -21,9 +23,7 @@ struct sa1100fb_rgb {struct fb_bitfield transp; }; -/* -* This structure describes the machine which we are running on. -*/ +/* This structure describes the machine which we are running on. */ struct sa1100fb_mach_info {u_long pixclock;
@@ -47,6 +47,9 @@ struct sa1100fb_mach_info {u_int lccr0;u_int lccr3; + +/* Overrides for the default RGB maps */ +const struct sa1100fb_rgb *rgb[NR_RGB ]; };/* Shadows for LCD controller registers */
@@ -57,11 +60,6 @@ struct sa1100fb_lcd_reg {unsigned long lccr3; }; -#define RGB_4 (0) -#define RGB_8 (1) -#define RGB_16 (2) -#define NR_RGB 3 -struct sa1100fb_info {struct fb_info fb;struct device *dev;
Signature · 1 line
1.7.4.4
PATCH 6/13 FB: sa1100: move machine inf structures to <video/sa1100fb.h>
In reply to Russell King - ARM LinuxMove the LCD data structures to an include file which can be shared with the board code in arch/arm/mach-sa1100.
--- drivers/video/sa1100fb.c | 6 ++++- drivers/video/sa1100fb.h | 42 -------------------------------- include/video/sa1100fb.h | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 43 deletions(-) create mode 100644 include/video/sa1100fb.h
drivers/video/sa1100fb.c +5 -1
@@ -178,6 +178,8 @@#include <linux/mutex.h> #include <linux/io.h> +#include <video/sa1100fb.h> +#include <mach/hardware.h> #include <asm/mach-types.h> #include <mach/assabet.h>
@@ -1388,7 +1390,9 @@ static struct sa1100fb_info * __devinit sa1100fb_init_fbinfo(struct device *dev) fbi->rgb[RGB_8 ] = &rgb_8; fbi->rgb[RGB_16 ] = &def_rgb_16; - inf =sa1100fb_get_machine_info (fbi); + inf = dev->platform_data; +if (!inf) + inf =sa1100fb_get_machine_info (fbi);/* * People just don't seem to get this. We don't support
drivers/video/sa1100fb.h +0 -42
48 lines not on this page · raw message
include/video/sa1100fb.h new file +59 -0
59 lines not on this page · raw message
Signature · 1 line
1.7.4.4
PATCH 7/13 FB: sa1100: move platform data to platform files
In reply to Russell King - ARM LinuxMove platform data out of the sa1100fb driver into the various platform files themselves.
--- arch/arm/mach-sa1100/assabet.c | 40 +++++++ arch/arm/mach-sa1100/collie.c | 17 +++ arch/arm/mach-sa1100/generic.c | 8 +- arch/arm/mach-sa1100/generic.h | 3 + arch/arm/mach-sa1100/h3100.c | 22 ++++- arch/arm/mach-sa1100/h3600.c | 31 +++++- arch/arm/mach-sa1100/lart.c | 79 +++++++++++++ arch/arm/mach-sa1100/shannon.c | 17 +++ drivers/video/sa1100fb.c | 239 +--------------------------------------- 9 files changed, 218 insertions(+), 238 deletions(-)
arch/arm/mach-sa1100/assabet.c +40 -0
@@ -20,6 +20,8 @@#include <linux/delay.h> #include <linux/mm.h> +#include <video/sa1100fb.h> +#include <mach/hardware.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -204,6 +206,39 @@ static struct mcp_plat_data assabet_mcp_data = { .sclk_rate = 11981000, }; +#ifndef ASSABET_PAL_VIDEO +/* +* The assabet uses a sharp LQ039Q2DS54 LCD module. It is actually +* takes an RGB666 signal, but we provide it with an RGB565 signal +* instead (def_rgb_16). +*/ +static struct sa1100fb_mach_info lq039q2ds54_info = { + .pixclock =171521 , .bpp =16 , + .xres =320 , .yres =240 , + + .hsync_len =5 , .vsync_len =1 , + .left_margin =61 , .upper_margin =3 , + .right_margin =9 , .lower_margin =0 , + + .sync =FB_SYNC_HOR_HIGH_ACT |FB_SYNC_VERT_HIGH_ACT , + + .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, + .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg |LCCR3_ACBsDiv (2 ), +}; +#else +static struct sa1100fb_mach_info pal_info = { + .pixclock =67797 , .bpp =16 , + .xres =640 , .yres =512 , + + .hsync_len =64 , .vsync_len =6 , + .left_margin =125 , .upper_margin =70 , + .right_margin =115 , .lower_margin =36 , + + .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, + .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg |LCCR3_ACBsDiv (512 ), +}; +#endif +static void __init assabet_init (void ) {/*
@@ -249,6 +284,11 @@ static void __init assabet_init(void)#endif } +#ifndef ASSABET_PAL_VIDEO +sa11x0_register_lcd (&lq039q2ds54_info); +#else +sa11x0_register_lcd (&pal_video); +#endif sa11x0_register_mtd (&assabet_flash_data, assabet_flash_resources,ARRAY_SIZE (assabet_flash_resources));sa11x0_register_irda (&assabet_irda_data);
arch/arm/mach-sa1100/collie.c +17 -0
@@ -28,6 +28,8 @@#include <linux/gpio.h> #include <linux/pda_power.h> +#include <video/sa1100fb.h> +#include <mach/hardware.h> #include <asm/mach-types.h> #include <asm/irq.h>
@@ -310,6 +312,20 @@ static struct resource collie_flash_resources[] = { } }; +static struct sa1100fb_mach_info collie_lcd_info = { + .pixclock =171521 , .bpp =16 , + .xres =320 , .yres =240 , + + .hsync_len =5 , .vsync_len =1 , + .left_margin =11 , .upper_margin =2 , + .right_margin =30 , .lower_margin =0 , + + .sync =FB_SYNC_HOR_HIGH_ACT |FB_SYNC_VERT_HIGH_ACT , + + .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, + .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg |LCCR3_ACBsDiv (2 ), +}; +static void __init collie_init (void ) {int ret =0 ;
@@ -348,6 +364,7 @@ static void __init collie_init(void)printk (KERN_WARNING "collie: Unable to register LoCoMo device\n" ); } +sa11x0_register_lcd (&collie_lcd_info);sa11x0_register_mtd (&collie_flash_data, collie_flash_resources,ARRAY_SIZE (collie_flash_resources));sa11x0_register_mcp (&collie_mcp_data);
arch/arm/mach-sa1100/generic.c +7 -1
@@ -19,6 +19,8 @@#include <linux/ioport.h> #include <linux/platform_device.h> +#include <video/sa1100fb.h> +#include <asm/div64.h> #include <mach/hardware.h> #include <asm/system.h>
@@ -294,6 +296,11 @@ static struct platform_device sa11x0fb_device = { .resource = sa11x0fb_resources, }; +void sa11x0_register_lcd (struct sa1100fb_mach_info *inf) +{ +sa11x0_register_device (&sa11x0fb_device, inf); +} +static struct platform_device sa11x0pcmcia_device = { .name ="sa11x0-pcmcia" , .id =-1 ,
@@ -356,7 +363,6 @@ static struct platform_device *sa11x0_devices[] __initdata = { &sa11x0uart3_device, &sa11x0ssp_device, &sa11x0pcmcia_device, - &sa11x0fb_device, &sa11x0rtc_device, };
arch/arm/mach-sa1100/generic.h +3 -0
@@ -40,3 +40,6 @@ void sa11x0_register_irda(struct irda_platform_data *irda);struct mcp_plat_data ;void sa11x0_register_mcp (struct mcp_plat_data *data); + +struct sa1100fb_mach_info ; +void sa11x0_register_lcd (struct sa1100fb_mach_info *inf);
arch/arm/mach-sa1100/h3100.c +20 -2
@@ -14,6 +14,8 @@#include <linux/kernel.h> #include <linux/gpio.h> +#include <video/sa1100fb.h> +#include <asm/mach-types.h> #include <asm/mach/arch.h> #include <asm/mach/irda.h>
@@ -36,13 +38,26 @@ static void h3100_lcd_power(int enable) } } +static struct sa1100fb_mach_info h3100_lcd_info = { + .pixclock =406977 , .bpp =4 , + .xres =320 , .yres =240 , + + .hsync_len =26 , .vsync_len =41 , + .left_margin =4 , .upper_margin =0 , + .right_margin =4 , .lower_margin =0 , + + .sync =FB_SYNC_HOR_HIGH_ACT |FB_SYNC_VERT_HIGH_ACT , + .cmap_greyscale =1 , + .cmap_inverse =1 , + + .lccr0 = LCCR0_Mono | LCCR0_4PixMono | LCCR0_Sngl | LCCR0_Pas, + .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg |LCCR3_ACBsDiv (2 ), +};static void __init h3100_map_io (void ) {h3xxx_map_io (); - sa1100fb_lcd_power = h3100_lcd_power; -/* Older bootldrs put GPIO2-9 in alternate mode on the assumption that they are used for video */ GAFR &= ~0x000001fb ;
@@ -80,6 +95,9 @@ static void __init h3100_mach_init(void) {h3xxx_init_gpio (h3100_default_gpio,ARRAY_SIZE (h3100_default_gpio));h3xxx_mach_init (); + + sa1100fb_lcd_power = h3100_lcd_power; +sa11x0_register_lcd (&h3100_lcd_info);sa11x0_register_irda (&h3100_irda_data); }
arch/arm/mach-sa1100/h3600.c +29 -2
@@ -14,6 +14,8 @@#include <linux/kernel.h> #include <linux/gpio.h> +#include <video/sa1100fb.h> +#include <asm/mach-types.h> #include <asm/mach/arch.h> #include <asm/mach/irda.h>
@@ -56,11 +58,33 @@ err2: gpio_free(H3XXX_EGPIO_LCD_ON); err1:return ; } +static const struct sa1100fb_rgb h3600_rgb_16 = { + .red = { .offset =12 , .length =4 , }, + .green = { .offset =7 , .length =4 , }, + .blue = { .offset =1 , .length =4 , }, + .transp = { .offset =0 , .length =0 , }, +}; + +static struct sa1100fb_mach_info h3600_lcd_info = { + .pixclock =174757 , .bpp =16 , + .xres =320 , .yres =240 , + + .hsync_len =3 , .vsync_len =3 , + .left_margin =12 , .upper_margin =10 , + .right_margin =17 , .lower_margin =1 , + + .cmap_static =1 , + + .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, + .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg |LCCR3_ACBsDiv (2 ), + + .rgb[RGB_16 ] = &h3600_rgb_16, +}; + +static void __init h3600_map_io (void ) {h3xxx_map_io (); - - sa1100fb_lcd_power = h3600_lcd_power; }/*
@@ -121,6 +145,9 @@ static void __init h3600_mach_init(void) {h3xxx_init_gpio (h3600_default_gpio,ARRAY_SIZE (h3600_default_gpio));h3xxx_mach_init (); + + sa1100fb_lcd_power = h3600_lcd_power; +sa11x0_register_lcd (&h3600_lcd_info);sa11x0_register_irda (&h3600_irda_data); }
arch/arm/mach-sa1100/lart.c +79 -0
93 lines not on this page · raw message
arch/arm/mach-sa1100/shannon.c +17 -0
@@ -9,6 +9,8 @@#include <linux/mtd/mtd.h> #include <linux/mtd/partitions.h> +#include <video/sa1100fb.h> +#include <mach/hardware.h> #include <asm/mach-types.h> #include <asm/setup.h>
@@ -57,8 +59,23 @@ static struct mcp_plat_data shannon_mcp_data = { .sclk_rate = 11981000, }; +static struct sa1100fb_mach_info shannon_lcd_info = { + .pixclock =152500 , .bpp =8 , + .xres =640 , .yres =480 , + + .hsync_len =4 , .vsync_len =3 , + .left_margin =2 , .upper_margin =0 , + .right_margin =1 , .lower_margin =0 , + + .sync =FB_SYNC_HOR_HIGH_ACT |FB_SYNC_VERT_HIGH_ACT , + + .lccr0 = LCCR0_Color | LCCR0_Dual | LCCR0_Pas, + .lccr3 =LCCR3_ACBsDiv (512 ), +}; +static void __init shannon_init (void ) { +sa11x0_register_lcd (&shannon_lcd_info);sa11x0_register_mtd (&shannon_flash_data, &shannon_flash_resource,1 );sa11x0_register_mcp (&shannon_mcp_data); }
drivers/video/sa1100fb.c +6 -233
264 lines not on this page · raw message
Signature · 1 line
1.7.4.4
PATCH 8/13 FB: sa1100: remove global sa1100fb_.*_power function pointers
In reply to Russell King - ARM LinuxNow that we have platform data contained within the individual board code, we can get rid of the global function pointers, placing them inside the platform data instead.
--- arch/arm/mach-sa1100/assabet.c | 90 ++++++++++++++++++++++++++------------- arch/arm/mach-sa1100/generic.c | 6 --- arch/arm/mach-sa1100/generic.h | 3 - arch/arm/mach-sa1100/h3100.c | 3 +- arch/arm/mach-sa1100/h3600.c | 3 +- drivers/video/sa1100fb.c | 32 ++++---------- drivers/video/sa1100fb.h | 2 + include/video/sa1100fb.h | 4 ++ 8 files changed, 79 insertions(+), 64 deletions(-)
arch/arm/mach-sa1100/assabet.c +60 -30
@@ -71,33 +71,6 @@ void ASSABET_BCR_frob(unsigned int mask, unsigned int val)EXPORT_SYMBOL (ASSABET_BCR_frob); -static void assabet_backlight_power (int on) -{ -#ifndef ASSABET_PAL_VIDEO -if (on) -ASSABET_BCR_set (ASSABET_BCR_LIGHT_ON ); - else -#endif -ASSABET_BCR_clear (ASSABET_BCR_LIGHT_ON ); -} - -/* -* Turn on/off the backlight. When turning the backlight on, -* we wait 500us after turning it on so we don't cause the -* supplies to droop when we enable the LCD controller (and -* cause a hard reset.) -*/ -static void assabet_lcd_power (int on) -{ -#ifndef ASSABET_PAL_VIDEO -if (on) { -ASSABET_BCR_set (ASSABET_BCR_LCD_ON ); -udelay (500 ); - } else -#endif -ASSABET_BCR_clear (ASSABET_BCR_LCD_ON ); -} -/* * Assabet flash support code.
@@ -206,7 +179,49 @@ static struct mcp_plat_data assabet_mcp_data = { .sclk_rate = 11981000, }; +static void assabet_lcd_set_visual (u32 visual) +{ +u_int is_true_color = visual ==FB_VISUAL_TRUECOLOR ; + +if (machine_is_assabet ()) { +#if 1 // phase 4 or newer Assabet's +if (is_true_color) +ASSABET_BCR_set (ASSABET_BCR_LCD_12RGB ); +else +ASSABET_BCR_clear (ASSABET_BCR_LCD_12RGB ); +#else +// older Assabet's +if (is_true_color) +ASSABET_BCR_clear (ASSABET_BCR_LCD_12RGB ); +else +ASSABET_BCR_set (ASSABET_BCR_LCD_12RGB ); +#endif + } +} +#ifndef ASSABET_PAL_VIDEO +static void assabet_lcd_backlight_power (int on) +{ +if (on) +ASSABET_BCR_set (ASSABET_BCR_LIGHT_ON ); +else +ASSABET_BCR_clear (ASSABET_BCR_LIGHT_ON ); +} + +/* +* Turn on/off the backlight. When turning the backlight on, we wait +* 500us after turning it on so we don't cause the supplies to droop +* when we enable the LCD controller (and cause a hard reset.) +*/ +static void assabet_lcd_power (int on) +{ +if (on) { +ASSABET_BCR_set (ASSABET_BCR_LCD_ON ); +udelay (500 ); + }else +ASSABET_BCR_clear (ASSABET_BCR_LCD_ON ); +} +/* * The assabet uses a sharp LQ039Q2DS54 LCD module. It is actually * takes an RGB666 signal, but we provide it with an RGB565 signal
@@ -224,8 +239,22 @@ static struct sa1100fb_mach_info lq039q2ds54_info = { .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), + + .backlight_power = assabet_lcd_backlight_power, + .lcd_power = assabet_lcd_power, + .set_visual = assabet_lcd_set_visual, };#else +static void assabet_pal_backlight_power (int on) +{ +ASSABET_BCR_clear (ASSABET_BCR_LIGHT_ON ); +} + +static void assabet_pal_power (int on) +{ +ASSABET_BCR_clear (ASSABET_BCR_LCD_ON ); +} +static struct sa1100fb_mach_info pal_info = { .pixclock =67797 , .bpp =16 , .xres = 640, .yres = 512,
@@ -236,6 +265,10 @@ static struct sa1100fb_mach_info pal_info = { .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(512), + + .backlight_power = assabet_pal_backlight_power, + .lcd_power = assabet_pal_power, + .set_visual = assabet_lcd_set_visual, };#endif
@@ -266,9 +299,6 @@ static void __init assabet_init(void)PPDR |=PPC_TXD3 |PPC_TXD1 ;PPSR |=PPC_TXD3 |PPC_TXD1 ; - sa1100fb_lcd_power = assabet_lcd_power; - sa1100fb_backlight_power = assabet_backlight_power; -if (machine_has_neponset ()) {/* * Angel sets this, but other bootloaders may not.
arch/arm/mach-sa1100/generic.c +0 -6
@@ -374,12 +374,6 @@ static int __init sa1100_init(void)arch_initcall (sa1100_init); -void (*sa1100fb_backlight_power)(int on); -void (*sa1100fb_lcd_power)(int on); - -EXPORT_SYMBOL (sa1100fb_backlight_power); -EXPORT_SYMBOL (sa1100fb_lcd_power); -/* * Common I/O mapping:
arch/arm/mach-sa1100/generic.h +0 -3
@@ -16,9 +16,6 @@ extern void sa11x0_restart(char, const char *); mi->bank[__nr].start = (__start), \ mi->bank[__nr].size = (__size ) -extern void (*sa1100fb_backlight_power)(int on); -extern void (*sa1100fb_lcd_power)(int on); - extern void sa1110_mb_enable(void);extern void sa1110_mb_disable (void );
arch/arm/mach-sa1100/h3100.c +2 -1
@@ -52,6 +52,8 @@ static struct sa1100fb_mach_info h3100_lcd_info = { .lccr0 = LCCR0_Mono | LCCR0_4PixMono | LCCR0_Sngl | LCCR0_Pas, .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), + + .lcd_power = h3100_lcd_power, };static void __init h3100_map_io (void )
@@ -96,7 +98,6 @@ static void __init h3100_mach_init(void)h3xxx_init_gpio (h3100_default_gpio,ARRAY_SIZE (h3100_default_gpio));h3xxx_mach_init (); - sa1100fb_lcd_power = h3100_lcd_power;sa11x0_register_lcd (&h3100_lcd_info);sa11x0_register_irda (&h3100_irda_data); }
arch/arm/mach-sa1100/h3600.c +2 -1
@@ -79,6 +79,8 @@ static struct sa1100fb_mach_info h3600_lcd_info = { .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), .rgb[RGB_16] = &h3600_rgb_16, + + .lcd_power = h3600_lcd_power, };
@@ -146,7 +148,6 @@ static void __init h3600_mach_init(void)h3xxx_init_gpio (h3600_default_gpio,ARRAY_SIZE (h3600_default_gpio));h3xxx_mach_init (); - sa1100fb_lcd_power = h3600_lcd_power;sa11x0_register_lcd (&h3600_lcd_info);sa11x0_register_irda (&h3600_irda_data); }
drivers/video/sa1100fb.c +9 -23
@@ -194,9 +194,6 @@#include "sa1100fb.h" -extern void (*sa1100fb_backlight_power)(int on); -extern void (*sa1100fb_lcd_power)(int on); -static const struct sa1100fb_rgb rgb_4 = { .red = { .offset =0 , .length =4 , }, .green = { .offset =0 , .length =4 , },
@@ -426,22 +423,10 @@ sa1100fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)return 0 ; } -static inline void sa1100fb_set_truecolor (u_int is_true_color) +static void sa1100fb_set_visual (struct sa1100fb_info *fbi,u32 visual) { -if (machine_is_assabet ()) { -#if 1 // phase 4 or newer Assabet's -if (is_true_color) -ASSABET_BCR_set (ASSABET_BCR_LCD_12RGB ); -else -ASSABET_BCR_clear (ASSABET_BCR_LCD_12RGB ); -#else -// older Assabet's -if (is_true_color) -ASSABET_BCR_clear (ASSABET_BCR_LCD_12RGB ); -else -ASSABET_BCR_set (ASSABET_BCR_LCD_12RGB ); -#endif - } +if (fbi->inf->set_visual) + fbi->inf->set_visual (visual); }/*
@@ -483,7 +468,7 @@ static int sa1100fb_set_par(struct fb_info *info)/* * Set (any) board control register to handle new color depth */ -sa1100fb_set_truecolor (fbi->fb.fix.visual ==FB_VISUAL_TRUECOLOR ); +sa1100fb_set_visual (fbi, fbi->fb.fix.visual);sa1100fb_activate_var (var, fbi);return 0 ;
@@ -740,16 +725,16 @@ static inline void __sa1100fb_backlight_power(struct sa1100fb_info *fbi, int on) {dev_dbg (fbi->dev,"backlight o%s\n" , on ?"n" :"ff" ); -if (sa1100fb_backlight_power) -sa1100fb_backlight_power (on); +if (fbi->inf->backlight_power) + fbi->inf->backlight_power (on); }static inline void __sa1100fb_lcd_power (struct sa1100fb_info *fbi,int on) {dev_dbg (fbi->dev,"LCD power o%s\n" , on ?"n" :"ff" ); -if (sa1100fb_lcd_power) -sa1100fb_lcd_power (on); +if (fbi->inf->lcd_power) + fbi->inf->lcd_power (on); }static void sa1100fb_setup_gpio (struct sa1100fb_info *fbi)
@@ -1197,6 +1182,7 @@ static struct sa1100fb_info * __devinit sa1100fb_init_fbinfo(struct device *dev) fbi->task_state = (u_char)-1 ; fbi->fb.fix.smem_len = fbi->max_xres * fbi->max_yres * fbi->max_bpp /8 ; + fbi->inf = inf;/* Copy the RGB bitfield overrides */ for (i =0 ; i <NR_RGB ; i++)
drivers/video/sa1100fb.h +2 -0
@@ -65,6 +65,8 @@ struct sa1100fb_info {struct notifier_block freq_transition;struct notifier_block freq_policy;#endif + +const struct sa1100fb_mach_info *inf; };#define TO_INF (ptr,member) container_of(ptr,struct sa1100fb_info,member)
include/video/sa1100fb.h +4 -0
@@ -54,6 +54,10 @@ struct sa1100fb_mach_info {/* Overrides for the default RGB maps */ const struct sa1100fb_rgb *rgb[NR_RGB ]; + +void (*backlight_power)(int ); +void (*lcd_power)(int ); + void (*set_visual)(u32); };#endif
Signature · 1 line
1.7.4.4
PATCH 9/13 FB: sa1100: remove assabet specific initialization
In reply to Russell King - ARM LinuxRemove the assabet specific initialization for PAL output mode - we call the lcd_power function before we enable the LCD controller, which will disable the LCD panel to prevent it receiving incorrect timings. Therefore, this setup here is redundant.
--- drivers/video/sa1100fb.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-)
drivers/video/sa1100fb.c +0 -8
@@ -182,7 +182,6 @@#include <mach/hardware.h> #include <asm/mach-types.h> -#include <mach/assabet.h> #include <mach/shannon.h> /*
@@ -190,8 +189,6 @@*/ #define DEBUG_VAR 1 -#undef ASSABET_PAL_VIDEO -#include "sa1100fb.h" static const struct sa1100fb_rgb rgb_4 = {
@@ -1229,11 +1226,6 @@ static int __devinit sa1100fb_probe(struct platform_device *pdev) goto failed; } -#ifdef ASSABET_PAL_VIDEO -if (machine_is_assabet ()) -ASSABET_BCR_clear (ASSABET_BCR_LCD_ON ); -#endif -/* * This makes sure that our colour bitfield * descriptors are correctly initialised.
Signature · 1 line
1.7.4.4
PATCH 10/13 FB: sa1100: use inf members directly
In reply to Russell King - ARM LinuxNow that the LCD information is available while the driver is loaded, we don't need to cache that information into our driver private data structure. Get rid of it.
--- drivers/video/sa1100fb.c | 31 ++++++++++++------------------- drivers/video/sa1100fb.h | 10 ---------- 2 files changed, 12 insertions(+), 29 deletions(-)
drivers/video/sa1100fb.c +12 -19
@@ -298,7 +298,7 @@ sa1100fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,* is what you poke into the framebuffer to produce the * colour you requested. */ -if (fbi->cmap_inverse) { +if (fbi->inf->cmap_inverse) { red =0xffff - red; green =0xffff - green; blue =0xffff - blue;
@@ -372,10 +372,10 @@ sa1100fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) var->xres =MIN_XRES ;if (var->yres <MIN_YRES ) var->yres =MIN_YRES ; -if (var->xres > fbi->max_xres) - var->xres = fbi->max_xres; -if (var->yres > fbi->max_yres) - var->yres = fbi->max_yres; +if (var->xres > fbi->inf->xres) + var->xres = fbi->inf->xres; +if (var->yres > fbi->inf->yres) + var->yres = fbi->inf->yres; var->xres_virtual =max (var->xres_virtual, var->xres); var->yres_virtual =max (var->yres_virtual, var->yres);
@@ -440,7 +440,7 @@ static int sa1100fb_set_par(struct fb_info *info)if (var->bits_per_pixel ==16 ) fbi->fb.fix.visual =FB_VISUAL_TRUECOLOR ; -else if (!fbi->cmap_static) +else if (!fbi->inf->cmap_static) fbi->fb.fix.visual =FB_VISUAL_PSEUDOCOLOR ;else {/*
@@ -481,7 +481,7 @@ sa1100fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,/* * Make sure the user isn't doing something stupid. */ -if (!kspc && (fbi->fb.var.bits_per_pixel ==16 || fbi->cmap_static)) +if (!kspc && (fbi->fb.var.bits_per_pixel ==16 || fbi->inf->cmap_static))return -EINVAL ;return gen_set_cmap (cmap, kspc, con, info);
@@ -652,7 +652,7 @@ static int sa1100fb_activate_var(struct fb_var_screeninfo *var, struct sa1100fb_ fbi->fb.fix.id, var->lower_margin);#endif - new_regs.lccr0 = fbi->lccr0 | + new_regs.lccr0 = fbi->inf->lccr0 |LCCR0_LEN |LCCR0_LDM |LCCR0_BAM |LCCR0_ERM | LCCR0_LtlEnd |LCCR0_DMADel (0 );
@@ -667,7 +667,7 @@ static int sa1100fb_activate_var(struct fb_var_screeninfo *var, struct sa1100fb_* the YRES parameter. */ yres = var->yres; -if (fbi->lccr0 & LCCR0_Dual) +if (fbi->inf->lccr0 & LCCR0_Dual) yres /=2 ; new_regs.lccr2 =
@@ -677,7 +677,7 @@ static int sa1100fb_activate_var(struct fb_var_screeninfo *var, struct sa1100fb_LCCR2_EndFrmDel (var->lower_margin); pcd =get_pcd (var->pixclock,cpufreq_get (0 )); - new_regs.lccr3 =LCCR3_PixClkDiv (pcd) | fbi->lccr3 | + new_regs.lccr3 =LCCR3_PixClkDiv (pcd) | fbi->inf->lccr3 | (var->sync &FB_SYNC_HOR_HIGH_ACT ? LCCR3_HorSnchH : LCCR3_HorSnchL) | (var->sync &FB_SYNC_VERT_HIGH_ACT ? LCCR3_VrtSnchH : LCCR3_VrtSnchL);
@@ -1154,13 +1154,10 @@ static struct sa1100fb_info * __devinit sa1100fb_init_fbinfo(struct device *dev)panic ("sa1100fb error: invalid LCCR3 fields set or zero " "pixclock." ); - fbi->max_xres = inf->xres; fbi->fb.var.xres = inf->xres; fbi->fb.var.xres_virtual = inf->xres; - fbi->max_yres = inf->yres; fbi->fb.var.yres = inf->yres; fbi->fb.var.yres_virtual = inf->yres; - fbi->max_bpp = inf->bpp; fbi->fb.var.bits_per_pixel = inf->bpp; fbi->fb.var.pixclock = inf->pixclock; fbi->fb.var.hsync_len = inf->hsync_len;
@@ -1171,14 +1168,10 @@ static struct sa1100fb_info * __devinit sa1100fb_init_fbinfo(struct device *dev) fbi->fb.var.lower_margin = inf->lower_margin; fbi->fb.var.sync = inf->sync; fbi->fb.var.grayscale = inf->cmap_greyscale; - fbi->cmap_inverse = inf->cmap_inverse; - fbi->cmap_static = inf->cmap_static; - fbi->lccr0 = inf->lccr0; - fbi->lccr3 = inf->lccr3; fbi->state =C_STARTUP ; fbi->task_state = (u_char)-1 ; - fbi->fb.fix.smem_len = fbi->max_xres * fbi->max_yres * - fbi->max_bpp /8 ; + fbi->fb.fix.smem_len = inf->xres * inf->yres * + inf->bpp /8 ; fbi->inf = inf;/* Copy the RGB bitfield overrides */
drivers/video/sa1100fb.h +0 -10
@@ -23,10 +23,6 @@ struct sa1100fb_info {struct device *dev;const struct sa1100fb_rgb *rgb[NR_RGB ]; -u_int max_bpp; -u_int max_xres; -u_int max_yres; -/* * These are the addresses we mapped * the framebuffer memory region to.
@@ -44,12 +40,6 @@ struct sa1100fb_info {dma_addr_t dbar1;dma_addr_t dbar2; -u_int lccr0; -u_int lccr3; - u_int cmap_inverse:1, - cmap_static:1, - unused:30; -u_int reg_lccr0;u_int reg_lccr1;u_int reg_lccr2;
Signature · 1 line
1.7.4.4
PATCH 11/13 FB: sa1100: make GPIO configuration setting safe
In reply to Russell King - ARM LinuxThe sa1100fb driver needs to set the GPIO direction and alternate function register according to the panel that we're driving. We've done this in the driver by read-modify-writing the register, which may cause problems with races. Fix this with a minimal change.
--- drivers/video/sa1100fb.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-)
drivers/video/sa1100fb.c +11 -0
@@ -761,8 +761,19 @@ static void sa1100fb_setup_gpio(struct sa1100fb_info *fbi) }if (mask) { +unsigned long flags; + +/* +* SA-1100 requires the GPIO direction register set +* appropriately for the alternate function. Hence +* we set it here via bitmask rather than excessive +* fiddling via the GPIO subsystem - and even then +* we'll still have to deal with GAFR. +*/ +local_irq_save (flags);GPDR |= mask;GAFR |= mask; +local_irq_restore (flags); } }
Signature · 1 line
1.7.4.4
PATCH 12/13 FB: sa11x0: fix shannon GPSR/GPCR accesses
In reply to Russell King - ARM LinuxThe GPIO set and clear registers should only be written, rather than read, modified, and written. A read-modify-write will have undesired side effects.
--- drivers/video/sa1100fb.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/video/sa1100fb.c +2 -2
@@ -798,7 +798,7 @@ static void sa1100fb_enable_controller(struct sa1100fb_info *fbi)if (machine_is_shannon ()) {GPDR |=SHANNON_GPIO_DISP_EN ; -GPSR |=SHANNON_GPIO_DISP_EN ; +GPSR =SHANNON_GPIO_DISP_EN ; }dev_dbg (fbi->dev,"DBAR1 = 0x%08lx\n" ,DBAR1 );
@@ -816,7 +816,7 @@ static void sa1100fb_disable_controller(struct sa1100fb_info *fbi)dev_dbg (fbi->dev,"Disabling LCD controller\n" );if (machine_is_shannon ()) { -GPCR |=SHANNON_GPIO_DISP_EN ; +GPCR =SHANNON_GPIO_DISP_EN ; }set_current_state (TASK_UNINTERRUPTIBLE );
Signature · 1 line
1.7.4.4
PATCH 13/13 FB: sa11x0: convert shannon display enable accesses to use GPIO subsystem
In reply to Russell King - ARM LinuxRather than accessing GPSR and GPCR directly, use the GPIO subsystem instead.
--- arch/arm/mach-sa1100/include/mach/shannon.h | 2 +- drivers/video/sa1100fb.c | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-)
arch/arm/mach-sa1100/include/mach/shannon.h +1 -1
@@ -21,7 +21,7 @@#define SHANNON_GPIO_U3_RTS GPIO_GPIO (19)/* ?? */ #define SHANNON_GPIO_U3_CTS GPIO_GPIO (20)/* ?? */ #define SHANNON_GPIO_SENSE_12V GPIO_GPIO (21)/* Input, 12v flash unprotect detected */ -#define SHANNON_GPIO_DISP_EN GPIO_GPIO (22)/* out */ +#define SHANNON_GPIO_DISP_EN 22/* out */ /* XXX GPIO 23 unaccounted for */ #define SHANNON_GPIO_EJECT_0 GPIO_GPIO (24)/* in */ #define SHANNON_IRQ_GPIO_EJECT_0 IRQ_GPIO24
drivers/video/sa1100fb.c +16 -8
@@ -173,6 +173,7 @@#include <linux/init.h> #include <linux/ioport.h> #include <linux/cpufreq.h> +#include <linux/gpio.h> #include <linux/platform_device.h> #include <linux/dma-mapping.h> #include <linux/mutex.h>
@@ -796,10 +797,8 @@ static void sa1100fb_enable_controller(struct sa1100fb_info *fbi)DBAR2 = fbi->dbar2;LCCR0 |=LCCR0_LEN ; -if (machine_is_shannon ()) { -GPDR |=SHANNON_GPIO_DISP_EN ; -GPSR =SHANNON_GPIO_DISP_EN ; - } +if (machine_is_shannon ()) +gpio_set_value (SHANNON_GPIO_DISP_EN ,1 );dev_dbg (fbi->dev,"DBAR1 = 0x%08lx\n" ,DBAR1 );dev_dbg (fbi->dev,"DBAR2 = 0x%08lx\n" ,DBAR2 );
@@ -815,9 +814,8 @@ static void sa1100fb_disable_controller(struct sa1100fb_info *fbi)dev_dbg (fbi->dev,"Disabling LCD controller\n" ); -if (machine_is_shannon ()) { -GPCR =SHANNON_GPIO_DISP_EN ; - } +if (machine_is_shannon ()) +gpio_set_value (SHANNON_GPIO_DISP_EN ,0 );set_current_state (TASK_UNINTERRUPTIBLE );add_wait_queue (&fbi->ctrlr_wait, &wait);
@@ -1230,6 +1228,13 @@ static int __devinit sa1100fb_probe(struct platform_device *pdev) goto failed; } +if (machine_is_shannon ()) { + ret =gpio_request_one (SHANNON_GPIO_DISP_EN , +GPIOF_OUT_INIT_LOW ,"display enable" ); +if (ret) + goto err_free_irq; + } +/* * This makes sure that our colour bitfield * descriptors are correctly initialised.
@@ -1240,7 +1245,7 @@ static int __devinit sa1100fb_probe(struct platform_device *pdev) ret =register_framebuffer (&fbi->fb);if (ret <0 ) - goto err_free_irq; + goto err_reg_fb;#ifdef CONFIG_CPU_FREQ fbi->freq_transition.notifier_call = sa1100fb_freq_transition;
@@ -1252,6 +1257,9 @@ static int __devinit sa1100fb_probe(struct platform_device *pdev)/* This driver cannot be unloaded at the moment */ return 0 ; + err_reg_fb: +if (machine_is_shannon ()) +gpio_free (SHANNON_GPIO_DISP_EN ); err_free_irq:free_irq (irq, fbi); failed:
Signature · 1 line
1.7.4.4
cover sa1100fb cleanups
In reply to Russell King - ARM LinuxHi Russell,
Quoted 8 lines · Russell King - ARM Linux
Here's another bunch of SA11x0 stuff - its framebuffer driver. This set of patches fixes some section mismatch warnings, moves the board configuration out to the board files, converts the Shannon stuff to use gpiolib rather than poking at GPDR/GPSR/GPCR directly.
The function hooks for LCD and backlight power control are moved into the platform data passed from the board, eliminating the global function pointers.
This series looks good to me.
Quoted 3 lines
This series will conflict with the previous series (in the case of Assabet, the conflict is quite large) so I'd prefer to keep this in my tree for the next merge window.
Sure, feel free to proceed with this series as you like.
Best regards,
Florian Tobias Schandinat