提交 08d80525 编写于 作者: M Michael Krufky 提交者: Linus Torvalds

[PATCH] v4l: LGDT3302 read status fix

- 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: NMac Michaels <wmichaels1@earthlink.net>
Signed-off-by: NMichael Krufky <mkrufky@m1k.net>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 0d723c09
/* /*
* $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 * Support for LGDT3302 (DViCO FustionHDTV 3 Gold) - VSB/QAM
* *
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
* *
*/ */
#include <linux/version.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
...@@ -208,8 +207,6 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe, ...@@ -208,8 +207,6 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
struct lgdt3302_state* state = struct lgdt3302_state* state =
(struct lgdt3302_state*) fe->demodulator_priv; (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 */ /* Use 50MHz parameter values from spec sheet since xtal is 50 */
static u8 top_ctrl_cfg[] = { TOP_CONTROL, 0x03 }; static u8 top_ctrl_cfg[] = { TOP_CONTROL, 0x03 };
static u8 vsb_freq_cfg[] = { VSB_CARRIER_FREQ0, 0x00, 0x87, 0x8e, 0x01 }; static u8 vsb_freq_cfg[] = { VSB_CARRIER_FREQ0, 0x00, 0x87, 0x8e, 0x01 };
...@@ -301,9 +298,6 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe, ...@@ -301,9 +298,6 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
lgdt3302_SwReset(state); lgdt3302_SwReset(state);
state->current_modulation = param->u.vsb.modulation; 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 */ /* Change only if we are actually changing the channel */
if (state->current_frequency != param->frequency) { if (state->current_frequency != param->frequency) {
...@@ -352,11 +346,28 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status) ...@@ -352,11 +346,28 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
* This is done in SwReset(); * 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 */ /* signal status */
i2c_selectreadbytes(state, TOP_CONTROL, buf, sizeof(buf)); 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]); 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) if ((buf[2] & 0x30) == 0x10)
*status |= FE_HAS_SIGNAL; *status |= FE_HAS_SIGNAL;
#endif
/* sync status */ /* sync status */
if ((buf[2] & 0x03) == 0x01) { if ((buf[2] & 0x03) == 0x01) {
...@@ -369,17 +380,6 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status) ...@@ -369,17 +380,6 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
*status |= FE_HAS_VITERBI; *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 */ /* Carrier Recovery Lock Status Register */
i2c_selectreadbytes(state, CARRIER_LOCK, buf, 1); i2c_selectreadbytes(state, CARRIER_LOCK, buf, 1);
dprintk("%s: CARRIER_LOCK = 0x%02x\n", __FUNCTION__, buf[0]); dprintk("%s: CARRIER_LOCK = 0x%02x\n", __FUNCTION__, buf[0]);
...@@ -389,21 +389,14 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status) ...@@ -389,21 +389,14 @@ static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
/* Need to undestand why there are 3 lock levels here */ /* Need to undestand why there are 3 lock levels here */
if ((buf[0] & 0x07) == 0x07) if ((buf[0] & 0x07) == 0x07)
*status |= FE_HAS_CARRIER; *status |= FE_HAS_CARRIER;
else
return 0;
break; break;
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)
case VSB_8: case VSB_8:
if ((buf[0] & 0x80) == 0x80) if ((buf[0] & 0x80) == 0x80)
*status |= FE_HAS_CARRIER; *status |= FE_HAS_CARRIER;
else
return 0;
break; break;
#endif
default: default:
printk("KERN_WARNING lgdt3302: %s: Modulation set to unsupported value\n", __FUNCTION__); printk("KERN_WARNING lgdt3302: %s: Modulation set to unsupported value\n", __FUNCTION__);
} }
#endif
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册