summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKuogee Hsieh <khsieh@codeaurora.org>2014-03-04 17:31:28 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:28:14 -0700
commita281b8d29dbac1e53e5fbd2592c29ee169f59ef5 (patch)
treeb879f013e165636f2e5f6ed597f3f972661d78f2
parent6d013eb88a7392fb9dca602999a4a15554943a11 (diff)
msm: mdss: keep clocks on during kickoff operation
There is deadlock scenario where work thread to turn clocks off is trying to acquire DSI's mdp_busy lock while holding clk_mtx to turn mdp clocks on. Meanwhile kickoff thread holds mdp_busy lock and trying to acquire clk_mtx to turn on clock. This patch ensure that clocks are kept on and work thread is not scheduled while kickoff is in progress so that deadlock will not happen. Change-Id: Iceb5db431a7f9f0e1f56a0e3c1ced2d08d762b86 Signed-off-by: Huaibin Yang <huaibiny@codeaurora.org> Signed-off-by: Kuogee Hsieh <khsieh@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
index ecc5697c3172..cf4bfacbb363 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
@@ -259,6 +259,10 @@ static void mdss_mdp_cmd_readptr_done(void *arg)
if (!ctx->vsync_enabled) {
if (ctx->rdptr_enabled)
ctx->rdptr_enabled--;
+
+ /* keep clk on during kickoff */
+ if (ctx->rdptr_enabled == 0 && ctx->koff_cnt)
+ ctx->rdptr_enabled++;
}
if (ctx->rdptr_enabled == 0) {
@@ -547,22 +551,22 @@ int mdss_mdp_cmd_kickoff(struct mdss_mdp_ctl *ctl, void *arg)
WARN(rc, "intf %d panel on error (%d)\n", ctl->intf_num, rc);
}
- mdss_mdp_cmd_set_partial_roi(ctl);
+ spin_lock_irqsave(&ctx->clk_lock, flags);
+ ctx->koff_cnt++;
+ spin_unlock_irqrestore(&ctx->clk_lock, flags);
mdss_mdp_cmd_clk_on(ctx);
+ mdss_mdp_cmd_set_partial_roi(ctl);
+
/*
* tx dcs command if had any
*/
mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_DSI_CMDLIST_KOFF,
(void *)&ctx->recovery);
-
INIT_COMPLETION(ctx->pp_comp);
mdss_mdp_irq_enable(MDSS_MDP_IRQ_PING_PONG_COMP, ctx->pp_num);
mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_START, 1);
- spin_lock_irqsave(&ctx->clk_lock, flags);
- ctx->koff_cnt++;
- spin_unlock_irqrestore(&ctx->clk_lock, flags);
mdss_mdp_ctl_perf_set_transaction_status(ctl,
PERF_SW_COMMIT_STATE, PERF_STATUS_DONE);