diff options
author | Stefan Agner <stefan.agner@toradex.com> | 2015-07-02 08:14:58 +0200 |
---|---|---|
committer | Stefan Agner <stefan.agner@toradex.com> | 2015-07-02 09:21:19 +0200 |
commit | bb2725c66b7d48698f2fd663314b80aef44e00f4 (patch) | |
tree | 7d65b5382614e112286fb9f603a0a67d6959456c /drivers/video/fbdev/fsl-dcu-fb.c | |
parent | 8f30ee5981b6cc2014c0eb9e4506192db7918f29 (diff) |
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.
Diffstat (limited to 'drivers/video/fbdev/fsl-dcu-fb.c')
-rw-r--r-- | drivers/video/fbdev/fsl-dcu-fb.c | 7 |
1 files changed, 6 insertions, 1 deletions
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; } |