]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[PATCH] ARM: OMAP: add-RGB444-support-to-omapfb.patch
authorMark Underwood <basicmark@yahoo.com>
Fri, 26 May 2006 22:42:03 +0000 (15:42 -0700)
committerTony Lindgren <tony@atomide.com>
Fri, 26 May 2006 22:42:03 +0000 (15:42 -0700)
This is an updated version of my patch that adds support for RGB444 mode
for the internal LCD controller which now applies against linux-2.6.16
with the patch-2.6.16-omap2 applied.

Jonathan McDowell posted a slightly modified version of my original patch
to this list previously:

http://Linux.omap.com/pipermail/linux-omap-open-source/2006-April/006839.html

This patch is used by the Amstrad Delta (E3).

Signed-off-by: Mark Underwood <basicmark@yahoo.com>
Acked-by: Jonathan McDowell <noodles@earth.li>
Signed-off-by: Imre Deak <imre.deak@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/video/omap/lcdc.c
drivers/video/omap/omapfb_main.c
include/asm-arm/arch-omap/omapfb.h

index bfe94784cbf6952eb497e21ee1bbd0ae3dd0b428..a86cd73fa9167e926900281eca344d4dcf2dfae9 100644 (file)
@@ -357,6 +357,11 @@ static int omap_lcdc_setup_plane(int plane, int channel_out,
                omap_lcdc.palette_code = 0x4000;
                omap_lcdc.palette_size = 32;
                break;
+       case OMAPFB_COLOR_RGB444:
+               omap_lcdc.bpp = 16;
+               omap_lcdc.palette_code = 0x4000;
+               omap_lcdc.palette_size = 32;
+               break;
        case OMAPFB_COLOR_YUV420:
                if (omap_lcdc.ext_mode) {
                        omap_lcdc.bpp = 12;
@@ -764,7 +769,10 @@ static int setup_fbmem(int req_size)
                return 0;
        }
 
-       frame_size = PAGE_ALIGN(panel->x_res * panel->bpp / 8 * panel->y_res);
+       if (panel->bpp == 12)
+               frame_size = PAGE_ALIGN(panel->x_res * 16 / 8 * panel->y_res);
+       else
+               frame_size = PAGE_ALIGN(panel->x_res * panel->bpp / 8 * panel->y_res);
 
        if (conf->fbmem.fb_sdram_size < frame_size) {
                pr_err("invalid FB memory configuration\n");
index 3ac4795aafb644438618260addd3d1e7154e174a..dd34c7ab0e4eda984caa5abd713266ed57d89ee6 100644 (file)
@@ -223,6 +223,7 @@ static int _setcolreg(struct fb_info *info, u_int regno, u_int red, u_int green,
                        u_int blue, u_int transp, int update_hw_pal)
 {
        struct omapfb_device *fbdev = (struct omapfb_device *)info->par;
+       struct fb_var_screeninfo *var = &info->var;
        int r = 0;
 
        switch (fbdev->color_mode) {
@@ -239,6 +240,7 @@ static int _setcolreg(struct fb_info *info, u_int regno, u_int red, u_int green,
                                                        transp, update_hw_pal);
                /* Fallthrough */
        case OMAPFB_COLOR_RGB565:
+       case OMAPFB_COLOR_RGB444:
                if (r != 0)
                        break;
 
@@ -249,8 +251,9 @@ static int _setcolreg(struct fb_info *info, u_int regno, u_int red, u_int green,
 
                if (regno < 16) {
                        u16 pal;
-                       pal = ((red >> 11) << 11) | ((green >> 10) << 5) |
-                               (blue >> 11);
+                       pal = ((red >> (16 - var->red.length)) << var->red.offset) |
+                               ((green >> (16 - var->green.length)) << var->green.offset) |
+                               (blue >> (16 - var->blue.length));
                        ((u32 *)(info->pseudo_palette))[regno] = pal;
                }
                break;
@@ -402,12 +405,18 @@ static int set_fb_var(struct omapfb_device *fbdev,
        unsigned long   line_size;
        struct lcd_panel *panel = fbdev->panel;
 
-       bpp = var->bits_per_pixel = panel->bpp;
+       if (panel->bpp == 12)
+               bpp = var->bits_per_pixel = 16; /* 12-bit bpp mode stores colours in 16-bits */
+       else
+               bpp = var->bits_per_pixel = panel->bpp;
 
-       switch (bpp) {
+       switch (panel->bpp) {
        case 16:
                fbdev->color_mode = OMAPFB_COLOR_RGB565;
                break;
+       case 12:
+               fbdev->color_mode = OMAPFB_COLOR_RGB444;
+               break;
        case 8:
                fbdev->color_mode = OMAPFB_COLOR_CLUT_8BPP;
                break;
@@ -453,9 +462,18 @@ static int set_fb_var(struct omapfb_device *fbdev,
                var->yoffset = var->yres_virtual - var->yres;
        line_size = var->xres * bpp / 8;
 
-       var->red.offset  = 11; var->red.length   = 5; var->red.msb_right   = 0;
-       var->green.offset= 5;  var->green.length = 6; var->green.msb_right = 0;
-       var->blue.offset = 0;  var->blue.length  = 5; var->blue.msb_right  = 0;
+       if (fbdev->color_mode == OMAPFB_COLOR_RGB444)
+       {
+               var->red.offset  = 8; var->red.length    = 4; var->red.msb_right   = 0;
+               var->green.offset= 4;  var->green.length = 4; var->green.msb_right = 0;
+               var->blue.offset = 0;  var->blue.length  = 4; var->blue.msb_right  = 0;
+       }
+       else
+       {
+               var->red.offset  = 11; var->red.length   = 5; var->red.msb_right   = 0;
+               var->green.offset= 5;  var->green.length = 6; var->green.msb_right = 0;
+               var->blue.offset = 0;  var->blue.length  = 5; var->blue.msb_right  = 0;
+       }
 
        var->height             = -1;
        var->width              = -1;
index fccdb3db025ff0dc79fd08dc4c5d7a0a27f0d1d3..196b5350aecc95a6a20853f8406fc03648214956 100644 (file)
@@ -64,6 +64,7 @@ enum omapfb_color_format {
        OMAPFB_COLOR_CLUT_4BPP,
        OMAPFB_COLOR_CLUT_2BPP,
        OMAPFB_COLOR_CLUT_1BPP,
+       OMAPFB_COLOR_RGB444,
 };
 
 struct omapfb_update_window {