Hi Florian Tobias Schandinat On Sun, Nov 20, 2011 at 06:11:44, Florian Tobias Schandinat wrote: > On 11/15/2011 12:01 PM, Manjunathappa, Prakash wrote: > > LCD controller on am335x supports 24bpp raster configuration > > in addition to ones on da850. LCDC also supports 24bpp in unpacked > > format having ARGB:8888 32bpp format data in DDR, but it doesn't > > interpret Alpha component of the data. > > > > Signed-off-by: Manjunathappa, Prakash <prakash.pm@xxxxxx> > > --- > > drivers/video/da8xx-fb.c | 57 +++++++++++++++++++++++++++++++++++++++++++++- > > 1 files changed, 56 insertions(+), 1 deletions(-) > > > > diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c > > index 55f91d9..e111971 100644 > > --- a/drivers/video/da8xx-fb.c > > +++ b/drivers/video/da8xx-fb.c > > @@ -82,6 +82,8 @@ > > #define LCD_V2_LIDD_CLK_EN BIT(1) > > #define LCD_V2_CORE_CLK_EN BIT(0) > > #define LCD_V2_LPP_B10 26 > > +#define LCD_V2_TFT_24BPP_MODE BIT(25) > > +#define LCD_V2_TFT_24BPP_UNPACK BIT(26) > > > > /* LCD Raster Timing 2 Register */ > > #define LCD_AC_BIAS_TRANSITIONS_PER_INT(x) ((x) << 16) > > @@ -151,7 +153,7 @@ struct da8xx_fb_par { > > unsigned int dma_end; > > struct clk *lcdc_clk; > > int irq; > > - unsigned short pseudo_palette[16]; > > + unsigned short pseudo_palette[32]; > > This looks wrong, include/linux/fb.h says: > "void *pseudo_palette; /* Fake palette of 16 colors */" > This will probably also simplify the code below to write to the pseudo palette. > But I think you have to increase the data type of the palette, maybe to u32? > > Yes, I accept that data type has to be changed to u32. But how does it simplify updating of pseudo palette. Thanks, Prakash > Best regards, > > Florian Tobias Schandinat > > > unsigned int palette_sz; > > unsigned int pxl_clk; > > int blank; > > @@ -458,6 +460,9 @@ static int lcd_cfg_frame_buffer(struct da8xx_fb_par *par, u32 width, u32 height, > > { > > u32 reg; > > > > + if ((bpp > 16) && (lcd_revision == LCD_VERSION_1)) > > + return -EINVAL; > > + > > /* Set the Panel Width */ > > /* Pixels per line = (PPL + 1)*16 */ > > if (lcd_revision == LCD_VERSION_1) { > > @@ -501,6 +506,13 @@ static int lcd_cfg_frame_buffer(struct da8xx_fb_par *par, u32 width, u32 height, > > reg = lcdc_read(LCD_RASTER_CTRL_REG) & ~(1 << 8); > > if (raster_order) > > reg |= LCD_RASTER_ORDER; > > + > > + if (bpp == 24) > > + reg |= (LCD_TFT_MODE | LCD_V2_TFT_24BPP_MODE); > > + else if (bpp == 32) > > + reg |= (LCD_TFT_MODE | LCD_V2_TFT_24BPP_MODE > > + | LCD_V2_TFT_24BPP_UNPACK); > > + > > lcdc_write(reg, LCD_RASTER_CTRL_REG); > > > > switch (bpp) { > > @@ -508,6 +520,8 @@ static int lcd_cfg_frame_buffer(struct da8xx_fb_par *par, u32 width, u32 height, > > case 2: > > case 4: > > case 16: > > + case 24: > > + case 32: > > par->palette_sz = 16 * 2; > > break; > > > > @@ -537,6 +551,9 @@ static int fb_setcolreg(unsigned regno, unsigned red, unsigned green, > > if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) > > return 1; > > > > + if ((info->var.bits_per_pixel > 16) && (lcd_revision == LCD_VERSION_1)) > > + return 1; > > + > > if (info->var.bits_per_pixel == 8) { > > red >>= 4; > > green >>= 8; > > @@ -566,6 +583,23 @@ static int fb_setcolreg(unsigned regno, unsigned red, unsigned green, > > update_hw = 1; > > palette[0] = 0x4000; > > } > > + } else if (((info->var.bits_per_pixel == 32) && regno < 32) || > > + ((info->var.bits_per_pixel == 24) && regno < 24)) { > > + red >>= (24 - info->var.red.length); > > + red <<= info->var.red.offset; > > + > > + green >>= (24 - info->var.green.length); > > + green <<= info->var.green.offset; > > + > > + blue >>= (24 - info->var.blue.length); > > + blue <<= info->var.blue.offset; > > + > > + par->pseudo_palette[regno] = red | green | blue; > > + > > + if (palette[0] != 0x4000) { > > + update_hw = 1; > > + palette[0] = 0x4000; > > + } > > } > > > > /* Update the palette in the h/w as needed. */ > > @@ -777,6 +811,9 @@ static int fb_check_var(struct fb_var_screeninfo *var, > > { > > int err = 0; > > > > + if ((var->bits_per_pixel > 16) && (lcd_revision == LCD_VERSION_1)) > > + return -EINVAL; > > + > > switch (var->bits_per_pixel) { > > case 1: > > case 8: > > @@ -809,6 +846,24 @@ static int fb_check_var(struct fb_var_screeninfo *var, > > var->transp.offset = 0; > > var->transp.length = 0; > > break; > > + case 24: > > + var->red.offset = 16; > > + var->red.length = 8; > > + var->green.offset = 8; > > + var->green.length = 8; > > + var->blue.offset = 0; > > + var->blue.length = 8; > > + break; > > + case 32: > > + var->transp.offset = 24; > > + var->transp.length = 8; > > + var->red.offset = 16; > > + var->red.length = 8; > > + var->green.offset = 8; > > + var->green.length = 8; > > + var->blue.offset = 0; > > + var->blue.length = 8; > > + break; > > default: > > err = -EINVAL; > > } > > -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html