summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_rotator.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_rotator.c b/drivers/video/fbdev/msm/mdss_mdp_rotator.c
index 5750cbd2faa4..1cf1fba24d0c 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_rotator.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_rotator.c
@@ -526,13 +526,18 @@ int mdss_mdp_rotator_setup(struct msm_fb_data_type *mfd,
list_add(&rot->list, &mdp5_data->rot_proc_list);
} else if (req->id & MDSS_MDP_ROT_SESSION_MASK) {
rot = mdss_mdp_rotator_session_get(req->id);
-
if (!rot) {
pr_err("rotator session=%x not found\n", req->id);
ret = -ENODEV;
goto rot_err;
}
+ if (work_pending(&rot->commit_work)) {
+ mutex_unlock(&rotator_lock);
+ flush_work(&rot->commit_work);
+ mutex_lock(&rotator_lock);
+ }
+
if (rot->format != fmt->format)
format_changed = true;
@@ -648,6 +653,12 @@ static int mdss_mdp_rotator_finish(struct mdss_mdp_rotator_session *rot)
rot_pipe = rot->pipe;
if (rot_pipe) {
+ if (work_pending(&rot->commit_work)) {
+ mutex_unlock(&rotator_lock);
+ cancel_work_sync(&rot->commit_work);
+ mutex_lock(&rotator_lock);
+ }
+
mdss_mdp_rotator_busy_wait(rot);
list_del(&rot->head);
}