diff options
| author | Dhaval Patel <pdhaval@codeaurora.org> | 2013-10-28 18:52:07 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:22:50 -0700 |
| commit | ebba5a27ae46dea1384ec1dee2afc69379516219 (patch) | |
| tree | 707b69b64a24c11fb7181a1af60518501850b048 | |
| parent | 8d03b3a4ba828277e0e3cca0d9b7c4842427a70d (diff) | |
msm: mdss: Call wait4comp after commit for wb intf
Writeback path uses the comp event allocated on
stack to wait for ISR done. It crashes if
ISR tries to set the comp event after kickoff
thread timeout. This change removes the comp
event usage for writeback interface and starts
to use the wait4comp API like video/command
mode interfaces.
CRs-fixed: 555036
Change-Id: I74994a0cbe4039c6d3d4a51d573d343751182bff
Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c | 19 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_rotator.c | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_wb.c | 18 |
4 files changed, 11 insertions, 28 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 5340ccd4a3bb..7ce4ee8bb0ef 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -380,7 +380,6 @@ struct mdss_mdp_pipe { struct mdss_mdp_writeback_arg { struct mdss_mdp_data *data; - void (*callback_fnc) (void *arg); void *priv_data; }; diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c index 7d292cfe3697..f1d46214e832 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c @@ -46,8 +46,6 @@ struct mdss_mdp_writeback_ctx { struct mdss_mdp_plane_sizes dst_planes; - void (*callback_fnc) (void *arg); - void *callback_arg; spinlock_t wb_lock; struct list_head vsync_handlers; }; @@ -380,6 +378,8 @@ static int mdss_mdp_writeback_stop(struct mdss_mdp_ctl *ctl) mdss_mdp_set_intr_callback(ctx->intr_type, ctx->intf_num, NULL, NULL); + complete_all(&ctx->wb_comp); + ctl->priv_data = NULL; ctx->ref_cnt--; } @@ -404,9 +404,6 @@ static void mdss_mdp_writeback_intr_done(void *arg) mdss_mdp_irq_disable_nosync(ctx->intr_type, ctx->intf_num); - if (ctx->callback_fnc) - ctx->callback_fnc(ctx->callback_arg); - spin_lock(&ctx->wb_lock); list_for_each_entry(tmp, &ctx->vsync_handlers, list) { tmp->vsync_handler(ctl, vsync_time); @@ -482,9 +479,6 @@ static int mdss_mdp_writeback_display(struct mdss_mdp_ctl *ctl, void *arg) mdss_mdp_set_intr_callback(ctx->intr_type, ctx->intf_num, mdss_mdp_writeback_intr_done, ctl); - ctx->callback_fnc = wb_args->callback_fnc; - ctx->callback_arg = wb_args->priv_data; - flush_bits = BIT(16); /* WB */ mdp_wb_write(ctx, MDSS_MDP_REG_WB_DST_ADDR_SW_STATUS, ctl->is_secure); mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_FLUSH, flush_bits); @@ -544,6 +538,8 @@ int mdss_mdp_writeback_start(struct mdss_mdp_ctl *ctl) int mdss_mdp_writeback_display_commit(struct mdss_mdp_ctl *ctl, void *arg) { + int ret = 0; + if (ctl->shared_lock && !mutex_is_locked(ctl->shared_lock)) { pr_err("shared mutex is not locked before commit on ctl=%d\n", ctl->num); @@ -557,5 +553,10 @@ int mdss_mdp_writeback_display_commit(struct mdss_mdp_ctl *ctl, void *arg) ctl->mixer_right->params_changed++; } - return mdss_mdp_display_commit(ctl, arg); + ret = mdss_mdp_display_commit(ctl, arg); + + if (!IS_ERR_VALUE(ret)) + mdss_mdp_display_wait4comp(ctl); + + return ret; } diff --git a/drivers/video/fbdev/msm/mdss_mdp_rotator.c b/drivers/video/fbdev/msm/mdss_mdp_rotator.c index 43d187f769c9..78a09a1fbb64 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_rotator.c +++ b/drivers/video/fbdev/msm/mdss_mdp_rotator.c @@ -138,7 +138,6 @@ static int mdss_mdp_rotator_kickoff(struct mdss_mdp_ctl *ctl, { int ret; struct mdss_mdp_writeback_arg wb_args = { - .callback_fnc = NULL, .data = dst_data, .priv_data = rot, }; diff --git a/drivers/video/fbdev/msm/mdss_mdp_wb.c b/drivers/video/fbdev/msm/mdss_mdp_wb.c index 424e671c7a3c..18fb11c319b1 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_wb.c +++ b/drivers/video/fbdev/msm/mdss_mdp_wb.c @@ -526,23 +526,13 @@ static int mdss_mdp_wb_dequeue(struct msm_fb_data_type *mfd, return ret; } -static void mdss_mdp_wb_callback(void *arg) -{ - if (arg) - complete((struct completion *) arg); -} - int mdss_mdp_wb_kickoff(struct msm_fb_data_type *mfd) { struct mdss_mdp_wb *wb = mfd_to_wb(mfd); struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd); struct mdss_mdp_wb_data *node = NULL; int ret = 0; - DECLARE_COMPLETION_ONSTACK(comp); - struct mdss_mdp_writeback_arg wb_args = { - .callback_fnc = mdss_mdp_wb_callback, - .priv_data = &comp, - }; + struct mdss_mdp_writeback_arg wb_args; if (!ctl->power_on) return 0; @@ -584,12 +574,6 @@ int mdss_mdp_wb_kickoff(struct msm_fb_data_type *mfd) goto kickoff_fail; } - ret = wait_for_completion_timeout(&comp, KOFF_TIMEOUT); - if (ret == 0) - WARN(1, "wfd kick off time out=%d ctl=%d", ret, ctl->num); - else - ret = 0; - if (wb && node) { mutex_lock(&wb->lock); list_add_tail(&node->active_entry, &wb->busy_queue); |
