diff options
| author | Ken Zhang <kenz@codeaurora.org> | 2012-12-21 23:12:05 -0500 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:13:56 -0700 |
| commit | 2747a8445ca2dddf2097dd1acfd3d8584e97bb27 (patch) | |
| tree | d3a25f79a6d5334c04b98f2f9a406992a3a597b4 | |
| parent | 304679354d20bb8b517704bd122f4b0bcb81ee1b (diff) | |
msm: mdss: power setting protection
When mdss is in resume process, other operation needs
wait until it is done.
Change-Id: I93696bdb9a4b6ac88d88eeb32bfcede5e2f62c8e
Signed-off-by: Ken Zhang <kenz@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.c | 29 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.h | 2 |
2 files changed, 31 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 62d29d27439a..4aa570be742c 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -394,6 +394,8 @@ static int mdss_fb_resume_sub(struct msm_fb_data_type *mfd) if ((!mfd) || (mfd->key != MFD_KEY)) return 0; + INIT_COMPLETION(mfd->power_set_comp); + mfd->is_power_setting = true; pr_debug("mdss_fb resume index=%d\n", mfd->index); mdss_fb_pan_idle(mfd); @@ -415,6 +417,8 @@ static int mdss_fb_resume_sub(struct msm_fb_data_type *mfd) if (mfd->vsync_pending) mdss_mdp_overlay_vsync_ctrl(mfd, mfd->vsync_pending); } + mfd->is_power_setting = false; + complete_all(&mfd->power_set_comp); return ret; } @@ -922,6 +926,7 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd) init_completion(&mfd->update.comp); init_completion(&mfd->no_update.comp); init_completion(&mfd->commit_comp); + init_completion(&mfd->power_set_comp); INIT_WORK(&mfd->commit_work, mdss_fb_commit_wq_handler); mfd->msm_fb_backup = kzalloc(sizeof(struct msm_fb_backup_type), GFP_KERNEL); @@ -1002,6 +1007,26 @@ static int mdss_fb_release(struct fb_info *info, int user) return ret; } +static void mdss_fb_power_setting_idle(struct msm_fb_data_type *mfd) +{ + int ret; + + if (mfd->is_power_setting) { + ret = wait_for_completion_timeout( + &mfd->power_set_comp, + msecs_to_jiffies(WAIT_DISP_OP_TIMEOUT)); + if (ret < 0) + ret = -ERESTARTSYS; + else if (!ret) + pr_err("%s wait for power_set_comp timeout %d %d", + __func__, ret, mfd->is_power_setting); + if (ret <= 0) { + mfd->is_power_setting = false; + complete_all(&mfd->power_set_comp); + } + } +} + void mdss_fb_wait_for_fence(struct msm_fb_data_type *mfd) { int i, ret; @@ -1557,6 +1582,7 @@ static int mdss_fb_display_commit(struct fb_info *info, ret = mdss_fb_pan_display_ex(info, &disp_commit); return ret; } + static int mdss_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) { @@ -1569,7 +1595,10 @@ static int mdss_fb_ioctl(struct fb_info *info, unsigned int cmd, int ret = -ENOSYS; struct mdp_buf_sync buf_sync; + mdss_fb_power_setting_idle(mfd); + mdss_fb_pan_idle(mfd); + switch (cmd) { case MSMFB_CURSOR: ret = mdss_fb_cursor(info, argp); diff --git a/drivers/video/fbdev/msm/mdss_fb.h b/drivers/video/fbdev/msm/mdss_fb.h index f0489d564a84..9ccf474667dc 100644 --- a/drivers/video/fbdev/msm/mdss_fb.h +++ b/drivers/video/fbdev/msm/mdss_fb.h @@ -132,6 +132,8 @@ struct msm_fb_data_type { u32 is_committing; struct work_struct commit_work; void *msm_fb_backup; + struct completion power_set_comp; + u32 is_power_setting; }; struct msm_fb_backup_type { |
