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 <[EMAIL PROTECTED]>
> -----------------------------
> Integrate all users of the fmd1216 tuner with dvb-pll
>
> From: Trent Piepho <[EMAIL PROTECTED]>
>
> 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 <[EMAIL PROTECTED]>
>
> 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
> [email protected]
> http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
--
Michael Krufky
_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb