From: Michael Krufky - Fix bug in lgdt3302_read_status to return correct FE_HAS_SIGNAL and FS_HAS_CARRIER status. - Removed #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10). Signed-off-by: Mac Michaels Signed-off-by: Michael Krufky Signed-off-by: Andrew Morton --- drivers/media/dvb/frontends/lgdt3302.c | 43 +++++++++++++-------------------- 1 files changed, 18 insertions(+), 25 deletions(-) diff -puN drivers/media/dvb/frontends/lgdt3302.c~v4l-lgdt3302-read-status-fix drivers/media/dvb/frontends/lgdt3302.c --- devel/drivers/media/dvb/frontends/lgdt3302.c~v4l-lgdt3302-read-status-fix 2005-07-06 21:17:01.000000000 -0700 +++ devel-akpm/drivers/media/dvb/frontends/lgdt3302.c 2005-07-06 21:17:01.000000000 -0700 @@ -1,5 +1,5 @@ /* - * $Id: lgdt3302.c,v 1.2 2005/06/28 23:50:48 mkrufky Exp $ + * $Id: lgdt3302.c,v 1.5 2005/07/07 03:47:15 mkrufky Exp $ * * Support for LGDT3302 (DViCO FustionHDTV 3 Gold) - VSB/QAM * @@ -34,7 +34,6 @@ * */ -#include #include #include #include @@ -208,8 +207,6 @@ static int lgdt3302_set_parameters(struc struct lgdt3302_state* state = (struct lgdt3302_state*) fe->demodulator_priv; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10) - /* Use 50MHz parameter values from spec sheet since xtal is 50 */ static u8 top_ctrl_cfg[] = { TOP_CONTROL, 0x03 }; static u8 vsb_freq_cfg[] = { VSB_CARRIER_FREQ0, 0x00, 0x87, 0x8e, 0x01 }; @@ -301,9 +298,6 @@ static int lgdt3302_set_parameters(struc lgdt3302_SwReset(state); state->current_modulation = param->u.vsb.modulation; } -#else - printk("lgdt3302: %s: you need a newer kernel for this, sorry\n",__FUNCTION__); -#endif /* Change only if we are actually changing the channel */ if (state->current_frequency != param->frequency) { @@ -352,11 +346,28 @@ static int lgdt3302_read_status(struct d * This is done in SwReset(); */ + /* AGC status register */ + i2c_selectreadbytes(state, AGC_STATUS, buf, 1); + dprintk("%s: AGC_STATUS = 0x%02x\n", __FUNCTION__, buf[0]); + if ((buf[0] & 0x0c) == 0x8){ + /* Test signal does not exist flag */ + /* as well as the AGC lock flag. */ + *status |= FE_HAS_SIGNAL; + } else { + /* Without a signal all other status bits are meaningless */ + return 0; + } + /* signal status */ i2c_selectreadbytes(state, TOP_CONTROL, buf, sizeof(buf)); dprintk("%s: TOP_CONTROL = 0x%02x, IRO_MASK = 0x%02x, IRQ_STATUS = 0x%02x\n", __FUNCTION__, buf[0], buf[1], buf[2]); + +#if 0 + /* Alternative method to check for a signal */ + /* using the SNR good/bad interrupts. */ if ((buf[2] & 0x30) == 0x10) *status |= FE_HAS_SIGNAL; +#endif /* sync status */ if ((buf[2] & 0x03) == 0x01) { @@ -369,17 +380,6 @@ static int lgdt3302_read_status(struct d *status |= FE_HAS_VITERBI; } -#if 0 - /* Alternative method to check for a signal */ - /* AGC status register */ - i2c_selectreadbytes(state, AGC_STATUS, buf, 1); - dprintk("%s: AGC_STATUS = 0x%02x\n", __FUNCTION__, buf[0]); - if ((buf[0] & 0x0c) == 0x80) /* Test signal does not exist flag */ - /* Test AGC lock flag */ - *status |= FE_HAS_SIGNAL; - else - return 0; - /* Carrier Recovery Lock Status Register */ i2c_selectreadbytes(state, CARRIER_LOCK, buf, 1); dprintk("%s: CARRIER_LOCK = 0x%02x\n", __FUNCTION__, buf[0]); @@ -389,21 +389,14 @@ static int lgdt3302_read_status(struct d /* Need to undestand why there are 3 lock levels here */ if ((buf[0] & 0x07) == 0x07) *status |= FE_HAS_CARRIER; - else - return 0; break; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10) case VSB_8: if ((buf[0] & 0x80) == 0x80) *status |= FE_HAS_CARRIER; - else - return 0; break; -#endif default: printk("KERN_WARNING lgdt3302: %s: Modulation set to unsupported value\n", __FUNCTION__); } -#endif return 0; } _