diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2016-10-25 14:57:56 +0000 |
---|---|---|
committer | Android Partner Code Review <android-gerrit-partner@google.com> | 2016-10-25 14:57:56 +0000 |
commit | 6c4d791842049bb9564eb0ea8a722e0820a0eb72 (patch) | |
tree | f720c345b1213efe632126820f66c576106b6756 | |
parent | 81b4b7abba9ca5aa761e31612cb80d7074185cc8 (diff) | |
parent | 59cffac1083cdacc9c0a7c859b51d588db9ee7f3 (diff) |
Merge "mdss: move mdp3_dispatch_dma_done to a kthread" into android-msm-sturgeon-3.10android-wear-n-preview-4_r0.1
-rw-r--r-- | drivers/video/msm/mdss/mdp3_ctrl.c | 21 | ||||
-rw-r--r-- | drivers/video/msm/mdss/mdp3_ctrl.h | 7 |
2 files changed, 24 insertions, 4 deletions
diff --git a/drivers/video/msm/mdss/mdp3_ctrl.c b/drivers/video/msm/mdss/mdp3_ctrl.c index 22d2f601edd7..d1e2a4a9ca23 100644 --- a/drivers/video/msm/mdss/mdp3_ctrl.c +++ b/drivers/video/msm/mdss/mdp3_ctrl.c @@ -107,7 +107,7 @@ int mdp3_ctrl_notify(struct mdp3_session_data *ses, int event) return blocking_notifier_call_chain(&ses->notifier_head, event, ses); } -static void mdp3_dispatch_dma_done(struct work_struct *work) +static void mdp3_dispatch_dma_done(struct kthread_work *work) { struct mdp3_session_data *session; int cnt = 0; @@ -161,7 +161,7 @@ void dma_done_notify_handler(void *arg) { struct mdp3_session_data *session = (struct mdp3_session_data *)arg; atomic_inc(&session->dma_done_cnt); - schedule_work(&session->dma_done_work); + queue_kthread_work(&session->worker, &session->dma_done_work); complete(&session->dma_completion); } @@ -1864,6 +1864,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) u32 intf_type = MDP3_DMA_OUTPUT_SEL_DSI_VIDEO; int rc; int splash_mismatch = 0; + struct sched_param sched = { .sched_priority = 16 }; pr_info("mdp3_ctrl_init\n"); rc = mdp3_parse_dt_splash(mfd); @@ -1887,7 +1888,21 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) } mutex_init(&mdp3_session->lock); INIT_WORK(&mdp3_session->clk_off_work, mdp3_dispatch_clk_off); - INIT_WORK(&mdp3_session->dma_done_work, mdp3_dispatch_dma_done); + + init_kthread_worker(&mdp3_session->worker); + init_kthread_work(&mdp3_session->dma_done_work, mdp3_dispatch_dma_done); + + mdp3_session->thread = kthread_run(kthread_worker_fn, &mdp3_session->worker, + "mdp3_dispatch_dma_done"); + + if (IS_ERR(mdp3_session->thread)) { + pr_err("Can't initialize mdp3_dispatch_dma_done thread\n"); + rc = -ENODEV; + goto init_done; + } + + sched_setscheduler(mdp3_session->thread, SCHED_FIFO, &sched); + atomic_set(&mdp3_session->vsync_countdown, 0); mutex_init(&mdp3_session->histo_lock); mdp3_session->dma = mdp3_get_dma_pipe(MDP3_DMA_CAP_ALL); diff --git a/drivers/video/msm/mdss/mdp3_ctrl.h b/drivers/video/msm/mdss/mdp3_ctrl.h index 93356e26b8d9..0ebcb8212bd6 100644 --- a/drivers/video/msm/mdss/mdp3_ctrl.h +++ b/drivers/video/msm/mdss/mdp3_ctrl.h @@ -18,6 +18,7 @@ #include <linux/mutex.h> #include <linux/completion.h> #include <linux/timer.h> +#include <linux/kthread.h> #include "mdp3.h" #include "mdp3_dma.h" @@ -49,7 +50,11 @@ struct mdp3_session_data { struct mdp3_buffer_queue bufq_in; struct mdp3_buffer_queue bufq_out; struct work_struct clk_off_work; - struct work_struct dma_done_work; + + struct kthread_work dma_done_work; + struct kthread_worker worker; + struct task_struct *thread; + atomic_t dma_done_cnt; int histo_status; struct mutex histo_lock; |