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 <nengwen.chen@amlogic.com>
This commit is contained in:
nengwen.chen
2019-05-06 16:02:55 +08:00
committed by Tao Zeng
parent 0237005773
commit 0bec908e12
4 changed files with 29 additions and 11 deletions

View File

@@ -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;

View File

@@ -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 ||

View File

@@ -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,

View File

@@ -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__ */