summaryrefslogtreecommitdiff
authorTellen Yu <tellen.yu@amlogic.com>2018-04-30 05:55:50 (GMT)
committer Gerrit Code Review <gituser@droid04>2018-04-30 05:55:50 (GMT)
commit8ad3df01d2cffa98310051d98add3f7b9cf25fd2 (patch)
tree586402a44415e49c7555da9c71a92c7ac9f53a94
parent1824c31f010c48ee012a20fecbce619eb9ccd1c3 (diff)
parentd9ab781fdbd1a1865ce545c40a34dddc7a730677 (diff)
downloadcommon-8ad3df01d2cffa98310051d98add3f7b9cf25fd2.zip
common-8ad3df01d2cffa98310051d98add3f7b9cf25fd2.tar.gz
common-8ad3df01d2cffa98310051d98add3f7b9cf25fd2.tar.bz2
Merge "di: fix hardlock issue" into amlogic-4.9-dev
Diffstat
-rw-r--r--drivers/amlogic/media/deinterlace/deinterlace.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/amlogic/media/deinterlace/deinterlace.c b/drivers/amlogic/media/deinterlace/deinterlace.c
index 5a4c28a..693f993 100644
--- a/drivers/amlogic/media/deinterlace/deinterlace.c
+++ b/drivers/amlogic/media/deinterlace/deinterlace.c
@@ -5125,8 +5125,10 @@ static int process_post_vframe(void)
if (ready_count >= buffer_keep_count) {
di_lock_irqfiq_save(irq_flag2);
di_buf = get_di_buf_head(QUEUE_POST_FREE);
- if (check_di_buf(di_buf, 17))
+ if (check_di_buf(di_buf, 17)) {
+ di_unlock_irqfiq_restore(irq_flag2);
return 0;
+ }
queue_out(di_buf);
di_unlock_irqfiq_restore(irq_flag2);
@@ -5276,8 +5278,10 @@ VFRAME_EVENT_PROVIDER_VFRAME_READY, NULL);
di_lock_irqfiq_save(irq_flag2);
di_buf = get_di_buf_head(QUEUE_POST_FREE);
- if (check_di_buf(di_buf, 19))
+ if (check_di_buf(di_buf, 19)) {
+ di_unlock_irqfiq_restore(irq_flag2);
return 0;
+ }
queue_out(di_buf);
di_unlock_irqfiq_restore(irq_flag2);
@@ -5400,8 +5404,10 @@ VFRAME_EVENT_PROVIDER_VFRAME_READY, NULL);
di_lock_irqfiq_save(irq_flag2);
di_buf = get_di_buf_head(QUEUE_POST_FREE);
- if (check_di_buf(di_buf, 20))
+ if (check_di_buf(di_buf, 20)) {
+ di_unlock_irqfiq_restore(irq_flag2);
return 0;
+ }
queue_out(di_buf);
di_unlock_irqfiq_restore(irq_flag2);
@@ -5537,7 +5543,6 @@ VFRAME_EVENT_PROVIDER_VFRAME_READY, NULL);
VIDTYPE_INTERLACE_BOTTOM) {
di_buf->di_buf[1] =
di_buf->di_buf_dup_p[1] = NULL;
- di_lock_irqfiq_save(irq_flag2);
queue_in(di_buf, QUEUE_TMP);
recycle_vframe_type_post(di_buf);
pr_dbg("%s drop field %d.\n", __func__,
@@ -5622,11 +5627,11 @@ static void di_unreg_process_irq(void)
ulong flags = 0;
spin_lock_irqsave(&plist_lock, flags);
#endif
+ init_flag = 0;
mirror_disable = get_blackout_policy();
di_lock_irqfiq_save(irq_flag2);
di_print("%s: di_uninit_buf\n", __func__);
di_uninit_buf(mirror_disable);
- init_flag = 0;
#ifdef CONFIG_AMLOGIC_MEDIA_RDMA
if (di_pre_rdma_enable)
rdma_clear(de_devp->rdma_handle);
@@ -6240,6 +6245,7 @@ static int di_receiver_event_fun(int type, void *data, void *arg)
reg_unreg_timeout_cnt++;
pr_err("%s:unreg_reg_flag timeout!!!\n",
__func__);
+ di_unreg_process();
break;
}
}
@@ -6421,7 +6427,12 @@ light_unreg:
}
bypass_state = 0;
di_pre_stru.reg_req_flag = 1;
- pr_dbg("%s: vframe provider reg\n", __func__);
+ pr_dbg("%s: vframe provider reg %s\n", __func__,
+ provider_name);
+ if (reg_flag) {
+ pr_err("[DI] no muti instance.\n");
+ return -1;
+ }
trigger_pre_di_process(TRIGGER_PRE_BY_PROVERDER_REG);
di_pre_stru.reg_req_flag_cnt = 0;
while (di_pre_stru.reg_req_flag) {
@@ -6635,6 +6646,10 @@ get_vframe:
di_lock_irqfiq_save(irq_flag2);
di_buf = get_di_buf_head(QUEUE_POST_READY);
+ if (check_di_buf(di_buf, 21)) {
+ di_unlock_irqfiq_restore(irq_flag2);
+ return NULL;
+ }
queue_out(di_buf);
queue_in(di_buf, QUEUE_DISPLAY); /* add it into display_list */