V4L/DVB (8034): tda18271: fix IF notch frequency handling
The IF notch bit gets unset when we update the Main Post Div register value, before we have a chance to write the desired IF notch setting to the tuner. Move the IF notch configuration to after we update MPD. Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
0e7830b50b
commit
44e645c203
1 changed files with 19 additions and 11 deletions
|
@ -45,6 +45,21 @@ static inline int charge_pump_source(struct dvb_frontend *fe, int force)
|
||||||
TDA18271_MAIN_PLL, force);
|
TDA18271_MAIN_PLL, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void tda18271_set_if_notch(struct dvb_frontend *fe)
|
||||||
|
{
|
||||||
|
struct tda18271_priv *priv = fe->tuner_priv;
|
||||||
|
unsigned char *regs = priv->tda18271_regs;
|
||||||
|
|
||||||
|
switch (priv->mode) {
|
||||||
|
case TDA18271_ANALOG:
|
||||||
|
regs[R_MPD] &= ~0x80; /* IF notch = 0 */
|
||||||
|
break;
|
||||||
|
case TDA18271_DIGITAL:
|
||||||
|
regs[R_MPD] |= 0x80; /* IF notch = 1 */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||||
struct tda18271_std_map_item *map,
|
struct tda18271_std_map_item *map,
|
||||||
u32 freq, u32 bw)
|
u32 freq, u32 bw)
|
||||||
|
@ -66,19 +81,10 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||||
/* set cal mode to normal */
|
/* set cal mode to normal */
|
||||||
regs[R_EP4] &= ~0x03;
|
regs[R_EP4] &= ~0x03;
|
||||||
|
|
||||||
/* update IF output level & IF notch frequency */
|
/* update IF output level */
|
||||||
regs[R_EP4] &= ~0x1c; /* clear if level bits */
|
regs[R_EP4] &= ~0x1c; /* clear if level bits */
|
||||||
regs[R_EP4] |= (map->if_lvl << 2);
|
regs[R_EP4] |= (map->if_lvl << 2);
|
||||||
|
|
||||||
switch (priv->mode) {
|
|
||||||
case TDA18271_ANALOG:
|
|
||||||
regs[R_MPD] &= ~0x80; /* IF notch = 0 */
|
|
||||||
break;
|
|
||||||
case TDA18271_DIGITAL:
|
|
||||||
regs[R_MPD] |= 0x80; /* IF notch = 1 */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update FM_RFn */
|
/* update FM_RFn */
|
||||||
regs[R_EP4] &= ~0x80;
|
regs[R_EP4] &= ~0x80;
|
||||||
regs[R_EP4] |= map->fm_rfn << 7;
|
regs[R_EP4] |= map->fm_rfn << 7;
|
||||||
|
@ -135,6 +141,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||||
switch (priv->role) {
|
switch (priv->role) {
|
||||||
case TDA18271_MASTER:
|
case TDA18271_MASTER:
|
||||||
tda18271_calc_main_pll(fe, N);
|
tda18271_calc_main_pll(fe, N);
|
||||||
|
tda18271_set_if_notch(fe);
|
||||||
tda18271_write_regs(fe, R_MPD, 4);
|
tda18271_write_regs(fe, R_MPD, 4);
|
||||||
break;
|
break;
|
||||||
case TDA18271_SLAVE:
|
case TDA18271_SLAVE:
|
||||||
|
@ -142,6 +149,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||||
tda18271_write_regs(fe, R_CPD, 4);
|
tda18271_write_regs(fe, R_CPD, 4);
|
||||||
|
|
||||||
regs[R_MPD] = regs[R_CPD] & 0x7f;
|
regs[R_MPD] = regs[R_CPD] & 0x7f;
|
||||||
|
tda18271_set_if_notch(fe);
|
||||||
tda18271_write_regs(fe, R_MPD, 1);
|
tda18271_write_regs(fe, R_MPD, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -507,7 +515,7 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe)
|
||||||
/* set cal mode to normal */
|
/* set cal mode to normal */
|
||||||
regs[R_EP4] &= ~0x03;
|
regs[R_EP4] &= ~0x03;
|
||||||
|
|
||||||
/* update IF output level & IF notch frequency */
|
/* update IF output level */
|
||||||
regs[R_EP4] &= ~0x1c; /* clear if level bits */
|
regs[R_EP4] &= ~0x1c; /* clear if level bits */
|
||||||
|
|
||||||
ret = tda18271_write_regs(fe, R_EP3, 2);
|
ret = tda18271_write_regs(fe, R_EP3, 2);
|
||||||
|
|
Loading…
Add table
Reference in a new issue