V4L/DVB (10876): tda18271: add support for AGC configuration via tuner callback
authorMichael Krufky <mkrufky@linuxtv.org>
Wed, 4 Mar 2009 22:42:06 +0000 (19:42 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:43:11 +0000 (12:43 -0300)
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>
drivers/media/common/tuners/tda18271-fe.c
drivers/media/common/tuners/tda18271-priv.h
drivers/media/common/tuners/tda18271.h
drivers/media/common/tuners/tda8290.c

index 1b48b5d..b109356 100644 (file)
@@ -818,6 +818,38 @@ fail:
        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,
                         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",
                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);
        if (tda_fail(ret))
                goto fail;
@@ -1159,6 +1195,7 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
                /* new tuner instance */
                priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
                priv->role = (cfg) ? cfg->role : TDA18271_MASTER;
+               priv->config = (cfg) ? cfg->config : 0;
                priv->cal_initialized = false;
                mutex_init(&priv->lock);
 
index 81a7393..74beb28 100644 (file)
@@ -91,11 +91,6 @@ enum tda18271_pll {
        TDA18271_CAL_PLL,
 };
 
-enum tda18271_mode {
-       TDA18271_ANALOG,
-       TDA18271_DIGITAL,
-};
-
 struct tda18271_map_layout;
 
 enum tda18271_ver {
@@ -114,6 +109,7 @@ struct tda18271_priv {
        enum tda18271_i2c_gate gate;
        enum tda18271_ver id;
 
+       unsigned int config; /* interface to saa713x / tda829x */
        unsigned int tm_rfcal;
        unsigned int cal_initialized:1;
        unsigned int small_i2c:1;
index 7db9831..53a9892 100644 (file)
@@ -79,6 +79,16 @@ struct tda18271_config {
 
        /* some i2c providers cant write all 39 registers at once */
        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))
index a88e676..064d14c 100644 (file)
@@ -624,6 +624,7 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
 
        if ((data == 0x83) || (data == 0x84)) {
                priv->ver |= TDA18271;
+               tda829x_tda18271_config.config = priv->cfg.config;
                dvb_attach(tda18271_attach, fe, priv->tda827x_addr,
                           priv->i2c_props.adap, &tda829x_tda18271_config);
        } else {