summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Zhang <kenz@codeaurora.org>2012-12-21 23:12:05 -0500
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:13:56 -0700
commit2747a8445ca2dddf2097dd1acfd3d8584e97bb27 (patch)
treed3a25f79a6d5334c04b98f2f9a406992a3a597b4
parent304679354d20bb8b517704bd122f4b0bcb81ee1b (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.c29
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.h2
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 {