]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/video/atmel_lcdfb.c
Merge branch 'linus' into x86/pat
[linux-2.6-omap-h63xx.git] / drivers / video / atmel_lcdfb.c
index 6fcf76c12910412f56017ee3c1a5c56b9a8c2cc9..b004036d40873aec5a5c8905a626722ab8b29533 100644 (file)
@@ -31,7 +31,8 @@
 #define ATMEL_LCDC_CVAL_DEFAULT                0xc8
 #define ATMEL_LCDC_DMA_BURST_LEN       8
 
-#if defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91CAP9)
+#if defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91CAP9) || \
+       defined(CONFIG_ARCH_AT91SAM9RL)
 #define ATMEL_LCDC_FIFO_SIZE           2048
 #else
 #define ATMEL_LCDC_FIFO_SIZE           512
@@ -338,19 +339,35 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,
                break;
        case 15:
        case 16:
-               var->red.offset = 0;
+               if (sinfo->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) {
+                       /* RGB:565 mode */
+                       var->red.offset = 11;
+                       var->blue.offset = 0;
+                       var->green.length = 6;
+               } else {
+                       /* BGR:555 mode */
+                       var->red.offset = 0;
+                       var->blue.offset = 10;
+                       var->green.length = 5;
+               }
                var->green.offset = 5;
-               var->blue.offset = 10;
-               var->red.length = var->green.length = var->blue.length = 5;
+               var->red.length = var->blue.length = 5;
                break;
        case 32:
                var->transp.offset = 24;
                var->transp.length = 8;
                /* fall through */
        case 24:
-               var->red.offset = 0;
+               if (sinfo->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) {
+                       /* RGB:888 mode */
+                       var->red.offset = 16;
+                       var->blue.offset = 0;
+               } else {
+                       /* BGR:888 mode */
+                       var->red.offset = 0;
+                       var->blue.offset = 16;
+               }
                var->green.offset = 8;
-               var->blue.offset = 16;
                var->red.length = var->green.length = var->blue.length = 8;
                break;
        default:
@@ -424,14 +441,15 @@ static int atmel_lcdfb_set_par(struct fb_info *info)
 
        value = DIV_ROUND_UP(clk_value_khz, PICOS2KHZ(info->var.pixclock));
 
-       value = (value / 2) - 1;
-       dev_dbg(info->device, "  * programming CLKVAL = 0x%08lx\n", value);
-
-       if (value <= 0) {
+       if (value < 2) {
                dev_notice(info->device, "Bypassing pixel clock divider\n");
                lcdc_writel(sinfo, ATMEL_LCDC_LCDCON1, ATMEL_LCDC_BYPASS);
        } else {
-               lcdc_writel(sinfo, ATMEL_LCDC_LCDCON1, value << ATMEL_LCDC_CLKVAL_OFFSET);
+               value = (value / 2) - 1;
+               dev_dbg(info->device, "  * programming CLKVAL = 0x%08lx\n",
+                               value);
+               lcdc_writel(sinfo, ATMEL_LCDC_LCDCON1,
+                               value << ATMEL_LCDC_CLKVAL_OFFSET);
                info->var.pixclock = KHZ2PICOS(clk_value_khz / (2 * (value + 1)));
                dev_dbg(info->device, "  updated pixclk:     %lu KHz\n",
                                        PICOS2KHZ(info->var.pixclock));
@@ -697,6 +715,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
                sinfo->atmel_lcdfb_power_control = pdata_sinfo->atmel_lcdfb_power_control;
                sinfo->guard_time = pdata_sinfo->guard_time;
                sinfo->lcdcon_is_backlight = pdata_sinfo->lcdcon_is_backlight;
+               sinfo->lcd_wiring_mode = pdata_sinfo->lcd_wiring_mode;
        } else {
                dev_err(dev, "cannot get default configuration\n");
                goto free_info;