]> err.no Git - linux-2.6/commitdiff
V4L/DVB (3879): Convert saa7134-dvb to refactored tuner code
authorAndrew de Quincey <adq_dvb@lidskialf.net>
Tue, 18 Apr 2006 20:47:11 +0000 (17:47 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Sun, 25 Jun 2006 04:59:07 +0000 (01:59 -0300)
Rename pll calls to appropriate tuner calls.
Remove pll functions from demod structures.
Hook tuner call into tuner_ops.
Attach dvb-pll where possible.
Add pll gate control calls where appropriate.
Move europa specific code from tda1104x into card driver using ops overrides
(this is how it should ebe done instead of hacking card specific code into
the demod driver).

Signed-off-by: Andrew de Quincey <adq_dvb@lidskialf.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/saa7134/saa7134-dvb.c
drivers/media/video/saa7134/saa7134.h

index 98a492ddc216081cc8a0e1ca8e9359171c67ed25..a36dab1525857c9432599ce33f955ffb25bd0cab 100644 (file)
@@ -132,9 +132,9 @@ static int mt352_aver777_init(struct dvb_frontend* fe)
        return 0;
 }
 
-static int mt352_pinnacle_pll_set(struct dvb_frontend* fe,
-                                 struct dvb_frontend_parameters* params,
-                                 u8* pllbuf)
+static int mt352_pinnacle_tuner_pllbuf(struct dvb_frontend* fe,
+                                      struct dvb_frontend_parameters* params,
+                                      u8* pllbuf, int buf_len)
 {
        u8 off[] = { 0x00, 0xf1};
        u8 on[]  = { 0x00, 0x71};
@@ -143,6 +143,9 @@ static int mt352_pinnacle_pll_set(struct dvb_frontend* fe,
        struct saa7134_dev *dev = fe->dvb->priv;
        struct v4l2_frequency f;
 
+       if (buf_len < 5)
+               return -EINVAL;
+
        /* set frequency (mt2050) */
        f.tuner     = 0;
        f.type      = V4L2_TUNER_DIGITAL_TV;
@@ -156,21 +159,24 @@ static int mt352_pinnacle_pll_set(struct dvb_frontend* fe,
 
        /* mt352 setup */
        mt352_pinnacle_init(fe);
-       pllbuf[0] = 0xc2;
+       pllbuf[0] = 0x61;
        pllbuf[1] = 0x00;
        pllbuf[2] = 0x00;
        pllbuf[3] = 0x80;
        pllbuf[4] = 0x00;
-       return 0;
+       return 5;
 }
 
-static int mt352_aver777_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params, u8* pllbuf)
+static int mt352_aver777_tuner_pllbuf(struct dvb_frontend *fe, struct dvb_frontend_parameters *params, u8* pllbuf, int buf_len)
 {
-       pllbuf[0] = 0xc2;
+       if (buf_len < 5)
+               return -EINVAL;
+
+       pllbuf[0] = 0x61;
        dvb_pll_configure(&dvb_pll_philips_td1316, pllbuf+1,
                          params->frequency,
                          params->u.ofdm.bandwidth);
-       return 0;
+       return 5;
 }
 
 static struct mt352_config pinnacle_300i = {
@@ -179,13 +185,11 @@ static struct mt352_config pinnacle_300i = {
        .if2           = 36150,
        .no_tuner      = 1,
        .demod_init    = mt352_pinnacle_init,
-       .pll_set       = mt352_pinnacle_pll_set,
 };
 
 static struct mt352_config avermedia_777 = {
        .demod_address = 0xf,
        .demod_init    = mt352_aver777_init,
-       .pll_set       = mt352_aver777_pll_set,
 };
 #endif
 
@@ -268,6 +272,8 @@ static int philips_tda6651_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb_
        tuner_buf[2] = 0xca;
        tuner_buf[3] = (cp << 5) | (filter << 3) | band;
 
+       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);
@@ -281,6 +287,8 @@ static int philips_tda6651_pll_init(u8 addr, struct dvb_frontend *fe)
        struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) };
 
        /* setup PLL configuration */
+       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);
@@ -290,12 +298,12 @@ static int philips_tda6651_pll_init(u8 addr, struct dvb_frontend *fe)
 
 /* ------------------------------------------------------------------ */
 
-static int philips_tu1216_pll_60_init(struct dvb_frontend *fe)
+static int philips_tu1216_tuner_60_init(struct dvb_frontend *fe)
 {
        return philips_tda6651_pll_init(0x60, fe);
 }
 
-static int philips_tu1216_pll_60_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int philips_tu1216_tuner_60_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        return philips_tda6651_pll_set(0x60, fe, params);
 }
@@ -315,20 +323,17 @@ static struct tda1004x_config philips_tu1216_60_config = {
        .xtal_freq     = TDA10046_XTAL_4M,
        .agc_config    = TDA10046_AGC_DEFAULT,
        .if_freq       = TDA10046_FREQ_3617,
-       .pll_init      = philips_tu1216_pll_60_init,
-       .pll_set       = philips_tu1216_pll_60_set,
-       .pll_sleep     = NULL,
        .request_firmware = philips_tu1216_request_firmware,
 };
 
 /* ------------------------------------------------------------------ */
 
-static int philips_tu1216_pll_61_init(struct dvb_frontend *fe)
+static int philips_tu1216_tuner_61_init(struct dvb_frontend *fe)
 {
        return philips_tda6651_pll_init(0x61, fe);
 }
 
-static int philips_tu1216_pll_61_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int philips_tu1216_tuner_61_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        return philips_tda6651_pll_set(0x61, fe, params);
 }
@@ -341,21 +346,20 @@ static struct tda1004x_config philips_tu1216_61_config = {
        .xtal_freq     = TDA10046_XTAL_4M,
        .agc_config    = TDA10046_AGC_DEFAULT,
        .if_freq       = TDA10046_FREQ_3617,
-       .pll_init      = philips_tu1216_pll_61_init,
-       .pll_set       = philips_tu1216_pll_61_set,
-       .pll_sleep     = NULL,
        .request_firmware = philips_tu1216_request_firmware,
 };
 
 /* ------------------------------------------------------------------ */
 
-static int philips_europa_pll_init(struct dvb_frontend *fe)
+static int philips_europa_tuner_init(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        static u8 msg[] = { 0x0b, 0xf5, 0x86, 0xab };
        struct i2c_msg init_msg = {.addr = 0x61,.flags = 0,.buf = msg,.len = sizeof(msg) };
 
        /* setup PLL configuration */
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
                return -EIO;
        msleep(1);
@@ -365,18 +369,20 @@ static int philips_europa_pll_init(struct dvb_frontend *fe)
        init_msg.len  = 0x02;
        msg[0] = 0x00;
        msg[1] = 0x40;
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
                return -EIO;
 
        return 0;
 }
 
-static int philips_td1316_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int philips_td1316_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        return philips_tda6651_pll_set(0x61, fe, params);
 }
 
-static void philips_europa_analog(struct dvb_frontend *fe)
+static int philips_europa_tuner_sleep(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        /* this message actually turns the tuner back to analog mode */
@@ -391,7 +397,20 @@ static void philips_europa_analog(struct dvb_frontend *fe)
        analog_msg.len  = 0x02;
        msg[0] = 0x00;
        msg[1] = 0x14;
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        i2c_transfer(&dev->i2c_adap, &analog_msg, 1);
+       return 0;
+}
+
+static int philips_europa_demod_sleep(struct dvb_frontend *fe)
+{
+       struct saa7134_dev *dev = fe->dvb->priv;
+
+       if (dev->original_demod_sleep)
+               dev->original_demod_sleep(fe);
+       fe->ops->i2c_gate_ctrl(fe, 1);
+       return 0;
 }
 
 static struct tda1004x_config philips_europa_config = {
@@ -402,21 +421,20 @@ static struct tda1004x_config philips_europa_config = {
        .xtal_freq     = TDA10046_XTAL_4M,
        .agc_config    = TDA10046_AGC_IFO_AUTO_POS,
        .if_freq       = TDA10046_FREQ_052,
-       .pll_init      = philips_europa_pll_init,
-       .pll_set       = philips_td1316_pll_set,
-       .pll_sleep     = philips_europa_analog,
        .request_firmware = NULL,
 };
 
 /* ------------------------------------------------------------------ */
 
-static int philips_fmd1216_pll_init(struct dvb_frontend *fe)
+static int philips_fmd1216_tuner_init(struct dvb_frontend *fe)
 {
        struct saa7134_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 tuner_msg = {.addr = 0x61,.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);
@@ -424,22 +442,27 @@ static int philips_fmd1216_pll_init(struct dvb_frontend *fe)
        return 0;
 }
 
-static void philips_fmd1216_analog(struct dvb_frontend *fe)
+static int philips_fmd1216_tuner_sleep(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        /* this message actually turns the tuner back to analog mode */
        static u8 fmd1216_init[] = { 0x0b, 0xdc, 0x9c, 0x60 };
        struct i2c_msg tuner_msg = {.addr = 0x61,.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_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int philips_fmd1216_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        u8 tuner_buf[4];
@@ -516,6 +539,8 @@ static int philips_fmd1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_
        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)
                return -EIO;
        return 0;
@@ -528,9 +553,6 @@ static struct tda1004x_config medion_cardbus = {
        .xtal_freq     = TDA10046_XTAL_16M,
        .agc_config    = TDA10046_AGC_IFO_AUTO_NEG,
        .if_freq       = TDA10046_FREQ_3613,
-       .pll_init      = philips_fmd1216_pll_init,
-       .pll_set       = philips_fmd1216_pll_set,
-       .pll_sleep         = philips_fmd1216_analog,
        .request_firmware = NULL,
 };
 
@@ -578,12 +600,12 @@ static struct tda827x_data tda827x_dvbt[] = {
        { .lomax =         0, .spd = 0, .bs = 0, .bp = 0, .cp = 0, .gc3 = 0, .div1p5 = 0}
 };
 
-static int philips_tda827x_pll_init(struct dvb_frontend *fe)
+static int philips_tda827x_tuner_init(struct dvb_frontend *fe)
 {
        return 0;
 }
 
-static int philips_tda827x_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int philips_tda827x_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        u8 tuner_buf[14];
@@ -630,6 +652,8 @@ static int philips_tda827x_pll_set(struct dvb_frontend *fe, struct dvb_frontend_
        tuner_buf[13] = 0x40;
 
        tuner_msg.len = 14;
+       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;
 
@@ -638,18 +662,23 @@ static int philips_tda827x_pll_set(struct dvb_frontend *fe, struct dvb_frontend_
        tuner_buf[0] = 0x30;
        tuner_buf[1] = 0x50 + tda827x_dvbt[i].cp;
        tuner_msg.len = 2;
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        i2c_transfer(&dev->i2c_adap, &tuner_msg, 1);
 
        return 0;
 }
 
-static void philips_tda827x_pll_sleep(struct dvb_frontend *fe)
+static int philips_tda827x_tuner_sleep(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        static u8 tda827x_sleep[] = { 0x30, 0xd0};
        struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tda827x_sleep,
                                    .len = sizeof(tda827x_sleep) };
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        i2c_transfer(&dev->i2c_adap, &tuner_msg, 1);
+       return 0;
 }
 
 static struct tda1004x_config tda827x_lifeview_config = {
@@ -659,9 +688,6 @@ static struct tda1004x_config tda827x_lifeview_config = {
        .xtal_freq     = TDA10046_XTAL_16M,
        .agc_config    = TDA10046_AGC_TDA827X,
        .if_freq       = TDA10046_FREQ_045,
-       .pll_init      = philips_tda827x_pll_init,
-       .pll_set       = philips_tda827x_pll_set,
-       .pll_sleep         = philips_tda827x_pll_sleep,
        .request_firmware = NULL,
 };
 
@@ -753,6 +779,8 @@ static int philips_tda827xa_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb
        tuner_buf[12] = 0x00;
        tuner_buf[13] = 0x39;  // lpsel
        msg.len = 14;
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1)
                return -EIO;
 
@@ -760,10 +788,14 @@ static int philips_tda827xa_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb
        msg.len = 2;
        reg2[0] = 0x60;
        reg2[1] = 0x3c;
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        i2c_transfer(&dev->i2c_adap, &msg, 1);
 
        reg2[0] = 0xa0;
        reg2[1] = 0x40;
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        i2c_transfer(&dev->i2c_adap, &msg, 1);
 
        msleep(2);
@@ -771,36 +803,43 @@ static int philips_tda827xa_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb
        reg2[0] = 0x30;
        reg2[1] = 0x10 + tda827xa_dvbt[i].scr;
        msg.len = 2;
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        i2c_transfer(&dev->i2c_adap, &msg, 1);
 
        msleep(550);
        reg2[0] = 0x50;
        reg2[1] = 0x4f + (tda827xa_dvbt[i].gc3 << 4);
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        i2c_transfer(&dev->i2c_adap, &msg, 1);
 
        return 0;
 
 }
 
-static void philips_tda827xa_pll_sleep(u8 addr, struct dvb_frontend *fe)
+static int philips_tda827xa_tuner_sleep(u8 addr, struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        static u8 tda827xa_sleep[] = { 0x30, 0x90};
        struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tda827xa_sleep,
                                    .len = sizeof(tda827xa_sleep) };
+       if (fe->ops->i2c_gate_ctrl)
+               fe->ops->i2c_gate_ctrl(fe, 1);
        i2c_transfer(&dev->i2c_adap, &tuner_msg, 1);
-
+       return 0;
 }
 
 /* ------------------------------------------------------------------ */
 
-static int philips_tiger_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int philips_tiger_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        int ret;
        struct saa7134_dev *dev = fe->dvb->priv;
        static u8 tda8290_close[] = { 0x21, 0xc0};
        static u8 tda8290_open[]  = { 0x21, 0x80};
        struct i2c_msg tda8290_msg = {.addr = 0x4b,.flags = 0, .len = 2};
+
        /* close tda8290 i2c bridge */
        tda8290_msg.buf = tda8290_close;
        ret = i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1);
@@ -816,7 +855,7 @@ static int philips_tiger_pll_set(struct dvb_frontend *fe, struct dvb_frontend_pa
        return ret;
 }
 
-static int philips_tiger_dvb_mode(struct dvb_frontend *fe)
+static int philips_tiger_tuner_init(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        static u8 data[] = { 0x3c, 0x33, 0x6a};
@@ -827,14 +866,15 @@ static int philips_tiger_dvb_mode(struct dvb_frontend *fe)
        return 0;
 }
 
-static void philips_tiger_analog_mode(struct dvb_frontend *fe)
+static int philips_tiger_tuner_sleep(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        static u8 data[] = { 0x3c, 0x33, 0x68};
        struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
 
        i2c_transfer(&dev->i2c_adap, &msg, 1);
-       philips_tda827xa_pll_sleep( 0x61, fe);
+       philips_tda827xa_tuner_sleep( 0x61, fe);
+       return 0;
 }
 
 static struct tda1004x_config philips_tiger_config = {
@@ -844,15 +884,12 @@ static struct tda1004x_config philips_tiger_config = {
        .xtal_freq     = TDA10046_XTAL_16M,
        .agc_config    = TDA10046_AGC_TDA827X,
        .if_freq       = TDA10046_FREQ_045,
-       .pll_init      = philips_tiger_dvb_mode,
-       .pll_set       = philips_tiger_pll_set,
-       .pll_sleep     = philips_tiger_analog_mode,
        .request_firmware = NULL,
 };
 
 /* ------------------------------------------------------------------ */
 
-static int lifeview_trio_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int lifeview_trio_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        int ret;
 
@@ -860,16 +897,12 @@ static int lifeview_trio_pll_set(struct dvb_frontend *fe, struct dvb_frontend_pa
        return ret;
 }
 
-static int lifeview_trio_dvb_mode(struct dvb_frontend *fe)
+static int lifeview_trio_tuner_sleep(struct dvb_frontend *fe)
 {
+       philips_tda827xa_tuner_sleep(0x60, fe);
        return 0;
 }
 
-static void lifeview_trio_analog_mode(struct dvb_frontend *fe)
-{
-       philips_tda827xa_pll_sleep(0x60, fe);
-}
-
 static struct tda1004x_config lifeview_trio_config = {
        .demod_address = 0x09,
        .invert        = 1,
@@ -877,15 +910,12 @@ static struct tda1004x_config lifeview_trio_config = {
        .xtal_freq     = TDA10046_XTAL_16M,
        .agc_config    = TDA10046_AGC_TDA827X_GPL,
        .if_freq       = TDA10046_FREQ_045,
-       .pll_init      = lifeview_trio_dvb_mode,
-       .pll_set       = lifeview_trio_pll_set,
-       .pll_sleep     = lifeview_trio_analog_mode,
        .request_firmware = NULL,
 };
 
 /* ------------------------------------------------------------------ */
 
-static int ads_duo_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int ads_duo_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        int ret;
 
@@ -893,7 +923,7 @@ static int ads_duo_pll_set(struct dvb_frontend *fe, struct dvb_frontend_paramete
        return ret;
 }
 
-static int ads_duo_dvb_mode(struct dvb_frontend *fe)
+static int ads_duo_tuner_init(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        /* route TDA8275a AGC input to the channel decoder */
@@ -901,12 +931,13 @@ static int ads_duo_dvb_mode(struct dvb_frontend *fe)
        return 0;
 }
 
-static void ads_duo_analog_mode(struct dvb_frontend *fe)
+static int ads_duo_tuner_sleep(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        /* route TDA8275a AGC input to the analog IF chip*/
        saa_writeb(SAA7134_GPIO_GPSTATUS2, 0x20);
-       philips_tda827xa_pll_sleep( 0x61, fe);
+       philips_tda827xa_tuner_sleep( 0x61, fe);
+       return 0;
 }
 
 static struct tda1004x_config ads_tech_duo_config = {
@@ -916,31 +947,24 @@ static struct tda1004x_config ads_tech_duo_config = {
        .xtal_freq     = TDA10046_XTAL_16M,
        .agc_config    = TDA10046_AGC_TDA827X_GPL,
        .if_freq       = TDA10046_FREQ_045,
-       .pll_init      = ads_duo_dvb_mode,
-       .pll_set       = ads_duo_pll_set,
-       .pll_sleep     = ads_duo_analog_mode,
        .request_firmware = NULL,
 };
 
 /* ------------------------------------------------------------------ */
 
-static int tevion_dvb220rf_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int tevion_dvb220rf_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        int ret;
        ret = philips_tda827xa_pll_set(0x60, fe, params);
        return ret;
 }
 
-static int tevion_dvb220rf_pll_init(struct dvb_frontend *fe)
+static int tevion_dvb220rf_tuner_sleep(struct dvb_frontend *fe)
 {
+       philips_tda827xa_tuner_sleep( 0x61, fe);
        return 0;
 }
 
-static void tevion_dvb220rf_pll_sleep(struct dvb_frontend *fe)
-{
-       philips_tda827xa_pll_sleep( 0x61, fe);
-}
-
 static struct tda1004x_config tevion_dvbt220rf_config = {
        .demod_address = 0x08,
        .invert        = 1,
@@ -948,9 +972,6 @@ static struct tda1004x_config tevion_dvbt220rf_config = {
        .xtal_freq     = TDA10046_XTAL_16M,
        .agc_config    = TDA10046_AGC_TDA827X,
        .if_freq       = TDA10046_FREQ_045,
-       .pll_init      = tevion_dvb220rf_pll_init,
-       .pll_set       = tevion_dvb220rf_pll_set,
-       .pll_sleep     = tevion_dvb220rf_pll_sleep,
        .request_firmware = NULL,
 };
 
@@ -961,8 +982,6 @@ static struct tda1004x_config tevion_dvbt220rf_config = {
 #ifdef HAVE_NXT200X
 static struct nxt200x_config avertvhda180 = {
        .demod_address    = 0x0a,
-       .pll_address      = 0x61,
-       .pll_desc         = &dvb_pll_tdhu2,
 };
 
 static int nxt200x_set_pll_input(u8 *buf, int input)
@@ -976,8 +995,6 @@ static int nxt200x_set_pll_input(u8 *buf, int input)
 
 static struct nxt200x_config kworldatsc110 = {
        .demod_address    = 0x0a,
-       .pll_address      = 0x61,
-       .pll_desc         = &dvb_pll_tuv1236d,
        .set_pll_input    = nxt200x_set_pll_input,
 };
 #endif
@@ -1003,78 +1020,126 @@ static int dvb_init(struct saa7134_dev *dev)
                printk("%s: pinnacle 300i dvb setup\n",dev->name);
                dev->dvb.frontend = mt352_attach(&pinnacle_300i,
                                                 &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.pllbuf = mt352_pinnacle_tuner_pllbuf;
                break;
 
        case SAA7134_BOARD_AVERMEDIA_777:
                printk("%s: avertv 777 dvb setup\n",dev->name);
                dev->dvb.frontend = mt352_attach(&avermedia_777,
                                                 &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.pllbuf = mt352_aver777_tuner_pllbuf;
                break;
 #endif
 #ifdef HAVE_TDA1004X
        case SAA7134_BOARD_MD7134:
                dev->dvb.frontend = tda10046_attach(&medion_cardbus,
                                                    &dev->i2c_adap);
+               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;
                break;
        case SAA7134_BOARD_PHILIPS_TOUGH:
                dev->dvb.frontend = tda10046_attach(&philips_tu1216_60_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = philips_tu1216_tuner_60_init;
+               dev->dvb.frontend->ops->tuner_ops.set_params = philips_tu1216_tuner_60_set_params;
                break;
        case SAA7134_BOARD_FLYDVBTDUO:
                dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = philips_tda827x_tuner_init;
+               dev->dvb.frontend->ops->tuner_ops.sleep = philips_tda827x_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = philips_tda827x_tuner_set_params;
                break;
        case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS:
                dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = philips_tda827x_tuner_init;
+               dev->dvb.frontend->ops->tuner_ops.sleep = philips_tda827x_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = philips_tda827x_tuner_set_params;
                break;
        case SAA7134_BOARD_PHILIPS_EUROPA:
                dev->dvb.frontend = tda10046_attach(&philips_europa_config,
                                                    &dev->i2c_adap);
+               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_europa_tuner_init;
+               dev->dvb.frontend->ops->tuner_ops.sleep = philips_europa_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = philips_td1316_tuner_set_params;
                break;
        case SAA7134_BOARD_VIDEOMATE_DVBT_300:
                dev->dvb.frontend = tda10046_attach(&philips_europa_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = philips_europa_tuner_init;
+               dev->dvb.frontend->ops->tuner_ops.sleep = philips_europa_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = philips_td1316_tuner_set_params;
                break;
        case SAA7134_BOARD_VIDEOMATE_DVBT_200:
                dev->dvb.frontend = tda10046_attach(&philips_tu1216_61_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = philips_tu1216_tuner_61_init;
+               dev->dvb.frontend->ops->tuner_ops.set_params = philips_tu1216_tuner_61_set_params;
                break;
        case SAA7134_BOARD_PHILIPS_TIGER:
                dev->dvb.frontend = tda10046_attach(&philips_tiger_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = philips_tiger_tuner_init;
+               dev->dvb.frontend->ops->tuner_ops.sleep = philips_tiger_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = philips_tiger_tuner_set_params;
                break;
        case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
                dev->dvb.frontend = tda10046_attach(&philips_tiger_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = philips_tiger_tuner_init;
+               dev->dvb.frontend->ops->tuner_ops.sleep = philips_tiger_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = philips_tiger_tuner_set_params;
                break;
        case SAA7134_BOARD_FLYDVBT_LR301:
                dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = philips_tda827x_tuner_init;
+               dev->dvb.frontend->ops->tuner_ops.sleep = philips_tda827x_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = philips_tda827x_tuner_set_params;
                break;
        case SAA7134_BOARD_FLYDVB_TRIO:
                dev->dvb.frontend = tda10046_attach(&lifeview_trio_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.sleep = lifeview_trio_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = lifeview_trio_tuner_set_params;
                break;
        case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
                dev->dvb.frontend = tda10046_attach(&ads_tech_duo_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = ads_duo_tuner_init;
+               dev->dvb.frontend->ops->tuner_ops.sleep = ads_duo_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = ads_duo_tuner_set_params;
                break;
        case SAA7134_BOARD_TEVION_DVBT_220RF:
                dev->dvb.frontend = tda10046_attach(&tevion_dvbt220rf_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.sleep = tevion_dvb220rf_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = tevion_dvb220rf_tuner_set_params;
                break;
        case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
                dev->dvb.frontend = tda10046_attach(&ads_tech_duo_config,
                                                    &dev->i2c_adap);
+               dev->dvb.frontend->ops->tuner_ops.init = ads_duo_tuner_init;
+               dev->dvb.frontend->ops->tuner_ops.sleep = ads_duo_tuner_sleep;
+               dev->dvb.frontend->ops->tuner_ops.set_params = ads_duo_tuner_set_params;
                break;
 #endif
 #ifdef HAVE_NXT200X
        case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
                dev->dvb.frontend = nxt200x_attach(&avertvhda180, &dev->i2c_adap);
+               if (dev->dvb.frontend) {
+                       dvb_pll_attach(dev->dvb.frontend, 0x61, &dev->i2c_adap, &dvb_pll_tdhu2);
+               }
                break;
        case SAA7134_BOARD_KWORLD_ATSC110:
                dev->dvb.frontend = nxt200x_attach(&kworldatsc110, &dev->i2c_adap);
+               if (dev->dvb.frontend) {
+                       dvb_pll_attach(dev->dvb.frontend, 0x61, &dev->i2c_adap, &dvb_pll_tuv1236d);
+               }
                break;
 #endif
        default:
index 353af3a8b766b7a868e7a71e0eaf81c4a2b460be..9048d2c29899efa29041c373336eaecb55f6b3c4 100644 (file)
@@ -531,6 +531,7 @@ struct saa7134_dev {
 
        /* SAA7134_MPEG_DVB only */
        struct videobuf_dvb        dvb;
+       int (*original_demod_sleep)(struct dvb_frontend* fe);
 };
 
 /* ----------------------------------------------------------- */