V4L/DVB (10876): tda18271: add support for AGC configuration via tuner callback
The tda827x driver supports a feature that the tda18271 driver was lacking until now. This patch adds support for device-level configuration via the tuner callback configuration interface. Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
3160fbc556
commit
adcc4b3e75
@@ -818,6 +818,38 @@ fail:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
static int tda18271_agc(struct dvb_frontend *fe)
|
||||||
|
{
|
||||||
|
struct tda18271_priv *priv = fe->tuner_priv;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
switch (priv->config) {
|
||||||
|
case 0:
|
||||||
|
/* no LNA */
|
||||||
|
tda_dbg("no agc configuration provided\n");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
/* switch with GPIO of saa713x */
|
||||||
|
tda_dbg("invoking callback\n");
|
||||||
|
if (fe->callback)
|
||||||
|
ret = fe->callback(priv->i2c_props.adap->algo_data,
|
||||||
|
DVB_FRONTEND_COMPONENT_TUNER,
|
||||||
|
TDA18271_CALLBACK_CMD_AGC_ENABLE,
|
||||||
|
priv->mode);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
default:
|
||||||
|
/* n/a - currently not supported */
|
||||||
|
tda_err("unsupported configuration: %d\n", priv->config);
|
||||||
|
ret = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int tda18271_tune(struct dvb_frontend *fe,
|
static int tda18271_tune(struct dvb_frontend *fe,
|
||||||
struct tda18271_std_map_item *map, u32 freq, u32 bw)
|
struct tda18271_std_map_item *map, u32 freq, u32 bw)
|
||||||
{
|
{
|
||||||
@@ -827,6 +859,10 @@ static int tda18271_tune(struct dvb_frontend *fe,
|
|||||||
tda_dbg("freq = %d, ifc = %d, bw = %d, agc_mode = %d, std = %d\n",
|
tda_dbg("freq = %d, ifc = %d, bw = %d, agc_mode = %d, std = %d\n",
|
||||||
freq, map->if_freq, bw, map->agc_mode, map->std);
|
freq, map->if_freq, bw, map->agc_mode, map->std);
|
||||||
|
|
||||||
|
ret = tda18271_agc(fe);
|
||||||
|
if (tda_fail(ret))
|
||||||
|
tda_warn("failed to configure agc\n");
|
||||||
|
|
||||||
ret = tda18271_init(fe);
|
ret = tda18271_init(fe);
|
||||||
if (tda_fail(ret))
|
if (tda_fail(ret))
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -1159,6 +1195,7 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
|
|||||||
/* new tuner instance */
|
/* new tuner instance */
|
||||||
priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
|
priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
|
||||||
priv->role = (cfg) ? cfg->role : TDA18271_MASTER;
|
priv->role = (cfg) ? cfg->role : TDA18271_MASTER;
|
||||||
|
priv->config = (cfg) ? cfg->config : 0;
|
||||||
priv->cal_initialized = false;
|
priv->cal_initialized = false;
|
||||||
mutex_init(&priv->lock);
|
mutex_init(&priv->lock);
|
||||||
|
|
||||||
|
@@ -91,11 +91,6 @@ enum tda18271_pll {
|
|||||||
TDA18271_CAL_PLL,
|
TDA18271_CAL_PLL,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum tda18271_mode {
|
|
||||||
TDA18271_ANALOG,
|
|
||||||
TDA18271_DIGITAL,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct tda18271_map_layout;
|
struct tda18271_map_layout;
|
||||||
|
|
||||||
enum tda18271_ver {
|
enum tda18271_ver {
|
||||||
@@ -114,6 +109,7 @@ struct tda18271_priv {
|
|||||||
enum tda18271_i2c_gate gate;
|
enum tda18271_i2c_gate gate;
|
||||||
enum tda18271_ver id;
|
enum tda18271_ver id;
|
||||||
|
|
||||||
|
unsigned int config; /* interface to saa713x / tda829x */
|
||||||
unsigned int tm_rfcal;
|
unsigned int tm_rfcal;
|
||||||
unsigned int cal_initialized:1;
|
unsigned int cal_initialized:1;
|
||||||
unsigned int small_i2c:1;
|
unsigned int small_i2c:1;
|
||||||
|
@@ -79,6 +79,16 @@ struct tda18271_config {
|
|||||||
|
|
||||||
/* some i2c providers cant write all 39 registers at once */
|
/* some i2c providers cant write all 39 registers at once */
|
||||||
unsigned int small_i2c:1;
|
unsigned int small_i2c:1;
|
||||||
|
|
||||||
|
/* interface to saa713x / tda829x */
|
||||||
|
unsigned int config;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TDA18271_CALLBACK_CMD_AGC_ENABLE 0
|
||||||
|
|
||||||
|
enum tda18271_mode {
|
||||||
|
TDA18271_ANALOG = 0,
|
||||||
|
TDA18271_DIGITAL,
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CONFIG_MEDIA_TUNER_TDA18271) || (defined(CONFIG_MEDIA_TUNER_TDA18271_MODULE) && defined(MODULE))
|
#if defined(CONFIG_MEDIA_TUNER_TDA18271) || (defined(CONFIG_MEDIA_TUNER_TDA18271_MODULE) && defined(MODULE))
|
||||||
|
@@ -624,6 +624,7 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
|
|||||||
|
|
||||||
if ((data == 0x83) || (data == 0x84)) {
|
if ((data == 0x83) || (data == 0x84)) {
|
||||||
priv->ver |= TDA18271;
|
priv->ver |= TDA18271;
|
||||||
|
tda829x_tda18271_config.config = priv->cfg.config;
|
||||||
dvb_attach(tda18271_attach, fe, priv->tda827x_addr,
|
dvb_attach(tda18271_attach, fe, priv->tda827x_addr,
|
||||||
priv->i2c_props.adap, &tda829x_tda18271_config);
|
priv->i2c_props.adap, &tda829x_tda18271_config);
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user