diff options
| author | Dhaval Patel <pdhaval@codeaurora.org> | 2015-10-22 14:24:51 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:48:01 -0700 |
| commit | 84dd9d0e0698901c9e5836e42d67673bffc57e9b (patch) | |
| tree | 16cce2ede6bc112103e9f4371a4170d02a130482 /drivers/video/fbdev | |
| parent | bf05762982c15d446beecf05c5f007a8fdb95b96 (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.c | 19 |
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; |
