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 <[email protected]>
> > ---
> > 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;
> > }
>
>
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source