summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiu Ying <Ying.Liu@freescale.com>2011-08-03 16:51:01 +0800
committerLiu Ying <Ying.Liu@freescale.com>2011-08-03 17:03:16 +0800
commit4ee70fcdbecda7dc5995aa080376e5448f6340d4 (patch)
tree0e1c7976f9060da8fd14ec0e37214b7d75698ffb
parentabde4ec2e00e724f2f6acb44d66f69dc3a39386d (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.c22
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);