Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6
[sfrench/cifs-2.6.git] / drivers / video / imxfb.c
index 25323ea33a54d594967f095d4819027c7857c046..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,
@@ -513,7 +516,7 @@ static int imxfb_resume(struct platform_device *dev)
 
 static int __init imxfb_init_fbinfo(struct platform_device *pdev)
 {
-       struct imxfb_mach_info *inf = pdev->dev.platform_data;
+       struct imx_fb_platform_data *pdata = pdev->dev.platform_data;
        struct fb_info *info = dev_get_drvdata(&pdev->dev);
        struct imxfb_info *fbi = info->par;
 
@@ -545,35 +548,32 @@ 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                   = inf->xres;
-       info->var.xres                  = inf->xres;
-       info->var.xres_virtual          = inf->xres;
-       fbi->max_yres                   = inf->yres;
-       info->var.yres                  = inf->yres;
-       info->var.yres_virtual          = inf->yres;
-       fbi->max_bpp                    = inf->bpp;
-       info->var.bits_per_pixel        = inf->bpp;
-       info->var.nonstd                = inf->nonstd;
-       info->var.pixclock              = inf->pixclock;
-       info->var.hsync_len             = inf->hsync_len;
-       info->var.left_margin           = inf->left_margin;
-       info->var.right_margin          = inf->right_margin;
-       info->var.vsync_len             = inf->vsync_len;
-       info->var.upper_margin          = inf->upper_margin;
-       info->var.lower_margin          = inf->lower_margin;
-       info->var.sync                  = inf->sync;
-       info->var.grayscale             = inf->cmap_greyscale;
-       fbi->cmap_inverse               = inf->cmap_inverse;
-       fbi->cmap_static                = inf->cmap_static;
-       fbi->pcr                        = inf->pcr;
-       fbi->lscr1                      = inf->lscr1;
-       fbi->dmacr                      = inf->dmacr;
-       fbi->pwmr                       = inf->pwmr;
-       fbi->lcd_power                  = inf->lcd_power;
-       fbi->backlight_power            = inf->backlight_power;
+       fbi->max_xres                   = pdata->xres;
+       info->var.xres                  = pdata->xres;
+       info->var.xres_virtual          = pdata->xres;
+       fbi->max_yres                   = pdata->yres;
+       info->var.yres                  = pdata->yres;
+       info->var.yres_virtual          = pdata->yres;
+       fbi->max_bpp                    = pdata->bpp;
+       info->var.bits_per_pixel        = pdata->bpp;
+       info->var.nonstd                = pdata->nonstd;
+       info->var.pixclock              = pdata->pixclock;
+       info->var.hsync_len             = pdata->hsync_len;
+       info->var.left_margin           = pdata->left_margin;
+       info->var.right_margin          = pdata->right_margin;
+       info->var.vsync_len             = pdata->vsync_len;
+       info->var.upper_margin          = pdata->upper_margin;
+       info->var.lower_margin          = pdata->lower_margin;
+       info->var.sync                  = pdata->sync;
+       info->var.grayscale             = pdata->cmap_greyscale;
+       fbi->cmap_inverse               = pdata->cmap_inverse;
+       fbi->cmap_static                = pdata->cmap_static;
+       fbi->pcr                        = pdata->pcr;
+       fbi->lscr1                      = pdata->lscr1;
+       fbi->dmacr                      = pdata->dmacr;
+       fbi->pwmr                       = pdata->pwmr;
+       fbi->lcd_power                  = pdata->lcd_power;
+       fbi->backlight_power            = pdata->backlight_power;
        info->fix.smem_len              = fbi->max_xres * fbi->max_yres *
                                          fbi->max_bpp / 8;
 
@@ -584,7 +584,7 @@ static int __init imxfb_probe(struct platform_device *pdev)
 {
        struct imxfb_info *fbi;
        struct fb_info *info;
-       struct imxfb_mach_info *inf;
+       struct imx_fb_platform_data *pdata;
        struct resource *res;
        int ret;
 
@@ -594,8 +594,8 @@ static int __init imxfb_probe(struct platform_device *pdev)
        if (!res)
                return -ENODEV;
 
-       inf = pdev->dev.platform_data;
-       if (!inf) {
+       pdata = pdev->dev.platform_data;
+       if (!pdata) {
                dev_err(&pdev->dev,"No platform_data available\n");
                return -ENOMEM;
        }
@@ -625,7 +625,7 @@ static int __init imxfb_probe(struct platform_device *pdev)
                goto failed_ioremap;
        }
 
-       if (!inf->fixed_screen_cpu) {
+       if (!pdata->fixed_screen_cpu) {
                fbi->map_size = PAGE_ALIGN(info->fix.smem_len);
                fbi->map_cpu = dma_alloc_writecombine(&pdev->dev,
                                fbi->map_size, &fbi->map_dma, GFP_KERNEL);
@@ -642,8 +642,8 @@ static int __init imxfb_probe(struct platform_device *pdev)
                info->fix.smem_start = fbi->screen_dma;
        } else {
                /* Fixed framebuffer mapping enables location of the screen in eSRAM */
-               fbi->map_cpu = inf->fixed_screen_cpu;
-               fbi->map_dma = inf->fixed_screen_dma;
+               fbi->map_cpu = pdata->fixed_screen_cpu;
+               fbi->map_dma = pdata->fixed_screen_dma;
                info->screen_base = fbi->map_cpu;
                fbi->screen_cpu = fbi->map_cpu;
                fbi->screen_dma = fbi->map_dma;
@@ -674,7 +674,7 @@ static int __init imxfb_probe(struct platform_device *pdev)
 failed_register:
        fb_dealloc_cmap(&info->cmap);
 failed_cmap:
-       if (!inf->fixed_screen_cpu)
+       if (!pdata->fixed_screen_cpu)
                dma_free_writecombine(&pdev->dev,fbi->map_size,fbi->map_cpu,
                        fbi->map_dma);
 failed_map: