summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorStefan Agner <stefan.agner@toradex.com>2015-07-02 08:14:58 +0200
committerStefan Agner <stefan.agner@toradex.com>2015-07-02 08:14:58 +0200
commitfbfb70170c36636e9111b4400df084074b22e03e (patch)
tree2430c0209fe0115b7483905c19ae708e6939485a /drivers/video
parent9b0293daedecca788a839ac8ecc64bb473e467e6 (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')
-rw-r--r--drivers/video/fbdev/fsl-dcu-fb.c7
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 ecf4b1aa6034..c27a73cc2e5b 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;
}