summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Zhang <kenz@codeaurora.org>2014-06-10 09:41:03 -0400
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:30:41 -0700
commit8865394e2763db614327d263f352dab63c827d4c (patch)
tree906139c69f9bcb49b5d670e3bda6d3334e226418
parentb1fae380773b252be6b18b0abdbddd642b92ba2c (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.c20
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c13
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);