Change adapter FE pointer as array of FE pointers.
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
                        debug_dump(buf, 8, printk);
                }
        }
-       adap->fe = af9005_fe_attach(adap->dev);
+       adap->fe[0] = af9005_fe_attach(adap->dev);
        return 0;
 }
 
 
        }
 
        /* attach demodulator */
-       adap->fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
+       adap->fe[0] = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
                &adap->dev->i2c_adap);
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static struct mt2060_config af9015_mt2060_config = {
        switch (af9015_af9013_config[adap->id].tuner) {
        case AF9013_TUNER_MT2060:
        case AF9013_TUNER_MT2060_2:
-               ret = dvb_attach(mt2060_attach, adap->fe, &adap->dev->i2c_adap,
+               ret = dvb_attach(mt2060_attach, adap->fe[0], &adap->dev->i2c_adap,
                        &af9015_mt2060_config,
                        af9015_config.mt2060_if1[adap->id])
                        == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_QT1010:
        case AF9013_TUNER_QT1010A:
-               ret = dvb_attach(qt1010_attach, adap->fe, &adap->dev->i2c_adap,
+               ret = dvb_attach(qt1010_attach, adap->fe[0], &adap->dev->i2c_adap,
                        &af9015_qt1010_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_TDA18271:
-               ret = dvb_attach(tda18271_attach, adap->fe, 0xc0,
+               ret = dvb_attach(tda18271_attach, adap->fe[0], 0xc0,
                        &adap->dev->i2c_adap,
                        &af9015_tda18271_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_TDA18218:
-               ret = dvb_attach(tda18218_attach, adap->fe,
+               ret = dvb_attach(tda18218_attach, adap->fe[0],
                        &adap->dev->i2c_adap,
                        &af9015_tda18218_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_MXL5003D:
-               ret = dvb_attach(mxl5005s_attach, adap->fe,
+               ret = dvb_attach(mxl5005s_attach, adap->fe[0],
                        &adap->dev->i2c_adap,
                        &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_MXL5005D:
        case AF9013_TUNER_MXL5005R:
-               ret = dvb_attach(mxl5005s_attach, adap->fe,
+               ret = dvb_attach(mxl5005s_attach, adap->fe[0],
                        &adap->dev->i2c_adap,
                        &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_ENV77H11D5:
-               ret = dvb_attach(dvb_pll_attach, adap->fe, 0xc0,
+               ret = dvb_attach(dvb_pll_attach, adap->fe[0], 0xc0,
                        &adap->dev->i2c_adap,
                        DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_MC44S803:
-               ret = dvb_attach(mc44s803_attach, adap->fe,
+               ret = dvb_attach(mc44s803_attach, adap->fe[0],
                        &adap->dev->i2c_adap,
                        &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_MXL5007T:
-               ret = dvb_attach(mxl5007t_attach, adap->fe,
+               ret = dvb_attach(mxl5007t_attach, adap->fe[0],
                        &adap->dev->i2c_adap,
                        0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
                break;
 
                /* E30 */
 
                /* attach demod */
-               adap->fe = dvb_attach(mt352_attach, &anysee_mt352_config,
+               adap->fe[0] = dvb_attach(mt352_attach, &anysee_mt352_config,
                        &adap->dev->i2c_adap);
-               if (adap->fe)
+               if (adap->fe[0])
                        break;
 
                /* attach demod */
-               adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
+               adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
                        &adap->dev->i2c_adap);
 
                break;
                        goto error;
 
                /* attach demod */
-               adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
+               adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
                        &adap->dev->i2c_adap);
 
                break;
                        goto error;
 
                /* attach demod */
-               adap->fe = dvb_attach(tda10023_attach, &anysee_tda10023_config,
+               adap->fe[0] = dvb_attach(tda10023_attach, &anysee_tda10023_config,
                        &adap->dev->i2c_adap, 0x48);
 
                break;
                        goto error;
 
                /* attach demod */
-               adap->fe = dvb_attach(cx24116_attach, &anysee_cx24116_config,
+               adap->fe[0] = dvb_attach(cx24116_attach, &anysee_cx24116_config,
                        &adap->dev->i2c_adap);
 
                break;
                        /* attach demod */
                        if (tmp == 0xc7) {
                                /* TDA18212 config */
-                               adap->fe = dvb_attach(zl10353_attach,
+                               adap->fe[0] = dvb_attach(zl10353_attach,
                                        &anysee_zl10353_tda18212_config2,
                                        &adap->dev->i2c_adap);
                        } else {
                                /* PLL config */
-                               adap->fe = dvb_attach(zl10353_attach,
+                               adap->fe[0] = dvb_attach(zl10353_attach,
                                        &anysee_zl10353_config,
                                        &adap->dev->i2c_adap);
                        }
                        /* attach demod */
                        if (tmp == 0xc7) {
                                /* TDA18212 config */
-                               adap->fe = dvb_attach(tda10023_attach,
+                               adap->fe[0] = dvb_attach(tda10023_attach,
                                        &anysee_tda10023_tda18212_config,
                                        &adap->dev->i2c_adap, 0x48);
                        } else {
                                /* PLL config */
-                               adap->fe = dvb_attach(tda10023_attach,
+                               adap->fe[0] = dvb_attach(tda10023_attach,
                                        &anysee_tda10023_config,
                                        &adap->dev->i2c_adap, 0x48);
                        }
                                goto error;
 
                        /* attach demod */
-                       adap->fe = dvb_attach(zl10353_attach,
+                       adap->fe[0] = dvb_attach(zl10353_attach,
                                &anysee_zl10353_tda18212_config,
                                &adap->dev->i2c_adap);
                } else {
                                goto error;
 
                        /* attach demod */
-                       adap->fe = dvb_attach(tda10023_attach,
+                       adap->fe[0] = dvb_attach(tda10023_attach,
                                &anysee_tda10023_tda18212_config,
                                &adap->dev->i2c_adap, 0x48);
                }
                        goto error;
 
                /* attach demod */
-               adap->fe = dvb_attach(stv0900_attach, &anysee_stv0900_config,
+               adap->fe[0] = dvb_attach(stv0900_attach, &anysee_stv0900_config,
                        &adap->dev->i2c_adap, 0);
 
                break;
        }
 
-       if (!adap->fe) {
+       if (!adap->fe[0]) {
                /* we have no frontend :-( */
                ret = -ENODEV;
                err("Unsupported Anysee version. " \
                /* E30 */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
+               fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
                        NULL, DVB_PLL_THOMSON_DTT7579);
 
                break;
                /* E30 Plus */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
+               fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
                        &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
 
                break;
                /* E30 C Plus */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
+               fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
                        &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
 
                break;
                /* E30 S2 Plus */
 
                /* attach LNB controller */
-               fe = dvb_attach(isl6423_attach, adap->fe, &adap->dev->i2c_adap,
+               fe = dvb_attach(isl6423_attach, adap->fe[0], &adap->dev->i2c_adap,
                        &anysee_isl6423_config);
 
                break;
                        goto error;
 
                /* attach tuner */
-               fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
+               fe = dvb_attach(tda18212_attach, adap->fe[0], &adap->dev->i2c_adap,
                        &anysee_tda18212_config);
                if (fe)
                        break;
                        goto error;
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
+               fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
                        &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
 
                break;
                        goto error;
 
                /* attach tuner */
-               fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
+               fe = dvb_attach(tda18212_attach, adap->fe[0], &adap->dev->i2c_adap,
                        &anysee_tda18212_config);
 
                break;
                /* E7 PS2 */
 
                /* attach tuner */
-               fe = dvb_attach(stv6110_attach, adap->fe,
+               fe = dvb_attach(stv6110_attach, adap->fe[0],
                        &anysee_stv6110_config, &adap->dev->i2c_adap);
 
                if (fe) {
                        /* attach LNB controller */
-                       fe = dvb_attach(isl6423_attach, adap->fe,
+                       fe = dvb_attach(isl6423_attach, adap->fe[0],
                                &adap->dev->i2c_adap, &anysee_isl6423_config);
                }
 
 
 
 static int au6610_zl10353_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe = dvb_attach(zl10353_attach, &au6610_zl10353_config,
+       adap->fe[0] = dvb_attach(zl10353_attach, &au6610_zl10353_config,
                &adap->dev->i2c_adap);
-       if (adap->fe == NULL)
+       if (adap->fe[0] == NULL)
                return -ENODEV;
 
        return 0;
 static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
 {
        return dvb_attach(qt1010_attach,
-                         adap->fe, &adap->dev->i2c_adap,
+                         adap->fe[0], &adap->dev->i2c_adap,
                          &au6610_qt1010_config) == NULL ? -ENODEV : 0;
 }
 
 
        az6027_frontend_reset(adap);
 
        deb_info("adap = %p, dev = %p\n", adap, adap->dev);
-       adap->fe = stb0899_attach(&az6027_stb0899_config, &adap->dev->i2c_adap);
+       adap->fe[0] = stb0899_attach(&az6027_stb0899_config, &adap->dev->i2c_adap);
 
-       if (adap->fe) {
+       if (adap->fe[0]) {
                deb_info("found STB0899 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb0899_config.demod_address);
-               if (stb6100_attach(adap->fe, &az6027_stb6100_config, &adap->dev->i2c_adap)) {
+               if (stb6100_attach(adap->fe[0], &az6027_stb6100_config, &adap->dev->i2c_adap)) {
                        deb_info("found STB6100 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb6100_config.tuner_address);
-                       adap->fe->ops.set_voltage = az6027_set_voltage;
+                       adap->fe[0]->ops.set_voltage = az6027_set_voltage;
                        az6027_ci_init(adap);
                } else {
-                       adap->fe = NULL;
+                       adap->fe[0] = NULL;
                }
        } else
                warn("no front-end attached\n");
 
 static int ce6230_zl10353_frontend_attach(struct dvb_usb_adapter *adap)
 {
        deb_info("%s:\n", __func__);
-       adap->fe = dvb_attach(zl10353_attach, &ce6230_zl10353_config,
+       adap->fe[0] = dvb_attach(zl10353_attach, &ce6230_zl10353_config,
                &adap->dev->i2c_adap);
-       if (adap->fe == NULL)
+       if (adap->fe[0] == NULL)
                return -ENODEV;
        return 0;
 }
 {
        int ret;
        deb_info("%s:\n", __func__);
-       ret = dvb_attach(mxl5005s_attach, adap->fe, &adap->dev->i2c_adap,
+       ret = dvb_attach(mxl5005s_attach, adap->fe[0], &adap->dev->i2c_adap,
                        &ce6230_mxl5003s_config) == NULL ? -ENODEV : 0;
        return ret;
 }
 
        char state[3];
        int ret;
 
-       adap->fe = cinergyt2_fe_attach(adap->dev);
+       adap->fe[0] = cinergyt2_fe_attach(adap->dev);
 
        ret = dvb_usb_generic_rw(adap->dev, query, sizeof(query), state,
                                sizeof(state), 0);
 
 /* Callbacks for DVB USB */
 static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(simple_tuner_attach, adap->fe,
+       dvb_attach(simple_tuner_attach, adap->fe[0],
                   &adap->dev->i2c_adap, 0x61,
                   TUNER_PHILIPS_FMD1216ME_MK3);
        return 0;
 
 static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe, 0x61,
+       dvb_attach(dvb_pll_attach, adap->fe[0], 0x61,
                   NULL, DVB_PLL_THOMSON_DTT7579);
        return 0;
 }
 
 static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe, 0x61, NULL, DVB_PLL_LG_Z201);
+       dvb_attach(dvb_pll_attach, adap->fe[0], 0x61, NULL, DVB_PLL_LG_Z201);
        return 0;
 }
 
 static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe, 0x60,
+       dvb_attach(dvb_pll_attach, adap->fe[0], 0x60,
                   NULL, DVB_PLL_THOMSON_DTT7579);
        return 0;
 }
 
 static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(simple_tuner_attach, adap->fe,
+       dvb_attach(simple_tuner_attach, adap->fe[0],
                   &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
        return 0;
 }
        };
 
        /* FIXME: generalize & move to common area */
-       adap->fe->callback = dvico_bluebird_xc2028_callback;
+       adap->fe[0]->callback = dvico_bluebird_xc2028_callback;
 
-       fe = dvb_attach(xc2028_attach, adap->fe, &cfg);
+       fe = dvb_attach(xc2028_attach, adap->fe[0], &cfg);
        if (fe == NULL || fe->ops.tuner_ops.set_config == NULL)
                return -EIO;
 
 
 static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(mxl5005s_attach, adap->fe,
+       dvb_attach(mxl5005s_attach, adap->fe[0],
                   &adap->dev->i2c_adap, &aver_a868r_tuner);
        return 0;
 }
 static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dvb_frontend *fe;
-       fe = dvb_attach(mxl5005s_attach, adap->fe,
+       fe = dvb_attach(mxl5005s_attach, adap->fe[0],
                        &adap->dev->i2c_adap, &d680_dmb_tuner);
        return (fe == NULL) ? -EIO : 0;
 }
 static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dvb_frontend *fe;
-       fe = dvb_attach(max2165_attach, adap->fe,
+       fe = dvb_attach(max2165_attach, adap->fe[0],
                        &adap->dev->i2c_adap, &mygica_d689_max2165_cfg);
        return (fe == NULL) ? -EIO : 0;
 }
 
        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1);
 
-       if ((adap->fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
+       if ((adap->fe[0] = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
 
 
        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 
-       if ((adap->fe = dvb_attach(lgdt330x_attach, &cxusb_lgdt3303_config,
+       if ((adap->fe[0] = dvb_attach(lgdt330x_attach, &cxusb_lgdt3303_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
 
 
 static int cxusb_aver_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config,
+       adap->fe[0] = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config,
                              &adap->dev->i2c_adap);
-       if (adap->fe != NULL)
+       if (adap->fe[0] != NULL)
                return 0;
 
        return -EIO;
 
        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 
-       if ((adap->fe = dvb_attach(mt352_attach, &cxusb_mt352_config,
+       if ((adap->fe[0] = dvb_attach(mt352_attach, &cxusb_mt352_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
 
 
        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 
-       if (((adap->fe = dvb_attach(mt352_attach, &cxusb_dee1601_config,
+       if (((adap->fe[0] = dvb_attach(mt352_attach, &cxusb_dee1601_config,
                                    &adap->dev->i2c_adap)) != NULL) ||
-               ((adap->fe = dvb_attach(zl10353_attach,
+               ((adap->fe[0] = dvb_attach(zl10353_attach,
                                        &cxusb_zl10353_dee1601_config,
                                        &adap->dev->i2c_adap)) != NULL))
                return 0;
        cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
        cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
 
-       if ((adap->fe = dvb_attach(zl10353_attach,
+       if ((adap->fe[0] = dvb_attach(zl10353_attach,
                                   &cxusb_zl10353_xc3028_config_no_i2c_gate,
                                   &adap->dev->i2c_adap)) == NULL)
                return -EIO;
                return -ENODEV;
        }
 
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
                              &cxusb_dualdig4_rev2_config);
-       if (adap->fe == NULL)
+       if (adap->fe[0] == NULL)
                return -EIO;
 
        return 0;
 {
        struct dib0700_adapter_state *st = adap->priv;
        struct i2c_adapter *tun_i2c =
-               dib7000p_get_i2c_master(adap->fe,
+               dib7000p_get_i2c_master(adap->fe[0],
                                        DIBX000_I2C_INTERFACE_TUNER, 1);
 
-       if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
+       if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c,
            &dib7070p_dib0070_config) == NULL)
                return -ENODEV;
 
-       st->set_param_save = adap->fe->ops.tuner_ops.set_params;
-       adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
+       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
+       adap->fe[0]->ops.tuner_ops.set_params = dib7070_set_param_override;
        return 0;
 }
 
        cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
        cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
 
-       if ((adap->fe = dvb_attach(zl10353_attach,
+       if ((adap->fe[0] = dvb_attach(zl10353_attach,
                                   &cxusb_zl10353_xc3028_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
 
-       if ((adap->fe = dvb_attach(mt352_attach,
+       if ((adap->fe[0] = dvb_attach(mt352_attach,
                                   &cxusb_mt352_xc3028_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
        msleep(100);
 
        /* Attach frontend */
-       adap->fe = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap);
-       if (adap->fe == NULL)
+       adap->fe[0] = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap);
+       if (adap->fe[0] == NULL)
                return -EIO;
 
        return 0;
        msleep(100);
 
        /* Attach frontend */
-       adap->fe = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
+       adap->fe[0] = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
                &d->i2c_adap);
-       if (adap->fe == NULL)
+       if (adap->fe[0] == NULL)
                return -EIO;
 
        return 0;
 
                }
        }
        st->mt2060_if1[adap->id] = 1220;
-       return (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
+       return (adap->fe[0] = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
                (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
 }
 
 static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
-       struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
+       struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe[0], 1);
        s8 a;
        int if1=1220;
        if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&
                adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
                if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
        }
-       return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id],
+       return dvb_attach(mt2060_attach,adap->fe[0], tun_i2c,&bristol_mt2060_config[adap->id],
                if1) == NULL ? -ENODEV : 0;
 }
 
                }
        }
 
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
                                &stk7700d_dib7000p_mt2266_config[adap->id]);
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
                }
        }
 
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
                                &stk7700d_dib7000p_mt2266_config[adap->id]);
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct i2c_adapter *tun_i2c;
-       tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
-       return dvb_attach(mt2266_attach, adap->fe, tun_i2c,
+       tun_i2c = dib7000p_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1);
+       return dvb_attach(mt2266_attach, adap->fe[0], tun_i2c,
                &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
 }
 
        switch (command) {
        case XC2028_TUNER_RESET:
                /* Send the tuner in then out of reset */
-               dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10);
-               dib7000p_set_gpio(adap->fe, 8, 0, 1);
+               dib7000p_set_gpio(adap->fe[0], 8, 0, 0); msleep(10);
+               dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
                break;
        case XC2028_RESET_CLK:
                break;
                return -ENODEV;
        }
 
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
                &stk7700ph_dib7700_xc3028_config);
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct i2c_adapter *tun_i2c;
 
-       tun_i2c = dib7000p_get_i2c_master(adap->fe,
+       tun_i2c = dib7000p_get_i2c_master(adap->fe[0],
                DIBX000_I2C_INTERFACE_TUNER, 1);
 
        stk7700ph_xc3028_config.i2c_adap = tun_i2c;
 
        /* FIXME: generalize & move to common area */
-       adap->fe->callback = stk7700ph_xc3028_callback;
+       adap->fe[0]->callback = stk7700ph_xc3028_callback;
 
-       return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config)
+       return dvb_attach(xc2028_attach, adap->fe[0], &stk7700ph_xc3028_config)
                == NULL ? -ENODEV : 0;
 }
 
        st->mt2060_if1[0] = 1220;
 
        if (dib7000pc_detection(&adap->dev->i2c_adap)) {
-               adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
+               adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
                st->is_dib7000pc = 1;
        } else
-               adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
+               adap->fe[0] = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static struct mt2060_config stk7700p_mt2060_config = {
                if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
        }
        if (st->is_dib7000pc)
-               tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
+               tun_i2c = dib7000p_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1);
        else
-               tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
+               tun_i2c = dib7000m_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1);
 
-       return dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk7700p_mt2060_config,
+       return dvb_attach(mt2060_attach, adap->fe[0], tun_i2c, &stk7700p_mt2060_config,
                if1) == NULL ? -ENODEV : 0;
 }
 
 static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
 {
         struct dib0700_adapter_state *st = adap->priv;
-        struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe,
+        struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe[0],
                         DIBX000_I2C_INTERFACE_TUNER, 1);
 
-        if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
+        if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c,
                                 &dib7770p_dib0070_config) == NULL)
                 return -ENODEV;
 
-        st->set_param_save = adap->fe->ops.tuner_ops.set_params;
-        adap->fe->ops.tuner_ops.set_params = dib7770_set_param_override;
+        st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
+        adap->fe[0]->ops.tuner_ops.set_params = dib7770_set_param_override;
         return 0;
 }
 
 static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dib0700_adapter_state *st = adap->priv;
-       struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
+       struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1);
 
        if (adap->id == 0) {
-               if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
+               if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
                        return -ENODEV;
        } else {
-               if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
+               if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
                        return -ENODEV;
        }
 
-       st->set_param_save = adap->fe->ops.tuner_ops.set_params;
-       adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
+       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
+       adap->fe[0]->ops.tuner_ops.set_params = dib7070_set_param_override;
        return 0;
 }
 
 {
        struct dib0700_state *st = adapter->dev->priv;
        if (st->is_dib7000pc)
-               return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
-       return dib7000m_pid_filter(adapter->fe, index, pid, onoff);
+               return dib7000p_pid_filter(adapter->fe[0], index, pid, onoff);
+       return dib7000m_pid_filter(adapter->fe[0], index, pid, onoff);
 }
 
 static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
 {
        struct dib0700_state *st = adapter->dev->priv;
        if (st->is_dib7000pc)
-               return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
-       return dib7000m_pid_filter_ctrl(adapter->fe, onoff);
+               return dib7000p_pid_filter_ctrl(adapter->fe[0], onoff);
+       return dib7000m_pid_filter_ctrl(adapter->fe[0], onoff);
 }
 
 static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
 {
-    return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
+    return dib7000p_pid_filter(adapter->fe[0], index, pid, onoff);
 }
 
 static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
 {
-    return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
+    return dib7000p_pid_filter_ctrl(adapter->fe[0], onoff);
 }
 
 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
                return -ENODEV;
        }
 
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
                &dib7070p_dib7000p_config);
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 /* STK7770P */
                return -ENODEV;
        }
 
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
                &dib7770p_dib7000p_config);
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 /* DIB807x generic */
 static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dib0700_adapter_state *st = adap->priv;
-       struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe,
+       struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe[0],
                        DIBX000_I2C_INTERFACE_TUNER, 1);
 
        if (adap->id == 0) {
-               if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
+               if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c,
                                &dib807x_dib0070_config[0]) == NULL)
                        return -ENODEV;
        } else {
-               if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
+               if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c,
                                &dib807x_dib0070_config[1]) == NULL)
                        return -ENODEV;
        }
 
-       st->set_param_save = adap->fe->ops.tuner_ops.set_params;
-       adap->fe->ops.tuner_ops.set_params = dib807x_set_param_override;
+       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
+       adap->fe[0]->ops.tuner_ops.set_params = dib807x_set_param_override;
        return 0;
 }
 
 static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index,
        u16 pid, int onoff)
 {
-       return dib8000_pid_filter(adapter->fe, index, pid, onoff);
+       return dib8000_pid_filter(adapter->fe[0], index, pid, onoff);
 }
 
 static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter,
                int onoff)
 {
-       return dib8000_pid_filter_ctrl(adapter->fe, onoff);
+       return dib8000_pid_filter_ctrl(adapter->fe[0], onoff);
 }
 
 /* STK807x */
        dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
                                0x80);
 
-       adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
                              &dib807x_dib8000_config[0]);
 
-       return adap->fe == NULL ?  -ENODEV : 0;
+       return adap->fe[0] == NULL ?  -ENODEV : 0;
 }
 
 /* STK807xPVR */
        /* initialize IC 0 */
        dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80);
 
-       adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
                              &dib807x_dib8000_config[0]);
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
        /* initialize IC 1 */
        dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x82);
 
-       adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
+       adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
                              &dib807x_dib8000_config[1]);
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 /* STK8096GP */
 static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dib0700_adapter_state *st = adap->priv;
-       struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
+       struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1);
 
-       if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &dib809x_dib0090_config) == NULL)
+       if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &dib809x_dib0090_config) == NULL)
                return -ENODEV;
 
-       st->set_param_save = adap->fe->ops.tuner_ops.set_params;
-       adap->fe->ops.tuner_ops.set_params = dib8096_set_param_override;
+       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
+       adap->fe[0]->ops.tuner_ops.set_params = dib8096_set_param_override;
        return 0;
 }
 
 
        dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80);
 
-       adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
+       adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
 
-       return adap->fe == NULL ?  -ENODEV : 0;
+       return adap->fe[0] == NULL ?  -ENODEV : 0;
 }
 
 static int nim8096md_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dib0700_adapter_state *st = adap->priv;
        struct i2c_adapter *tun_i2c;
-       struct dvb_frontend *fe_slave  = dib8000_get_slave_frontend(adap->fe, 1);
+       struct dvb_frontend *fe_slave  = dib8000_get_slave_frontend(adap->fe[0], 1);
 
        if (fe_slave) {
                tun_i2c = dib8000_get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1);
                if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL)
                        return -ENODEV;
-               fe_slave->dvb = adap->fe->dvb;
+               fe_slave->dvb = adap->fe[0]->dvb;
                fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override;
        }
-       tun_i2c = dib8000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
-       if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &dib809x_dib0090_config) == NULL)
+       tun_i2c = dib8000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1);
+       if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &dib809x_dib0090_config) == NULL)
                return -ENODEV;
 
-       st->set_param_save = adap->fe->ops.tuner_ops.set_params;
-       adap->fe->ops.tuner_ops.set_params = dib8096_set_param_override;
+       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
+       adap->fe[0]->ops.tuner_ops.set_params = dib8096_set_param_override;
 
        return 0;
 }
 
        dib8000_i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80);
 
-       adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
-       if (adap->fe == NULL)
+       adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
+       if (adap->fe[0] == NULL)
                return -ENODEV;
 
        fe_slave = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
-       dib8000_set_slave_frontend(adap->fe, fe_slave);
+       dib8000_set_slave_frontend(adap->fe[0], fe_slave);
 
        return fe_slave == NULL ?  -ENODEV : 0;
 }
 /* STK9090M */
 static int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
 {
-       return dib9000_fw_pid_filter(adapter->fe, index, pid, onoff);
+       return dib9000_fw_pid_filter(adapter->fe[0], index, pid, onoff);
 }
 
 static int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
 {
-       return dib9000_fw_pid_filter_ctrl(adapter->fe, onoff);
+       return dib9000_fw_pid_filter_ctrl(adapter->fe[0], onoff);
 }
 
 static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff)
        stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size;
        stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data;
 
-       adap->fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config);
+       adap->fe[0] = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config);
 
-       return adap->fe == NULL ?  -ENODEV : 0;
+       return adap->fe[0] == NULL ?  -ENODEV : 0;
 }
 
 static int dib9090_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dib0700_adapter_state *state = adap->priv;
-       struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe);
+       struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe[0]);
        u16 data_dib190[10] = {
                1, 0x1374,
                2, 0x01a2,
                8, 0x0486,
        };
 
-       if (dvb_attach(dib0090_fw_register, adap->fe, i2c, &dib9090_dib0090_config) == NULL)
+       if (dvb_attach(dib0090_fw_register, adap->fe[0], i2c, &dib9090_dib0090_config) == NULL)
                return -ENODEV;
-       i2c = dib9000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
+       i2c = dib9000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
        if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0)
                return -ENODEV;
        dib0700_set_i2c_speed(adap->dev, 2000);
-       if (dib9000_firmware_post_pll_init(adap->fe) < 0)
+       if (dib9000_firmware_post_pll_init(adap->fe[0]) < 0)
                return -ENODEV;
        release_firmware(state->frontend_firmware);
        return 0;
        nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data;
 
        dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80);
-       adap->fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]);
+       adap->fe[0] = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]);
 
-       if (adap->fe == NULL)
+       if (adap->fe[0] == NULL)
                return -ENODEV;
 
-       i2c = dib9000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_GPIO_3_4, 0);
+       i2c = dib9000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_GPIO_3_4, 0);
        dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82);
 
        fe_slave = dvb_attach(dib9000_attach, i2c, 0x82, &nim9090md_config[1]);
-       dib9000_set_slave_frontend(adap->fe, fe_slave);
+       dib9000_set_slave_frontend(adap->fe[0], fe_slave);
 
        return fe_slave == NULL ?  -ENODEV : 0;
 }
                0, 0x00ef,
                8, 0x0406,
        };
-       i2c = dib9000_get_tuner_interface(adap->fe);
-       if (dvb_attach(dib0090_fw_register, adap->fe, i2c, &nim9090md_dib0090_config[0]) == NULL)
+       i2c = dib9000_get_tuner_interface(adap->fe[0]);
+       if (dvb_attach(dib0090_fw_register, adap->fe[0], i2c, &nim9090md_dib0090_config[0]) == NULL)
                return -ENODEV;
-       i2c = dib9000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
+       i2c = dib9000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
        if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0)
                return -ENODEV;
        dib0700_set_i2c_speed(adap->dev, 2000);
-       if (dib9000_firmware_post_pll_init(adap->fe) < 0)
+       if (dib9000_firmware_post_pll_init(adap->fe[0]) < 0)
                return -ENODEV;
 
-       fe_slave = dib9000_get_slave_frontend(adap->fe, 1);
+       fe_slave = dib9000_get_slave_frontend(adap->fe[0], 1);
        if (fe_slave != NULL) {
-               i2c = dib9000_get_component_bus_interface(adap->fe);
+               i2c = dib9000_get_component_bus_interface(adap->fe[0]);
                dib9000_set_i2c_adapter(fe_slave, i2c);
 
                i2c = dib9000_get_tuner_interface(fe_slave);
                if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL)
                        return -ENODEV;
-               fe_slave->dvb = adap->fe->dvb;
-               dib9000_fw_set_component_bus_speed(adap->fe, 2000);
+               fe_slave->dvb = adap->fe[0]->dvb;
+               dib9000_fw_set_component_bus_speed(adap->fe[0], 2000);
                if (dib9000_firmware_post_pll_init(fe_slave) < 0)
                        return -ENODEV;
        }
                err("%s: dib7000p_i2c_enumeration failed.  Cannot continue\n", __func__);
                return -ENODEV;
        }
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
 
-       return adap->fe == NULL ?  -ENODEV : 0;
+       return adap->fe[0] == NULL ?  -ENODEV : 0;
 }
 
 static int nim7090_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dib0700_adapter_state *st = adap->priv;
-       struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe);
+       struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe[0]);
 
-       if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &nim7090_dib0090_config) == NULL)
+       if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &nim7090_dib0090_config) == NULL)
                return -ENODEV;
 
-       dib7000p_set_gpio(adap->fe, 8, 0, 1);
+       dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
 
-       st->set_param_save = adap->fe->ops.tuner_ops.set_params;
-       adap->fe->ops.tuner_ops.set_params = dib7090_agc_startup;
+       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
+       adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup;
        return 0;
 }
 
        }
 
        dib0700_set_i2c_speed(adap->dev, 340);
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
-       if (adap->fe == NULL)
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
+       if (adap->fe[0] == NULL)
                return -ENODEV;
 
-       dib7090_slave_reset(adap->fe);
+       dib7090_slave_reset(adap->fe[0]);
 
        return 0;
 }
 {
        struct i2c_adapter *i2c;
 
-       if (adap->dev->adapter[0].fe == NULL) {
+       if (adap->dev->adapter[0].fe[0] == NULL) {
                err("the master dib7090 has to be initialized first");
                return -ENODEV; /* the master device has not been initialized */
        }
 
-       i2c = dib7000p_get_i2c_master(adap->dev->adapter[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
+       i2c = dib7000p_get_i2c_master(adap->dev->adapter[0].fe[0], DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
        if (dib7000p_i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) {
                err("%s: dib7000p_i2c_enumeration failed.  Cannot continue\n", __func__);
                return -ENODEV;
        }
 
-       adap->fe = dvb_attach(dib7000p_attach, i2c, 0x92, &tfe7090pvr_dib7000p_config[1]);
+       adap->fe[0] = dvb_attach(dib7000p_attach, i2c, 0x92, &tfe7090pvr_dib7000p_config[1]);
        dib0700_set_i2c_speed(adap->dev, 200);
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap)
 {
        struct dib0700_adapter_state *st = adap->priv;
-       struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe);
+       struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe[0]);
 
-       if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL)
+       if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL)
                return -ENODEV;
 
-       dib7000p_set_gpio(adap->fe, 8, 0, 1);
+       dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
 
-       st->set_param_save = adap->fe->ops.tuner_ops.set_params;
-       adap->fe->ops.tuner_ops.set_params = dib7090_agc_startup;
+       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
+       adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup;
        return 0;
 }
 
 static int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap)
 {
        struct dib0700_adapter_state *st = adap->priv;
-       struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe);
+       struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe[0]);
 
-       if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL)
+       if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL)
                return -ENODEV;
 
-       dib7000p_set_gpio(adap->fe, 8, 0, 1);
+       dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
 
-       st->set_param_save = adap->fe->ops.tuner_ops.set_params;
-       adap->fe->ops.tuner_ops.set_params = dib7090_agc_startup;
+       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
+       adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup;
        return 0;
 }
 
                return -ENODEV;
        }
 
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
-       return adap->fe == NULL ? -ENODEV : 0;
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
 {
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
-       return adap->fe == NULL ? -ENODEV : 0;
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 /* S5H1411 */
        dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
 
        /* GPIOs are initialized, do the attach */
-       adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
+       adap->fe[0] = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
                              &adap->dev->i2c_adap);
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static int dib0700_xc5000_tuner_callback(void *priv, int component,
 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
 {
        /* FIXME: generalize & move to common area */
-       adap->fe->callback = dib0700_xc5000_tuner_callback;
+       adap->fe[0]->callback = dib0700_xc5000_tuner_callback;
 
-       return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
+       return dvb_attach(xc5000_attach, adap->fe[0], &adap->dev->i2c_adap,
                          &s5h1411_xc5000_tunerconfig)
                == NULL ? -ENODEV : 0;
 }
 
        if (command == XC4000_TUNER_RESET) {
                /* Reset the tuner */
-               dib7000p_set_gpio(adap->fe, 8, 0, 0);
+               dib7000p_set_gpio(adap->fe[0], 8, 0, 0);
                msleep(10);
-               dib7000p_set_gpio(adap->fe, 8, 0, 1);
+               dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
        } else {
                err("xc4000: unknown tuner callback command: %d\n", command);
                return -EINVAL;
                return -ENODEV;
        }
 
-       adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x12,
+       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x12,
                              &pctv_340e_config);
        st->is_dib7000pc = 1;
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static struct xc4000_config dib7000p_xc4000_tunerconfig = {
        struct i2c_adapter *tun_i2c;
 
        /* The xc4000 is not on the main i2c bus */
-       tun_i2c = dib7000p_get_i2c_master(adap->fe,
+       tun_i2c = dib7000p_get_i2c_master(adap->fe[0],
                                          DIBX000_I2C_INTERFACE_TUNER, 1);
        if (tun_i2c == NULL) {
                printk(KERN_ERR "Could not reach tuner i2c bus\n");
        }
 
        /* Setup the reset callback */
-       adap->fe->callback = dib0700_xc4000_tuner_callback;
+       adap->fe[0]->callback = dib0700_xc4000_tuner_callback;
 
-       return dvb_attach(xc4000_attach, adap->fe, tun_i2c,
+       return dvb_attach(xc4000_attach, adap->fe[0], tun_i2c,
                          &dib7000p_xc4000_tunerconfig)
                == NULL ? -ENODEV : 0;
 }
        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
        msleep(30);
 
-       adap->fe = dvb_attach(lgdt3305_attach,
+       adap->fe[0] = dvb_attach(lgdt3305_attach,
                              &hcw_lgdt3305_config,
                              &adap->dev->i2c_adap);
 
-       return adap->fe == NULL ? -ENODEV : 0;
+       return adap->fe[0] == NULL ? -ENODEV : 0;
 }
 
 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       return dvb_attach(mxl5007t_attach, adap->fe,
+       return dvb_attach(mxl5007t_attach, adap->fe[0],
                          &adap->dev->i2c_adap, 0x60,
                          &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
 }
 
        if (adap->priv != NULL) {
                struct dibusb_state *st = adap->priv;
                if (st->ops.fifo_ctrl != NULL)
-                       if (st->ops.fifo_ctrl(adap->fe,onoff)) {
+                       if (st->ops.fifo_ctrl(adap->fe[0],onoff)) {
                                err("error while controlling the fifo of the demod.");
                                return -ENODEV;
                        }
        if (adap->priv != NULL) {
                struct dibusb_state *st = adap->priv;
                if (st->ops.pid_ctrl != NULL)
-                       st->ops.pid_ctrl(adap->fe,index,pid,onoff);
+                       st->ops.pid_ctrl(adap->fe[0],index,pid,onoff);
        }
        return 0;
 }
        if (adap->priv != NULL) {
                struct dibusb_state *st = adap->priv;
                if (st->ops.pid_parse != NULL)
-                       if (st->ops.pid_parse(adap->fe,onoff) < 0)
+                       if (st->ops.pid_parse(adap->fe[0],onoff) < 0)
                                err("could not handle pid_parser");
        }
        return 0;
                msleep(1000);
        }
 
-       if ((adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000P_I2C_ADDRESS,  &mod3000p_dib3000p_config)) != NULL ||
-               (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL) {
+       if ((adap->fe[0] = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000P_I2C_ADDRESS,  &mod3000p_dib3000p_config)) != NULL ||
+               (adap->fe[0] = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL) {
                if (adap->priv != NULL) {
                        struct dibusb_state *st = adap->priv;
                        st->ops.pid_parse = dib3000mc_pid_parse;
                }
        }
 
-       tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
-       if (dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk3000p_mt2060_config, if1) == NULL) {
+       tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe[0], 1);
+       if (dvb_attach(mt2060_attach, adap->fe[0], tun_i2c, &stk3000p_mt2060_config, if1) == NULL) {
                /* not found - use panasonic pll parameters */
-               if (dvb_attach(dvb_pll_attach, adap->fe, 0x60, tun_i2c, DVB_PLL_ENV57H1XD5) == NULL)
+               if (dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, tun_i2c, DVB_PLL_ENV57H1XD5) == NULL)
                        return -ENOMEM;
        } else {
                st->mt2060_present = 1;
                /* set the correct parameters for the dib3000p */
-               dib3000mc_set_config(adap->fe, &stk3000p_dib3000p_config);
+               dib3000mc_set_config(adap->fe[0], &stk3000p_dib3000p_config);
        }
        return 0;
 }
 
 
        demod_cfg.demod_address = 0x8;
 
-       if ((adap->fe = dvb_attach(dib3000mb_attach, &demod_cfg,
+       if ((adap->fe[0] = dvb_attach(dib3000mb_attach, &demod_cfg,
                                   &adap->dev->i2c_adap, &st->ops)) == NULL)
                return -ENODEV;
 
-       adap->fe->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl;
+       adap->fe[0]->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl;
 
        return 0;
 }
 
        st->tuner_addr = 0x61;
 
-       dvb_attach(dvb_pll_attach, adap->fe, 0x61, &adap->dev->i2c_adap,
+       dvb_attach(dvb_pll_attach, adap->fe[0], 0x61, &adap->dev->i2c_adap,
                   DVB_PLL_TUA6010XS);
        return 0;
 }
 
        st->tuner_addr = 0x60;
 
-       dvb_attach(dvb_pll_attach, adap->fe, 0x60, &adap->dev->i2c_adap,
+       dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, &adap->dev->i2c_adap,
                   DVB_PLL_TDA665X);
        return 0;
 }
        /* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */
        msg[0].addr = msg[1].addr = st->tuner_addr = 0x60;
 
-       if (adap->fe->ops.i2c_gate_ctrl)
-               adap->fe->ops.i2c_gate_ctrl(adap->fe,1);
+       if (adap->fe[0]->ops.i2c_gate_ctrl)
+               adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0],1);
 
        if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) {
                err("tuner i2c write failed.");
                ret = -EREMOTEIO;
        }
 
-       if (adap->fe->ops.i2c_gate_ctrl)
-               adap->fe->ops.i2c_gate_ctrl(adap->fe,0);
+       if (adap->fe[0]->ops.i2c_gate_ctrl)
+               adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0],0);
 
        if (b2[0] == 0xfe) {
                info("This device has the Thomson Cable onboard. Which is default.");
 
 {
        struct digitv_state *st = adap->dev->priv;
 
-       if ((adap->fe = dvb_attach(mt352_attach, &digitv_mt352_config, &adap->dev->i2c_adap)) != NULL) {
+       if ((adap->fe[0] = dvb_attach(mt352_attach, &digitv_mt352_config, &adap->dev->i2c_adap)) != NULL) {
                st->is_nxt6000 = 0;
                return 0;
        }
-       if ((adap->fe = dvb_attach(nxt6000_attach, &digitv_nxt6000_config, &adap->dev->i2c_adap)) != NULL) {
+       if ((adap->fe[0] = dvb_attach(nxt6000_attach, &digitv_nxt6000_config, &adap->dev->i2c_adap)) != NULL) {
                st->is_nxt6000 = 1;
                return 0;
        }
 {
        struct digitv_state *st = adap->dev->priv;
 
-       if (!dvb_attach(dvb_pll_attach, adap->fe, 0x60, NULL, DVB_PLL_TDED4))
+       if (!dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, NULL, DVB_PLL_TDED4))
                return -ENODEV;
 
        if (st->is_nxt6000)
-               adap->fe->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params;
+               adap->fe[0]->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params;
 
        return 0;
 }
 
 
 static int dtt200u_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe = dtt200u_fe_attach(adap->dev);
+       adap->fe[0] = dtt200u_fe_attach(adap->dev);
        return 0;
 }
 
 
 
 static int dtv5100_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe = dvb_attach(zl10353_attach, &dtv5100_zl10353_config,
+       adap->fe[0] = dvb_attach(zl10353_attach, &dtv5100_zl10353_config,
                              &adap->dev->i2c_adap);
-       if (adap->fe == NULL)
+       if (adap->fe[0] == NULL)
                return -EIO;
 
        /* disable i2c gate, or it won't work... is this safe? */
-       adap->fe->ops.i2c_gate_ctrl = NULL;
+       adap->fe[0]->ops.i2c_gate_ctrl = NULL;
 
        return 0;
 }
 static int dtv5100_tuner_attach(struct dvb_usb_adapter *adap)
 {
        return dvb_attach(qt1010_attach,
-                         adap->fe, &adap->dev->i2c_adap,
+                         adap->fe[0], &adap->dev->i2c_adap,
                          &dtv5100_qt1010_config) == NULL ? -ENODEV : 0;
 }
 
 
        }
 
        /* re-assign sleep and wakeup functions */
-       if (adap->props.frontend_attach(adap) == 0 && adap->fe != NULL) {
-               adap->fe_init  = adap->fe->ops.init;  adap->fe->ops.init  = dvb_usb_fe_wakeup;
-               adap->fe_sleep = adap->fe->ops.sleep; adap->fe->ops.sleep = dvb_usb_fe_sleep;
+       if (adap->props.frontend_attach(adap) == 0 && adap->fe[0] != NULL) {
+               adap->fe_init  = adap->fe[0]->ops.init;  adap->fe[0]->ops.init  = dvb_usb_fe_wakeup;
+               adap->fe_sleep = adap->fe[0]->ops.sleep; adap->fe[0]->ops.sleep = dvb_usb_fe_sleep;
 
-               if (dvb_register_frontend(&adap->dvb_adap, adap->fe)) {
+               if (dvb_register_frontend(&adap->dvb_adap, adap->fe[0])) {
                        err("Frontend registration failed.");
-                       dvb_frontend_detach(adap->fe);
-                       adap->fe = NULL;
+                       dvb_frontend_detach(adap->fe[0]);
+                       adap->fe[0] = NULL;
                        return -ENODEV;
                }
 
 
 int dvb_usb_adapter_frontend_exit(struct dvb_usb_adapter *adap)
 {
-       if (adap->fe != NULL) {
-               dvb_unregister_frontend(adap->fe);
-               dvb_frontend_detach(adap->fe);
+       if (adap->fe[0] != NULL) {
+               dvb_unregister_frontend(adap->fe[0]);
+               dvb_frontend_detach(adap->fe[0]);
        }
        return 0;
 }
 
        struct dmxdev        dmxdev;
        struct dvb_demux     demux;
        struct dvb_net       dvb_net;
-       struct dvb_frontend *fe;
+       struct dvb_frontend *fe[1];
        int                  max_feed_count;
 
        int (*fe_init)  (struct dvb_frontend *);
 
        struct dvb_tuner_ops *tuner_ops = NULL;
 
        if (demod_probe & 4) {
-               d->fe = dvb_attach(stv0900_attach, &dw2104a_stv0900_config,
+               d->fe[0] = dvb_attach(stv0900_attach, &dw2104a_stv0900_config,
                                &d->dev->i2c_adap, 0);
-               if (d->fe != NULL) {
-                       if (dvb_attach(stb6100_attach, d->fe,
+               if (d->fe[0] != NULL) {
+                       if (dvb_attach(stb6100_attach, d->fe[0],
                                        &dw2104a_stb6100_config,
                                        &d->dev->i2c_adap)) {
-                               tuner_ops = &d->fe->ops.tuner_ops;
+                               tuner_ops = &d->fe[0]->ops.tuner_ops;
                                tuner_ops->set_frequency = stb6100_set_freq;
                                tuner_ops->get_frequency = stb6100_get_freq;
                                tuner_ops->set_bandwidth = stb6100_set_bandw;
                                tuner_ops->get_bandwidth = stb6100_get_bandw;
-                               d->fe->ops.set_voltage = dw210x_set_voltage;
+                               d->fe[0]->ops.set_voltage = dw210x_set_voltage;
                                info("Attached STV0900+STB6100!\n");
                                return 0;
                        }
        }
 
        if (demod_probe & 2) {
-               d->fe = dvb_attach(stv0900_attach, &dw2104_stv0900_config,
+               d->fe[0] = dvb_attach(stv0900_attach, &dw2104_stv0900_config,
                                &d->dev->i2c_adap, 0);
-               if (d->fe != NULL) {
-                       if (dvb_attach(stv6110_attach, d->fe,
+               if (d->fe[0] != NULL) {
+                       if (dvb_attach(stv6110_attach, d->fe[0],
                                        &dw2104_stv6110_config,
                                        &d->dev->i2c_adap)) {
-                               d->fe->ops.set_voltage = dw210x_set_voltage;
+                               d->fe[0]->ops.set_voltage = dw210x_set_voltage;
                                info("Attached STV0900+STV6110A!\n");
                                return 0;
                        }
        }
 
        if (demod_probe & 1) {
-               d->fe = dvb_attach(cx24116_attach, &dw2104_config,
+               d->fe[0] = dvb_attach(cx24116_attach, &dw2104_config,
                                &d->dev->i2c_adap);
-               if (d->fe != NULL) {
-                       d->fe->ops.set_voltage = dw210x_set_voltage;
+               if (d->fe[0] != NULL) {
+                       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
                        info("Attached cx24116!\n");
                        return 0;
                }
        }
 
-       d->fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
+       d->fe[0] = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
                        &d->dev->i2c_adap);
-       if (d->fe != NULL) {
-               d->fe->ops.set_voltage = dw210x_set_voltage;
+       if (d->fe[0] != NULL) {
+               d->fe[0]->ops.set_voltage = dw210x_set_voltage;
                info("Attached DS3000!\n");
                return 0;
        }
 {
        if (dw2102_properties.i2c_algo == &dw2102_serit_i2c_algo) {
                /*dw2102_properties.adapter->tuner_attach = NULL;*/
-               d->fe = dvb_attach(si21xx_attach, &serit_sp1511lhb_config,
+               d->fe[0] = dvb_attach(si21xx_attach, &serit_sp1511lhb_config,
                                        &d->dev->i2c_adap);
-               if (d->fe != NULL) {
-                       d->fe->ops.set_voltage = dw210x_set_voltage;
+               if (d->fe[0] != NULL) {
+                       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
                        info("Attached si21xx!\n");
                        return 0;
                }
        }
 
        if (dw2102_properties.i2c_algo == &dw2102_earda_i2c_algo) {
-               d->fe = dvb_attach(stv0288_attach, &earda_config,
+               d->fe[0] = dvb_attach(stv0288_attach, &earda_config,
                                        &d->dev->i2c_adap);
-               if (d->fe != NULL) {
-                       if (dvb_attach(stb6000_attach, d->fe, 0x61,
+               if (d->fe[0] != NULL) {
+                       if (dvb_attach(stb6000_attach, d->fe[0], 0x61,
                                        &d->dev->i2c_adap)) {
-                               d->fe->ops.set_voltage = dw210x_set_voltage;
+                               d->fe[0]->ops.set_voltage = dw210x_set_voltage;
                                info("Attached stv0288!\n");
                                return 0;
                        }
 
        if (dw2102_properties.i2c_algo == &dw2102_i2c_algo) {
                /*dw2102_properties.adapter->tuner_attach = dw2102_tuner_attach;*/
-               d->fe = dvb_attach(stv0299_attach, &sharp_z0194a_config,
+               d->fe[0] = dvb_attach(stv0299_attach, &sharp_z0194a_config,
                                        &d->dev->i2c_adap);
-               if (d->fe != NULL) {
-                       d->fe->ops.set_voltage = dw210x_set_voltage;
+               if (d->fe[0] != NULL) {
+                       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
                        info("Attached stv0299!\n");
                        return 0;
                }
 
 static int dw3101_frontend_attach(struct dvb_usb_adapter *d)
 {
-       d->fe = dvb_attach(tda10023_attach, &dw3101_tda10023_config,
+       d->fe[0] = dvb_attach(tda10023_attach, &dw3101_tda10023_config,
                                &d->dev->i2c_adap, 0x48);
-       if (d->fe != NULL) {
+       if (d->fe[0] != NULL) {
                info("Attached tda10023!\n");
                return 0;
        }
 
 static int zl100313_frontend_attach(struct dvb_usb_adapter *d)
 {
-       d->fe = dvb_attach(mt312_attach, &zl313_config,
+       d->fe[0] = dvb_attach(mt312_attach, &zl313_config,
                        &d->dev->i2c_adap);
-       if (d->fe != NULL) {
-               if (dvb_attach(zl10039_attach, d->fe, 0x60,
+       if (d->fe[0] != NULL) {
+               if (dvb_attach(zl10039_attach, d->fe[0], 0x60,
                                &d->dev->i2c_adap)) {
-                       d->fe->ops.set_voltage = dw210x_set_voltage;
+                       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
                        info("Attached zl100313+zl10039!\n");
                        return 0;
                }
 {
        u8 obuf[] = {7, 1};
 
-       d->fe = dvb_attach(stv0288_attach, &earda_config,
+       d->fe[0] = dvb_attach(stv0288_attach, &earda_config,
                        &d->dev->i2c_adap);
 
-       if (d->fe == NULL)
+       if (d->fe[0] == NULL)
                return -EIO;
 
-       if (NULL == dvb_attach(stb6000_attach, d->fe, 0x61, &d->dev->i2c_adap))
+       if (NULL == dvb_attach(stb6000_attach, d->fe[0], 0x61, &d->dev->i2c_adap))
                return -EIO;
 
-       d->fe->ops.set_voltage = dw210x_set_voltage;
+       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
 
        dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
 
        struct s6x0_state *st = (struct s6x0_state *)d->dev->priv;
        u8 obuf[] = {7, 1};
 
-       d->fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
+       d->fe[0] = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
                        &d->dev->i2c_adap);
 
-       if (d->fe == NULL)
+       if (d->fe[0] == NULL)
                return -EIO;
 
-       st->old_set_voltage = d->fe->ops.set_voltage;
-       d->fe->ops.set_voltage = s660_set_voltage;
+       st->old_set_voltage = d->fe[0]->ops.set_voltage;
+       d->fe[0]->ops.set_voltage = s660_set_voltage;
 
        dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
 
 {
        u8 obuf[] = {7, 1};
 
-       d->fe = dvb_attach(stv0900_attach, &prof_7500_stv0900_config,
+       d->fe[0] = dvb_attach(stv0900_attach, &prof_7500_stv0900_config,
                                        &d->dev->i2c_adap, 0);
-       if (d->fe == NULL)
+       if (d->fe[0] == NULL)
                return -EIO;
 
-       d->fe->ops.set_voltage = dw210x_set_voltage;
+       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
 
        dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
 
        if (dvb_usb_generic_rw(d->dev, obuf, 1, ibuf, 1, 0) < 0)
                err("command 0x51 transfer failed.");
 
-       d->fe = dvb_attach(ds3000_attach, &su3000_ds3000_config,
+       d->fe[0] = dvb_attach(ds3000_attach, &su3000_ds3000_config,
                                        &d->dev->i2c_adap);
-       if (d->fe == NULL)
+       if (d->fe[0] == NULL)
                return -EIO;
 
        info("Attached DS3000!\n");
 
 static int dw2102_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe, 0x60,
+       dvb_attach(dvb_pll_attach, adap->fe[0], 0x60,
                &adap->dev->i2c_adap, DVB_PLL_OPERA1);
        return 0;
 }
 
 static int dw3101_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe, 0x60,
+       dvb_attach(dvb_pll_attach, adap->fe[0], 0x60,
                &adap->dev->i2c_adap, DVB_PLL_TUA6034);
 
        return 0;
 
 static int ec168_ec100_frontend_attach(struct dvb_usb_adapter *adap)
 {
        deb_info("%s:\n", __func__);
-       adap->fe = dvb_attach(ec100_attach, &ec168_ec100_config,
+       adap->fe[0] = dvb_attach(ec100_attach, &ec168_ec100_config,
                &adap->dev->i2c_adap);
-       if (adap->fe == NULL)
+       if (adap->fe[0] == NULL)
                return -ENODEV;
 
        return 0;
 static int ec168_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
 {
        deb_info("%s:\n", __func__);
-       return dvb_attach(mxl5005s_attach, adap->fe, &adap->dev->i2c_adap,
+       return dvb_attach(mxl5005s_attach, adap->fe[0], &adap->dev->i2c_adap,
                &ec168_mxl5003s_config) == NULL ? -ENODEV : 0;
 }
 
 
        if (friio_initialize(adap->dev) < 0)
                return -EIO;
 
-       adap->fe = jdvbt90502_attach(adap->dev);
-       if (adap->fe == NULL)
+       adap->fe[0] = jdvbt90502_attach(adap->dev);
+       if (adap->fe[0] == NULL)
                return -EIO;
 
        return 0;
 
 static int gl861_frontend_attach(struct dvb_usb_adapter *adap)
 {
 
-       adap->fe = dvb_attach(zl10353_attach, &gl861_zl10353_config,
+       adap->fe[0] = dvb_attach(zl10353_attach, &gl861_zl10353_config,
                &adap->dev->i2c_adap);
-       if (adap->fe == NULL)
+       if (adap->fe[0] == NULL)
                return -EIO;
 
        return 0;
 static int gl861_tuner_attach(struct dvb_usb_adapter *adap)
 {
        return dvb_attach(qt1010_attach,
-                         adap->fe, &adap->dev->i2c_adap,
+                         adap->fe[0], &adap->dev->i2c_adap,
                          &gl861_qt1010_config) == NULL ? -ENODEV : 0;
 }
 
 
 
 static int gp8psk_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe = gp8psk_fe_attach(adap->dev);
+       adap->fe[0] = gp8psk_fe_attach(adap->dev);
        return 0;
 }
 
 
        const char *desc = adap->dev->desc->name;
        char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
                                " SHARP:BS2F7HZ0194"};
-       char *name = adap->fe->ops.info.name;
+       char *name = adap->fe[0]->ops.info.name;
 
        strlcpy(name, desc, 128);
        strlcat(name, fe_name[st->tuner_config], 128);
        st->i2c_talk_onoff = 1;
 
        st->i2c_gate = 4;
-       adap->fe = dvb_attach(tda10086_attach, &tda10086_config,
+       adap->fe[0] = dvb_attach(tda10086_attach, &tda10086_config,
                &adap->dev->i2c_adap);
 
-       if (adap->fe) {
+       if (adap->fe[0]) {
                info("TUN Found Frontend TDA10086");
                st->i2c_tuner_gate_w = 4;
                st->i2c_tuner_gate_r = 4;
        }
 
        st->i2c_gate = 4;
-       adap->fe = dvb_attach(stv0299_attach, &sharp_z0194_config,
+       adap->fe[0] = dvb_attach(stv0299_attach, &sharp_z0194_config,
                        &adap->dev->i2c_adap);
-       if (adap->fe) {
+       if (adap->fe[0]) {
                info("FE Found Stv0299");
                st->i2c_tuner_gate_w = 4;
                st->i2c_tuner_gate_r = 5;
        }
 
        st->i2c_gate = 5;
-       adap->fe = dvb_attach(stv0288_attach, &lme_config,
+       adap->fe[0] = dvb_attach(stv0288_attach, &lme_config,
                        &adap->dev->i2c_adap);
-       if (adap->fe) {
+       if (adap->fe[0]) {
                info("FE Found Stv0288");
                st->i2c_tuner_gate_w = 4;
                st->i2c_tuner_gate_r = 5;
 
 
 end:   if (ret) {
-               if (adap->fe) {
-                       dvb_frontend_detach(adap->fe);
-                       adap->fe = NULL;
+               if (adap->fe[0]) {
+                       dvb_frontend_detach(adap->fe[0]);
+                       adap->fe[0] = NULL;
                }
                adap->dev->props.rc.core.rc_codes = NULL;
                return -ENODEV;
        }
 
-       adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
+       adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage;
        ret = lme_name(adap);
        return ret;
 }
 
        switch (st->tuner_config) {
        case TUNER_LG:
-               if (dvb_attach(tda826x_attach, adap->fe, 0xc0,
+               if (dvb_attach(tda826x_attach, adap->fe[0], 0xc0,
                        &adap->dev->i2c_adap, 1))
                        ret = st->tuner_config;
                break;
        case TUNER_S7395:
-               if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner,
+               if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner,
                        &adap->dev->i2c_adap))
                        ret = st->tuner_config;
                break;
        case TUNER_S0194:
-               if (dvb_attach(dvb_pll_attach , adap->fe, 0xc0,
+               if (dvb_attach(dvb_pll_attach , adap->fe[0], 0xc0,
                        &adap->dev->i2c_adap, DVB_PLL_OPERA1))
                        ret = st->tuner_config;
                break;
 
 {
        deb("%s\n",__func__);
 
-       if ((adap->fe = dvb_attach(mt352_attach,
+       if ((adap->fe[0] = dvb_attach(mt352_attach,
                                   &m920x_mt352_config,
                                   &adap->dev->i2c_adap)) == NULL)
                return -EIO;
 {
        deb("%s\n",__func__);
 
-       if ((adap->fe = dvb_attach(tda10046_attach,
+       if ((adap->fe[0] = dvb_attach(tda10046_attach,
                                   &m920x_tda10046_08_config,
                                   &adap->dev->i2c_adap)) == NULL)
                return -EIO;
 {
        deb("%s\n",__func__);
 
-       if ((adap->fe = dvb_attach(tda10046_attach,
+       if ((adap->fe[0] = dvb_attach(tda10046_attach,
                                   &m920x_tda10046_0b_config,
                                   &adap->dev->i2c_adap)) == NULL)
                return -EIO;
 {
        deb("%s\n",__func__);
 
-       if (dvb_attach(qt1010_attach, adap->fe, &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL)
+       if (dvb_attach(qt1010_attach, adap->fe[0], &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL)
                return -ENODEV;
 
        return 0;
 {
        deb("%s\n",__func__);
 
-       if (dvb_attach(tda827x_attach, adap->fe, 0x60, &adap->dev->i2c_adap, NULL) == NULL)
+       if (dvb_attach(tda827x_attach, adap->fe[0], 0x60, &adap->dev->i2c_adap, NULL) == NULL)
                return -ENODEV;
 
        return 0;
 {
        deb("%s\n",__func__);
 
-       if (dvb_attach(tda827x_attach, adap->fe, 0x61, &adap->dev->i2c_adap, NULL) == NULL)
+       if (dvb_attach(tda827x_attach, adap->fe[0], 0x61, &adap->dev->i2c_adap, NULL) == NULL)
                return -ENODEV;
 
        return 0;
 
 static int m920x_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(simple_tuner_attach, adap->fe,
+       dvb_attach(simple_tuner_attach, adap->fe[0],
                   &adap->dev->i2c_adap, 0x61,
                   TUNER_PHILIPS_FMD1216ME_MK3);
        return 0;
 
 
 static int opera1_frontend_attach(struct dvb_usb_adapter *d)
 {
-       if ((d->fe =
+       if ((d->fe[0] =
             dvb_attach(stv0299_attach, &opera1_stv0299_config,
                        &d->dev->i2c_adap)) != NULL) {
-               d->fe->ops.set_voltage = opera1_set_voltage;
+               d->fe[0]->ops.set_voltage = opera1_set_voltage;
                return 0;
        }
        info("not attached stv0299");
 static int opera1_tuner_attach(struct dvb_usb_adapter *adap)
 {
        dvb_attach(
-               dvb_pll_attach, adap->fe, 0xc0>>1,
+               dvb_pll_attach, adap->fe[0], 0xc0>>1,
                &adap->dev->i2c_adap, DVB_PLL_OPERA1
        );
        return 0;
 
 {
        struct technisat_usb2_state *state =
                container_of(work, struct technisat_usb2_state, green_led_work.work);
-       struct dvb_frontend *fe = state->dev->adapter[0].fe;
+       struct dvb_frontend *fe = state->dev->adapter[0].fe[0];
 
        if (state->power_state == 0)
                goto schedule;
        struct usb_device *udev = a->dev->udev;
        int ret;
 
-       a->fe = dvb_attach(stv090x_attach, &technisat_usb2_stv090x_config,
+       a->fe[0] = dvb_attach(stv090x_attach, &technisat_usb2_stv090x_config,
                        &a->dev->i2c_adap, STV090x_DEMODULATOR_0);
 
-       if (a->fe) {
+       if (a->fe[0]) {
                struct stv6110x_devctl *ctl;
 
                ctl = dvb_attach(stv6110x_attach,
-                               a->fe,
+                               a->fe[0],
                                &technisat_usb2_stv6110x_config,
                                &a->dev->i2c_adap);
 
                        /* call the init function once to initialize
                           tuner's clock output divider and demod's
                           master clock */
-                       if (a->fe->ops.init)
-                               a->fe->ops.init(a->fe);
+                       if (a->fe[0]->ops.init)
+                               a->fe[0]->ops.init(a->fe[0]);
 
                        if (mutex_lock_interruptible(&a->dev->i2c_mutex) < 0)
                                return -EAGAIN;
                        if (ret != 0)
                                err("could not set IF_CLK to external");
 
-                       a->fe->ops.set_voltage = technisat_usb2_set_voltage;
+                       a->fe[0]->ops.set_voltage = technisat_usb2_set_voltage;
 
                        /* if everything was successful assign a nice name to the frontend */
-                       strlcpy(a->fe->ops.info.name, a->dev->desc->name,
-                                       sizeof(a->fe->ops.info.name));
+                       strlcpy(a->fe[0]->ops.info.name, a->dev->desc->name,
+                                       sizeof(a->fe[0]->ops.info.name));
                } else {
-                       dvb_frontend_detach(a->fe);
-                       a->fe = NULL;
+                       dvb_frontend_detach(a->fe[0]);
+                       a->fe[0] = NULL;
                }
        }
 
        technisat_usb2_set_led_timer(a->dev, 1, 1);
 
-       return a->fe == NULL ? -ENODEV : 0;
+       return a->fe[0] == NULL ? -ENODEV : 0;
 }
 
 /* Remote control */
 
        if (usb_set_interface(adap->dev->udev,0,3) < 0)
                err("set interface to alts=3 failed");
 
-       if ((adap->fe = dvb_attach(tda10086_attach, &tda10086_config, &adap->dev->i2c_adap)) == NULL) {
+       if ((adap->fe[0] = dvb_attach(tda10086_attach, &tda10086_config, &adap->dev->i2c_adap)) == NULL) {
                deb_info("TDA10086 attach failed\n");
                return -ENODEV;
        }
 {
        if (usb_set_interface(adap->dev->udev, 0, 3) < 0)
                err("set interface to alts=3 failed");
-       if ((adap->fe = dvb_attach(tda10023_attach, &tda10023_config, &adap->dev->i2c_adap, 0x48)) == NULL) {
+       if ((adap->fe[0] = dvb_attach(tda10023_attach, &tda10023_config, &adap->dev->i2c_adap, 0x48)) == NULL) {
                deb_info("TDA10023 attach failed\n");
                return -ENODEV;
        }
 
 static int ttusb2_tuner_tda827x_attach(struct dvb_usb_adapter *adap)
 {
-       if (dvb_attach(tda827x_attach, adap->fe, 0x61, &adap->dev->i2c_adap, NULL) == NULL) {
+       if (dvb_attach(tda827x_attach, adap->fe[0], 0x61, &adap->dev->i2c_adap, NULL) == NULL) {
                printk(KERN_ERR "%s: No tda827x found!\n", __func__);
                return -ENODEV;
        }
 
 static int ttusb2_tuner_tda826x_attach(struct dvb_usb_adapter *adap)
 {
-       if (dvb_attach(tda826x_attach, adap->fe, 0x60, &adap->dev->i2c_adap, 0) == NULL) {
+       if (dvb_attach(tda826x_attach, adap->fe[0], 0x60, &adap->dev->i2c_adap, 0) == NULL) {
                deb_info("TDA8263 attach failed\n");
                return -ENODEV;
        }
 
-       if (dvb_attach(lnbp21_attach, adap->fe, &adap->dev->i2c_adap, 0, 0) == NULL) {
+       if (dvb_attach(lnbp21_attach, adap->fe[0], &adap->dev->i2c_adap, 0, 0) == NULL) {
                deb_info("LNBP21 attach failed\n");
                return -ENODEV;
        }
 
        umt_config.demod_init = umt_mt352_demod_init;
        umt_config.demod_address = 0xf;
 
-       adap->fe = dvb_attach(mt352_attach, &umt_config, &adap->dev->i2c_adap);
+       adap->fe[0] = dvb_attach(mt352_attach, &umt_config, &adap->dev->i2c_adap);
 
        return 0;
 }
 
 static int umt_tuner_attach (struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe, 0x61, NULL, DVB_PLL_TUA6034);
+       dvb_attach(dvb_pll_attach, adap->fe[0], 0x61, NULL, DVB_PLL_TUA6034);
        return 0;
 }
 
 
 
        vp702x_init_pid_filter(adap);
 
-       adap->fe = vp702x_fe_attach(adap->dev);
+       adap->fe[0] = vp702x_fe_attach(adap->dev);
        vp702x_usb_out_op(adap->dev, SET_TUNER_POWER_REQ, 1, 7, NULL, 0);
 
        return 0;
 
 /*     Dump the EEPROM */
 /*     vp7045_read_eeprom(d,buf, 255, FX2_ID_ADDR); */
 
-       adap->fe = vp7045_fe_attach(adap->dev);
+       adap->fe[0] = vp7045_fe_attach(adap->dev);
 
        return 0;
 }