summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiu Ying <Ying.Liu@freescale.com>2011-10-25 14:16:30 +0800
committerLiu Ying <Ying.Liu@freescale.com>2011-10-26 10:41:21 +0800
commitb6cc41d7c3fc22980a5a62b75e09cd7fdbb89c26 (patch)
treea34f1d14cf18f754ac6078e30e427e8c3953b49c
parentf670cbc12d28a642c8b73080684115c57f0cdd98 (diff)
ENGR00160566 IPUv3:Improve IDMAC_LOCK_EN setting
1) Clear IDMAC_LOCK_EN when dual display is enabled to workaround black flash issue when playing video on DP-FG. 2) Only set IDMAC_LOCK_EN for IPUv3M. Signed-off-by: Liu Ying <Ying.Liu@freescale.com> (cherry picked from commit 7c22da39601cfc6551292cbd2c5c1d9ee3b4fbfa)
-rw-r--r--drivers/mxc/ipu3/ipu_common.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/mxc/ipu3/ipu_common.c b/drivers/mxc/ipu3/ipu_common.c
index a6fc50b58660..825cd611acb0 100644
--- a/drivers/mxc/ipu3/ipu_common.c
+++ b/drivers/mxc/ipu3/ipu_common.c
@@ -389,7 +389,8 @@ static int ipu_probe(struct platform_device *pdev)
__raw_writel(0x18800001L, IDMAC_CHA_PRI(0));
/* AXI burst setting for sync refresh channels */
- __raw_writel(0x003F0000, IDMAC_CH_LOCK_EN_1);
+ if (g_ipu_hw_rev == 3)
+ __raw_writel(0x003F0000, IDMAC_CH_LOCK_EN_1);
/* Set MCU_T to divide MCU access window into 2 */
__raw_writel(0x00400000L | (IPU_MCU_T_DEFAULT << 18), IPU_DISP_GEN);
@@ -997,6 +998,11 @@ void ipu_uninit_channel(ipu_channel_t channel)
__raw_writel(ipu_conf, IPU_CONF);
+ /* Restore IDMAC_LOCK_EN when we don't use dual display */
+ if (!(ipu_di_use_count[0] && ipu_di_use_count[1]) &&
+ _ipu_is_dmfc_chan(in_dma) && g_ipu_hw_rev == 3)
+ __raw_writel(0x003F0000, IDMAC_CH_LOCK_EN_1);
+
spin_unlock_irqrestore(&ipu_lock, lock_flags);
ipu_put_clk();
@@ -1811,6 +1817,14 @@ int32_t ipu_enable_channel(ipu_channel_t channel)
ipu_conf |= IPU_CONF_SMFC_EN;
__raw_writel(ipu_conf, IPU_CONF);
+ /* Clear IDMAC_LOCK_EN to workaround black flash for dual display */
+ if (g_ipu_hw_rev == 3 && _ipu_is_dmfc_chan(in_dma)) {
+ if (ipu_di_use_count[1] && ipu_di_use_count[0])
+ __raw_writel(0x0, IDMAC_CH_LOCK_EN_1);
+ else
+ __raw_writel(0x003F0000, IDMAC_CH_LOCK_EN_1);
+ }
+
if (idma_is_valid(in_dma)) {
reg = __raw_readl(IDMAC_CHA_EN(in_dma));
__raw_writel(reg | idma_mask(in_dma), IDMAC_CHA_EN(in_dma));
@@ -2787,7 +2801,8 @@ static int ipu_resume(struct platform_device *pdev)
__raw_writel(0x18800001L, IDMAC_CHA_PRI(0));
/* AXI burst setting for sync refresh channels */
- __raw_writel(0x003F0000, IDMAC_CH_LOCK_EN_1);
+ if (g_ipu_hw_rev == 3)
+ __raw_writel(0x003F0000, IDMAC_CH_LOCK_EN_1);
clk_disable(g_ipu_clk);
}
mutex_unlock(&ipu_clk_lock);