summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorguoyin.chen <guoyin.chen@freescale.com>2013-08-27 10:33:13 +0800
committerguoyin.chen <guoyin.chen@freescale.com>2013-08-27 12:58:35 +0800
commit675284a72cfd15868f39fdc99039b043cf14d760 (patch)
treed966136fdb77b8c2b71591828d71c3217eb0ccc5
parent0ae5e456f639ccf30e002ed6f4f738c44dad14c9 (diff)
ENGR00275429 Recovery: Screen flashing found when wipe data in recovery mode
Android Recovery UI framework uses FBIOPUT_VSCREENINFO with yoffset update to update display. Both elcdif and ipuv3 FB will set var.activate to be FB_ACTIVATE_FORCE in driver's probe. User space will get the VSCREENINFO with activate been set to FB_ACTIVE_FORCE. Each FBIOPUT_VSCREENINFO with only yoffset update will make the driver reinit.The activate should be cleared once set_par() been finished. HDMI driver should only reinit hdmi only when the mode changed. fbmem will broadcast MODE_CHANGE for each FBIOPUT_VSCREENINFO ioctl even it only have yoffset update. Signed-off-by: guoyin.chen <guoyin.chen@freescale.com>
-rw-r--r--drivers/video/mxc/mxc_elcdif_fb.c5
-rw-r--r--drivers/video/mxc/mxc_ipuv3_fb.c4
-rw-r--r--drivers/video/mxc_hdmi.c6
3 files changed, 14 insertions, 1 deletions
diff --git a/drivers/video/mxc/mxc_elcdif_fb.c b/drivers/video/mxc/mxc_elcdif_fb.c
index b3691b540522..0e56ae6c3df3 100644
--- a/drivers/video/mxc/mxc_elcdif_fb.c
+++ b/drivers/video/mxc/mxc_elcdif_fb.c
@@ -961,6 +961,11 @@ static int mxc_elcdif_fb_set_par(struct fb_info *fbi)
fbi->mode = (struct fb_videomode *)fb_match_mode(&fbi->var,
&fbi->modelist);
+ /* Clear activate as not Reconfiguring framebuffer again */
+ if ((fbi->var.activate & FB_ACTIVATE_FORCE) &&
+ (fbi->var.activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW)
+ fbi->var.activate = FB_ACTIVATE_NOW;
+
data->var = fbi->var;
return 0;
diff --git a/drivers/video/mxc/mxc_ipuv3_fb.c b/drivers/video/mxc/mxc_ipuv3_fb.c
index 429b7b863c24..9deffbbb0926 100644
--- a/drivers/video/mxc/mxc_ipuv3_fb.c
+++ b/drivers/video/mxc/mxc_ipuv3_fb.c
@@ -685,6 +685,10 @@ static int mxcfb_set_par(struct fb_info *fbi)
}
}
+ /* Clear activate as not Reconfiguring framebuffer again */
+ if ((fbi->var.activate & FB_ACTIVATE_FORCE) &&
+ (fbi->var.activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW)
+ fbi->var.activate = FB_ACTIVATE_NOW;
mxc_fbi->cur_var = fbi->var;
if (ovfbi_enable) {
mxc_fbi_fg->cur_blank = FB_BLANK_UNBLANK;
diff --git a/drivers/video/mxc_hdmi.c b/drivers/video/mxc_hdmi.c
index 8902fb2b0b5e..bffac867bc6e 100644
--- a/drivers/video/mxc_hdmi.c
+++ b/drivers/video/mxc_hdmi.c
@@ -2314,6 +2314,7 @@ static int mxc_hdmi_fb_event(struct notifier_block *nb,
{
struct fb_event *event = v;
struct mxc_hdmi *hdmi = container_of(nb, struct mxc_hdmi, nb);
+ struct fb_videomode *mode;
if (strcmp(event->info->fix.id, hdmi->fbi->fix.id))
return 0;
@@ -2333,7 +2334,10 @@ static int mxc_hdmi_fb_event(struct notifier_block *nb,
case FB_EVENT_MODE_CHANGE:
dev_dbg(&hdmi->pdev->dev, "event=FB_EVENT_MODE_CHANGE\n");
- if (hdmi->fb_reg)
+ mode = (struct fb_videomode *)event->data;
+ if ((hdmi->fb_reg) &&
+ (mode != NULL) &&
+ !fb_mode_is_equal(&hdmi->previous_mode, mode))
mxc_hdmi_setup(hdmi, val);
break;