Skip to content

Commit

Permalink
V4L/DVB (8555): au8522: add mechanism to configure IF frequency for v…
Browse files Browse the repository at this point in the history
…sb 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>
  • Loading branch information
Michael Krufky authored and Mauro Carvalho Chehab committed Sep 3, 2008
1 parent bef69ea commit 2e7acd7
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
66 changes: 66 additions & 0 deletions drivers/media/dvb/frontends/au8522.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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:
Expand All @@ -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__);
Expand Down
9 changes: 9 additions & 0 deletions drivers/media/dvb/frontends/au8522.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@

#include <linux/dvb/frontend.h>

enum au8522_if_freq {
AU8522_IF_6MHZ = 0,
AU8522_IF_4MHZ,
AU8522_IF_3_25MHZ,
};

struct au8522_config {
/* the demodulator's i2c address */
u8 demod_address;
Expand All @@ -32,6 +38,9 @@ struct au8522_config {
#define AU8522_TUNERLOCKING 0
#define AU8522_DEMODLOCKING 1
u8 status_mode;

enum au8522_if_freq vsb_if;
enum au8522_if_freq qam_if;
};

#if defined(CONFIG_DVB_AU8522) || \
Expand Down

0 comments on commit 2e7acd7

Please sign in to comment.