diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c index 47ef5be3ecdb..1e90a2bd852d 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c @@ -928,7 +928,6 @@ static void mdss_mdp_cmd_pingpong_done(void *arg) struct mdss_mdp_cmd_ctx *ctx = ctl->intf_ctx[MASTER_CTX]; struct mdss_mdp_vsync_handler *tmp; ktime_t vsync_time; - u32 status; if (!ctx) { pr_err("%s: invalid ctx\n", __func__); @@ -955,9 +954,7 @@ 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); - status = mdss_mdp_ctl_perf_get_transaction_status(ctl); - if (status == 0) - schedule_work(&ctx->pp_done_work); + schedule_work(&ctx->pp_done_work); mdss_mdp_resource_control(ctl, MDP_RSRC_CTL_EVENT_PP_DONE); @@ -978,6 +975,7 @@ static void mdss_mdp_cmd_pingpong_done(void *arg) static void pingpong_done_work(struct work_struct *work) { + u32 status; struct mdss_mdp_cmd_ctx *ctx = container_of(work, typeof(*ctx), pp_done_work); @@ -985,7 +983,9 @@ static void pingpong_done_work(struct work_struct *work) while (atomic_add_unless(&ctx->pp_done_cnt, -1, 0)) mdss_mdp_ctl_notify(ctx->ctl, MDP_NOTIFY_FRAME_DONE); - mdss_mdp_ctl_perf_release_bw(ctx->ctl); + status = mdss_mdp_ctl_perf_get_transaction_status(ctx->ctl); + if (status == 0) + mdss_mdp_ctl_perf_release_bw(ctx->ctl); } }