summaryrefslogtreecommitdiff
path: root/drivers/media/dvb/frontends/au8522.c
diff options
context:
space:
mode:
authorMichael Krufky <mkrufky@linuxtv.org>2008-09-03 23:46:35 +0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-09-04 01:36:18 +0400
commit2e7acd75cba3b7afa4007f20f22a86dbbdb21753 (patch)
treec86f81cceda74c7a431f74e145f9dfaf9a9b2bd9 /drivers/media/dvb/frontends/au8522.c
parentbef69ea0dcce574a425feb0a5aa4c63dd108b9a6 (diff)
downloadlinux-2e7acd75cba3b7afa4007f20f22a86dbbdb21753.tar.xz
V4L/DVB (8555): au8522: add mechanism to configure IF frequency for vsb and qam
Add a mechanism to configure IF frequency for vsb and qam. Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/dvb/frontends/au8522.c')
-rw-r--r--drivers/media/dvb/frontends/au8522.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/drivers/media/dvb/frontends/au8522.c b/drivers/media/dvb/frontends/au8522.c
index f7b71657f0f6..5741bc930792 100644
--- a/drivers/media/dvb/frontends/au8522.c
+++ b/drivers/media/dvb/frontends/au8522.c
@@ -304,6 +304,70 @@ static int au8522_mse2snr_lookup(struct mse2snr_tab *tab, int sz, int mse,
return ret;
}
+/* 3.25 MHz IF Frequency table */
+static struct {
+ u16 reg;
+ u16 data;
+} if_3_25_mhz_tab[] = {
+ { 0x80b5, 0x00 },
+ { 0x80b6, 0x3d },
+ { 0x80b7, 0xa0 },
+};
+
+/* 4.00 MHz IF Frequency table */
+static struct {
+ u16 reg;
+ u16 data;
+} if_4_mhz_tab[] = {
+ { 0x80b5, 0x00 },
+ { 0x80b6, 0x4b },
+ { 0x80b7, 0xd9 },
+};
+
+/* 6.00 MHz IF Frequency table */
+static struct {
+ u16 reg;
+ u16 data;
+} if_6_mhz_tab[] = {
+ { 0x80b5, 0xfb },
+ { 0x80b6, 0x8e },
+ { 0x80b7, 0x39 },
+};
+
+static int au8522_set_if(struct dvb_frontend *fe, enum au8522_if_freq if_freq)
+{
+ struct au8522_state *state = fe->demodulator_priv;
+ int i;
+
+ switch (if_freq) {
+ case AU8522_IF_3_25MHZ:
+ dprintk("%s() 3.25 MHz\n", __func__);
+ for (i = 0; i < ARRAY_SIZE(if_3_25_mhz_tab); i++)
+ au8522_writereg(state,
+ if_3_25_mhz_tab[i].reg,
+ if_3_25_mhz_tab[i].data);
+ break;
+ case AU8522_IF_4MHZ:
+ dprintk("%s() 4.00 MHz\n", __func__);
+ for (i = 0; i < ARRAY_SIZE(if_4_mhz_tab); i++)
+ au8522_writereg(state,
+ if_4_mhz_tab[i].reg,
+ if_4_mhz_tab[i].data);
+ break;
+ case AU8522_IF_6MHZ:
+ dprintk("%s() 6.00 MHz\n", __func__);
+ for (i = 0; i < ARRAY_SIZE(if_6_mhz_tab); i++)
+ au8522_writereg(state,
+ if_6_mhz_tab[i].reg,
+ if_6_mhz_tab[i].data);
+ break;
+ default:
+ dprintk("%s() IF Frequency not supported\n", __func__);
+ return -EINVAL;
+ }
+ return 0;
+}
+
/* VSB Modulation table */
static struct {
u16 reg;
@@ -438,6 +502,7 @@ static int au8522_enable_modulation(struct dvb_frontend *fe,
au8522_writereg(state,
VSB_mod_tab[i].reg,
VSB_mod_tab[i].data);
+ au8522_set_if(fe, state->config->vsb_if);
break;
case QAM_64:
case QAM_256:
@@ -446,6 +511,7 @@ static int au8522_enable_modulation(struct dvb_frontend *fe,
au8522_writereg(state,
QAM_mod_tab[i].reg,
QAM_mod_tab[i].data);
+ au8522_set_if(fe, state->config->qam_if);
break;
default:
dprintk("%s() Invalid modulation\n", __func__);