From bb2725c66b7d48698f2fd663314b80aef44e00f4 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Thu, 2 Jul 2015 08:14:58 +0200 Subject: video: fsl-dcu-fb: use automatic update mode The DCU provides two register update methods: Manual using READREG and automatic using MODE. Tests showed that the manual mode leads to significant flickers on displays. This is especially disturbing when using double buffering and panning (FBIOPAN_DISPLAY ioctrl). Use the READREG mode only on initial mode setting and switch to automatic mode for any further register changes. --- drivers/video/fbdev/fsl-dcu-fb.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/video/fbdev/fsl-dcu-fb.c b/drivers/video/fbdev/fsl-dcu-fb.c index a350b034e7a0..d43c62f80cc8 100644 --- a/drivers/video/fbdev/fsl-dcu-fb.c +++ b/drivers/video/fbdev/fsl-dcu-fb.c @@ -299,6 +299,11 @@ static int enable_panel(struct fb_info *info) dcufb->reg_base + DCU_CTRLDESCLN_9(mfbi->index)); writel(DCU_UPDATE_MODE_READREG, dcufb->reg_base + DCU_UPDATE_MODE); + + /* Wait until transfer is complete and switch to automatic updates */ + while (readl(dcufb->reg_base + DCU_UPDATE_MODE) & DCU_UPDATE_MODE_READREG); + writel(DCU_UPDATE_MODE_MODE, dcufb->reg_base + DCU_UPDATE_MODE); + return 0; } @@ -333,6 +338,7 @@ static int disable_panel(struct fb_info *info) writel(DCU_CTRLDESCLN_9_BG_BCOLOR(0), dcufb->reg_base + DCU_CTRLDESCLN_9(mfbi->index)); + /* Clear Mode flag and schedule one transfer using READREG */ writel(DCU_UPDATE_MODE_READREG, dcufb->reg_base + DCU_UPDATE_MODE); return 0; } @@ -650,7 +656,6 @@ static int fsl_dcu_pan_display(struct fb_var_screeninfo *var, addr = fsl_dcu_get_offset(info); writel(addr, dcufb->reg_base + DCU_CTRLDESCLN_3(mfbi->index)); - writel(DCU_UPDATE_MODE_READREG, dcufb->reg_base + DCU_UPDATE_MODE); return 0; } -- cgit v1.2.3