diff --git a/drivers/amlogic/media/deinterlace/deinterlace.c b/drivers/amlogic/media/deinterlace/deinterlace.c index 02a5ea9c6aff..f900f1368ce4 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace.c +++ b/drivers/amlogic/media/deinterlace/deinterlace.c @@ -118,7 +118,7 @@ static di_dev_t *de_devp; static dev_t di_devno; static struct class *di_clsp; -static const char version_s[] = "2018-02-11a"; +static const char version_s[] = "2018-07-17a"; static int bypass_state = 1; static int bypass_all; @@ -303,9 +303,8 @@ void trigger_pre_di_process(unsigned char idx) if (di_sema_init_flag == 0) return; - if (idx != 'p') - log_buffer_state((idx == 'i') ? "irq" : ((idx == 'p') ? - "put" : ((idx == 'r') ? "rdy" : "oth"))); + log_buffer_state((idx == 'i') ? "irq" : ((idx == 'p') ? + "put" : ((idx == 'r') ? "rdy" : "oth"))); /* tasklet_hi_schedule(&di_pre_tasklet); */ tasklet_schedule(&di_pre_tasklet); @@ -1181,15 +1180,13 @@ store_dump_mem(struct device *dev, struct device_attribute *attr, struct vframe_s *post_vf = NULL; char *buf_orig, *ps, *token; char *parm[3] = { NULL }; - char delim1[2] = " "; + char delim1[3] = " "; char delim2[2] = "\n"; struct file *filp = NULL; loff_t pos = 0; void *buff = NULL; mm_segment_t old_fs; - if (!buf) - return len; buf_orig = kstrdup(buf, GFP_KERNEL); ps = buf_orig; strcat(delim1, delim2); @@ -1239,7 +1236,7 @@ store_dump_mem(struct device *dev, struct device_attribute *attr, buff = (void *)phys_to_virt(dump_adr); else buff = ioremap(dump_adr, nr_size); - if (buff == NULL) + if (IS_ERR_OR_NULL(buff)) pr_err("%s: ioremap error.\n", __func__); vfs_write(filp, buff, nr_size, &pos); /* pr_dbg("di_chan2_buf_dup_p:\n nr:%u,mtn:%u,cnt:%u\n", @@ -6802,22 +6799,6 @@ static int di_event_cb(int type, void *data, void *private_data) pr_info("%s: RECEIVER_FORCE_UNREG return\n", __func__); return 0; - di_pre_stru.force_unreg_req_flag = 1; - - trigger_pre_di_process(TRIGGER_PRE_BY_FORCE_UNREG); - di_pre_stru.unreg_req_flag_cnt = 0; - while (di_pre_stru.force_unreg_req_flag) { - usleep_range(1000, 1001); - di_pr_info("%s:unreg_req_flag_cnt:%d!!!\n", - __func__, di_pre_stru.unreg_req_flag_cnt); - if (di_pre_stru.unreg_req_flag_cnt++ > - di_reg_unreg_cnt) { - di_pre_stru.unreg_req_flag_cnt = 0; - di_pr_info("%s:unreg_reg_flag timeout!!!\n", - __func__); - break; - } - } } return 0; } @@ -6915,6 +6896,11 @@ static long di_ioctl(struct file *file, unsigned int cmd, unsigned long arg) pr_err("[DI] set pq parm errors\n"); return -EFAULT; } + if (tmp_pq_s.table_len >= TABLE_LEN_MAX) { + pr_err("[DI] load 0x%x wrong pq table_len.\n", + tmp_pq_s.table_len); + return -EFAULT; + } tab_flag = TABLE_NAME_DI | TABLE_NAME_NR | TABLE_NAME_MCDI | TABLE_NAME_DEBLOCK | TABLE_NAME_DEMOSQUITO; if (tmp_pq_s.table_name & tab_flag) { diff --git a/drivers/amlogic/media/deinterlace/deinterlace.h b/drivers/amlogic/media/deinterlace/deinterlace.h index 6cee1954e4df..15878b23324e 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace.h +++ b/drivers/amlogic/media/deinterlace/deinterlace.h @@ -192,6 +192,9 @@ extern bool is_vsync_rdma_enable(void); #define DI_SUSPEND_FLAG 0x2 #define DI_LOAD_REG_FLAG 0x4 #define DI_VPU_CLKB_SET 0x8 + +#define TABLE_LEN_MAX 10000 + struct di_dev_s { dev_t devt; struct cdev cdev; /* The cdev structure */ diff --git a/drivers/amlogic/media/deinterlace/deinterlace_dbg.c b/drivers/amlogic/media/deinterlace/deinterlace_dbg.c index 0da7133b6dbf..319a9d606e42 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace_dbg.c +++ b/drivers/amlogic/media/deinterlace/deinterlace_dbg.c @@ -40,7 +40,7 @@ void parse_cmd_params(char *buf_orig, char **parm) { char *ps, *token; - char delim1[2] = " "; + char delim1[3] = " "; char delim2[2] = "\n"; unsigned int n = 0; diff --git a/drivers/amlogic/media/deinterlace/deinterlace_hw.h b/drivers/amlogic/media/deinterlace/deinterlace_hw.h index ce1345849b37..145d44f337c4 100644 --- a/drivers/amlogic/media/deinterlace/deinterlace_hw.h +++ b/drivers/amlogic/media/deinterlace/deinterlace_hw.h @@ -20,7 +20,6 @@ #include #include "pulldown_drv.h" #include "nr_drv.h" -#include "deinterlace_hw.h" /* if post size < 80, filter of ei can't work */ #define MIN_POST_WIDTH 80 diff --git a/drivers/amlogic/media/deinterlace/di_pps.c b/drivers/amlogic/media/deinterlace/di_pps.c index 8c9f7f317e64..750be0179d03 100644 --- a/drivers/amlogic/media/deinterlace/di_pps.c +++ b/drivers/amlogic/media/deinterlace/di_pps.c @@ -343,6 +343,11 @@ unsigned int di_filt_coef2[] = //2 point bilinear, bank_length == 2 #define ZOOM_BITS 20 #define PHASE_BITS 16 +static enum f2v_vphase_type_e top_conv_type = F2V_P2P; +static enum f2v_vphase_type_e bot_conv_type = F2V_P2P; +static unsigned int prehsc_en; +static unsigned int prevsc_en; + static const unsigned char f2v_420_in_pos_luma[F2V_TYPE_MAX] = { 0, 2, 0, 2, 0, 0, 0, 2, 0}; //static const unsigned char f2v_420_in_pos_chroma[F2V_TYPE_MAX] = { @@ -386,16 +391,14 @@ static void f2v_get_vertical_phase(unsigned int zoom_ratio, /* * patch 1: inp scaler 0: di wr scaler */ + void di_pps_config(unsigned char path, int src_w, int src_h, int dst_w, int dst_h) { - enum f2v_vphase_type_e top_conv_type = F2V_P2P; - enum f2v_vphase_type_e bot_conv_type = F2V_P2P; struct pps_f2v_vphase_s vphase; int i; int hsc_en = 0, vsc_en = 0; - int prehsc_en = 0, prevsc_en = 0; int vsc_double_line_mode; unsigned int p_src_w, p_src_h; unsigned int vert_phase_step, horz_phase_step; diff --git a/drivers/amlogic/media/deinterlace/film_mode_fmw/film_fw1.c b/drivers/amlogic/media/deinterlace/film_mode_fmw/film_fw1.c index 6c111681c391..cd6b46782d14 100644 --- a/drivers/amlogic/media/deinterlace/film_mode_fmw/film_fw1.c +++ b/drivers/amlogic/media/deinterlace/film_mode_fmw/film_fw1.c @@ -1579,7 +1579,7 @@ int Flm22DetSft(struct sFlmDatSt *pRDat, int *nDif02, if (nFlgCk20 < flm22_chk20_sml) nFlm22Lvl = nFlm22Lvl + flm22_comlev1 - nFlgCk20; if (nFlgCk21 < flm22_chk21_sml) - nFlm22Lvl = nFlm22Lvl + flm22_comlev1 - nFlgCk20; + nFlm22Lvl = nFlm22Lvl + flm22_comlev1 - nFlgCk21; if (prt_flg) { pr_info("nFlm22Lvl=%d, nFlgCk20=%d, nFlgCk21=%d\n", nFlm22Lvl, nFlgCk20, nFlgCk21); @@ -1624,9 +1624,7 @@ static int DIweavedetec(struct sFlmSftPar *pPar, int nDif01) else difflag = 0; if (difflag^predifflag) { - if (numdif > 255) - numdif = numdif; - else + if (numdif <= 255) numdif = numdif + 1; predifflag = difflag; } else if (numdif > numthd) { diff --git a/drivers/amlogic/media/deinterlace/nr_drv.c b/drivers/amlogic/media/deinterlace/nr_drv.c index 4fa23f5d8cbd..4d93d465f2aa 100644 --- a/drivers/amlogic/media/deinterlace/nr_drv.c +++ b/drivers/amlogic/media/deinterlace/nr_drv.c @@ -791,7 +791,7 @@ void nr_process_in_irq(void) static void parse_cmd_params(char *buf_orig, char **parm) { char *ps, *token; - char delim1[2] = " "; + char delim1[3] = " "; char delim2[2] = "\n"; unsigned int n = 0; @@ -875,7 +875,7 @@ static ssize_t dnr_param_show(struct device *dev, return len; } -static nr4_param_t nr4_params[30]; +static nr4_param_t nr4_params[NR4_PARAMS_NUM]; static void nr4_params_init(struct NR4_PARM_s *nr4_parm_p) { nr4_params[0].name = "prm_nr4_srch_stp"; @@ -892,44 +892,42 @@ static void nr4_params_init(struct NR4_PARM_s *nr4_parm_p) nr4_params[5].addr = &(nr4_parm_p->sw_nr4_scene_change_flg[1]); nr4_params[6].name = "sw_nr4_scene_change_flg[2]"; nr4_params[6].addr = &(nr4_parm_p->sw_nr4_scene_change_flg[2]); - nr4_params[7].name = "sw_nr4_scene_change_flg[3]"; - nr4_params[7].addr = &(nr4_parm_p->sw_nr4_scene_change_flg[3]); - nr4_params[8].name = "sw_nr4_sad2gain_en"; - nr4_params[8].addr = &(nr4_parm_p->sw_nr4_sad2gain_en); - nr4_params[9].name = "sw_nr4_sad2gain_lut[0]"; - nr4_params[9].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[0]); - nr4_params[10].name = "sw_nr4_sad2gain_lut[1]"; - nr4_params[10].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[1]); - nr4_params[11].name = "sw_nr4_sad2gain_lut[2]"; - nr4_params[11].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[2]); - nr4_params[12].name = "sw_nr4_sad2gain_lut[3]"; - nr4_params[12].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[3]); - nr4_params[13].name = "sw_nr4_sad2gain_lut[4]"; - nr4_params[13].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[4]); - nr4_params[14].name = "sw_nr4_sad2gain_lut[5]"; - nr4_params[14].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[5]); - nr4_params[15].name = "sw_nr4_sad2gain_lut[6]"; - nr4_params[15].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[6]); - nr4_params[16].name = "sw_nr4_sad2gain_lut[7]"; - nr4_params[16].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[7]); - nr4_params[17].name = "sw_nr4_sad2gain_lut[8]"; - nr4_params[17].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[8]); - nr4_params[18].name = "sw_nr4_sad2gain_lut[9]"; - nr4_params[18].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[9]); - nr4_params[19].name = "sw_nr4_sad2gain_lut[10]"; - nr4_params[19].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[10]); - nr4_params[20].name = "sw_nr4_sad2gain_lut11]"; - nr4_params[20].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[11]); - nr4_params[21].name = "sw_nr4_sad2gain_lut[12]"; - nr4_params[21].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[12]); - nr4_params[22].name = "sw_nr4_sad2gain_lut13]"; - nr4_params[22].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[13]); - nr4_params[23].name = "sw_nr4_sad2gain_lut[14]"; - nr4_params[23].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[14]); - nr4_params[24].name = "sw_nr4_sad2gain_lut[15]"; - nr4_params[24].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[15]); - nr4_params[25].name = "nr4_debug"; - nr4_params[25].addr = &(nr4_parm_p->nr4_debug); + nr4_params[7].name = "sw_nr4_sad2gain_en"; + nr4_params[7].addr = &(nr4_parm_p->sw_nr4_sad2gain_en); + nr4_params[8].name = "sw_nr4_sad2gain_lut[0]"; + nr4_params[8].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[0]); + nr4_params[9].name = "sw_nr4_sad2gain_lut[1]"; + nr4_params[9].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[1]); + nr4_params[10].name = "sw_nr4_sad2gain_lut[2]"; + nr4_params[10].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[2]); + nr4_params[11].name = "sw_nr4_sad2gain_lut[3]"; + nr4_params[11].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[3]); + nr4_params[12].name = "sw_nr4_sad2gain_lut[4]"; + nr4_params[12].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[4]); + nr4_params[13].name = "sw_nr4_sad2gain_lut[5]"; + nr4_params[13].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[5]); + nr4_params[14].name = "sw_nr4_sad2gain_lut[6]"; + nr4_params[14].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[6]); + nr4_params[15].name = "sw_nr4_sad2gain_lut[7]"; + nr4_params[15].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[7]); + nr4_params[16].name = "sw_nr4_sad2gain_lut[8]"; + nr4_params[16].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[8]); + nr4_params[17].name = "sw_nr4_sad2gain_lut[9]"; + nr4_params[17].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[9]); + nr4_params[18].name = "sw_nr4_sad2gain_lut[10]"; + nr4_params[18].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[10]); + nr4_params[19].name = "sw_nr4_sad2gain_lut11]"; + nr4_params[19].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[11]); + nr4_params[20].name = "sw_nr4_sad2gain_lut[12]"; + nr4_params[20].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[12]); + nr4_params[21].name = "sw_nr4_sad2gain_lut13]"; + nr4_params[21].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[13]); + nr4_params[22].name = "sw_nr4_sad2gain_lut[14]"; + nr4_params[22].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[14]); + nr4_params[23].name = "sw_nr4_sad2gain_lut[15]"; + nr4_params[23].addr = &(nr4_parm_p->sw_nr4_sad2gain_lut[15]); + nr4_params[24].name = "nr4_debug"; + nr4_params[24].addr = &(nr4_parm_p->nr4_debug); }; @@ -942,8 +940,9 @@ static ssize_t nr4_param_store(struct device *dev, buf_orig = kstrdup(buff, GFP_KERNEL); parse_cmd_params(buf_orig, (char **)(&parm)); - for (i = 0; i < 30; i++) { - if (IS_ERR_OR_NULL(nr4_params[i].name)) + for (i = 0; i < NR4_PARAMS_NUM; i++) { + if (IS_ERR_OR_NULL(nr4_params[i].name) || + IS_ERR_OR_NULL(nr4_params[i].addr)) continue; if (!strcmp(parm[0], nr4_params[i].name)) { if (parm[1]) { @@ -951,6 +950,7 @@ static ssize_t nr4_param_store(struct device *dev, pr_err("DI: input value error.\n"); *(nr4_params[i].addr) = value; } + pr_info(" %d\n", *(nr4_params[i].addr)); } } @@ -965,8 +965,9 @@ static ssize_t nr4_param_show(struct device *dev, ssize_t len = 0; int i = 0; - for (i = 0; i < 30; i++) { - if (IS_ERR_OR_NULL(nr4_params[i].name)) + for (i = 0; i < NR4_PARAMS_NUM; i++) { + if (IS_ERR_OR_NULL(nr4_params[i].name) || + IS_ERR_OR_NULL(nr4_params[i].addr)) continue; len += sprintf(buff+len, "%s=%d.\n", nr4_params[i].name, *(nr4_params[i].addr)); diff --git a/drivers/amlogic/media/deinterlace/nr_drv.h b/drivers/amlogic/media/deinterlace/nr_drv.h index 85e85874b4a2..0ec80d606847 100644 --- a/drivers/amlogic/media/deinterlace/nr_drv.h +++ b/drivers/amlogic/media/deinterlace/nr_drv.h @@ -24,6 +24,7 @@ struct nr_param_s { int *addr; }; +#define NR4_PARAMS_NUM 25 #define dnr_param_t struct nr_param_s #define nr4_param_t struct nr_param_s diff --git a/drivers/amlogic/media/deinterlace/register.h b/drivers/amlogic/media/deinterlace/register.h index 1af98c1247e3..adeedbbe1b46 100644 --- a/drivers/amlogic/media/deinterlace/register.h +++ b/drivers/amlogic/media/deinterlace/register.h @@ -27,7 +27,7 @@ #define Wr_reg_bits(adr, val, start, len) \ aml_vcbus_update_bits(adr, ((1<>start) + ((aml_read_vcbus(adr)&(((1UL<>start) unsigned int RDMA_WR(unsigned int adr, unsigned int val); unsigned int RDMA_RD(unsigned int adr);