summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorDhaval Patel <pdhaval@codeaurora.org>2015-10-22 14:24:51 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:48:01 -0700
commit84dd9d0e0698901c9e5836e42d67673bffc57e9b (patch)
tree16cce2ede6bc112103e9f4371a4170d02a130482 /drivers/video/fbdev
parentbf05762982c15d446beecf05c5f007a8fdb95b96 (diff)
msm: mdss: trigger frame timeout when recovery is in progress
MDSS software should trigger frame timeout when command mode interface recovery is in progress. After this new place for event, there is a small window where wait4pingpong and recovery path both can trigger this event. Use atomic_add_unless api instead of read and dec so that it would add protection and avoids timeline update multiple times for same frame update. Change-Id: I412c6341ac4d547acde914409481e9b57b2b88f2 Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
index 05d0f9cea6f0..bc7f45f17e59 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
@@ -910,7 +910,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;
+ bool reset_done = false, notify_frame_timeout = false;
if (!data) {
pr_err("%s: invalid ctx\n", __func__);
@@ -937,17 +937,22 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event)
}
spin_lock_irqsave(&ctx->koff_lock, flags);
- if (reset_done && atomic_read(&ctx->koff_cnt)) {
+ if (reset_done && atomic_add_unless(&ctx->koff_cnt, -1, 0)) {
u32 pp_num = ctx->right_only_update ? ctx->right_only_pp_num :
ctx->pp_num;
pr_debug("%s: intf_num=%d\n", __func__, ctx->ctl->intf_num);
- atomic_dec(&ctx->koff_cnt);
-
mdss_mdp_irq_disable_nosync(MDSS_MDP_IRQ_PING_PONG_COMP,
pp_num);
+
+ if (mdss_mdp_cmd_do_notifier(ctx))
+ notify_frame_timeout = true;
}
spin_unlock_irqrestore(&ctx->koff_lock, flags);
+
+ if (notify_frame_timeout)
+ mdss_mdp_ctl_notify(ctx->ctl, MDP_NOTIFY_FRAME_TIMEOUT);
+
}
static void mdss_mdp_cmd_pingpong_done(void *arg)
@@ -1492,8 +1497,10 @@ static int mdss_mdp_cmd_wait4pingpong(struct mdss_mdp_ctl *ctl, void *arg)
}
ctx->pp_timeout_report_cnt++;
rc = -EPERM;
- mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_TIMEOUT);
- atomic_add_unless(&ctx->koff_cnt, -1, 0);
+ if (atomic_add_unless(&ctx->koff_cnt, -1, 0)
+ && mdss_mdp_cmd_do_notifier(ctx))
+ mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_TIMEOUT);
+
} else {
rc = 0;
ctx->pp_timeout_report_cnt = 0;