aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2016-10-25 14:57:56 +0000
committerAndroid Partner Code Review <android-gerrit-partner@google.com>2016-10-25 14:57:56 +0000
commit6c4d791842049bb9564eb0ea8a722e0820a0eb72 (patch)
treef720c345b1213efe632126820f66c576106b6756
parent81b4b7abba9ca5aa761e31612cb80d7074185cc8 (diff)
parent59cffac1083cdacc9c0a7c859b51d588db9ee7f3 (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.c21
-rw-r--r--drivers/video/msm/mdss/mdp3_ctrl.h7
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;