From ea7e2b048104a61df5c4412cd7397dc0cfdfed8b Mon Sep 17 00:00:00 2001 From: Adrian Salido-Moreno Date: Mon, 17 Mar 2014 13:24:05 -0700 Subject: msm: mdss: ensure rotator work is done before reconfiguring session When queuing new parameters to rotator, need to ensure that current work is done before reconfiguring pipe parameters, otherwise there may be a mismatch on parameters with the buffers programmed once work is scheduled. Change-Id: I258aedca82bb10498d0ef4cbaa697a29c3c34a99 Signed-off-by: Adrian Salido-Moreno --- drivers/video/fbdev/msm/mdss_mdp_rotator.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'drivers') 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); } -- cgit v1.2.3