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> > ----------------------------- > 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 -- Michael Krufky _______________________________________________ linux-dvb mailing list linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb