Merge "msm: kgsl: Remove an uneeded register write for A3XX GPUs"
diff --git a/drivers/video/msm/mdp4_overlay_dsi_cmd.c b/drivers/video/msm/mdp4_overlay_dsi_cmd.c
index 966ec32..a1f1281 100644
--- a/drivers/video/msm/mdp4_overlay_dsi_cmd.c
+++ b/drivers/video/msm/mdp4_overlay_dsi_cmd.c
@@ -57,7 +57,6 @@
uint32 rdptr_intr_tot;
uint32 rdptr_sirq_tot;
atomic_t suspend;
- int wait_vsync_cnt;
int blt_change;
int blt_free;
int blt_end;
@@ -65,7 +64,6 @@
struct mutex update_lock;
struct completion ov_comp;
struct completion dmap_comp;
- struct completion vsync_comp;
spinlock_t spin_lock;
struct msm_fb_data_type *mfd;
struct mdp4_overlay_pipe *base_pipe;
@@ -76,6 +74,7 @@
ktime_t vsync_time;
u32 last_vsync_ms;
struct work_struct clk_work;
+ wait_queue_head_t wait_queue;
} vsync_ctrl_db[MAX_CONTROLLER];
static void vsync_irq_enable(int intr, int term)
@@ -474,7 +473,6 @@
{
struct vsycn_ctrl *vctrl;
struct mdp4_overlay_pipe *pipe;
- unsigned long flags;
if (cndx >= MAX_CONTROLLER) {
pr_err("%s: out or range: cndx=%d\n", __func__, cndx);
@@ -487,13 +485,9 @@
if (atomic_read(&vctrl->suspend) > 0)
return;
- spin_lock_irqsave(&vctrl->spin_lock, flags);
- if (vctrl->wait_vsync_cnt == 0)
- INIT_COMPLETION(vctrl->vsync_comp);
- vctrl->wait_vsync_cnt++;
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
+ wait_event_interruptible_timeout(vctrl->wait_queue, 1,
+ msecs_to_jiffies(VSYNC_PERIOD * 8));
- wait_for_completion(&vctrl->vsync_comp);
mdp4_stat.wait4vsync0++;
}
@@ -558,8 +552,7 @@
}
vctrl->last_vsync_ms = cur_vsync_ms;
- complete_all(&vctrl->vsync_comp);
- vctrl->wait_vsync_cnt = 0;
+ wake_up_interruptible_all(&vctrl->wait_queue);
if (vctrl->expire_tick) {
vctrl->expire_tick--;
@@ -695,33 +688,21 @@
int cndx;
struct vsycn_ctrl *vctrl;
ssize_t ret = 0;
- unsigned long flags;
u64 vsync_tick;
+ ktime_t timestamp;
cndx = 0;
vctrl = &vsync_ctrl_db[0];
+ timestamp = vctrl->vsync_time;
- if (atomic_read(&vctrl->suspend) > 0)
- return 0;
+ ret = wait_event_interruptible(vctrl->wait_queue,
+ !ktime_equal(timestamp, vctrl->vsync_time) &&
+ vctrl->vsync_enabled);
+ if (ret == -ERESTARTSYS)
+ return ret;
- spin_lock_irqsave(&vctrl->spin_lock, flags);
- if (vctrl->wait_vsync_cnt == 0)
- INIT_COMPLETION(vctrl->vsync_comp);
- vctrl->wait_vsync_cnt++;
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
-
- ret = wait_for_completion_interruptible_timeout(&vctrl->vsync_comp,
- msecs_to_jiffies(VSYNC_PERIOD * 4));
- if (ret <= 0) {
- vctrl->wait_vsync_cnt = 0;
- vctrl->vsync_time = ktime_get();
- }
-
- spin_lock_irqsave(&vctrl->spin_lock, flags);
vsync_tick = ktime_to_ns(vctrl->vsync_time);
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
-
- ret = snprintf(buf, PAGE_SIZE, "VSYNC=%llu", vsync_tick);
+ ret = scnprintf(buf, PAGE_SIZE, "VSYNC=%llu", vsync_tick);
buf[strlen(buf) + 1] = '\0';
return ret;
}
@@ -744,8 +725,8 @@
mutex_init(&vctrl->update_lock);
init_completion(&vctrl->ov_comp);
init_completion(&vctrl->dmap_comp);
- init_completion(&vctrl->vsync_comp);
spin_lock_init(&vctrl->spin_lock);
+ init_waitqueue_head(&vctrl->wait_queue);
atomic_set(&vctrl->suspend, 1);
INIT_WORK(&vctrl->clk_work, clk_ctrl_work);
}
@@ -1109,8 +1090,7 @@
need_wait = 0;
mutex_lock(&vctrl->update_lock);
-
- complete_all(&vctrl->vsync_comp);
+ wake_up_interruptible_all(&vctrl->wait_queue);
pr_debug("%s: clk=%d pan=%d\n", __func__,
vctrl->clk_enabled, vctrl->pan_display);
diff --git a/drivers/video/msm/mdp4_overlay_dsi_video.c b/drivers/video/msm/mdp4_overlay_dsi_video.c
index 2fe2ba7..7d0b6b8 100644
--- a/drivers/video/msm/mdp4_overlay_dsi_video.c
+++ b/drivers/video/msm/mdp4_overlay_dsi_video.c
@@ -53,8 +53,6 @@
int ov_koff;
int ov_done;
atomic_t suspend;
- atomic_t vsync_resume;
- int wait_vsync_cnt;
int blt_change;
int blt_free;
int blt_ctrl;
@@ -62,13 +60,13 @@
struct mutex update_lock;
struct completion ov_comp;
struct completion dmap_comp;
- struct completion vsync_comp;
spinlock_t spin_lock;
struct msm_fb_data_type *mfd;
struct mdp4_overlay_pipe *base_pipe;
struct vsync_update vlist[2];
int vsync_irq_enabled;
ktime_t vsync_time;
+ wait_queue_head_t wait_queue;
} vsync_ctrl_db[MAX_CONTROLLER];
static void vsync_irq_enable(int intr, int term)
@@ -314,8 +312,7 @@
if (vsync_irq_cnt == 0)
vsync_irq_disable(INTR_PRIMARY_VSYNC,
MDP_PRIM_VSYNC_TERM);
- vctrl->wait_vsync_cnt = 0;
- complete_all(&vctrl->vsync_comp);
+ wake_up_interruptible_all(&vctrl->wait_queue);
}
}
pr_debug("%s: enable=%d cnt=%d\n", __func__, enable, vsync_irq_cnt);
@@ -337,16 +334,12 @@
vctrl->vsync_irq_enabled = enable;
mdp4_video_vsync_irq_ctrl(cndx, enable);
-
- if (vctrl->vsync_irq_enabled && atomic_read(&vctrl->suspend) == 0)
- atomic_set(&vctrl->vsync_resume, 1);
}
void mdp4_dsi_video_wait4vsync(int cndx)
{
struct vsycn_ctrl *vctrl;
struct mdp4_overlay_pipe *pipe;
- unsigned long flags;
int ret;
if (cndx >= MAX_CONTROLLER) {
@@ -362,15 +355,9 @@
mdp4_video_vsync_irq_ctrl(cndx, 1);
- spin_lock_irqsave(&vctrl->spin_lock, flags);
- if (vctrl->wait_vsync_cnt == 0)
- INIT_COMPLETION(vctrl->vsync_comp);
+ ret = wait_event_interruptible_timeout(vctrl->wait_queue, 1,
+ msecs_to_jiffies(VSYNC_PERIOD * 8));
- vctrl->wait_vsync_cnt++;
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
- /* double the timeout in vsync time stamp generation */
- ret = wait_for_completion_interruptible_timeout(&vctrl->vsync_comp,
- msecs_to_jiffies(VSYNC_PERIOD * 8));
if (ret <= 0)
pr_err("%s timeout ret=%d", __func__, ret);
@@ -438,61 +425,21 @@
int cndx;
struct vsycn_ctrl *vctrl;
ssize_t ret = 0;
- unsigned long flags;
u64 vsync_tick;
- ktime_t ctime;
- u32 ctick, ptick;
- int diff;
-
+ ktime_t timestamp;
cndx = 0;
vctrl = &vsync_ctrl_db[0];
+ timestamp = vctrl->vsync_time;
- if (atomic_read(&vctrl->suspend) > 0 ||
- atomic_read(&vctrl->vsync_resume) == 0)
- return 0;
+ ret = wait_event_interruptible(vctrl->wait_queue,
+ !ktime_equal(timestamp, vctrl->vsync_time) &&
+ vctrl->vsync_irq_enabled);
+ if (ret == -ERESTARTSYS)
+ return ret;
- /*
- * show_event thread keep spinning on vctrl->vsync_comp
- * race condition on x.done if multiple thread blocked
- * at wait_for_completion(&vctrl->vsync_comp)
- *
- * if show_event thread waked up first then it will come back
- * and call INIT_COMPLETION(vctrl->vsync_comp) which set x.done = 0
- * then second thread wakeed up which set x.done = 0x7ffffffd
- * after that wait_for_completion will never wait.
- * To avoid this, force show_event thread to sleep 5 ms here
- * since it has full vsycn period (16.6 ms) to wait
- */
- ctime = ktime_get();
- ctick = (u32)ktime_to_us(ctime);
- ptick = (u32)ktime_to_us(vctrl->vsync_time);
- ptick += 5000; /* 5ms */
- diff = ptick - ctick;
- if (diff > 0) {
- if (diff > 1000) /* 1 ms */
- diff = 1000;
- usleep(diff);
- }
-
- spin_lock_irqsave(&vctrl->spin_lock, flags);
- if (vctrl->wait_vsync_cnt == 0)
- INIT_COMPLETION(vctrl->vsync_comp);
- vctrl->wait_vsync_cnt++;
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
- ret = wait_for_completion_interruptible_timeout(&vctrl->vsync_comp,
- msecs_to_jiffies(VSYNC_PERIOD * 4));
- if (ret <= 0) {
- complete_all(&vctrl->vsync_comp);
- vctrl->wait_vsync_cnt = 0;
- vctrl->vsync_time = ktime_get();
- }
-
- spin_lock_irqsave(&vctrl->spin_lock, flags);
vsync_tick = ktime_to_ns(vctrl->vsync_time);
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
-
- ret = snprintf(buf, PAGE_SIZE, "VSYNC=%llu", vsync_tick);
+ ret = scnprintf(buf, PAGE_SIZE, "VSYNC=%llu", vsync_tick);
buf[strlen(buf) + 1] = '\0';
return ret;
}
@@ -515,12 +462,11 @@
vctrl->inited = 1;
vctrl->update_ndx = 0;
mutex_init(&vctrl->update_lock);
- init_completion(&vctrl->vsync_comp);
init_completion(&vctrl->dmap_comp);
init_completion(&vctrl->ov_comp);
atomic_set(&vctrl->suspend, 1);
- atomic_set(&vctrl->vsync_resume, 1);
spin_lock_init(&vctrl->spin_lock);
+ init_waitqueue_head(&vctrl->wait_queue);
}
void mdp4_dsi_video_free_base_pipe(struct msm_fb_data_type *mfd)
@@ -817,11 +763,6 @@
mdp4_dsi_video_wait4vsync(cndx);
- atomic_set(&vctrl->vsync_resume, 0);
-
- complete_all(&vctrl->vsync_comp);
- vctrl->wait_vsync_cnt = 0;
-
if (pipe->ov_blt_addr) {
spin_lock_irqsave(&vctrl->spin_lock, flags);
if (vctrl->ov_koff != vctrl->ov_done)
@@ -1051,10 +992,8 @@
pr_debug("%s: cpu=%d\n", __func__, smp_processor_id());
spin_lock(&vctrl->spin_lock);
-
vctrl->vsync_time = ktime_get();
- complete_all(&vctrl->vsync_comp);
- vctrl->wait_vsync_cnt = 0;
+ wake_up_interruptible_all(&vctrl->wait_queue);
spin_unlock(&vctrl->spin_lock);
}
diff --git a/drivers/video/msm/mdp4_overlay_dtv.c b/drivers/video/msm/mdp4_overlay_dtv.c
index ee7aa66..a6a45f4 100644
--- a/drivers/video/msm/mdp4_overlay_dtv.c
+++ b/drivers/video/msm/mdp4_overlay_dtv.c
@@ -71,21 +71,19 @@
int update_ndx;
int dmae_intr_cnt;
atomic_t suspend;
- atomic_t vsync_resume;
int dmae_wait_cnt;
- int wait_vsync_cnt;
int blt_change;
int sysfs_created;
struct mutex update_lock;
struct completion ov_comp;
struct completion dmae_comp;
- struct completion vsync_comp;
spinlock_t spin_lock;
struct msm_fb_data_type *mfd;
struct mdp4_overlay_pipe *base_pipe;
struct vsync_update vlist[2];
int vsync_irq_enabled;
ktime_t vsync_time;
+ wait_queue_head_t wait_queue;
} vsync_ctrl_db[MAX_CONTROLLER];
static void vsync_irq_enable(int intr, int term)
@@ -340,7 +338,7 @@
vctrl = &vsync_ctrl_db[cndx];
if (!external_common_state->hpd_state)
- complete_all(&vctrl->vsync_comp);
+ wake_up_interruptible_all(&vctrl->wait_queue);
if (vctrl->vsync_irq_enabled == enable)
return;
@@ -351,15 +349,12 @@
mdp4_dtv_vsync_irq_ctrl(cndx, enable);
- if (vctrl->vsync_irq_enabled && atomic_read(&vctrl->suspend) == 0)
- atomic_set(&vctrl->vsync_resume, 1);
}
void mdp4_dtv_wait4vsync(int cndx)
{
struct vsycn_ctrl *vctrl;
struct mdp4_overlay_pipe *pipe;
- unsigned long flags;
if (cndx >= MAX_CONTROLLER) {
pr_err("%s: out or range: cndx=%d\n", __func__, cndx);
@@ -374,14 +369,9 @@
mdp4_dtv_vsync_irq_ctrl(cndx, 1);
- spin_lock_irqsave(&vctrl->spin_lock, flags);
+ wait_event_interruptible_timeout(vctrl->wait_queue, 1,
+ msecs_to_jiffies(VSYNC_PERIOD * 8));
- if (vctrl->wait_vsync_cnt == 0)
- INIT_COMPLETION(vctrl->vsync_comp);
- vctrl->wait_vsync_cnt++;
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
-
- wait_for_completion(&vctrl->vsync_comp);
mdp4_dtv_vsync_irq_ctrl(cndx, 0);
mdp4_stat.wait4vsync1++;
}
@@ -409,64 +399,25 @@
int cndx;
struct vsycn_ctrl *vctrl;
ssize_t ret = 0;
- unsigned long flags;
u64 vsync_tick;
- ktime_t ctime;
- u32 ctick, ptick;
- int diff;
+ ktime_t timestamp;
cndx = 0;
vctrl = &vsync_ctrl_db[0];
+ timestamp = vctrl->vsync_time;
- if (atomic_read(&vctrl->suspend) > 0 ||
- !external_common_state->hpd_state ||
- atomic_read(&vctrl->vsync_resume) == 0)
- return 0;
+ ret = wait_event_interruptible(vctrl->wait_queue,
+ !ktime_equal(timestamp, vctrl->vsync_time) &&
+ vctrl->vsync_irq_enabled);
+ if (ret == -ERESTARTSYS)
+ return ret;
- /*
- * show_event thread keep spinning on vctrl->vsync_comp
- * race condition on x.done if multiple thread blocked
- * at wait_for_completion(&vctrl->vsync_comp)
- *
- * if show_event thread waked up first then it will come back
- * and call INIT_COMPLETION(vctrl->vsync_comp) which set x.done = 0
- * then second thread wakeed up which set x.done = 0x7ffffffd
- * after that wait_for_completion will never wait.
- * To avoid this, force show_event thread to sleep 5 ms here
- * since it has full vsycn period (16.6 ms) to wait
- */
- ctime = ktime_get();
- ctick = (u32)ktime_to_us(ctime);
- ptick = (u32)ktime_to_us(vctrl->vsync_time);
- ptick += 5000; /* 5ms */
- diff = ptick - ctick;
- if (diff > 0) {
- if (diff > 1000) /* 1 ms */
- diff = 1000;
- usleep(diff);
- }
-
- spin_lock_irqsave(&vctrl->spin_lock, flags);
- if (vctrl->wait_vsync_cnt == 0)
- INIT_COMPLETION(vctrl->vsync_comp);
- vctrl->wait_vsync_cnt++;
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
-
- ret = wait_for_completion_interruptible_timeout(&vctrl->vsync_comp,
- msecs_to_jiffies(VSYNC_PERIOD * 4));
- if (ret <= 0) {
- vctrl->wait_vsync_cnt = 0;
- vctrl->vsync_time = ktime_get();
- }
-
- spin_lock_irqsave(&vctrl->spin_lock, flags);
vsync_tick = ktime_to_ns(vctrl->vsync_time);
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
-
- ret = snprintf(buf, PAGE_SIZE, "VSYNC=%llu", vsync_tick);
+ ret = scnprintf(buf, PAGE_SIZE, "VSYNC=%llu", vsync_tick);
buf[strlen(buf) + 1] = '\0';
return ret;
}
+
void mdp4_dtv_vsync_init(int cndx)
{
struct vsycn_ctrl *vctrl;
@@ -485,12 +436,11 @@
vctrl->inited = 1;
vctrl->update_ndx = 0;
mutex_init(&vctrl->update_lock);
- init_completion(&vctrl->vsync_comp);
init_completion(&vctrl->ov_comp);
init_completion(&vctrl->dmae_comp);
atomic_set(&vctrl->suspend, 1);
- atomic_set(&vctrl->vsync_resume, 1);
spin_lock_init(&vctrl->spin_lock);
+ init_waitqueue_head(&vctrl->wait_queue);
}
static int mdp4_dtv_start(struct msm_fb_data_type *mfd)
@@ -699,8 +649,6 @@
unsigned long flags;
spin_lock_irqsave(&vctrl->spin_lock, flags);
- INIT_COMPLETION(vctrl->vsync_comp);
- vctrl->wait_vsync_cnt++;
MDP_OUTP(MDP_BASE + DTV_BASE, 0); /* turn off timing generator */
spin_unlock_irqrestore(&vctrl->spin_lock, flags);
@@ -726,10 +674,7 @@
mdp4_dtv_wait4vsync(cndx);
- atomic_set(&vctrl->vsync_resume, 0);
-
- complete_all(&vctrl->vsync_comp);
- vctrl->wait_vsync_cnt = 0;
+ wake_up_interruptible_all(&vctrl->wait_queue);
pipe = vctrl->base_pipe;
if (pipe != NULL) {
@@ -982,9 +927,7 @@
spin_lock(&vctrl->spin_lock);
vctrl->vsync_time = ktime_get();
-
- complete_all(&vctrl->vsync_comp);
- vctrl->wait_vsync_cnt = 0;
+ wake_up_interruptible_all(&vctrl->wait_queue);
spin_unlock(&vctrl->spin_lock);
}
diff --git a/drivers/video/msm/mdp4_overlay_lcdc.c b/drivers/video/msm/mdp4_overlay_lcdc.c
index 31153bf..62d7416 100644
--- a/drivers/video/msm/mdp4_overlay_lcdc.c
+++ b/drivers/video/msm/mdp4_overlay_lcdc.c
@@ -53,21 +53,19 @@
int ov_koff;
int ov_done;
atomic_t suspend;
- atomic_t vsync_resume;
- int wait_vsync_cnt;
int blt_change;
int blt_free;
int sysfs_created;
struct mutex update_lock;
struct completion ov_comp;
struct completion dmap_comp;
- struct completion vsync_comp;
spinlock_t spin_lock;
struct msm_fb_data_type *mfd;
struct mdp4_overlay_pipe *base_pipe;
struct vsync_update vlist[2];
int vsync_irq_enabled;
ktime_t vsync_time;
+ wait_queue_head_t wait_queue;
} vsync_ctrl_db[MAX_CONTROLLER];
@@ -349,15 +347,12 @@
mdp4_lcdc_vsync_irq_ctrl(cndx, enable);
- if (vctrl->vsync_irq_enabled && atomic_read(&vctrl->suspend) == 0)
- atomic_set(&vctrl->vsync_resume, 1);
}
void mdp4_lcdc_wait4vsync(int cndx)
{
struct vsycn_ctrl *vctrl;
struct mdp4_overlay_pipe *pipe;
- unsigned long flags;
if (cndx >= MAX_CONTROLLER) {
pr_err("%s: out or range: cndx=%d\n", __func__, cndx);
@@ -372,14 +367,9 @@
mdp4_lcdc_vsync_irq_ctrl(cndx, 1);
- spin_lock_irqsave(&vctrl->spin_lock, flags);
+ wait_event_interruptible_timeout(vctrl->wait_queue, 1,
+ msecs_to_jiffies(VSYNC_PERIOD * 8));
- if (vctrl->wait_vsync_cnt == 0)
- INIT_COMPLETION(vctrl->vsync_comp);
- vctrl->wait_vsync_cnt++;
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
-
- wait_for_completion(&vctrl->vsync_comp);
mdp4_lcdc_vsync_irq_ctrl(cndx, 0);
mdp4_stat.wait4vsync0++;
}
@@ -424,59 +414,21 @@
int cndx;
struct vsycn_ctrl *vctrl;
ssize_t ret = 0;
- unsigned long flags;
u64 vsync_tick;
- ktime_t ctime;
- u32 ctick, ptick;
- int diff;
+ ktime_t timestamp;
cndx = 0;
vctrl = &vsync_ctrl_db[0];
+ timestamp = vctrl->vsync_time;
- if (atomic_read(&vctrl->suspend) > 0 ||
- atomic_read(&vctrl->vsync_resume) == 0)
- return 0;
+ ret = wait_event_interruptible(vctrl->wait_queue,
+ !ktime_equal(timestamp, vctrl->vsync_time) &&
+ vctrl->vsync_irq_enabled);
+ if (ret == -ERESTARTSYS)
+ return ret;
- /*
- * show_event thread keep spinning on vctrl->vsync_comp
- * race condition on x.done if multiple thread blocked
- * at wait_for_completion(&vctrl->vsync_comp)
- *
- * if show_event thread waked up first then it will come back
- * and call INIT_COMPLETION(vctrl->vsync_comp) which set x.done = 0
- * then second thread wakeed up which set x.done = 0x7ffffffd
- * after that wait_for_completion will never wait.
- * To avoid this, force show_event thread to sleep 5 ms here
- * since it has full vsycn period (16.6 ms) to wait
- */
- ctime = ktime_get();
- ctick = (u32)ktime_to_us(ctime);
- ptick = (u32)ktime_to_us(vctrl->vsync_time);
- ptick += 5000; /* 5ms */
- diff = ptick - ctick;
- if (diff > 0) {
- if (diff > 1000) /* 1 ms */
- diff = 1000;
- usleep(diff);
- }
-
- spin_lock_irqsave(&vctrl->spin_lock, flags);
- if (vctrl->wait_vsync_cnt == 0)
- INIT_COMPLETION(vctrl->vsync_comp);
- vctrl->wait_vsync_cnt++;
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
- ret = wait_for_completion_interruptible_timeout(&vctrl->vsync_comp,
- msecs_to_jiffies(VSYNC_PERIOD * 4));
- if (ret <= 0) {
- vctrl->wait_vsync_cnt = 0;
- vctrl->vsync_time = ktime_get();
- }
-
- spin_lock_irqsave(&vctrl->spin_lock, flags);
vsync_tick = ktime_to_ns(vctrl->vsync_time);
- spin_unlock_irqrestore(&vctrl->spin_lock, flags);
-
- ret = snprintf(buf, PAGE_SIZE, "VSYNC=%llu", vsync_tick);
+ ret = scnprintf(buf, PAGE_SIZE, "VSYNC=%llu", vsync_tick);
buf[strlen(buf) + 1] = '\0';
return ret;
}
@@ -499,12 +451,11 @@
vctrl->inited = 1;
vctrl->update_ndx = 0;
mutex_init(&vctrl->update_lock);
- init_completion(&vctrl->vsync_comp);
init_completion(&vctrl->dmap_comp);
init_completion(&vctrl->ov_comp);
atomic_set(&vctrl->suspend, 1);
- atomic_set(&vctrl->vsync_resume, 1);
spin_lock_init(&vctrl->spin_lock);
+ init_waitqueue_head(&vctrl->wait_queue);
}
void mdp4_lcdc_free_base_pipe(struct msm_fb_data_type *mfd)
@@ -773,8 +724,6 @@
unsigned long flags;
spin_lock_irqsave(&vctrl->spin_lock, flags);
- INIT_COMPLETION(vctrl->vsync_comp);
- vctrl->wait_vsync_cnt++;
MDP_OUTP(MDP_BASE + LCDC_BASE, 0); /* turn off timing generator */
spin_unlock_irqrestore(&vctrl->spin_lock, flags);
@@ -800,10 +749,7 @@
mdp4_lcdc_wait4vsync(cndx);
- atomic_set(&vctrl->vsync_resume, 0);
-
- complete_all(&vctrl->vsync_comp);
- vctrl->wait_vsync_cnt = 0;
+ wake_up_interruptible_all(&vctrl->wait_queue);
if (pipe->ov_blt_addr) {
spin_lock_irqsave(&vctrl->spin_lock, flags);
@@ -933,9 +879,7 @@
spin_lock(&vctrl->spin_lock);
vctrl->vsync_time = ktime_get();
-
- complete_all(&vctrl->vsync_comp);
- vctrl->wait_vsync_cnt = 0;
+ wake_up_interruptible_all(&vctrl->wait_queue);
spin_unlock(&vctrl->spin_lock);
}