summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiaoming Zhou <zhoux@codeaurora.org>2013-06-05 10:54:06 -0400
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:17:44 -0700
commit77b010e1fbef01db398c37bb672d640e1a6d4883 (patch)
tree9468af3c3e67e9fd1200bba3ede438d50d50efcc
parent3ee2a699af2f7f75b6478320b94c3d92df94a26e (diff)
msm: mdss: fix the dead lock in the MDP3 irq handling
A deadlock can occur when an interrupt happens while a user thread holds a spin lock and tries to call irq_disable, which waits until the interrupt is serviced. Change-Id: I350547800c79a4cdb3feb281d9a872248c137d57 Signed-off-by: Xiaoming Zhou <zhoux@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdp3.c13
1 files changed, 1 insertions, 12 deletions
diff --git a/drivers/video/fbdev/msm/mdp3.c b/drivers/video/fbdev/msm/mdp3.c
index d95e5b59da52..5cba5fad871e 100644
--- a/drivers/video/fbdev/msm/mdp3.c
+++ b/drivers/video/fbdev/msm/mdp3.c
@@ -207,18 +207,7 @@ void mdp3_irq_disable(int type)
unsigned long flag;
spin_lock_irqsave(&mdp3_res->irq_lock, flag);
- if (mdp3_res->irq_ref_count[type] <= 0) {
- pr_debug("interrupt %d not enabled\n", type);
- spin_unlock_irqrestore(&mdp3_res->irq_lock, flag);
- return;
- }
- mdp3_res->irq_ref_count[type] -= 1;
- if (mdp3_res->irq_ref_count[type] == 0) {
- mdp3_res->irq_mask &= ~BIT(type);
- MDP3_REG_WRITE(MDP3_REG_INTR_ENABLE, mdp3_res->irq_mask);
- if (!mdp3_res->irq_mask)
- disable_irq(mdp3_res->irq);
- }
+ mdp3_irq_disable_nosync(type);
spin_unlock_irqrestore(&mdp3_res->irq_lock, flag);
}