Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 58ba006b authored by Michael Krufky's avatar Michael Krufky Committed by Linus Torvalds
Browse files

[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: default avatarMac Michaels <wmichaels1@earthlink.net>
Signed-off-by: default avatarMichael Krufky <mkrufky@m1k.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 67bc4eb0
Loading
Loading
Loading
Loading
+31 −33
Original line number Diff line number Diff line
/*
 * $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 <wilsonmichaels@earthlink.net>
@@ -83,6 +81,9 @@ static int i2c_writebytes (struct lgdt3302_state* state,

		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);
			if (err < 0)
				return err;
			else
				return -EREMOTEIO;
		}
	} else {
@@ -96,6 +97,9 @@ static int i2c_writebytes (struct lgdt3302_state* state,
			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);
				if (err < 0)
					return err;
				else
					return -EREMOTEIO;
			}
			tmp[0]++;
@@ -218,6 +222,8 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,

	/* Change only if we are actually changing the modulation */
	if (state->current_modulation != param->u.vsb.modulation) {
		int value;

		switch(param->u.vsb.modulation) {
		case VSB_8:
			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,
			       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 */
		   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];
@@ -292,10 +293,8 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
		   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 +310,10 @@ static int lgdt3302_set_parameters(struct dvb_frontend* fe,
		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;
}