aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorMichael Krufky <mkrufky@linuxtv.org>2009-03-04 17:42:06 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-03-30 11:43:11 -0400
commitadcc4b3e75c5f0293806766bcc5ed0bb62d5cda0 (patch)
treec13980e43addd1dacead20ae0c35a858fe5afbfe /drivers/media
parent3160fbc556aa2e60404fa4da35b3e13dd741a5a2 (diff)
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>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/common/tuners/tda18271-fe.c37
-rw-r--r--drivers/media/common/tuners/tda18271-priv.h6
-rw-r--r--drivers/media/common/tuners/tda18271.h10
-rw-r--r--drivers/media/common/tuners/tda8290.c1
4 files changed, 49 insertions, 5 deletions
diff --git a/drivers/media/common/tuners/tda18271-fe.c b/drivers/media/common/tuners/tda18271-fe.c
index 1b48b5d0bf1e..b10935630154 100644
--- a/drivers/media/common/tuners/tda18271-fe.c
+++ b/drivers/media/common/tuners/tda18271-fe.c
@@ -818,6 +818,38 @@ fail:
818 return ret; 818 return ret;
819} 819}
820 820
821/* ------------------------------------------------------------------ */
822
823static int tda18271_agc(struct dvb_frontend *fe)
824{
825 struct tda18271_priv *priv = fe->tuner_priv;
826 int ret = 0;
827
828 switch (priv->config) {
829 case 0:
830 /* no LNA */
831 tda_dbg("no agc configuration provided\n");
832 break;
833 case 3:
834 /* switch with GPIO of saa713x */
835 tda_dbg("invoking callback\n");
836 if (fe->callback)
837 ret = fe->callback(priv->i2c_props.adap->algo_data,
838 DVB_FRONTEND_COMPONENT_TUNER,
839 TDA18271_CALLBACK_CMD_AGC_ENABLE,
840 priv->mode);
841 break;
842 case 1:
843 case 2:
844 default:
845 /* n/a - currently not supported */
846 tda_err("unsupported configuration: %d\n", priv->config);
847 ret = -EINVAL;
848 break;
849 }
850 return ret;
851}
852
821static int tda18271_tune(struct dvb_frontend *fe, 853static int tda18271_tune(struct dvb_frontend *fe,
822 struct tda18271_std_map_item *map, u32 freq, u32 bw) 854 struct tda18271_std_map_item *map, u32 freq, u32 bw)
823{ 855{
@@ -827,6 +859,10 @@ static int tda18271_tune(struct dvb_frontend *fe,
827 tda_dbg("freq = %d, ifc = %d, bw = %d, agc_mode = %d, std = %d\n", 859 tda_dbg("freq = %d, ifc = %d, bw = %d, agc_mode = %d, std = %d\n",
828 freq, map->if_freq, bw, map->agc_mode, map->std); 860 freq, map->if_freq, bw, map->agc_mode, map->std);
829 861
862 ret = tda18271_agc(fe);
863 if (tda_fail(ret))
864 tda_warn("failed to configure agc\n");
865
830 ret = tda18271_init(fe); 866 ret = tda18271_init(fe);
831 if (tda_fail(ret)) 867 if (tda_fail(ret))
832 goto fail; 868 goto fail;
@@ -1159,6 +1195,7 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
1159 /* new tuner instance */ 1195 /* new tuner instance */
1160 priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO; 1196 priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
1161 priv->role = (cfg) ? cfg->role : TDA18271_MASTER; 1197 priv->role = (cfg) ? cfg->role : TDA18271_MASTER;
1198 priv->config = (cfg) ? cfg->config : 0;
1162 priv->cal_initialized = false; 1199 priv->cal_initialized = false;
1163 mutex_init(&priv->lock); 1200 mutex_init(&priv->lock);
1164 1201
diff --git a/drivers/media/common/tuners/tda18271-priv.h b/drivers/media/common/tuners/tda18271-priv.h
index 81a739365f8c..74beb28806f8 100644
--- a/drivers/media/common/tuners/tda18271-priv.h
+++ b/drivers/media/common/tuners/tda18271-priv.h
@@ -91,11 +91,6 @@ enum tda18271_pll {
91 TDA18271_CAL_PLL, 91 TDA18271_CAL_PLL,
92}; 92};
93 93
94enum tda18271_mode {
95 TDA18271_ANALOG,
96 TDA18271_DIGITAL,
97};
98
99struct tda18271_map_layout; 94struct tda18271_map_layout;
100 95
101enum tda18271_ver { 96enum tda18271_ver {
@@ -114,6 +109,7 @@ struct tda18271_priv {
114 enum tda18271_i2c_gate gate; 109 enum tda18271_i2c_gate gate;
115 enum tda18271_ver id; 110 enum tda18271_ver id;
116 111
112 unsigned int config; /* interface to saa713x / tda829x */
117 unsigned int tm_rfcal; 113 unsigned int tm_rfcal;
118 unsigned int cal_initialized:1; 114 unsigned int cal_initialized:1;
119 unsigned int small_i2c:1; 115 unsigned int small_i2c:1;
diff --git a/drivers/media/common/tuners/tda18271.h b/drivers/media/common/tuners/tda18271.h
index 7db9831c0cb0..53a9892a18d0 100644
--- a/drivers/media/common/tuners/tda18271.h
+++ b/drivers/media/common/tuners/tda18271.h
@@ -79,6 +79,16 @@ struct tda18271_config {
79 79
80 /* some i2c providers cant write all 39 registers at once */ 80 /* some i2c providers cant write all 39 registers at once */
81 unsigned int small_i2c:1; 81 unsigned int small_i2c:1;
82
83 /* interface to saa713x / tda829x */
84 unsigned int config;
85};
86
87#define TDA18271_CALLBACK_CMD_AGC_ENABLE 0
88
89enum tda18271_mode {
90 TDA18271_ANALOG = 0,
91 TDA18271_DIGITAL,
82}; 92};
83 93
84#if defined(CONFIG_MEDIA_TUNER_TDA18271) || (defined(CONFIG_MEDIA_TUNER_TDA18271_MODULE) && defined(MODULE)) 94#if defined(CONFIG_MEDIA_TUNER_TDA18271) || (defined(CONFIG_MEDIA_TUNER_TDA18271_MODULE) && defined(MODULE))
diff --git a/drivers/media/common/tuners/tda8290.c b/drivers/media/common/tuners/tda8290.c
index a88e67632c52..064d14c8d7b2 100644
--- a/drivers/media/common/tuners/tda8290.c
+++ b/drivers/media/common/tuners/tda8290.c
@@ -624,6 +624,7 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
624 624
625 if ((data == 0x83) || (data == 0x84)) { 625 if ((data == 0x83) || (data == 0x84)) {
626 priv->ver |= TDA18271; 626 priv->ver |= TDA18271;
627 tda829x_tda18271_config.config = priv->cfg.config;
627 dvb_attach(tda18271_attach, fe, priv->tda827x_addr, 628 dvb_attach(tda18271_attach, fe, priv->tda827x_addr,
628 priv->i2c_props.adap, &tda829x_tda18271_config); 629 priv->i2c_props.adap, &tda829x_tda18271_config);
629 } else { 630 } else {