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;
                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");
 
                        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) {
                                                        transp, update_hw_pal);
                /* Fallthrough */
        case OMAPFB_COLOR_RGB565:
+       case OMAPFB_COLOR_RGB444:
                if (r != 0)
                        break;
 
 
                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;
        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;
                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;