diff options
author | Fancy Fang <chen.fang@nxp.com> | 2020-05-13 17:21:17 +0800 |
---|---|---|
committer | Fancy Fang <chen.fang@nxp.com> | 2020-05-15 10:08:30 +0800 |
commit | bfa7236c8477e8993f074a3068ddc64c1614db06 (patch) | |
tree | 543e2a08bc72d2cd5a79fc345e04241111713ccd | |
parent | 2ff28a22ad4b28cbe55fa5c51c19186a84861815 (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.c | 6 | ||||
-rw-r--r-- | drivers/gpu/imx/lcdifv3/lcdifv3-common.c | 15 | ||||
-rw-r--r-- | include/video/imx-lcdifv3.h | 1 |
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); |