提交 fb8fa943 编写于 作者: M Manjunathappa, Prakash 提交者: Florian Tobias Schandinat

video: da8xx-fb: configure FIFO threshold to reduce underflow errors

Patch works around the below silicon errata:
During LCDC initialization, there is the potential for a FIFO
underflow condition to occur. A FIFO underflow condition
occurs when the input FIFO is completely empty and the LCDC
raster controller logic that drives data to the output pins
attempts to fetch data from the FIFO. When a FIFO underflow
condition occurs, incorrect data will be driven out on the
LCDC data pins.

Software should poll the FUF bit field in the LCD_STAT register
to check if an error condition has occurred or service the
interrupt if FUF_EN is enabled when FUF occurs. If the FUF bit
field has been set to 1, this will indicate an underflow
condition has occurred and then the software should execute a
reset of the LCDC via the LPSC.

This problem may occur if the LCDC FIFO threshold size
(LCDDMA_CTRL[TH_FIFO_READY]) is left at its default value after
reset. Increasing the FIFO threshold size will reduce or
eliminate underflows. Setting the threshold size to 256 double
words or larger is recommended.

Above issue is described in section 2.1.3 of silicon errata
http://www.ti.com/lit/er/sprz313e/sprz313e.pdfSigned-off-by: NRajashekhara, Sudhakar <sudhakar.raj@ti.com>
Signed-off-by: NManjunathappa, Prakash <prakash.pm@ti.com>
Signed-off-by: NFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
上级 deb95c6c
...@@ -353,8 +353,8 @@ static void lcd_blit(int load_mode, struct da8xx_fb_par *par) ...@@ -353,8 +353,8 @@ static void lcd_blit(int load_mode, struct da8xx_fb_par *par)
lcd_enable_raster(); lcd_enable_raster();
} }
/* Configure the Burst Size of DMA */ /* Configure the Burst Size and fifo threhold of DMA */
static int lcd_cfg_dma(int burst_size) static int lcd_cfg_dma(int burst_size, int fifo_th)
{ {
u32 reg; u32 reg;
...@@ -378,6 +378,9 @@ static int lcd_cfg_dma(int burst_size) ...@@ -378,6 +378,9 @@ static int lcd_cfg_dma(int burst_size)
default: default:
return -EINVAL; return -EINVAL;
} }
reg |= (fifo_th << 8);
lcdc_write(reg, LCD_DMA_CTRL_REG); lcdc_write(reg, LCD_DMA_CTRL_REG);
return 0; return 0;
...@@ -679,8 +682,8 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg, ...@@ -679,8 +682,8 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) & lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) &
~LCD_INVERT_PIXEL_CLOCK), LCD_RASTER_TIMING_2_REG); ~LCD_INVERT_PIXEL_CLOCK), LCD_RASTER_TIMING_2_REG);
/* Configure the DMA burst size. */ /* Configure the DMA burst size and fifo threshold. */
ret = lcd_cfg_dma(cfg->dma_burst_sz); ret = lcd_cfg_dma(cfg->dma_burst_sz, cfg->fifo_th);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -82,6 +82,9 @@ struct lcd_ctrl_config { ...@@ -82,6 +82,9 @@ struct lcd_ctrl_config {
/* Raster Data Order Select: 1=Most-to-least 0=Least-to-most */ /* Raster Data Order Select: 1=Most-to-least 0=Least-to-most */
unsigned char raster_order; unsigned char raster_order;
/* DMA FIFO threshold */
int fifo_th;
}; };
struct lcd_sync_arg { struct lcd_sync_arg {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册