[PATCH] 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 <wmichaels1@earthlink.net> Signed-off-by: Michael Krufky <mkrufky@m1k.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
67bc4eb0b1
commit
58ba006be9
1 changed files with 30 additions and 32 deletions
|
@ -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
|
* Support for LGDT3302 (DViCO FustionHDTV 3 Gold) - VSB/QAM
|
||||||
*
|
*
|
||||||
* Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
|
* Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
|
||||||
|
@ -83,6 +81,9 @@ static int i2c_writebytes (struct lgdt3302_state* state,
|
||||||
|
|
||||||
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
|
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);
|
printk(KERN_WARNING "lgdt3302: %s error (addr %02x <- %02x, err == %i)\n", __FUNCTION__, addr, buf[0], err);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
else
|
||||||
return -EREMOTEIO;
|
return -EREMOTEIO;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -96,6 +97,9 @@ static int i2c_writebytes (struct lgdt3302_state* state,
|
||||||
tmp[1] = buf[i];
|
tmp[1] = buf[i];
|
||||||
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
|
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);
|
printk(KERN_WARNING "lgdt3302: %s error (addr %02x <- %02x, err == %i)\n", __FUNCTION__, addr, buf[0], err);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
else
|
||||||
return -EREMOTEIO;
|
return -EREMOTEIO;
|
||||||
}
|
}
|
||||||
tmp[0]++;
|
tmp[0]++;
|
||||||
|
@ -218,6 +222,8 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
|
||||||
|
|
||||||
/* Change only if we are actually changing the modulation */
|
/* Change only if we are actually changing the modulation */
|
||||||
if (state->current_modulation != param->u.vsb.modulation) {
|
if (state->current_modulation != param->u.vsb.modulation) {
|
||||||
|
int value;
|
||||||
|
|
||||||
switch(param->u.vsb.modulation) {
|
switch(param->u.vsb.modulation) {
|
||||||
case VSB_8:
|
case VSB_8:
|
||||||
dprintk("%s: VSB_8 MODE\n", __FUNCTION__);
|
dprintk("%s: VSB_8 MODE\n", __FUNCTION__);
|
||||||
|
@ -266,17 +272,12 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
|
||||||
i2c_writebytes(state, state->config->demod_address,
|
i2c_writebytes(state, state->config->demod_address,
|
||||||
demux_ctrl_cfg, sizeof(demux_ctrl_cfg));
|
demux_ctrl_cfg, sizeof(demux_ctrl_cfg));
|
||||||
|
|
||||||
if (param->u.vsb.modulation == VSB_8) {
|
/* Change the value of NCOCTFV[25:0] of carrier
|
||||||
/* Initialization for VSB modes only */
|
recovery center frequency register */
|
||||||
/* Change the value of NCOCTFV[25:0]of carrier
|
|
||||||
recovery center frequency register for VSB */
|
|
||||||
i2c_writebytes(state, state->config->demod_address,
|
i2c_writebytes(state, state->config->demod_address,
|
||||||
vsb_freq_cfg, sizeof(vsb_freq_cfg));
|
vsb_freq_cfg, sizeof(vsb_freq_cfg));
|
||||||
} else {
|
|
||||||
/* Initialization for QAM modes only */
|
|
||||||
/* Set the value of 'INLVTHD' register 0x2a/0x2c
|
/* Set the value of 'INLVTHD' register 0x2a/0x2c
|
||||||
to value from 'IFACC' register 0x39/0x3b -1 */
|
to value from 'IFACC' register 0x39/0x3b -1 */
|
||||||
int value;
|
|
||||||
i2c_selectreadbytes(state, AGC_RFIF_ACC0,
|
i2c_selectreadbytes(state, AGC_RFIF_ACC0,
|
||||||
&agc_delay_cfg[1], 3);
|
&agc_delay_cfg[1], 3);
|
||||||
value = ((agc_delay_cfg[1] & 0x0f) << 8) | agc_delay_cfg[3];
|
value = ((agc_delay_cfg[1] & 0x0f) << 8) | agc_delay_cfg[3];
|
||||||
|
@ -292,10 +293,8 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
|
||||||
of inner AGC loop filter bandwith */
|
of inner AGC loop filter bandwith */
|
||||||
i2c_writebytes(state, state->config->demod_address,
|
i2c_writebytes(state, state->config->demod_address,
|
||||||
agc_loop_cfg, sizeof(agc_loop_cfg));
|
agc_loop_cfg, sizeof(agc_loop_cfg));
|
||||||
}
|
|
||||||
|
|
||||||
state->config->set_ts_params(fe, 0);
|
state->config->set_ts_params(fe, 0);
|
||||||
lgdt3302_SwReset(state);
|
|
||||||
state->current_modulation = param->u.vsb.modulation;
|
state->current_modulation = param->u.vsb.modulation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,11 +310,10 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
|
||||||
i2c_readbytes(state, state->config->pll_address, buf, 1);
|
i2c_readbytes(state, state->config->pll_address, buf, 1);
|
||||||
dprintk("%s: tuner status byte = 0x%02x\n", __FUNCTION__, buf[0]);
|
dprintk("%s: tuner status byte = 0x%02x\n", __FUNCTION__, buf[0]);
|
||||||
|
|
||||||
lgdt3302_SwReset(state);
|
|
||||||
|
|
||||||
/* Update current frequency */
|
/* Update current frequency */
|
||||||
state->current_frequency = param->frequency;
|
state->current_frequency = param->frequency;
|
||||||
}
|
}
|
||||||
|
lgdt3302_SwReset(state);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue