From 4a0dc752bd9ddca4af9e0a537ec7878f78d554d9 Mon Sep 17 00:00:00 2001 From: Jihong Sui Date: Tue, 3 Sep 2019 15:21:04 +0800 Subject: [PATCH] deinterlace: add retry for pre timeout [1/1] PD#SWPL-13664 Problem: when open some special UI app, DI will have a lot of timeout, this cause display abnormal. Solution: add retry after timeout; Verify: tl1 Change-Id: I3316252577bad218256651ebbc6d4fd8b25acb12 Signed-off-by: Jihong Sui --- .../amlogic/media/deinterlace/deinterlace.c | 32 +++++++++++++++++-- .../amlogic/media/deinterlace/deinterlace.h | 4 +++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/drivers/amlogic/media/deinterlace/deinterlace.c b/drivers/amlogic/media/deinterlace/deinterlace.c index a6c373b1f23d..0d7343ab2de0 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace.c +++ b/drivers/amlogic/media/deinterlace/deinterlace.c @@ -6673,6 +6673,8 @@ static void di_unreg_process_irq(void) up(&di_sema); } #endif + /*dbg*/ + pr_info("di:retry cnt=%d\n", di_pre_stru.retry_cnt); } static void di_reg_process(void) @@ -6986,6 +6988,11 @@ static void di_reg_process_irq(void) cue_int(vframe); if (de_devp->flags & DI_LOAD_REG_FLAG) up(&di_sema); + + di_pre_stru.retry_en = false; + di_pre_stru.retry_cnt = 0; + di_pre_stru.retry_index = 0; + init_flag = 1; di_pre_stru.reg_req_flag_irq = 1; } @@ -7029,10 +7036,13 @@ static void di_process(void) (di_pre_stru.pre_de_clear_flag == 2)) { RDMA_WR(DI_INTR_CTRL, data32); #endif - pre_process_time = + if (di_pre_stru.pre_de_clear_flag == 2) { + di_pre_stru.retry_en = true; + } else { + pre_process_time = di_pre_stru.pre_de_busy_timer_count; - pre_de_done_buf_config(); - + pre_de_done_buf_config(); + } di_pre_stru.pre_de_process_done = 0; di_pre_stru.pre_de_clear_flag = 0; #ifdef CHECK_DI_DONE @@ -7060,6 +7070,22 @@ static void di_process(void) } } di_unlock_irqfiq_restore(irq_flag2); + + /************/ + if (di_pre_stru.retry_en && + (di_pre_stru.pre_de_busy == 0) && + (di_pre_stru.pre_de_process_done == 0) && + !atomic_read(&di_flag_unreg) && + (di_pre_stru.pre_de_process_flag == 0)) { + di_pre_stru.retry_index = + di_pre_stru.field_count_for_cont; + di_pre_stru.field_count_for_cont--; + di_print("di:retry set%d\n", di_pre_stru.retry_index); + pre_de_process(); + di_pre_stru.retry_en = false; + di_pre_stru.retry_cnt++; + } + if ((di_pre_stru.pre_de_busy == 0) && (di_pre_stru.pre_de_process_done == 0)) { if ((pre_run_flag == DI_RUN_FLAG_RUN) || diff --git a/drivers/amlogic/media/deinterlace/deinterlace.h b/drivers/amlogic/media/deinterlace/deinterlace.h index b55699f0bcbe..996170db0a38 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace.h +++ b/drivers/amlogic/media/deinterlace/deinterlace.h @@ -372,6 +372,10 @@ struct di_pre_stru_s { struct combing_status_s *mtn_status; u64 afbc_rls_time; bool wait_afbc; + /*****************/ + bool retry_en; + unsigned int retry_index; + unsigned int retry_cnt; }; struct di_post_stru_s {