Commit 2b03238a authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab

V4L/DVB (6821): s5h1409: fix IF frequency configuration

On the s5h1409 demod, the IF frequency for VSB is limited to 44 / 5.38 MHz.

Hardcode VSB IF frequency within the driver to 44 / 5.38 MHz.
QAM IF frequency remains configurable via attach-time configuration.
Acked-by: default avatarSteven Toth <stoth@hauppauge.com>
Signed-off-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 18ff605a
...@@ -42,6 +42,7 @@ struct s5h1409_state { ...@@ -42,6 +42,7 @@ struct s5h1409_state {
fe_modulation_t current_modulation; fe_modulation_t current_modulation;
u32 current_frequency; u32 current_frequency;
int if_freq;
u32 is_qam_locked; u32 is_qam_locked;
u32 qam_state; u32 qam_state;
...@@ -348,6 +349,9 @@ static int s5h1409_softreset(struct dvb_frontend* fe) ...@@ -348,6 +349,9 @@ static int s5h1409_softreset(struct dvb_frontend* fe)
return 0; return 0;
} }
#define S5H1409_VSB_IF_FREQ 5380
#define S5H1409_QAM_IF_FREQ state->config->qam_if
static int s5h1409_set_if_freq(struct dvb_frontend* fe, int KHz) static int s5h1409_set_if_freq(struct dvb_frontend* fe, int KHz)
{ {
struct s5h1409_state* state = fe->demodulator_priv; struct s5h1409_state* state = fe->demodulator_priv;
...@@ -369,6 +373,9 @@ static int s5h1409_set_if_freq(struct dvb_frontend* fe, int KHz) ...@@ -369,6 +373,9 @@ static int s5h1409_set_if_freq(struct dvb_frontend* fe, int KHz)
ret = -1; ret = -1;
} }
if (0 == ret)
state->if_freq = KHz;
return ret; return ret;
} }
...@@ -394,11 +401,15 @@ static int s5h1409_enable_modulation(struct dvb_frontend* fe, ...@@ -394,11 +401,15 @@ static int s5h1409_enable_modulation(struct dvb_frontend* fe,
switch(m) { switch(m) {
case VSB_8: case VSB_8:
dprintk("%s() VSB_8\n", __FUNCTION__); dprintk("%s() VSB_8\n", __FUNCTION__);
if (state->if_freq != S5H1409_VSB_IF_FREQ)
s5h1409_set_if_freq(fe, S5H1409_VSB_IF_FREQ);
s5h1409_writereg(state, 0xf4, 0); s5h1409_writereg(state, 0xf4, 0);
break; break;
case QAM_64: case QAM_64:
case QAM_256: case QAM_256:
dprintk("%s() QAM_AUTO (64/256)\n", __FUNCTION__); dprintk("%s() QAM_AUTO (64/256)\n", __FUNCTION__);
if (state->if_freq != S5H1409_QAM_IF_FREQ)
s5h1409_set_if_freq(fe, S5H1409_QAM_IF_FREQ);
s5h1409_writereg(state, 0xf4, 1); s5h1409_writereg(state, 0xf4, 1);
s5h1409_writereg(state, 0x85, 0x110); s5h1409_writereg(state, 0x85, 0x110);
break; break;
...@@ -571,7 +582,7 @@ static int s5h1409_init (struct dvb_frontend* fe) ...@@ -571,7 +582,7 @@ static int s5h1409_init (struct dvb_frontend* fe)
s5h1409_writereg(state, 0xab, 0x0); /* Parallel */ s5h1409_writereg(state, 0xab, 0x0); /* Parallel */
s5h1409_set_spectralinversion(fe, state->config->inversion); s5h1409_set_spectralinversion(fe, state->config->inversion);
s5h1409_set_if_freq(fe, state->config->if_freq); s5h1409_set_if_freq(fe, state->if_freq);
s5h1409_set_gpio(fe, state->config->gpio); s5h1409_set_gpio(fe, state->config->gpio);
s5h1409_softreset(fe); s5h1409_softreset(fe);
...@@ -751,6 +762,7 @@ struct dvb_frontend* s5h1409_attach(const struct s5h1409_config* config, ...@@ -751,6 +762,7 @@ struct dvb_frontend* s5h1409_attach(const struct s5h1409_config* config,
state->config = config; state->config = config;
state->i2c = i2c; state->i2c = i2c;
state->current_modulation = 0; state->current_modulation = 0;
state->if_freq = S5H1409_VSB_IF_FREQ;
/* check if the demod exists */ /* check if the demod exists */
if (s5h1409_readreg(state, 0x04) != 0x0066) if (s5h1409_readreg(state, 0x04) != 0x0066)
......
...@@ -39,8 +39,8 @@ struct s5h1409_config ...@@ -39,8 +39,8 @@ struct s5h1409_config
#define S5H1409_GPIO_ON 1 #define S5H1409_GPIO_ON 1
u8 gpio; u8 gpio;
/* IF Freq in KHz */ /* IF Freq for QAM in KHz, VSB is hardcoded to 5380 */
u16 if_freq; u16 qam_if;
/* Spectral Inversion */ /* Spectral Inversion */
#define S5H1409_INVERSION_OFF 0 #define S5H1409_INVERSION_OFF 0
......
...@@ -85,7 +85,7 @@ static struct s5h1409_config hauppauge_generic_config = { ...@@ -85,7 +85,7 @@ static struct s5h1409_config hauppauge_generic_config = {
.demod_address = 0x32 >> 1, .demod_address = 0x32 >> 1,
.output_mode = S5H1409_SERIAL_OUTPUT, .output_mode = S5H1409_SERIAL_OUTPUT,
.gpio = S5H1409_GPIO_ON, .gpio = S5H1409_GPIO_ON,
.if_freq = 44000, .qam_if = 44000,
.inversion = S5H1409_INVERSION_OFF, .inversion = S5H1409_INVERSION_OFF,
.status_mode = S5H1409_DEMODLOCKING .status_mode = S5H1409_DEMODLOCKING
}; };
...@@ -94,7 +94,7 @@ static struct s5h1409_config hauppauge_hvr1800lp_config = { ...@@ -94,7 +94,7 @@ static struct s5h1409_config hauppauge_hvr1800lp_config = {
.demod_address = 0x32 >> 1, .demod_address = 0x32 >> 1,
.output_mode = S5H1409_SERIAL_OUTPUT, .output_mode = S5H1409_SERIAL_OUTPUT,
.gpio = S5H1409_GPIO_OFF, .gpio = S5H1409_GPIO_OFF,
.if_freq = 44000, .qam_if = 44000,
.inversion = S5H1409_INVERSION_OFF, .inversion = S5H1409_INVERSION_OFF,
.status_mode = S5H1409_DEMODLOCKING .status_mode = S5H1409_DEMODLOCKING
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment