>;
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 {
>;
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 {
>;
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 {
>;
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 {
>;
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 {
>;
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 {
>;
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 {
>;
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 {
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;
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)) {
#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;
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;
}
/*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");
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);
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:
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 <lin.xu@amlogic.com>");
extern bool disableapi;
extern bool force_stable;
+extern unsigned int cutwindow_val_h[5];
+extern unsigned int cutwindow_val_v[5];
+
#endif /* _TVAFE_H */
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;
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;
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);
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,
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,