mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
msm: display: add more checking to ensure display is idle
Before execute operation on display, make sure it is complete idle Because non-blocking display update has been introduced, need make sure display update has finished in all entrances except the ones for initialization. Change-Id: I0660080262b7e5895f5f558c0a9f71aa84b9aa99 Signed-off-by: Ken Zhang <kenz@codeaurora.org> Signed-off-by: Naseer Ahmed <naseer@codeaurora.org>
This commit is contained in:
parent
017f1bf60d
commit
c2975c4ed3
1 changed files with 20 additions and 3 deletions
|
@ -126,8 +126,10 @@ static ssize_t msm_fb_read(struct fb_info *info, char __user *buf,
|
|||
#define MSM_FB_MAX_DBGFS 1024
|
||||
#define MAX_BACKLIGHT_BRIGHTNESS 255
|
||||
|
||||
/* 200 ms for time out */
|
||||
/* 100 ms for fence time out */
|
||||
#define WAIT_FENCE_TIMEOUT 100
|
||||
/* 200 ms for display operation time out */
|
||||
#define WAIT_DISP_OP_TIMEOUT 200
|
||||
|
||||
int msm_fb_debugfs_file_index;
|
||||
struct dentry *msm_fb_debugfs_root;
|
||||
|
@ -444,6 +446,8 @@ static int msm_fb_remove(struct platform_device *pdev)
|
|||
|
||||
mfd = (struct msm_fb_data_type *)platform_get_drvdata(pdev);
|
||||
|
||||
msm_fb_pan_idle(mfd);
|
||||
|
||||
msm_fb_remove_sysfs(pdev);
|
||||
|
||||
pm_runtime_disable(mfd->fbi->dev);
|
||||
|
@ -511,6 +515,8 @@ static int msm_fb_suspend(struct platform_device *pdev, pm_message_t state)
|
|||
if ((!mfd) || (mfd->key != MFD_KEY))
|
||||
return 0;
|
||||
|
||||
msm_fb_pan_idle(mfd);
|
||||
|
||||
console_lock();
|
||||
fb_set_suspend(mfd->fbi, FBINFO_STATE_SUSPENDED);
|
||||
|
||||
|
@ -633,6 +639,8 @@ static int msm_fb_resume(struct platform_device *pdev)
|
|||
if ((!mfd) || (mfd->key != MFD_KEY))
|
||||
return 0;
|
||||
|
||||
msm_fb_pan_idle(mfd);
|
||||
|
||||
console_lock();
|
||||
ret = msm_fb_resume_sub(mfd);
|
||||
pdev->dev.power.power_state = PMSG_ON;
|
||||
|
@ -678,6 +686,7 @@ static int msm_fb_ext_suspend(struct device *dev)
|
|||
|
||||
if ((!mfd) || (mfd->key != MFD_KEY))
|
||||
return 0;
|
||||
msm_fb_pan_idle(mfd);
|
||||
|
||||
pdata = (struct msm_fb_panel_data *)mfd->pdev->dev.platform_data;
|
||||
if (mfd->panel_info.type == HDMI_PANEL ||
|
||||
|
@ -905,6 +914,8 @@ static int msm_fb_blank_sub(int blank_mode, struct fb_info *info,
|
|||
if (!op_enable)
|
||||
return -EPERM;
|
||||
|
||||
msm_fb_pan_idle(mfd);
|
||||
|
||||
pdata = (struct msm_fb_panel_data *)mfd->pdev->dev.platform_data;
|
||||
if ((!pdata) || (!pdata->on) || (!pdata->off)) {
|
||||
printk(KERN_ERR "msm_fb_blank_sub: no panel operation detected!\n");
|
||||
|
@ -1762,7 +1773,7 @@ static int msm_fb_release(struct fb_info *info, int user)
|
|||
mfd->index);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
msm_fb_pan_idle(mfd);
|
||||
mfd->ref_cnt--;
|
||||
|
||||
if ((!mfd->ref_cnt) && (mfd->op_enable)) {
|
||||
|
@ -1817,12 +1828,18 @@ static int msm_fb_pan_idle(struct msm_fb_data_type *mfd)
|
|||
mutex_unlock(&mfd->sync_mutex);
|
||||
ret = wait_for_completion_interruptible_timeout(
|
||||
&mfd->commit_comp,
|
||||
msecs_to_jiffies(WAIT_FENCE_TIMEOUT));
|
||||
msecs_to_jiffies(WAIT_DISP_OP_TIMEOUT));
|
||||
if (ret < 0)
|
||||
ret = -ERESTARTSYS;
|
||||
else if (!ret)
|
||||
pr_err("%s wait for commit_comp timeout %d %d",
|
||||
__func__, ret, mfd->is_committing);
|
||||
if (ret <= 0) {
|
||||
mutex_lock(&mfd->sync_mutex);
|
||||
mfd->is_committing = 0;
|
||||
complete_all(&mfd->commit_comp);
|
||||
mutex_unlock(&mfd->sync_mutex);
|
||||
}
|
||||
} else {
|
||||
mutex_unlock(&mfd->sync_mutex);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue