summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Chen <b02280@freescale.com>2010-11-01 10:42:04 +0800
committerJason Chen <b02280@freescale.com>2010-11-03 10:55:16 +0800
commit52a5eeedff7c7a1a441bb1a7379cb72c0448ac1d (patch)
treebb8f7c36cee0cac829ad2aa840c13cf39aa31aac
parentf131c6d8731125fd685e01ff842a8a1702cb2921 (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>
-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);