Commit 44e645c2 authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab

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: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 0e7830b5
...@@ -45,6 +45,21 @@ static inline int charge_pump_source(struct dvb_frontend *fe, int force) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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);
......
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