summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFancy Fang <chen.fang@nxp.com>2020-05-13 17:21:17 +0800
committerFancy Fang <chen.fang@nxp.com>2020-05-15 10:08:30 +0800
commitbfa7236c8477e8993f074a3068ddc64c1614db06 (patch)
tree543e2a08bc72d2cd5a79fc345e04241111713ccd
parent2ff28a22ad4b28cbe55fa5c51c19186a84861815 (diff)
MLK-24002-1 drm/imx: lcdifv3: enable shadow load for plane update
After the atomic plane update, the shadow load should be enabled to make sure its update can take effect on next frame in any cases. And this enable is better to be done in CRTC's atomic_flush() which is called after plane's atomic_update() is called. Besides, the shadow load enable in controller enable is unnecessary, so remove it. Signed-off-by: Fancy Fang <chen.fang@nxp.com> Reviewed-by: Liu Ying <victor.liu@nxp.com>
-rw-r--r--drivers/gpu/drm/imx/lcdifv3/lcdifv3-crtc.c6
-rw-r--r--drivers/gpu/imx/lcdifv3/lcdifv3-common.c15
-rw-r--r--include/video/imx-lcdifv3.h1
3 files changed, 17 insertions, 5 deletions
diff --git a/drivers/gpu/drm/imx/lcdifv3/lcdifv3-crtc.c b/drivers/gpu/drm/imx/lcdifv3/lcdifv3-crtc.c
index 4258f144910f..02d668781432 100644
--- a/drivers/gpu/drm/imx/lcdifv3/lcdifv3-crtc.c
+++ b/drivers/gpu/drm/imx/lcdifv3/lcdifv3-crtc.c
@@ -133,7 +133,11 @@ static void lcdifv3_crtc_atomic_begin(struct drm_crtc *crtc,
static void lcdifv3_crtc_atomic_flush(struct drm_crtc *crtc,
struct drm_crtc_state *old_crtc_state)
{
- /* LCDIFV3 doesn't have command buffer */
+ struct lcdifv3_crtc *lcdifv3_crtc = to_lcdifv3_crtc(crtc);
+ struct lcdifv3_soc *lcdifv3 = dev_get_drvdata(lcdifv3_crtc->dev->parent);
+
+ /* kick shadow load for plane config */
+ lcdifv3_en_shadow_load(lcdifv3);
}
static void lcdifv3_crtc_atomic_enable(struct drm_crtc *crtc,
diff --git a/drivers/gpu/imx/lcdifv3/lcdifv3-common.c b/drivers/gpu/imx/lcdifv3/lcdifv3-common.c
index d33453e2577e..9063f6cbf714 100644
--- a/drivers/gpu/imx/lcdifv3/lcdifv3-common.c
+++ b/drivers/gpu/imx/lcdifv3/lcdifv3-common.c
@@ -450,6 +450,17 @@ void lcdifv3_set_mode(struct lcdifv3_soc *lcdifv3, struct videomode *vmode)
}
EXPORT_SYMBOL(lcdifv3_set_mode);
+void lcdifv3_en_shadow_load(struct lcdifv3_soc *lcdifv3)
+{
+ u32 ctrldescl0_5;
+
+ ctrldescl0_5 = readl(lcdifv3->base + LCDIFV3_CTRLDESCL0_5);
+ ctrldescl0_5 |= CTRLDESCL0_5_SHADOW_LOAD_EN;
+
+ writel(ctrldescl0_5, lcdifv3->base + LCDIFV3_CTRLDESCL0_5);
+}
+EXPORT_SYMBOL(lcdifv3_en_shadow_load);
+
void lcdifv3_enable_controller(struct lcdifv3_soc *lcdifv3)
{
u32 disp_para, ctrldescl0_5;
@@ -461,10 +472,6 @@ void lcdifv3_enable_controller(struct lcdifv3_soc *lcdifv3)
disp_para |= DISP_PARA_DISP_ON;
writel(disp_para, lcdifv3->base + LCDIFV3_DISP_PARA);
- /* enable shadow load */
- ctrldescl0_5 |= CTRLDESCL0_5_SHADOW_LOAD_EN;
- writel(ctrldescl0_5, lcdifv3->base + LCDIFV3_CTRLDESCL0_5);
-
/* enable layer dma */
ctrldescl0_5 |= CTRLDESCL0_5_EN;
writel(ctrldescl0_5, lcdifv3->base + LCDIFV3_CTRLDESCL0_5);
diff --git a/include/video/imx-lcdifv3.h b/include/video/imx-lcdifv3.h
index 26103ad63327..e8556bea7aed 100644
--- a/include/video/imx-lcdifv3.h
+++ b/include/video/imx-lcdifv3.h
@@ -26,6 +26,7 @@ void lcdifv3_set_fb_addr(struct lcdifv3_soc *lcdifv3, int id, u32 addr);
void lcdifv3_set_mode(struct lcdifv3_soc *lcdifv3, struct videomode *vmode);
void lcdifv3_set_fb_hcrop(struct lcdifv3_soc *lcdifv3, u32 src_w,
u32 fb_w, bool crop);
+void lcdifv3_en_shadow_load(struct lcdifv3_soc *lcdifv3);
void lcdifv3_enable_controller(struct lcdifv3_soc *lcdifv3);
void lcdifv3_disable_controller(struct lcdifv3_soc *lcdifv3);
void lcdifv3_dump_registers(struct lcdifv3_soc *lcdifv3);