Re: fmd1216me integration (fwd)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Michael Krufky schrieb:
> Trent Piepho wrote:
>> Here's my latest patch for fmd1216me integration into dvb-pll.  It's little
>> changed from when I posted it three weeks ago, except for cxusb which is
>> now part of the patch.
>>
>> I'm going to try to get it into mainline soon for the 2.6.22 window, so if
>> there are comments now is the time.
> 
> This patch is quite a nice cleanup of the handling of the fmd1216me tuner.  The
> change looks more than fine to me.  Would be nice to see an Ack from Hartmut,
> but I see no harm can come from applying this patch.
> 
> Signed-off-by: Michael Krufky <mkrufky@xxxxxxxxxxx>
> 

Acked-by: Hartmut Hackmann <hartmut.hackmann@xxxxxxxxxxx>
> 
> 
>> -----------------------------
>> Integrate all users of the fmd1216 tuner with dvb-pll
>>
>> From: Trent Piepho <xyzzy@xxxxxxxxxxxxx>
>>
>> Enhance the dvb-pll definition of the fmd1216 tuner by adding an init sequence
>> and a sleep sequence.
>>
>> The init sequence sets the AGC control register to 0xa0, selecting the fast
>> time constant and 112 dBuV take-over point.  This the recommended value for
>> DVB-T operation.
>>
>> The sleep sequence sets bit P4 (which is believed to turn the analog
>> demodulator on), turns off the tuning voltage, and sets the AGC control
>> register to 0x60 (external AGC voltage, the recommended value for analog
>> operation).
>>
>> The existing dvb-pll users in the cx88 driver, listed below, will gain these
>> init and sleep sequences.
>> CX88_BOARD_HAUPPAUGE_HVR1100    Hauppauge WinTV-HVR1100 DVB-T/Hybrid
>> CX88_BOARD_HAUPPAUGE_HVR1100LP  Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profi
>> CX88_BOARD_WINFAST_DTV2000H     WinFast DTV2000 H
>> CX88_BOARD_HAUPPAUGE_HVR3000    Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DV
>> CX88_BOARD_HAUPPAUGE_HVR1300    Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encod
>>
>> This non-dvb-pll user in the cx88 driver should only gain the sleep sequence,
>> as it already had an equivalent init sequence.  The non-dvb-pll code for this
>> user is removed.
>> X88_BOARD_DNTV_LIVE_DVB_T_PRO   digitalnow DNTV Live! DVB-T Pro
>>
>> In these saa7134 driver, these non-dvb-pll users are converted to use dvb-pll:
>> SAA7134_BOARD_MD7134                    Medion 7134
>> SAA7134_BOARD_ASUS_EUROPA2_HYBRID       Asus Europa2 OEM
>>
>> The saa7134 functions philips_fmd1216_tuner_init(),
>> philips_fmd1216_tuner_sleep(), and philips_fmd1216_tuner_set_params() are
>> deleted and the dvb-pll versions are used.
>>
>> This should result in equivalent sleep, init, and tuning sequences being sent
>> to the tuner.
>>
>> For the cxusb driver, only one board is effected:
>> USB_PID_MEDION_MD95700          	Medion MD95700
>>
>> This board used dvb_usb_tuner_init_i2c() and dvb_usb_tuner_set_params_i2c()
>> for init and tuning, respectively.  These functions are effectively the same
>> as the dvb-pll versions.  They call a tuner pass control function defined at
>> the dvb-usb level, but this does not matter, as this card does not have a
>> tuner pass control function (only the dib3000mb does).  This board will gain
>> the sleep sequence, while init and tuning should be unchanged.
>>
>> Signed-off-by: Trent Piepho <xyzzy@xxxxxxxxxxxxx>
>>
>> diff --git a/linux/drivers/media/dvb/dvb-usb/cxusb.c b/linux/drivers/media/dvb/dvb-usb/cxusb.c
>> --- a/linux/drivers/media/dvb/dvb-usb/cxusb.c
>> +++ b/linux/drivers/media/dvb/dvb-usb/cxusb.c
>> @@ -354,14 +354,8 @@ static struct mt352_config cxusb_mt352_c
>>  /* Callbacks for DVB USB */
>>  static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
>>  {
>> -	u8 bpll[4] = { 0x0b, 0xdc, 0x9c, 0xa0 };
>> -	adap->pll_addr = 0x61;
>> -	memcpy(adap->pll_init, bpll, 4);
>> -	adap->pll_desc = &dvb_pll_fmd1216me;
>> -
>> -	adap->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c;
>> -	adap->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c;
>> -
>> +	dvb_attach(dvb_pll_attach, adap->fe, 0x61, &adap->dev->i2c_adap,
>> +		   &dvb_pll_fmd1216me);
>>  	return 0;
>>  }
>>
>> diff --git a/linux/drivers/media/dvb/frontends/dvb-pll.c b/linux/drivers/media/dvb/frontends/dvb-pll.c
>> --- a/linux/drivers/media/dvb/frontends/dvb-pll.c
>> +++ b/linux/drivers/media/dvb/frontends/dvb-pll.c
>> @@ -38,6 +38,12 @@
>>  	0x50 = AGC Take over point = 103 dBuV */
>>  static u8 tua603x_agc103[] = { 2, 0x80|0x40|0x18|0x06|0x01, 0x00|0x50 };
>>
>> +/*	0x04 = 166.67 kHz divider
>> +
>> +	0x80 = AGC Time constant 50ms Iagc = 9 uA
>> +	0x20 = AGC Take over point = 112 dBuV */
>> +static u8 tua603x_agc112[] = { 2, 0x80|0x40|0x18|0x04|0x01, 0x80|0x20 };
>> +
>>  struct dvb_pll_desc dvb_pll_thomson_dtt7579 = {
>>  	.name  = "Thomson dtt7579",
>>  	.min   = 177000000,
>> @@ -282,6 +288,8 @@ struct dvb_pll_desc dvb_pll_fmd1216me =
>>  	.max = 858000000,
>>  	.iffreq= 36125000,
>>  	.setbw = fmd1216me_bw,
>> +	.initdata = tua603x_agc112,
>> +	.sleepdata = (u8[]){ 4, 0x9c, 0x60, 0x85, 0x54 },
>>  	.count = 7,
>>  	.entries = {
>>  		{ 143870000, 166667, 0xbc, 0x41 },
>> diff --git a/linux/drivers/media/video/cx88/cx88-dvb.c b/linux/drivers/media/video/cx88/cx88-dvb.c
>> --- a/linux/drivers/media/video/cx88/cx88-dvb.c
>> +++ b/linux/drivers/media/video/cx88/cx88-dvb.c
>> @@ -224,64 +224,6 @@ static int dntv_live_dvbt_pro_demod_init
>>  	return 0;
>>  }
>>
>> -static int philips_fmd1216_pll_init(struct dvb_frontend *fe)
>> -{
>> -	struct cx8802_dev *dev= fe->dvb->priv;
>> -
>> -	/* this message is to set up ATC and ALC */
>> -	static u8 fmd1216_init[] = { 0x0b, 0xdc, 0x9c, 0xa0 };
>> -	struct i2c_msg msg =
>> -		{ .addr = dev->core->pll_addr, .flags = 0,
>> -		  .buf = fmd1216_init, .len = sizeof(fmd1216_init) };
>> -	int err;
>> -
>> -	if (fe->ops.i2c_gate_ctrl)
>> -		fe->ops.i2c_gate_ctrl(fe, 1);
>> -	if ((err = i2c_transfer(&dev->core->i2c_adap, &msg, 1)) != 1) {
>> -		if (err < 0)
>> -			return err;
>> -		else
>> -			return -EREMOTEIO;
>> -	}
>> -
>> -	return 0;
>> -}
>> -
>> -static int dntv_live_dvbt_pro_tuner_set_params(struct dvb_frontend* fe,
>> -					       struct dvb_frontend_parameters* params)
>> -{
>> -	struct cx8802_dev *dev= fe->dvb->priv;
>> -	u8 buf[4];
>> -	struct i2c_msg msg =
>> -		{ .addr = dev->core->pll_addr, .flags = 0,
>> -		  .buf = buf, .len = 4 };
>> -	int err;
>> -
>> -	/* Switch PLL to DVB mode */
>> -	err = philips_fmd1216_pll_init(fe);
>> -	if (err)
>> -		return err;
>> -
>> -	/* Tune PLL */
>> -	dvb_pll_configure(dev->core->pll_desc, buf,
>> -			  params->frequency,
>> -			  params->u.ofdm.bandwidth);
>> -	if (fe->ops.i2c_gate_ctrl)
>> -		fe->ops.i2c_gate_ctrl(fe, 1);
>> -	if ((err = i2c_transfer(&dev->core->i2c_adap, &msg, 1)) != 1) {
>> -
>> -		printk(KERN_WARNING "cx88-dvb: %s error "
>> -		       "(addr %02x <- %02x, err = %i)\n",
>> -		       __FUNCTION__, dev->core->pll_addr, buf[0], err);
>> -		if (err < 0)
>> -			return err;
>> -		else
>> -			return -EREMOTEIO;
>> -	}
>> -
>> -	return 0;
>> -}
>> -
>>  static struct mt352_config dntv_live_dvbt_pro_config = {
>>  	.demod_address = 0x0f,
>>  	.no_tuner      = 1,
>> @@ -546,12 +488,11 @@ static int dvb_register(struct cx8802_de
>>  		break;
>>  	case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
>>  #if defined(CONFIG_VIDEO_CX88_VP3054) || defined(CONFIG_VIDEO_CX88_VP3054_MODULE)
>> -		dev->core->pll_addr = 0x61;
>> -		dev->core->pll_desc = &dvb_pll_fmd1216me;
>>  		dev->dvb.frontend = dvb_attach(mt352_attach, &dntv_live_dvbt_pro_config,
>>  			&((struct vp3054_i2c_state *)dev->card_priv)->adap);
>>  		if (dev->dvb.frontend != NULL) {
>> -			dev->dvb.frontend->ops.tuner_ops.set_params = dntv_live_dvbt_pro_tuner_set_params;
>> +			dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61,
>> +				   &dev->core->i2c_adap, &dvb_pll_fmd1216me);
>>  		}
>>  #else
>>  		printk("%s: built without vp3054 support\n", dev->core->name);
>> diff --git a/linux/drivers/media/video/saa7134/saa7134-dvb.c b/linux/drivers/media/video/saa7134/saa7134-dvb.c
>> --- a/linux/drivers/media/video/saa7134/saa7134-dvb.c
>> +++ b/linux/drivers/media/video/saa7134/saa7134-dvb.c
>> @@ -445,135 +445,6 @@ static struct tda1004x_config philips_eu
>>
>>  /* ------------------------------------------------------------------ */
>>
>> -static int philips_fmd1216_tuner_init(struct dvb_frontend *fe)
>> -{
>> -	struct saa7134_dev *dev = fe->dvb->priv;
>> -	struct tda1004x_state *state = fe->demodulator_priv;
>> -	u8 addr = state->config->tuner_address;
>> -	/* this message is to set up ATC and ALC */
>> -	static u8 fmd1216_init[] = { 0x0b, 0xdc, 0x9c, 0xa0 };
>> -	struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = fmd1216_init,.len = sizeof(fmd1216_init) };
>> -
>> -	if (fe->ops.i2c_gate_ctrl)
>> -		fe->ops.i2c_gate_ctrl(fe, 1);
>> -	if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
>> -		return -EIO;
>> -	msleep(1);
>> -
>> -	return 0;
>> -}
>> -
>> -static int philips_fmd1216_tuner_sleep(struct dvb_frontend *fe)
>> -{
>> -	struct saa7134_dev *dev = fe->dvb->priv;
>> -	struct tda1004x_state *state = fe->demodulator_priv;
>> -	u8 addr = state->config->tuner_address;
>> -	/* this message actually turns the tuner back to analog mode */
>> -	u8 fmd1216_init[] = { 0x0b, 0xdc, 0x9c, 0x60 };
>> -	struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = fmd1216_init,.len = sizeof(fmd1216_init) };
>> -
>> -	if (fe->ops.i2c_gate_ctrl)
>> -		fe->ops.i2c_gate_ctrl(fe, 1);
>> -	i2c_transfer(&dev->i2c_adap, &tuner_msg, 1);
>> -	msleep(1);
>> -	fmd1216_init[2] = 0x86;
>> -	fmd1216_init[3] = 0x54;
>> -	if (fe->ops.i2c_gate_ctrl)
>> -		fe->ops.i2c_gate_ctrl(fe, 1);
>> -	i2c_transfer(&dev->i2c_adap, &tuner_msg, 1);
>> -	msleep(1);
>> -	return 0;
>> -}
>> -
>> -static int philips_fmd1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
>> -{
>> -	struct saa7134_dev *dev = fe->dvb->priv;
>> -	struct tda1004x_state *state = fe->demodulator_priv;
>> -	u8 addr = state->config->tuner_address;
>> -	u8 tuner_buf[4];
>> -	struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tuner_buf,.len =
>> -			sizeof(tuner_buf) };
>> -	int tuner_frequency = 0;
>> -	int divider = 0;
>> -	u8 band, mode, cp;
>> -
>> -	/* determine charge pump */
>> -	tuner_frequency = params->frequency + 36130000;
>> -	if (tuner_frequency < 87000000)
>> -		return -EINVAL;
>> -	/* low band */
>> -	else if (tuner_frequency < 180000000) {
>> -		band = 1;
>> -		mode = 7;
>> -		cp   = 0;
>> -	} else if (tuner_frequency < 195000000) {
>> -		band = 1;
>> -		mode = 6;
>> -		cp   = 1;
>> -	/* mid band	*/
>> -	} else if (tuner_frequency < 366000000) {
>> -		if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) {
>> -			band = 10;
>> -		} else {
>> -			band = 2;
>> -		}
>> -		mode = 7;
>> -		cp   = 0;
>> -	} else if (tuner_frequency < 478000000) {
>> -		if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) {
>> -			band = 10;
>> -		} else {
>> -			band = 2;
>> -		}
>> -		mode = 6;
>> -		cp   = 1;
>> -	/* high band */
>> -	} else if (tuner_frequency < 662000000) {
>> -		if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) {
>> -			band = 12;
>> -		} else {
>> -			band = 4;
>> -		}
>> -		mode = 7;
>> -		cp   = 0;
>> -	} else if (tuner_frequency < 840000000) {
>> -		if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) {
>> -			band = 12;
>> -		} else {
>> -			band = 4;
>> -		}
>> -		mode = 6;
>> -		cp   = 1;
>> -	} else {
>> -		if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) {
>> -			band = 12;
>> -		} else {
>> -			band = 4;
>> -		}
>> -		mode = 7;
>> -		cp   = 1;
>> -
>> -	}
>> -	/* calculate divisor */
>> -	/* ((36166000 + Finput) / 166666) rounded! */
>> -	divider = (tuner_frequency + 83333) / 166667;
>> -
>> -	/* setup tuner buffer */
>> -	tuner_buf[0] = (divider >> 8) & 0x7f;
>> -	tuner_buf[1] = divider & 0xff;
>> -	tuner_buf[2] = 0x80 | (cp << 6) | (mode  << 3) | 4;
>> -	tuner_buf[3] = 0x40 | band;
>> -
>> -	if (fe->ops.i2c_gate_ctrl)
>> -		fe->ops.i2c_gate_ctrl(fe, 1);
>> -	if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) {
>> -		wprintk("could not write to tuner at addr: 0x%02x\n",
>> -			addr << 1);
>> -		return -EIO;
>> -	}
>> -	return 0;
>> -}
>> -
>>  static struct tda1004x_config medion_cardbus = {
>>  	.demod_address = 0x08,
>>  	.invert        = 1,
>> @@ -1000,9 +871,8 @@ static int dvb_init(struct saa7134_dev *
>>  					       &medion_cardbus,
>>  					       &dev->i2c_adap);
>>  		if (dev->dvb.frontend) {
>> -			dev->dvb.frontend->ops.tuner_ops.init = philips_fmd1216_tuner_init;
>> -			dev->dvb.frontend->ops.tuner_ops.sleep = philips_fmd1216_tuner_sleep;
>> -			dev->dvb.frontend->ops.tuner_ops.set_params = philips_fmd1216_tuner_set_params;
>> +			dvb_attach(dvb_pll_attach, dev->dvb.frontend, medion_cardbus.tuner_address,
>> +				   &dev->i2c_adap, &dvb_pll_fmd1216me);
>>  		}
>>  		break;
>>  	case SAA7134_BOARD_PHILIPS_TOUGH:
>> @@ -1128,9 +998,9 @@ static int dvb_init(struct saa7134_dev *
>>  		if (dev->dvb.frontend) {
>>  			dev->original_demod_sleep = dev->dvb.frontend->ops.sleep;
>>  			dev->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
>> -			dev->dvb.frontend->ops.tuner_ops.init = philips_fmd1216_tuner_init;
>> -			dev->dvb.frontend->ops.tuner_ops.sleep = philips_fmd1216_tuner_sleep;
>> -			dev->dvb.frontend->ops.tuner_ops.set_params = philips_fmd1216_tuner_set_params;
>> +
>> +			dvb_attach(dvb_pll_attach, dev->dvb.frontend, medion_cardbus.tuner_address,
>> +				   &dev->i2c_adap, &dvb_pll_fmd1216me);
>>  		}
>>  		break;
>>  	case SAA7134_BOARD_VIDEOMATE_DVBT_200A:
>>
>> _______________________________________________
>> linux-dvb mailing list
>> linux-dvb@xxxxxxxxxxx
>> http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
> 
> 

_______________________________________________
linux-dvb mailing list
linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

[Index of Archives]     [Linux Media]     [Video 4 Linux]     [Asterisk]     [Samba]     [Xorg]     [Xfree86]     [Linux USB]

  Powered by Linux