summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorUjwal Patel <ujwalp@codeaurora.org>2015-07-28 16:59:33 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:44:43 -0700
commite7e5bbf7cd4e599c0ca63a6bb1019058a9d60c4a (patch)
treed819bfc3f95e9972b076f2deb488ad3e16ce7b85 /drivers
parentcc113de0a1edd7e56e40d360723435138b083a89 (diff)
msm: mdss: prevent slow path error during DSI underflow recovery
When DSI underflow is reported, ctl reset is preformed which requires certain critical regions to be protected by mutex. However this reset itself doesn't need to be protected by koff_lock spinlock and thus move it out of spinlock to prevent mutex locking while holding spinlocks. Change-Id: I9a5da66c3db5c3839fa45a25898a5d610134594e Signed-off-by: Ujwal Patel <ujwalp@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
index 1663e060d569..62832f4c2c66 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
@@ -822,6 +822,7 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event)
{
struct mdss_mdp_cmd_ctx *ctx = data;
unsigned long flags;
+ bool reset_done = false;
if (!data) {
pr_err("%s: invalid ctx\n", __func__);
@@ -842,9 +843,13 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event)
return;
}
- spin_lock_irqsave(&ctx->koff_lock, flags);
if (atomic_read(&ctx->koff_cnt)) {
mdss_mdp_ctl_reset(ctx->ctl);
+ reset_done = true;
+ }
+
+ spin_lock_irqsave(&ctx->koff_lock, flags);
+ if (reset_done && atomic_read(&ctx->koff_cnt)) {
pr_debug("%s: intf_num=%d\n", __func__,
ctx->ctl->intf_num);
atomic_dec(&ctx->koff_cnt);