* [PATCH v2 1/1] pxa168: added initial support for TPO TD043MTEA1 LCD display on Aspenite @ 2010-08-26 2:04 Mark F. Brown 2010-08-26 2:26 ` Marek Vasut 0 siblings, 1 reply; 6+ messages in thread From: Mark F. Brown @ 2010-08-26 2:04 UTC (permalink / raw) To: linux-arm-kernel Signed-off-by: Mark F. Brown <mark.brown314@gmail.com> --- arch/arm/mach-mmp/aspenite.c | 60 +++++++++++++++++++++++++++++++ arch/arm/mach-mmp/include/mach/pxa168.h | 8 ++++ arch/arm/mach-mmp/pxa168.c | 4 ++ drivers/video/pxa168fb.c | 4 +- 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c index 0629394..9e1bd6b 100644 --- a/arch/arm/mach-mmp/aspenite.c +++ b/arch/arm/mach-mmp/aspenite.c @@ -23,6 +23,7 @@ #include <mach/mfp-pxa168.h> #include <mach/pxa168.h> #include <mach/gpio.h> +#include <video/pxa168fb.h> #include "common.h" @@ -66,6 +67,36 @@ static unsigned long common_pin_config[] __initdata = { GPIO115_I2S_BCLK, GPIO116_I2S_RXD, GPIO117_I2S_TXD, + + /* LCD */ + GPIO56_LCD_FCLK_RD, + GPIO57_LCD_LCLK_A0, + GPIO58_LCD_PCLK_WR, + GPIO59_LCD_DENA_BIAS, + GPIO60_LCD_DD0, + GPIO61_LCD_DD1, + GPIO62_LCD_DD2, + GPIO63_LCD_DD3, + GPIO64_LCD_DD4, + GPIO65_LCD_DD5, + GPIO66_LCD_DD6, + GPIO67_LCD_DD7, + GPIO68_LCD_DD8, + GPIO69_LCD_DD9, + GPIO70_LCD_DD10, + GPIO71_LCD_DD11, + GPIO72_LCD_DD12, + GPIO73_LCD_DD13, + GPIO74_LCD_DD14, + GPIO75_LCD_DD15, + GPIO76_LCD_DD16, + GPIO77_LCD_DD17, + GPIO78_LCD_DD18, + GPIO79_LCD_DD19, + GPIO80_LCD_DD20, + GPIO81_LCD_DD21, + GPIO82_LCD_DD22, + GPIO83_LCD_DD23, }; static struct smc91x_platdata smc91x_info = { @@ -134,6 +165,34 @@ static struct i2c_board_info aspenite_i2c_info[] __initdata = { { I2C_BOARD_INFO("wm8753", 0x1b), }, }; +static struct fb_videomode video_modes[] = { + [0] = { + .pixclock = 30120, + .refresh = 60, + .xres = 800, + .yres = 480, + .hsync_len = 1, + .left_margin = 215, + .right_margin = 40, + .vsync_len = 1, + .upper_margin = 34, + .lower_margin = 10, + .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, + }, +}; + +struct pxa168fb_mach_info aspenite_lcd_info = { + .id = "Graphic Frame", + .modes = video_modes, + .num_modes = ARRAY_SIZE(video_modes), + .pix_fmt = PIX_FMT_RGB565, + .io_pin_allocation_mode = PIN_MODE_DUMB_24, + .dumb_mode = DUMB_MODE_RGB888, + .active = 1, + .panel_rbswap = 0, + .invert_pixclock = 0, +}; + static void __init common_init(void) { mfp_config(ARRAY_AND_SIZE(common_pin_config)); @@ -143,6 +202,7 @@ static void __init common_init(void) pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info)); pxa168_add_ssp(1); pxa168_add_nand(&aspenite_nand_info); + pxa168_add_fb(&aspenite_lcd_info); /* off-chip devices */ platform_device_register(&smc91x_device); diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h index 27e1bc7..220738f 100644 --- a/arch/arm/mach-mmp/include/mach/pxa168.h +++ b/arch/arm/mach-mmp/include/mach/pxa168.h @@ -10,6 +10,7 @@ extern void __init pxa168_init_irq(void); #include <mach/devices.h> #include <plat/i2c.h> #include <plat/pxa3xx_nand.h> +#include <video/pxa168fb.h> extern struct pxa_device_desc pxa168_device_uart1; extern struct pxa_device_desc pxa168_device_uart2; @@ -25,6 +26,7 @@ extern struct pxa_device_desc pxa168_device_ssp3; extern struct pxa_device_desc pxa168_device_ssp4; extern struct pxa_device_desc pxa168_device_ssp5; extern struct pxa_device_desc pxa168_device_nand; +extern struct pxa_device_desc pxa168_device_fb; static inline int pxa168_add_uart(int id) { @@ -97,4 +99,10 @@ static inline int pxa168_add_nand(struct pxa3xx_nand_platform_data *info) { return pxa_register_device(&pxa168_device_nand, info, sizeof(*info)); } + +static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi) +{ + return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi)); +} + #endif /* __ASM_MACH_PXA168_H */ diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c index 652ae66..886eadb 100644 --- a/arch/arm/mach-mmp/pxa168.c +++ b/arch/arm/mach-mmp/pxa168.c @@ -25,6 +25,7 @@ #include <mach/dma.h> #include <mach/devices.h> #include <mach/mfp.h> +#include <video/pxa168fb.h> #include "common.h" #include "clock.h" @@ -79,6 +80,7 @@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0); static APBC_CLK(ssp5, PXA168_SSP5, 4, 0); static APMU_CLK(nand, NAND, 0x01db, 208000000); +static APMU_CLK(lcd, LCD, 0x7f, 312000000); /* device and clock bindings */ static struct clk_lookup pxa168_clkregs[] = { @@ -96,6 +98,7 @@ static struct clk_lookup pxa168_clkregs[] = { INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL), INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL), INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), + INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL), }; static int __init pxa168_init(void) @@ -147,3 +150,4 @@ PXA168_DEVICE(ssp2, "pxa168-ssp", 1, SSP2, 0xd401c000, 0x40, 54, 55); PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, 0xd401f000, 0x40, 56, 57); PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59); PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61); +PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8); diff --git a/drivers/video/pxa168fb.c b/drivers/video/pxa168fb.c index c91a7f7..d3e597e 100644 --- a/drivers/video/pxa168fb.c +++ b/drivers/video/pxa168fb.c @@ -559,7 +559,7 @@ static struct fb_ops pxa168fb_ops = { .fb_imageblit = cfb_imageblit, }; -static int __init pxa168fb_init_mode(struct fb_info *info, +static int pxa168fb_init_mode(struct fb_info *info, struct pxa168fb_mach_info *mi) { struct pxa168fb_info *fbi = info->par; @@ -599,7 +599,7 @@ static int __init pxa168fb_init_mode(struct fb_info *info, return ret; } -static int __init pxa168fb_probe(struct platform_device *pdev) +static int pxa168fb_probe(struct platform_device *pdev) { struct pxa168fb_mach_info *mi; struct fb_info *info = 0; -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 1/1] pxa168: added initial support for TPO TD043MTEA1 LCD display on Aspenite 2010-08-26 2:04 [PATCH v2 1/1] pxa168: added initial support for TPO TD043MTEA1 LCD display on Aspenite Mark F. Brown @ 2010-08-26 2:26 ` Marek Vasut 2010-08-26 3:44 ` Mark F. Brown 0 siblings, 1 reply; 6+ messages in thread From: Marek Vasut @ 2010-08-26 2:26 UTC (permalink / raw) To: linux-arm-kernel Dne ?t 26. srpna 2010 04:04:52 Mark F. Brown napsal(a): > Signed-off-by: Mark F. Brown <mark.brown314@gmail.com> > --- > arch/arm/mach-mmp/aspenite.c | 60 > +++++++++++++++++++++++++++++++ arch/arm/mach-mmp/include/mach/pxa168.h | > 8 ++++ > arch/arm/mach-mmp/pxa168.c | 4 ++ > drivers/video/pxa168fb.c | 4 +- > 4 files changed, 74 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c > index 0629394..9e1bd6b 100644 > --- a/arch/arm/mach-mmp/aspenite.c > +++ b/arch/arm/mach-mmp/aspenite.c > @@ -23,6 +23,7 @@ > #include <mach/mfp-pxa168.h> > #include <mach/pxa168.h> > #include <mach/gpio.h> > +#include <video/pxa168fb.h> > > #include "common.h" > > @@ -66,6 +67,36 @@ static unsigned long common_pin_config[] __initdata = { > GPIO115_I2S_BCLK, > GPIO116_I2S_RXD, > GPIO117_I2S_TXD, > + > + /* LCD */ > + GPIO56_LCD_FCLK_RD, > + GPIO57_LCD_LCLK_A0, > + GPIO58_LCD_PCLK_WR, > + GPIO59_LCD_DENA_BIAS, > + GPIO60_LCD_DD0, > + GPIO61_LCD_DD1, > + GPIO62_LCD_DD2, > + GPIO63_LCD_DD3, > + GPIO64_LCD_DD4, > + GPIO65_LCD_DD5, > + GPIO66_LCD_DD6, > + GPIO67_LCD_DD7, > + GPIO68_LCD_DD8, > + GPIO69_LCD_DD9, > + GPIO70_LCD_DD10, > + GPIO71_LCD_DD11, > + GPIO72_LCD_DD12, > + GPIO73_LCD_DD13, > + GPIO74_LCD_DD14, > + GPIO75_LCD_DD15, > + GPIO76_LCD_DD16, > + GPIO77_LCD_DD17, > + GPIO78_LCD_DD18, > + GPIO79_LCD_DD19, > + GPIO80_LCD_DD20, > + GPIO81_LCD_DD21, > + GPIO82_LCD_DD22, > + GPIO83_LCD_DD23, > }; > > static struct smc91x_platdata smc91x_info = { > @@ -134,6 +165,34 @@ static struct i2c_board_info aspenite_i2c_info[] > __initdata = { { I2C_BOARD_INFO("wm8753", 0x1b), }, > }; > > +static struct fb_videomode video_modes[] = { > + [0] = { > + .pixclock = 30120, > + .refresh = 60, > + .xres = 800, > + .yres = 480, > + .hsync_len = 1, > + .left_margin = 215, > + .right_margin = 40, > + .vsync_len = 1, > + .upper_margin = 34, > + .lower_margin = 10, > + .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, > + }, > +}; > + > +struct pxa168fb_mach_info aspenite_lcd_info = { > + .id = "Graphic Frame", > + .modes = video_modes, > + .num_modes = ARRAY_SIZE(video_modes), > + .pix_fmt = PIX_FMT_RGB565, > + .io_pin_allocation_mode = PIN_MODE_DUMB_24, > + .dumb_mode = DUMB_MODE_RGB888, > + .active = 1, > + .panel_rbswap = 0, > + .invert_pixclock = 0, > +}; > + > static void __init common_init(void) > { > mfp_config(ARRAY_AND_SIZE(common_pin_config)); > @@ -143,6 +202,7 @@ static void __init common_init(void) > pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info)); > pxa168_add_ssp(1); > pxa168_add_nand(&aspenite_nand_info); > + pxa168_add_fb(&aspenite_lcd_info); > > /* off-chip devices */ > platform_device_register(&smc91x_device); ---------------------------------------------- ^--- one patch above SNIP, please split into two patches v--- another patch below ---------------------------------------------- > diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h > b/arch/arm/mach-mmp/include/mach/pxa168.h index 27e1bc7..220738f 100644 > --- a/arch/arm/mach-mmp/include/mach/pxa168.h > +++ b/arch/arm/mach-mmp/include/mach/pxa168.h > @@ -10,6 +10,7 @@ extern void __init pxa168_init_irq(void); > #include <mach/devices.h> > #include <plat/i2c.h> > #include <plat/pxa3xx_nand.h> > +#include <video/pxa168fb.h> > > extern struct pxa_device_desc pxa168_device_uart1; > extern struct pxa_device_desc pxa168_device_uart2; > @@ -25,6 +26,7 @@ extern struct pxa_device_desc pxa168_device_ssp3; > extern struct pxa_device_desc pxa168_device_ssp4; > extern struct pxa_device_desc pxa168_device_ssp5; > extern struct pxa_device_desc pxa168_device_nand; > +extern struct pxa_device_desc pxa168_device_fb; > > static inline int pxa168_add_uart(int id) > { > @@ -97,4 +99,10 @@ static inline int pxa168_add_nand(struct > pxa3xx_nand_platform_data *info) { > return pxa_register_device(&pxa168_device_nand, info, sizeof(*info)); > } > + > +static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi) > +{ > + return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi)); > +} > + > #endif /* __ASM_MACH_PXA168_H */ > diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c > index 652ae66..886eadb 100644 > --- a/arch/arm/mach-mmp/pxa168.c > +++ b/arch/arm/mach-mmp/pxa168.c > @@ -25,6 +25,7 @@ > #include <mach/dma.h> > #include <mach/devices.h> > #include <mach/mfp.h> > +#include <video/pxa168fb.h> > > #include "common.h" > #include "clock.h" > @@ -79,6 +80,7 @@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0); > static APBC_CLK(ssp5, PXA168_SSP5, 4, 0); > > static APMU_CLK(nand, NAND, 0x01db, 208000000); > +static APMU_CLK(lcd, LCD, 0x7f, 312000000); > > /* device and clock bindings */ > static struct clk_lookup pxa168_clkregs[] = { > @@ -96,6 +98,7 @@ static struct clk_lookup pxa168_clkregs[] = { > INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL), > INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL), > INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), > + INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL), > }; > > static int __init pxa168_init(void) > @@ -147,3 +150,4 @@ PXA168_DEVICE(ssp2, "pxa168-ssp", 1, SSP2, 0xd401c000, > 0x40, 54, 55); PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, 0xd401f000, > 0x40, 56, 57); PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, > 0x40, 58, 59); PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, > 0x40, 60, 61); +PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, > 0x1c8); > diff --git a/drivers/video/pxa168fb.c b/drivers/video/pxa168fb.c > index c91a7f7..d3e597e 100644 > --- a/drivers/video/pxa168fb.c > +++ b/drivers/video/pxa168fb.c > @@ -559,7 +559,7 @@ static struct fb_ops pxa168fb_ops = { > .fb_imageblit = cfb_imageblit, > }; > > -static int __init pxa168fb_init_mode(struct fb_info *info, > +static int pxa168fb_init_mode(struct fb_info *info, > struct pxa168fb_mach_info *mi) Why do you remove __init from it ? > { > struct pxa168fb_info *fbi = info->par; > @@ -599,7 +599,7 @@ static int __init pxa168fb_init_mode(struct fb_info > *info, return ret; > } > > -static int __init pxa168fb_probe(struct platform_device *pdev) > +static int pxa168fb_probe(struct platform_device *pdev) Why do you remove __init from it ? (DTTO) > { > struct pxa168fb_mach_info *mi; > struct fb_info *info = 0; Cheers ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/1] pxa168: added initial support for TPO TD043MTEA1 LCD display on Aspenite 2010-08-26 2:26 ` Marek Vasut @ 2010-08-26 3:44 ` Mark F. Brown 2010-08-26 3:57 ` Haojian Zhuang 2010-08-26 4:02 ` Marek Vasut 0 siblings, 2 replies; 6+ messages in thread From: Mark F. Brown @ 2010-08-26 3:44 UTC (permalink / raw) To: linux-arm-kernel On Wed, Aug 25, 2010 at 10:26 PM, Marek Vasut <marek.vasut@gmail.com> wrote: > Dne ?t 26. srpna 2010 04:04:52 Mark F. Brown napsal(a): >> Signed-off-by: Mark F. Brown <mark.brown314@gmail.com> >> --- >> ?arch/arm/mach-mmp/aspenite.c ? ? ? ? ? ?| ? 60 >> +++++++++++++++++++++++++++++++ arch/arm/mach-mmp/include/mach/pxa168.h | >> ? 8 ++++ >> ?arch/arm/mach-mmp/pxa168.c ? ? ? ? ? ? ?| ? ?4 ++ >> ?drivers/video/pxa168fb.c ? ? ? ? ? ? ? ?| ? ?4 +- >> ?4 files changed, 74 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c >> index 0629394..9e1bd6b 100644 >> --- a/arch/arm/mach-mmp/aspenite.c >> +++ b/arch/arm/mach-mmp/aspenite.c >> @@ -23,6 +23,7 @@ >> ?#include <mach/mfp-pxa168.h> >> ?#include <mach/pxa168.h> >> ?#include <mach/gpio.h> >> +#include <video/pxa168fb.h> >> >> ?#include "common.h" >> >> @@ -66,6 +67,36 @@ static unsigned long common_pin_config[] __initdata = { >> ? ? ? GPIO115_I2S_BCLK, >> ? ? ? GPIO116_I2S_RXD, >> ? ? ? GPIO117_I2S_TXD, >> + >> + ? ? /* LCD */ >> + ? ? GPIO56_LCD_FCLK_RD, >> + ? ? GPIO57_LCD_LCLK_A0, >> + ? ? GPIO58_LCD_PCLK_WR, >> + ? ? GPIO59_LCD_DENA_BIAS, >> + ? ? GPIO60_LCD_DD0, >> + ? ? GPIO61_LCD_DD1, >> + ? ? GPIO62_LCD_DD2, >> + ? ? GPIO63_LCD_DD3, >> + ? ? GPIO64_LCD_DD4, >> + ? ? GPIO65_LCD_DD5, >> + ? ? GPIO66_LCD_DD6, >> + ? ? GPIO67_LCD_DD7, >> + ? ? GPIO68_LCD_DD8, >> + ? ? GPIO69_LCD_DD9, >> + ? ? GPIO70_LCD_DD10, >> + ? ? GPIO71_LCD_DD11, >> + ? ? GPIO72_LCD_DD12, >> + ? ? GPIO73_LCD_DD13, >> + ? ? GPIO74_LCD_DD14, >> + ? ? GPIO75_LCD_DD15, >> + ? ? GPIO76_LCD_DD16, >> + ? ? GPIO77_LCD_DD17, >> + ? ? GPIO78_LCD_DD18, >> + ? ? GPIO79_LCD_DD19, >> + ? ? GPIO80_LCD_DD20, >> + ? ? GPIO81_LCD_DD21, >> + ? ? GPIO82_LCD_DD22, >> + ? ? GPIO83_LCD_DD23, >> ?}; >> >> ?static struct smc91x_platdata smc91x_info = { >> @@ -134,6 +165,34 @@ static struct i2c_board_info aspenite_i2c_info[] >> __initdata = { { I2C_BOARD_INFO("wm8753", 0x1b), }, >> ?}; >> >> +static struct fb_videomode video_modes[] = { >> + ? ? [0] = { >> + ? ? ? ? ? ? .pixclock ? ? ? = 30120, >> + ? ? ? ? ? ? .refresh ? ? ? ?= 60, >> + ? ? ? ? ? ? .xres ? ? ? ? ? = 800, >> + ? ? ? ? ? ? .yres ? ? ? ? ? = 480, >> + ? ? ? ? ? ? .hsync_len ? ? ?= 1, >> + ? ? ? ? ? ? .left_margin ? ?= 215, >> + ? ? ? ? ? ? .right_margin ? = 40, >> + ? ? ? ? ? ? .vsync_len ? ? ?= 1, >> + ? ? ? ? ? ? .upper_margin ? = 34, >> + ? ? ? ? ? ? .lower_margin ? = 10, >> + ? ? ? ? ? ? .sync ? ? ? ? ? = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, >> + ? ? }, >> +}; >> + >> +struct pxa168fb_mach_info aspenite_lcd_info = { >> + ? ? .id ? ? ? ? ? ? ? ? ? ? = "Graphic Frame", >> + ? ? .modes ? ? ? ? ? ? ? ? ?= video_modes, >> + ? ? .num_modes ? ? ? ? ? ? ?= ARRAY_SIZE(video_modes), >> + ? ? .pix_fmt ? ? ? ? ? ? ? ?= PIX_FMT_RGB565, >> + ? ? .io_pin_allocation_mode = PIN_MODE_DUMB_24, >> + ? ? .dumb_mode ? ? ? ? ? ? ?= DUMB_MODE_RGB888, >> + ? ? .active ? ? ? ? ? ? ? ? = 1, >> + ? ? .panel_rbswap ? ? ? ? ? = 0, >> + ? ? .invert_pixclock ? ? ? ?= 0, >> +}; >> + >> ?static void __init common_init(void) >> ?{ >> ? ? ? mfp_config(ARRAY_AND_SIZE(common_pin_config)); >> @@ -143,6 +202,7 @@ static void __init common_init(void) >> ? ? ? pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info)); >> ? ? ? pxa168_add_ssp(1); >> ? ? ? pxa168_add_nand(&aspenite_nand_info); >> + ? ? pxa168_add_fb(&aspenite_lcd_info); >> >> ? ? ? /* off-chip devices */ >> ? ? ? platform_device_register(&smc91x_device); > > > > ---------------------------------------------- > ^--- one patch above > SNIP, please split into two patches > v--- another patch below > ---------------------------------------------- > > > > >> diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h >> b/arch/arm/mach-mmp/include/mach/pxa168.h index 27e1bc7..220738f 100644 >> --- a/arch/arm/mach-mmp/include/mach/pxa168.h >> +++ b/arch/arm/mach-mmp/include/mach/pxa168.h >> @@ -10,6 +10,7 @@ extern void __init pxa168_init_irq(void); >> ?#include <mach/devices.h> >> ?#include <plat/i2c.h> >> ?#include <plat/pxa3xx_nand.h> >> +#include <video/pxa168fb.h> >> >> ?extern struct pxa_device_desc pxa168_device_uart1; >> ?extern struct pxa_device_desc pxa168_device_uart2; >> @@ -25,6 +26,7 @@ extern struct pxa_device_desc pxa168_device_ssp3; >> ?extern struct pxa_device_desc pxa168_device_ssp4; >> ?extern struct pxa_device_desc pxa168_device_ssp5; >> ?extern struct pxa_device_desc pxa168_device_nand; >> +extern struct pxa_device_desc pxa168_device_fb; >> >> ?static inline int pxa168_add_uart(int id) >> ?{ >> @@ -97,4 +99,10 @@ static inline int pxa168_add_nand(struct >> pxa3xx_nand_platform_data *info) { >> ? ? ? return pxa_register_device(&pxa168_device_nand, info, sizeof(*info)); >> ?} >> + >> +static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi) >> +{ >> + ? ? return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi)); >> +} >> + >> ?#endif /* __ASM_MACH_PXA168_H */ >> diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c >> index 652ae66..886eadb 100644 >> --- a/arch/arm/mach-mmp/pxa168.c >> +++ b/arch/arm/mach-mmp/pxa168.c >> @@ -25,6 +25,7 @@ >> ?#include <mach/dma.h> >> ?#include <mach/devices.h> >> ?#include <mach/mfp.h> >> +#include <video/pxa168fb.h> >> >> ?#include "common.h" >> ?#include "clock.h" >> @@ -79,6 +80,7 @@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0); >> ?static APBC_CLK(ssp5, PXA168_SSP5, 4, 0); >> >> ?static APMU_CLK(nand, NAND, 0x01db, 208000000); >> +static APMU_CLK(lcd, LCD, 0x7f, 312000000); >> >> ?/* device and clock bindings */ >> ?static struct clk_lookup pxa168_clkregs[] = { >> @@ -96,6 +98,7 @@ static struct clk_lookup pxa168_clkregs[] = { >> ? ? ? INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL), >> ? ? ? INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL), >> ? ? ? INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), >> + ? ? INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL), >> ?}; >> >> ?static int __init pxa168_init(void) >> @@ -147,3 +150,4 @@ PXA168_DEVICE(ssp2, "pxa168-ssp", 1, SSP2, 0xd401c000, >> 0x40, 54, 55); PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, 0xd401f000, >> 0x40, 56, 57); PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, >> 0x40, 58, 59); PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, >> 0x40, 60, 61); +PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, >> 0x1c8); >> diff --git a/drivers/video/pxa168fb.c b/drivers/video/pxa168fb.c >> index c91a7f7..d3e597e 100644 >> --- a/drivers/video/pxa168fb.c >> +++ b/drivers/video/pxa168fb.c >> @@ -559,7 +559,7 @@ static struct fb_ops pxa168fb_ops = { >> ? ? ? .fb_imageblit ? = cfb_imageblit, >> ?}; >> >> -static int __init pxa168fb_init_mode(struct fb_info *info, >> +static int pxa168fb_init_mode(struct fb_info *info, >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct pxa168fb_mach_info *mi) > > Why do you remove __init from it ? >> ?{ >> ? ? ? struct pxa168fb_info *fbi = info->par; >> @@ -599,7 +599,7 @@ static int __init pxa168fb_init_mode(struct fb_info >> *info, return ret; >> ?} >> >> -static int __init pxa168fb_probe(struct platform_device *pdev) >> +static int pxa168fb_probe(struct platform_device *pdev) > > Why do you remove __init from it ? (DTTO) >> ?{ >> ? ? ? struct pxa168fb_mach_info *mi; >> ? ? ? struct fb_info *info = 0; > > Cheers > Hi Marek, 1) I removed the __init because it was causing a section mismatch warning wth this kernel. Since pxa168fb_probe() is calling pxa168fb_init_mode(), I cannot declare pxa168fb_init_mode() as an __init function. If pxa168fb_probe gets called after the __init section is wiped then it will attempt to run the deleted pxa168fb_init_mode() code. WARNING: vmlinux.o(.data+0x17984): Section mismatch in reference from the variable pxa168fb_driver to the function .init.text:pxa168fb_probe() The variable pxa168fb_driver references the function __init pxa168fb_probe() If the reference is valid then annotate the variable with __init* or __refdata (see linux/init.h) or name the variable: *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, 2) What is the logic behind the delineation between patch files? I cannot build patch #1 without patch #2 based on how you defined the split. I need all of it in order to function. -- Mark ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/1] pxa168: added initial support for TPO TD043MTEA1 LCD display on Aspenite 2010-08-26 3:44 ` Mark F. Brown @ 2010-08-26 3:57 ` Haojian Zhuang 2010-08-26 4:02 ` Marek Vasut 1 sibling, 0 replies; 6+ messages in thread From: Haojian Zhuang @ 2010-08-26 3:57 UTC (permalink / raw) To: linux-arm-kernel 2010/8/26 Mark F. Brown <mark.brown314@gmail.com>: > On Wed, Aug 25, 2010 at 10:26 PM, Marek Vasut <marek.vasut@gmail.com> wrote: >> Dne ?t 26. srpna 2010 04:04:52 Mark F. Brown napsal(a): >>> Signed-off-by: Mark F. Brown <mark.brown314@gmail.com> >>> --- >>> ?arch/arm/mach-mmp/aspenite.c ? ? ? ? ? ?| ? 60 >>> +++++++++++++++++++++++++++++++ arch/arm/mach-mmp/include/mach/pxa168.h | >>> ? 8 ++++ >>> ?arch/arm/mach-mmp/pxa168.c ? ? ? ? ? ? ?| ? ?4 ++ >>> ?drivers/video/pxa168fb.c ? ? ? ? ? ? ? ?| ? ?4 +- >>> ?4 files changed, 74 insertions(+), 2 deletions(-) >>> >>> diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c >>> index 0629394..9e1bd6b 100644 >>> --- a/arch/arm/mach-mmp/aspenite.c >>> +++ b/arch/arm/mach-mmp/aspenite.c >>> @@ -23,6 +23,7 @@ >>> ?#include <mach/mfp-pxa168.h> >>> ?#include <mach/pxa168.h> >>> ?#include <mach/gpio.h> >>> +#include <video/pxa168fb.h> >>> >>> ?#include "common.h" >>> >>> @@ -66,6 +67,36 @@ static unsigned long common_pin_config[] __initdata = { >>> ? ? ? GPIO115_I2S_BCLK, >>> ? ? ? GPIO116_I2S_RXD, >>> ? ? ? GPIO117_I2S_TXD, >>> + >>> + ? ? /* LCD */ >>> + ? ? GPIO56_LCD_FCLK_RD, >>> + ? ? GPIO57_LCD_LCLK_A0, >>> + ? ? GPIO58_LCD_PCLK_WR, >>> + ? ? GPIO59_LCD_DENA_BIAS, >>> + ? ? GPIO60_LCD_DD0, >>> + ? ? GPIO61_LCD_DD1, >>> + ? ? GPIO62_LCD_DD2, >>> + ? ? GPIO63_LCD_DD3, >>> + ? ? GPIO64_LCD_DD4, >>> + ? ? GPIO65_LCD_DD5, >>> + ? ? GPIO66_LCD_DD6, >>> + ? ? GPIO67_LCD_DD7, >>> + ? ? GPIO68_LCD_DD8, >>> + ? ? GPIO69_LCD_DD9, >>> + ? ? GPIO70_LCD_DD10, >>> + ? ? GPIO71_LCD_DD11, >>> + ? ? GPIO72_LCD_DD12, >>> + ? ? GPIO73_LCD_DD13, >>> + ? ? GPIO74_LCD_DD14, >>> + ? ? GPIO75_LCD_DD15, >>> + ? ? GPIO76_LCD_DD16, >>> + ? ? GPIO77_LCD_DD17, >>> + ? ? GPIO78_LCD_DD18, >>> + ? ? GPIO79_LCD_DD19, >>> + ? ? GPIO80_LCD_DD20, >>> + ? ? GPIO81_LCD_DD21, >>> + ? ? GPIO82_LCD_DD22, >>> + ? ? GPIO83_LCD_DD23, >>> ?}; >>> >>> ?static struct smc91x_platdata smc91x_info = { >>> @@ -134,6 +165,34 @@ static struct i2c_board_info aspenite_i2c_info[] >>> __initdata = { { I2C_BOARD_INFO("wm8753", 0x1b), }, >>> ?}; >>> >>> +static struct fb_videomode video_modes[] = { >>> + ? ? [0] = { >>> + ? ? ? ? ? ? .pixclock ? ? ? = 30120, >>> + ? ? ? ? ? ? .refresh ? ? ? ?= 60, >>> + ? ? ? ? ? ? .xres ? ? ? ? ? = 800, >>> + ? ? ? ? ? ? .yres ? ? ? ? ? = 480, >>> + ? ? ? ? ? ? .hsync_len ? ? ?= 1, >>> + ? ? ? ? ? ? .left_margin ? ?= 215, >>> + ? ? ? ? ? ? .right_margin ? = 40, >>> + ? ? ? ? ? ? .vsync_len ? ? ?= 1, >>> + ? ? ? ? ? ? .upper_margin ? = 34, >>> + ? ? ? ? ? ? .lower_margin ? = 10, >>> + ? ? ? ? ? ? .sync ? ? ? ? ? = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, >>> + ? ? }, >>> +}; >>> + >>> +struct pxa168fb_mach_info aspenite_lcd_info = { >>> + ? ? .id ? ? ? ? ? ? ? ? ? ? = "Graphic Frame", >>> + ? ? .modes ? ? ? ? ? ? ? ? ?= video_modes, >>> + ? ? .num_modes ? ? ? ? ? ? ?= ARRAY_SIZE(video_modes), >>> + ? ? .pix_fmt ? ? ? ? ? ? ? ?= PIX_FMT_RGB565, >>> + ? ? .io_pin_allocation_mode = PIN_MODE_DUMB_24, >>> + ? ? .dumb_mode ? ? ? ? ? ? ?= DUMB_MODE_RGB888, >>> + ? ? .active ? ? ? ? ? ? ? ? = 1, >>> + ? ? .panel_rbswap ? ? ? ? ? = 0, >>> + ? ? .invert_pixclock ? ? ? ?= 0, >>> +}; >>> + >>> ?static void __init common_init(void) >>> ?{ >>> ? ? ? mfp_config(ARRAY_AND_SIZE(common_pin_config)); >>> @@ -143,6 +202,7 @@ static void __init common_init(void) >>> ? ? ? pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info)); >>> ? ? ? pxa168_add_ssp(1); >>> ? ? ? pxa168_add_nand(&aspenite_nand_info); >>> + ? ? pxa168_add_fb(&aspenite_lcd_info); >>> >>> ? ? ? /* off-chip devices */ >>> ? ? ? platform_device_register(&smc91x_device); >> >> >> >> ---------------------------------------------- >> ^--- one patch above >> SNIP, please split into two patches >> v--- another patch below >> ---------------------------------------------- >> >> >> >> >>> diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h >>> b/arch/arm/mach-mmp/include/mach/pxa168.h index 27e1bc7..220738f 100644 >>> --- a/arch/arm/mach-mmp/include/mach/pxa168.h >>> +++ b/arch/arm/mach-mmp/include/mach/pxa168.h >>> @@ -10,6 +10,7 @@ extern void __init pxa168_init_irq(void); >>> ?#include <mach/devices.h> >>> ?#include <plat/i2c.h> >>> ?#include <plat/pxa3xx_nand.h> >>> +#include <video/pxa168fb.h> >>> >>> ?extern struct pxa_device_desc pxa168_device_uart1; >>> ?extern struct pxa_device_desc pxa168_device_uart2; >>> @@ -25,6 +26,7 @@ extern struct pxa_device_desc pxa168_device_ssp3; >>> ?extern struct pxa_device_desc pxa168_device_ssp4; >>> ?extern struct pxa_device_desc pxa168_device_ssp5; >>> ?extern struct pxa_device_desc pxa168_device_nand; >>> +extern struct pxa_device_desc pxa168_device_fb; >>> >>> ?static inline int pxa168_add_uart(int id) >>> ?{ >>> @@ -97,4 +99,10 @@ static inline int pxa168_add_nand(struct >>> pxa3xx_nand_platform_data *info) { >>> ? ? ? return pxa_register_device(&pxa168_device_nand, info, sizeof(*info)); >>> ?} >>> + >>> +static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi) >>> +{ >>> + ? ? return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi)); >>> +} >>> + >>> ?#endif /* __ASM_MACH_PXA168_H */ >>> diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c >>> index 652ae66..886eadb 100644 >>> --- a/arch/arm/mach-mmp/pxa168.c >>> +++ b/arch/arm/mach-mmp/pxa168.c >>> @@ -25,6 +25,7 @@ >>> ?#include <mach/dma.h> >>> ?#include <mach/devices.h> >>> ?#include <mach/mfp.h> >>> +#include <video/pxa168fb.h> >>> >>> ?#include "common.h" >>> ?#include "clock.h" >>> @@ -79,6 +80,7 @@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0); >>> ?static APBC_CLK(ssp5, PXA168_SSP5, 4, 0); >>> >>> ?static APMU_CLK(nand, NAND, 0x01db, 208000000); >>> +static APMU_CLK(lcd, LCD, 0x7f, 312000000); >>> >>> ?/* device and clock bindings */ >>> ?static struct clk_lookup pxa168_clkregs[] = { >>> @@ -96,6 +98,7 @@ static struct clk_lookup pxa168_clkregs[] = { >>> ? ? ? INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL), >>> ? ? ? INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL), >>> ? ? ? INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), >>> + ? ? INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL), >>> ?}; >>> >>> ?static int __init pxa168_init(void) >>> @@ -147,3 +150,4 @@ PXA168_DEVICE(ssp2, "pxa168-ssp", 1, SSP2, 0xd401c000, >>> 0x40, 54, 55); PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, 0xd401f000, >>> 0x40, 56, 57); PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, >>> 0x40, 58, 59); PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, >>> 0x40, 60, 61); +PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, >>> 0x1c8); >>> diff --git a/drivers/video/pxa168fb.c b/drivers/video/pxa168fb.c >>> index c91a7f7..d3e597e 100644 >>> --- a/drivers/video/pxa168fb.c >>> +++ b/drivers/video/pxa168fb.c >>> @@ -559,7 +559,7 @@ static struct fb_ops pxa168fb_ops = { >>> ? ? ? .fb_imageblit ? = cfb_imageblit, >>> ?}; >>> >>> -static int __init pxa168fb_init_mode(struct fb_info *info, >>> +static int pxa168fb_init_mode(struct fb_info *info, >>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct pxa168fb_mach_info *mi) >> >> Why do you remove __init from it ? >>> ?{ >>> ? ? ? struct pxa168fb_info *fbi = info->par; >>> @@ -599,7 +599,7 @@ static int __init pxa168fb_init_mode(struct fb_info >>> *info, return ret; >>> ?} >>> >>> -static int __init pxa168fb_probe(struct platform_device *pdev) >>> +static int pxa168fb_probe(struct platform_device *pdev) >> >> Why do you remove __init from it ? (DTTO) >>> ?{ >>> ? ? ? struct pxa168fb_mach_info *mi; >>> ? ? ? struct fb_info *info = 0; >> >> Cheers >> > > Hi Marek, > > 1) I removed the __init because it was causing a section mismatch > warning wth this kernel. Since pxa168fb_probe() is calling > pxa168fb_init_mode(), I cannot declare pxa168fb_init_mode() as an > __init function. If pxa168fb_probe gets called after the __init > section is wiped then it will attempt to run the deleted > pxa168fb_init_mode() code. > > WARNING: vmlinux.o(.data+0x17984): Section mismatch in reference from > the variable pxa168fb_driver to the function > .init.text:pxa168fb_probe() > The variable pxa168fb_driver references > the function __init pxa168fb_probe() > If the reference is valid then annotate the > variable with __init* or __refdata (see linux/init.h) or name the variable: > *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, > > > 2) What is the logic behind the delineation between patch files? I > cannot build patch #1 without patch #2 based on how you defined the > split. I need all of it in order to function. > Patch #2 should be the first one since it's related to framebuffer driver. The next one should be platform file. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/1] pxa168: added initial support for TPO TD043MTEA1 LCD display on Aspenite 2010-08-26 3:44 ` Mark F. Brown 2010-08-26 3:57 ` Haojian Zhuang @ 2010-08-26 4:02 ` Marek Vasut 2010-08-26 4:04 ` Mark F. Brown 1 sibling, 1 reply; 6+ messages in thread From: Marek Vasut @ 2010-08-26 4:02 UTC (permalink / raw) To: linux-arm-kernel Dne ?t 26. srpna 2010 05:44:48 Mark F. Brown napsal(a): > On Wed, Aug 25, 2010 at 10:26 PM, Marek Vasut <marek.vasut@gmail.com> wrote: > > Dne ?t 26. srpna 2010 04:04:52 Mark F. Brown napsal(a): > >> Signed-off-by: Mark F. Brown <mark.brown314@gmail.com> > >> --- > >> arch/arm/mach-mmp/aspenite.c | 60 > >> +++++++++++++++++++++++++++++++ arch/arm/mach-mmp/include/mach/pxa168.h > >> | 8 ++++ > >> arch/arm/mach-mmp/pxa168.c | 4 ++ > >> drivers/video/pxa168fb.c | 4 +- > >> 4 files changed, 74 insertions(+), 2 deletions(-) > >> > >> diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c > >> index 0629394..9e1bd6b 100644 > >> --- a/arch/arm/mach-mmp/aspenite.c > >> +++ b/arch/arm/mach-mmp/aspenite.c > >> @@ -23,6 +23,7 @@ > >> #include <mach/mfp-pxa168.h> > >> #include <mach/pxa168.h> > >> #include <mach/gpio.h> > >> +#include <video/pxa168fb.h> > >> > >> #include "common.h" > >> > >> @@ -66,6 +67,36 @@ static unsigned long common_pin_config[] __initdata = > >> { GPIO115_I2S_BCLK, > >> GPIO116_I2S_RXD, > >> GPIO117_I2S_TXD, > >> + > >> + /* LCD */ > >> + GPIO56_LCD_FCLK_RD, > >> + GPIO57_LCD_LCLK_A0, > >> + GPIO58_LCD_PCLK_WR, > >> + GPIO59_LCD_DENA_BIAS, > >> + GPIO60_LCD_DD0, > >> + GPIO61_LCD_DD1, > >> + GPIO62_LCD_DD2, > >> + GPIO63_LCD_DD3, > >> + GPIO64_LCD_DD4, > >> + GPIO65_LCD_DD5, > >> + GPIO66_LCD_DD6, > >> + GPIO67_LCD_DD7, > >> + GPIO68_LCD_DD8, > >> + GPIO69_LCD_DD9, > >> + GPIO70_LCD_DD10, > >> + GPIO71_LCD_DD11, > >> + GPIO72_LCD_DD12, > >> + GPIO73_LCD_DD13, > >> + GPIO74_LCD_DD14, > >> + GPIO75_LCD_DD15, > >> + GPIO76_LCD_DD16, > >> + GPIO77_LCD_DD17, > >> + GPIO78_LCD_DD18, > >> + GPIO79_LCD_DD19, > >> + GPIO80_LCD_DD20, > >> + GPIO81_LCD_DD21, > >> + GPIO82_LCD_DD22, > >> + GPIO83_LCD_DD23, > >> }; > >> > >> static struct smc91x_platdata smc91x_info = { > >> @@ -134,6 +165,34 @@ static struct i2c_board_info aspenite_i2c_info[] > >> __initdata = { { I2C_BOARD_INFO("wm8753", 0x1b), }, > >> }; > >> > >> +static struct fb_videomode video_modes[] = { > >> + [0] = { > >> + .pixclock = 30120, > >> + .refresh = 60, > >> + .xres = 800, > >> + .yres = 480, > >> + .hsync_len = 1, > >> + .left_margin = 215, > >> + .right_margin = 40, > >> + .vsync_len = 1, > >> + .upper_margin = 34, > >> + .lower_margin = 10, > >> + .sync = FB_SYNC_VERT_HIGH_ACT | > >> FB_SYNC_HOR_HIGH_ACT, + }, > >> +}; > >> + > >> +struct pxa168fb_mach_info aspenite_lcd_info = { > >> + .id = "Graphic Frame", > >> + .modes = video_modes, > >> + .num_modes = ARRAY_SIZE(video_modes), > >> + .pix_fmt = PIX_FMT_RGB565, > >> + .io_pin_allocation_mode = PIN_MODE_DUMB_24, > >> + .dumb_mode = DUMB_MODE_RGB888, > >> + .active = 1, > >> + .panel_rbswap = 0, > >> + .invert_pixclock = 0, > >> +}; > >> + > >> static void __init common_init(void) > >> { > >> mfp_config(ARRAY_AND_SIZE(common_pin_config)); > >> @@ -143,6 +202,7 @@ static void __init common_init(void) > >> pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info)); > >> pxa168_add_ssp(1); > >> pxa168_add_nand(&aspenite_nand_info); > >> + pxa168_add_fb(&aspenite_lcd_info); > >> > >> /* off-chip devices */ > >> platform_device_register(&smc91x_device); > > > > ---------------------------------------------- > > ^--- one patch above > > SNIP, please split into two patches > > v--- another patch below > > ---------------------------------------------- > > > >> diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h > >> b/arch/arm/mach-mmp/include/mach/pxa168.h index 27e1bc7..220738f 100644 > >> --- a/arch/arm/mach-mmp/include/mach/pxa168.h > >> +++ b/arch/arm/mach-mmp/include/mach/pxa168.h > >> @@ -10,6 +10,7 @@ extern void __init pxa168_init_irq(void); > >> #include <mach/devices.h> > >> #include <plat/i2c.h> > >> #include <plat/pxa3xx_nand.h> > >> +#include <video/pxa168fb.h> > >> > >> extern struct pxa_device_desc pxa168_device_uart1; > >> extern struct pxa_device_desc pxa168_device_uart2; > >> @@ -25,6 +26,7 @@ extern struct pxa_device_desc pxa168_device_ssp3; > >> extern struct pxa_device_desc pxa168_device_ssp4; > >> extern struct pxa_device_desc pxa168_device_ssp5; > >> extern struct pxa_device_desc pxa168_device_nand; > >> +extern struct pxa_device_desc pxa168_device_fb; > >> > >> static inline int pxa168_add_uart(int id) > >> { > >> @@ -97,4 +99,10 @@ static inline int pxa168_add_nand(struct > >> pxa3xx_nand_platform_data *info) { > >> return pxa_register_device(&pxa168_device_nand, info, > >> sizeof(*info)); } > >> + > >> +static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi) > >> +{ > >> + return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi)); > >> +} > >> + > >> #endif /* __ASM_MACH_PXA168_H */ > >> diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c > >> index 652ae66..886eadb 100644 > >> --- a/arch/arm/mach-mmp/pxa168.c > >> +++ b/arch/arm/mach-mmp/pxa168.c > >> @@ -25,6 +25,7 @@ > >> #include <mach/dma.h> > >> #include <mach/devices.h> > >> #include <mach/mfp.h> > >> +#include <video/pxa168fb.h> > >> > >> #include "common.h" > >> #include "clock.h" > >> @@ -79,6 +80,7 @@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0); > >> static APBC_CLK(ssp5, PXA168_SSP5, 4, 0); > >> > >> static APMU_CLK(nand, NAND, 0x01db, 208000000); > >> +static APMU_CLK(lcd, LCD, 0x7f, 312000000); > >> > >> /* device and clock bindings */ > >> static struct clk_lookup pxa168_clkregs[] = { > >> @@ -96,6 +98,7 @@ static struct clk_lookup pxa168_clkregs[] = { > >> INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL), > >> INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL), > >> INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), > >> + INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL), > >> }; > >> > >> static int __init pxa168_init(void) > >> @@ -147,3 +150,4 @@ PXA168_DEVICE(ssp2, "pxa168-ssp", 1, SSP2, > >> 0xd401c000, 0x40, 54, 55); PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, > >> 0xd401f000, 0x40, 56, 57); PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, > >> 0xd4020000, 0x40, 58, 59); PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, > >> 0xd4021000, 0x40, 60, 61); +PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, > >> 0xd420b000, 0x1c8); > >> diff --git a/drivers/video/pxa168fb.c b/drivers/video/pxa168fb.c > >> index c91a7f7..d3e597e 100644 > >> --- a/drivers/video/pxa168fb.c > >> +++ b/drivers/video/pxa168fb.c > >> @@ -559,7 +559,7 @@ static struct fb_ops pxa168fb_ops = { > >> .fb_imageblit = cfb_imageblit, > >> }; > >> > >> -static int __init pxa168fb_init_mode(struct fb_info *info, > >> +static int pxa168fb_init_mode(struct fb_info *info, > >> struct pxa168fb_mach_info *mi) > > > > Why do you remove __init from it ? > > > >> { > >> struct pxa168fb_info *fbi = info->par; > >> @@ -599,7 +599,7 @@ static int __init pxa168fb_init_mode(struct fb_info > >> *info, return ret; > >> } > >> > >> -static int __init pxa168fb_probe(struct platform_device *pdev) > >> +static int pxa168fb_probe(struct platform_device *pdev) > > > > Why do you remove __init from it ? (DTTO) > > > >> { > >> struct pxa168fb_mach_info *mi; > >> struct fb_info *info = 0; > > > > Cheers > > Hi Marek, > Hi, Yep, always keep CC :-) > 1) I removed the __init because it was causing a section mismatch > warning wth this kernel. Since pxa168fb_probe() is calling > pxa168fb_init_mode(), I cannot declare pxa168fb_init_mode() as an > __init function. If pxa168fb_probe gets called after the __init > section is wiped then it will attempt to run the deleted > pxa168fb_init_mode() code. > > WARNING: vmlinux.o(.data+0x17984): Section mismatch in reference from > the variable pxa168fb_driver to the function > .init.text:pxa168fb_probe() > The variable pxa168fb_driver references > the function __init pxa168fb_probe() > If the reference is valid then annotate the > variable with __init* or __refdata (see linux/init.h) or name the variable: > *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, > Thanks for reporting this, please see my patch. > > 2) What is the logic behind the delineation between patch files? I > cannot build patch #1 without patch #2 based on how you defined the > split. I need all of it in order to function. Create small patches that do not break stuff and are easy to review. By adding small touches, you actually create a nice whole picture in the end :) What I'd like to see is you to keep aspenite.c additions separate from cpu-wide additions etc. This eventually also simplifies bisection if something goes wrong. Cheers > > -- Mark ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/1] pxa168: added initial support for TPO TD043MTEA1 LCD display on Aspenite 2010-08-26 4:02 ` Marek Vasut @ 2010-08-26 4:04 ` Mark F. Brown 0 siblings, 0 replies; 6+ messages in thread From: Mark F. Brown @ 2010-08-26 4:04 UTC (permalink / raw) To: linux-arm-kernel Makes sense! Will do! -- Mark 2010/8/26 Marek Vasut <marek.vasut@gmail.com>: > Dne ?t 26. srpna 2010 05:44:48 Mark F. Brown napsal(a): >> On Wed, Aug 25, 2010 at 10:26 PM, Marek Vasut <marek.vasut@gmail.com> wrote: >> > Dne ?t 26. srpna 2010 04:04:52 Mark F. Brown napsal(a): >> >> Signed-off-by: Mark F. Brown <mark.brown314@gmail.com> >> >> --- >> >> ?arch/arm/mach-mmp/aspenite.c ? ? ? ? ? ?| ? 60 >> >> +++++++++++++++++++++++++++++++ arch/arm/mach-mmp/include/mach/pxa168.h >> >> | 8 ++++ >> >> ?arch/arm/mach-mmp/pxa168.c ? ? ? ? ? ? ?| ? ?4 ++ >> >> ?drivers/video/pxa168fb.c ? ? ? ? ? ? ? ?| ? ?4 +- >> >> ?4 files changed, 74 insertions(+), 2 deletions(-) >> >> >> >> diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c >> >> index 0629394..9e1bd6b 100644 >> >> --- a/arch/arm/mach-mmp/aspenite.c >> >> +++ b/arch/arm/mach-mmp/aspenite.c >> >> @@ -23,6 +23,7 @@ >> >> ?#include <mach/mfp-pxa168.h> >> >> ?#include <mach/pxa168.h> >> >> ?#include <mach/gpio.h> >> >> +#include <video/pxa168fb.h> >> >> >> >> ?#include "common.h" >> >> >> >> @@ -66,6 +67,36 @@ static unsigned long common_pin_config[] __initdata = >> >> { GPIO115_I2S_BCLK, >> >> ? ? ? GPIO116_I2S_RXD, >> >> ? ? ? GPIO117_I2S_TXD, >> >> + >> >> + ? ? /* LCD */ >> >> + ? ? GPIO56_LCD_FCLK_RD, >> >> + ? ? GPIO57_LCD_LCLK_A0, >> >> + ? ? GPIO58_LCD_PCLK_WR, >> >> + ? ? GPIO59_LCD_DENA_BIAS, >> >> + ? ? GPIO60_LCD_DD0, >> >> + ? ? GPIO61_LCD_DD1, >> >> + ? ? GPIO62_LCD_DD2, >> >> + ? ? GPIO63_LCD_DD3, >> >> + ? ? GPIO64_LCD_DD4, >> >> + ? ? GPIO65_LCD_DD5, >> >> + ? ? GPIO66_LCD_DD6, >> >> + ? ? GPIO67_LCD_DD7, >> >> + ? ? GPIO68_LCD_DD8, >> >> + ? ? GPIO69_LCD_DD9, >> >> + ? ? GPIO70_LCD_DD10, >> >> + ? ? GPIO71_LCD_DD11, >> >> + ? ? GPIO72_LCD_DD12, >> >> + ? ? GPIO73_LCD_DD13, >> >> + ? ? GPIO74_LCD_DD14, >> >> + ? ? GPIO75_LCD_DD15, >> >> + ? ? GPIO76_LCD_DD16, >> >> + ? ? GPIO77_LCD_DD17, >> >> + ? ? GPIO78_LCD_DD18, >> >> + ? ? GPIO79_LCD_DD19, >> >> + ? ? GPIO80_LCD_DD20, >> >> + ? ? GPIO81_LCD_DD21, >> >> + ? ? GPIO82_LCD_DD22, >> >> + ? ? GPIO83_LCD_DD23, >> >> ?}; >> >> >> >> ?static struct smc91x_platdata smc91x_info = { >> >> @@ -134,6 +165,34 @@ static struct i2c_board_info aspenite_i2c_info[] >> >> __initdata = { { I2C_BOARD_INFO("wm8753", 0x1b), }, >> >> ?}; >> >> >> >> +static struct fb_videomode video_modes[] = { >> >> + ? ? [0] = { >> >> + ? ? ? ? ? ? .pixclock ? ? ? = 30120, >> >> + ? ? ? ? ? ? .refresh ? ? ? ?= 60, >> >> + ? ? ? ? ? ? .xres ? ? ? ? ? = 800, >> >> + ? ? ? ? ? ? .yres ? ? ? ? ? = 480, >> >> + ? ? ? ? ? ? .hsync_len ? ? ?= 1, >> >> + ? ? ? ? ? ? .left_margin ? ?= 215, >> >> + ? ? ? ? ? ? .right_margin ? = 40, >> >> + ? ? ? ? ? ? .vsync_len ? ? ?= 1, >> >> + ? ? ? ? ? ? .upper_margin ? = 34, >> >> + ? ? ? ? ? ? .lower_margin ? = 10, >> >> + ? ? ? ? ? ? .sync ? ? ? ? ? = FB_SYNC_VERT_HIGH_ACT | >> >> FB_SYNC_HOR_HIGH_ACT, + ? ? }, >> >> +}; >> >> + >> >> +struct pxa168fb_mach_info aspenite_lcd_info = { >> >> + ? ? .id ? ? ? ? ? ? ? ? ? ? = "Graphic Frame", >> >> + ? ? .modes ? ? ? ? ? ? ? ? ?= video_modes, >> >> + ? ? .num_modes ? ? ? ? ? ? ?= ARRAY_SIZE(video_modes), >> >> + ? ? .pix_fmt ? ? ? ? ? ? ? ?= PIX_FMT_RGB565, >> >> + ? ? .io_pin_allocation_mode = PIN_MODE_DUMB_24, >> >> + ? ? .dumb_mode ? ? ? ? ? ? ?= DUMB_MODE_RGB888, >> >> + ? ? .active ? ? ? ? ? ? ? ? = 1, >> >> + ? ? .panel_rbswap ? ? ? ? ? = 0, >> >> + ? ? .invert_pixclock ? ? ? ?= 0, >> >> +}; >> >> + >> >> ?static void __init common_init(void) >> >> ?{ >> >> ? ? ? mfp_config(ARRAY_AND_SIZE(common_pin_config)); >> >> @@ -143,6 +202,7 @@ static void __init common_init(void) >> >> ? ? ? pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info)); >> >> ? ? ? pxa168_add_ssp(1); >> >> ? ? ? pxa168_add_nand(&aspenite_nand_info); >> >> + ? ? pxa168_add_fb(&aspenite_lcd_info); >> >> >> >> ? ? ? /* off-chip devices */ >> >> ? ? ? platform_device_register(&smc91x_device); >> > >> > ---------------------------------------------- >> > ^--- one patch above >> > SNIP, please split into two patches >> > v--- another patch below >> > ---------------------------------------------- >> > >> >> diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h >> >> b/arch/arm/mach-mmp/include/mach/pxa168.h index 27e1bc7..220738f 100644 >> >> --- a/arch/arm/mach-mmp/include/mach/pxa168.h >> >> +++ b/arch/arm/mach-mmp/include/mach/pxa168.h >> >> @@ -10,6 +10,7 @@ extern void __init pxa168_init_irq(void); >> >> ?#include <mach/devices.h> >> >> ?#include <plat/i2c.h> >> >> ?#include <plat/pxa3xx_nand.h> >> >> +#include <video/pxa168fb.h> >> >> >> >> ?extern struct pxa_device_desc pxa168_device_uart1; >> >> ?extern struct pxa_device_desc pxa168_device_uart2; >> >> @@ -25,6 +26,7 @@ extern struct pxa_device_desc pxa168_device_ssp3; >> >> ?extern struct pxa_device_desc pxa168_device_ssp4; >> >> ?extern struct pxa_device_desc pxa168_device_ssp5; >> >> ?extern struct pxa_device_desc pxa168_device_nand; >> >> +extern struct pxa_device_desc pxa168_device_fb; >> >> >> >> ?static inline int pxa168_add_uart(int id) >> >> ?{ >> >> @@ -97,4 +99,10 @@ static inline int pxa168_add_nand(struct >> >> pxa3xx_nand_platform_data *info) { >> >> ? ? ? return pxa_register_device(&pxa168_device_nand, info, >> >> sizeof(*info)); } >> >> + >> >> +static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi) >> >> +{ >> >> + ? ? return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi)); >> >> +} >> >> + >> >> ?#endif /* __ASM_MACH_PXA168_H */ >> >> diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c >> >> index 652ae66..886eadb 100644 >> >> --- a/arch/arm/mach-mmp/pxa168.c >> >> +++ b/arch/arm/mach-mmp/pxa168.c >> >> @@ -25,6 +25,7 @@ >> >> ?#include <mach/dma.h> >> >> ?#include <mach/devices.h> >> >> ?#include <mach/mfp.h> >> >> +#include <video/pxa168fb.h> >> >> >> >> ?#include "common.h" >> >> ?#include "clock.h" >> >> @@ -79,6 +80,7 @@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0); >> >> ?static APBC_CLK(ssp5, PXA168_SSP5, 4, 0); >> >> >> >> ?static APMU_CLK(nand, NAND, 0x01db, 208000000); >> >> +static APMU_CLK(lcd, LCD, 0x7f, 312000000); >> >> >> >> ?/* device and clock bindings */ >> >> ?static struct clk_lookup pxa168_clkregs[] = { >> >> @@ -96,6 +98,7 @@ static struct clk_lookup pxa168_clkregs[] = { >> >> ? ? ? INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL), >> >> ? ? ? INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL), >> >> ? ? ? INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), >> >> + ? ? INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL), >> >> ?}; >> >> >> >> ?static int __init pxa168_init(void) >> >> @@ -147,3 +150,4 @@ PXA168_DEVICE(ssp2, "pxa168-ssp", 1, SSP2, >> >> 0xd401c000, 0x40, 54, 55); PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, >> >> 0xd401f000, 0x40, 56, 57); PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, >> >> 0xd4020000, 0x40, 58, 59); PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, >> >> 0xd4021000, 0x40, 60, 61); +PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, >> >> 0xd420b000, 0x1c8); >> >> diff --git a/drivers/video/pxa168fb.c b/drivers/video/pxa168fb.c >> >> index c91a7f7..d3e597e 100644 >> >> --- a/drivers/video/pxa168fb.c >> >> +++ b/drivers/video/pxa168fb.c >> >> @@ -559,7 +559,7 @@ static struct fb_ops pxa168fb_ops = { >> >> ? ? ? .fb_imageblit ? = cfb_imageblit, >> >> ?}; >> >> >> >> -static int __init pxa168fb_init_mode(struct fb_info *info, >> >> +static int pxa168fb_init_mode(struct fb_info *info, >> >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct pxa168fb_mach_info *mi) >> > >> > Why do you remove __init from it ? >> > >> >> ?{ >> >> ? ? ? struct pxa168fb_info *fbi = info->par; >> >> @@ -599,7 +599,7 @@ static int __init pxa168fb_init_mode(struct fb_info >> >> *info, return ret; >> >> ?} >> >> >> >> -static int __init pxa168fb_probe(struct platform_device *pdev) >> >> +static int pxa168fb_probe(struct platform_device *pdev) >> > >> > Why do you remove __init from it ? (DTTO) >> > >> >> ?{ >> >> ? ? ? struct pxa168fb_mach_info *mi; >> >> ? ? ? struct fb_info *info = 0; >> > >> > Cheers >> >> Hi Marek, >> > Hi, > > Yep, always keep CC :-) > >> 1) I removed the __init because it was causing a section mismatch >> warning wth this kernel. Since pxa168fb_probe() is calling >> pxa168fb_init_mode(), I cannot declare pxa168fb_init_mode() as an >> __init function. If pxa168fb_probe gets called after the __init >> section is wiped then it will attempt to run the deleted >> pxa168fb_init_mode() code. >> >> WARNING: vmlinux.o(.data+0x17984): Section mismatch in reference from >> the variable pxa168fb_driver to the function >> .init.text:pxa168fb_probe() >> The variable pxa168fb_driver references >> the function __init pxa168fb_probe() >> If the reference is valid then annotate the >> variable with __init* or __refdata (see linux/init.h) or name the variable: >> *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, >> > > Thanks for reporting this, please see my patch. >> >> 2) What is the logic behind the delineation between patch files? I >> cannot build patch #1 without patch #2 based on how you defined the >> split. I need all of it in order to function. > > Create small patches that do not break stuff and are easy to review. By adding > small touches, you actually create a nice whole picture in the end :) > > What I'd like to see is you to keep aspenite.c additions separate from cpu-wide > additions etc. This eventually also simplifies bisection if something goes > wrong. > > Cheers >> >> -- Mark > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-08-26 4:04 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-08-26 2:04 [PATCH v2 1/1] pxa168: added initial support for TPO TD043MTEA1 LCD display on Aspenite Mark F. Brown 2010-08-26 2:26 ` Marek Vasut 2010-08-26 3:44 ` Mark F. Brown 2010-08-26 3:57 ` Haojian Zhuang 2010-08-26 4:02 ` Marek Vasut 2010-08-26 4:04 ` Mark F. Brown
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).