i.MX Framebuffer: add TFT support
authorSascha Hauer <s.hauer@pengutronix.de>
Tue, 16 Dec 2008 10:44:09 +0000 (11:44 +0100)
committerSascha Hauer <s.hauer@pengutronix.de>
Tue, 16 Dec 2008 14:43:50 +0000 (15:43 +0100)
With TFTs we can do 5/6/5 instead of 4/4/4. Add a bitfield for this
and use it with TFTs.

Acked-by: Krzysztof Helt <krzysztof.h1@poczta.fm>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
drivers/video/imxfb.c

index 3d1db003f9958c28183375bde4ebbe91758ddedc..d58c68cd456eda0c9aea90c5f566cfab06fc4cdf 100644 (file)
@@ -116,16 +116,10 @@ struct imxfb_rgb {
        struct fb_bitfield      transp;
 };
 
-#define RGB_16 (0)
-#define RGB_8  (1)
-#define NR_RGB 2
-
 struct imxfb_info {
        struct platform_device  *pdev;
        void __iomem            *regs;
 
-       struct imxfb_rgb        *rgb[NR_RGB];
-
        u_int                   max_bpp;
        u_int                   max_xres;
        u_int                   max_yres;
@@ -165,7 +159,14 @@ struct imxfb_info {
 #define MIN_XRES       64
 #define MIN_YRES       64
 
-static struct imxfb_rgb def_rgb_16 = {
+static struct imxfb_rgb def_rgb_16_tft = {
+       .red    = {.offset = 11, .length = 5,},
+       .green  = {.offset = 5, .length = 6,},
+       .blue   = {.offset = 0, .length = 5,},
+       .transp = {.offset = 0, .length = 0,},
+};
+
+static struct imxfb_rgb def_rgb_16_stn = {
        .red    = {.offset = 8, .length = 4,},
        .green  = {.offset = 4, .length = 4,},
        .blue   = {.offset = 0, .length = 4,},
@@ -270,7 +271,7 @@ static int imxfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
 static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
 {
        struct imxfb_info *fbi = info->par;
-       int rgbidx;
+       struct imxfb_rgb *rgb;
 
        if (var->xres < MIN_XRES)
                var->xres = MIN_XRES;
@@ -286,23 +287,25 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
        pr_debug("var->bits_per_pixel=%d\n", var->bits_per_pixel);
        switch (var->bits_per_pixel) {
        case 16:
-               rgbidx = RGB_16;
+       default:
+               if (readl(fbi->regs + LCDC_PCR) & PCR_TFT)
+                       rgb = &def_rgb_16_tft;
+               else
+                       rgb = &def_rgb_16_stn;
                break;
        case 8:
-               rgbidx = RGB_8;
+               rgb = &def_rgb_8;
                break;
-       default:
-               rgbidx = RGB_16;
        }
 
        /*
         * Copy the RGB parameters for this display
         * from the machine specific parameters.
         */
-       var->red    = fbi->rgb[rgbidx]->red;
-       var->green  = fbi->rgb[rgbidx]->green;
-       var->blue   = fbi->rgb[rgbidx]->blue;
-       var->transp = fbi->rgb[rgbidx]->transp;
+       var->red    = rgb->red;
+       var->green  = rgb->green;
+       var->blue   = rgb->blue;
+       var->transp = rgb->transp;
 
        pr_debug("RGBT length = %d:%d:%d:%d\n",
                var->red.length, var->green.length, var->blue.length,
@@ -545,9 +548,6 @@ static int __init imxfb_init_fbinfo(struct platform_device *pdev)
        info->flags                     = FBINFO_FLAG_DEFAULT |
                                          FBINFO_READS_FAST;
 
-       fbi->rgb[RGB_16]                = &def_rgb_16;
-       fbi->rgb[RGB_8]                 = &def_rgb_8;
-
        fbi->max_xres                   = pdata->xres;
        info->var.xres                  = pdata->xres;
        info->var.xres_virtual          = pdata->xres;