Adds different wiring mode for the LCD screen.
The legacy atmel LCDC IP uses a non standard color mode, "BGR-555.1" instead
"RGB-565".  The major part of graphic stacks for embedded systems uses only
"RGB-565".  It is possible to swap LCD IOs instead of doing this bit swapping
by software (See application note AT91SAM9 LCD Controller
http://www.atmel.com/dyn/resources/prod_documents/doc6300.pdf)
This wire swapping is done on the at91sam9rl-ek board (board code
using this patch will come later).
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Cc: Hans-Christian Egtvedt <hcegtvedt@atmel.com>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Andrew Victor <avictor.za@gmail.com>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
                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:
                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;
 
 #ifndef __ATMEL_LCDC_H__
 #define __ATMEL_LCDC_H__
 
+
+/* Way LCD wires are connected to the chip:
+ * Some Atmel chips use BGR color mode (instead of standard RGB)
+ * A swapped wiring onboard can bring to RGB mode.
+ */
+#define ATMEL_LCDC_WIRING_BGR  0
+#define ATMEL_LCDC_WIRING_RGB  1
+
+
  /* LCD Controller info data structure, stored in device platform_data */
 struct atmel_lcdfb_info {
        spinlock_t              lock;
        u8                      saved_lcdcon;
 
        u8                      default_bpp;
+       u8                      lcd_wiring_mode;
        unsigned int            default_lcdcon2;
        unsigned int            default_dmacon;
        void (*atmel_lcdfb_power_control)(int on);