diff options
| author | Xiaoming Zhou <zhoux@codeaurora.org> | 2013-06-05 10:54:06 -0400 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:17:44 -0700 |
| commit | 77b010e1fbef01db398c37bb672d640e1a6d4883 (patch) | |
| tree | 9468af3c3e67e9fd1200bba3ede438d50d50efcc | |
| parent | 3ee2a699af2f7f75b6478320b94c3d92df94a26e (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.c | 13 |
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); } |
