From 0bec908e12f2bdb7a0a9138d48caa240e122da9a Mon Sep 17 00:00:00 2001 From: "nengwen.chen" Date: Mon, 6 May 2019 16:02:55 +0800 Subject: [PATCH] atv_demod: add atbm2040 tuner support [1/3] PD#TV-5499 Problem: add atbm2040 tuner support. Solution: add atbm2040 tuner support. Verify: Verified by x301. Change-Id: I89f82727c7c11f5fc6377584d519a17fe3449c4a Signed-off-by: nengwen.chen --- drivers/amlogic/atv_demod/atv_demod_driver.c | 8 +++++++- drivers/amlogic/atv_demod/atv_demod_ops.c | 17 +++++++++++++++++ drivers/amlogic/atv_demod/atvdemod_func.c | 12 ++---------- include/linux/amlogic/aml_atvdemod.h | 3 +++ 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/drivers/amlogic/atv_demod/atv_demod_driver.c b/drivers/amlogic/atv_demod/atv_demod_driver.c index ae97763b021c..b363c4df4113 100644 --- a/drivers/amlogic/atv_demod/atv_demod_driver.c +++ b/drivers/amlogic/atv_demod/atv_demod_driver.c @@ -479,6 +479,8 @@ static void aml_atvdemod_dt_parse(struct aml_atvdemod_device *pdev) pdev->tuners[i].cfg.id = AM_TUNER_R840; else if (!strncmp(str, "r842_tuner", 10)) pdev->tuners[i].cfg.id = AM_TUNER_R842; + else if (!strncmp(str, "atbm2040_tuner", 14)) + pdev->tuners[i].cfg.id = AM_TUNER_ATBM2040; else { pr_err("can't support tuner: %s.\n", str); pdev->tuners[i].cfg.id = AM_TUNER_NONE; @@ -523,7 +525,7 @@ static void aml_atvdemod_dt_parse(struct aml_atvdemod_device *pdev) else pdev->tuners[i].cfg.xtal_cap = val; - pr_err("find tuner %d.\n", i); + pr_err("find tuner %s [%d].\n", str, pdev->tuners[i].cfg.id); } of_node_put(node_tuner); @@ -592,6 +594,10 @@ int aml_attach_tuner(struct aml_atvdemod_device *dev) p = v4l2_attach(mxl661_attach, fe, dev->tuners[dev->tuner_cur].i2c_adp, cfg); break; + case AM_TUNER_ATBM2040: + p = v4l2_attach(atbm2040_attach, fe, + dev->tuners[dev->tuner_cur].i2c_adp, cfg); + break; default: pr_err("%s: Nonsupport tuner [%d].\n", __func__, cfg->id); break; diff --git a/drivers/amlogic/atv_demod/atv_demod_ops.c b/drivers/amlogic/atv_demod/atv_demod_ops.c index f2ccf45bd7dc..8fed54697c1a 100644 --- a/drivers/amlogic/atv_demod/atv_demod_ops.c +++ b/drivers/amlogic/atv_demod/atv_demod_ops.c @@ -445,6 +445,10 @@ static struct analog_demod_ops atvdemod_ops = { unsigned int tuner_status_cnt = 4; /* 4-->16 test on sky mxl661 */ +/* 0: no check, 1: check */ +bool check_rssi = true; +/* Less than -85, it means no signal */ +int tuner_rssi = -80; bool slow_mode; @@ -716,6 +720,7 @@ static void atvdemod_fe_try_signal(struct v4l2_frontend *v4l2_fe, /* unsigned int audio = 0; */ /* bool try_secam = false; */ unsigned int tuner_id = priv->atvdemod_param.tuner_id; + s16 strength = 0; params.frequency = p->frequency; params.mode = p->afc_range; @@ -736,6 +741,18 @@ static void atvdemod_fe_try_signal(struct v4l2_frontend *v4l2_fe, usleep_range(10 * 1000, 10 * 1000 + 100); } + /* Add tuner rssi strength check */ + if (tuner_id == AM_TUNER_ATBM2040 && + fe->ops.tuner_ops.get_strength && check_rssi) { + fe->ops.tuner_ops.get_strength(fe, &strength); + if (strength < tuner_rssi) { + pr_err("[%s] freq: %d tuner RSSI [%d] less than [%d].\n", + __func__, p->frequency, + strength, tuner_rssi); + break; + } + } + fe->ops.analog_ops.has_signal(fe, (u16 *)&ade_state); try_cnt--; if (((ade_state == V4L2_HAS_LOCK || diff --git a/drivers/amlogic/atv_demod/atvdemod_func.c b/drivers/amlogic/atv_demod/atvdemod_func.c index de89d459bb4e..d96efae11214 100644 --- a/drivers/amlogic/atv_demod/atvdemod_func.c +++ b/drivers/amlogic/atv_demod/atvdemod_func.c @@ -2000,8 +2000,6 @@ void atvdemod_uninit(void) void atv_dmd_set_std(void) { v4l2_std_id ptstd = amlatvdemod_devp->std; - int tuner_index = amlatvdemod_devp->tuner_cur; - int tuner_id = amlatvdemod_devp->tuners[tuner_index].cfg.id; /* set broad standard of tuner*/ if (((ptstd & V4L2_COLOR_STD_PAL) @@ -2079,14 +2077,8 @@ void atv_dmd_set_std(void) } /* Tuner returns the if and signal inverted states */ - if ((tuner_id == AM_TUNER_R840) || - (tuner_id == AM_TUNER_R842) || - (tuner_id == AM_TUNER_SI2151) || - (tuner_id == AM_TUNER_SI2159) || - (tuner_id == AM_TUNER_MXL661)) { - if_freq = amlatvdemod_devp->if_freq; - if_inv = amlatvdemod_devp->if_inv; - } + if_freq = amlatvdemod_devp->if_freq; + if_inv = amlatvdemod_devp->if_inv; pr_dbg("[%s] set broad_std %d, hz_cvrt 0x%x, offset %d.\n", __func__, broad_std, freq_hz_cvrt, diff --git a/include/linux/amlogic/aml_atvdemod.h b/include/linux/amlogic/aml_atvdemod.h index ad6914aaa3d1..b60d9016dfbb 100644 --- a/include/linux/amlogic/aml_atvdemod.h +++ b/include/linux/amlogic/aml_atvdemod.h @@ -138,6 +138,7 @@ enum tuner_type { AM_TUNER_MXL608 = 11, AM_TUNER_SI2159 = 12, AM_TUNER_R842 = 13, + AM_TUNER_ATBM2040 = 14, }; /* For configure different tuners */ @@ -160,6 +161,8 @@ extern struct dvb_frontend *r840_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c_adap, struct tuner_config *cfg); extern struct dvb_frontend *r842_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c_adap, struct tuner_config *cfg); +extern struct dvb_frontend *atbm2040_attach(struct dvb_frontend *fe, + struct i2c_adapter *i2c_adap, struct tuner_config *cfg); /* For attach tuner driver end*/ #endif /* __AML_ATVDEMOD_H__ */