diff --git a/drivers/amlogic/media/deinterlace/deinterlace.c b/drivers/amlogic/media/deinterlace/deinterlace.c index 901aba05d0c0..2a52f7070be8 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace.c +++ b/drivers/amlogic/media/deinterlace/deinterlace.c @@ -3593,7 +3593,7 @@ static void pre_de_done_buf_config(void) } post_wr_buf->vframe->di_pulldown |= 0x08; - if (combing_fix_en) + if (di_pre_stru.combing_fix_en) cur_lev = adaptive_combing_fixing( di_pre_stru.mtn_status, glb_field_mot_num, @@ -3932,6 +3932,7 @@ static unsigned char pre_de_buf_config(void) u32 rls_timeout; u32 afbc_busy; u32 is_afbc_mode; + bool flg_1080i = false; if (di_blocking || !atomic_read(&de_devp->mem_flag)) return 0; @@ -4436,14 +4437,8 @@ jiffies_to_msecs(jiffies_64 - vframe->ready_jiffies64)); } else { /*********************************/ if ((di_buf->vframe->width >= 1920) && - (di_buf->vframe->height >= 1080) && - is_meson_tl1_cpu()) { - if (combing_fix_en) { - combing_fix_en = false; - fix_tl1_1080i_sawtooth_patch(); - } - } else - combing_fix_en = true; + (di_buf->vframe->height >= 1080)) + flg_1080i = true; /*********************************/ if ( @@ -4627,6 +4622,21 @@ jiffies_to_msecs(jiffies_64 - vframe->ready_jiffies64)); recovery_flag++; return 0; } + if (is_meson_tl1_cpu() && + combing_fix_en && + flg_1080i) { + di_pre_stru.combing_fix_en = false; + fix_tl1_1080i_sawtooth_patch(); + } else { + di_pre_stru.combing_fix_en = combing_fix_en; + } + + if (di_pre_stru.combing_fix_en) { + if (flg_1080i) + com_patch_pre_sw_set(1); + else + com_patch_pre_sw_set(0); + } return 1; } diff --git a/drivers/amlogic/media/deinterlace/deinterlace.h b/drivers/amlogic/media/deinterlace/deinterlace.h index c562e954113e..2cae17869430 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace.h +++ b/drivers/amlogic/media/deinterlace/deinterlace.h @@ -376,6 +376,8 @@ struct di_pre_stru_s { bool retry_en; unsigned int retry_index; unsigned int retry_cnt; + /*****************/ + bool combing_fix_en; }; struct di_post_stru_s { diff --git a/drivers/amlogic/media/deinterlace/deinterlace_dbg.c b/drivers/amlogic/media/deinterlace/deinterlace_dbg.c index 0f9079cf94e7..191f68653286 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace_dbg.c +++ b/drivers/amlogic/media/deinterlace/deinterlace_dbg.c @@ -587,6 +587,8 @@ static int dump_di_pre_stru_seq(struct seq_file *seq, void *v) di_pre_stru_p->bypass_pre ? "true" : "false"); seq_printf(seq, "%-25s = %s\n", "invert_flag", di_pre_stru_p->invert_flag ? "true" : "false"); + seq_printf(seq, "%-25s = %s\n", "combing_fix_en", + di_pre_stru_p->combing_fix_en ? "true" : "false"); return 0; } diff --git a/drivers/amlogic/media/deinterlace/deinterlace_mtn.c b/drivers/amlogic/media/deinterlace/deinterlace_mtn.c index 6c3681fae4b8..e2c3d65cc978 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace_mtn.c +++ b/drivers/amlogic/media/deinterlace/deinterlace_mtn.c @@ -182,18 +182,18 @@ static unsigned int combing_normal_setting[MAX_NUM_DI_REG] = { }; static unsigned int combing_bias_motion_setting[MAX_NUM_DI_REG] = { - 0x00202015, - 0x1A1A3A62, - 0x15200101, - 0x01200440, - 0x74200D0D, - 0x0D5A1520, - 0x0A0A0201, - 0x1A1A2662, - 0x0D200302, - 0x02020606, - 0x05080344, - 0x40020a04, + 0x00202015, /* 0 */ + 0x1A1A3A62, /* 1 */ + 0x15200101, /* 2 */ + 0x01200440, /* 3 */ + 0x74200D0D, /* 4 */ + 0x0D5A1520, /* 5 */ + 0x0A0A0201, /* 6 */ + 0x1A1A2662, /* 7 */ + 0x0D200302, /* 8 */ + 0x02020606, /* 9 */ + 0x05080344, /* 10 */ + 0x40020a04, /* 11 */ /*idea from mingliang.dong & vlsi zheng.bao begin*/ 0x0001FF12, /* 0x0001ff0c */ 0x00200204, /* 0x00400204 */ @@ -203,17 +203,17 @@ static unsigned int combing_bias_motion_setting[MAX_NUM_DI_REG] = { }; static unsigned int combing_very_motion_setting[MAX_NUM_DI_REG] = { - 0x00202015, - 0x1A1A3A62, - 0x15200101, - 0x01200440, - 0x74200D0D, - 0x0D5A1520, - 0x0A0A0201, - 0x1A1A2662, - 0x0D200302, - 0x02020606, - 0x05080344, + 0x00202015, /* 0 */ + 0x1A1A3A62, /* 1 */ + 0x15200101, /* 2 */ + 0x01200440, /* 3 */ + 0x74200D0D, /* 4 */ + 0x0D5A1520, /* 5 */ + 0x0A0A0201, /* 6 */ + 0x1A1A2662, /* 7 */ + 0x0D200302, /* 8 */ + 0x02020606, /* 9 */ + 0x05080344, /* 10 */ /*idea from mingliang.dong & vlsi zheng.bao begin*/ 0x60000404, /* 0x40020a04*/ 0x0001FF12, /* 0x0001ff0c */ @@ -222,6 +222,74 @@ static unsigned int combing_very_motion_setting[MAX_NUM_DI_REG] = { /*idea from mingliang.dong & vlsi zheng.bao end*/ 0x00000131 }; + +/************************************************** + * + **************************************************/ +static const unsigned int combing_bias_p_1080i[] = { + /**/ + 0x40020a04, /* 11 */ + /*idea from mingliang.dong & vlsi zheng.bao begin*/ + 0x0001ff0c, + 0x00400204, + 0x00016404, +}; + +static const unsigned int combing_bias_p_ori[] = { + /**/ + 0x40020a04, /* 11 */ + /*idea from mingliang.dong & vlsi zheng.bao begin*/ + 0x0001FF12, /* 0x0001ff0c */ + 0x00200204, /* 0x00400204 */ + 0x00012002, /* 0x00016404 */ +}; + +static const unsigned int combing_very_p_1080i[] = { + /*idea from mingliang.dong & vlsi zheng.bao begin*/ + 0x40020a04, + 0x0001ff0c, + 0x00400204, + 0x00016404, + /*idea from mingliang.dong & vlsi zheng.bao end*/ + +}; + +static const unsigned int combing_very_p_ori[] = { + /*idea from mingliang.dong & vlsi zheng.bao begin*/ + 0x60000404, /* 0x40020a04*/ + 0x0001FF12, /* 0x0001ff0c */ + 0x00200204, /* 0x00400204 */ + 0x00012002, /* 0x00016404 */ + /*idea from mingliang.dong & vlsi zheng.bao end*/ +}; + +static unsigned int di_mtn_p_mode; + +void com_patch_pre_sw_set(unsigned int mode) +{ + unsigned int *p1, *p2; + /*mode is 0: ori*/ + /*mode is 1: 1080i*/ + if (mode == di_mtn_p_mode) + return; + + p1 = &combing_bias_motion_setting[11]; + p2 = &combing_very_motion_setting[11]; + if (mode == 0) { + memcpy(p1, &combing_bias_p_ori[0], + sizeof(combing_bias_p_ori)); + memcpy(p2, &combing_very_p_ori[0], + sizeof(combing_very_p_ori)); + di_mtn_p_mode = 0; + } else if (mode == 1) { + memcpy(p1, &combing_bias_p_1080i[0], + sizeof(combing_bias_p_1080i)); + memcpy(p2, &combing_very_p_1080i[0], + sizeof(combing_very_p_1080i)); + di_mtn_p_mode = 1; + } +} + /*special for resolution test file*/ static unsigned int combing_resolution_setting[MAX_NUM_DI_REG] = { 0x00202015, @@ -301,6 +369,7 @@ void mtn_int_combing_glbmot(void) if (is_meson_tl1_cpu() || is_meson_tm2_cpu()) {/*from VLSI yanling.liu*/ combing_glbmot_radprat[0] = 30; } + di_mtn_p_mode = 0; } void adpative_combing_exit(void) { @@ -819,6 +888,7 @@ static const struct mtn_op_s di_ops_mtn = { .fix_tl1_1080i_sawtooth_patch = fix_tl1_1080i_sawtooth_patch, .adaptive_combing_fixing = adaptive_combing_fixing, .adpative_combing_config = adpative_combing_config, + .com_patch_pre_sw_set = com_patch_pre_sw_set, /*.module_para = dim_seq_file_module_para_mtn,*/ }; diff --git a/drivers/amlogic/media/deinterlace/deinterlace_mtn.h b/drivers/amlogic/media/deinterlace/deinterlace_mtn.h index 13cc468c7e07..8c7c6d2635fc 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace_mtn.h +++ b/drivers/amlogic/media/deinterlace/deinterlace_mtn.h @@ -46,5 +46,6 @@ int adaptive_combing_fixing( int bit_mode); void adpative_combing_exit(void); extern void mtn_int_combing_glbmot(void); +void com_patch_pre_sw_set(unsigned int mode); #endif diff --git a/drivers/amlogic/media/deinterlace/di_pqa.h b/drivers/amlogic/media/deinterlace/di_pqa.h index dbe43803cb24..74d669beb5c0 100644 --- a/drivers/amlogic/media/deinterlace/di_pqa.h +++ b/drivers/amlogic/media/deinterlace/di_pqa.h @@ -123,6 +123,7 @@ struct mtn_op_s { enum vframe_source_type_e src_type, bool prog, enum tvin_sig_fmt_e fmt); + void (*com_patch_pre_sw_set)(unsigned int mode); int (*module_para)(struct seq_file *seq); }; diff --git a/drivers/amlogic/media/di_multi/deinterlace.c b/drivers/amlogic/media/di_multi/deinterlace.c index da4fc2d2c74a..64332e68eb8e 100644 --- a/drivers/amlogic/media/di_multi/deinterlace.c +++ b/drivers/amlogic/media/di_multi/deinterlace.c @@ -3294,7 +3294,8 @@ void dim_pre_de_done_buf_config(unsigned int channel, bool flg_timeout) overturn, ppre->di_inp_buf->vframe); /*if (combing_fix_en)*/ - if (dimp_get(eDI_MP_combing_fix_en)) { + /*if (dimp_get(eDI_MP_combing_fix_en)) {*/ + if (ppre->combing_fix_en) { tmp_cur_lev /*cur_lev*/ = get_ops_mtn()->adaptive_combing_fixing( ppre->mtn_status, @@ -3759,6 +3760,7 @@ unsigned char dim_pre_de_buf_config(unsigned int channel) struct di_post_stru_s *ppost = get_post_stru(channel); struct di_dev_s *de_devp = get_dim_de_devp(); int cfg_prog_proc = dimp_get(eDI_MP_prog_proc_config); + bool flg_1080i = false; if (di_blocking || !dip_cma_st_is_ready(channel)) return 0; @@ -4215,21 +4217,11 @@ unsigned char dim_pre_de_buf_config(unsigned int channel) } } else { /*********************************/ - if ((di_buf->vframe->width >= 1920) && - (di_buf->vframe->height >= 1080) && - is_meson_tl1_cpu()) { - /*if (combing_fix_en) {*/ - if (dimp_get(eDI_MP_combing_fix_en)) { - /*combing_fix_en = false;*/ - dimp_set(eDI_MP_combing_fix_en, 0); - get_ops_mtn()->fix_tl1_1080i_sawtooth_patch(); - } - } else { - /*combing_fix_en = true;*/ - dimp_set(eDI_MP_combing_fix_en, 1); - } - + if ((di_buf->vframe->width >= 1920) && + (di_buf->vframe->height >= 1080)) + flg_1080i = true; /*********************************/ + if (!ppre->di_chan2_buf_dup_p) { ppre->field_count_for_cont = 0; /* ignore contp2rd and contprd */ @@ -4406,6 +4398,21 @@ unsigned char dim_pre_de_buf_config(unsigned int channel) recovery_flag++; return 0; } + if (is_meson_tl1_cpu() && + di_mpr(combing_fix_en) && + flg_1080i) { + ppre->combing_fix_en = false; + get_ops_mtn()->fix_tl1_1080i_sawtooth_patch(); + } else { + ppre->combing_fix_en = di_mpr(combing_fix_en); + } + + if (ppre->combing_fix_en) { + if (flg_1080i) + get_ops_mtn()->com_patch_pre_sw_set(1); + else + get_ops_mtn()->com_patch_pre_sw_set(0); + } return 1; } diff --git a/drivers/amlogic/media/di_multi/deinterlace.h b/drivers/amlogic/media/di_multi/deinterlace.h index 8a1cac03c086..a52971060d43 100644 --- a/drivers/amlogic/media/di_multi/deinterlace.h +++ b/drivers/amlogic/media/di_multi/deinterlace.h @@ -413,6 +413,7 @@ struct di_pre_stru_s { unsigned long irq_time[2]; /* combing adaptive */ struct combing_status_s *mtn_status; + bool combing_fix_en; }; struct di_post_stru_s { diff --git a/drivers/amlogic/media/di_multi/di_data_l.h b/drivers/amlogic/media/di_multi/di_data_l.h index 82a66822e1a8..bdec462730b3 100644 --- a/drivers/amlogic/media/di_multi/di_data_l.h +++ b/drivers/amlogic/media/di_multi/di_data_l.h @@ -483,7 +483,7 @@ enum eDI_MP_UI_T { eDI_MP_SUB_DI_B, eDI_MP_force_prog, /*force_prog bool*/ - eDI_MP_combing_fix_en, /*combing_fix_en bool*/ + edi_mp_combing_fix_en, /*combing_fix_en bool*/ eDI_MP_cur_lev, /*cur_lev*/ eDI_MP_pps_dstw, /*pps_dstw*/ eDI_MP_pps_dsth, /*pps_dsth*/ @@ -1357,6 +1357,8 @@ static inline int dimp_dec(enum eDI_MP_UI_T idx) return get_datal()->mp_uit[idx]; } +#define di_mpr(x) dimp_get(edi_mp_##x) + /****************************************** * mm *****************************************/ diff --git a/drivers/amlogic/media/di_multi/di_prc.c b/drivers/amlogic/media/di_multi/di_prc.c index 3a98e9910185..8929fdfd4d12 100644 --- a/drivers/amlogic/media/di_multi/di_prc.c +++ b/drivers/amlogic/media/di_multi/di_prc.c @@ -202,8 +202,8 @@ const struct di_mp_uit_s di_mp_ui_top[] = { eDI_MP_SUB_DI_B, 0}, [eDI_MP_force_prog] = {"bool:force_prog:1", eDI_MP_force_prog, 1}, - [eDI_MP_combing_fix_en] = {"bool:combing_fix_en,def:1", - eDI_MP_combing_fix_en, 1}, + [edi_mp_combing_fix_en] = {"bool:combing_fix_en,def:1", + edi_mp_combing_fix_en, 1}, [eDI_MP_cur_lev] = {"int cur_lev,def:2", eDI_MP_cur_lev, 2}, [eDI_MP_pps_dstw] = {"pps_dstw:int",