Commit 1414fbdc authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'at91-driversLCD' of git://github.com/at91linux/linux-at91 into next/drivers

From Nicolas Ferre <nicolas.ferre@atmel.com>:

Some Atmel framebuffer driver enhancements with modification
of configuration data in ARM/AT91 and AVR32/AP7 trees.
A merge of these modifications seems easier through arm-soc
git tree nowadays.

* tag 'at91-driversLCD' of git://github.com/at91linux/linux-at91:
  ARM: at91/avr32/atmel_lcdfb: add platform device-id table
  atmel_lcdfb: move lcdcon2 register access to compute_hozval
  ARM: at91/avr32/atmel_lcdfb: add bus-clock entry
  ARM: at91: fix LCD-wiring mode
  atmel_lcdfb: fix 16-bpp modes on older SOCs
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents b7442b6c bbd44f6b
...@@ -169,6 +169,8 @@ static struct clk *periph_clocks[] __initdata = { ...@@ -169,6 +169,8 @@ static struct clk *periph_clocks[] __initdata = {
}; };
static struct clk_lookup periph_clocks_lookups[] = { static struct clk_lookup periph_clocks_lookups[] = {
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.0", &spi0_clk),
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
......
...@@ -488,7 +488,6 @@ static struct resource lcdc_resources[] = { ...@@ -488,7 +488,6 @@ static struct resource lcdc_resources[] = {
}; };
static struct platform_device at91_lcdc_device = { static struct platform_device at91_lcdc_device = {
.name = "atmel_lcdfb",
.id = 0, .id = 0,
.dev = { .dev = {
.dma_mask = &lcdc_dmamask, .dma_mask = &lcdc_dmamask,
...@@ -505,6 +504,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) ...@@ -505,6 +504,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
return; return;
} }
if (cpu_is_at91sam9g10())
at91_lcdc_device.name = "at91sam9g10-lcdfb";
else
at91_lcdc_device.name = "at91sam9261-lcdfb";
#if defined(CONFIG_FB_ATMEL_STN) #if defined(CONFIG_FB_ATMEL_STN)
at91_set_A_periph(AT91_PIN_PB0, 0); /* LCDVSYNC */ at91_set_A_periph(AT91_PIN_PB0, 0); /* LCDVSYNC */
at91_set_A_periph(AT91_PIN_PB1, 0); /* LCDHSYNC */ at91_set_A_periph(AT91_PIN_PB1, 0); /* LCDHSYNC */
......
...@@ -190,6 +190,7 @@ static struct clk_lookup periph_clocks_lookups[] = { ...@@ -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", "at91rm9200_ssc.1", &ssc1_clk),
CLKDEV_CON_DEV_ID("pclk", "fff98000.ssc", &ssc0_clk), CLKDEV_CON_DEV_ID("pclk", "fff98000.ssc", &ssc0_clk),
CLKDEV_CON_DEV_ID("pclk", "fff9c000.ssc", &ssc1_clk), CLKDEV_CON_DEV_ID("pclk", "fff9c000.ssc", &ssc1_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.0", &mmc0_clk),
CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.1", &mmc1_clk), CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.1", &mmc1_clk),
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
......
...@@ -848,7 +848,7 @@ static struct resource lcdc_resources[] = { ...@@ -848,7 +848,7 @@ static struct resource lcdc_resources[] = {
}; };
static struct platform_device at91_lcdc_device = { static struct platform_device at91_lcdc_device = {
.name = "atmel_lcdfb", .name = "at91sam9263-lcdfb",
.id = 0, .id = 0,
.dev = { .dev = {
.dma_mask = &lcdc_dmamask, .dma_mask = &lcdc_dmamask,
......
...@@ -228,6 +228,8 @@ static struct clk_lookup periph_clocks_lookups[] = { ...@@ -228,6 +228,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_ID("hclk", &macb_clk), CLKDEV_CON_ID("hclk", &macb_clk),
/* One additional fake clock for ohci */ /* One additional fake clock for ohci */
CLKDEV_CON_ID("ohci_clk", &uhphs_clk), CLKDEV_CON_ID("ohci_clk", &uhphs_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("ehci_clk", "atmel-ehci", &uhphs_clk),
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_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("pclk", "atmel_usba_udc", &udphs_clk),
......
...@@ -981,7 +981,6 @@ static struct resource lcdc_resources[] = { ...@@ -981,7 +981,6 @@ static struct resource lcdc_resources[] = {
}; };
static struct platform_device at91_lcdc_device = { static struct platform_device at91_lcdc_device = {
.name = "atmel_lcdfb",
.id = 0, .id = 0,
.dev = { .dev = {
.dma_mask = &lcdc_dmamask, .dma_mask = &lcdc_dmamask,
...@@ -997,6 +996,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) ...@@ -997,6 +996,11 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
if (!data) if (!data)
return; 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_PE0, 0); /* LCDDPWR */
at91_set_A_periph(AT91_PIN_PE2, 0); /* LCDCC */ at91_set_A_periph(AT91_PIN_PE2, 0); /* LCDCC */
......
...@@ -179,6 +179,7 @@ static struct clk *periph_clocks[] __initdata = { ...@@ -179,6 +179,7 @@ static struct clk *periph_clocks[] __initdata = {
}; };
static struct clk_lookup periph_clocks_lookups[] = { static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID("hclk", "at91sam9rl-lcdfb.0", &lcdc_clk),
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_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("pclk", "atmel_usba_udc", &udphs_clk),
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
......
...@@ -514,7 +514,7 @@ static struct resource lcdc_resources[] = { ...@@ -514,7 +514,7 @@ static struct resource lcdc_resources[] = {
}; };
static struct platform_device at91_lcdc_device = { static struct platform_device at91_lcdc_device = {
.name = "atmel_lcdfb", .name = "at91sam9rl-lcdfb",
.id = 0, .id = 0,
.dev = { .dev = {
.dma_mask = &lcdc_dmamask, .dma_mask = &lcdc_dmamask,
......
...@@ -1453,7 +1453,7 @@ static struct resource atmel_lcdfb0_resource[] = { ...@@ -1453,7 +1453,7 @@ static struct resource atmel_lcdfb0_resource[] = {
}, },
}; };
DEFINE_DEV_DATA(atmel_lcdfb, 0); 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 = { static struct clk atmel_lcdfb0_pixclk = {
.name = "lcdc_clk", .name = "lcdc_clk",
.dev = &atmel_lcdfb0_device.dev, .dev = &atmel_lcdfb0_device.dev,
...@@ -1530,6 +1530,8 @@ at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data, ...@@ -1530,6 +1530,8 @@ at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data,
memcpy(info, data, sizeof(struct atmel_lcdfb_info)); memcpy(info, data, sizeof(struct atmel_lcdfb_info));
info->default_monspecs = monspecs; info->default_monspecs = monspecs;
pdev->name = "at32ap-lcdfb";
platform_device_register(pdev); platform_device_register(pdev);
return pdev; return pdev;
...@@ -2246,7 +2248,7 @@ static __initdata struct clk *init_clocks[] = { ...@@ -2246,7 +2248,7 @@ static __initdata struct clk *init_clocks[] = {
&atmel_twi0_pclk, &atmel_twi0_pclk,
&atmel_mci0_pclk, &atmel_mci0_pclk,
#if defined(CONFIG_CPU_AT32AP7000) || defined(CONFIG_CPU_AT32AP7002) #if defined(CONFIG_CPU_AT32AP7000) || defined(CONFIG_CPU_AT32AP7002)
&atmel_lcdfb0_hck1, &atmel_lcdfb0_hclk,
&atmel_lcdfb0_pixclk, &atmel_lcdfb0_pixclk,
#endif #endif
&ssc0_pclk, &ssc0_pclk,
......
...@@ -34,6 +34,77 @@ ...@@ -34,6 +34,77 @@
#define ATMEL_LCDC_DMA_BURST_LEN 8 /* words */ #define ATMEL_LCDC_DMA_BURST_LEN 8 /* words */
#define ATMEL_LCDC_FIFO_SIZE 512 /* words */ #define ATMEL_LCDC_FIFO_SIZE 512 /* words */
struct atmel_lcdfb_config {
bool have_alt_pixclock;
bool have_hozval;
bool have_intensity_bit;
};
static struct atmel_lcdfb_config at91sam9261_config = {
.have_hozval = true,
.have_intensity_bit = true,
};
static struct atmel_lcdfb_config at91sam9263_config = {
.have_intensity_bit = true,
};
static struct atmel_lcdfb_config at91sam9g10_config = {
.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_hozval = true,
};
static const struct platform_device_id atmel_lcdfb_devtypes[] = {
{
.name = "at91sam9261-lcdfb",
.driver_data = (unsigned long)&at91sam9261_config,
}, {
.name = "at91sam9263-lcdfb",
.driver_data = (unsigned long)&at91sam9263_config,
}, {
.name = "at91sam9g10-lcdfb",
.driver_data = (unsigned long)&at91sam9g10_config,
}, {
.name = "at91sam9g45-lcdfb",
.driver_data = (unsigned long)&at91sam9g45_config,
}, {
.name = "at91sam9g45es-lcdfb",
.driver_data = (unsigned long)&at91sam9g45es_config,
}, {
.name = "at91sam9rl-lcdfb",
.driver_data = (unsigned long)&at91sam9rl_config,
}, {
.name = "at32ap-lcdfb",
.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) #if defined(CONFIG_ARCH_AT91)
#define ATMEL_LCDFB_FBINFO_DEFAULT (FBINFO_DEFAULT \ #define ATMEL_LCDFB_FBINFO_DEFAULT (FBINFO_DEFAULT \
| FBINFO_PARTIAL_PAN_OK \ | FBINFO_PARTIAL_PAN_OK \
...@@ -193,14 +264,16 @@ static struct fb_fix_screeninfo atmel_lcdfb_fix __initdata = { ...@@ -193,14 +264,16 @@ static struct fb_fix_screeninfo atmel_lcdfb_fix __initdata = {
.accel = FB_ACCEL_NONE, .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; unsigned long value;
if (!(cpu_is_at91sam9261() || cpu_is_at91sam9g10() if (!sinfo->config->have_hozval)
|| cpu_is_at32ap7000()))
return xres; return xres;
lcdcon2 = lcdc_readl(sinfo, ATMEL_LCDC_LCDCON2);
value = xres; value = xres;
if ((lcdcon2 & ATMEL_LCDC_DISTYPE) != ATMEL_LCDC_DISTYPE_TFT) { if ((lcdcon2 & ATMEL_LCDC_DISTYPE) != ATMEL_LCDC_DISTYPE_TFT) {
/* STN display */ /* STN display */
...@@ -422,17 +495,22 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var, ...@@ -422,17 +495,22 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,
= var->bits_per_pixel; = var->bits_per_pixel;
break; break;
case 16: case 16:
/* Older SOCs use IBGR:555 rather than BGR:565. */
if (sinfo->config->have_intensity_bit)
var->green.length = 5;
else
var->green.length = 6;
if (sinfo->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) { if (sinfo->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) {
/* RGB:565 mode */ /* RGB:5X5 mode */
var->red.offset = 11; var->red.offset = var->green.length + 5;
var->blue.offset = 0; var->blue.offset = 0;
} else { } else {
/* BGR:565 mode */ /* BGR:5X5 mode */
var->red.offset = 0; var->red.offset = 0;
var->blue.offset = 11; var->blue.offset = var->green.length + 5;
} }
var->green.offset = 5; var->green.offset = 5;
var->green.length = 6;
var->red.length = var->blue.length = 5; var->red.length = var->blue.length = 5;
break; break;
case 32: case 32:
...@@ -526,7 +604,7 @@ static int atmel_lcdfb_set_par(struct fb_info *info) ...@@ -526,7 +604,7 @@ static int atmel_lcdfb_set_par(struct fb_info *info)
/* Now, the LCDC core... */ /* Now, the LCDC core... */
/* Set pixel clock */ /* Set pixel clock */
if (cpu_is_at91sam9g45() && !cpu_is_at91sam9g45es()) if (sinfo->config->have_alt_pixclock)
pix_factor = 1; pix_factor = 1;
clk_value_khz = clk_get_rate(sinfo->lcdc_clk) / 1000; clk_value_khz = clk_get_rate(sinfo->lcdc_clk) / 1000;
...@@ -586,8 +664,7 @@ static int atmel_lcdfb_set_par(struct fb_info *info) ...@@ -586,8 +664,7 @@ static int atmel_lcdfb_set_par(struct fb_info *info)
lcdc_writel(sinfo, ATMEL_LCDC_TIM2, value); lcdc_writel(sinfo, ATMEL_LCDC_TIM2, value);
/* Horizontal value (aka line size) */ /* Horizontal value (aka line size) */
hozval_linesz = compute_hozval(info->var.xres, hozval_linesz = compute_hozval(sinfo, info->var.xres);
lcdc_readl(sinfo, ATMEL_LCDC_LCDCON2));
/* Display size */ /* Display size */
value = (hozval_linesz - 1) << ATMEL_LCDC_HOZVAL_OFFSET; value = (hozval_linesz - 1) << ATMEL_LCDC_HOZVAL_OFFSET;
...@@ -679,8 +756,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red, ...@@ -679,8 +756,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red,
case FB_VISUAL_PSEUDOCOLOR: case FB_VISUAL_PSEUDOCOLOR:
if (regno < 256) { if (regno < 256) {
if (cpu_is_at91sam9261() || cpu_is_at91sam9263() if (sinfo->config->have_intensity_bit) {
|| cpu_is_at91sam9rl()) {
/* old style I+BGR:555 */ /* old style I+BGR:555 */
val = ((red >> 11) & 0x001f); val = ((red >> 11) & 0x001f);
val |= ((green >> 6) & 0x03e0); val |= ((green >> 6) & 0x03e0);
...@@ -817,15 +893,13 @@ static int __init atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo) ...@@ -817,15 +893,13 @@ static int __init atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)
static void atmel_lcdfb_start_clock(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); clk_enable(sinfo->lcdc_clk);
} }
static void atmel_lcdfb_stop_clock(struct atmel_lcdfb_info *sinfo) 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); clk_disable(sinfo->lcdc_clk);
} }
...@@ -870,6 +944,9 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) ...@@ -870,6 +944,9 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
} }
sinfo->info = info; sinfo->info = info;
sinfo->pdev = pdev; sinfo->pdev = pdev;
sinfo->config = atmel_lcdfb_get_config(pdev);
if (!sinfo->config)
goto free_info;
strcpy(info->fix.id, sinfo->pdev->name); strcpy(info->fix.id, sinfo->pdev->name);
info->flags = ATMEL_LCDFB_FBINFO_DEFAULT; info->flags = ATMEL_LCDFB_FBINFO_DEFAULT;
...@@ -880,13 +957,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) ...@@ -880,13 +957,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
info->fix = atmel_lcdfb_fix; info->fix = atmel_lcdfb_fix;
/* Enable LCDC Clocks */ /* Enable LCDC Clocks */
if (cpu_is_at91sam9261() || cpu_is_at91sam9g10() sinfo->bus_clk = clk_get(dev, "hclk");
|| cpu_is_at32ap7000()) { if (IS_ERR(sinfo->bus_clk)) {
sinfo->bus_clk = clk_get(dev, "hck1"); ret = PTR_ERR(sinfo->bus_clk);
if (IS_ERR(sinfo->bus_clk)) { goto free_info;
ret = PTR_ERR(sinfo->bus_clk);
goto free_info;
}
} }
sinfo->lcdc_clk = clk_get(dev, "lcdc_clk"); sinfo->lcdc_clk = clk_get(dev, "lcdc_clk");
if (IS_ERR(sinfo->lcdc_clk)) { if (IS_ERR(sinfo->lcdc_clk)) {
...@@ -1047,8 +1121,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) ...@@ -1047,8 +1121,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
atmel_lcdfb_stop_clock(sinfo); atmel_lcdfb_stop_clock(sinfo);
clk_put(sinfo->lcdc_clk); clk_put(sinfo->lcdc_clk);
put_bus_clk: put_bus_clk:
if (sinfo->bus_clk) clk_put(sinfo->bus_clk);
clk_put(sinfo->bus_clk);
free_info: free_info:
framebuffer_release(info); framebuffer_release(info);
out: out:
...@@ -1073,8 +1146,7 @@ static int __exit atmel_lcdfb_remove(struct platform_device *pdev) ...@@ -1073,8 +1146,7 @@ static int __exit atmel_lcdfb_remove(struct platform_device *pdev)
unregister_framebuffer(info); unregister_framebuffer(info);
atmel_lcdfb_stop_clock(sinfo); atmel_lcdfb_stop_clock(sinfo);
clk_put(sinfo->lcdc_clk); clk_put(sinfo->lcdc_clk);
if (sinfo->bus_clk) clk_put(sinfo->bus_clk);
clk_put(sinfo->bus_clk);
fb_dealloc_cmap(&info->cmap); fb_dealloc_cmap(&info->cmap);
free_irq(sinfo->irq_base, info); free_irq(sinfo->irq_base, info);
iounmap(sinfo->mmio); iounmap(sinfo->mmio);
...@@ -1143,7 +1215,7 @@ static struct platform_driver atmel_lcdfb_driver = { ...@@ -1143,7 +1215,7 @@ static struct platform_driver atmel_lcdfb_driver = {
.remove = __exit_p(atmel_lcdfb_remove), .remove = __exit_p(atmel_lcdfb_remove),
.suspend = atmel_lcdfb_suspend, .suspend = atmel_lcdfb_suspend,
.resume = atmel_lcdfb_resume, .resume = atmel_lcdfb_resume,
.id_table = atmel_lcdfb_devtypes,
.driver = { .driver = {
.name = "atmel_lcdfb", .name = "atmel_lcdfb",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -30,8 +30,8 @@ ...@@ -30,8 +30,8 @@
*/ */
#define ATMEL_LCDC_WIRING_BGR 0 #define ATMEL_LCDC_WIRING_BGR 0
#define ATMEL_LCDC_WIRING_RGB 1 #define ATMEL_LCDC_WIRING_RGB 1
#define ATMEL_LCDC_WIRING_RGB555 2
struct atmel_lcdfb_config;
/* LCD Controller info data structure, stored in device platform_data */ /* LCD Controller info data structure, stored in device platform_data */
struct atmel_lcdfb_info { struct atmel_lcdfb_info {
...@@ -62,6 +62,8 @@ struct atmel_lcdfb_info { ...@@ -62,6 +62,8 @@ struct atmel_lcdfb_info {
void (*atmel_lcdfb_power_control)(int on); void (*atmel_lcdfb_power_control)(int on);
struct fb_monspecs *default_monspecs; struct fb_monspecs *default_monspecs;
u32 pseudo_palette[16]; u32 pseudo_palette[16];
struct atmel_lcdfb_config *config;
}; };
#define ATMEL_LCDC_DMABADDR1 0x00 #define ATMEL_LCDC_DMABADDR1 0x00
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment