diff options
| author | Ken Zhang <kenz@codeaurora.org> | 2014-06-10 09:41:03 -0400 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:30:41 -0700 |
| commit | 8865394e2763db614327d263f352dab63c827d4c (patch) | |
| tree | 906139c69f9bcb49b5d670e3bda6d3334e226418 | |
| parent | b1fae380773b252be6b18b0abdbddd642b92ba2c (diff) | |
msm: display: kickoff lock release centralization
Centralize kickoff lock releasing, use notify event to trigger
in display commit thread.
Change-Id: I06fbe0660917a0c570b1337953f7334f3706ce8e
Signed-off-by: Ken Zhang <kenz@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.c | 20 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.h | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 13 |
3 files changed, 21 insertions, 13 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 3dc572b19fd8..77ce877b87a2 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -2131,6 +2131,14 @@ static void mdss_fb_release_fences(struct msm_fb_data_type *mfd) mutex_unlock(&sync_pt_data->sync_mutex); } +static void mdss_fb_release_kickoff(struct msm_fb_data_type *mfd) +{ + if (mfd->wait_for_kickoff) { + atomic_set(&mfd->kickoff_pending, 0); + wake_up_all(&mfd->kickoff_wait_q); + } +} + /** * __mdss_fb_sync_buf_done_callback() - process async display events * @p: Notifier block registered for async events. @@ -2171,6 +2179,9 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, pr_debug("%s: frame done\n", sync_pt_data->fence_name); mdss_fb_signal_timeline(sync_pt_data); break; + case MDP_NOTIFY_FRAME_START: + mdss_fb_release_kickoff(mfd); + break; } return NOTIFY_OK; @@ -2355,15 +2366,14 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd) if (ret) pr_err("pan display failed %x on fb%d\n", ret, mfd->index); - atomic_set(&mfd->kickoff_pending, 0); - wake_up_all(&mfd->kickoff_wait_q); } if (!ret) mdss_fb_update_backlight(mfd); - if (IS_ERR_VALUE(ret) || !sync_pt_data->flushed) + if (IS_ERR_VALUE(ret) || !sync_pt_data->flushed) { + mdss_fb_release_kickoff(mfd); mdss_fb_signal_timeline(sync_pt_data); - + } return ret; } @@ -2397,8 +2407,8 @@ static int __mdss_fb_display_thread(void *data) wake_up_all(&mfd->idle_wait_q); } + mdss_fb_release_kickoff(mfd); atomic_set(&mfd->commits_pending, 0); - atomic_set(&mfd->kickoff_pending, 0); wake_up_all(&mfd->idle_wait_q); return ret; diff --git a/drivers/video/fbdev/msm/mdss_fb.h b/drivers/video/fbdev/msm/mdss_fb.h index 6a791bfa7f55..28d2c77855bf 100644 --- a/drivers/video/fbdev/msm/mdss_fb.h +++ b/drivers/video/fbdev/msm/mdss_fb.h @@ -69,6 +69,7 @@ enum mdp_notify_event { MDP_NOTIFY_FRAME_FLUSHED, MDP_NOTIFY_FRAME_DONE, MDP_NOTIFY_FRAME_TIMEOUT, + MDP_NOTIFY_FRAME_START, }; /** diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 527143d34a19..899d572cc6d0 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -1386,10 +1386,8 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, ATRACE_END("display_commit"); } - if (!need_cleanup) { - atomic_set(&mfd->kickoff_pending, 0); - wake_up_all(&mfd->kickoff_wait_q); - } + if (!need_cleanup) + mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_START); if (IS_ERR_VALUE(ret)) goto commit_fail; @@ -1417,10 +1415,9 @@ commit_fail: ATRACE_END("overlay_cleanup"); mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF, false); mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_FLUSHED); - if (need_cleanup) { - atomic_set(&mfd->kickoff_pending, 0); - wake_up_all(&mfd->kickoff_wait_q); - } + if (need_cleanup) + mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_START); + mutex_unlock(&mdp5_data->ov_lock); if (ctl->shared_lock) mutex_unlock(ctl->shared_lock); |
