diff options
author | Liu Ying <Ying.Liu@freescale.com> | 2011-08-03 16:51:01 +0800 |
---|---|---|
committer | Liu Ying <Ying.Liu@freescale.com> | 2011-08-03 17:03:16 +0800 |
commit | 4ee70fcdbecda7dc5995aa080376e5448f6340d4 (patch) | |
tree | 0e1c7976f9060da8fd14ec0e37214b7d75698ffb | |
parent | abde4ec2e00e724f2f6acb44d66f69dc3a39386d (diff) |
ENGR00154226-2 IPUv3 FB:Improve driver
1) Current blank information should be unblank if
we return back from mxcfb_set_par() function
successfully.
2) Remove bypassing the suspend handling for
overlay framebuffer for Android.
3) Synchronize fb unblanking operation bewteen
Android early suspend and mxcfb_set_par() to
avoid fb being unblanked after early suspend
is done, as Android early suspend doesn't
guarantee fb cannot be operated after early
suspend.
Signed-off-by: Liu Ying <Ying.Liu@freescale.com>
-rw-r--r-- | drivers/video/mxc/mxc_ipuv3_fb.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/video/mxc/mxc_ipuv3_fb.c b/drivers/video/mxc/mxc_ipuv3_fb.c index 2847cb745cd7..21ad8d1d041c 100644 --- a/drivers/video/mxc/mxc_ipuv3_fb.c +++ b/drivers/video/mxc/mxc_ipuv3_fb.c @@ -85,6 +85,8 @@ struct mxcfb_info { struct semaphore flip_sem; struct semaphore alpha_flip_sem; struct completion vsync_complete; + + bool fb_suspended; }; struct mxcfb_mode { @@ -425,7 +427,8 @@ static int mxcfb_set_par(struct fb_info *fbi) } } - if (mxc_fbi->next_blank != FB_BLANK_UNBLANK) + if (mxc_fbi->next_blank != FB_BLANK_UNBLANK || + mxc_fbi->fb_suspended) return retval; _setup_disp_channel1(fbi); @@ -492,6 +495,8 @@ static int mxcfb_set_par(struct fb_info *fbi) ipu_enable_channel(mxc_fbi->ipu_ch); + mxc_fbi->cur_blank = FB_BLANK_UNBLANK; + return retval; } @@ -905,7 +910,9 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) } else mxc_fbi->alpha_chan_en = false; + acquire_console_sem(); mxcfb_set_par(fbi); + release_console_sem(); la.alpha_phy_addr0 = mxc_fbi->alpha_phy_addr0; la.alpha_phy_addr1 = mxc_fbi->alpha_phy_addr1; @@ -1474,22 +1481,13 @@ static int mxcfb_suspend(struct platform_device *pdev, pm_message_t state) struct fb_info *fbi = platform_get_drvdata(pdev); struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)fbi->par; int saved_blank; -#ifdef CONFIG_FB_MXC_LOW_PWR_DISPLAY - void *fbmem; -#endif acquire_console_sem(); fb_set_suspend(fbi, 1); saved_blank = mxc_fbi->cur_blank; -#ifdef CONFIG_ANDROID - if (mxc_fbi->ipu_ch != MEM_FG_SYNC) - mxcfb_blank(FB_BLANK_POWERDOWN, fbi); - else - mxc_fbi->cur_blank = FB_BLANK_POWERDOWN; -#else mxcfb_blank(FB_BLANK_POWERDOWN, fbi); -#endif mxc_fbi->next_blank = saved_blank; + mxc_fbi->fb_suspended = true; release_console_sem(); return 0; @@ -1504,6 +1502,7 @@ static int mxcfb_resume(struct platform_device *pdev) struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)fbi->par; acquire_console_sem(); + mxc_fbi->fb_suspended = false; mxcfb_blank(mxc_fbi->next_blank, fbi); fb_set_suspend(fbi, 0); release_console_sem(); @@ -1868,6 +1867,7 @@ static int mxcfb_probe(struct platform_device *pdev) mxcfbi->ipu_di = pdev->id; mxcfbi->ipu_alp_ch_irq = -1; + mxcfbi->fb_suspended = false; if (pdev->id == 0) { ipu_disp_set_global_alpha(mxcfbi->ipu_ch, true, 0x80); |