From 675284a72cfd15868f39fdc99039b043cf14d760 Mon Sep 17 00:00:00 2001 From: "guoyin.chen" Date: Tue, 27 Aug 2013 10:33:13 +0800 Subject: 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 --- drivers/video/mxc/mxc_elcdif_fb.c | 5 +++++ drivers/video/mxc/mxc_ipuv3_fb.c | 4 ++++ drivers/video/mxc_hdmi.c | 6 +++++- 3 files changed, 14 insertions(+), 1 deletion(-) 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; -- cgit v1.2.3