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

Reply via email to