From e24625d3841576793d2d480717df4ba57f32771c Mon Sep 17 00:00:00 2001 From: Evoke Zhang Date: Thu, 23 May 2019 13:18:21 +0800 Subject: [PATCH] tvafe: fine tune ntsc-m recurrence [1/1] PD#TV-6007 Problem: ATV scan range is not qualified Solution: 1.change 0x128 from 0x140008 to 0x1f0008 for ntsc-m 2.support cutwindow adjust debug: echo h index val >/sys/class/tvafe/tvafe0/cutwin echo v index val >/sys/class/tvafe/tvafe0/cutwin echo r >/sys/class/tvafe/tvafe0/cutwin 3.support cutwindow config in dts Verify: x301 Change-Id: Idc3a3e8857cea2462da6edcbbf4ffefab6d48f7b Signed-off-by: Evoke Zhang --- .../boot/dts/amlogic/tl1_t962x2_x301_1g.dts | 3 + .../boot/dts/amlogic/tl1_t962x2_x301_2g.dts | 3 + .../arm/boot/dts/amlogic/tm2_t962e2_ab311.dts | 3 + .../arm/boot/dts/amlogic/tm2_t962x3_ab301.dts | 3 + .../boot/dts/amlogic/tl1_t962x2_x301_1g.dts | 3 + .../boot/dts/amlogic/tl1_t962x2_x301_2g.dts | 3 + .../boot/dts/amlogic/tm2_t962e2_ab311.dts | 3 + .../boot/dts/amlogic/tm2_t962x3_ab301.dts | 3 + drivers/amlogic/media/vin/tvin/tvafe/tvafe.c | 100 ++++++------------ drivers/amlogic/media/vin/tvin/tvafe/tvafe.h | 3 + .../amlogic/media/vin/tvin/tvafe/tvafe_cvd.c | 7 +- .../media/vin/tvin/tvafe/tvafe_debug.c | 84 +++++++++++++++ .../media/vin/tvin/tvin_format_table.c | 4 +- 13 files changed, 145 insertions(+), 77 deletions(-) diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts index ce85cf4e75ca..f77d66efb0f4 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts @@ -607,6 +607,9 @@ >; clocks = <&clkc CLKID_DAC_CLK>; clock-names = "vdac_clk_gate"; + + cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */ + cutwindow_val_v = <4 8 14 16 24>; /* level 0~4 */ }; vbi { diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts index 3af94392f7fb..5fab51fd2404 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts @@ -602,6 +602,9 @@ >; clocks = <&clkc CLKID_DAC_CLK>; clock-names = "vdac_clk_gate"; + + cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */ + cutwindow_val_v = <4 8 14 16 24>; /* level 0~4 */ }; vbi { diff --git a/arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts b/arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts index 8a9a21735b01..b856026005d2 100644 --- a/arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts +++ b/arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts @@ -623,6 +623,9 @@ >; clocks = <&clkc CLKID_DAC_CLK>; clock-names = "vdac_clk_gate"; + + cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */ + cutwindow_val_v = <4 8 14 16 24>; /* level 0~4 */ }; vbi { diff --git a/arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts b/arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts index 8893deeb72fc..7a4da043ed5b 100644 --- a/arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts +++ b/arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts @@ -623,6 +623,9 @@ >; clocks = <&clkc CLKID_DAC_CLK>; clock-names = "vdac_clk_gate"; + + cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */ + cutwindow_val_v = <4 8 14 16 24>; /* level 0~4 */ }; vbi { diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts index d5f97874bdfc..91a8f01a7701 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts @@ -603,6 +603,9 @@ >; clocks = <&clkc CLKID_DAC_CLK>; clock-names = "vdac_clk_gate"; + + cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */ + cutwindow_val_v = <4 8 14 16 24>; /* level 0~4 */ }; vbi { diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts index 23fc06b1013b..5d22bdeb3a2f 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts @@ -597,6 +597,9 @@ >; clocks = <&clkc CLKID_DAC_CLK>; clock-names = "vdac_clk_gate"; + + cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */ + cutwindow_val_v = <4 8 14 16 24>; /* level 0~4 */ }; vbi { diff --git a/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts b/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts index 1ae412f52691..26e434adc08e 100644 --- a/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts +++ b/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts @@ -619,6 +619,9 @@ >; clocks = <&clkc CLKID_DAC_CLK>; clock-names = "vdac_clk_gate"; + + cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */ + cutwindow_val_v = <4 8 14 16 24>; /* level 0~4 */ }; vbi { diff --git a/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts b/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts index 85deead14db9..30ef7a285e1a 100644 --- a/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts +++ b/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts @@ -621,6 +621,9 @@ >; clocks = <&clkc CLKID_DAC_CLK>; clock-names = "vdac_clk_gate"; + + cutwindow_val_h = <0 10 18 20 62>; /* level 0~4 */ + cutwindow_val_v = <4 8 14 16 24>; /* level 0~4 */ }; vbi { diff --git a/drivers/amlogic/media/vin/tvin/tvafe/tvafe.c b/drivers/amlogic/media/vin/tvin/tvafe/tvafe.c index 4c54cedbe900..9c24d2e5e5f3 100644 --- a/drivers/amlogic/media/vin/tvin/tvafe/tvafe.c +++ b/drivers/amlogic/media/vin/tvin/tvafe/tvafe.c @@ -90,16 +90,10 @@ bool tvafe_dbg_enable; module_param(tvafe_dbg_enable, bool, 0644); MODULE_PARM_DESC(tvafe_dbg_enable, "enable/disable tvafe debug enable"); -static int cutwindow_val_v = TVAFE_VS_VE_VAL; -static int cutwindow_val_v_level0 = 4; -static int cutwindow_val_v_level1 = 8; -static int cutwindow_val_v_level2 = 14; -static int cutwindow_val_v_level3 = 16; -static int cutwindow_val_v_level4 = 24; -static int cutwindow_val_h_level1 = 10; -static int cutwindow_val_h_level2 = 18; -static int cutwindow_val_h_level3 = 20; -static int cutwindow_val_h_level4 = 62;/*48-->62 for ntsc-m*/ +/*level4: 48-->62 for ntsc-m*/ +unsigned int cutwindow_val_h[5] = {0, 10, 18, 20, 62}; +unsigned int cutwindow_val_v[5] = {4, 8, 14, 16, 24}; +static int cutwindow_val_vs_ve = TVAFE_VS_VE_VAL; /*tvconfig snow config*/ static bool snow_cfg; @@ -745,8 +739,9 @@ void tvafe_get_sig_property(struct tvin_frontend_s *fe, frontend); struct tvafe_info_s *tvafe = &devp->tvafe; enum tvin_port_e port = tvafe->parm.port; - unsigned int hs_adj_lev = cutwindow_val_h_level1; - unsigned int vs_adj_lev = cutwindow_val_v_level1; + unsigned int hs_adj_lev = cutwindow_val_h[1]; + unsigned int vs_adj_lev = cutwindow_val_v[1]; + unsigned int i; if (!(devp->flags & TVAFE_FLAG_DEV_OPENED) || (devp->flags & TVAFE_POWERDOWN_IN_IDLE)) { @@ -761,16 +756,9 @@ void tvafe_get_sig_property(struct tvin_frontend_s *fe, #ifdef TVAFE_CVD2_AUTO_DE_ENABLE if ((port >= TVIN_PORT_CVBS0) && (port <= TVIN_PORT_CVBS3)) { if (tvafe->cvd2.info.vs_adj_en) { - if (tvafe->cvd2.info.vs_adj_level == 0) - vs_adj_lev = cutwindow_val_v_level0; - else if (tvafe->cvd2.info.vs_adj_level == 1) - vs_adj_lev = cutwindow_val_v_level1; - else if (tvafe->cvd2.info.vs_adj_level == 2) - vs_adj_lev = cutwindow_val_v_level2; - else if (tvafe->cvd2.info.vs_adj_level == 3) - vs_adj_lev = cutwindow_val_v_level3; - else if (tvafe->cvd2.info.vs_adj_level == 4) - vs_adj_lev = cutwindow_val_v_level4; + i = tvafe->cvd2.info.vs_adj_level; + if (i < 5) + vs_adj_lev = cutwindow_val_v[i]; else vs_adj_lev = 0; prop->vs = vs_adj_lev; @@ -780,18 +768,16 @@ void tvafe_get_sig_property(struct tvin_frontend_s *fe, prop->ve = 0; } if (tvafe->cvd2.info.hs_adj_en) { - if (tvafe->cvd2.info.hs_adj_level == 1) - hs_adj_lev = cutwindow_val_h_level1; - else if (tvafe->cvd2.info.hs_adj_level == 2) - hs_adj_lev = cutwindow_val_h_level2; - else if (tvafe->cvd2.info.hs_adj_level == 3) - hs_adj_lev = cutwindow_val_h_level3; - else if (tvafe->cvd2.info.hs_adj_level == 4) { - hs_adj_lev = cutwindow_val_h_level4; - prop->vs = cutwindow_val_v; - prop->ve = cutwindow_val_v; - } else + i = tvafe->cvd2.info.hs_adj_level; + if (i < 4) { + hs_adj_lev = cutwindow_val_h[i]; + } else if (i == 4) { + hs_adj_lev = cutwindow_val_h[i]; + prop->vs = cutwindow_val_vs_ve; + prop->ve = cutwindow_val_vs_ve; + } else { hs_adj_lev = 0; + } if (tvafe->cvd2.info.hs_adj_dir == true) { prop->hs = 0; prop->he = hs_adj_lev; @@ -1358,7 +1344,7 @@ static int tvafe_drv_probe(struct platform_device *pdev) } /*reg mem*/ - tvafe_pr_info("%s:tvafe start get ioremap .\n", __func__); + /*tvafe_pr_info("%s:tvafe start get ioremap .\n", __func__);*/ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "missing memory resource\n"); @@ -1381,6 +1367,16 @@ static int tvafe_drv_probe(struct platform_device *pdev) tvafe_pr_info("%s: tvafe maped reg_base =%p, size=%x\n", __func__, tvafe_reg_base, size_io_reg); + /* cutwindow config */ + if (of_property_read_u32_array(pdev->dev.of_node, "cutwindow_val_h", + cutwindow_val_h, 5)) { + tvafe_pr_err("Can't get cutwindow_val_h\n"); + } + if (of_property_read_u32_array(pdev->dev.of_node, "cutwindow_val_v", + cutwindow_val_v, 5)) { + tvafe_pr_err("Can't get cutwindow_val_v\n"); + } + /* frontend */ tvin_frontend_init(&tdevp->frontend, &tvafe_dec_ops, &tvafe_sm_ops, tdevp->index); @@ -1543,7 +1539,7 @@ static int __init tvafe_drv_init(void) tvafe_pr_err("%s: failed to register driver\n", __func__); goto fail_pdrv_register; } - tvafe_pr_info("tvafe_drv_init.\n"); + /*tvafe_pr_info("tvafe_drv_init.\n");*/ return 0; fail_pdrv_register: @@ -1606,40 +1602,6 @@ RESERVEDMEM_OF_DECLARE(tvafe, "amlogic, tvafe_memory", tvafe_mem_setup); MODULE_VERSION(TVAFE_VER); - -/*only for develop debug*/ -#ifdef TVAFE_DEBUG -module_param(cutwindow_val_v, int, 0664); -MODULE_PARM_DESC(cutwindow_val_v, "cutwindow_val_v"); - -module_param(cutwindow_val_v_level0, int, 0664); -MODULE_PARM_DESC(cutwindow_val_v_level0, "cutwindow_val_v_level0"); - -module_param(cutwindow_val_v_level1, int, 0664); -MODULE_PARM_DESC(cutwindow_val_v_level1, "cutwindow_val_v_level1"); - -module_param(cutwindow_val_v_level2, int, 0664); -MODULE_PARM_DESC(cutwindow_val_v_level2, "cutwindow_val_v_level2"); - -module_param(cutwindow_val_v_level3, int, 0664); -MODULE_PARM_DESC(cutwindow_val_v_level3, "cutwindow_val_v_level3"); - -module_param(cutwindow_val_v_level4, int, 0664); -MODULE_PARM_DESC(cutwindow_val_v_level4, "cutwindow_val_v_level4"); - -module_param(cutwindow_val_h_level1, int, 0664); -MODULE_PARM_DESC(cutwindow_val_h_level1, "cutwindow_val_h_level1"); - -module_param(cutwindow_val_h_level2, int, 0664); -MODULE_PARM_DESC(cutwindow_val_h_level2, "cutwindow_val_h_level2"); - -module_param(cutwindow_val_h_level3, int, 0664); -MODULE_PARM_DESC(cutwindow_val_h_level3, "cutwindow_val_h_level3"); - -module_param(cutwindow_val_h_level4, int, 0664); -MODULE_PARM_DESC(cutwindow_val_h_level4, "cutwindow_val_h_level4"); -#endif - MODULE_DESCRIPTION("AMLOGIC TVAFE driver"); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Xu Lin "); diff --git a/drivers/amlogic/media/vin/tvin/tvafe/tvafe.h b/drivers/amlogic/media/vin/tvin/tvafe/tvafe.h index c1b08ca3f650..79e7429caea4 100644 --- a/drivers/amlogic/media/vin/tvin/tvafe/tvafe.h +++ b/drivers/amlogic/media/vin/tvin/tvafe/tvafe.h @@ -112,5 +112,8 @@ extern void tvafe_remove_device_files(struct device *dev); extern bool disableapi; extern bool force_stable; +extern unsigned int cutwindow_val_h[5]; +extern unsigned int cutwindow_val_v[5]; + #endif /* _TVAFE_H */ diff --git a/drivers/amlogic/media/vin/tvin/tvafe/tvafe_cvd.c b/drivers/amlogic/media/vin/tvin/tvafe/tvafe_cvd.c index 66e385045b01..c3f739264efe 100644 --- a/drivers/amlogic/media/vin/tvin/tvafe/tvafe_cvd.c +++ b/drivers/amlogic/media/vin/tvin/tvafe/tvafe_cvd.c @@ -2353,12 +2353,7 @@ inline void tvafe_cvd2_adj_hs_ntsc(struct tvafe_cvd2_s *cvd2, unsigned int hcnt64) { unsigned int hcnt64_max, hcnt64_min; - unsigned int diff, hcnt64_ave, i, hcnt64_standard; - - if (cpu_after_eq(MESON_CPU_MAJOR_ID_GXTVBB)) - hcnt64_standard = 0x30e0e; - else - hcnt64_standard = 0x17a00; + unsigned int diff, hcnt64_ave, i, hcnt64_standard = 0x30e0e; if ((cvd_isr_en & 0x1000) == 0) return; diff --git a/drivers/amlogic/media/vin/tvin/tvafe/tvafe_debug.c b/drivers/amlogic/media/vin/tvin/tvafe/tvafe_debug.c index 98a1694bdcf0..904db5d34625 100644 --- a/drivers/amlogic/media/vin/tvin/tvafe/tvafe_debug.c +++ b/drivers/amlogic/media/vin/tvin/tvafe/tvafe_debug.c @@ -617,6 +617,88 @@ static ssize_t tvafe_reg_show(struct device *dev, static DEVICE_ATTR(reg, 0644, tvafe_reg_show, tvafereg_store); +static ssize_t tvafe_cutwindow_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t len = 0; + + len += sprintf(buf+len, + "echo h index(d) val(d) > /sys/class/tvafe/tvafe0/cutwin;conifg cutwindow_h value\n"); + len += sprintf(buf+len, + "echo v index(d) val(d) > /sys/class/tvafe/tvafe0/cutwin;conifg cutwindow_v value\n"); + len += sprintf(buf+len, + "echo r > /sys/class/tvafe/tvafe0/cutwin;read cutwindow value\n"); + return len; +} + +static ssize_t tvafe_cutwindow_store(struct device *dev, + struct device_attribute *attr, const char *buff, size_t count) +{ + char *buf_orig, *parm[20] = {NULL}; + unsigned int index, val; + char *pr_buf; + unsigned int pr_len; + + if (!buff) + return count; + buf_orig = kstrdup(buff, GFP_KERNEL); + tvafe_parse_param(buf_orig, (char **)&parm); + + if (!strcmp(parm[0], "h")) { + if (kstrtouint(parm[1], 10, &index) < 0) + goto tvafe_cutwindow_store_err; + if (index < 5) { + if (kstrtouint(parm[2], 10, &val) < 0) + goto tvafe_cutwindow_store_err; + cutwindow_val_h[index] = val; + pr_info("set cutwindow_h[%d] = %d\n", index, val); + } else { + pr_info("error: invalid index %d\n", index); + } + } else if (!strcmp(parm[0], "v")) { + if (kstrtouint(parm[1], 10, &index) < 0) + goto tvafe_cutwindow_store_err; + if (index < 5) { + if (kstrtouint(parm[2], 10, &val) < 0) + goto tvafe_cutwindow_store_err; + cutwindow_val_v[index] = val; + pr_info("set cutwindow_v[%d] = %d\n", index, val); + } else { + pr_info("error: invalid index %d\n", index); + } + } else if (!strcmp(parm[0], "r")) { + pr_buf = kzalloc(sizeof(char) * 100, GFP_KERNEL); + if (!pr_buf) { + pr_info("print buf malloc error\n"); + goto tvafe_cutwindow_store_err; + } + pr_len = 0; + pr_len += sprintf(pr_buf+pr_len, "cutwindow_h:"); + for (index = 0; index < 5; index++) { + pr_len += sprintf(pr_buf+pr_len, + " %d", cutwindow_val_h[index]); + } + pr_len += sprintf(pr_buf+pr_len, "\ncutwindow_v:"); + for (index = 0; index < 5; index++) { + pr_len += sprintf(pr_buf+pr_len, + " %d", cutwindow_val_v[index]); + } + pr_info("%s\n", pr_buf); + kfree(pr_buf); + } else + pr_info("error: invaild command\n"); + + kfree(buf_orig); + return count; + +tvafe_cutwindow_store_err: + kfree(buf_orig); + return -EINVAL; +} + +static DEVICE_ATTR(cutwin, 0644, + tvafe_cutwindow_show, tvafe_cutwindow_store); + int tvafe_device_create_file(struct device *dev) { int ret = 0; @@ -625,12 +707,14 @@ int tvafe_device_create_file(struct device *dev) ret |= device_create_file(dev, &dev_attr_cvd_reg8a); ret |= device_create_file(dev, &dev_attr_dumpmem); ret |= device_create_file(dev, &dev_attr_reg); + ret |= device_create_file(dev, &dev_attr_cutwin); return ret; } void tvafe_remove_device_files(struct device *dev) { + device_remove_file(dev, &dev_attr_cutwin); device_remove_file(dev, &dev_attr_debug); device_remove_file(dev, &dev_attr_dumpmem); device_remove_file(dev, &dev_attr_cvd_reg8a); diff --git a/drivers/amlogic/media/vin/tvin/tvin_format_table.c b/drivers/amlogic/media/vin/tvin/tvin_format_table.c index 34ced0c1a414..f3b74bfc7a78 100644 --- a/drivers/amlogic/media/vin/tvin/tvin_format_table.c +++ b/drivers/amlogic/media/vin/tvin/tvin_format_table.c @@ -1276,7 +1276,7 @@ const unsigned int cvbs_acd_table[TVIN_SIG_FMT_CVBS_NTSC_50 - 0xa0461006, 0x70ff0404, 0x0400208c, 0x48484848, 0x00004444, 0x00000000, 0x00000000, 0x00000000, 0x08000000, 0x02020000, 0x0209c832, 0x00000000, 0xeafb4e8e, 0x2, 0xe7f14e8e, - 0x00140008, 0x20070000, 0x0036e946, 0x00001001, 0x10e0474f, + 0x001f0008, 0x20070000, 0x0036e946, 0x00001001, 0x10e0474f, 0x00880358, 0x00130103, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000050, 0x00000000, 0x000003ff, 0x00000000, 0x00000000, 0x00000000, 0x0004cfb0, 0x00000000, 0x030000f0, @@ -1716,7 +1716,7 @@ const unsigned int rf_acd_table[TVIN_SIG_FMT_CVBS_NTSC_50 - 0xa0461006, 0x70ff0404, 0x0400208c, 0x48484848, 0x00004444, 0x00000000, 0x00000000, 0x00000000, 0x08000000, 0x02020000, 0x0209c832, 0x00000000, 0xeafb4e8e, 0x2, 0xe7f14e8e, - 0x00140008, 0x20070000, 0x0036e946, 0x00001001, 0x10e0474f, + 0x001f0008, 0x20070000, 0x0036e946, 0x00001001, 0x10e0474f, 0x00880358, 0x00130103, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000050, 0x00000000, 0x000003ff, 0x00000000, 0x00000000, 0x00000000, 0x0004cfb0, 0x00000000, 0x030000f0,