summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJason Chen <b02280@freescale.com>2010-11-01 10:42:04 +0800
committerScott Sweeny <scott.sweeny@timesys.com>2011-01-19 11:50:17 -0500
commit4a45394671ae2b0c049cb468dd63168706e3a186 (patch)
treebb8f7c36cee0cac829ad2aa840c13cf39aa31aac /drivers
parent6bbbb9f8a59f7b9d917a4cf0d55fa0ba93df17eb (diff)
ENGR00133034 ipuv3: fix black flash issue during high resolution video playback
When v4l2 using ic bypass mode, and format is non-interleaving, if the resolution is large, like 720P on mx51, it has chance to make screen black flash. Need enlarge burst size of IDMA display for above case. Signed-off-by: Jason Chen <b02280@freescale.com> Signed-off-by: Ferderber Ran <r53561@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mxc/ipu3/ipu_common.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/mxc/ipu3/ipu_common.c b/drivers/mxc/ipu3/ipu_common.c
index e65faa83fac3..87a7cf2c43ab 100644
--- a/drivers/mxc/ipu3/ipu_common.c
+++ b/drivers/mxc/ipu3/ipu_common.c
@@ -1032,6 +1032,53 @@ int32_t ipu_init_channel_buffer(ipu_channel_t channel, ipu_buffer_t type,
_ipu_ch_param_set_burst_size(dma_chan, 8);
_ipu_ch_param_set_block_mode(dma_chan);
} else if (_ipu_is_dmfc_chan(dma_chan)) {
+ u32 dmfc_dp_chan, dmfc_wr_chan;
+ /*
+ * non-interleaving format need enlarge burst size
+ * to work-around black flash issue.
+ */
+ if (((dma_chan == 23) || (dma_chan == 27) || (dma_chan == 28))
+ && ((pixel_fmt == IPU_PIX_FMT_YUV420P) ||
+ (pixel_fmt == IPU_PIX_FMT_YUV420P2) ||
+ (pixel_fmt == IPU_PIX_FMT_YVU422P) ||
+ (pixel_fmt == IPU_PIX_FMT_YUV422P) ||
+ (pixel_fmt == IPU_PIX_FMT_NV12))) {
+ if (dma_chan == 23) {
+ dmfc_dp_chan = __raw_readl(DMFC_DP_CHAN);
+ dmfc_dp_chan &= ~(0xc0);
+ dmfc_dp_chan |= 0x40;
+ __raw_writel(dmfc_dp_chan, DMFC_DP_CHAN);
+ } else if (dma_chan == 27) {
+ dmfc_dp_chan = __raw_readl(DMFC_DP_CHAN);
+ dmfc_dp_chan &= ~(0xc000);
+ dmfc_dp_chan |= 0x4000;
+ __raw_writel(dmfc_dp_chan, DMFC_DP_CHAN);
+ } else if (dma_chan == 28) {
+ dmfc_wr_chan = __raw_readl(DMFC_WR_CHAN);
+ dmfc_wr_chan &= ~(0xc0);
+ dmfc_wr_chan |= 0x40;
+ __raw_writel(dmfc_wr_chan, DMFC_WR_CHAN);
+ }
+ _ipu_ch_param_set_burst_size(dma_chan, 64);
+ } else {
+ if (dma_chan == 23) {
+ dmfc_dp_chan = __raw_readl(DMFC_DP_CHAN);
+ dmfc_dp_chan &= ~(0xc0);
+ dmfc_dp_chan |= 0x80;
+ __raw_writel(dmfc_dp_chan, DMFC_DP_CHAN);
+ } else if (dma_chan == 27) {
+ dmfc_dp_chan = __raw_readl(DMFC_DP_CHAN);
+ dmfc_dp_chan &= ~(0xc000);
+ dmfc_dp_chan |= 0x8000;
+ __raw_writel(dmfc_dp_chan, DMFC_DP_CHAN);
+ } else {
+ dmfc_wr_chan = __raw_readl(DMFC_WR_CHAN);
+ dmfc_wr_chan &= ~(0xc0);
+ dmfc_wr_chan |= 0x80;
+ __raw_writel(dmfc_wr_chan, DMFC_WR_CHAN);
+ }
+ _ipu_ch_param_set_burst_size(dma_chan, 32);
+ }
spin_lock_irqsave(&ipu_lock, lock_flags);
_ipu_dmfc_set_wait4eot(dma_chan, width);
spin_unlock_irqrestore(&ipu_lock, lock_flags);