fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / media / video / saa7134 / saa7134-dvb.c
index 449fe23..c33f6a6 100644 (file)
 #include <media/v4l2-common.h>
 #include "dvb-pll.h"
 
-#ifdef HAVE_MT352
-# include "mt352.h"
-# include "mt352_priv.h" /* FIXME */
-#endif
-#ifdef HAVE_TDA1004X
-# include "tda1004x.h"
-#endif
-#ifdef HAVE_NXT200X
-# include "nxt200x.h"
-#endif
-
+#include "mt352.h"
+#include "mt352_priv.h" /* FIXME */
+#include "tda1004x.h"
+#include "nxt200x.h"
+
+#include "tda10086.h"
+#include "tda826x.h"
+#include "isl6421.h"
 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
 MODULE_LICENSE("GPL");
 
@@ -53,9 +50,11 @@ static unsigned int antenna_pwr = 0;
 module_param(antenna_pwr, int, 0444);
 MODULE_PARM_DESC(antenna_pwr,"enable antenna power (Pinnacle 300i)");
 
-/* ------------------------------------------------------------------ */
+static int use_frontend = 0;
+module_param(use_frontend, int, 0644);
+MODULE_PARM_DESC(use_frontend,"for cards with multiple frontends (0: terrestrial, 1: satellite)");
 
-#ifdef HAVE_MT352
+/* ------------------------------------------------------------------ */
 static int pinnacle_antenna_pwr(struct saa7134_dev *dev, int on)
 {
        u32 ok;
@@ -185,12 +184,8 @@ static struct mt352_config avermedia_777 = {
        .demod_address = 0xf,
        .demod_init    = mt352_aver777_init,
 };
-#endif
 
 /* ------------------------------------------------------------------ */
-
-#ifdef HAVE_TDA1004X
-
 static int philips_tda6651_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
@@ -302,7 +297,7 @@ static int philips_tu1216_tuner_60_set_params(struct dvb_frontend *fe, struct dv
        return philips_tda6651_pll_set(0x60, fe, params);
 }
 
-static int philips_tu1216_request_firmware(struct dvb_frontend *fe,
+static int philips_tda1004x_request_firmware(struct dvb_frontend *fe,
                                           const struct firmware **fw, char *name)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
@@ -317,7 +312,7 @@ static struct tda1004x_config philips_tu1216_60_config = {
        .xtal_freq     = TDA10046_XTAL_4M,
        .agc_config    = TDA10046_AGC_DEFAULT,
        .if_freq       = TDA10046_FREQ_3617,
-       .request_firmware = philips_tu1216_request_firmware,
+       .request_firmware = philips_tda1004x_request_firmware,
 };
 
 /* ------------------------------------------------------------------ */
@@ -340,12 +335,12 @@ static struct tda1004x_config philips_tu1216_61_config = {
        .xtal_freq     = TDA10046_XTAL_4M,
        .agc_config    = TDA10046_AGC_DEFAULT,
        .if_freq       = TDA10046_FREQ_3617,
-       .request_firmware = philips_tu1216_request_firmware,
+       .request_firmware = philips_tda1004x_request_firmware,
 };
 
 /* ------------------------------------------------------------------ */
 
-static int philips_europa_tuner_init(struct dvb_frontend *fe)
+static int philips_td1316_tuner_init(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
        static u8 msg[] = { 0x0b, 0xf5, 0x86, 0xab };
@@ -356,18 +351,8 @@ static int philips_europa_tuner_init(struct dvb_frontend *fe)
                fe->ops.i2c_gate_ctrl(fe, 1);
        if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
                return -EIO;
-       msleep(1);
-
-       /* switch the board to dvb mode */
-       init_msg.addr = 0x43;
-       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;
-
+               fe->ops.i2c_gate_ctrl(fe, 0);
        return 0;
 }
 
@@ -376,6 +361,22 @@ static int philips_td1316_tuner_set_params(struct dvb_frontend *fe, struct dvb_f
        return philips_tda6651_pll_set(0x61, fe, params);
 }
 
+static int philips_europa_tuner_init(struct dvb_frontend *fe)
+{
+       struct saa7134_dev *dev = fe->dvb->priv;
+       static u8 msg[] = { 0x00, 0x40};
+       struct i2c_msg init_msg = {.addr = 0x43,.flags = 0,.buf = msg,.len = sizeof(msg) };
+
+
+       if (philips_td1316_tuner_init(fe))
+               return -EIO;
+       msleep(1);
+       if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
+               return -EIO;
+
+       return 0;
+}
+
 static int philips_europa_tuner_sleep(struct dvb_frontend *fe)
 {
        struct saa7134_dev *dev = fe->dvb->priv;
@@ -680,7 +681,7 @@ static struct tda1004x_config tda827x_lifeview_config = {
        .invert        = 1,
        .invert_oclk   = 0,
        .xtal_freq     = TDA10046_XTAL_16M,
-       .agc_config    = TDA10046_AGC_TDA827X,
+       .agc_config    = TDA10046_AGC_TDA827X_GP11,
        .if_freq       = TDA10046_FREQ_045,
        .request_firmware = NULL,
 };
@@ -821,32 +822,40 @@ static int philips_tda827xa_tuner_sleep(u8 addr, struct dvb_frontend *fe)
        if (fe->ops.i2c_gate_ctrl)
                fe->ops.i2c_gate_ctrl(fe, 1);
        i2c_transfer(&dev->i2c_adap, &tuner_msg, 1);
+       if (fe->ops.i2c_gate_ctrl)
+               fe->ops.i2c_gate_ctrl(fe, 0);
        return 0;
 }
 
 /* ------------------------------------------------------------------ */
 
-static int philips_tiger_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+static int tda8290_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
 {
-       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);
-       if (ret != 1)
+       if (enable) {
+               tda8290_msg.buf = tda8290_close;
+       } else {
+               tda8290_msg.buf = tda8290_open;
+       }
+       if (i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1) != 1)
                return -EIO;
        msleep(20);
+       return 0;
+}
+
+/* ------------------------------------------------------------------ */
+
+static int philips_tiger_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+{
+       int ret;
+
        ret = philips_tda827xa_pll_set(0x61, fe, params);
        if (ret != 0)
                return ret;
-       /* open tda8290 i2c bridge */
-       tda8290_msg.buf = tda8290_open;
-       i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1);
-       return ret;
+       return 0;
 }
 
 static int philips_tiger_tuner_init(struct dvb_frontend *fe)
@@ -876,13 +885,108 @@ static struct tda1004x_config philips_tiger_config = {
        .invert        = 1,
        .invert_oclk   = 0,
        .xtal_freq     = TDA10046_XTAL_16M,
-       .agc_config    = TDA10046_AGC_TDA827X,
+       .agc_config    = TDA10046_AGC_TDA827X_GP11,
+       .if_freq       = TDA10046_FREQ_045,
+       .request_firmware = NULL,
+};
+/* ------------------------------------------------------------------ */
+
+static int cinergy_ht_tuner_init(struct dvb_frontend *fe)
+{
+       struct saa7134_dev *dev = fe->dvb->priv;
+       static u8 data[] = { 0x3c, 0x33, 0x62};
+       struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
+
+       if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1)
+               return -EIO;
+       return 0;
+}
+
+static int cinergy_ht_tuner_sleep(struct dvb_frontend *fe)
+{
+       struct saa7134_dev *dev = fe->dvb->priv;
+       static u8 data[] = { 0x3c, 0x33, 0x60};
+       struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
+
+       i2c_transfer(&dev->i2c_adap, &msg, 1);
+       philips_tda827xa_tuner_sleep( 0x61, fe);
+       return 0;
+}
+
+static struct tda1004x_config cinergy_ht_config = {
+       .demod_address = 0x08,
+       .invert        = 1,
+       .invert_oclk   = 0,
+       .xtal_freq     = TDA10046_XTAL_16M,
+       .agc_config    = TDA10046_AGC_TDA827X_GP01,
        .if_freq       = TDA10046_FREQ_045,
        .request_firmware = NULL,
 };
 
 /* ------------------------------------------------------------------ */
 
+static struct tda1004x_config pinnacle_pctv_310i_config = {
+       .demod_address = 0x08,
+       .invert        = 1,
+       .invert_oclk   = 0,
+       .xtal_freq     = TDA10046_XTAL_16M,
+       .agc_config    = TDA10046_AGC_TDA827X_GP11,
+       .if_freq       = TDA10046_FREQ_045,
+       .request_firmware = philips_tda1004x_request_firmware,
+};
+
+/* ------------------------------------------------------------------ */
+
+static struct tda1004x_config hauppauge_hvr_1110_config = {
+       .demod_address = 0x08,
+       .invert        = 1,
+       .invert_oclk   = 0,
+       .xtal_freq     = TDA10046_XTAL_16M,
+       .agc_config    = TDA10046_AGC_TDA827X_GP11,
+       .if_freq       = TDA10046_FREQ_045,
+       .request_firmware = philips_tda1004x_request_firmware,
+};
+
+/* ------------------------------------------------------------------ */
+
+static struct tda1004x_config asus_p7131_dual_config = {
+       .demod_address = 0x08,
+       .invert        = 1,
+       .invert_oclk   = 0,
+       .xtal_freq     = TDA10046_XTAL_16M,
+       .agc_config    = TDA10046_AGC_TDA827X_GP11,
+       .if_freq       = TDA10046_FREQ_045,
+       .request_firmware = philips_tda1004x_request_firmware,
+};
+
+static int asus_p7131_dual_tuner_init(struct dvb_frontend *fe)
+{
+       struct saa7134_dev *dev = fe->dvb->priv;
+       static u8 data[] = { 0x3c, 0x33, 0x6a};
+       struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
+
+       if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1)
+               return -EIO;
+       /* make sure the DVB-T antenna input is set */
+       saa_setl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0200000);
+       return 0;
+}
+
+static int asus_p7131_dual_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_tuner_sleep( 0x61, fe);
+       /* reset antenna inputs for analog usage */
+       saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0200000);
+       return 0;
+}
+
+/* ------------------------------------------------------------------ */
+
 static int lifeview_trio_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
 {
        int ret;
@@ -902,7 +1006,7 @@ static struct tda1004x_config lifeview_trio_config = {
        .invert        = 1,
        .invert_oclk   = 0,
        .xtal_freq     = TDA10046_XTAL_16M,
-       .agc_config    = TDA10046_AGC_TDA827X_GPL,
+       .agc_config    = TDA10046_AGC_TDA827X_GP00,
        .if_freq       = TDA10046_FREQ_045,
        .request_firmware = NULL,
 };
@@ -939,7 +1043,7 @@ static struct tda1004x_config ads_tech_duo_config = {
        .invert        = 1,
        .invert_oclk   = 0,
        .xtal_freq     = TDA10046_XTAL_16M,
-       .agc_config    = TDA10046_AGC_TDA827X_GPL,
+       .agc_config    = TDA10046_AGC_TDA827X_GP00,
        .if_freq       = TDA10046_FREQ_045,
        .request_firmware = NULL,
 };
@@ -964,16 +1068,63 @@ static struct tda1004x_config tevion_dvbt220rf_config = {
        .invert        = 1,
        .invert_oclk   = 0,
        .xtal_freq     = TDA10046_XTAL_16M,
-       .agc_config    = TDA10046_AGC_TDA827X,
+       .agc_config    = TDA10046_AGC_TDA827X_GP11,
+       .if_freq       = TDA10046_FREQ_045,
+       .request_firmware = NULL,
+};
+
+/* ------------------------------------------------------------------ */
+
+static int md8800_dvbt_analog_mode(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_tuner_sleep( 0x61, fe);
+       return 0;
+}
+
+static int md8800_dvbt_pll_set(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);
+       if (ret != 1)
+               return -EIO;
+       msleep(20);
+       ret = philips_tda827xa_pll_set(0x60, fe, params);
+       if (ret != 0)
+               return ret;
+       /* open tda8290 i2c bridge */
+       tda8290_msg.buf = tda8290_open;
+       i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1);
+       return ret;
+}
+
+static struct tda1004x_config md8800_dvbt_config = {
+       .demod_address = 0x08,
+       .invert        = 1,
+       .invert_oclk   = 0,
+       .xtal_freq     = TDA10046_XTAL_16M,
+       .agc_config    = TDA10046_AGC_TDA827X_GP11,
        .if_freq       = TDA10046_FREQ_045,
        .request_firmware = NULL,
 };
 
-#endif
+static struct tda10086_config flydvbs = {
+       .demod_address = 0x0e,
+       .invert = 0,
+};
 
 /* ------------------------------------------------------------------ */
 
-#ifdef HAVE_NXT200X
 static struct nxt200x_config avertvhda180 = {
        .demod_address    = 0x0a,
 };
@@ -991,7 +1142,6 @@ static struct nxt200x_config kworldatsc110 = {
        .demod_address    = 0x0a,
        .set_pll_input    = nxt200x_set_pll_input,
 };
-#endif
 
 /* ------------------------------------------------------------------ */
 
@@ -1009,29 +1159,27 @@ static int dvb_init(struct saa7134_dev *dev)
                            dev);
 
        switch (dev->board) {
-#ifdef HAVE_MT352
        case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
                printk("%s: pinnacle 300i dvb setup\n",dev->name);
-               dev->dvb.frontend = mt352_attach(&pinnacle_300i,
-                                                &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(mt352_attach, &pinnacle_300i,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        dev->dvb.frontend->ops.tuner_ops.set_params = mt352_pinnacle_tuner_set_params;
                }
                break;
-
        case SAA7134_BOARD_AVERMEDIA_777:
+       case SAA7134_BOARD_AVERMEDIA_A16AR:
                printk("%s: avertv 777 dvb setup\n",dev->name);
-               dev->dvb.frontend = mt352_attach(&avermedia_777,
-                                                &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        dev->dvb.frontend->ops.tuner_ops.calc_regs = mt352_aver777_tuner_calc_regs;
                }
                break;
-#endif
-#ifdef HAVE_TDA1004X
        case SAA7134_BOARD_MD7134:
-               dev->dvb.frontend = tda10046_attach(&medion_cardbus,
-                                                   &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &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;
@@ -1039,16 +1187,18 @@ static int dvb_init(struct saa7134_dev *dev)
                }
                break;
        case SAA7134_BOARD_PHILIPS_TOUGH:
-               dev->dvb.frontend = tda10046_attach(&philips_tu1216_60_config,
-                                                   &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &philips_tu1216_60_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        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 = dvb_attach(tda10046_attach,
+                                              &tda827x_lifeview_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        dev->dvb.frontend->ops.tuner_ops.init = philips_tda827x_tuner_init;
                        dev->dvb.frontend->ops.tuner_ops.sleep = philips_tda827x_tuner_sleep;
@@ -1056,8 +1206,9 @@ static int dvb_init(struct saa7134_dev *dev)
                }
                break;
        case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS:
-               dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config,
-                                                   &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &tda827x_lifeview_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        dev->dvb.frontend->ops.tuner_ops.init = philips_tda827x_tuner_init;
                        dev->dvb.frontend->ops.tuner_ops.sleep = philips_tda827x_tuner_sleep;
@@ -1065,8 +1216,9 @@ static int dvb_init(struct saa7134_dev *dev)
                }
                break;
        case SAA7134_BOARD_PHILIPS_EUROPA:
-               dev->dvb.frontend = tda10046_attach(&philips_europa_config,
-                                                   &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &philips_europa_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        dev->original_demod_sleep = dev->dvb.frontend->ops.sleep;
                        dev->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
@@ -1076,43 +1228,74 @@ static int dvb_init(struct saa7134_dev *dev)
                }
                break;
        case SAA7134_BOARD_VIDEOMATE_DVBT_300:
-               dev->dvb.frontend = tda10046_attach(&philips_europa_config,
-                                                   &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &philips_europa_config,
+                                              &dev->i2c_adap);
                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_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 = dvb_attach(tda10046_attach,
+                                              &philips_tu1216_61_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        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 = dvb_attach(tda10046_attach,
+                                              &philips_tiger_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
+                       dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
                        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);
+       case SAA7134_BOARD_PINNACLE_PCTV_310i:
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &pinnacle_pctv_310i_config,
+                                              &dev->i2c_adap);
+               if (dev->dvb.frontend) {
+                       dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
+                       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_HAUPPAUGE_HVR1110:
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &hauppauge_hvr_1110_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
+                       dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
                        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 = dvb_attach(tda10046_attach,
+                                              &asus_p7131_dual_config,
+                                              &dev->i2c_adap);
+               if (dev->dvb.frontend) {
+                       dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
+                       dev->dvb.frontend->ops.tuner_ops.init = asus_p7131_dual_tuner_init;
+                       dev->dvb.frontend->ops.tuner_ops.sleep = asus_p7131_dual_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 = dvb_attach(tda10046_attach,
+                                              &tda827x_lifeview_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        dev->dvb.frontend->ops.tuner_ops.init = philips_tda827x_tuner_init;
                        dev->dvb.frontend->ops.tuner_ops.sleep = philips_tda827x_tuner_sleep;
@@ -1120,16 +1303,33 @@ static int dvb_init(struct saa7134_dev *dev)
                }
                break;
        case SAA7134_BOARD_FLYDVB_TRIO:
-               dev->dvb.frontend = tda10046_attach(&lifeview_trio_config,
-                                                   &dev->i2c_adap);
-               if (dev->dvb.frontend) {
-                       dev->dvb.frontend->ops.tuner_ops.sleep = lifeview_trio_tuner_sleep;
-                       dev->dvb.frontend->ops.tuner_ops.set_params = lifeview_trio_tuner_set_params;
+               if(! use_frontend) {    //terrestrial
+                       dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                                      &lifeview_trio_config,
+                                                      &dev->i2c_adap);
+                       if (dev->dvb.frontend) {
+                               dev->dvb.frontend->ops.tuner_ops.sleep = lifeview_trio_tuner_sleep;
+                               dev->dvb.frontend->ops.tuner_ops.set_params =
+                                                               lifeview_trio_tuner_set_params;
+                       }
+               } else {              //satellite
+                       dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap);
+                       if (dev->dvb.frontend) {
+                               if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x63,
+                                                                       &dev->i2c_adap, 0) == NULL) {
+                                       printk("%s: Lifeview Trio, No tda826x found!\n", __FUNCTION__);
+                               }
+                               if (dvb_attach(isl6421_attach, dev->dvb.frontend, &dev->i2c_adap,
+                                                                               0x08, 0, 0) == NULL) {
+                                       printk("%s: Lifeview Trio, No ISL6421 found!\n", __FUNCTION__);
+                               }
+                       }
                }
                break;
        case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
-               dev->dvb.frontend = tda10046_attach(&ads_tech_duo_config,
-                                                   &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &ads_tech_duo_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        dev->dvb.frontend->ops.tuner_ops.init = ads_duo_tuner_init;
                        dev->dvb.frontend->ops.tuner_ops.sleep = ads_duo_tuner_sleep;
@@ -1137,37 +1337,95 @@ static int dvb_init(struct saa7134_dev *dev)
                }
                break;
        case SAA7134_BOARD_TEVION_DVBT_220RF:
-               dev->dvb.frontend = tda10046_attach(&tevion_dvbt220rf_config,
-                                                   &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &tevion_dvbt220rf_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        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 = dvb_attach(tda10046_attach,
+                                              &ads_tech_duo_config,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        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_MEDION_MD8800_QUADRO:
+               dev->dvb.frontend = tda10046_attach(&md8800_dvbt_config,
+                                                   &dev->i2c_adap);
+               if (dev->dvb.frontend) {
+                       dev->dvb.frontend->ops.tuner_ops.init = philips_tiger_tuner_init;
+                       dev->dvb.frontend->ops.tuner_ops.sleep = md8800_dvbt_analog_mode;
+                       dev->dvb.frontend->ops.tuner_ops.set_params = md8800_dvbt_pll_set;
+               }
+               break;
        case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
-               dev->dvb.frontend = nxt200x_attach(&avertvhda180, &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180,
+                                              &dev->i2c_adap);
                if (dev->dvb.frontend) {
-                       dvb_pll_attach(dev->dvb.frontend, 0x61, NULL, &dvb_pll_tdhu2);
+                       dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61,
+                                  NULL, &dvb_pll_tdhu2);
                }
                break;
        case SAA7134_BOARD_KWORLD_ATSC110:
-               dev->dvb.frontend = nxt200x_attach(&kworldatsc110, &dev->i2c_adap);
+               dev->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110,
+                                              &dev->i2c_adap);
+               if (dev->dvb.frontend) {
+                       dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61,
+                                  NULL, &dvb_pll_tuv1236d);
+               }
+               break;
+       case SAA7134_BOARD_FLYDVBS_LR300:
+               dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
+                                              &dev->i2c_adap);
+               if (dev->dvb.frontend) {
+                       if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60,
+                                      &dev->i2c_adap, 0) == NULL) {
+                               printk("%s: No tda826x found!\n", __FUNCTION__);
+                       }
+                       if (dvb_attach(isl6421_attach, dev->dvb.frontend,
+                                      &dev->i2c_adap, 0x08, 0, 0) == NULL) {
+                               printk("%s: No ISL6421 found!\n", __FUNCTION__);
+                       }
+               }
+               break;
+       case SAA7134_BOARD_ASUS_EUROPA2_HYBRID:
+               dev->dvb.frontend = tda10046_attach(&medion_cardbus,
+                                                   &dev->i2c_adap);
                if (dev->dvb.frontend) {
-                       dvb_pll_attach(dev->dvb.frontend, 0x61, NULL, &dvb_pll_tuv1236d);
+                       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;
+               }
+               break;
+       case SAA7134_BOARD_VIDEOMATE_DVBT_200A:
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                               &philips_europa_config,
+                               &dev->i2c_adap);
+               if (dev->dvb.frontend) {
+                       dev->dvb.frontend->ops.tuner_ops.init = philips_td1316_tuner_init;
+                       dev->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
+               }
+               break;
+       case SAA7134_BOARD_CINERGY_HT_PCMCIA:
+               dev->dvb.frontend = dvb_attach(tda10046_attach,
+                                              &cinergy_ht_config,
+                                              &dev->i2c_adap);
+               if (dev->dvb.frontend) {
+                       dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
+                       dev->dvb.frontend->ops.tuner_ops.init = cinergy_ht_tuner_init;
+                       dev->dvb.frontend->ops.tuner_ops.sleep = cinergy_ht_tuner_sleep;
+                       dev->dvb.frontend->ops.tuner_ops.set_params = philips_tiger_tuner_set_params;
+
                }
                break;
-#endif
        default:
                printk("%s: Huh? unknown DVB card?\n",dev->name);
                break;