diff options
author | Manjunathappa, Prakash <prakash.pm@ti.com> | 2012-10-16 00:53:16 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-11-27 04:47:53 -0500 |
commit | 3b43ad201dea06be1636e4809278d63837f8d292 (patch) | |
tree | 4b730411c4ef58560b06f8183a6128cb6422d6f2 /drivers/video/da8xx-fb.c | |
parent | f772fabdf72aec5ef05988dd82dfd150e58f7aa3 (diff) |
da8xx-fb: cleanup LCDC configurations
Configure below LCDC configurations to optimal values, also have an
option configure these optional parameters for platform.
1) AC bias configuration: Required only for passive panels
2) Dma_burst_size:
3) FIFO_DMA_DELAY:
4) FIFO threshold: Does not apply for da830 LCDC.
Patch is verified for 16bpp and 24bpp configurations on da830, da850 and
am335x EVMs.
Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video/da8xx-fb.c')
-rw-r--r-- | drivers/video/da8xx-fb.c | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c index c3db0366d59f..3fd9ec5f993a 100644 --- a/drivers/video/da8xx-fb.c +++ b/drivers/video/da8xx-fb.c | |||
@@ -226,7 +226,8 @@ static struct fb_videomode known_lcd_panels[] = { | |||
226 | .lower_margin = 2, | 226 | .lower_margin = 2, |
227 | .hsync_len = 0, | 227 | .hsync_len = 0, |
228 | .vsync_len = 0, | 228 | .vsync_len = 0, |
229 | .sync = FB_SYNC_CLK_INVERT, | 229 | .sync = FB_SYNC_CLK_INVERT | |
230 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
230 | }, | 231 | }, |
231 | /* Sharp LK043T1DG01 */ | 232 | /* Sharp LK043T1DG01 */ |
232 | [1] = { | 233 | [1] = { |
@@ -240,7 +241,7 @@ static struct fb_videomode known_lcd_panels[] = { | |||
240 | .lower_margin = 2, | 241 | .lower_margin = 2, |
241 | .hsync_len = 41, | 242 | .hsync_len = 41, |
242 | .vsync_len = 10, | 243 | .vsync_len = 10, |
243 | .sync = 0, | 244 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
244 | .flag = 0, | 245 | .flag = 0, |
245 | }, | 246 | }, |
246 | [2] = { | 247 | [2] = { |
@@ -255,7 +256,7 @@ static struct fb_videomode known_lcd_panels[] = { | |||
255 | .lower_margin = 10, | 256 | .lower_margin = 10, |
256 | .hsync_len = 10, | 257 | .hsync_len = 10, |
257 | .vsync_len = 10, | 258 | .vsync_len = 10, |
258 | .sync = 0, | 259 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
259 | .flag = 0, | 260 | .flag = 0, |
260 | }, | 261 | }, |
261 | }; | 262 | }; |
@@ -387,10 +388,9 @@ static int lcd_cfg_dma(int burst_size, int fifo_th) | |||
387 | reg |= LCD_DMA_BURST_SIZE(LCD_DMA_BURST_8); | 388 | reg |= LCD_DMA_BURST_SIZE(LCD_DMA_BURST_8); |
388 | break; | 389 | break; |
389 | case 16: | 390 | case 16: |
391 | default: | ||
390 | reg |= LCD_DMA_BURST_SIZE(LCD_DMA_BURST_16); | 392 | reg |= LCD_DMA_BURST_SIZE(LCD_DMA_BURST_16); |
391 | break; | 393 | break; |
392 | default: | ||
393 | return -EINVAL; | ||
394 | } | 394 | } |
395 | 395 | ||
396 | reg |= (fifo_th << 8); | 396 | reg |= (fifo_th << 8); |
@@ -435,7 +435,8 @@ static void lcd_cfg_vertical_sync(int back_porch, int pulse_width, | |||
435 | lcdc_write(reg, LCD_RASTER_TIMING_1_REG); | 435 | lcdc_write(reg, LCD_RASTER_TIMING_1_REG); |
436 | } | 436 | } |
437 | 437 | ||
438 | static int lcd_cfg_display(const struct lcd_ctrl_config *cfg) | 438 | static int lcd_cfg_display(const struct lcd_ctrl_config *cfg, |
439 | struct fb_videomode *panel) | ||
439 | { | 440 | { |
440 | u32 reg; | 441 | u32 reg; |
441 | u32 reg_int; | 442 | u32 reg_int; |
@@ -444,7 +445,7 @@ static int lcd_cfg_display(const struct lcd_ctrl_config *cfg) | |||
444 | LCD_MONO_8BIT_MODE | | 445 | LCD_MONO_8BIT_MODE | |
445 | LCD_MONOCHROME_MODE); | 446 | LCD_MONOCHROME_MODE); |
446 | 447 | ||
447 | switch (cfg->p_disp_panel->panel_shade) { | 448 | switch (cfg->panel_shade) { |
448 | case MONOCHROME: | 449 | case MONOCHROME: |
449 | reg |= LCD_MONOCHROME_MODE; | 450 | reg |= LCD_MONOCHROME_MODE; |
450 | if (cfg->mono_8bit_mode) | 451 | if (cfg->mono_8bit_mode) |
@@ -457,7 +458,9 @@ static int lcd_cfg_display(const struct lcd_ctrl_config *cfg) | |||
457 | break; | 458 | break; |
458 | 459 | ||
459 | case COLOR_PASSIVE: | 460 | case COLOR_PASSIVE: |
460 | if (cfg->stn_565_mode) | 461 | /* AC bias applicable only for Pasive panels */ |
462 | lcd_cfg_ac_bias(cfg->ac_bias, cfg->ac_bias_intrpt); | ||
463 | if (cfg->bpp == 12 && cfg->stn_565_mode) | ||
461 | reg |= LCD_STN_565_ENABLE; | 464 | reg |= LCD_STN_565_ENABLE; |
462 | break; | 465 | break; |
463 | 466 | ||
@@ -478,22 +481,19 @@ static int lcd_cfg_display(const struct lcd_ctrl_config *cfg) | |||
478 | 481 | ||
479 | reg = lcdc_read(LCD_RASTER_TIMING_2_REG); | 482 | reg = lcdc_read(LCD_RASTER_TIMING_2_REG); |
480 | 483 | ||
481 | if (cfg->sync_ctrl) | 484 | reg |= LCD_SYNC_CTRL; |
482 | reg |= LCD_SYNC_CTRL; | ||
483 | else | ||
484 | reg &= ~LCD_SYNC_CTRL; | ||
485 | 485 | ||
486 | if (cfg->sync_edge) | 486 | if (cfg->sync_edge) |
487 | reg |= LCD_SYNC_EDGE; | 487 | reg |= LCD_SYNC_EDGE; |
488 | else | 488 | else |
489 | reg &= ~LCD_SYNC_EDGE; | 489 | reg &= ~LCD_SYNC_EDGE; |
490 | 490 | ||
491 | if (cfg->invert_line_clock) | 491 | if (panel->sync & FB_SYNC_HOR_HIGH_ACT) |
492 | reg |= LCD_INVERT_LINE_CLOCK; | 492 | reg |= LCD_INVERT_LINE_CLOCK; |
493 | else | 493 | else |
494 | reg &= ~LCD_INVERT_LINE_CLOCK; | 494 | reg &= ~LCD_INVERT_LINE_CLOCK; |
495 | 495 | ||
496 | if (cfg->invert_frm_clock) | 496 | if (panel->sync & FB_SYNC_VERT_HIGH_ACT) |
497 | reg |= LCD_INVERT_FRAME_CLOCK; | 497 | reg |= LCD_INVERT_FRAME_CLOCK; |
498 | else | 498 | else |
499 | reg &= ~LCD_INVERT_FRAME_CLOCK; | 499 | reg &= ~LCD_INVERT_FRAME_CLOCK; |
@@ -738,9 +738,6 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg, | |||
738 | if (ret < 0) | 738 | if (ret < 0) |
739 | return ret; | 739 | return ret; |
740 | 740 | ||
741 | /* Configure the AC bias properties. */ | ||
742 | lcd_cfg_ac_bias(cfg->ac_bias, cfg->ac_bias_intrpt); | ||
743 | |||
744 | /* Configure the vertical and horizontal sync properties. */ | 741 | /* Configure the vertical and horizontal sync properties. */ |
745 | lcd_cfg_vertical_sync(panel->lower_margin, panel->vsync_len, | 742 | lcd_cfg_vertical_sync(panel->lower_margin, panel->vsync_len, |
746 | panel->upper_margin); | 743 | panel->upper_margin); |
@@ -748,18 +745,12 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg, | |||
748 | panel->left_margin); | 745 | panel->left_margin); |
749 | 746 | ||
750 | /* Configure for disply */ | 747 | /* Configure for disply */ |
751 | ret = lcd_cfg_display(cfg); | 748 | ret = lcd_cfg_display(cfg, panel); |
752 | if (ret < 0) | 749 | if (ret < 0) |
753 | return ret; | 750 | return ret; |
754 | 751 | ||
755 | if (QVGA != cfg->p_disp_panel->panel_type) | 752 | bpp = cfg->bpp; |
756 | return -EINVAL; | ||
757 | 753 | ||
758 | if (cfg->bpp <= cfg->p_disp_panel->max_bpp && | ||
759 | cfg->bpp >= cfg->p_disp_panel->min_bpp) | ||
760 | bpp = cfg->bpp; | ||
761 | else | ||
762 | bpp = cfg->p_disp_panel->max_bpp; | ||
763 | if (bpp == 12) | 754 | if (bpp == 12) |
764 | bpp = 16; | 755 | bpp = 16; |
765 | ret = lcd_cfg_frame_buffer(par, (unsigned int)panel->xres, | 756 | ret = lcd_cfg_frame_buffer(par, (unsigned int)panel->xres, |
@@ -1381,7 +1372,7 @@ static int __devinit fb_probe(struct platform_device *device) | |||
1381 | da8xx_fb_var.yres_virtual = lcdc_info->yres * LCD_NUM_BUFFERS; | 1372 | da8xx_fb_var.yres_virtual = lcdc_info->yres * LCD_NUM_BUFFERS; |
1382 | 1373 | ||
1383 | da8xx_fb_var.grayscale = | 1374 | da8xx_fb_var.grayscale = |
1384 | lcd_cfg->p_disp_panel->panel_shade == MONOCHROME ? 1 : 0; | 1375 | lcd_cfg->panel_shade == MONOCHROME ? 1 : 0; |
1385 | da8xx_fb_var.bits_per_pixel = lcd_cfg->bpp; | 1376 | da8xx_fb_var.bits_per_pixel = lcd_cfg->bpp; |
1386 | 1377 | ||
1387 | da8xx_fb_var.hsync_len = lcdc_info->hsync_len; | 1378 | da8xx_fb_var.hsync_len = lcdc_info->hsync_len; |