From 6f7a4eefeb4482bceab6c9f98d853f3fc075d91a Mon Sep 17 00:00:00 2001 From: Jayant Shekhar Date: Wed, 10 Dec 2014 09:11:21 +0530 Subject: [PATCH] msm: mdss: Don't schedule pp done work during on going commit Function mdss_mdp_ctl_perf_get_transaction_status tracks mdp status whether a commit is currently in progress. If it is then we don't schedule the work queue, otherwise schedule it. Cases where work queue is not scheduled, waitforpp takes care of notify frame done. In case of last frame update, work queue takes care of notify frame done. Change-Id: I98c9af4ec412f06d48e0ae57e5973bf34be9110d Signed-off-by: Jayant Shekhar --- drivers/video/fbdev/msm/mdss_mdp.h | 1 + drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 3247e2e61d03..7b4eb6982b1e 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -874,6 +874,7 @@ void mdss_mdp_ctl_notifier_register(struct mdss_mdp_ctl *ctl, struct notifier_block *notifier); void mdss_mdp_ctl_notifier_unregister(struct mdss_mdp_ctl *ctl, struct notifier_block *notifier); +u32 mdss_mdp_ctl_perf_get_transaction_status(struct mdss_mdp_ctl *ctl); int mdss_mdp_scan_pipes(void); diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c index e7fb1f660286..cd88132160b8 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c @@ -363,6 +363,7 @@ static void mdss_mdp_cmd_pingpong_done(void *arg) struct mdss_mdp_cmd_ctx *ctx = ctl->priv_data; struct mdss_mdp_vsync_handler *tmp; ktime_t vsync_time; + u32 status; if (!ctx) { pr_err("%s: invalid ctx\n", __func__); @@ -390,7 +391,9 @@ static void mdss_mdp_cmd_pingpong_done(void *arg) atomic_read(&ctx->koff_cnt)); if (mdss_mdp_cmd_do_notifier(ctx)) { atomic_inc(&ctx->pp_done_cnt); - schedule_work(&ctx->pp_done_work); + status = mdss_mdp_ctl_perf_get_transaction_status(ctl); + if (status == 0) + schedule_work(&ctx->pp_done_work); } wake_up_all(&ctx->pp_waitq); } else {