diff --git a/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c b/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c index 25bf40c..76d6f5b 100644 --- a/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c +++ b/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c @@ -56,22 +56,18 @@ .hw_ecc = 1, }; -static struct imx_fb_videomode imxfb_mode = { - .mode = { - .name = "CMO-QVGA", - .refresh = 60, - .xres = 320, - .yres = 240, - .pixclock = KHZ2PICOS(6500), - .hsync_len = 30, - .left_margin = 38, - .right_margin = 20, - .vsync_len = 3, - .upper_margin = 15, - .lower_margin = 4, - }, - .pcr = 0xCAD08B80, - .bpp = 16, +static struct fb_videomode imxfb_mode = { + .name = "CMO-QVGA", + .refresh = 60, + .xres = 320, + .yres = 240, + .pixclock = KHZ2PICOS(6500), + .hsync_len = 30, + .left_margin = 38, + .right_margin = 20, + .vsync_len = 3, + .upper_margin = 15, + .lower_margin = 4, }; static struct imx_fb_platform_data eukrea_cpuimx25_fb_data = { @@ -80,6 +76,8 @@ .pwmr = 0x00A903FF, .lscr1 = 0x00120300, .dmacr = 0x80040060, + .pcr = 0xCAD08B80, + .bpp = 16, }; struct gpio_led led0 = { diff --git a/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c b/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c index 63034e2..52971ed 100644 --- a/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c +++ b/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c @@ -80,22 +80,19 @@ }; #ifdef CONFIG_DRIVER_VIDEO_IMX -static struct imx_fb_videomode imxfb_mode = { - .mode = { - .name = "CMO-QVGA", - .refresh = 60, - .xres = 320, - .yres = 240, - .pixclock = 156000, - .hsync_len = 30, - .left_margin = 38, - .right_margin = 20, - .vsync_len = 3, - .upper_margin = 15, - .lower_margin = 4, - }, - .pcr = 0xFAD08B80, - .bpp = 16,}; +static struct fb_videomode imxfb_mode = { + .name = "CMO-QVGA", + .refresh = 60, + .xres = 320, + .yres = 240, + .pixclock = 156000, + .hsync_len = 30, + .left_margin = 38, + .right_margin = 20, + .vsync_len = 3, + .upper_margin = 15, + .lower_margin = 4, +}; static struct imx_fb_platform_data eukrea_cpuimx27_fb_data = { .mode = &imxfb_mode, @@ -103,6 +100,8 @@ .pwmr = 0x00A903FF, .lscr1 = 0x00120300, .dmacr = 0x00020010, + .pcr = 0xFAD08B80, + .bpp = 16, }; #endif diff --git a/arch/arm/boards/freescale-mx21-ads/imx21ads.c b/arch/arm/boards/freescale-mx21-ads/imx21ads.c index aa654da..2c54cd7 100644 --- a/arch/arm/boards/freescale-mx21-ads/imx21ads.c +++ b/arch/arm/boards/freescale-mx21-ads/imx21ads.c @@ -47,24 +47,20 @@ }; /* Sharp LQ035Q7DB02 QVGA display */ -static struct imx_fb_videomode imx_fb_modedata = { - .mode = { - .name = "Sharp-LQ035Q7", - .refresh = 60, - .xres = 240, - .yres = 320, - .pixclock = 188679, - .left_margin = 6, - .right_margin = 16, - .upper_margin = 8, - .lower_margin = 10, - .hsync_len = 2, - .vsync_len = 1, - .sync = 0, - .vmode = FB_VMODE_NONINTERLACED, - }, - .pcr = 0xfb108bc7, - .bpp = 16, +static struct fb_videomode imx_fb_modedata = { + .name = "Sharp-LQ035Q7", + .refresh = 60, + .xres = 240, + .yres = 320, + .pixclock = 188679, + .left_margin = 6, + .right_margin = 16, + .upper_margin = 8, + .lower_margin = 10, + .hsync_len = 2, + .vsync_len = 1, + .sync = 0, + .vmode = FB_VMODE_NONINTERLACED, }; static struct imx_fb_platform_data imx_fb_data = { @@ -76,6 +72,8 @@ .pwmr = 0x00a903ff, .lscr1 = 0x00120300, .dmacr = 0x00020008, + .pcr = 0xfb108bc7, + .bpp = 16, }; static int imx21ads_timing_init(void) diff --git a/arch/arm/boards/guf-neso/board.c b/arch/arm/boards/guf-neso/board.c index 2a64bc1..6846ba5 100644 --- a/arch/arm/boards/guf-neso/board.c +++ b/arch/arm/boards/guf-neso/board.c @@ -62,36 +62,18 @@ .flash_bbt = 1, }; -static struct imx_fb_videomode imxfb_mode = { - .mode = { - .name = "CPT CLAA070LC0JCT", - .refresh = 60, - .xres = 800, - .yres = 480, - .pixclock = KHZ2PICOS(27000), - .hsync_len = 1, /* DE only sync */ - .left_margin = 50, - .right_margin = 50, - .vsync_len = 1, /* DE only sync */ - .upper_margin = 10, - .lower_margin = 10, - }, - /* - * - TFT style panel - * - clk enabled while idle - * - clock inverted - * - data not inverted - * - data enable high active - */ - .pcr = PCR_TFT | - PCR_COLOR | - PCR_PBSIZ_8 | - PCR_BPIX_16 | - PCR_CLKPOL | - PCR_SCLK_SEL | - PCR_LPPOL | - PCR_FLMPOL, - .bpp = 16, /* TODO 32 bit does not work: The 'green' component is lacking in this mode */ +static struct fb_videomode imxfb_mode = { + .name = "CPT CLAA070LC0JCT", + .refresh = 60, + .xres = 800, + .yres = 480, + .pixclock = KHZ2PICOS(27000), + .hsync_len = 1, /* DE only sync */ + .left_margin = 50, + .right_margin = 50, + .vsync_len = 1, /* DE only sync */ + .upper_margin = 10, + .lower_margin = 10, }; static void neso_fb_enable(int enable) @@ -109,6 +91,22 @@ .dmacr = (0 << 31) | (4 << 16) | 96, .enable = neso_fb_enable, .framebuffer_ovl = (void *)0xa7f00000, + /* + * - TFT style panel + * - clk enabled while idle + * - clock inverted + * - data not inverted + * - data enable high active + */ + .pcr = PCR_TFT | + PCR_COLOR | + PCR_PBSIZ_8 | + PCR_BPIX_16 | + PCR_CLKPOL | + PCR_SCLK_SEL | + PCR_LPPOL | + PCR_FLMPOL, + .bpp = 16, /* TODO 32 bit does not work: The 'green' component is lacking in this mode */ }; #if defined(CONFIG_USB) && defined(CONFIG_USB_ULPI) diff --git a/arch/arm/boards/karo-tx25/board.c b/arch/arm/boards/karo-tx25/board.c index ebebd58..a4d4af5 100644 --- a/arch/arm/boards/karo-tx25/board.c +++ b/arch/arm/boards/karo-tx25/board.c @@ -125,24 +125,20 @@ MX25_PAD_OE_ACD__OE_ACD, }; -static struct imx_fb_videomode stk5_fb_mode = { - .bpp = 16, - .mode = { - .name = "G-ETV570G0DMU", - .pixclock = 33333, +static struct fb_videomode stk5_fb_mode = { + .name = "G-ETV570G0DMU", + .pixclock = 33333, - .xres = 640, - .yres = 480, + .xres = 640, + .yres = 480, - .hsync_len = 64, - .left_margin = 96, - .right_margin = 80, + .hsync_len = 64, + .left_margin = 96, + .right_margin = 80, - .vsync_len = 3, - .upper_margin = 46, - .lower_margin = 39, - }, - .pcr = PCR_TFT | PCR_COLOR | PCR_FLMPOL | PCR_LPPOL | PCR_SCLK_SEL, + .vsync_len = 3, + .upper_margin = 46, + .lower_margin = 39, }; #define STK5_LCD_BACKLIGHT_GPIO IMX_GPIO_NR(1, 26) @@ -168,6 +164,8 @@ .num_modes = 1, .dmacr = 0x80040060, .enable = tx25_fb_enable, + .bpp = 16, + .pcr = PCR_TFT | PCR_COLOR | PCR_FLMPOL | PCR_LPPOL | PCR_SCLK_SEL, }; static int tx25_init_fb(void) diff --git a/arch/arm/boards/phytec-phycore-imx27/pcm038.c b/arch/arm/boards/phytec-phycore-imx27/pcm038.c index 5ebef51..008346f 100644 --- a/arch/arm/boards/phytec-phycore-imx27/pcm038.c +++ b/arch/arm/boards/phytec-phycore-imx27/pcm038.c @@ -34,20 +34,26 @@ #define PCM038_GPIO_OTG_STP (GPIO_PORTE + 1) -static struct imx_fb_videomode imxfb_mode = { - .mode = { - .name = "Sharp-LQ035Q7", - .refresh = 60, - .xres = 240, - .yres = 320, - .pixclock = 188679, /* in ps (5.3MHz) */ - .hsync_len = 7, - .left_margin = 5, - .right_margin = 16, - .vsync_len = 1, - .upper_margin = 7, - .lower_margin = 9, - }, +static struct fb_videomode imxfb_mode = { + .name = "Sharp-LQ035Q7", + .refresh = 60, + .xres = 240, + .yres = 320, + .pixclock = 188679, /* in ps (5.3MHz) */ + .hsync_len = 7, + .left_margin = 5, + .right_margin = 16, + .vsync_len = 1, + .upper_margin = 7, + .lower_margin = 9, +}; + +static struct imx_fb_platform_data pcm038_fb_data = { + .mode = &imxfb_mode, + .num_modes = 1, + .pwmr = 0x00a903ff, + .lscr1 = 0x00120300, + .dmacr = 0x00020010, /* * - HSYNC active high * - VSYNC active high @@ -57,16 +63,8 @@ * - data enable low active * - enable sharp mode */ - .pcr = 0xf00080c0, - .bpp = 16, -}; - -static struct imx_fb_platform_data pcm038_fb_data = { - .mode = &imxfb_mode, - .num_modes = 1, - .pwmr = 0x00a903ff, - .lscr1 = 0x00120300, - .dmacr = 0x00020010, + .pcr = 0xf00080c0, + .bpp = 16, }; static const unsigned int pcm038_pins[] = { diff --git a/arch/arm/mach-imx/include/mach/imxfb.h b/arch/arm/mach-imx/include/mach/imxfb.h index ea39e31..6df7a14 100644 --- a/arch/arm/mach-imx/include/mach/imxfb.h +++ b/arch/arm/mach-imx/include/mach/imxfb.h @@ -52,17 +52,11 @@ #define DMACR_HM(x) (((x) & 0xf) << 16) #define DMACR_TM(x) ((x) & 0xf) -struct imx_fb_videomode { - struct fb_videomode mode; - u32 pcr; - unsigned char bpp; -}; - /** * Define relevant framebuffer information */ struct imx_fb_platform_data { - struct imx_fb_videomode *mode; + struct fb_videomode *mode; u_int num_modes; u_int cmap_greyscale:1, @@ -73,6 +67,8 @@ u_int pwmr; u_int lscr1; u_int dmacr; + u32 pcr; + unsigned char bpp; /** force a memory area to be used, else NULL for dynamic allocation */ void *framebuffer; diff --git a/drivers/video/imx.c b/drivers/video/imx.c index 947f8d5..d15c2d8 100644 --- a/drivers/video/imx.c +++ b/drivers/video/imx.c @@ -152,8 +152,6 @@ cmap_static:1, unused:30; - struct imx_fb_videomode *mode; - struct fb_info info; struct device_d *dev; @@ -293,14 +291,6 @@ unsigned long long tmp; struct imxfb_info *fbi = info->priv; u32 pcr; - int i; - - for (i = 0; i < info->modes.num_modes; i++) { - if (!strcmp(fbi->mode[i].mode.name, mode->name)) { - fbi->pcr = fbi->mode[i].pcr; - break; - } - } /* physical screen start address */ writel(VPW_VPW(mode->xres * info->bits_per_pixel / 8 / 4), @@ -556,7 +546,7 @@ mode_list = xzalloc(sizeof(*mode_list) * pdata->num_modes); for (i = 0; i < pdata->num_modes; i++) - mode_list[i] = pdata->mode[i].mode; + mode_list[i] = pdata->mode[i]; fbi = xzalloc(sizeof(*fbi)); info = &fbi->info; @@ -573,13 +563,12 @@ if (IS_ERR(fbi->ipg_clk)) return PTR_ERR(fbi->ipg_clk); - fbi->mode = pdata->mode; iores = dev_request_mem_resource(dev, 0); if (IS_ERR(iores)) return PTR_ERR(iores); fbi->regs = IOMEM(iores->start); - fbi->pcr = pdata->mode->pcr; + fbi->pcr = pdata->pcr; fbi->pwmr = pdata->pwmr; fbi->lscr1 = pdata->lscr1; fbi->dmacr = pdata->dmacr; @@ -588,10 +577,10 @@ info->priv = fbi; info->modes.modes = mode_list; info->modes.num_modes = pdata->num_modes; - info->mode = &pdata->mode->mode; - info->xres = pdata->mode->mode.xres; - info->yres = pdata->mode->mode.yres; - info->bits_per_pixel = pdata->mode->bpp; + info->mode = pdata->mode; + info->xres = pdata->mode->xres; + info->yres = pdata->mode->yres; + info->bits_per_pixel = pdata->bpp; info->fbops = &imxfb_ops; dev_info(dev, "i.MX Framebuffer driver\n");