diff options
| author | Kuogee Hsieh <khsieh@codeaurora.org> | 2014-03-04 17:31:28 -0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:28:14 -0700 |
| commit | a281b8d29dbac1e53e5fbd2592c29ee169f59ef5 (patch) | |
| tree | b879f013e165636f2e5f6ed597f3f972661d78f2 | |
| parent | 6d013eb88a7392fb9dca602999a4a15554943a11 (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.c | 14 |
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); |
