atmel_lcdfb: fix 16-bpp regression
Subsystems (5)
cover atmel_lcdfb: fix 16-bpp regression
These patches fix a regression in 16-bpp support for older SOCs which use IBGR:555 rather than BGR:565 pixel layout. Use SOC-type to determine if the controller uses the intensity-bit and restore the old layout in that case.
The third patch is simply a clean up.
Thanks,
Johan
Johan Hovold (3):
atmel_lcdfb: fix 16-bpp modes on older SOCs
ARM: at91/neocore926: fix LCD-wiring mode
atmel_lcdfb: remove unsupported 15-bpp mode
arch/arm/mach-at91/board-neocore926.c | 2 +- drivers/video/atmel_lcdfb.c | 23 +++++++++++++++-------- include/video/atmel_lcdc.h | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-)
Signature · 1 line
1.8.0
PATCH 1/3 atmel_lcdfb: fix 16-bpp modes on older SOCs
Fix regression introduced by commit 787f9fd23283 ("atmel_lcdfb: support 16bit BGR:565 mode, remove unsupported 15bit modes") which broke 16-bpp modes for older SOCs which use IBGR:555 (msb is intensity) rather than BGR:565.
Use SOC-type to determine the pixel layout.
Tested on custom at91sam9263-board.
--- drivers/video/atmel_lcdfb.c | 22 +++++++++++++++------- include/video/atmel_lcdc.h | 1 + 2 files changed, 16 insertions(+), 7 deletions(-)
drivers/video/atmel_lcdfb.c +15 -7
@@ -422,17 +422,22 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var, = var->bits_per_pixel;break ;case 16 : +/* Older SOCs use IBGR:555 rather than BGR:565. */ +if (sinfo->have_intensity_bit) + var->green.length =5 ; +else + var->green.length =6 ; +if (sinfo->lcd_wiring_mode ==ATMEL_LCDC_WIRING_RGB ) { -/* RGB:565 mode */ - var->red.offset =11 ; +/* RGB:5X5 mode */ + var->red.offset = var->green.length +5 ; var->blue.offset =0 ; }else { -/* BGR:565 mode */ +/* BGR:5X5 mode */ var->red.offset =0 ; - var->blue.offset =11 ; + var->blue.offset = var->green.length +5 ; } var->green.offset =5 ; - var->green.length =6 ; var->red.length = var->blue.length =5 ;break ;case 32 :
@@ -679,8 +684,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red,case FB_VISUAL_PSEUDOCOLOR :if (regno <256 ) { -if (cpu_is_at91sam9261 () ||cpu_is_at91sam9263 () - ||cpu_is_at91sam9rl ()) { +if (sinfo->have_intensity_bit) {/* old style I+BGR:555 */ val = ((red >>11 ) &0x001f ); val |= ((green >>6 ) &0x03e0 );
@@ -870,6 +874,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) } sinfo->info = info; sinfo->pdev = pdev; +if (cpu_is_at91sam9261 () ||cpu_is_at91sam9263 () || +cpu_is_at91sam9rl ()) { + sinfo->have_intensity_bit = true; + }strcpy (info->fix.id, sinfo->pdev->name); info->flags =ATMEL_LCDFB_FBINFO_DEFAULT ;
include/video/atmel_lcdc.h +1 -0
@@ -62,6 +62,7 @@ struct atmel_lcdfb_info {void (*atmel_lcdfb_power_control)(int on);struct fb_monspecs *default_monspecs;u32 pseudo_palette[16 ]; +bool have_intensity_bit; };#define ATMEL_LCDC_DMABADDR1 0x00
Signature · 1 line
1.8.0
PATCH 1/3 atmel_lcdfb: fix 16-bpp modes on older SOCs
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Johan" == Johan Hovold <[email protected]> writes:
Johan> Fix regression introduced by commit 787f9fd23283 ("atmel_lcdfb: support Johan> 16bit BGR:565 mode, remove unsupported 15bit modes") which broke 16-bpp Johan> modes for older SOCs which use IBGR:555 (msb is intensity) rather Johan> than BGR:565.
Johan> Use SOC-type to determine the pixel layout.
Johan> Tested on custom at91sam9263-board.
Signature · 1 line
Bye, Peter Korsgaard
PATCH 1/3 atmel_lcdfb: fix 16-bpp modes on older SOCs
In reply to Johan HovoldQuoted 59 lines · Johan Hovold
Fix regression introduced by commit
787f9fd23283("atmel_lcdfb: support 16bit BGR:565 mode, remove unsupported 15bit modes") which broke 16-bpp modes for older SOCs which use IBGR:555 (msb is intensity) rather than BGR:565.Use SOC-type to determine the pixel layout.
Tested on custom at91sam9263-board.
Cc <[email protected]>Signed-off-by Johan Hovold <[email protected]>--- drivers/video/atmel_lcdfb.c | 22 +++++++++++++++------- include/video/atmel_lcdc.h | 1 + 2 files changed, 16 insertions(+), 7 deletions(-)drivers/video/atmel_lcdfb.c +11
-7@@ -422,17 +422,22 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var, = var->bits_per_pixel;break ;case 16 : +/* Older SOCs use IBGR:555 rather than BGR:565. */ +if (sinfo->have_intensity_bit) + var->green.length =5 ; +else + var->green.length =6 ; +if (sinfo->lcd_wiring_mode ==ATMEL_LCDC_WIRING_RGB ) { -/* RGB:565 mode */ - var->red.offset =11 ; +/* RGB:5X5 mode */ + var->red.offset = var->green.length +5 ; var->blue.offset =0 ; }else { -/* BGR:565 mode */ +/* BGR:5X5 mode */ var->red.offset =0 ; - var->blue.offset =11 ; + var->blue.offset = var->green.length +5 ; } var->green.offset =5 ; - var->green.length =6 ; var->red.length = var->blue.length =5 ;break ;case 32 :@@ -679,8 +684,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red,case FB_VISUAL_PSEUDOCOLOR :if (regno <256 ) { -if (cpu_is_at91sam9261 () ||cpu_is_at91sam9263 () - ||cpu_is_at91sam9rl ()) { +if (sinfo->have_intensity_bit) {/* old style I+BGR:555 */ val = ((red >>11 ) &0x001f ); val |= ((green >>6 ) &0x03e0 );
drivers/video/atmel_lcdfb.c static int __init atmel_lcdfb_probe(struct platform_device *pdev) · line 880
Quoted 7 lines
drivers/video/atmel_lcdfb.c +4
-0@@ -870,6 +874,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) } sinfo->info = info; sinfo->pdev = pdev; +if (cpu_is_at91sam9261 () ||cpu_is_at91sam9263 () || +cpu_is_at91sam9rl ()) { + sinfo->have_intensity_bit = true; + }
nack
you need to drop the cpu_is as this can only be use now for the core
use platform_device_id to indetify the IP as done on at91-i2c as we can not detect the IP version
Best Regards,
J.
Quoted 18 lines
drivers/video/atmel_lcdfb.c +0
-0strcpy (info->fix.id, sinfo->pdev->name); info->flags =ATMEL_LCDFB_FBINFO_DEFAULT ;include/video/atmel_lcdc.h +1
-0@@ -62,6 +62,7 @@ struct atmel_lcdfb_info {void (*atmel_lcdfb_power_control)(int on);struct fb_monspecs *default_monspecs;u32 pseudo_palette[16 ]; +bool have_intensity_bit; };#define ATMEL_LCDC_DMABADDR1 0x00Signature · 1 line
1.8.0
PATCH 1/3 atmel_lcdfb: fix 16-bpp modes on older SOCs
Quoted 69 lines · Jean-Christophe PLAGNIOL-VILLARD
Quoted 59 lines · Johan Hovold
Fix regression introduced by commit
787f9fd23283("atmel_lcdfb: support 16bit BGR:565 mode, remove unsupported 15bit modes") which broke 16-bpp modes for older SOCs which use IBGR:555 (msb is intensity) rather than BGR:565.Use SOC-type to determine the pixel layout.
Tested on custom at91sam9263-board.
Cc <[email protected]>Signed-off-by Johan Hovold <[email protected]>--- drivers/video/atmel_lcdfb.c | 22 +++++++++++++++------- include/video/atmel_lcdc.h | 1 + 2 files changed, 16 insertions(+), 7 deletions(-)drivers/video/atmel_lcdfb.c +11
-7@@ -422,17 +422,22 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var, = var->bits_per_pixel;break ;case 16 : +/* Older SOCs use IBGR:555 rather than BGR:565. */ +if (sinfo->have_intensity_bit) + var->green.length =5 ; +else + var->green.length =6 ; +if (sinfo->lcd_wiring_mode ==ATMEL_LCDC_WIRING_RGB ) { -/* RGB:565 mode */ - var->red.offset =11 ; +/* RGB:5X5 mode */ + var->red.offset = var->green.length +5 ; var->blue.offset =0 ; }else { -/* BGR:565 mode */ +/* BGR:5X5 mode */ var->red.offset =0 ; - var->blue.offset =11 ; + var->blue.offset = var->green.length +5 ; } var->green.offset =5 ; - var->green.length =6 ; var->red.length = var->blue.length =5 ;break ;case 32 :@@ -679,8 +684,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red,case FB_VISUAL_PSEUDOCOLOR :if (regno <256 ) { -if (cpu_is_at91sam9261 () ||cpu_is_at91sam9263 () - ||cpu_is_at91sam9rl ()) { +if (sinfo->have_intensity_bit) {/* old style I+BGR:555 */ val = ((red >>11 ) &0x001f ); val |= ((green >>6 ) &0x03e0 );drivers/video/atmel_lcdfb.c static int __init atmel_lcdfb_probe(struct platform_device *pdev) · line 880
Quoted 7 lines
drivers/video/atmel_lcdfb.c +4
-0@@ -870,6 +874,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) } sinfo->info = info; sinfo->pdev = pdev; +if (cpu_is_at91sam9261 () ||cpu_is_at91sam9263 () || +cpu_is_at91sam9rl ()) { + sinfo->have_intensity_bit = true; + }nack
Quoted 4 lines
you need to drop the
cpu_isas this can only be use now for the coreuse
platform_device_idto indetify the IP as done on at91-i2c as we can not detect the IP version
If this was a new feature and not a regression, fix I'd fully agree. There are however currently four places in atmel_lcdfb where cpu_is macros are used, and my patch only refactors one of them.
I can submit a follow up patch which add platform_device_id support, but such a patch will be quite invasive and thus not 3.8-rc or stable material.
How about accepting this patch as it is, considering that it fixes an obvious regression and also facilitate the move to platform_device_id by introducing the intensity-bit flag?
Thanks,
Johan
cover atmel_lcdfb: regression fixes and cpu_is removal
In reply to Jean-Christophe PLAGNIOL-VILLARDThe first three patches are resends of two regression fixes and one clean up posted in December (with previous acked-bys included). The regression fixes are kept minimal and are tagged for stable.
The last two patches replace all uses of cpu_is macros in atmel_lcdfb with a platform-device-id table and static configurations.
Thanks,
Johan
Johan Hovold (5):
atmel_lcdfb: fix 16-bpp modes on older SOCs
ARM: at91/neocore926: fix LCD-wiring mode
atmel_lcdfb: remove unsupported 15-bpp mode
atmel_lcdfb: move lcdcon2 register access to compute_hozval
ARM: at91/avr32/atmel_lcdfb: replace cpu_is macros with device-id
table
arch/arm/mach-at91/at91sam9261_devices.c | 6 +- arch/arm/mach-at91/at91sam9263_devices.c | 2 +- arch/arm/mach-at91/at91sam9g45_devices.c | 6 +- arch/arm/mach-at91/at91sam9rl_devices.c | 2 +- arch/arm/mach-at91/board-neocore926.c | 2 +- arch/avr32/mach-at32ap/at32ap700x.c | 2 + drivers/video/atmel_lcdfb.c | 115 ++++++++++++++++++++++++++----- include/video/atmel_lcdc.h | 4 +- 8 files changed, 116 insertions(+), 23 deletions(-)
Signature · 1 line
1.8.1.1
PATCH 1/5 atmel_lcdfb: fix 16-bpp modes on older SOCs
Fix regression introduced by commit 787f9fd23283 ("atmel_lcdfb: support 16bit BGR:565 mode, remove unsupported 15bit modes") which broke 16-bpp modes for older SOCs which use IBGR:555 (msb is intensity) rather than BGR:565.
Use SOC-type to determine the pixel layout.
Tested on at91sam9263 and at91sam9g45.
--- drivers/video/atmel_lcdfb.c | 22 +++++++++++++++------- include/video/atmel_lcdc.h | 1 + 2 files changed, 16 insertions(+), 7 deletions(-)
drivers/video/atmel_lcdfb.c +15 -7
@@ -422,17 +422,22 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var, = var->bits_per_pixel;break ;case 16 : +/* Older SOCs use IBGR:555 rather than BGR:565. */ +if (sinfo->have_intensity_bit) + var->green.length =5 ; +else + var->green.length =6 ; +if (sinfo->lcd_wiring_mode ==ATMEL_LCDC_WIRING_RGB ) { -/* RGB:565 mode */ - var->red.offset =11 ; +/* RGB:5X5 mode */ + var->red.offset = var->green.length +5 ; var->blue.offset =0 ; }else { -/* BGR:565 mode */ +/* BGR:5X5 mode */ var->red.offset =0 ; - var->blue.offset =11 ; + var->blue.offset = var->green.length +5 ; } var->green.offset =5 ; - var->green.length =6 ; var->red.length = var->blue.length =5 ;break ;case 32 :
@@ -679,8 +684,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red,case FB_VISUAL_PSEUDOCOLOR :if (regno <256 ) { -if (cpu_is_at91sam9261 () ||cpu_is_at91sam9263 () - ||cpu_is_at91sam9rl ()) { +if (sinfo->have_intensity_bit) {/* old style I+BGR:555 */ val = ((red >>11 ) &0x001f ); val |= ((green >>6 ) &0x03e0 );
@@ -870,6 +874,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) } sinfo->info = info; sinfo->pdev = pdev; +if (cpu_is_at91sam9261 () ||cpu_is_at91sam9263 () || +cpu_is_at91sam9rl ()) { + sinfo->have_intensity_bit = true; + }strcpy (info->fix.id, sinfo->pdev->name); info->flags =ATMEL_LCDFB_FBINFO_DEFAULT ;
include/video/atmel_lcdc.h +1 -0
@@ -62,6 +62,7 @@ struct atmel_lcdfb_info {void (*atmel_lcdfb_power_control)(int on);struct fb_monspecs *default_monspecs;u32 pseudo_palette[16 ]; +bool have_intensity_bit; };#define ATMEL_LCDC_DMABADDR1 0x00
Signature · 1 line
1.8.1.1
PATCH 2/5 ARM: at91/neocore926: fix LCD-wiring mode
In reply to Johan HovoldFix regression introduced by commit 787f9fd23283 ("atmel_lcdfb: support 16bit BGR:565 mode, remove unsupported 15bit modes") which broke 16-bpp modes for older SOCs which use IBGR:555 (msb is intensity) rather than BGR:565.
The above commit also removed the RGB:555-wiring hack without fixing the neocore926 board which used it. Fix by specifying RGB-wiring and let the driver handle the final SOC-dependant layout.
Remove the no longer used ATMEL_LCDC_WIRING_RGB555 define.
Compile-only tested.
--- arch/arm/mach-at91/board-neocore926.c | 2 +- include/video/atmel_lcdc.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-)
arch/arm/mach-at91/board-neocore926.c +1 -1
@@ -266,7 +266,7 @@ static struct atmel_lcdfb_info __initdata neocore926_lcdc_data = { .default_monspecs = &at91fb_default_monspecs, .atmel_lcdfb_power_control = at91_lcdc_power_control, .guard_time = 1, - .lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB555, + .lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB, };#else
include/video/atmel_lcdc.h +0 -1
@@ -30,7 +30,6 @@*/ #define ATMEL_LCDC_WIRING_BGR 0#define ATMEL_LCDC_WIRING_RGB 1 -#define ATMEL_LCDC_WIRING_RGB555 2/* LCD Controller info data structure, stored in device platform_data */
Signature · 1 line
1.8.1.1
PATCH 3/5 atmel_lcdfb: remove unsupported 15-bpp mode
In reply to Johan HovoldSince commit 787f9fd23283 ("atmel_lcdfb: support 16bit BGR:565 mode, remove unsupported 15bit modes") atmel_lcdfb_check_var does not accept 15-bpp mode so remove it from atmel_lcdfb_set_par as well.
--- drivers/video/atmel_lcdfb.c | 1 - 1 file changed, 1 deletion(-)
drivers/video/atmel_lcdfb.c +0 -1
@@ -567,7 +567,6 @@ static int atmel_lcdfb_set_par(struct fb_info *info)case 2 : value |=ATMEL_LCDC_PIXELSIZE_2 ;break ;case 4 : value |=ATMEL_LCDC_PIXELSIZE_4 ;break ;case 8 : value |=ATMEL_LCDC_PIXELSIZE_8 ;break ; -case 15 :/* fall through */ case 16 : value |=ATMEL_LCDC_PIXELSIZE_16 ;break ;case 24 : value |=ATMEL_LCDC_PIXELSIZE_24 ;break ;case 32 : value |=ATMEL_LCDC_PIXELSIZE_32 ;break ;
Signature · 1 line
1.8.1.1
PATCH 4/5 atmel_lcdfb: move lcdcon2 register access to compute_hozval
In reply to Johan HovoldPass atmel_lcd_info structure to compute_hozval and only do the register access on SOCs that actually use it.
This will also simplify the removal of the cpu_is macros.
--- drivers/video/atmel_lcdfb.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/video/atmel_lcdfb.c +5 -3
@@ -193,14 +193,17 @@ static struct fb_fix_screeninfo atmel_lcdfb_fix __initdata = { .accel = FB_ACCEL_NONE, }; -static unsigned long compute_hozval (unsigned long xres,unsigned long lcdcon2) +static unsigned long compute_hozval (struct atmel_lcdfb_info *sinfo, +unsigned long xres) { +unsigned long lcdcon2;unsigned long value;if (!(cpu_is_at91sam9261 () ||cpu_is_at91sam9g10 () ||cpu_is_at32ap7000 ()))return xres; + lcdcon2 =lcdc_readl (sinfo,ATMEL_LCDC_LCDCON2 ); value = xres;if ((lcdcon2 &ATMEL_LCDC_DISTYPE ) !=ATMEL_LCDC_DISTYPE_TFT ) {/* STN display */
@@ -590,8 +593,7 @@ static int atmel_lcdfb_set_par(struct fb_info *info)lcdc_writel (sinfo,ATMEL_LCDC_TIM2 , value);/* Horizontal value (aka line size) */ - hozval_linesz =compute_hozval (info->var.xres, -lcdc_readl (sinfo,ATMEL_LCDC_LCDCON2 )); + hozval_linesz =compute_hozval (sinfo, info->var.xres);/* Display size */ value = (hozval_linesz -1 ) <<ATMEL_LCDC_HOZVAL_OFFSET ;
Signature · 1 line
1.8.1.1
PATCH 5/5 ARM: at91/avr32/atmel_lcdfb: replace cpu_is macros with device-id table
In reply to Johan HovoldRemove cpu_is macros from atmel lcdfb driver and use platform-device-id table to determine platform configuration parameters.
The currently used configuration parameters are:
have_alt_pixclock
- SOC uses an alternate pixel-clock calculation formula (at91sam9g45 non-ES)
have_bus_clk
- SOC has bus clock hck1 (at91sam9261, at921sam9g10 and at32ap)
have_hozval
- SOC has a HOZVAL field in LCDFRMCFG which is used to determine the linesize for STN displays (at91sam9261, at921sam9g10 and at32ap)
have_intensity_bit
- SOC uses IBGR:555 rather than BGR:565 16-bit pixel layout (at91sam9261, at91sam9263 and at91sam9rl)
Tested on at91sam9g45, compile-tested for other AT91 SOCs, and untested for AVR32.
--- arch/arm/mach-at91/at91sam9261_devices.c | 6 +- arch/arm/mach-at91/at91sam9263_devices.c | 2 +- arch/arm/mach-at91/at91sam9g45_devices.c | 6 +- arch/arm/mach-at91/at91sam9rl_devices.c | 2 +- arch/avr32/mach-at32ap/at32ap700x.c | 2 + drivers/video/atmel_lcdfb.c | 96 ++++++++++++++++++++++++++++---- include/video/atmel_lcdc.h | 4 +- 7 files changed, 101 insertions(+), 17 deletions(-)
arch/arm/mach-at91/at91sam9261_devices.c +5 -1
@@ -488,7 +488,6 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,
@@ -505,6 +504,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)return ; } +if (cpu_is_at91sam9g10 ()) + at91_lcdc_device.name ="fb-at91sam9g10" ; +else + at91_lcdc_device.name ="fb-at91sam9261" ; +#if defined(CONFIG_FB_ATMEL_STN )at91_set_A_periph (AT91_PIN_PB0 ,0 );/* LCDVSYNC */ at91_set_A_periph (AT91_PIN_PB1 ,0 );/* LCDHSYNC */
arch/arm/mach-at91/at91sam9263_devices.c +1 -1
@@ -848,7 +848,7 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , + .name ="fb-at91sam9263" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,
arch/arm/mach-at91/at91sam9g45_devices.c +5 -1
@@ -981,7 +981,6 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,
@@ -997,6 +996,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)if (!data)return ; +if (cpu_is_at91sam9g45es ()) + at91_lcdc_device.name ="fb-at91sam9g45es" ; +else + at91_lcdc_device.name ="fb-at91sam9g45" ; +at91_set_A_periph (AT91_PIN_PE0 ,0 );/* LCDDPWR */ at91_set_A_periph (AT91_PIN_PE2 ,0 );/* LCDCC */
arch/arm/mach-at91/at91sam9rl_devices.c +1 -1
@@ -514,7 +514,7 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , + .name ="fb-at91sam9rl" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,
arch/avr32/mach-at32ap/at32ap700x.c +2 -0
@@ -1530,6 +1530,8 @@ at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data,memcpy (info, data,sizeof (struct atmel_lcdfb_info )); info->default_monspecs = monspecs; + pdev->name ="fb-at32ap" ; +platform_device_register (pdev);return pdev;
drivers/video/atmel_lcdfb.c +84 -12
144 lines not on this page · raw message
include/video/atmel_lcdc.h +3 -1
@@ -31,6 +31,7 @@#define ATMEL_LCDC_WIRING_BGR 0#define ATMEL_LCDC_WIRING_RGB 1 +struct atmel_lcdfb_config ;/* LCD Controller info data structure, stored in device platform_data */ struct atmel_lcdfb_info {
@@ -61,7 +62,8 @@ struct atmel_lcdfb_info {void (*atmel_lcdfb_power_control)(int on);struct fb_monspecs *default_monspecs;u32 pseudo_palette[16 ]; -bool have_intensity_bit; + +struct atmel_lcdfb_config *config; };#define ATMEL_LCDC_DMABADDR1 0x00
Signature · 1 line
1.8.1.1
PATCH 5/5 ARM: at91/avr32/atmel_lcdfb: replace cpu_is macros with device-id table
Quoted 11 lines · Johan Hovold
Remove
cpu_ismacros from atmel lcdfb driver and use platform-device-id table to determine platform configuration parameters.The currently used configuration parameters are:
have_alt_pixclock
- SOC uses an alternate pixel-clock calculation formula (at91sam9g45 non-ES)
have_bus_clk
- SOC has bus clock hck1 (at91sam9261, at921sam9g10 and at32ap)
no provide a clkdev a we do for macb
Quoted 36 lines
have_hozval
- SOC has a HOZVAL field in LCDFRMCFG which is used to determine the linesize for STN displays (at91sam9261, at921sam9g10 and at32ap)
have_intensity_bit
- SOC uses IBGR:555 rather than BGR:565 16-bit pixel layout (at91sam9261, at91sam9263 and at91sam9rl)Tested on at91sam9g45, compile-tested for other AT91 SOCs, and untested for AVR32.
Signed-off-by Johan Hovold <[email protected]>--- arch/arm/mach-at91/at91sam9261_devices.c | 6 +- arch/arm/mach-at91/at91sam9263_devices.c | 2 +- arch/arm/mach-at91/at91sam9g45_devices.c | 6 +- arch/arm/mach-at91/at91sam9rl_devices.c | 2 +- arch/avr32/mach-at32ap/at32ap700x.c | 2 + drivers/video/atmel_lcdfb.c | 96 ++++++++++++++++++++++++++++---- include/video/atmel_lcdc.h | 4 +- 7 files changed, 101 insertions(+), 17 deletions(-)arch/arm/mach-at91/at91sam9261_devices.c +0
-1@@ -488,7 +488,6 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,
arch/arm/mach-at91/at91sam9261_devices.c void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) · line 508
Quoted 5 lines
arch/arm/mach-at91/at91sam9261_devices.c +2
-0@@ -505,6 +504,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)return ; } +if (cpu_is_at91sam9g10 ()) + at91_lcdc_device.name ="fb-at91sam9g10" ;
use this
at91sam9g10-lcdfb
as we will use for dt
Quoted 250 lines
arch/arm/mach-at91/at91sam9261_devices.c +3
-0+else + at91_lcdc_device.name ="fb-at91sam9261" ; +#if defined(CONFIG_FB_ATMEL_STN )at91_set_A_periph (AT91_PIN_PB0 ,0 );/* LCDVSYNC */ at91_set_A_periph (AT91_PIN_PB1 ,0 );/* LCDHSYNC */ arch/arm/mach-at91/at91sam9263_devices.c +1
-1@@ -848,7 +848,7 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , + .name ="fb-at91sam9263" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,arch/arm/mach-at91/at91sam9g45_devices.c +5
-1@@ -981,7 +981,6 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,@@ -997,6 +996,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)if (!data)return ; +if (cpu_is_at91sam9g45es ()) + at91_lcdc_device.name ="fb-at91sam9g45es" ; +else + at91_lcdc_device.name ="fb-at91sam9g45" ; +at91_set_A_periph (AT91_PIN_PE0 ,0 );/* LCDDPWR */ at91_set_A_periph (AT91_PIN_PE2 ,0 );/* LCDCC */ arch/arm/mach-at91/at91sam9rl_devices.c +1
-1@@ -514,7 +514,7 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , + .name ="fb-at91sam9rl" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,arch/avr32/mach-at32ap/at32ap700x.c +2
-0@@ -1530,6 +1530,8 @@ at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data,memcpy (info, data,sizeof (struct atmel_lcdfb_info )); info->default_monspecs = monspecs; + pdev->name ="fb-at32ap" ; +platform_device_register (pdev);return pdev;drivers/video/atmel_lcdfb.c +84
-12@@ -34,6 +34,81 @@#define ATMEL_LCDC_DMA_BURST_LEN 8/* words */ #define ATMEL_LCDC_FIFO_SIZE 512/* words */ +struct atmel_lcdfb_config { +bool have_alt_pixclock; +bool have_bus_clk; +bool have_hozval; +bool have_intensity_bit; +}; + +static struct atmel_lcdfb_config at91sam9261_config = { + .have_bus_clk = true, + .have_intensity_bit = true, + .have_hozval = true, +}; + +static struct atmel_lcdfb_config at91sam9263_config = { + .have_intensity_bit = true, +}; + +static struct atmel_lcdfb_config at91sam9g10_config = { + .have_bus_clk = true, + .have_hozval = true, +}; + +static struct atmel_lcdfb_config at91sam9g45_config = { + .have_alt_pixclock = true, +}; + +static struct atmel_lcdfb_config at91sam9g45es_config = { +}; + +static struct atmel_lcdfb_config at91sam9rl_config = { + .have_intensity_bit = true, +}; + +static struct atmel_lcdfb_config at32ap_config = { + .have_bus_clk = true, + .have_hozval = true, +}; + +static const struct platform_device_id atmel_lcdfb_devtypes[] = { + { + .name ="fb-at91sam9261" , + .driver_data = (unsigned long )&at91sam9261_config, + }, { + .name ="fb-at91sam9263" , + .driver_data = (unsigned long )&at91sam9263_config, + }, { + .name ="fb-at91sam9g10" , + .driver_data = (unsigned long )&at91sam9g10_config, + }, { + .name ="fb-at91sam9g45" , + .driver_data = (unsigned long )&at91sam9g45_config, + }, { + .name ="fb-at91sam9g45es" , + .driver_data = (unsigned long )&at91sam9g45es_config, + }, { + .name ="fb-at91sam9rl" , + .driver_data = (unsigned long )&at91sam9rl_config, + }, { + .name ="fb-at32ap" , + .driver_data = (unsigned long )&at32ap_config, + }, { +/* terminator */ + } +}; + +static struct atmel_lcdfb_config * +atmel_lcdfb_get_config (struct platform_device *pdev) +{ +unsigned long data; + + data =platform_get_device_id (pdev)->driver_data; + +return (struct atmel_lcdfb_config *)data; +} +#if defined(CONFIG_ARCH_AT91 )#define ATMEL_LCDFB_FBINFO_DEFAULT (FBINFO_DEFAULT \ | FBINFO_PARTIAL_PAN_OK \@@ -199,8 +274,7 @@ static unsigned long compute_hozval(struct atmel_lcdfb_info *sinfo,unsigned long lcdcon2;unsigned long value; -if (!(cpu_is_at91sam9261 () ||cpu_is_at91sam9g10 () - ||cpu_is_at32ap7000 ())) +if (!sinfo->config->have_hozval)return xres; lcdcon2 =lcdc_readl (sinfo,ATMEL_LCDC_LCDCON2 );@@ -426,7 +500,7 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,break ;case 16 :/* Older SOCs use IBGR:555 rather than BGR:565. */ -if (sinfo->have_intensity_bit) +if (sinfo->config->have_intensity_bit) var->green.length =5 ;else var->green.length =6 ;@@ -534,7 +608,7 @@ static int atmel_lcdfb_set_par(struct fb_info *info)/* Now, the LCDC core... */ /* Set pixel clock */ -if (cpu_is_at91sam9g45 () && !cpu_is_at91sam9g45es ()) +if (sinfo->config->have_alt_pixclock) pix_factor =1 ; clk_value_khz =clk_get_rate (sinfo->lcdc_clk) /1000 ;@@ -685,7 +759,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red,case FB_VISUAL_PSEUDOCOLOR :if (regno <256 ) { -if (sinfo->have_intensity_bit) { +if (sinfo->config->have_intensity_bit) {/* old style I+BGR:555 */ val = ((red >>11 ) &0x001f ); val |= ((green >>6 ) &0x03e0 );@@ -875,10 +949,9 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) } sinfo->info = info; sinfo->pdev = pdev; -if (cpu_is_at91sam9261 () ||cpu_is_at91sam9263 () || -cpu_is_at91sam9rl ()) { - sinfo->have_intensity_bit = true; - } + sinfo->config =atmel_lcdfb_get_config (pdev); +if (!sinfo->config) + goto free_info;strcpy (info->fix.id, sinfo->pdev->name); info->flags =ATMEL_LCDFB_FBINFO_DEFAULT ;@@ -889,8 +962,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) info->fix = atmel_lcdfb_fix;/* Enable LCDC Clocks */ -if (cpu_is_at91sam9261 () ||cpu_is_at91sam9g10 () - ||cpu_is_at32ap7000 ()) { +if (sinfo->config->have_bus_clk) { sinfo->bus_clk =clk_get (dev,"hck1" );if (IS_ERR (sinfo->bus_clk)) { ret =PTR_ERR (sinfo->bus_clk);@@ -1152,7 +1224,7 @@ static struct platform_driver atmel_lcdfb_driver = { .remove = __exit_p(atmel_lcdfb_remove), .suspend = atmel_lcdfb_suspend, .resume = atmel_lcdfb_resume, - + .id_table = atmel_lcdfb_devtypes, .driver = { .name = "atmel_lcdfb", .owner = THIS_MODULE,include/video/atmel_lcdc.h +3
-1@@ -31,6 +31,7 @@#define ATMEL_LCDC_WIRING_BGR 0#define ATMEL_LCDC_WIRING_RGB 1 +struct atmel_lcdfb_config ;/* LCD Controller info data structure, stored in device platform_data */ struct atmel_lcdfb_info {@@ -61,7 +62,8 @@ struct atmel_lcdfb_info {void (*atmel_lcdfb_power_control)(int on);struct fb_monspecs *default_monspecs;u32 pseudo_palette[16 ]; -bool have_intensity_bit; + +struct atmel_lcdfb_config *config; };#define ATMEL_LCDC_DMABADDR1 0x00Signature · 1 line
1.8.1.1
v2 cover ARM: at91/avr32/atmel_lcdfb: remove cpu_is macros
Here's a v2 replacing the last two patches in the series (the first three are unchanged since the first post). If preferred, I can repost the whole series when these patches have been acked.
v2:
- use clkdev to handle the lcdc bus clock
- use -lcdfb suffix for device ids (e.g. "at91sam9g45-lcdfb")
Thanks,
Johan
Johan Hovold (3):
ARM: at91/avr32/atmel_lcdfb: add bus-clock entry
atmel_lcdfb: move lcdcon2 register access to compute_hozval
ARM: at91/avr32/atmel_lcdfb: add platform device-id table
arch/arm/mach-at91/at91sam9261.c | 2 + arch/arm/mach-at91/at91sam9261_devices.c | 6 +- arch/arm/mach-at91/at91sam9263.c | 1 + arch/arm/mach-at91/at91sam9263_devices.c | 2 +- arch/arm/mach-at91/at91sam9g45.c | 2 + arch/arm/mach-at91/at91sam9g45_devices.c | 6 +- arch/arm/mach-at91/at91sam9rl.c | 1 + arch/arm/mach-at91/at91sam9rl_devices.c | 2 +- arch/avr32/mach-at32ap/at32ap700x.c | 6 +- drivers/video/atmel_lcdfb.c | 120 +++++++++++++++++++++++-------- include/video/atmel_lcdc.h | 4 +- 11 files changed, 117 insertions(+), 35 deletions(-)
Signature · 1 line
1.8.1.1
PATCH v2 1/3 ARM: at91/avr32/atmel_lcdfb: add bus-clock entry
Add hclk entry for the atmel_lcdfb bus clock.
On at91sam9261, at91sam9g10 and at32ap the bus clock has to be enabled as well as the peripheral clock. Add the appropriate lookup entries to these SOCs and fake clocks to the SOCs that do not use it.
This allows us to get rid of the conditional enabling of the clocks in the driver which relied on the cpu_is macros.
Tested on at91sam9263 and at91sam9g45, compile-tested for other AT91-SOCs, and untested for AVR32.
--- arch/arm/mach-at91/at91sam9261.c | 1 + arch/arm/mach-at91/at91sam9263.c | 1 + arch/arm/mach-at91/at91sam9g45.c | 1 + arch/arm/mach-at91/at91sam9rl.c | 1 + arch/avr32/mach-at32ap/at32ap700x.c | 4 ++-- drivers/video/atmel_lcdfb.c | 23 ++++++++--------------- 6 files changed, 14 insertions(+), 17 deletions(-)
arch/arm/mach-at91/at91sam9261.c +1 -0
@@ -169,6 +169,7 @@ static struct clk *periph_clocks[] __initdata = { };static struct clk_lookup periph_clocks_lookups[] = { +CLKDEV_CON_DEV_ID ("hclk" ,"atmel_lcdfb.0" , &hck1),CLKDEV_CON_DEV_ID ("spi_clk" ,"atmel_spi.0" , &spi0_clk),CLKDEV_CON_DEV_ID ("spi_clk" ,"atmel_spi.1" , &spi1_clk),CLKDEV_CON_DEV_ID ("t0_clk" ,"atmel_tcb.0" , &tc0_clk),
arch/arm/mach-at91/at91sam9263.c +1 -0
@@ -190,6 +190,7 @@ static struct clk_lookup periph_clocks_lookups[] = {CLKDEV_CON_DEV_ID ("pclk" ,"at91rm9200_ssc.1" , &ssc1_clk),CLKDEV_CON_DEV_ID ("pclk" ,"fff98000.ssc" , &ssc0_clk),CLKDEV_CON_DEV_ID ("pclk" ,"fff9c000.ssc" , &ssc1_clk), +CLKDEV_CON_DEV_ID ("hclk" ,"atmel_lcdfb.0" , &lcdc_clk),CLKDEV_CON_DEV_ID ("mci_clk" ,"atmel_mci.0" , &mmc0_clk),CLKDEV_CON_DEV_ID ("mci_clk" ,"atmel_mci.1" , &mmc1_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
arch/arm/mach-at91/at91sam9g45.c +1 -0
@@ -228,6 +228,7 @@ static struct clk_lookup periph_clocks_lookups[] = {CLKDEV_CON_ID ("hclk" , &macb_clk),/* One additional fake clock for ohci */ CLKDEV_CON_ID ("ohci_clk" , &uhphs_clk), +CLKDEV_CON_DEV_ID ("hclk" ,"atmel_lcdfb.0" , &lcdc_clk),CLKDEV_CON_DEV_ID ("ehci_clk" ,"atmel-ehci" , &uhphs_clk),CLKDEV_CON_DEV_ID ("hclk" ,"atmel_usba_udc" , &utmi_clk), CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),
arch/arm/mach-at91/at91sam9rl.c +1 -0
@@ -179,6 +179,7 @@ static struct clk *periph_clocks[] __initdata = { };static struct clk_lookup periph_clocks_lookups[] = { +CLKDEV_CON_DEV_ID ("hclk" ,"atmel_lcdfb.0" , &lcdc_clk),CLKDEV_CON_DEV_ID ("hclk" ,"atmel_usba_udc" , &utmi_clk),CLKDEV_CON_DEV_ID ("pclk" ,"atmel_usba_udc" , &udphs_clk),CLKDEV_CON_DEV_ID ("t0_clk" ,"atmel_tcb.0" , &tc0_clk),
arch/avr32/mach-at32ap/at32ap700x.c +2 -2
@@ -1453,7 +1453,7 @@ static struct resource atmel_lcdfb0_resource[] = { }, };DEFINE_DEV_DATA (atmel_lcdfb,0 ); -DEV_CLK (hck1, atmel_lcdfb0, hsb,7 ); +DEV_CLK (hclk, atmel_lcdfb0, hsb,7 );static struct clk atmel_lcdfb0_pixclk = { .name ="lcdc_clk" , .dev = &atmel_lcdfb0_device.dev,
@@ -2246,7 +2246,7 @@ static __initdata struct clk *init_clocks[] = { &atmel_twi0_pclk, &atmel_mci0_pclk,#if defined(CONFIG_CPU_AT32AP7000 ) || defined(CONFIG_CPU_AT32AP7002 ) - &atmel_lcdfb0_hck1, + &atmel_lcdfb0_hclk, &atmel_lcdfb0_pixclk, #endif &ssc0_pclk,
drivers/video/atmel_lcdfb.c +8 -15
@@ -820,15 +820,13 @@ static int __init atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)static void atmel_lcdfb_start_clock (struct atmel_lcdfb_info *sinfo) { -if (sinfo->bus_clk) -clk_enable (sinfo->bus_clk); +clk_enable (sinfo->bus_clk);clk_enable (sinfo->lcdc_clk); }static void atmel_lcdfb_stop_clock (struct atmel_lcdfb_info *sinfo) { -if (sinfo->bus_clk) -clk_disable (sinfo->bus_clk); +clk_disable (sinfo->bus_clk);clk_disable (sinfo->lcdc_clk); }
@@ -887,13 +885,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) info->fix = atmel_lcdfb_fix;/* Enable LCDC Clocks */ -if (cpu_is_at91sam9261 () ||cpu_is_at91sam9g10 () - ||cpu_is_at32ap7000 ()) { - sinfo->bus_clk =clk_get (dev,"hck1" ); -if (IS_ERR (sinfo->bus_clk)) { - ret =PTR_ERR (sinfo->bus_clk); - goto free_info; - } + sinfo->bus_clk =clk_get (dev,"hclk" ); +if (IS_ERR (sinfo->bus_clk)) { + ret =PTR_ERR (sinfo->bus_clk); + goto free_info; } sinfo->lcdc_clk =clk_get (dev,"lcdc_clk" );if (IS_ERR (sinfo->lcdc_clk)) {
@@ -1054,8 +1049,7 @@ stop_clk:atmel_lcdfb_stop_clock (sinfo);clk_put (sinfo->lcdc_clk); put_bus_clk: -if (sinfo->bus_clk) -clk_put (sinfo->bus_clk); +clk_put (sinfo->bus_clk); free_info:framebuffer_release (info); out:
@@ -1080,8 +1074,7 @@ static int __exit atmel_lcdfb_remove(struct platform_device *pdev)unregister_framebuffer (info);atmel_lcdfb_stop_clock (sinfo);clk_put (sinfo->lcdc_clk); -if (sinfo->bus_clk) -clk_put (sinfo->bus_clk); +clk_put (sinfo->bus_clk);fb_dealloc_cmap (&info->cmap);free_irq (sinfo->irq_base, info);iounmap (sinfo->mmio);
Signature · 1 line
1.8.1.1
PATCH v2 2/3 atmel_lcdfb: move lcdcon2 register access to compute_hozval
In reply to Johan HovoldPass atmel_lcd_info structure to compute_hozval and only do the register access on SOCs that actually use it.
This will also simplify the removal of the cpu_is macros.
--- drivers/video/atmel_lcdfb.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/video/atmel_lcdfb.c +5 -3
@@ -193,14 +193,17 @@ static struct fb_fix_screeninfo atmel_lcdfb_fix __initdata = { .accel = FB_ACCEL_NONE, }; -static unsigned long compute_hozval (unsigned long xres,unsigned long lcdcon2) +static unsigned long compute_hozval (struct atmel_lcdfb_info *sinfo, +unsigned long xres) { +unsigned long lcdcon2;unsigned long value;if (!(cpu_is_at91sam9261 () ||cpu_is_at91sam9g10 () ||cpu_is_at32ap7000 ()))return xres; + lcdcon2 =lcdc_readl (sinfo,ATMEL_LCDC_LCDCON2 ); value = xres;if ((lcdcon2 &ATMEL_LCDC_DISTYPE ) !=ATMEL_LCDC_DISTYPE_TFT ) {/* STN display */
@@ -590,8 +593,7 @@ static int atmel_lcdfb_set_par(struct fb_info *info)lcdc_writel (sinfo,ATMEL_LCDC_TIM2 , value);/* Horizontal value (aka line size) */ - hozval_linesz =compute_hozval (info->var.xres, -lcdc_readl (sinfo,ATMEL_LCDC_LCDCON2 )); + hozval_linesz =compute_hozval (sinfo, info->var.xres);/* Display size */ value = (hozval_linesz -1 ) <<ATMEL_LCDC_HOZVAL_OFFSET ;
Signature · 1 line
1.8.1.1
PATCH v2 3/3 ARM: at91/avr32/atmel_lcdfb: add platform device-id table
In reply to Johan HovoldAdd platform device-id table in order to identify the controller and determine its configuration.
The currently used configuration parameters are:
have_alt_pixclock
- SOC uses an alternate pixel-clock calculation formula (at91sam9g45 non-ES)
have_hozval
- SOC has a HOZVAL field in LCDFRMCFG which is used to determine the linesize for STN displays (at91sam9261, at921sam9g10 and at32ap)
have_intensity_bit
- SOC uses IBGR:555 rather than BGR:565 16-bit pixel layout (at91sam9261, at91sam9263 and at91sam9rl)
This allows us to remove all the remaining uses of cpu_is macros from the driver.
Tested on at91sam9263 and at91sam9g45, compile-tested for other AT91-SOCs, and untested for AVR32.
--- arch/arm/mach-at91/at91sam9261.c | 3 +- arch/arm/mach-at91/at91sam9261_devices.c | 6 ++- arch/arm/mach-at91/at91sam9263.c | 2 +- arch/arm/mach-at91/at91sam9263_devices.c | 2 +- arch/arm/mach-at91/at91sam9g45.c | 3 +- arch/arm/mach-at91/at91sam9g45_devices.c | 6 ++- arch/arm/mach-at91/at91sam9rl.c | 2 +- arch/arm/mach-at91/at91sam9rl_devices.c | 2 +- arch/avr32/mach-at32ap/at32ap700x.c | 2 + drivers/video/atmel_lcdfb.c | 89 ++++++++++++++++++++++++++++---- include/video/atmel_lcdc.h | 4 +- 11 files changed, 102 insertions(+), 19 deletions(-)
arch/arm/mach-at91/at91sam9261.c +2 -1
@@ -169,7 +169,8 @@ static struct clk *periph_clocks[] __initdata = { };static struct clk_lookup periph_clocks_lookups[] = { -CLKDEV_CON_DEV_ID ("hclk" ,"atmel_lcdfb.0" , &hck1), +CLKDEV_CON_DEV_ID ("hclk" ,"at91sam9261-lcdfb.0" , &hck1), +CLKDEV_CON_DEV_ID ("hclk" ,"at91sam9g10-lcdfb.0" , &hck1),CLKDEV_CON_DEV_ID ("spi_clk" ,"atmel_spi.0" , &spi0_clk),CLKDEV_CON_DEV_ID ("spi_clk" ,"atmel_spi.1" , &spi1_clk),CLKDEV_CON_DEV_ID ("t0_clk" ,"atmel_tcb.0" , &tc0_clk),
arch/arm/mach-at91/at91sam9261_devices.c +5 -1
@@ -488,7 +488,6 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,
@@ -505,6 +504,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)return ; } +if (cpu_is_at91sam9g10 ()) + at91_lcdc_device.name ="at91sam9g10-lcdfb" ; +else + at91_lcdc_device.name ="at91sam9261-lcdfb" ; +#if defined(CONFIG_FB_ATMEL_STN )at91_set_A_periph (AT91_PIN_PB0 ,0 );/* LCDVSYNC */ at91_set_A_periph (AT91_PIN_PB1 ,0 );/* LCDHSYNC */
arch/arm/mach-at91/at91sam9263.c +1 -1
@@ -190,7 +190,7 @@ static struct clk_lookup periph_clocks_lookups[] = {CLKDEV_CON_DEV_ID ("pclk" ,"at91rm9200_ssc.1" , &ssc1_clk),CLKDEV_CON_DEV_ID ("pclk" ,"fff98000.ssc" , &ssc0_clk),CLKDEV_CON_DEV_ID ("pclk" ,"fff9c000.ssc" , &ssc1_clk), -CLKDEV_CON_DEV_ID ("hclk" ,"atmel_lcdfb.0" , &lcdc_clk), +CLKDEV_CON_DEV_ID ("hclk" ,"at91sam9263-lcdfb.0" , &lcdc_clk),CLKDEV_CON_DEV_ID ("mci_clk" ,"atmel_mci.0" , &mmc0_clk),CLKDEV_CON_DEV_ID ("mci_clk" ,"atmel_mci.1" , &mmc1_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
arch/arm/mach-at91/at91sam9263_devices.c +1 -1
@@ -848,7 +848,7 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , + .name ="at91sam9263-lcdfb" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,
arch/arm/mach-at91/at91sam9g45.c +2 -1
@@ -228,7 +228,8 @@ static struct clk_lookup periph_clocks_lookups[] = {CLKDEV_CON_ID ("hclk" , &macb_clk),/* One additional fake clock for ohci */ CLKDEV_CON_ID ("ohci_clk" , &uhphs_clk), -CLKDEV_CON_DEV_ID ("hclk" ,"atmel_lcdfb.0" , &lcdc_clk), +CLKDEV_CON_DEV_ID ("hclk" ,"at91sam9g45-lcdfb.0" , &lcdc_clk), +CLKDEV_CON_DEV_ID ("hclk" ,"at91sam9g45es-lcdfb.0" , &lcdc_clk),CLKDEV_CON_DEV_ID ("ehci_clk" ,"atmel-ehci" , &uhphs_clk),CLKDEV_CON_DEV_ID ("hclk" ,"atmel_usba_udc" , &utmi_clk), CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),
arch/arm/mach-at91/at91sam9g45_devices.c +5 -1
@@ -981,7 +981,6 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,
@@ -997,6 +996,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)if (!data)return ; +if (cpu_is_at91sam9g45es ()) + at91_lcdc_device.name ="at91sam9g45es-lcdfb" ; +else + at91_lcdc_device.name ="at91sam9g45-lcdfb" ; +at91_set_A_periph (AT91_PIN_PE0 ,0 );/* LCDDPWR */ at91_set_A_periph (AT91_PIN_PE2 ,0 );/* LCDCC */
arch/arm/mach-at91/at91sam9rl.c +1 -1
@@ -179,7 +179,7 @@ static struct clk *periph_clocks[] __initdata = { };static struct clk_lookup periph_clocks_lookups[] = { -CLKDEV_CON_DEV_ID ("hclk" ,"atmel_lcdfb.0" , &lcdc_clk), +CLKDEV_CON_DEV_ID ("hclk" ,"at91sam9rl-lcdfb.0" , &lcdc_clk),CLKDEV_CON_DEV_ID ("hclk" ,"atmel_usba_udc" , &utmi_clk),CLKDEV_CON_DEV_ID ("pclk" ,"atmel_usba_udc" , &udphs_clk),CLKDEV_CON_DEV_ID ("t0_clk" ,"atmel_tcb.0" , &tc0_clk),
arch/arm/mach-at91/at91sam9rl_devices.c +1 -1
@@ -514,7 +514,7 @@ static struct resource lcdc_resources[] = { };static struct platform_device at91_lcdc_device = { - .name ="atmel_lcdfb" , + .name ="at91sam9rl-lcdfb" , .id =0 , .dev = { .dma_mask = &lcdc_dmamask,
arch/avr32/mach-at32ap/at32ap700x.c +2 -0
@@ -1530,6 +1530,8 @@ at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data,memcpy (info, data,sizeof (struct atmel_lcdfb_info )); info->default_monspecs = monspecs; + pdev->name ="at32ap-lcdfb" ; +platform_device_register (pdev);return pdev;
drivers/video/atmel_lcdfb.c +79 -10
131 lines not on this page · raw message
include/video/atmel_lcdc.h +3 -1
@@ -31,6 +31,7 @@#define ATMEL_LCDC_WIRING_BGR 0#define ATMEL_LCDC_WIRING_RGB 1 +struct atmel_lcdfb_config ;/* LCD Controller info data structure, stored in device platform_data */ struct atmel_lcdfb_info {
@@ -61,7 +62,8 @@ struct atmel_lcdfb_info {void (*atmel_lcdfb_power_control)(int on);struct fb_monspecs *default_monspecs;u32 pseudo_palette[16 ]; -bool have_intensity_bit; + +struct atmel_lcdfb_config *config; };#define ATMEL_LCDC_DMABADDR1 0x00
Signature · 1 line
1.8.1.1
PATCH 2/3 ARM: at91/neocore926: fix LCD-wiring mode
In reply to Johan HovoldFix regression introduced by commit 787f9fd23283 ("atmel_lcdfb: support 16bit BGR:565 mode, remove unsupported 15bit modes") which broke 16-bpp modes for older SOCs which use IBGR:555 (msb is intensity) rather than BGR:565.
The above commit also removed the RGB:555-wiring hack without fixing the neocore926 board which used it. Fix by specifying RGB-wiring and let the driver handle the final SOC-dependant layout.
Remove the no longer used ATMEL_LCDC_WIRING_RGB555 define.
Compile-only tested.
--- arch/arm/mach-at91/board-neocore926.c | 2 +- include/video/atmel_lcdc.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-)
arch/arm/mach-at91/board-neocore926.c +1 -1
@@ -265,7 +265,7 @@ static struct atmel_lcdfb_info __initdata neocore926_lcdc_data = { .default_monspecs = &at91fb_default_monspecs, .atmel_lcdfb_power_control = at91_lcdc_power_control, .guard_time = 1, - .lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB555, + .lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB, };#else
include/video/atmel_lcdc.h +0 -1
@@ -30,7 +30,6 @@*/ #define ATMEL_LCDC_WIRING_BGR 0#define ATMEL_LCDC_WIRING_RGB 1 -#define ATMEL_LCDC_WIRING_RGB555 2/* LCD Controller info data structure, stored in device platform_data */
Signature · 1 line
1.8.0
PATCH 2/3 ARM: at91/neocore926: fix LCD-wiring mode
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Johan" == Johan Hovold <[email protected]> writes:
Johan> Fix regression introduced by commit 787f9fd23283 ("atmel_lcdfb: support Johan> 16bit BGR:565 mode, remove unsupported 15bit modes") which broke 16-bpp Johan> modes for older SOCs which use IBGR:555 (msb is intensity) rather than Johan> BGR:565.
Johan> The above commit also removed the RGB:555-wiring hack without fixing the Johan> neocore926 board which used it. Fix by specifying RGB-wiring and let the Johan> driver handle the final SOC-dependant layout.
Johan> Remove the no longer used ATMEL_LCDC_WIRING_RGB555 define.
Signature · 1 line
Bye, Peter Korsgaard
PATCH 3/3 atmel_lcdfb: remove unsupported 15-bpp mode
In reply to Johan HovoldSince commit 787f9fd23283 ("atmel_lcdfb: support 16bit BGR:565 mode, remove unsupported 15bit modes") atmel_lcdfb_check_var does not accept 15-bpp mode so remove it from atmel_lcdfb_set_par as well.
--- drivers/video/atmel_lcdfb.c | 1 - 1 file changed, 1 deletion(-)
drivers/video/atmel_lcdfb.c +0 -1
@@ -567,7 +567,6 @@ static int atmel_lcdfb_set_par(struct fb_info *info)case 2 : value |=ATMEL_LCDC_PIXELSIZE_2 ;break ;case 4 : value |=ATMEL_LCDC_PIXELSIZE_4 ;break ;case 8 : value |=ATMEL_LCDC_PIXELSIZE_8 ;break ; -case 15 :/* fall through */ case 16 : value |=ATMEL_LCDC_PIXELSIZE_16 ;break ;case 24 : value |=ATMEL_LCDC_PIXELSIZE_24 ;break ;case 32 : value |=ATMEL_LCDC_PIXELSIZE_32 ;break ;
Signature · 1 line
1.8.0
PATCH 3/3 atmel_lcdfb: remove unsupported 15-bpp mode
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Johan" == Johan Hovold <[email protected]> writes:
Johan> Since commit 787f9fd23283 ("atmel_lcdfb: support 16bit BGR:565 mode, Johan> remove unsupported 15bit modes") atmel_lcdfb_check_var does not accept Johan> 15-bpp mode so remove it from atmel_lcdfb_set_par as well.
Signature · 1 line
Bye, Peter Korsgaard
cover atmel_lcdfb: fix 16-bpp regression
In reply to Johan HovoldQuoted 3 lines · Johan Hovold
These patches fix a regression in 16-bpp support for older SOCs which use IBGR:555 rather than BGR:565 pixel layout. Use SOC-type to determine if the controller uses the intensity-bit and restore the old layout in that case.
I understand the maintainer's been busy lately, but could someone pick these regression fixes up so we can get them into v3.8-rc and the stable trees?
Thanks,
Johan