diff options
author | guoyin.chen <guoyin.chen@freescale.com> | 2013-08-27 10:33:13 +0800 |
---|---|---|
committer | guoyin.chen <guoyin.chen@freescale.com> | 2013-08-27 12:58:35 +0800 |
commit | 675284a72cfd15868f39fdc99039b043cf14d760 (patch) | |
tree | d966136fdb77b8c2b71591828d71c3217eb0ccc5 | |
parent | 0ae5e456f639ccf30e002ed6f4f738c44dad14c9 (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.c | 5 | ||||
-rw-r--r-- | drivers/video/mxc/mxc_ipuv3_fb.c | 4 | ||||
-rw-r--r-- | drivers/video/mxc_hdmi.c | 6 |
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; |