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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
					  struct tda18271_std_map_item *map,
 | 
			
		||||
					  u32 freq, u32 bw)
 | 
			
		||||
| 
						 | 
				
			
			@ -66,19 +81,10 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
 | 
			
		|||
	/* set cal mode to normal */
 | 
			
		||||
	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]  |= (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 */
 | 
			
		||||
	regs[R_EP4]  &= ~0x80;
 | 
			
		||||
	regs[R_EP4]  |= map->fm_rfn << 7;
 | 
			
		||||
| 
						 | 
				
			
			@ -135,6 +141,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
 | 
			
		|||
	switch (priv->role) {
 | 
			
		||||
	case TDA18271_MASTER:
 | 
			
		||||
		tda18271_calc_main_pll(fe, N);
 | 
			
		||||
		tda18271_set_if_notch(fe);
 | 
			
		||||
		tda18271_write_regs(fe, R_MPD, 4);
 | 
			
		||||
		break;
 | 
			
		||||
	case TDA18271_SLAVE:
 | 
			
		||||
| 
						 | 
				
			
			@ -142,6 +149,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
 | 
			
		|||
		tda18271_write_regs(fe, R_CPD, 4);
 | 
			
		||||
 | 
			
		||||
		regs[R_MPD] = regs[R_CPD] & 0x7f;
 | 
			
		||||
		tda18271_set_if_notch(fe);
 | 
			
		||||
		tda18271_write_regs(fe, R_MPD, 1);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -507,7 +515,7 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe)
 | 
			
		|||
	/* set cal mode to normal */
 | 
			
		||||
	regs[R_EP4]  &= ~0x03;
 | 
			
		||||
 | 
			
		||||
	/* update IF output level & IF notch frequency */
 | 
			
		||||
	/* update IF output level */
 | 
			
		||||
	regs[R_EP4]  &= ~0x1c; /* clear if level bits */
 | 
			
		||||
 | 
			
		||||
	ret = tda18271_write_regs(fe, R_EP3, 2);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue