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?
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