DVB: LGDT3302 QAM256 initialization fix
PATCH 1/1 DVB: LGDT3302 QAM256 initialization fix
- Initialize all non mutually exclusive variables without regard to the mode selected.
- Do a software reset each time the parameters are set, regardless of whether anything changes. This may allow an application to recover from a hung condition.
- Improved error reporting.
- Removed $Id:$
Signed-off-by Mac Michaels <[email protected] <mailto:[email protected]>>
Signed-off-by Michael Krufky <[email protected] <mailto:[email protected]>>
linux/drivers/media/dvb/frontends/lgdt3302.c | 63 +++++++++---------- 1 files changed, 30 insertions(+), 33 deletions(-)
drivers/media/dvb/frontends/lgdt3302.c +30 -33
@@ -1,6 +1,4 @@/* -* $Id: lgdt3302.c,v 1.5 2005/07/07 03:47:15 mkrufky Exp $ -* * Support for LGDT3302 (DViCO FustionHDTV 3 Gold) - VSB/QAM * * Copyright (C) 2005 Wilson Michaels <[email protected]>
@@ -83,7 +81,10 @@if ((err =i2c_transfer (state->i2c, &msg,1 )) !=1 ) {printk (KERN_WARNING "lgdt3302: %s error (addr %02x <- %02x, err == %i)\n" , __FUNCTION__, addr, buf[0 ], err); -return -EREMOTEIO ; +if (err <0 ) +return err; +else +return -EREMOTEIO ; } }else {u8 tmp[] = { buf[0 ], buf[1 ] };
@@ -96,7 +97,10 @@ tmp[1 ] = buf[i];if ((err =i2c_transfer (state->i2c, &msg,1 )) !=1 ) {printk (KERN_WARNING "lgdt3302: %s error (addr %02x <- %02x, err == %i)\n" , __FUNCTION__, addr, buf[0 ], err); -return -EREMOTEIO ; +if (err <0 ) +return err; +else +return -EREMOTEIO ; } tmp[0 ]++; }
@@ -266,36 +270,30 @@i2c_writebytes (state, state->config->demod_address, demux_ctrl_cfg,sizeof (demux_ctrl_cfg)); -if (param->u.vsb.modulation ==VSB_8 ) { -/* Initialization for VSB modes only */ -/* Change the value of NCOCTFV[25:0]of carrier -recovery center frequency register for VSB */ -i2c_writebytes (state, state->config->demod_address, +/* Change the value of NCOCTFV[25:0] of carrier +recovery center frequency register */ +i2c_writebytes (state, state->config->demod_address, vsb_freq_cfg,sizeof (vsb_freq_cfg)); - }else { -/* Initialization for QAM modes only */ -/* Set the value of 'INLVTHD' register 0x2a/0x2c -to value from 'IFACC' register 0x39/0x3b -1 */ -int value; -i2c_selectreadbytes (state,AGC_RFIF_ACC0 , - &agc_delay_cfg[1 ],3 ); - value = ((agc_delay_cfg[1 ] &0x0f ) <<8 ) | agc_delay_cfg[3 ]; - value = value -1 ; -dprintk ("%s IFACC -1 = 0x%03x\n" , __FUNCTION__, value); - agc_delay_cfg[1 ] = (value >>8 ) &0x0f ; - agc_delay_cfg[2 ] =0x00 ; - agc_delay_cfg[3 ] = value &0xff ; -i2c_writebytes (state, state->config->demod_address, - agc_delay_cfg,sizeof (agc_delay_cfg)); - -/* Change the value of IAGCBW[15:8] -of inner AGC loop filter bandwith */ -i2c_writebytes (state, state->config->demod_address, - agc_loop_cfg,sizeof (agc_loop_cfg)); - } +/* Set the value of 'INLVTHD' register 0x2a/0x2c +to value from 'IFACC' register 0x39/0x3b -1 */ +int value; +i2c_selectreadbytes (state,AGC_RFIF_ACC0 , + &agc_delay_cfg[1 ],3 ); + value = ((agc_delay_cfg[1 ] &0x0f ) <<8 ) | agc_delay_cfg[3 ]; + value = value -1 ; +dprintk ("%s IFACC -1 = 0x%03x\n" , __FUNCTION__, value); + agc_delay_cfg[1 ] = (value >>8 ) &0x0f ; + agc_delay_cfg[2 ] =0x00 ; + agc_delay_cfg[3 ] = value &0xff ; +i2c_writebytes (state, state->config->demod_address, + agc_delay_cfg,sizeof (agc_delay_cfg)); + +/* Change the value of IAGCBW[15:8] +of inner AGC loop filter bandwith */ +i2c_writebytes (state, state->config->demod_address, + agc_loop_cfg,sizeof (agc_loop_cfg)); state->config->set_ts_params (fe,0 ); -lgdt3302_SwReset (state); state->current_modulation = param->u.vsb.modulation; }
@@ -311,11 +309,10 @@i2c_readbytes (state, state->config->pll_address, buf,1 );dprintk ("%s: tuner status byte = 0x%02x\n" , __FUNCTION__, buf[0 ]); -lgdt3302_SwReset (state); -/* Update current frequency */ state->current_frequency = param->frequency; } +lgdt3302_SwReset (state);return 0 ; }
Hi Michael,
please do not Cc: the [email protected] list when posting to lkml, as it is subscribers-only. You can Cc:
[email protected] instead.
Thanks,
Johannes