[media] dvb-usb: refactor MFE code for individual streaming config per frontend
authorMichael Krufky <mkrufky@kernellabs.com>
Tue, 6 Sep 2011 12:31:57 +0000 (09:31 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 6 Sep 2011 17:21:42 +0000 (14:21 -0300)
refactor MFE code to allow for individual streaming configuration
for each frontend

Signed-off-by: Michael Krufky <mkrufky@kernellabs.com>
Reviewed-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
37 files changed:
drivers/media/dvb/dvb-usb/a800.c
drivers/media/dvb/dvb-usb/af9005.c
drivers/media/dvb/dvb-usb/af9015.c
drivers/media/dvb/dvb-usb/anysee.c
drivers/media/dvb/dvb-usb/au6610.c
drivers/media/dvb/dvb-usb/az6027.c
drivers/media/dvb/dvb-usb/ce6230.c
drivers/media/dvb/dvb-usb/cinergyT2-core.c
drivers/media/dvb/dvb-usb/cxusb.c
drivers/media/dvb/dvb-usb/dib0700_core.c
drivers/media/dvb/dvb-usb/dib0700_devices.c
drivers/media/dvb/dvb-usb/dibusb-common.c
drivers/media/dvb/dvb-usb/dibusb-mb.c
drivers/media/dvb/dvb-usb/dibusb-mc.c
drivers/media/dvb/dvb-usb/digitv.c
drivers/media/dvb/dvb-usb/dtt200u.c
drivers/media/dvb/dvb-usb/dtv5100.c
drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
drivers/media/dvb/dvb-usb/dvb-usb-init.c
drivers/media/dvb/dvb-usb/dvb-usb-urb.c
drivers/media/dvb/dvb-usb/dvb-usb.h
drivers/media/dvb/dvb-usb/dw2102.c
drivers/media/dvb/dvb-usb/ec168.c
drivers/media/dvb/dvb-usb/friio.c
drivers/media/dvb/dvb-usb/gl861.c
drivers/media/dvb/dvb-usb/gp8psk.c
drivers/media/dvb/dvb-usb/it913x.c
drivers/media/dvb/dvb-usb/lmedm04.c
drivers/media/dvb/dvb-usb/m920x.c
drivers/media/dvb/dvb-usb/mxl111sf.c
drivers/media/dvb/dvb-usb/nova-t-usb2.c
drivers/media/dvb/dvb-usb/opera1.c
drivers/media/dvb/dvb-usb/technisat-usb2.c
drivers/media/dvb/dvb-usb/ttusb2.c
drivers/media/dvb/dvb-usb/umt-010.c
drivers/media/dvb/dvb-usb/vp702x.c
drivers/media/dvb/dvb-usb/vp7045.c

index b95a95e..2aef3c8 100644 (file)
@@ -127,6 +127,8 @@ static struct dvb_usb_device_properties a800_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                        .pid_filter_count = 32,
                        .streaming_ctrl   = dibusb2_0_streaming_ctrl,
@@ -147,7 +149,7 @@ static struct dvb_usb_device_properties a800_properties = {
                                        }
                                }
                        },
-
+               }},
                        .size_of_priv     = sizeof(struct dibusb_state),
                },
        },
index 753b86e..0cf692c 100644 (file)
@@ -815,7 +815,7 @@ static int af9005_frontend_attach(struct dvb_usb_adapter *adap)
                        debug_dump(buf, 8, printk);
                }
        }
-       adap->fe[0] = af9005_fe_attach(adap->dev);
+       adap->fe_adap[0].fe = af9005_fe_attach(adap->dev);
        return 0;
 }
 
@@ -999,6 +999,8 @@ static struct dvb_usb_device_properties af9005_properties = {
        .num_adapters = 1,
        .adapter = {
                    {
+                   .num_frontends = 1,
+                   .fe = {{
                     .caps =
                     DVB_USB_ADAP_HAS_PID_FILTER |
                     DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -1018,6 +1020,7 @@ static struct dvb_usb_device_properties af9005_properties = {
                                               }
                                      }
                                },
+                    }},
                     }
                    },
        .power_ctrl = af9005_power_ctrl,
index b816600..c6c275b 100644 (file)
@@ -861,13 +861,13 @@ static int af9015_read_config(struct usb_device *udev)
        for (i = 0; i < af9015_properties_count; i++) {
                /* USB1.1 set smaller buffersize and disable 2nd adapter */
                if (udev->speed == USB_SPEED_FULL) {
-                       af9015_properties[i].adapter[0].stream.u.bulk.buffersize
+                       af9015_properties[i].adapter[0].fe[0].stream.u.bulk.buffersize
                                = TS_USB11_FRAME_SIZE;
                        /* disable 2nd adapter because we don't have
                           PID-filters */
                        af9015_config.dual_mode = 0;
                } else {
-                       af9015_properties[i].adapter[0].stream.u.bulk.buffersize
+                       af9015_properties[i].adapter[0].fe[0].stream.u.bulk.buffersize
                                = TS_USB20_FRAME_SIZE;
                }
        }
@@ -1113,10 +1113,10 @@ static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
        }
 
        /* attach demodulator */
-       adap->fe[0] = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
+       adap->fe_adap[0].fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
                &adap->dev->i2c_adap);
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 static struct mt2060_config af9015_mt2060_config = {
@@ -1190,49 +1190,49 @@ static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
        switch (af9015_af9013_config[adap->id].tuner) {
        case AF9013_TUNER_MT2060:
        case AF9013_TUNER_MT2060_2:
-               ret = dvb_attach(mt2060_attach, adap->fe[0], &adap->dev->i2c_adap,
+               ret = dvb_attach(mt2060_attach, adap->fe_adap[0].fe, &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[0], &adap->dev->i2c_adap,
+               ret = dvb_attach(qt1010_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
                        &af9015_qt1010_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_TDA18271:
-               ret = dvb_attach(tda18271_attach, adap->fe[0], 0xc0,
+               ret = dvb_attach(tda18271_attach, adap->fe_adap[0].fe, 0xc0,
                        &adap->dev->i2c_adap,
                        &af9015_tda18271_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_TDA18218:
-               ret = dvb_attach(tda18218_attach, adap->fe[0],
+               ret = dvb_attach(tda18218_attach, adap->fe_adap[0].fe,
                        &adap->dev->i2c_adap,
                        &af9015_tda18218_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_MXL5003D:
-               ret = dvb_attach(mxl5005s_attach, adap->fe[0],
+               ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
                        &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[0],
+               ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
                        &adap->dev->i2c_adap,
                        &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_ENV77H11D5:
-               ret = dvb_attach(dvb_pll_attach, adap->fe[0], 0xc0,
+               ret = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0xc0,
                        &adap->dev->i2c_adap,
                        DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_MC44S803:
-               ret = dvb_attach(mc44s803_attach, adap->fe[0],
+               ret = dvb_attach(mc44s803_attach, adap->fe_adap[0].fe,
                        &adap->dev->i2c_adap,
                        &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
                break;
        case AF9013_TUNER_MXL5007T:
-               ret = dvb_attach(mxl5007t_attach, adap->fe[0],
+               ret = dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
                        &adap->dev->i2c_adap,
                        0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
                break;
@@ -1306,6 +1306,8 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                .num_adapters = 2,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER |
                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
 
@@ -1321,8 +1323,11 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                                        .count = 6,
                                        .endpoint = 0x84,
                                },
+                       }},
                        },
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .frontend_attach =
                                        af9015_af9013_frontend_attach,
                                .tuner_attach    = af9015_tuner_attach,
@@ -1337,6 +1342,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                                                }
                                        }
                                },
+                       }},
                        }
                },
 
@@ -1434,6 +1440,8 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                .num_adapters = 2,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER |
                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
 
@@ -1449,8 +1457,11 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                                        .count = 6,
                                        .endpoint = 0x84,
                                },
+                       }},
                        },
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .frontend_attach =
                                        af9015_af9013_frontend_attach,
                                .tuner_attach    = af9015_tuner_attach,
@@ -1465,6 +1476,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                                                }
                                        }
                                },
+                       }},
                        }
                },
 
@@ -1551,6 +1563,8 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                .num_adapters = 2,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER |
                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
 
@@ -1566,8 +1580,11 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                                        .count = 6,
                                        .endpoint = 0x84,
                                },
+                       }},
                        },
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .frontend_attach =
                                        af9015_af9013_frontend_attach,
                                .tuner_attach    = af9015_tuner_attach,
@@ -1582,6 +1599,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                                                }
                                        }
                                },
+                       }},
                        }
                },
 
index d4d2420..5f2278b 100644 (file)
@@ -575,7 +575,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
        };
 
        /* detect hardware only once */
-       if (adap->fe[0] == NULL) {
+       if (adap->fe_adap[0].fe == NULL) {
                /* Check which hardware we have.
                 * We must do this call two times to get reliable values (hw bug).
                 */
@@ -595,7 +595,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
        }
 
        /* set current frondend ID for devices having two frondends */
-       if (adap->fe[0])
+       if (adap->fe_adap[0].fe)
                state->fe_id++;
 
        switch (state->hw) {
@@ -606,13 +606,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        break;
 
                /* attach demod */
-               adap->fe[0] = dvb_attach(mt352_attach, &anysee_mt352_config,
+               adap->fe_adap[0].fe = dvb_attach(mt352_attach, &anysee_mt352_config,
                        &adap->dev->i2c_adap);
-               if (adap->fe[0])
+               if (adap->fe_adap[0].fe)
                        break;
 
                /* attach demod */
-               adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
+               adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
                        &adap->dev->i2c_adap);
 
                break;
@@ -633,7 +633,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        goto error;
 
                /* attach demod */
-               adap->fe[0] = dvb_attach(zl10353_attach,
+               adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
                        &anysee_zl10353_config, &adap->dev->i2c_adap);
 
                break;
@@ -649,7 +649,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        goto error;
 
                /* attach demod */
-               adap->fe[0] = dvb_attach(tda10023_attach,
+               adap->fe_adap[0].fe = dvb_attach(tda10023_attach,
                        &anysee_tda10023_config, &adap->dev->i2c_adap, 0x48);
 
                break;
@@ -665,7 +665,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        goto error;
 
                /* attach demod */
-               adap->fe[0] = dvb_attach(cx24116_attach, &anysee_cx24116_config,
+               adap->fe_adap[0].fe = dvb_attach(cx24116_attach, &anysee_cx24116_config,
                        &adap->dev->i2c_adap);
 
                break;
@@ -707,13 +707,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        /* attach demod */
                        if (tmp == 0xc7) {
                                /* TDA18212 config */
-                               adap->fe[state->fe_id] = dvb_attach(
+                               adap->fe_adap[state->fe_id].fe = dvb_attach(
                                        tda10023_attach,
                                        &anysee_tda10023_tda18212_config,
                                        &adap->dev->i2c_adap, 0x48);
                        } else {
                                /* PLL config */
-                               adap->fe[state->fe_id] = dvb_attach(
+                               adap->fe_adap[state->fe_id].fe = dvb_attach(
                                        tda10023_attach,
                                        &anysee_tda10023_config,
                                        &adap->dev->i2c_adap, 0x48);
@@ -734,13 +734,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        /* attach demod */
                        if (tmp == 0xc7) {
                                /* TDA18212 config */
-                               adap->fe[state->fe_id] = dvb_attach(
+                               adap->fe_adap[state->fe_id].fe = dvb_attach(
                                        zl10353_attach,
                                        &anysee_zl10353_tda18212_config2,
                                        &adap->dev->i2c_adap);
                        } else {
                                /* PLL config */
-                               adap->fe[state->fe_id] = dvb_attach(
+                               adap->fe_adap[state->fe_id].fe = dvb_attach(
                                        zl10353_attach,
                                        &anysee_zl10353_config,
                                        &adap->dev->i2c_adap);
@@ -772,7 +772,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                                goto error;
 
                        /* attach demod */
-                       adap->fe[state->fe_id] = dvb_attach(tda10023_attach,
+                       adap->fe_adap[state->fe_id].fe = dvb_attach(tda10023_attach,
                                &anysee_tda10023_tda18212_config,
                                &adap->dev->i2c_adap, 0x48);
                } else {
@@ -789,7 +789,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                                goto error;
 
                        /* attach demod */
-                       adap->fe[state->fe_id] = dvb_attach(zl10353_attach,
+                       adap->fe_adap[state->fe_id].fe = dvb_attach(zl10353_attach,
                                &anysee_zl10353_tda18212_config,
                                &adap->dev->i2c_adap);
                }
@@ -814,13 +814,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        goto error;
 
                /* attach demod */
-               adap->fe[0] = dvb_attach(stv0900_attach, &anysee_stv0900_config,
+               adap->fe_adap[0].fe = dvb_attach(stv0900_attach, &anysee_stv0900_config,
                        &adap->dev->i2c_adap, 0);
 
                break;
        }
 
-       if (!adap->fe[0]) {
+       if (!adap->fe_adap[0].fe) {
                /* we have no frontend :-( */
                ret = -ENODEV;
                err("Unsupported Anysee version. " \
@@ -842,7 +842,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E30 */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
+               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
                        NULL, DVB_PLL_THOMSON_DTT7579);
 
                break;
@@ -850,7 +850,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E30 Plus */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
+               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
                        &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
 
                break;
@@ -858,7 +858,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E30 C Plus */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
+               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc0 >> 1),
                        &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
 
                break;
@@ -866,7 +866,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E30 S2 Plus */
 
                /* attach LNB controller */
-               fe = dvb_attach(isl6423_attach, adap->fe[0],
+               fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
                        &adap->dev->i2c_adap, &anysee_isl6423_config);
 
                break;
@@ -883,7 +883,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                        goto error;
 
                /* attach tuner */
-               fe = dvb_attach(tda18212_attach, adap->fe[state->fe_id],
+               fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
                        &adap->dev->i2c_adap, &anysee_tda18212_config);
                if (fe)
                        break;
@@ -894,7 +894,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                        goto error;
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe[state->fe_id],
+               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[state->fe_id].fe,
                        (0xc0 >> 1), &adap->dev->i2c_adap,
                        DVB_PLL_SAMSUNG_DTOS403IH102A);
 
@@ -910,7 +910,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                        goto error;
 
                /* attach tuner */
-               fe = dvb_attach(tda18212_attach, adap->fe[state->fe_id],
+               fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
                        &adap->dev->i2c_adap, &anysee_tda18212_config);
 
                break;
@@ -920,12 +920,12 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E7 PS2 */
 
                /* attach tuner */
-               fe = dvb_attach(stv6110_attach, adap->fe[0],
+               fe = dvb_attach(stv6110_attach, adap->fe_adap[0].fe,
                        &anysee_stv6110_config, &adap->dev->i2c_adap);
 
                if (fe) {
                        /* attach LNB controller */
-                       fe = dvb_attach(isl6423_attach, adap->fe[0],
+                       fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
                                &adap->dev->i2c_adap, &anysee_isl6423_config);
                }
 
@@ -1027,8 +1027,9 @@ static struct dvb_usb_device_properties anysee_properties = {
        .num_adapters = 1,
        .adapter = {
                {
-                       .num_frontends    = 2,
-                       .frontend_ctrl    = anysee_frontend_ctrl,
+               .num_frontends    = 2,
+               .frontend_ctrl    = anysee_frontend_ctrl,
+               .fe = {{
                        .streaming_ctrl   = anysee_streaming_ctrl,
                        .frontend_attach  = anysee_frontend_attach,
                        .tuner_attach     = anysee_tuner_attach,
@@ -1042,6 +1043,21 @@ static struct dvb_usb_device_properties anysee_properties = {
                                        }
                                }
                        },
+               }, {
+                       .streaming_ctrl   = anysee_streaming_ctrl,
+                       .frontend_attach  = anysee_frontend_attach,
+                       .tuner_attach     = anysee_tuner_attach,
+                       .stream = {
+                               .type = USB_BULK,
+                               .count = 8,
+                               .endpoint = 0x82,
+                               .u = {
+                                       .bulk = {
+                                               .buffersize = (16*512),
+                                       }
+                               }
+                       },
+               }},
                }
        },
 
index ebe6e1f..b779949 100644 (file)
@@ -140,9 +140,9 @@ static struct zl10353_config au6610_zl10353_config = {
 
 static int au6610_zl10353_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe[0] = dvb_attach(zl10353_attach, &au6610_zl10353_config,
+       adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &au6610_zl10353_config,
                &adap->dev->i2c_adap);
-       if (adap->fe[0] == NULL)
+       if (adap->fe_adap[0].fe == NULL)
                return -ENODEV;
 
        return 0;
@@ -155,7 +155,7 @@ static struct qt1010_config au6610_qt1010_config = {
 static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
 {
        return dvb_attach(qt1010_attach,
-                         adap->fe[0], &adap->dev->i2c_adap,
+                         adap->fe_adap[0].fe, &adap->dev->i2c_adap,
                          &au6610_qt1010_config) == NULL ? -ENODEV : 0;
 }
 
@@ -204,6 +204,8 @@ static struct dvb_usb_device_properties au6610_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach  = au6610_zl10353_frontend_attach,
                        .tuner_attach     = au6610_qt1010_tuner_attach,
 
@@ -219,6 +221,7 @@ static struct dvb_usb_device_properties au6610_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
 
index d59430c..82c5f45 100644 (file)
@@ -910,16 +910,16 @@ static int az6027_frontend_attach(struct dvb_usb_adapter *adap)
        az6027_frontend_reset(adap);
 
        deb_info("adap = %p, dev = %p\n", adap, adap->dev);
-       adap->fe[0] = stb0899_attach(&az6027_stb0899_config, &adap->dev->i2c_adap);
+       adap->fe_adap[0].fe = stb0899_attach(&az6027_stb0899_config, &adap->dev->i2c_adap);
 
-       if (adap->fe[0]) {
+       if (adap->fe_adap[0].fe) {
                deb_info("found STB0899 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb0899_config.demod_address);
-               if (stb6100_attach(adap->fe[0], &az6027_stb6100_config, &adap->dev->i2c_adap)) {
+               if (stb6100_attach(adap->fe_adap[0].fe, &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[0]->ops.set_voltage = az6027_set_voltage;
+                       adap->fe_adap[0].fe->ops.set_voltage = az6027_set_voltage;
                        az6027_ci_init(adap);
                } else {
-                       adap->fe[0] = NULL;
+                       adap->fe_adap[0].fe = NULL;
                }
        } else
                warn("no front-end attached\n");
@@ -1106,6 +1106,8 @@ static struct dvb_usb_device_properties az6027_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = az6027_streaming_ctrl,
                        .frontend_attach  = az6027_frontend_attach,
 
@@ -1120,6 +1122,7 @@ static struct dvb_usb_device_properties az6027_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
 /*
index 5655ce4..57afb5a 100644 (file)
@@ -186,9 +186,9 @@ static struct zl10353_config ce6230_zl10353_config = {
 static int ce6230_zl10353_frontend_attach(struct dvb_usb_adapter *adap)
 {
        deb_info("%s:\n", __func__);
-       adap->fe[0] = dvb_attach(zl10353_attach, &ce6230_zl10353_config,
+       adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &ce6230_zl10353_config,
                &adap->dev->i2c_adap);
-       if (adap->fe[0] == NULL)
+       if (adap->fe_adap[0].fe == NULL)
                return -ENODEV;
        return 0;
 }
@@ -214,7 +214,7 @@ static int ce6230_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
 {
        int ret;
        deb_info("%s:\n", __func__);
-       ret = dvb_attach(mxl5005s_attach, adap->fe[0], &adap->dev->i2c_adap,
+       ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
                        &ce6230_mxl5003s_config) == NULL ? -ENODEV : 0;
        return ret;
 }
@@ -273,6 +273,8 @@ static struct dvb_usb_device_properties ce6230_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach  = ce6230_zl10353_frontend_attach,
                        .tuner_attach     = ce6230_mxl5003s_tuner_attach,
                        .stream = {
@@ -285,6 +287,7 @@ static struct dvb_usb_device_properties ce6230_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
 
index 0dd42bd..f9d9050 100644 (file)
@@ -69,7 +69,7 @@ static int cinergyt2_frontend_attach(struct dvb_usb_adapter *adap)
        char state[3];
        int ret;
 
-       adap->fe[0] = cinergyt2_fe_attach(adap->dev);
+       adap->fe_adap[0].fe = cinergyt2_fe_attach(adap->dev);
 
        ret = dvb_usb_generic_rw(adap->dev, query, sizeof(query), state,
                                sizeof(state), 0);
@@ -198,6 +198,8 @@ static struct dvb_usb_device_properties cinergyt2_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cinergyt2_streaming_ctrl,
                        .frontend_attach  = cinergyt2_frontend_attach,
 
@@ -212,6 +214,7 @@ static struct dvb_usb_device_properties cinergyt2_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
 
index a76f431..7f610da 100644 (file)
@@ -347,7 +347,7 @@ static void cxusb_d680_dmb_drain_message(struct dvb_usb_device *d)
 
 static void cxusb_d680_dmb_drain_video(struct dvb_usb_device *d)
 {
-       struct usb_data_stream_properties *p = &d->props.adapter[0].stream;
+       struct usb_data_stream_properties *p = &d->props.adapter[0].fe[0].stream;
        const int timeout = 100;
        const int junk_len = p->u.bulk.buffersize;
        u8        *junk;
@@ -725,7 +725,7 @@ static struct max2165_config mygica_d689_max2165_cfg = {
 /* Callbacks for DVB USB */
 static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(simple_tuner_attach, adap->fe[0],
+       dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
                   &adap->dev->i2c_adap, 0x61,
                   TUNER_PHILIPS_FMD1216ME_MK3);
        return 0;
@@ -733,27 +733,27 @@ static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
 
 static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe[0], 0x61,
+       dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 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[0], 0x61, NULL, DVB_PLL_LG_Z201);
+       dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 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[0], 0x60,
+       dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 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[0],
+       dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
                   &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
        return 0;
 }
@@ -795,9 +795,9 @@ static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
        };
 
        /* FIXME: generalize & move to common area */
-       adap->fe[0]->callback = dvico_bluebird_xc2028_callback;
+       adap->fe_adap[0].fe->callback = dvico_bluebird_xc2028_callback;
 
-       fe = dvb_attach(xc2028_attach, adap->fe[0], &cfg);
+       fe = dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &cfg);
        if (fe == NULL || fe->ops.tuner_ops.set_config == NULL)
                return -EIO;
 
@@ -808,7 +808,7 @@ static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
 
 static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(mxl5005s_attach, adap->fe[0],
+       dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
                   &adap->dev->i2c_adap, &aver_a868r_tuner);
        return 0;
 }
@@ -816,7 +816,7 @@ static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
 static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dvb_frontend *fe;
-       fe = dvb_attach(mxl5005s_attach, adap->fe[0],
+       fe = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
                        &adap->dev->i2c_adap, &d680_dmb_tuner);
        return (fe == NULL) ? -EIO : 0;
 }
@@ -824,7 +824,7 @@ static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
 static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct dvb_frontend *fe;
-       fe = dvb_attach(max2165_attach, adap->fe[0],
+       fe = dvb_attach(max2165_attach, adap->fe_adap[0].fe,
                        &adap->dev->i2c_adap, &mygica_d689_max2165_cfg);
        return (fe == NULL) ? -EIO : 0;
 }
@@ -837,7 +837,7 @@ static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
 
        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1);
 
-       if ((adap->fe[0] = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
+       if ((adap->fe_adap[0].fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
 
@@ -851,7 +851,7 @@ static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
 
        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 
-       if ((adap->fe[0] = dvb_attach(lgdt330x_attach, &cxusb_lgdt3303_config,
+       if ((adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach, &cxusb_lgdt3303_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
 
@@ -860,9 +860,9 @@ static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
 
 static int cxusb_aver_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe[0] = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config,
+       adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config,
                              &adap->dev->i2c_adap);
-       if (adap->fe[0] != NULL)
+       if (adap->fe_adap[0].fe != NULL)
                return 0;
 
        return -EIO;
@@ -876,7 +876,7 @@ static int cxusb_mt352_frontend_attach(struct dvb_usb_adapter *adap)
 
        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 
-       if ((adap->fe[0] = dvb_attach(mt352_attach, &cxusb_mt352_config,
+       if ((adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_mt352_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
 
@@ -890,9 +890,9 @@ static int cxusb_dee1601_frontend_attach(struct dvb_usb_adapter *adap)
 
        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 
-       if (((adap->fe[0] = dvb_attach(mt352_attach, &cxusb_dee1601_config,
+       if (((adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_dee1601_config,
                                    &adap->dev->i2c_adap)) != NULL) ||
-               ((adap->fe[0] = dvb_attach(zl10353_attach,
+               ((adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
                                        &cxusb_zl10353_dee1601_config,
                                        &adap->dev->i2c_adap)) != NULL))
                return 0;
@@ -917,7 +917,7 @@ static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
        cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
        cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
 
-       if ((adap->fe[0] = dvb_attach(zl10353_attach,
+       if ((adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
                                   &cxusb_zl10353_xc3028_config_no_i2c_gate,
                                   &adap->dev->i2c_adap)) == NULL)
                return -EIO;
@@ -1031,9 +1031,9 @@ static int cxusb_dualdig4_rev2_frontend_attach(struct dvb_usb_adapter *adap)
                return -ENODEV;
        }
 
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
                              &cxusb_dualdig4_rev2_config);
-       if (adap->fe[0] == NULL)
+       if (adap->fe_adap[0].fe == NULL)
                return -EIO;
 
        return 0;
@@ -1084,15 +1084,15 @@ static int cxusb_dualdig4_rev2_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[0],
+               dib7000p_get_i2c_master(adap->fe_adap[0].fe,
                                        DIBX000_I2C_INTERFACE_TUNER, 1);
 
-       if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c,
+       if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
            &dib7070p_dib0070_config) == NULL)
                return -ENODEV;
 
-       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
-       adap->fe[0]->ops.tuner_ops.set_params = dib7070_set_param_override;
+       st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
+       adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
        return 0;
 }
 
@@ -1108,12 +1108,12 @@ static int cxusb_nano2_frontend_attach(struct dvb_usb_adapter *adap)
        cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
        cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
 
-       if ((adap->fe[0] = dvb_attach(zl10353_attach,
+       if ((adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
                                   &cxusb_zl10353_xc3028_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
 
-       if ((adap->fe[0] = dvb_attach(mt352_attach,
+       if ((adap->fe_adap[0].fe = dvb_attach(mt352_attach,
                                   &cxusb_mt352_xc3028_config,
                                   &adap->dev->i2c_adap)) != NULL)
                return 0;
@@ -1150,7 +1150,7 @@ static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
        usb_clear_halt(d->udev,
                usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
        usb_clear_halt(d->udev,
-               usb_rcvbulkpipe(d->udev, d->props.adapter[0].stream.endpoint));
+               usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
 
        /* Drain USB pipes to avoid hang after reboot */
        for (n = 0;  n < 5;  n++) {
@@ -1172,8 +1172,8 @@ static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
        msleep(100);
 
        /* Attach frontend */
-       adap->fe[0] = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap);
-       if (adap->fe[0] == NULL)
+       adap->fe_adap[0].fe = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap);
+       if (adap->fe_adap[0].fe == NULL)
                return -EIO;
 
        return 0;
@@ -1207,7 +1207,7 @@ static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
        usb_clear_halt(d->udev,
                usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
        usb_clear_halt(d->udev,
-               usb_rcvbulkpipe(d->udev, d->props.adapter[0].stream.endpoint));
+               usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
 
 
        /* Reset the tuner */
@@ -1223,9 +1223,9 @@ static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
        msleep(100);
 
        /* Attach frontend */
-       adap->fe[0] = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
+       adap->fe_adap[0].fe = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
                &d->i2c_adap);
-       if (adap->fe[0] == NULL)
+       if (adap->fe_adap[0].fe == NULL)
                return -EIO;
 
        return 0;
@@ -1383,6 +1383,8 @@ static struct dvb_usb_device_properties cxusb_medion_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_streaming_ctrl,
                        .frontend_attach  = cxusb_cx22702_frontend_attach,
                        .tuner_attach     = cxusb_fmd1216me_tuner_attach,
@@ -1397,7 +1399,7 @@ static struct dvb_usb_device_properties cxusb_medion_properties = {
                                        }
                                }
                        },
-
+               }},
                },
        },
        .power_ctrl       = cxusb_power_ctrl,
@@ -1429,6 +1431,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_streaming_ctrl,
                        .frontend_attach  = cxusb_lgdt3303_frontend_attach,
                        .tuner_attach     = cxusb_lgh064f_tuner_attach,
@@ -1444,6 +1448,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
                                        }
                                }
                        },
+               }},
                },
        },
 
@@ -1483,6 +1488,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_streaming_ctrl,
                        .frontend_attach  = cxusb_dee1601_frontend_attach,
                        .tuner_attach     = cxusb_dee1601_tuner_attach,
@@ -1497,6 +1504,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
                                        }
                                }
                        },
+               }},
                },
        },
 
@@ -1544,6 +1552,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
        .num_adapters = 2,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_streaming_ctrl,
                        .frontend_attach  = cxusb_mt352_frontend_attach,
                        .tuner_attach     = cxusb_lgz201_tuner_attach,
@@ -1559,6 +1569,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
                                        }
                                }
                        },
+               }},
                },
        },
        .power_ctrl       = cxusb_bluebird_power_ctrl,
@@ -1596,6 +1607,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_streaming_ctrl,
                        .frontend_attach  = cxusb_mt352_frontend_attach,
                        .tuner_attach     = cxusb_dtt7579_tuner_attach,
@@ -1611,6 +1624,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
                                        }
                                }
                        },
+               }},
                },
        },
        .power_ctrl       = cxusb_bluebird_power_ctrl,
@@ -1645,6 +1659,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_streaming_ctrl,
                        .frontend_attach  = cxusb_dualdig4_frontend_attach,
                        .tuner_attach     = cxusb_dvico_xc3028_tuner_attach,
@@ -1659,6 +1675,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
                                        }
                                }
                        },
+               }},
                },
        },
 
@@ -1695,6 +1712,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_streaming_ctrl,
                        .frontend_attach  = cxusb_nano2_frontend_attach,
                        .tuner_attach     = cxusb_dvico_xc3028_tuner_attach,
@@ -1709,6 +1728,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
                                        }
                                }
                        },
+               }},
                },
        },
 
@@ -1747,6 +1767,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_prope
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_streaming_ctrl,
                        .frontend_attach  = cxusb_nano2_frontend_attach,
                        .tuner_attach     = cxusb_dvico_xc3028_tuner_attach,
@@ -1761,6 +1783,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_prope
                                        }
                                }
                        },
+               }},
                },
        },
 
@@ -1796,6 +1819,8 @@ static struct dvb_usb_device_properties cxusb_aver_a868r_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_aver_streaming_ctrl,
                        .frontend_attach  = cxusb_aver_lgdt3303_frontend_attach,
                        .tuner_attach     = cxusb_mxl5003s_tuner_attach,
@@ -1810,7 +1835,7 @@ static struct dvb_usb_device_properties cxusb_aver_a868r_properties = {
                                        }
                                }
                        },
-
+               }},
                },
        },
        .power_ctrl       = cxusb_aver_power_ctrl,
@@ -1839,10 +1864,12 @@ struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .size_of_priv    = sizeof(struct dib0700_adapter_state),
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl  = cxusb_streaming_ctrl,
                        .frontend_attach = cxusb_dualdig4_rev2_frontend_attach,
                        .tuner_attach    = cxusb_dualdig4_rev2_tuner_attach,
-                       .size_of_priv    = sizeof(struct dib0700_adapter_state),
                        /* parameter for the MPEG2-data transfer */
                        .stream = {
                                .type = USB_BULK,
@@ -1854,6 +1881,7 @@ struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
                                        }
                                }
                        },
+               }},
                },
        },
 
@@ -1889,6 +1917,8 @@ static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_d680_dmb_streaming_ctrl,
                        .frontend_attach  = cxusb_d680_dmb_frontend_attach,
                        .tuner_attach     = cxusb_d680_dmb_tuner_attach,
@@ -1904,6 +1934,7 @@ static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
                                        }
                                }
                        },
+               }},
                },
        },
 
@@ -1940,6 +1971,8 @@ static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = cxusb_d680_dmb_streaming_ctrl,
                        .frontend_attach  = cxusb_mygica_d689_frontend_attach,
                        .tuner_attach     = cxusb_mygica_d689_tuner_attach,
@@ -1955,6 +1988,7 @@ static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
                                        }
                                }
                        },
+               }},
                },
        },
 
index b693ed1..156cbfc 100644 (file)
@@ -528,13 +528,13 @@ int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw
                for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters;
                                adap_num++) {
                        if (fw_version >= 0x10201) {
-                               dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = 188*nb_packet_buffer_size;
+                               dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 188*nb_packet_buffer_size;
                        } else {
                                /* for fw version older than 1.20.1,
                                 * the buffersize has to be n times 512 */
-                               dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
-                               if (dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize < 512)
-                                       dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = 512;
+                               dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
+                               if (dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize < 512)
+                                       dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 512;
                        }
                }
        }
@@ -579,18 +579,18 @@ int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
        deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id);
 
        st->channel_state &= ~0x3;
-       if ((adap->stream.props.endpoint != 2)
-                       && (adap->stream.props.endpoint != 3)) {
-               deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->stream.props.endpoint);
+       if ((adap->fe_adap[0].stream.props.endpoint != 2)
+                       && (adap->fe_adap[0].stream.props.endpoint != 3)) {
+               deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->fe_adap[0].stream.props.endpoint);
                if (onoff)
                        st->channel_state |=    1 << (adap->id);
                else
                        st->channel_state |=    1 << ~(adap->id);
        } else {
                if (onoff)
-                       st->channel_state |=    1 << (adap->stream.props.endpoint-2);
+                       st->channel_state |=    1 << (adap->fe_adap[0].stream.props.endpoint-2);
                else
-                       st->channel_state |=    1 << (3-adap->stream.props.endpoint);
+                       st->channel_state |=    1 << (3-adap->fe_adap[0].stream.props.endpoint);
        }
 
        st->buf[2] |= st->channel_state;
index 754f8ec..3ed6203 100644 (file)
@@ -101,7 +101,7 @@ static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
                }
        }
        st->mt2060_if1[adap->id] = 1220;
-       return (adap->fe[0] = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
+       return (adap->fe_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
                (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
 }
 
@@ -118,14 +118,14 @@ static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
 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[0], 1);
+       struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe_adap[0].fe, 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[0], tun_i2c,&bristol_mt2060_config[adap->id],
+       return dvb_attach(mt2060_attach,adap->fe_adap[0].fe, tun_i2c,&bristol_mt2060_config[adap->id],
                if1) == NULL ? -ENODEV : 0;
 }
 
@@ -279,10 +279,10 @@ static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
                }
        }
 
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
                                &stk7700d_dib7000p_mt2266_config[adap->id]);
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
@@ -306,17 +306,17 @@ static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
                }
        }
 
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
                                &stk7700d_dib7000p_mt2266_config[adap->id]);
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == 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[0], DIBX000_I2C_INTERFACE_TUNER, 1);
-       return dvb_attach(mt2266_attach, adap->fe[0], tun_i2c,
+       tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
+       return dvb_attach(mt2266_attach, adap->fe_adap[0].fe, tun_i2c,
                &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
 }
 
@@ -396,8 +396,8 @@ static int stk7700ph_xc3028_callback(void *ptr, int component,
        switch (command) {
        case XC2028_TUNER_RESET:
                /* Send the tuner in then out of reset */
-               dib7000p_set_gpio(adap->fe[0], 8, 0, 0); msleep(10);
-               dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
+               dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 0); msleep(10);
+               dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
                break;
        case XC2028_RESET_CLK:
                break;
@@ -447,25 +447,25 @@ static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
                return -ENODEV;
        }
 
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
                &stk7700ph_dib7700_xc3028_config);
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == 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[0],
+       tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe,
                DIBX000_I2C_INTERFACE_TUNER, 1);
 
        stk7700ph_xc3028_config.i2c_adap = tun_i2c;
 
        /* FIXME: generalize & move to common area */
-       adap->fe[0]->callback = stk7700ph_xc3028_callback;
+       adap->fe_adap[0].fe->callback = stk7700ph_xc3028_callback;
 
-       return dvb_attach(xc2028_attach, adap->fe[0], &stk7700ph_xc3028_config)
+       return dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &stk7700ph_xc3028_config)
                == NULL ? -ENODEV : 0;
 }
 
@@ -685,12 +685,12 @@ static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
        st->mt2060_if1[0] = 1220;
 
        if (dib7000pc_detection(&adap->dev->i2c_adap)) {
-               adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
+               adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
                st->is_dib7000pc = 1;
        } else
-               adap->fe[0] = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
+               adap->fe_adap[0].fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 static struct mt2060_config stk7700p_mt2060_config = {
@@ -709,11 +709,11 @@ static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
                if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
        }
        if (st->is_dib7000pc)
-               tun_i2c = dib7000p_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1);
+               tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
        else
-               tun_i2c = dib7000m_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1);
+               tun_i2c = dib7000m_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
 
-       return dvb_attach(mt2060_attach, adap->fe[0], tun_i2c, &stk7700p_mt2060_config,
+       return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, &stk7700p_mt2060_config,
                if1) == NULL ? -ENODEV : 0;
 }
 
@@ -843,33 +843,33 @@ static int dib7770_set_param_override(struct dvb_frontend *fe,
 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[0],
+        struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe,
                         DIBX000_I2C_INTERFACE_TUNER, 1);
 
-        if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c,
+        if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
                                 &dib7770p_dib0070_config) == NULL)
                 return -ENODEV;
 
-        st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
-        adap->fe[0]->ops.tuner_ops.set_params = dib7770_set_param_override;
+        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
+        adap->fe_adap[0].fe->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[0], DIBX000_I2C_INTERFACE_TUNER, 1);
+       struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
 
        if (adap->id == 0) {
-               if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
+               if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
                        return -ENODEV;
        } else {
-               if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
+               if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
                        return -ENODEV;
        }
 
-       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
-       adap->fe[0]->ops.tuner_ops.set_params = dib7070_set_param_override;
+       st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
+       adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
        return 0;
 }
 
@@ -878,26 +878,26 @@ static int stk7700p_pid_filter(struct dvb_usb_adapter *adapter, int index,
 {
        struct dib0700_state *st = adapter->dev->priv;
        if (st->is_dib7000pc)
-               return dib7000p_pid_filter(adapter->fe[0], index, pid, onoff);
-       return dib7000m_pid_filter(adapter->fe[0], index, pid, onoff);
+               return dib7000p_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
+       return dib7000m_pid_filter(adapter->fe_adap[0].fe, 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[0], onoff);
-       return dib7000m_pid_filter_ctrl(adapter->fe[0], onoff);
+               return dib7000p_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
+       return dib7000m_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
 }
 
 static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
 {
-    return dib7000p_pid_filter(adapter->fe[0], index, pid, onoff);
+    return dib7000p_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
 }
 
 static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
 {
-    return dib7000p_pid_filter_ctrl(adapter->fe[0], onoff);
+    return dib7000p_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
 }
 
 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
@@ -955,9 +955,9 @@ static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
                return -ENODEV;
        }
 
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
                &dib7070p_dib7000p_config);
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 /* STK7770P */
@@ -1007,9 +1007,9 @@ static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap)
                return -ENODEV;
        }
 
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
                &dib7770p_dib7000p_config);
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 /* DIB807x generic */
@@ -1225,34 +1225,34 @@ static int dib807x_set_param_override(struct dvb_frontend *fe,
 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[0],
+       struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe_adap[0].fe,
                        DIBX000_I2C_INTERFACE_TUNER, 1);
 
        if (adap->id == 0) {
-               if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c,
+               if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
                                &dib807x_dib0070_config[0]) == NULL)
                        return -ENODEV;
        } else {
-               if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c,
+               if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
                                &dib807x_dib0070_config[1]) == NULL)
                        return -ENODEV;
        }
 
-       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
-       adap->fe[0]->ops.tuner_ops.set_params = dib807x_set_param_override;
+       st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
+       adap->fe_adap[0].fe->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[0], index, pid, onoff);
+       return dib8000_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
 }
 
 static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter,
                int onoff)
 {
-       return dib8000_pid_filter_ctrl(adapter->fe[0], onoff);
+       return dib8000_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
 }
 
 /* STK807x */
@@ -1276,10 +1276,10 @@ static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
        dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
                                0x80);
 
-       adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
                              &dib807x_dib8000_config[0]);
 
-       return adap->fe[0] == NULL ?  -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
 }
 
 /* STK807xPVR */
@@ -1305,10 +1305,10 @@ static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
        /* initialize IC 0 */
        dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80);
 
-       adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
+       adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
                              &dib807x_dib8000_config[0]);
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
@@ -1316,10 +1316,10 @@ 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[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
+       adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
                              &dib807x_dib8000_config[1]);
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 /* STK8096GP */
@@ -1546,13 +1546,13 @@ static int dib8096_set_param_override(struct dvb_frontend *fe,
 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[0], DIBX000_I2C_INTERFACE_TUNER, 1);
+       struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
 
-       if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &dib809x_dib0090_config) == NULL)
+       if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
                return -ENODEV;
 
-       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
-       adap->fe[0]->ops.tuner_ops.set_params = dib8096_set_param_override;
+       st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
+       adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
        return 0;
 }
 
@@ -1575,30 +1575,30 @@ static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
 
        dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80);
 
-       adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
+       adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
 
-       return adap->fe[0] == NULL ?  -ENODEV : 0;
+       return adap->fe_adap[0].fe == 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[0], 1);
+       struct dvb_frontend *fe_slave  = dib8000_get_slave_frontend(adap->fe_adap[0].fe, 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[0]->dvb;
+               fe_slave->dvb = adap->fe_adap[0].fe->dvb;
                fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override;
        }
-       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)
+       tun_i2c = dib8000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
+       if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
                return -ENODEV;
 
-       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
-       adap->fe[0]->ops.tuner_ops.set_params = dib8096_set_param_override;
+       st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
+       adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
 
        return 0;
 }
@@ -1626,12 +1626,12 @@ static int nim8096md_frontend_attach(struct dvb_usb_adapter *adap)
 
        dib8000_i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80);
 
-       adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
-       if (adap->fe[0] == NULL)
+       adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
+       if (adap->fe_adap[0].fe == NULL)
                return -ENODEV;
 
        fe_slave = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
-       dib8000_set_slave_frontend(adap->fe[0], fe_slave);
+       dib8000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
 
        return fe_slave == NULL ?  -ENODEV : 0;
 }
@@ -1639,12 +1639,12 @@ static int nim8096md_frontend_attach(struct dvb_usb_adapter *adap)
 /* STK9090M */
 static int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
 {
-       return dib9000_fw_pid_filter(adapter->fe[0], index, pid, onoff);
+       return dib9000_fw_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
 }
 
 static int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
 {
-       return dib9000_fw_pid_filter_ctrl(adapter->fe[0], onoff);
+       return dib9000_fw_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
 }
 
 static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff)
@@ -1856,15 +1856,15 @@ static int stk9090m_frontend_attach(struct dvb_usb_adapter *adap)
        stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size;
        stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data;
 
-       adap->fe[0] = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config);
+       adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config);
 
-       return adap->fe[0] == NULL ?  -ENODEV : 0;
+       return adap->fe_adap[0].fe == 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[0]);
+       struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
        u16 data_dib190[10] = {
                1, 0x1374,
                2, 0x01a2,
@@ -1873,13 +1873,13 @@ static int dib9090_tuner_attach(struct dvb_usb_adapter *adap)
                8, 0x0486,
        };
 
-       if (dvb_attach(dib0090_fw_register, adap->fe[0], i2c, &dib9090_dib0090_config) == NULL)
+       if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL)
                return -ENODEV;
-       i2c = dib9000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
+       i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, 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]) < 0)
+       if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
                return -ENODEV;
        release_firmware(state->frontend_firmware);
        return 0;
@@ -1925,16 +1925,16 @@ static int nim9090md_frontend_attach(struct dvb_usb_adapter *adap)
        nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data;
 
        dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80);
-       adap->fe[0] = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]);
+       adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]);
 
-       if (adap->fe[0] == NULL)
+       if (adap->fe_adap[0].fe == NULL)
                return -ENODEV;
 
-       i2c = dib9000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_GPIO_3_4, 0);
+       i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, 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[0], fe_slave);
+       dib9000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
 
        return fe_slave == NULL ?  -ENODEV : 0;
 }
@@ -1951,26 +1951,26 @@ static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap)
                0, 0x00ef,
                8, 0x0406,
        };
-       i2c = dib9000_get_tuner_interface(adap->fe[0]);
-       if (dvb_attach(dib0090_fw_register, adap->fe[0], i2c, &nim9090md_dib0090_config[0]) == NULL)
+       i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
+       if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL)
                return -ENODEV;
-       i2c = dib9000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
+       i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, 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]) < 0)
+       if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
                return -ENODEV;
 
-       fe_slave = dib9000_get_slave_frontend(adap->fe[0], 1);
+       fe_slave = dib9000_get_slave_frontend(adap->fe_adap[0].fe, 1);
        if (fe_slave != NULL) {
-               i2c = dib9000_get_component_bus_interface(adap->fe[0]);
+               i2c = dib9000_get_component_bus_interface(adap->fe_adap[0].fe);
                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[0]->dvb;
-               dib9000_fw_set_component_bus_speed(adap->fe[0], 2000);
+               fe_slave->dvb = adap->fe_adap[0].fe->dvb;
+               dib9000_fw_set_component_bus_speed(adap->fe_adap[0].fe, 2000);
                if (dib9000_firmware_post_pll_init(fe_slave) < 0)
                        return -ENODEV;
        }
@@ -2393,23 +2393,23 @@ static int nim7090_frontend_attach(struct dvb_usb_adapter *adap)
                err("%s: dib7000p_i2c_enumeration failed.  Cannot continue\n", __func__);
                return -ENODEV;
        }
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
 
-       return adap->fe[0] == NULL ?  -ENODEV : 0;
+       return adap->fe_adap[0].fe == 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[0]);
+       struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe_adap[0].fe);
 
-       if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &nim7090_dib0090_config) == NULL)
+       if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &nim7090_dib0090_config) == NULL)
                return -ENODEV;
 
-       dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
+       dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
 
-       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
-       adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup;
+       st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
+       adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
        return 0;
 }
 
@@ -2439,11 +2439,11 @@ static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
        }
 
        dib0700_set_i2c_speed(adap->dev, 340);
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
-       if (adap->fe[0] == NULL)
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
+       if (adap->fe_adap[0].fe == NULL)
                return -ENODEV;
 
-       dib7090_slave_reset(adap->fe[0]);
+       dib7090_slave_reset(adap->fe_adap[0].fe);
 
        return 0;
 }
@@ -2452,50 +2452,50 @@ static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap)
 {
        struct i2c_adapter *i2c;
 
-       if (adap->dev->adapter[0].fe[0] == NULL) {
+       if (adap->dev->adapter[0].fe_adap[0].fe == 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[0], DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
+       i2c = dib7000p_get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, 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[0] = dvb_attach(dib7000p_attach, i2c, 0x92, &tfe7090pvr_dib7000p_config[1]);
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, i2c, 0x92, &tfe7090pvr_dib7000p_config[1]);
        dib0700_set_i2c_speed(adap->dev, 200);
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == 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[0]);
+       struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe_adap[0].fe);
 
-       if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL)
+       if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL)
                return -ENODEV;
 
-       dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
+       dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
 
-       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
-       adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup;
+       st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
+       adap->fe_adap[0].fe->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[0]);
+       struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe_adap[0].fe);
 
-       if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL)
+       if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL)
                return -ENODEV;
 
-       dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
+       dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
 
-       st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params;
-       adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup;
+       st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
+       adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
        return 0;
 }
 
@@ -2555,14 +2555,14 @@ static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
                return -ENODEV;
        }
 
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
 {
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 /* S5H1411 */
@@ -2617,9 +2617,9 @@ static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
        dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
 
        /* GPIOs are initialized, do the attach */
-       adap->fe[0] = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
+       adap->fe_adap[0].fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
                              &adap->dev->i2c_adap);
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 static int dib0700_xc5000_tuner_callback(void *priv, int component,
@@ -2649,9 +2649,9 @@ static struct xc5000_config s5h1411_xc5000_tunerconfig = {
 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
 {
        /* FIXME: generalize & move to common area */
-       adap->fe[0]->callback = dib0700_xc5000_tuner_callback;
+       adap->fe_adap[0].fe->callback = dib0700_xc5000_tuner_callback;
 
-       return dvb_attach(xc5000_attach, adap->fe[0], &adap->dev->i2c_adap,
+       return dvb_attach(xc5000_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
                          &s5h1411_xc5000_tunerconfig)
                == NULL ? -ENODEV : 0;
 }
@@ -2663,9 +2663,9 @@ static int dib0700_xc4000_tuner_callback(void *priv, int component,
 
        if (command == XC4000_TUNER_RESET) {
                /* Reset the tuner */
-               dib7000p_set_gpio(adap->fe[0], 8, 0, 0);
+               dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 0);
                msleep(10);
-               dib7000p_set_gpio(adap->fe[0], 8, 0, 1);
+               dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
        } else {
                err("xc4000: unknown tuner callback command: %d\n", command);
                return -EINVAL;
@@ -2771,11 +2771,11 @@ static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap)
                return -ENODEV;
        }
 
-       adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x12,
+       adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x12,
                              &pctv_340e_config);
        st->is_dib7000pc = 1;
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 static struct xc4000_config dib7000p_xc4000_tunerconfig = {
@@ -2791,7 +2791,7 @@ static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
        struct i2c_adapter *tun_i2c;
 
        /* The xc4000 is not on the main i2c bus */
-       tun_i2c = dib7000p_get_i2c_master(adap->fe[0],
+       tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe,
                                          DIBX000_I2C_INTERFACE_TUNER, 1);
        if (tun_i2c == NULL) {
                printk(KERN_ERR "Could not reach tuner i2c bus\n");
@@ -2799,9 +2799,9 @@ static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
        }
 
        /* Setup the reset callback */
-       adap->fe[0]->callback = dib0700_xc4000_tuner_callback;
+       adap->fe_adap[0].fe->callback = dib0700_xc4000_tuner_callback;
 
-       return dvb_attach(xc4000_attach, adap->fe[0], tun_i2c,
+       return dvb_attach(xc4000_attach, adap->fe_adap[0].fe, tun_i2c,
                          &dib7000p_xc4000_tunerconfig)
                == NULL ? -ENODEV : 0;
 }
@@ -2857,16 +2857,16 @@ static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
        dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
        msleep(30);
 
-       adap->fe[0] = dvb_attach(lgdt3305_attach,
+       adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach,
                              &hcw_lgdt3305_config,
                              &adap->dev->i2c_adap);
 
-       return adap->fe[0] == NULL ? -ENODEV : 0;
+       return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       return dvb_attach(mxl5007t_attach, adap->fe[0],
+       return dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
                          &adap->dev->i2c_adap, 0x60,
                          &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
 }
@@ -2989,6 +2989,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk7700p_pid_filter,
@@ -2997,6 +2999,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = stk7700p_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
+                       }},
                        },
                },
 
@@ -3050,15 +3053,21 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 2,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .frontend_attach  = bristol_frontend_attach,
                                .tuner_attach     = bristol_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
+                       }},
                        }, {
+                       .num_frontends = 1,
+                       .fe = {{
                                .frontend_attach  = bristol_frontend_attach,
                                .tuner_attach     = bristol_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
+                       }},
                        }
                },
 
@@ -3084,6 +3093,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 2,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3092,7 +3103,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = stk7700d_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
+                       }},
                        }, {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3101,6 +3115,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = stk7700d_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
+                       }},
                        }
                },
 
@@ -3143,6 +3158,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3151,6 +3168,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = stk7700d_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
+                       }},
                        },
                },
 
@@ -3185,6 +3203,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3193,7 +3213,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib7070p_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv     = sizeof(struct dib0700_adapter_state),
                        },
                },
@@ -3261,6 +3281,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3269,7 +3291,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib7070p_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv     = sizeof(struct dib0700_adapter_state),
                        },
                },
@@ -3305,6 +3327,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 2,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3313,9 +3337,11 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib7070p_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv     = sizeof(struct dib0700_adapter_state),
                        }, {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3324,7 +3350,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib7070p_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
-
+                       }},
                                .size_of_priv     = sizeof(struct dib0700_adapter_state),
                        }
                },
@@ -3373,6 +3399,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 2,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3381,9 +3409,11 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib7070p_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv     = sizeof(struct dib0700_adapter_state),
                        }, {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3392,7 +3422,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib7070p_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
-
+                       }},
                                .size_of_priv     = sizeof(struct dib0700_adapter_state),
                        }
                },
@@ -3420,6 +3450,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3428,7 +3460,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = stk7700ph_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv = sizeof(struct
                                                dib0700_adapter_state),
                        },
@@ -3488,11 +3520,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .frontend_attach  = s5h1411_frontend_attach,
                                .tuner_attach     = xc5000_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv = sizeof(struct
                                                dib0700_adapter_state),
                        },
@@ -3524,11 +3558,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .frontend_attach  = lgdt3305_frontend_attach,
                                .tuner_attach     = mxl5007t_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv = sizeof(struct
                                                dib0700_adapter_state),
                        },
@@ -3550,6 +3586,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter       = stk70x0p_pid_filter,
@@ -3558,7 +3596,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib7770p_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
@@ -3600,6 +3638,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter = stk80xx_pid_filter,
@@ -3608,7 +3648,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib807x_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
@@ -3644,6 +3684,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 2,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter = stk80xx_pid_filter,
@@ -3652,11 +3694,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib807x_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
                                .pid_filter = stk80xx_pid_filter,
@@ -3665,7 +3709,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib807x_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
@@ -3693,6 +3737,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
@@ -3702,7 +3748,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib809x_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
@@ -3730,6 +3776,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
@@ -3739,7 +3787,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = dib9090_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
@@ -3767,6 +3815,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
@@ -3776,7 +3826,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = nim8096md_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
@@ -3804,6 +3854,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
@@ -3813,7 +3865,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = nim9090md_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
@@ -3841,6 +3893,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
@@ -3850,7 +3904,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = nim7090_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
@@ -3878,6 +3932,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 2,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
@@ -3887,11 +3943,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = tfe7090pvr_tuner0_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
                                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                                .pid_filter_count = 32,
@@ -3901,7 +3959,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                                .tuner_attach     = tfe7090pvr_tuner1_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv =
                                        sizeof(struct dib0700_adapter_state),
                        },
@@ -3929,11 +3987,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
                .num_adapters = 1,
                .adapter = {
                        {
+                       .num_frontends = 1,
+                       .fe = {{
                                .frontend_attach  = pctv340e_frontend_attach,
                                .tuner_attach     = xc4000_tuner_attach,
 
                                DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
-
+                       }},
                                .size_of_priv = sizeof(struct
                                                dib0700_adapter_state),
                        },
index 263235e..735e914 100644 (file)
@@ -23,7 +23,7 @@ int dibusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
        if (adap->priv != NULL) {
                struct dibusb_state *st = adap->priv;
                if (st->ops.fifo_ctrl != NULL)
-                       if (st->ops.fifo_ctrl(adap->fe[0],onoff)) {
+                       if (st->ops.fifo_ctrl(adap->fe_adap[0].fe,onoff)) {
                                err("error while controlling the fifo of the demod.");
                                return -ENODEV;
                        }
@@ -37,7 +37,7 @@ int dibusb_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onof
        if (adap->priv != NULL) {
                struct dibusb_state *st = adap->priv;
                if (st->ops.pid_ctrl != NULL)
-                       st->ops.pid_ctrl(adap->fe[0],index,pid,onoff);
+                       st->ops.pid_ctrl(adap->fe_adap[0].fe,index,pid,onoff);
        }
        return 0;
 }
@@ -48,7 +48,7 @@ int dibusb_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
        if (adap->priv != NULL) {
                struct dibusb_state *st = adap->priv;
                if (st->ops.pid_parse != NULL)
-                       if (st->ops.pid_parse(adap->fe[0],onoff) < 0)
+                       if (st->ops.pid_parse(adap->fe_adap[0].fe,onoff) < 0)
                                err("could not handle pid_parser");
        }
        return 0;
@@ -254,8 +254,8 @@ int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *adap)
                msleep(1000);
        }
 
-       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->fe_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000P_I2C_ADDRESS,  &mod3000p_dib3000p_config)) != NULL ||
+               (adap->fe_adap[0].fe = 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;
@@ -309,15 +309,15 @@ int dibusb_dib3000mc_tuner_attach(struct dvb_usb_adapter *adap)
                }
        }
 
-       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) {
+       tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe_adap[0].fe, 1);
+       if (dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, &stk3000p_mt2060_config, if1) == NULL) {
                /* not found - use panasonic pll parameters */
-               if (dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, tun_i2c, DVB_PLL_ENV57H1XD5) == NULL)
+               if (dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 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[0], &stk3000p_dib3000p_config);
+               dib3000mc_set_config(adap->fe_adap[0].fe, &stk3000p_dib3000p_config);
        }
        return 0;
 }
index c653b32..f13b3a3 100644 (file)
@@ -31,11 +31,11 @@ static int dibusb_dib3000mb_frontend_attach(struct dvb_usb_adapter *adap)
 
        demod_cfg.demod_address = 0x8;
 
-       if ((adap->fe[0] = dvb_attach(dib3000mb_attach, &demod_cfg,
+       if ((adap->fe_adap[0].fe = dvb_attach(dib3000mb_attach, &demod_cfg,
                                   &adap->dev->i2c_adap, &st->ops)) == NULL)
                return -ENODEV;
 
-       adap->fe[0]->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl;
+       adap->fe_adap[0].fe->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl;
 
        return 0;
 }
@@ -46,7 +46,7 @@ static int dibusb_thomson_tuner_attach(struct dvb_usb_adapter *adap)
 
        st->tuner_addr = 0x61;
 
-       dvb_attach(dvb_pll_attach, adap->fe[0], 0x61, &adap->dev->i2c_adap,
+       dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, &adap->dev->i2c_adap,
                   DVB_PLL_TUA6010XS);
        return 0;
 }
@@ -57,7 +57,7 @@ static int dibusb_panasonic_tuner_attach(struct dvb_usb_adapter *adap)
 
        st->tuner_addr = 0x60;
 
-       dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, &adap->dev->i2c_adap,
+       dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60, &adap->dev->i2c_adap,
                   DVB_PLL_TDA665X);
        return 0;
 }
@@ -78,16 +78,16 @@ static int dibusb_tuner_probe_and_attach(struct dvb_usb_adapter *adap)
        /* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */
        msg[0].addr = msg[1].addr = st->tuner_addr = 0x60;
 
-       if (adap->fe[0]->ops.i2c_gate_ctrl)
-               adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0],1);
+       if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl)
+               adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe,1);
 
        if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) {
                err("tuner i2c write failed.");
                ret = -EREMOTEIO;
        }
 
-       if (adap->fe[0]->ops.i2c_gate_ctrl)
-               adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0],0);
+       if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl)
+               adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe,0);
 
        if (b2[0] == 0xfe) {
                info("This device has the Thomson Cable onboard. Which is default.");
@@ -185,6 +185,8 @@ static struct dvb_usb_device_properties dibusb1_1_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                        .pid_filter_count = 16,
 
@@ -205,6 +207,7 @@ static struct dvb_usb_device_properties dibusb1_1_properties = {
                                        }
                                }
                        },
+               }},
                        .size_of_priv     = sizeof(struct dibusb_state),
                }
        },
@@ -272,6 +275,8 @@ static struct dvb_usb_device_properties dibusb1_1_an2235_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_ADAP_HAS_PID_FILTER,
                        .pid_filter_count = 16,
 
@@ -292,6 +297,7 @@ static struct dvb_usb_device_properties dibusb1_1_an2235_properties = {
                                        }
                                }
                        },
+               }},
                        .size_of_priv     = sizeof(struct dibusb_state),
                },
        },
@@ -338,6 +344,8 @@ static struct dvb_usb_device_properties dibusb2_0b_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                        .pid_filter_count = 16,
 
@@ -358,6 +366,7 @@ static struct dvb_usb_device_properties dibusb2_0b_properties = {
                                        }
                                }
                        },
+               }},
                        .size_of_priv     = sizeof(struct dibusb_state),
                }
        },
@@ -398,6 +407,8 @@ static struct dvb_usb_device_properties artec_t1_usb2_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                        .pid_filter_count = 16,
 
@@ -417,6 +428,7 @@ static struct dvb_usb_device_properties artec_t1_usb2_properties = {
                                        }
                                }
                        },
+               }},
                        .size_of_priv     = sizeof(struct dibusb_state),
                }
        },
index c1d9094..9c165e2 100644 (file)
@@ -57,6 +57,8 @@ static struct dvb_usb_device_properties dibusb_mc_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                        .pid_filter_count = 32,
                        .streaming_ctrl   = dibusb2_0_streaming_ctrl,
@@ -76,6 +78,7 @@ static struct dvb_usb_device_properties dibusb_mc_properties = {
                                        }
                                }
                        },
+               }},
                        .size_of_priv     = sizeof(struct dibusb_state),
                }
        },
index 1e17d15..edabdae 100644 (file)
@@ -137,11 +137,11 @@ static int digitv_frontend_attach(struct dvb_usb_adapter *adap)
 {
        struct digitv_state *st = adap->dev->priv;
 
-       if ((adap->fe[0] = dvb_attach(mt352_attach, &digitv_mt352_config, &adap->dev->i2c_adap)) != NULL) {
+       if ((adap->fe_adap[0].fe = dvb_attach(mt352_attach, &digitv_mt352_config, &adap->dev->i2c_adap)) != NULL) {
                st->is_nxt6000 = 0;
                return 0;
        }
-       if ((adap->fe[0] = dvb_attach(nxt6000_attach, &digitv_nxt6000_config, &adap->dev->i2c_adap)) != NULL) {
+       if ((adap->fe_adap[0].fe = dvb_attach(nxt6000_attach, &digitv_nxt6000_config, &adap->dev->i2c_adap)) != NULL) {
                st->is_nxt6000 = 1;
                return 0;
        }
@@ -152,11 +152,11 @@ static int digitv_tuner_attach(struct dvb_usb_adapter *adap)
 {
        struct digitv_state *st = adap->dev->priv;
 
-       if (!dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, NULL, DVB_PLL_TDED4))
+       if (!dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60, NULL, DVB_PLL_TDED4))
                return -ENODEV;
 
        if (st->is_nxt6000)
-               adap->fe[0]->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params;
+               adap->fe_adap[0].fe->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params;
 
        return 0;
 }
@@ -292,6 +292,8 @@ static struct dvb_usb_device_properties digitv_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach  = digitv_frontend_attach,
                        .tuner_attach     = digitv_tuner_attach,
 
@@ -306,6 +308,7 @@ static struct dvb_usb_device_properties digitv_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .identify_state   = digitv_identify_state,
index ea2a46f..106dfd5 100644 (file)
@@ -90,7 +90,7 @@ static int dtt200u_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
 
 static int dtt200u_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe[0] = dtt200u_fe_attach(adap->dev);
+       adap->fe_adap[0].fe = dtt200u_fe_attach(adap->dev);
        return 0;
 }
 
@@ -140,6 +140,8 @@ static struct dvb_usb_device_properties dtt200u_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
                        .pid_filter_count = 15,
 
@@ -157,6 +159,7 @@ static struct dvb_usb_device_properties dtt200u_properties = {
                        }
                }
        },
+               }},
                }
        },
        .power_ctrl      = dtt200u_power_ctrl,
@@ -187,6 +190,8 @@ static struct dvb_usb_device_properties wt220u_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
                        .pid_filter_count = 15,
 
@@ -204,6 +209,7 @@ static struct dvb_usb_device_properties wt220u_properties = {
                        }
                }
        },
+               }},
                }
        },
        .power_ctrl      = dtt200u_power_ctrl,
@@ -234,6 +240,8 @@ static struct dvb_usb_device_properties wt220u_fc_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
                        .pid_filter_count = 15,
 
@@ -251,6 +259,7 @@ static struct dvb_usb_device_properties wt220u_fc_properties = {
                        }
                }
        },
+               }},
                }
        },
        .power_ctrl      = dtt200u_power_ctrl,
@@ -281,6 +290,8 @@ static struct dvb_usb_device_properties wt220u_zl0353_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
                        .pid_filter_count = 15,
 
@@ -298,6 +309,7 @@ static struct dvb_usb_device_properties wt220u_zl0353_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .power_ctrl      = dtt200u_power_ctrl,
index 75ed55c..7373132 100644 (file)
@@ -115,13 +115,13 @@ static struct zl10353_config dtv5100_zl10353_config = {
 
 static int dtv5100_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe[0] = dvb_attach(zl10353_attach, &dtv5100_zl10353_config,
+       adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &dtv5100_zl10353_config,
                              &adap->dev->i2c_adap);
-       if (adap->fe[0] == NULL)
+       if (adap->fe_adap[0].fe == NULL)
                return -EIO;
 
        /* disable i2c gate, or it won't work... is this safe? */
-       adap->fe[0]->ops.i2c_gate_ctrl = NULL;
+       adap->fe_adap[0].fe->ops.i2c_gate_ctrl = NULL;
 
        return 0;
 }
@@ -133,7 +133,7 @@ static struct qt1010_config dtv5100_qt1010_config = {
 static int dtv5100_tuner_attach(struct dvb_usb_adapter *adap)
 {
        return dvb_attach(qt1010_attach,
-                         adap->fe[0], &adap->dev->i2c_adap,
+                         adap->fe_adap[0].fe, &adap->dev->i2c_adap,
                          &dtv5100_qt1010_config) == NULL ? -ENODEV : 0;
 }
 
@@ -180,6 +180,8 @@ static struct dvb_usb_device_properties dtv5100_properties = {
 
        .num_adapters = 1,
        .adapter = {{
+               .num_frontends = 1,
+               .fe = {{
                .frontend_attach = dtv5100_frontend_attach,
                .tuner_attach    = dtv5100_tuner_attach,
 
@@ -193,6 +195,7 @@ static struct dvb_usb_device_properties dtv5100_properties = {
                                }
                        }
                },
+               }},
        } },
 
        .i2c_algo = &dtv5100_i2c_algo,
index 5e34df7..3f11159 100644 (file)
@@ -17,15 +17,19 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
        if (adap == NULL)
                return -ENODEV;
 
+       if (adap->active_fe < 0) {
+               return -EINVAL;
+       }
+
        newfeedcount = adap->feedcount + (onoff ? 1 : -1);
 
        /* stop feed before setting a new pid if there will be no pid anymore */
        if (newfeedcount == 0) {
                deb_ts("stop feeding\n");
-               usb_urb_kill(&adap->stream);
+               usb_urb_kill(&adap->fe_adap[adap->active_fe].stream);
 
-               if (adap->props.streaming_ctrl != NULL) {
-                       ret = adap->props.streaming_ctrl(adap, 0);
+               if (adap->props.fe[adap->active_fe].streaming_ctrl != NULL) {
+                       ret = adap->props.fe[adap->active_fe].streaming_ctrl(adap, 0);
                        if (ret < 0) {
                                err("error while stopping stream.");
                                return ret;
@@ -36,36 +40,36 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
        adap->feedcount = newfeedcount;
 
        /* activate the pid on the device specific pid_filter */
-       deb_ts("setting pid (%s): %5d %04x at index %d '%s'\n",adap->pid_filtering ?
+       deb_ts("setting pid (%s): %5d %04x at index %d '%s'\n",adap->fe_adap[adap->active_fe].pid_filtering ?
                "yes" : "no", dvbdmxfeed->pid,dvbdmxfeed->pid,dvbdmxfeed->index,onoff ?
                "on" : "off");
-       if (adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER &&
-               adap->pid_filtering &&
-               adap->props.pid_filter != NULL)
-               adap->props.pid_filter(adap, dvbdmxfeed->index, dvbdmxfeed->pid,onoff);
+       if (adap->props.fe[adap->active_fe].caps & DVB_USB_ADAP_HAS_PID_FILTER &&
+               adap->fe_adap[adap->active_fe].pid_filtering &&
+               adap->props.fe[adap->active_fe].pid_filter != NULL)
+               adap->props.fe[adap->active_fe].pid_filter(adap, dvbdmxfeed->index, dvbdmxfeed->pid, onoff);
 
        /* start the feed if this was the first feed and there is still a feed
         * for reception.
         */
        if (adap->feedcount == onoff && adap->feedcount > 0) {
                deb_ts("submitting all URBs\n");
-               usb_urb_submit(&adap->stream);
+               usb_urb_submit(&adap->fe_adap[adap->active_fe].stream);
 
                deb_ts("controlling pid parser\n");
-               if (adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER &&
-                       adap->props.caps &
+               if (adap->props.fe[adap->active_fe].caps & DVB_USB_ADAP_HAS_PID_FILTER &&
+                       adap->props.fe[adap->active_fe].caps &
                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF &&
-                       adap->props.pid_filter_ctrl != NULL) {
-                       ret = adap->props.pid_filter_ctrl(adap,
-                               adap->pid_filtering);
+                       adap->props.fe[adap->active_fe].pid_filter_ctrl != NULL) {
+                       ret = adap->props.fe[adap->active_fe].pid_filter_ctrl(adap,
+                               adap->fe_adap[adap->active_fe].pid_filtering);
                        if (ret < 0) {
                                err("could not handle pid_parser");
                                return ret;
                        }
                }
                deb_ts("start feeding\n");
-               if (adap->props.streaming_ctrl != NULL) {
-                       ret = adap->props.streaming_ctrl(adap, 1);
+               if (adap->props.fe[adap->active_fe].streaming_ctrl != NULL) {
+                       ret = adap->props.fe[adap->active_fe].streaming_ctrl(adap, 1);
                        if (ret < 0) {
                                err("error while enabling fifo.");
                                return ret;
@@ -73,6 +77,9 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
                }
 
        }
+       if ((adap->feedcount == onoff) && (!onoff))
+               adap->active_fe = -1;
+
        return 0;
 }
 
@@ -90,6 +97,7 @@ static int dvb_usb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
 
 int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums)
 {
+       int i;
        int ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->desc->name,
                                       adap->dev->owner, &adap->dev->udev->dev,
                                       adapter_nums);
@@ -112,7 +120,12 @@ int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums)
        adap->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
        adap->demux.priv             = adap;
 
-       adap->demux.feednum          = adap->demux.filternum = adap->max_feed_count;
+       adap->demux.filternum        = 0;
+       for (i = 0; i < adap->props.num_frontends; i++) {
+               if (adap->demux.filternum < adap->fe_adap[i].max_feed_count)
+                       adap->demux.filternum = adap->fe_adap[i].max_feed_count;
+       }
+       adap->demux.feednum          = adap->demux.filternum;
        adap->demux.start_feed       = dvb_usb_start_feed;
        adap->demux.stop_feed        = dvb_usb_stop_feed;
        adap->demux.write_to_decoder = NULL;
@@ -156,17 +169,33 @@ int dvb_usb_adapter_dvb_exit(struct dvb_usb_adapter *adap)
        return 0;
 }
 
+static int dvb_usb_set_active_fe(struct dvb_frontend *fe, int onoff)
+{
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
+
+       int ret = (adap->props.frontend_ctrl) ?
+               adap->props.frontend_ctrl(fe, onoff) : 0;
+
+       if (ret < 0) {
+               err("frontend_ctrl request failed");
+               return ret;
+       }
+       if (onoff)
+               adap->active_fe = fe->id;
+
+       return 0;
+}
+
 static int dvb_usb_fe_wakeup(struct dvb_frontend *fe)
 {
        struct dvb_usb_adapter *adap = fe->dvb->priv;
 
        dvb_usb_device_power_ctrl(adap->dev, 1);
 
-       if (adap->props.frontend_ctrl)
-               adap->props.frontend_ctrl(fe, 1);
+       dvb_usb_set_active_fe(fe, 1);
 
-       if (adap->fe_init[fe->id])
-               adap->fe_init[fe->id](fe);
+       if (adap->fe_adap[fe->id].fe_init)
+               adap->fe_adap[fe->id].fe_init(fe);
 
        return 0;
 }
@@ -175,37 +204,31 @@ static int dvb_usb_fe_sleep(struct dvb_frontend *fe)
 {
        struct dvb_usb_adapter *adap = fe->dvb->priv;
 
-       if (adap->fe_sleep[fe->id])
-               adap->fe_sleep[fe->id](fe);
+       if (adap->fe_adap[fe->id].fe_sleep)
+               adap->fe_adap[fe->id].fe_sleep(fe);
 
-       if (adap->props.frontend_ctrl)
-               adap->props.frontend_ctrl(fe, 0);
+       dvb_usb_set_active_fe(fe, 0);
 
        return dvb_usb_device_power_ctrl(adap->dev, 0);
 }
 
 int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
 {
-       int ret, i, x;
+       int ret, i;
 
-       memset(adap->fe, 0, sizeof(adap->fe));
+       /* register all given adapter frontends */
+       for (i = 0; i < adap->props.num_frontends; i++) {
 
-       if (adap->props.frontend_attach == NULL) {
-               err("strange: '%s' #%d doesn't want to attach a frontend.",
-                       adap->dev->desc->name, adap->id);
+               if (adap->props.fe[i].frontend_attach == NULL) {
+                       err("strange: '%s' #%d,%d "
+                           "doesn't want to attach a frontend.",
+                           adap->dev->desc->name, adap->id, i);
 
-               return 0;
-       }
+                       return 0;
+               }
 
-       /* register all given adapter frontends */
-       if (adap->props.num_frontends)
-               x = adap->props.num_frontends - 1;
-       else
-               x = 0;
-
-       for (i = 0; i <= x; i++) {
-               ret = adap->props.frontend_attach(adap);
-               if (ret || adap->fe[i] == NULL) {
+               ret = adap->props.fe[i].frontend_attach(adap);
+               if (ret || adap->fe_adap[i].fe == NULL) {
                        /* only print error when there is no FE at all */
                        if (i == 0)
                                err("no frontend was attached by '%s'",
@@ -214,18 +237,18 @@ int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
                        return 0;
                }
 
-               adap->fe[i]->id = i;
+               adap->fe_adap[i].fe->id = i;
 
                /* re-assign sleep and wakeup functions */
-               adap->fe_init[i] = adap->fe[i]->ops.init;
-               adap->fe[i]->ops.init  = dvb_usb_fe_wakeup;
-               adap->fe_sleep[i] = adap->fe[i]->ops.sleep;
-               adap->fe[i]->ops.sleep = dvb_usb_fe_sleep;
+               adap->fe_adap[i].fe_init = adap->fe_adap[i].fe->ops.init;
+               adap->fe_adap[i].fe->ops.init  = dvb_usb_fe_wakeup;
+               adap->fe_adap[i].fe_sleep = adap->fe_adap[i].fe->ops.sleep;
+               adap->fe_adap[i].fe->ops.sleep = dvb_usb_fe_sleep;
 
-               if (dvb_register_frontend(&adap->dvb_adap, adap->fe[i])) {
+               if (dvb_register_frontend(&adap->dvb_adap, adap->fe_adap[i].fe)) {
                        err("Frontend %d registration failed.", i);
-                       dvb_frontend_detach(adap->fe[i]);
-                       adap->fe[i] = NULL;
+                       dvb_frontend_detach(adap->fe_adap[i].fe);
+                       adap->fe_adap[i].fe = NULL;
                        /* In error case, do not try register more FEs,
                         * still leaving already registered FEs alive. */
                        if (i == 0)
@@ -235,8 +258,10 @@ int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
                }
 
                /* only attach the tuner if the demod is there */
-               if (adap->props.tuner_attach != NULL)
-                       adap->props.tuner_attach(adap);
+               if (adap->props.fe[i].tuner_attach != NULL)
+                       adap->props.fe[i].tuner_attach(adap);
+
+               adap->num_frontends_initialized++;
        }
 
        return 0;
@@ -244,20 +269,16 @@ int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
 
 int dvb_usb_adapter_frontend_exit(struct dvb_usb_adapter *adap)
 {
-       int i;
+       int i = adap->num_frontends_initialized - 1;
 
        /* unregister all given adapter frontends */
-       if (adap->props.num_frontends)
-               i = adap->props.num_frontends - 1;
-       else
-               i = 0;
-
        for (; i >= 0; i--) {
-               if (adap->fe[i] != NULL) {
-                       dvb_unregister_frontend(adap->fe[i]);
-                       dvb_frontend_detach(adap->fe[i]);
+               if (adap->fe_adap[i].fe != NULL) {
+                       dvb_unregister_frontend(adap->fe_adap[i].fe);
+                       dvb_frontend_detach(adap->fe_adap[i].fe);
                }
        }
+       adap->num_frontends_initialized = 0;
 
        return 0;
 }
index f9af348..169196e 100644 (file)
@@ -29,7 +29,7 @@ MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a PID
 static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
 {
        struct dvb_usb_adapter *adap;
-       int ret, n;
+       int ret, n, o;
 
        for (n = 0; n < d->props.num_adapters; n++) {
                adap = &d->adapter[n];
@@ -38,31 +38,42 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
 
                memcpy(&adap->props, &d->props.adapter[n], sizeof(struct dvb_usb_adapter_properties));
 
+       for (o = 0; o < adap->props.num_frontends; o++) {
+               struct dvb_usb_adapter_fe_properties *props = &adap->props.fe[o];
                /* speed - when running at FULL speed we need a HW PID filter */
-               if (d->udev->speed == USB_SPEED_FULL && !(adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER)) {
+               if (d->udev->speed == USB_SPEED_FULL && !(props->caps & DVB_USB_ADAP_HAS_PID_FILTER)) {
                        err("This USB2.0 device cannot be run on a USB1.1 port. (it lacks a hardware PID filter)");
                        return -ENODEV;
                }
 
-               if ((d->udev->speed == USB_SPEED_FULL && adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER) ||
-                       (adap->props.caps & DVB_USB_ADAP_NEED_PID_FILTERING)) {
-                       info("will use the device's hardware PID filter (table count: %d).", adap->props.pid_filter_count);
-                       adap->pid_filtering  = 1;
-                       adap->max_feed_count = adap->props.pid_filter_count;
+               if ((d->udev->speed == USB_SPEED_FULL && props->caps & DVB_USB_ADAP_HAS_PID_FILTER) ||
+                       (props->caps & DVB_USB_ADAP_NEED_PID_FILTERING)) {
+                       info("will use the device's hardware PID filter (table count: %d).", props->pid_filter_count);
+                       adap->fe_adap[o].pid_filtering  = 1;
+                       adap->fe_adap[o].max_feed_count = props->pid_filter_count;
                } else {
                        info("will pass the complete MPEG2 transport stream to the software demuxer.");
-                       adap->pid_filtering  = 0;
-                       adap->max_feed_count = 255;
+                       adap->fe_adap[o].pid_filtering  = 0;
+                       adap->fe_adap[o].max_feed_count = 255;
                }
 
-               if (!adap->pid_filtering &&
+               if (!adap->fe_adap[o].pid_filtering &&
                        dvb_usb_force_pid_filter_usage &&
-                       adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER) {
+                       props->caps & DVB_USB_ADAP_HAS_PID_FILTER) {
                        info("pid filter enabled by module option.");
-                       adap->pid_filtering  = 1;
-                       adap->max_feed_count = adap->props.pid_filter_count;
+                       adap->fe_adap[o].pid_filtering  = 1;
+                       adap->fe_adap[o].max_feed_count = props->pid_filter_count;
                }
 
+               if (props->size_of_priv > 0) {
+                       adap->fe_adap[o].priv = kzalloc(props->size_of_priv, GFP_KERNEL);
+                       if (adap->fe_adap[o].priv == NULL) {
+                               err("no memory for priv for adapter %d fe %d.", n, o);
+                               return -ENOMEM;
+                       }
+               }
+       }
+
                if (adap->props.size_of_priv > 0) {
                        adap->priv = kzalloc(adap->props.size_of_priv, GFP_KERNEL);
                        if (adap->priv == NULL) {
@@ -78,7 +89,7 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
                }
 
                /* use exclusive FE lock if there is multiple shared FEs */
-               if (adap->fe[1])
+               if (adap->fe_adap[1].fe)
                        adap->dvb_adap.mfe_shared = 1;
 
                d->num_adapters_initialized++;
index bb46ba6..53a5c30 100644 (file)
@@ -82,16 +82,28 @@ static void dvb_usb_data_complete_204(struct usb_data_stream *stream, u8 *buffer
 
 int dvb_usb_adapter_stream_init(struct dvb_usb_adapter *adap)
 {
-       adap->stream.udev      = adap->dev->udev;
-       if (adap->props.caps & DVB_USB_ADAP_RECEIVES_204_BYTE_TS)
-               adap->stream.complete = dvb_usb_data_complete_204;
-       else
-       adap->stream.complete  = dvb_usb_data_complete;
-       adap->stream.user_priv = adap;
-       return usb_urb_init(&adap->stream, &adap->props.stream);
+       int i, ret = 0;
+       for (i = 0; i < adap->props.num_frontends; i++) {
+
+               adap->fe_adap[i].stream.udev      = adap->dev->udev;
+               if (adap->props.fe[i].caps & DVB_USB_ADAP_RECEIVES_204_BYTE_TS)
+                       adap->fe_adap[i].stream.complete =
+                               dvb_usb_data_complete_204;
+               else
+               adap->fe_adap[i].stream.complete  = dvb_usb_data_complete;
+               adap->fe_adap[i].stream.user_priv = adap;
+               ret = usb_urb_init(&adap->fe_adap[i].stream,
+                                  &adap->props.fe[i].stream);
+               if (ret < 0)
+                       break;
+       }
+       return ret;
 }
 
 int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter *adap)
 {
-       return usb_urb_exit(&adap->stream);
+       int i;
+       for (i = 0; i < adap->props.num_frontends; i++)
+               usb_urb_exit(&adap->fe_adap[i].stream);
+       return 0;
 }
index a3e77b2..6d7d13f 100644 (file)
@@ -136,16 +136,14 @@ struct usb_data_stream_properties {
  *  pll_desc and pll_init_buf of struct dvb_usb_device).
  * @stream: configuration of the USB streaming
  */
-struct dvb_usb_adapter_properties {
+struct dvb_usb_adapter_fe_properties {
 #define DVB_USB_ADAP_HAS_PID_FILTER               0x01
 #define DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF 0x02
 #define DVB_USB_ADAP_NEED_PID_FILTERING           0x04
 #define DVB_USB_ADAP_RECEIVES_204_BYTE_TS         0x08
        int caps;
        int pid_filter_count;
-       int num_frontends;
 
-       int (*frontend_ctrl)   (struct dvb_frontend *, int);
        int (*streaming_ctrl)  (struct dvb_usb_adapter *, int);
        int (*pid_filter_ctrl) (struct dvb_usb_adapter *, int);
        int (*pid_filter)      (struct dvb_usb_adapter *, int, u16, int);
@@ -156,9 +154,18 @@ struct dvb_usb_adapter_properties {
        struct usb_data_stream_properties stream;
 
        int size_of_priv;
+};
+
+#define MAX_NO_OF_FE_PER_ADAP 2
+struct dvb_usb_adapter_properties {
+       int size_of_priv;
 
+       int (*frontend_ctrl)   (struct dvb_frontend *, int);
        int (*fe_ioctl_override) (struct dvb_frontend *,
                                  unsigned int, void *, unsigned int);
+
+       int num_frontends;
+       struct dvb_usb_adapter_fe_properties fe[MAX_NO_OF_FE_PER_ADAP];
 };
 
 /**
@@ -349,7 +356,20 @@ struct usb_data_stream {
  *
  * @stream: the usb data stream.
  */
-#define MAX_NO_OF_FE_PER_ADAP 2
+struct dvb_usb_fe_adapter {
+       struct dvb_frontend *fe;
+
+       int (*fe_init)  (struct dvb_frontend *);
+       int (*fe_sleep) (struct dvb_frontend *);
+
+       struct usb_data_stream stream;
+
+       int pid_filtering;
+       int max_feed_count;
+
+       void *priv;
+};
+
 struct dvb_usb_adapter {
        struct dvb_usb_device *dev;
        struct dvb_usb_adapter_properties props;
@@ -361,20 +381,16 @@ struct dvb_usb_adapter {
        u8  id;
 
        int feedcount;
-       int pid_filtering;
 
        /* dvb */
        struct dvb_adapter   dvb_adap;
        struct dmxdev        dmxdev;
        struct dvb_demux     demux;
        struct dvb_net       dvb_net;
-       struct dvb_frontend *fe[MAX_NO_OF_FE_PER_ADAP];
-       int                  max_feed_count;
-
-       int (*fe_init[MAX_NO_OF_FE_PER_ADAP])  (struct dvb_frontend *);
-       int (*fe_sleep[MAX_NO_OF_FE_PER_ADAP]) (struct dvb_frontend *);
 
-       struct usb_data_stream stream;
+       struct dvb_usb_fe_adapter fe_adap[MAX_NO_OF_FE_PER_ADAP];
+       int active_fe;
+       int num_frontends_initialized;
 
        void *priv;
 };
index eb5dff5..f103ec1 100644 (file)
@@ -992,18 +992,18 @@ static int dw2104_frontend_attach(struct dvb_usb_adapter *d)
        struct dvb_tuner_ops *tuner_ops = NULL;
 
        if (demod_probe & 4) {
-               d->fe[0] = dvb_attach(stv0900_attach, &dw2104a_stv0900_config,
+               d->fe_adap[0].fe = dvb_attach(stv0900_attach, &dw2104a_stv0900_config,
                                &d->dev->i2c_adap, 0);
-               if (d->fe[0] != NULL) {
-                       if (dvb_attach(stb6100_attach, d->fe[0],
+               if (d->fe_adap[0].fe != NULL) {
+                       if (dvb_attach(stb6100_attach, d->fe_adap[0].fe,
                                        &dw2104a_stb6100_config,
                                        &d->dev->i2c_adap)) {
-                               tuner_ops = &d->fe[0]->ops.tuner_ops;
+                               tuner_ops = &d->fe_adap[0].fe->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[0]->ops.set_voltage = dw210x_set_voltage;
+                               d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
                                info("Attached STV0900+STB6100!\n");
                                return 0;
                        }
@@ -1011,13 +1011,13 @@ static int dw2104_frontend_attach(struct dvb_usb_adapter *d)
        }
 
        if (demod_probe & 2) {
-               d->fe[0] = dvb_attach(stv0900_attach, &dw2104_stv0900_config,
+               d->fe_adap[0].fe = dvb_attach(stv0900_attach, &dw2104_stv0900_config,
                                &d->dev->i2c_adap, 0);
-               if (d->fe[0] != NULL) {
-                       if (dvb_attach(stv6110_attach, d->fe[0],
+               if (d->fe_adap[0].fe != NULL) {
+                       if (dvb_attach(stv6110_attach, d->fe_adap[0].fe,
                                        &dw2104_stv6110_config,
                                        &d->dev->i2c_adap)) {
-                               d->fe[0]->ops.set_voltage = dw210x_set_voltage;
+                               d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
                                info("Attached STV0900+STV6110A!\n");
                                return 0;
                        }
@@ -1025,19 +1025,19 @@ static int dw2104_frontend_attach(struct dvb_usb_adapter *d)
        }
 
        if (demod_probe & 1) {
-               d->fe[0] = dvb_attach(cx24116_attach, &dw2104_config,
+               d->fe_adap[0].fe = dvb_attach(cx24116_attach, &dw2104_config,
                                &d->dev->i2c_adap);
-               if (d->fe[0] != NULL) {
-                       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
+               if (d->fe_adap[0].fe != NULL) {
+                       d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
                        info("Attached cx24116!\n");
                        return 0;
                }
        }
 
-       d->fe[0] = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
+       d->fe_adap[0].fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
                        &d->dev->i2c_adap);
-       if (d->fe[0] != NULL) {
-               d->fe[0]->ops.set_voltage = dw210x_set_voltage;
+       if (d->fe_adap[0].fe != NULL) {
+               d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
                info("Attached DS3000!\n");
                return 0;
        }
@@ -1053,22 +1053,22 @@ static int dw2102_frontend_attach(struct dvb_usb_adapter *d)
 {
        if (dw2102_properties.i2c_algo == &dw2102_serit_i2c_algo) {
                /*dw2102_properties.adapter->tuner_attach = NULL;*/
-               d->fe[0] = dvb_attach(si21xx_attach, &serit_sp1511lhb_config,
+               d->fe_adap[0].fe = dvb_attach(si21xx_attach, &serit_sp1511lhb_config,
                                        &d->dev->i2c_adap);
-               if (d->fe[0] != NULL) {
-                       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
+               if (d->fe_adap[0].fe != NULL) {
+                       d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
                        info("Attached si21xx!\n");
                        return 0;
                }
        }
 
        if (dw2102_properties.i2c_algo == &dw2102_earda_i2c_algo) {
-               d->fe[0] = dvb_attach(stv0288_attach, &earda_config,
+               d->fe_adap[0].fe = dvb_attach(stv0288_attach, &earda_config,
                                        &d->dev->i2c_adap);
-               if (d->fe[0] != NULL) {
-                       if (dvb_attach(stb6000_attach, d->fe[0], 0x61,
+               if (d->fe_adap[0].fe != NULL) {
+                       if (dvb_attach(stb6000_attach, d->fe_adap[0].fe, 0x61,
                                        &d->dev->i2c_adap)) {
-                               d->fe[0]->ops.set_voltage = dw210x_set_voltage;
+                               d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
                                info("Attached stv0288!\n");
                                return 0;
                        }
@@ -1077,10 +1077,10 @@ static int dw2102_frontend_attach(struct dvb_usb_adapter *d)
 
        if (dw2102_properties.i2c_algo == &dw2102_i2c_algo) {
                /*dw2102_properties.adapter->tuner_attach = dw2102_tuner_attach;*/
-               d->fe[0] = dvb_attach(stv0299_attach, &sharp_z0194a_config,
+               d->fe_adap[0].fe = dvb_attach(stv0299_attach, &sharp_z0194a_config,
                                        &d->dev->i2c_adap);
-               if (d->fe[0] != NULL) {
-                       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
+               if (d->fe_adap[0].fe != NULL) {
+                       d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
                        info("Attached stv0299!\n");
                        return 0;
                }
@@ -1090,9 +1090,9 @@ static int dw2102_frontend_attach(struct dvb_usb_adapter *d)
 
 static int dw3101_frontend_attach(struct dvb_usb_adapter *d)
 {
-       d->fe[0] = dvb_attach(tda10023_attach, &dw3101_tda10023_config,
+       d->fe_adap[0].fe = dvb_attach(tda10023_attach, &dw3101_tda10023_config,
                                &d->dev->i2c_adap, 0x48);
-       if (d->fe[0] != NULL) {
+       if (d->fe_adap[0].fe != NULL) {
                info("Attached tda10023!\n");
                return 0;
        }
@@ -1101,12 +1101,12 @@ static int dw3101_frontend_attach(struct dvb_usb_adapter *d)
 
 static int zl100313_frontend_attach(struct dvb_usb_adapter *d)
 {
-       d->fe[0] = dvb_attach(mt312_attach, &zl313_config,
+       d->fe_adap[0].fe = dvb_attach(mt312_attach, &zl313_config,
                        &d->dev->i2c_adap);
-       if (d->fe[0] != NULL) {
-               if (dvb_attach(zl10039_attach, d->fe[0], 0x60,
+       if (d->fe_adap[0].fe != NULL) {
+               if (dvb_attach(zl10039_attach, d->fe_adap[0].fe, 0x60,
                                &d->dev->i2c_adap)) {
-                       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
+                       d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
                        info("Attached zl100313+zl10039!\n");
                        return 0;
                }
@@ -1119,16 +1119,16 @@ static int stv0288_frontend_attach(struct dvb_usb_adapter *d)
 {
        u8 obuf[] = {7, 1};
 
-       d->fe[0] = dvb_attach(stv0288_attach, &earda_config,
+       d->fe_adap[0].fe = dvb_attach(stv0288_attach, &earda_config,
                        &d->dev->i2c_adap);
 
-       if (d->fe[0] == NULL)
+       if (d->fe_adap[0].fe == NULL)
                return -EIO;
 
-       if (NULL == dvb_attach(stb6000_attach, d->fe[0], 0x61, &d->dev->i2c_adap))
+       if (NULL == dvb_attach(stb6000_attach, d->fe_adap[0].fe, 0x61, &d->dev->i2c_adap))
                return -EIO;
 
-       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
+       d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
 
        dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
 
@@ -1143,14 +1143,14 @@ static int ds3000_frontend_attach(struct dvb_usb_adapter *d)
        struct s6x0_state *st = (struct s6x0_state *)d->dev->priv;
        u8 obuf[] = {7, 1};
 
-       d->fe[0] = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
+       d->fe_adap[0].fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
                        &d->dev->i2c_adap);
 
-       if (d->fe[0] == NULL)
+       if (d->fe_adap[0].fe == NULL)
                return -EIO;
 
-       st->old_set_voltage = d->fe[0]->ops.set_voltage;
-       d->fe[0]->ops.set_voltage = s660_set_voltage;
+       st->old_set_voltage = d->fe_adap[0].fe->ops.set_voltage;
+       d->fe_adap[0].fe->ops.set_voltage = s660_set_voltage;
 
        dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
 
@@ -1163,12 +1163,12 @@ static int prof_7500_frontend_attach(struct dvb_usb_adapter *d)
 {
        u8 obuf[] = {7, 1};
 
-       d->fe[0] = dvb_attach(stv0900_attach, &prof_7500_stv0900_config,
+       d->fe_adap[0].fe = dvb_attach(stv0900_attach, &prof_7500_stv0900_config,
                                        &d->dev->i2c_adap, 0);
-       if (d->fe[0] == NULL)
+       if (d->fe_adap[0].fe == NULL)
                return -EIO;
 
-       d->fe[0]->ops.set_voltage = dw210x_set_voltage;
+       d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
 
        dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
 
@@ -1204,9 +1204,9 @@ static int su3000_frontend_attach(struct dvb_usb_adapter *d)
        if (dvb_usb_generic_rw(d->dev, obuf, 1, ibuf, 1, 0) < 0)
                err("command 0x51 transfer failed.");
 
-       d->fe[0] = dvb_attach(ds3000_attach, &su3000_ds3000_config,
+       d->fe_adap[0].fe = dvb_attach(ds3000_attach, &su3000_ds3000_config,
                                        &d->dev->i2c_adap);
-       if (d->fe[0] == NULL)
+       if (d->fe_adap[0].fe == NULL)
                return -EIO;
 
        info("Attached DS3000!\n");
@@ -1216,14 +1216,14 @@ static int su3000_frontend_attach(struct dvb_usb_adapter *d)
 
 static int dw2102_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe[0], 0x60,
+       dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 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[0], 0x60,
+       dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
                &adap->dev->i2c_adap, DVB_PLL_TUA6034);
 
        return 0;
@@ -1535,7 +1535,7 @@ static int dw2102_load_firmware(struct usb_device *dev,
                                        DW210X_READ_MSG);
                        if ((reset16[0] == 0xa1) || (reset16[0] == 0x80)) {
                                dw2102_properties.i2c_algo = &dw2102_i2c_algo;
-                               dw2102_properties.adapter->tuner_attach = &dw2102_tuner_attach;
+                               dw2102_properties.adapter->fe[0].tuner_attach = &dw2102_tuner_attach;
                                break;
                        } else {
                                /* check STV0288 frontend  */
@@ -1591,6 +1591,8 @@ static struct dvb_usb_device_properties dw2102_properties = {
        .read_mac_address = dw210x_read_mac_address,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach = dw2102_frontend_attach,
                        .stream = {
                                .type = USB_BULK,
@@ -1602,6 +1604,7 @@ static struct dvb_usb_device_properties dw2102_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .num_device_descs = 3,
@@ -1642,6 +1645,8 @@ static struct dvb_usb_device_properties dw2104_properties = {
        .read_mac_address = dw210x_read_mac_address,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach = dw2104_frontend_attach,
                        .stream = {
                                .type = USB_BULK,
@@ -1653,6 +1658,7 @@ static struct dvb_usb_device_properties dw2104_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .num_device_descs = 2,
@@ -1689,6 +1695,8 @@ static struct dvb_usb_device_properties dw3101_properties = {
        .read_mac_address = dw210x_read_mac_address,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach = dw3101_frontend_attach,
                        .tuner_attach = dw3101_tuner_attach,
                        .stream = {
@@ -1701,6 +1709,7 @@ static struct dvb_usb_device_properties dw3101_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .num_device_descs = 1,
@@ -1733,6 +1742,8 @@ static struct dvb_usb_device_properties s6x0_properties = {
        .read_mac_address = s6x0_read_mac_address,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach = zl100313_frontend_attach,
                        .stream = {
                                .type = USB_BULK,
@@ -1744,6 +1755,7 @@ static struct dvb_usb_device_properties s6x0_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .num_device_descs = 1,
@@ -1810,6 +1822,8 @@ static struct dvb_usb_device_properties su3000_properties = {
 
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = su3000_streaming_ctrl,
                        .frontend_attach  = su3000_frontend_attach,
                        .stream = {
@@ -1822,6 +1836,7 @@ static struct dvb_usb_device_properties su3000_properties = {
                                        }
                                }
                        }
+               }},
                }
        },
        .num_device_descs = 3,
@@ -1855,7 +1870,7 @@ static int dw2102_probe(struct usb_interface *intf,
        p1100->devices[0] = d1100;
        p1100->rc.legacy.rc_map_table = rc_map_tbs_table;
        p1100->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table);
-       p1100->adapter->frontend_attach = stv0288_frontend_attach;
+       p1100->adapter->fe[0].frontend_attach = stv0288_frontend_attach;
 
        s660 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
        if (!s660) {
@@ -1869,7 +1884,7 @@ static int dw2102_probe(struct usb_interface *intf,
        s660->devices[0] = d660;
        s660->devices[1] = d480_1;
        s660->devices[2] = d480_2;
-       s660->adapter->frontend_attach = ds3000_frontend_attach;
+       s660->adapter->fe[0].frontend_attach = ds3000_frontend_attach;
 
        p7500 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
        if (!p7500) {
@@ -1883,7 +1898,7 @@ static int dw2102_probe(struct usb_interface *intf,
        p7500->devices[0] = d7500;
        p7500->rc.legacy.rc_map_table = rc_map_tbs_table;
        p7500->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table);
-       p7500->adapter->frontend_attach = prof_7500_frontend_attach;
+       p7500->adapter->fe[0].frontend_attach = prof_7500_frontend_attach;
 
        if (0 == dvb_usb_device_init(intf, &dw2102_properties,
                        THIS_MODULE, NULL, adapter_nr) ||
index 581bdfc..78442fe 100644 (file)
@@ -200,9 +200,9 @@ static struct ec100_config ec168_ec100_config = {
 static int ec168_ec100_frontend_attach(struct dvb_usb_adapter *adap)
 {
        deb_info("%s:\n", __func__);
-       adap->fe[0] = dvb_attach(ec100_attach, &ec168_ec100_config,
+       adap->fe_adap[0].fe = dvb_attach(ec100_attach, &ec168_ec100_config,
                &adap->dev->i2c_adap);
-       if (adap->fe[0] == NULL)
+       if (adap->fe_adap[0].fe == NULL)
                return -ENODEV;
 
        return 0;
@@ -228,7 +228,7 @@ static struct mxl5005s_config ec168_mxl5003s_config = {
 static int ec168_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
 {
        deb_info("%s:\n", __func__);
-       return dvb_attach(mxl5005s_attach, adap->fe[0], &adap->dev->i2c_adap,
+       return dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
                &ec168_mxl5003s_config) == NULL ? -ENODEV : 0;
 }
 
@@ -382,6 +382,8 @@ static struct dvb_usb_device_properties ec168_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = ec168_streaming_ctrl,
                        .frontend_attach  = ec168_ec100_frontend_attach,
                        .tuner_attach     = ec168_mxl5003s_tuner_attach,
@@ -395,6 +397,7 @@ static struct dvb_usb_device_properties ec168_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
 
index 0e4b559..b092dc2 100644 (file)
@@ -403,8 +403,8 @@ static int friio_frontend_attach(struct dvb_usb_adapter *adap)
        if (friio_initialize(adap->dev) < 0)
                return -EIO;
 
-       adap->fe[0] = jdvbt90502_attach(adap->dev);
-       if (adap->fe[0] == NULL)
+       adap->fe_adap[0].fe = jdvbt90502_attach(adap->dev);
+       if (adap->fe_adap[0].fe == NULL)
                return -EIO;
 
        return 0;
@@ -473,6 +473,8 @@ static struct dvb_usb_device_properties friio_properties = {
                /* caps:0 =>  no pid filter, 188B TS packet */
                /* GL861 has a HW pid filter, but no info available. */
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps  = 0,
 
                        .frontend_attach  = friio_frontend_attach,
@@ -490,6 +492,7 @@ static struct dvb_usb_device_properties friio_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .i2c_algo = &gl861_i2c_algo,
index fba24ed..63681df 100644 (file)
@@ -103,9 +103,9 @@ static struct zl10353_config gl861_zl10353_config = {
 static int gl861_frontend_attach(struct dvb_usb_adapter *adap)
 {
 
-       adap->fe[0] = dvb_attach(zl10353_attach, &gl861_zl10353_config,
+       adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &gl861_zl10353_config,
                &adap->dev->i2c_adap);
-       if (adap->fe[0] == NULL)
+       if (adap->fe_adap[0].fe == NULL)
                return -EIO;
 
        return 0;
@@ -118,7 +118,7 @@ static struct qt1010_config gl861_qt1010_config = {
 static int gl861_tuner_attach(struct dvb_usb_adapter *adap)
 {
        return dvb_attach(qt1010_attach,
-                         adap->fe[0], &adap->dev->i2c_adap,
+                         adap->fe_adap[0].fe, &adap->dev->i2c_adap,
                          &gl861_qt1010_config) == NULL ? -ENODEV : 0;
 }
 
@@ -167,6 +167,8 @@ static struct dvb_usb_device_properties gl861_properties = {
 
        .num_adapters = 1,
        .adapter = {{
+               .num_frontends = 1,
+               .fe = {{
 
                .frontend_attach  = gl861_frontend_attach,
                .tuner_attach     = gl861_tuner_attach,
@@ -181,6 +183,7 @@ static struct dvb_usb_device_properties gl861_properties = {
                                }
                        }
                },
+               }},
        } },
        .i2c_algo         = &gl861_i2c_algo,
 
index f254e13..5f71284 100644 (file)
@@ -230,7 +230,7 @@ static int gp8psk_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 
 static int gp8psk_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       adap->fe[0] = gp8psk_fe_attach(adap->dev);
+       adap->fe_adap[0].fe = gp8psk_fe_attach(adap->dev);
        return 0;
 }
 
@@ -268,6 +268,8 @@ static struct dvb_usb_device_properties gp8psk_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = gp8psk_streaming_ctrl,
                        .frontend_attach  = gp8psk_frontend_attach,
                        /* parameter for the MPEG2-data transfer */
@@ -281,6 +283,7 @@ static struct dvb_usb_device_properties gp8psk_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .power_ctrl       = gp8psk_power_ctrl,
index 3900068..6d2f281 100644 (file)
@@ -436,7 +436,7 @@ static int it913x_name(struct dvb_usb_adapter *adap)
 {
        const char *desc = adap->dev->desc->name;
        char *fe_name[] = {"_1", "_2", "_3", "_4"};
-       char *name = adap->fe[0]->ops.info.name;
+       char *name = adap->fe_adap[0].fe->ops.info.name;
 
        strlcpy(name, desc, 128);
        strlcat(name, fe_name[adap->id], 128);
@@ -450,12 +450,12 @@ static int it913x_frontend_attach(struct dvb_usb_adapter *adap)
        int ret = 0;
        u8 adf = it913x_read_reg(udev, IO_MUX_POWER_CLK);
        u8 adap_addr = I2C_BASE_ADDR + (adap->id << 5);
-       u16 ep_size = adap->props.stream.u.bulk.buffersize;
+       u16 ep_size = adap->props.fe[0].stream.u.bulk.buffersize;
 
-       adap->fe[0] = dvb_attach(it913x_fe_attach,
+       adap->fe_adap[0].fe = dvb_attach(it913x_fe_attach,
                &adap->dev->i2c_adap, adap_addr, adf, IT9137);
 
-       if (adap->id == 0 && adap->fe[0]) {
+       if (adap->id == 0 && adap->fe_adap[0].fe) {
                ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2_SW_RST, 0x1);
                ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2IF2_SW_RST, 0x1);
                ret = it913x_wr_reg(udev, DEV_0, EP0_TX_EN, 0x0f);
@@ -465,7 +465,7 @@ static int it913x_frontend_attach(struct dvb_usb_adapter *adap)
                                        ep_size & 0xff);
                ret = it913x_wr_reg(udev, DEV_0, EP4_TX_LEN_MSB, ep_size >> 8);
                ret = it913x_wr_reg(udev, DEV_0, EP4_MAX_PKT, 0x80);
-       } else if (adap->id == 1 && adap->fe[0]) {
+       } else if (adap->id == 1 && adap->fe_adap[0].fe) {
                ret = it913x_wr_reg(udev, DEV_0, EP0_TX_EN, 0x6f);
                ret = it913x_wr_reg(udev, DEV_0, EP5_TX_LEN_LSB,
                                        ep_size & 0xff);
@@ -524,6 +524,8 @@ static struct dvb_usb_device_properties it913x_properties = {
        .num_adapters = 2,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER|
                                DVB_USB_ADAP_NEED_PID_FILTERING|
                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -544,8 +546,11 @@ static struct dvb_usb_device_properties it913x_properties = {
                                        }
                                }
                        }
+               }},
                },
                        {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER|
                                DVB_USB_ADAP_NEED_PID_FILTERING|
                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -566,6 +571,7 @@ static struct dvb_usb_device_properties it913x_properties = {
                                        }
                                }
                        }
+               }},
                }
        },
        .identify_state   = it913x_identify_state,
index ef5911a..55b25be 100644 (file)
@@ -941,7 +941,7 @@ static int lme_name(struct dvb_usb_adapter *adap)
        const char *desc = adap->dev->desc->name;
        char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
                                " SHARP:BS2F7HZ0194"};
-       char *name = adap->fe[0]->ops.info.name;
+       char *name = adap->fe_adap[0].fe->ops.info.name;
 
        strlcpy(name, desc, 128);
        strlcat(name, fe_name[st->tuner_config], 128);
@@ -958,10 +958,10 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
        st->i2c_talk_onoff = 1;
 
        st->i2c_gate = 4;
-       adap->fe[0] = dvb_attach(tda10086_attach, &tda10086_config,
+       adap->fe_adap[0].fe = dvb_attach(tda10086_attach, &tda10086_config,
                &adap->dev->i2c_adap);
 
-       if (adap->fe[0]) {
+       if (adap->fe_adap[0].fe) {
                info("TUN Found Frontend TDA10086");
                st->i2c_tuner_gate_w = 4;
                st->i2c_tuner_gate_r = 4;
@@ -975,9 +975,9 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
        }
 
        st->i2c_gate = 4;
-       adap->fe[0] = dvb_attach(stv0299_attach, &sharp_z0194_config,
+       adap->fe_adap[0].fe = dvb_attach(stv0299_attach, &sharp_z0194_config,
                        &adap->dev->i2c_adap);
-       if (adap->fe[0]) {
+       if (adap->fe_adap[0].fe) {
                info("FE Found Stv0299");
                st->i2c_tuner_gate_w = 4;
                st->i2c_tuner_gate_r = 5;
@@ -991,9 +991,9 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
        }
 
        st->i2c_gate = 5;
-       adap->fe[0] = dvb_attach(stv0288_attach, &lme_config,
+       adap->fe_adap[0].fe = dvb_attach(stv0288_attach, &lme_config,
                        &adap->dev->i2c_adap);
-       if (adap->fe[0]) {
+       if (adap->fe_adap[0].fe) {
                info("FE Found Stv0288");
                st->i2c_tuner_gate_w = 4;
                st->i2c_tuner_gate_r = 5;
@@ -1010,15 +1010,15 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
 
 
 end:   if (ret) {
-               if (adap->fe[0]) {
-                       dvb_frontend_detach(adap->fe[0]);
-                       adap->fe[0] = NULL;
+               if (adap->fe_adap[0].fe) {
+                       dvb_frontend_detach(adap->fe_adap[0].fe);
+                       adap->fe_adap[0].fe = NULL;
                }
                adap->dev->props.rc.core.rc_codes = NULL;
                return -ENODEV;
        }
 
-       adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage;
+       adap->fe_adap[0].fe->ops.set_voltage = dm04_lme2510_set_voltage;
        ret = lme_name(adap);
        return ret;
 }
@@ -1031,17 +1031,17 @@ static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
 
        switch (st->tuner_config) {
        case TUNER_LG:
-               if (dvb_attach(tda826x_attach, adap->fe[0], 0xc0,
+               if (dvb_attach(tda826x_attach, adap->fe_adap[0].fe, 0xc0,
                        &adap->dev->i2c_adap, 1))
                        ret = st->tuner_config;
                break;
        case TUNER_S7395:
-               if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner,
+               if (dvb_attach(ix2505v_attach , adap->fe_adap[0].fe, &lme_tuner,
                        &adap->dev->i2c_adap))
                        ret = st->tuner_config;
                break;
        case TUNER_S0194:
-               if (dvb_attach(dvb_pll_attach , adap->fe[0], 0xc0,
+               if (dvb_attach(dvb_pll_attach , adap->fe_adap[0].fe, 0xc0,
                        &adap->dev->i2c_adap, DVB_PLL_OPERA1))
                        ret = st->tuner_config;
                break;
@@ -1145,6 +1145,8 @@ static struct dvb_usb_device_properties lme2510_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER|
                                DVB_USB_ADAP_NEED_PID_FILTERING|
                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -1166,6 +1168,7 @@ static struct dvb_usb_device_properties lme2510_properties = {
                                        }
                                }
                        }
+               }},
                }
        },
        .rc.core = {
@@ -1193,6 +1196,8 @@ static struct dvb_usb_device_properties lme2510c_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER|
                                DVB_USB_ADAP_NEED_PID_FILTERING|
                                DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -1214,6 +1219,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
                                        }
                                }
                        }
+               }},
                }
        },
        .rc.core = {
@@ -1241,7 +1247,7 @@ static void *lme2510_exit_int(struct dvb_usb_device *d)
        void *buffer = NULL;
 
        if (adap != NULL) {
-               lme2510_kill_urb(&adap->stream);
+               lme2510_kill_urb(&adap->fe_adap[0].stream);
                adap->feedcount = 0;
        }
 
index ed5c161..c3e461e 100644 (file)
@@ -86,12 +86,12 @@ static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq)
        }
 
        for (i = 0; i < d->props.num_adapters; i++)
-               flags |= d->adapter[i].props.caps;
+               flags |= d->adapter[i].props.fe[0].caps;
 
        /* Some devices(Dposh) might crash if we attempt touch at all. */
        if (flags & DVB_USB_ADAP_HAS_PID_FILTER) {
                for (i = 0; i < d->props.num_adapters; i++) {
-                       epi = d->adapter[i].props.stream.endpoint - 0x81;
+                       epi = d->adapter[i].props.fe[0].stream.endpoint - 0x81;
 
                        if (epi < 0 || epi >= M9206_MAX_ADAPTERS) {
                                printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n");
@@ -292,7 +292,7 @@ static int m920x_update_filters(struct dvb_usb_adapter *adap)
        struct m920x_state *m = adap->dev->priv;
        int enabled = m->filtering_enabled[adap->id];
        int i, ret = 0, filter = 0;
-       int ep = adap->props.stream.endpoint;
+       int ep = adap->props.fe[0].stream.endpoint;
 
        for (i = 0; i < M9206_MAX_FILTERS; i++)
                if (m->filters[adap->id][i] == 8192)
@@ -501,7 +501,7 @@ static int m920x_mt352_frontend_attach(struct dvb_usb_adapter *adap)
 {
        deb("%s\n",__func__);
 
-       if ((adap->fe[0] = dvb_attach(mt352_attach,
+       if ((adap->fe_adap[0].fe = dvb_attach(mt352_attach,
                                   &m920x_mt352_config,
                                   &adap->dev->i2c_adap)) == NULL)
                return -EIO;
@@ -513,7 +513,7 @@ static int m920x_tda10046_08_frontend_attach(struct dvb_usb_adapter *adap)
 {
        deb("%s\n",__func__);
 
-       if ((adap->fe[0] = dvb_attach(tda10046_attach,
+       if ((adap->fe_adap[0].fe = dvb_attach(tda10046_attach,
                                   &m920x_tda10046_08_config,
                                   &adap->dev->i2c_adap)) == NULL)
                return -EIO;
@@ -525,7 +525,7 @@ static int m920x_tda10046_0b_frontend_attach(struct dvb_usb_adapter *adap)
 {
        deb("%s\n",__func__);
 
-       if ((adap->fe[0] = dvb_attach(tda10046_attach,
+       if ((adap->fe_adap[0].fe = dvb_attach(tda10046_attach,
                                   &m920x_tda10046_0b_config,
                                   &adap->dev->i2c_adap)) == NULL)
                return -EIO;
@@ -537,7 +537,7 @@ static int m920x_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
 {
        deb("%s\n",__func__);
 
-       if (dvb_attach(qt1010_attach, adap->fe[0], &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL)
+       if (dvb_attach(qt1010_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL)
                return -ENODEV;
 
        return 0;
@@ -547,7 +547,7 @@ static int m920x_tda8275_60_tuner_attach(struct dvb_usb_adapter *adap)
 {
        deb("%s\n",__func__);
 
-       if (dvb_attach(tda827x_attach, adap->fe[0], 0x60, &adap->dev->i2c_adap, NULL) == NULL)
+       if (dvb_attach(tda827x_attach, adap->fe_adap[0].fe, 0x60, &adap->dev->i2c_adap, NULL) == NULL)
                return -ENODEV;
 
        return 0;
@@ -557,7 +557,7 @@ static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap)
 {
        deb("%s\n",__func__);
 
-       if (dvb_attach(tda827x_attach, adap->fe[0], 0x61, &adap->dev->i2c_adap, NULL) == NULL)
+       if (dvb_attach(tda827x_attach, adap->fe_adap[0].fe, 0x61, &adap->dev->i2c_adap, NULL) == NULL)
                return -ENODEV;
 
        return 0;
@@ -565,7 +565,7 @@ static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap)
 
 static int m920x_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(simple_tuner_attach, adap->fe[0],
+       dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
                   &adap->dev->i2c_adap, 0x61,
                   TUNER_PHILIPS_FMD1216ME_MK3);
        return 0;
@@ -807,6 +807,9 @@ static struct dvb_usb_device_properties megasky_properties = {
        .identify_state   = m920x_identify_state,
        .num_adapters = 1,
        .adapter = {{
+               .num_frontends = 1,
+               .fe = {{
+
                .caps = DVB_USB_ADAP_HAS_PID_FILTER |
                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
 
@@ -827,6 +830,7 @@ static struct dvb_usb_device_properties megasky_properties = {
                                }
                        }
                },
+               }},
        }},
        .i2c_algo         = &m920x_i2c_algo,
 
@@ -851,6 +855,9 @@ static struct dvb_usb_device_properties digivox_mini_ii_properties = {
        .identify_state   = m920x_identify_state,
        .num_adapters = 1,
        .adapter = {{
+               .num_frontends = 1,
+               .fe = {{
+
                .caps = DVB_USB_ADAP_HAS_PID_FILTER |
                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
 
@@ -871,6 +878,7 @@ static struct dvb_usb_device_properties digivox_mini_ii_properties = {
                                }
                        }
                },
+               }},
        }},
        .i2c_algo         = &m920x_i2c_algo,
 
@@ -910,6 +918,9 @@ static struct dvb_usb_device_properties tvwalkertwin_properties = {
        .identify_state   = m920x_identify_state,
        .num_adapters = 2,
        .adapter = {{
+               .num_frontends = 1,
+               .fe = {{
+
                .caps = DVB_USB_ADAP_HAS_PID_FILTER |
                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
 
@@ -929,7 +940,11 @@ static struct dvb_usb_device_properties tvwalkertwin_properties = {
                                         .buffersize = 512,
                                 }
                        }
+               }},
                }},{
+               .num_frontends = 1,
+               .fe = {{
+
                .caps = DVB_USB_ADAP_HAS_PID_FILTER |
                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
 
@@ -949,6 +964,7 @@ static struct dvb_usb_device_properties tvwalkertwin_properties = {
                                         .buffersize = 512,
                                 }
                        }
+               }},
                },
        }},
        .i2c_algo         = &m920x_i2c_algo,
@@ -974,6 +990,8 @@ static struct dvb_usb_device_properties dposh_properties = {
        .identify_state   = m920x_identify_state,
        .num_adapters = 1,
        .adapter = {{
+               .num_frontends = 1,
+               .fe = {{
                /* Hardware pid filters don't work with this device/firmware */
 
                .frontend_attach  = m920x_mt352_frontend_attach,
@@ -989,6 +1007,7 @@ static struct dvb_usb_device_properties dposh_properties = {
                                 }
                        }
                },
+               }},
        }},
        .i2c_algo         = &m920x_i2c_algo,
 
@@ -1019,6 +1038,9 @@ static struct dvb_usb_device_properties pinnacle_pctv310e_properties = {
        .identify_state   = m920x_identify_state,
        .num_adapters = 1,
        .adapter = {{
+               .num_frontends = 1,
+               .fe = {{
+
                .caps = DVB_USB_ADAP_HAS_PID_FILTER |
                        DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
 
@@ -1041,6 +1063,7 @@ static struct dvb_usb_device_properties pinnacle_pctv310e_properties = {
                                }
                        }
                },
+               }},
        } },
        .i2c_algo         = &m920x_i2c_algo,
 
index 3da452a..0c3f69a 100644 (file)
@@ -253,7 +253,8 @@ static int mxl111sf_adap_fe_init(struct dvb_frontend *fe)
        struct dvb_usb_adapter *adap = fe->dvb->priv;
        struct dvb_usb_device *d = adap->dev;
        struct mxl111sf_state *state = d->priv;
-       struct mxl111sf_adap_state *adap_state = adap->priv;
+       struct mxl111sf_adap_state *adap_state = adap->fe_adap[fe->id].priv;
+
        int err;
 
        /* exit if we didnt initialize the driver yet */
@@ -311,7 +312,7 @@ static int mxl111sf_adap_fe_sleep(struct dvb_frontend *fe)
        struct dvb_usb_adapter *adap = fe->dvb->priv;
        struct dvb_usb_device *d = adap->dev;
        struct mxl111sf_state *state = d->priv;
-       struct mxl111sf_adap_state *adap_state = adap->priv;
+       struct mxl111sf_adap_state *adap_state = adap->fe_adap[fe->id].priv;
        int err;
 
        /* exit if we didnt initialize the driver yet */
@@ -336,7 +337,7 @@ static int mxl111sf_ep6_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 {
        struct dvb_usb_device *d = adap->dev;
        struct mxl111sf_state *state = d->priv;
-       struct mxl111sf_adap_state *adap_state = adap->priv;
+       struct mxl111sf_adap_state *adap_state = adap->fe_adap[adap->active_fe].priv;
        int ret = 0;
        u8 tmp;
 
@@ -378,7 +379,7 @@ static int mxl111sf_lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
 {
        struct dvb_usb_device *d = adap->dev;
        struct mxl111sf_state *state = d->priv;
-       struct mxl111sf_adap_state *adap_state = adap->priv;
+       struct mxl111sf_adap_state *adap_state = adap->fe_adap[0].priv;
        int ret;
 
        deb_adv("%s()\n", __func__);
@@ -421,14 +422,14 @@ static int mxl111sf_lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
        if (mxl_fail(ret))
                goto fail;
 
-       adap->fe[0] = dvb_attach(lgdt3305_attach,
+       adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach,
                                 &hauppauge_lgdt3305_config,
                                 &adap->dev->i2c_adap);
-       if (adap->fe[0]) {
-               adap_state->fe_init = adap->fe[0]->ops.init;
-               adap->fe[0]->ops.init = mxl111sf_adap_fe_init;
-               adap_state->fe_sleep = adap->fe[0]->ops.sleep;
-               adap->fe[0]->ops.sleep = mxl111sf_adap_fe_sleep;
+       if (adap->fe_adap[0].fe) {
+               adap_state->fe_init = adap->fe_adap[0].fe->ops.init;
+               adap->fe_adap[0].fe->ops.init = mxl111sf_adap_fe_init;
+               adap_state->fe_sleep = adap->fe_adap[0].fe->ops.sleep;
+               adap->fe_adap[0].fe->ops.sleep = mxl111sf_adap_fe_sleep;
                return 0;
        }
        ret = -EIO;
@@ -516,7 +517,7 @@ static int mxl111sf_attach_tuner(struct dvb_usb_adapter *adap)
 
        deb_adv("%s()\n", __func__);
 
-       if (NULL != dvb_attach(mxl111sf_tuner_attach, adap->fe[0], state,
+       if (NULL != dvb_attach(mxl111sf_tuner_attach, adap->fe_adap[0].fe, state,
                               &mxl_tuner_config))
                return 0;
 
@@ -714,13 +715,16 @@ static struct dvb_usb_device_properties mxl111sf_atsc_bulk_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .fe_ioctl_override = mxl111sf_fe_ioctl_override,
+               .num_frontends = 1,
+               .fe = {{
                        .size_of_priv     = sizeof(struct mxl111sf_adap_state),
-                       .fe_ioctl_override = mxl111sf_fe_ioctl_override,
 
                        .frontend_attach  = mxl111sf_lgdt3305_frontend_attach,
                        .tuner_attach     = mxl111sf_attach_tuner,
 
                        MXL111SF_EP6_BULK_STREAMING_CONFIG,
+               }},
                },
        },
        .num_device_descs = 6,
@@ -768,13 +772,16 @@ static struct dvb_usb_device_properties mxl111sf_atsc_isoc_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .fe_ioctl_override = mxl111sf_fe_ioctl_override,
+               .num_frontends = 1,
+               .fe = {{
                        .size_of_priv     = sizeof(struct mxl111sf_adap_state),
-                       .fe_ioctl_override = mxl111sf_fe_ioctl_override,
 
                        .frontend_attach  = mxl111sf_lgdt3305_frontend_attach,
                        .tuner_attach     = mxl111sf_attach_tuner,
 
                        MXL111SF_EP6_ISOC_STREAMING_CONFIG,
+               }},
                },
        },
        .num_device_descs = 6,
index bc350e9..21384da 100644 (file)
@@ -166,6 +166,8 @@ static struct dvb_usb_device_properties nova_t_properties = {
        .num_adapters     = 1,
        .adapter          = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
                        .pid_filter_count = 32,
 
@@ -186,7 +188,7 @@ static struct dvb_usb_device_properties nova_t_properties = {
                                        }
                                }
                        },
-
+               }},
                        .size_of_priv     = sizeof(struct dibusb_state),
                }
        },
index 170b1ef..b6e12f9 100644 (file)
@@ -263,10 +263,10 @@ static struct stv0299_config opera1_stv0299_config = {
 
 static int opera1_frontend_attach(struct dvb_usb_adapter *d)
 {
-       if ((d->fe[0] =
+       if ((d->fe_adap[0].fe =
             dvb_attach(stv0299_attach, &opera1_stv0299_config,
                        &d->dev->i2c_adap)) != NULL) {
-               d->fe[0]->ops.set_voltage = opera1_set_voltage;
+               d->fe_adap[0].fe->ops.set_voltage = opera1_set_voltage;
                return 0;
        }
        info("not attached stv0299");
@@ -276,7 +276,7 @@ static int opera1_frontend_attach(struct dvb_usb_adapter *d)
 static int opera1_tuner_attach(struct dvb_usb_adapter *adap)
 {
        dvb_attach(
-               dvb_pll_attach, adap->fe[0], 0xc0>>1,
+               dvb_pll_attach, adap->fe_adap[0].fe, 0xc0>>1,
                &adap->dev->i2c_adap, DVB_PLL_OPERA1
        );
        return 0;
@@ -516,6 +516,8 @@ static struct dvb_usb_device_properties opera1_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach = opera1_frontend_attach,
                        .streaming_ctrl = opera1_streaming_ctrl,
                        .tuner_attach = opera1_tuner_attach,
@@ -535,6 +537,7 @@ static struct dvb_usb_device_properties opera1_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .num_device_descs = 1,
index 2a89d1e..0998fe9 100644 (file)
@@ -292,7 +292,7 @@ static void technisat_usb2_green_led_control(struct work_struct *work)
 {
        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[0];
+       struct dvb_frontend *fe = state->dev->adapter[0].fe_adap[0].fe;
 
        if (state->power_state == 0)
                goto schedule;
@@ -505,14 +505,14 @@ static int technisat_usb2_frontend_attach(struct dvb_usb_adapter *a)
        struct usb_device *udev = a->dev->udev;
        int ret;
 
-       a->fe[0] = dvb_attach(stv090x_attach, &technisat_usb2_stv090x_config,
+       a->fe_adap[0].fe = dvb_attach(stv090x_attach, &technisat_usb2_stv090x_config,
                        &a->dev->i2c_adap, STV090x_DEMODULATOR_0);
 
-       if (a->fe[0]) {
+       if (a->fe_adap[0].fe) {
                struct stv6110x_devctl *ctl;
 
                ctl = dvb_attach(stv6110x_attach,
-                               a->fe[0],
+                               a->fe_adap[0].fe,
                                &technisat_usb2_stv6110x_config,
                                &a->dev->i2c_adap);
 
@@ -532,8 +532,8 @@ static int technisat_usb2_frontend_attach(struct dvb_usb_adapter *a)
                        /* call the init function once to initialize
                           tuner's clock output divider and demod's
                           master clock */
-                       if (a->fe[0]->ops.init)
-                               a->fe[0]->ops.init(a->fe[0]);
+                       if (a->fe_adap[0].fe->ops.init)
+                               a->fe_adap[0].fe->ops.init(a->fe_adap[0].fe);
 
                        if (mutex_lock_interruptible(&a->dev->i2c_mutex) < 0)
                                return -EAGAIN;
@@ -548,20 +548,20 @@ static int technisat_usb2_frontend_attach(struct dvb_usb_adapter *a)
                        if (ret != 0)
                                err("could not set IF_CLK to external");
 
-                       a->fe[0]->ops.set_voltage = technisat_usb2_set_voltage;
+                       a->fe_adap[0].fe->ops.set_voltage = technisat_usb2_set_voltage;
 
                        /* if everything was successful assign a nice name to the frontend */
-                       strlcpy(a->fe[0]->ops.info.name, a->dev->desc->name,
-                                       sizeof(a->fe[0]->ops.info.name));
+                       strlcpy(a->fe_adap[0].fe->ops.info.name, a->dev->desc->name,
+                                       sizeof(a->fe_adap[0].fe->ops.info.name));
                } else {
-                       dvb_frontend_detach(a->fe[0]);
-                       a->fe[0] = NULL;
+                       dvb_frontend_detach(a->fe_adap[0].fe);
+                       a->fe_adap[0].fe = NULL;
                }
        }
 
        technisat_usb2_set_led_timer(a->dev, 1, 1);
 
-       return a->fe[0] == NULL ? -ENODEV : 0;
+       return a->fe_adap[0].fe == NULL ? -ENODEV : 0;
 }
 
 /* Remote control */
@@ -697,6 +697,8 @@ static struct dvb_usb_device_properties technisat_usb2_devices = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach  = technisat_usb2_frontend_attach,
 
                        .stream = {
@@ -711,7 +713,7 @@ static struct dvb_usb_device_properties technisat_usb2_devices = {
                                        }
                                }
                        },
-
+               }},
                        .size_of_priv = 0,
                },
        },
index bda37ce..130d296 100644 (file)
@@ -222,7 +222,7 @@ static int ttusb2_frontend_tda10086_attach(struct dvb_usb_adapter *adap)
        if (usb_set_interface(adap->dev->udev,0,3) < 0)
                err("set interface to alts=3 failed");
 
-       if ((adap->fe[0] = dvb_attach(tda10086_attach, &tda10086_config, &adap->dev->i2c_adap)) == NULL) {
+       if ((adap->fe_adap[0].fe = dvb_attach(tda10086_attach, &tda10086_config, &adap->dev->i2c_adap)) == NULL) {
                deb_info("TDA10086 attach failed\n");
                return -ENODEV;
        }
@@ -234,7 +234,7 @@ static int ttusb2_ct3650_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
 {
        struct dvb_usb_adapter *adap = fe->dvb->priv;
 
-       return adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0], enable);
+       return adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe, enable);
 }
 
 static int ttusb2_frontend_tda10023_attach(struct dvb_usb_adapter *adap)
@@ -242,26 +242,26 @@ static int ttusb2_frontend_tda10023_attach(struct dvb_usb_adapter *adap)
        if (usb_set_interface(adap->dev->udev, 0, 3) < 0)
                err("set interface to alts=3 failed");
 
-       if (adap->fe[0] == NULL) {
+       if (adap->fe_adap[0].fe == NULL) {
                /* FE 0 DVB-C */
-               adap->fe[0] = dvb_attach(tda10023_attach,
+               adap->fe_adap[0].fe = dvb_attach(tda10023_attach,
                        &tda10023_config, &adap->dev->i2c_adap, 0x48);
 
-               if (adap->fe[0] == NULL) {
+               if (adap->fe_adap[0].fe == NULL) {
                        deb_info("TDA10023 attach failed\n");
                        return -ENODEV;
                }
        } else {
-               adap->fe[1] = dvb_attach(tda10048_attach,
+               adap->fe_adap[1].fe = dvb_attach(tda10048_attach,
                        &tda10048_config, &adap->dev->i2c_adap);
 
-               if (adap->fe[1] == NULL) {
+               if (adap->fe_adap[1].fe == NULL) {
                        deb_info("TDA10048 attach failed\n");
                        return -ENODEV;
                }
 
                /* tuner is behind TDA10023 I2C-gate */
-               adap->fe[1]->ops.i2c_gate_ctrl = ttusb2_ct3650_i2c_gate_ctrl;
+               adap->fe_adap[1].fe->ops.i2c_gate_ctrl = ttusb2_ct3650_i2c_gate_ctrl;
 
        }
 
@@ -273,10 +273,10 @@ static int ttusb2_tuner_tda827x_attach(struct dvb_usb_adapter *adap)
        struct dvb_frontend *fe;
 
        /* MFE: select correct FE to attach tuner since that's called twice */
-       if (adap->fe[1] == NULL)
-               fe = adap->fe[0];
+       if (adap->fe_adap[1].fe == NULL)
+               fe = adap->fe_adap[0].fe;
        else
-               fe = adap->fe[1];
+               fe = adap->fe_adap[1].fe;
 
        /* attach tuner */
        if (dvb_attach(tda827x_attach, fe, 0x61, &adap->dev->i2c_adap, &tda827x_config) == NULL) {
@@ -288,12 +288,12 @@ static int ttusb2_tuner_tda827x_attach(struct dvb_usb_adapter *adap)
 
 static int ttusb2_tuner_tda826x_attach(struct dvb_usb_adapter *adap)
 {
-       if (dvb_attach(tda826x_attach, adap->fe[0], 0x60, &adap->dev->i2c_adap, 0) == NULL) {
+       if (dvb_attach(tda826x_attach, adap->fe_adap[0].fe, 0x60, &adap->dev->i2c_adap, 0) == NULL) {
                deb_info("TDA8263 attach failed\n");
                return -ENODEV;
        }
 
-       if (dvb_attach(lnbp21_attach, adap->fe[0], &adap->dev->i2c_adap, 0, 0) == NULL) {
+       if (dvb_attach(lnbp21_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap, 0, 0) == NULL) {
                deb_info("LNBP21 attach failed\n");
                return -ENODEV;
        }
@@ -340,6 +340,8 @@ static struct dvb_usb_device_properties ttusb2_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = NULL, // ttusb2_streaming_ctrl,
 
                        .frontend_attach  = ttusb2_frontend_tda10086_attach,
@@ -358,6 +360,7 @@ static struct dvb_usb_device_properties ttusb2_properties = {
                                        }
                                }
                        }
+               }},
                }
        },
 
@@ -392,6 +395,8 @@ static struct dvb_usb_device_properties ttusb2_properties_s2400 = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = NULL,
 
                        .frontend_attach  = ttusb2_frontend_tda10086_attach,
@@ -410,6 +415,7 @@ static struct dvb_usb_device_properties ttusb2_properties_s2400 = {
                                        }
                                }
                        }
+               }},
                }
        },
 
@@ -446,9 +452,10 @@ static struct dvb_usb_device_properties ttusb2_properties_ct3650 = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 2,
+               .fe = {{
                        .streaming_ctrl   = NULL,
 
-                       .num_frontends    = 2,
                        .frontend_attach  = ttusb2_frontend_tda10023_attach,
                        .tuner_attach = ttusb2_tuner_tda827x_attach,
 
@@ -465,6 +472,26 @@ static struct dvb_usb_device_properties ttusb2_properties_ct3650 = {
                                        }
                                }
                        }
+               },{
+                       .streaming_ctrl   = NULL,
+
+                       .frontend_attach  = ttusb2_frontend_tda10023_attach,
+                       .tuner_attach = ttusb2_tuner_tda827x_attach,
+
+                       /* parameter for the MPEG2-data transfer */
+                       .stream = {
+                               .type = USB_ISOC,
+                               .count = 5,
+                               .endpoint = 0x02,
+                               .u = {
+                                       .isoc = {
+                                               .framesperurb = 4,
+                                               .framesize = 940,
+                                               .interval = 1,
+                                       }
+                               }
+                       }
+               }},
                },
        },
 
index ed4765a..463673a 100644 (file)
@@ -60,14 +60,14 @@ static int umt_mt352_frontend_attach(struct dvb_usb_adapter *adap)
        umt_config.demod_init = umt_mt352_demod_init;
        umt_config.demod_address = 0xf;
 
-       adap->fe[0] = dvb_attach(mt352_attach, &umt_config, &adap->dev->i2c_adap);
+       adap->fe_adap[0].fe = 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[0], 0x61, NULL, DVB_PLL_TUA6034);
+       dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, NULL, DVB_PLL_TUA6034);
        return 0;
 }
 
@@ -100,6 +100,8 @@ static struct dvb_usb_device_properties umt_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .streaming_ctrl   = dibusb2_0_streaming_ctrl,
                        .frontend_attach  = umt_mt352_frontend_attach,
                        .tuner_attach     = umt_tuner_attach,
@@ -115,7 +117,7 @@ static struct dvb_usb_device_properties umt_properties = {
                                        }
                                }
                        },
-
+               }},
                        .size_of_priv     = sizeof(struct dibusb_state),
                }
        },
index 47b3462..45e31f2 100644 (file)
@@ -320,7 +320,7 @@ static int vp702x_frontend_attach(struct dvb_usb_adapter *adap)
 
        vp702x_init_pid_filter(adap);
 
-       adap->fe[0] = vp702x_fe_attach(adap->dev);
+       adap->fe_adap[0].fe = vp702x_fe_attach(adap->dev);
        vp702x_usb_out_op(adap->dev, SET_TUNER_POWER_REQ, 1, 7, NULL, 0);
 
        return 0;
@@ -383,6 +383,8 @@ static struct dvb_usb_device_properties vp702x_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .caps             = DVB_USB_ADAP_RECEIVES_204_BYTE_TS,
 
                        .streaming_ctrl   = vp702x_streaming_ctrl,
@@ -399,6 +401,7 @@ static struct dvb_usb_device_properties vp702x_properties = {
                                        }
                                }
                        },
+               }},
                        .size_of_priv     = sizeof(struct vp702x_adapter_state),
                }
        },
index 4264523..498024c 100644 (file)
@@ -214,7 +214,7 @@ static int vp7045_frontend_attach(struct dvb_usb_adapter *adap)
 /*     Dump the EEPROM */
 /*     vp7045_read_eeprom(d,buf, 255, FX2_ID_ADDR); */
 
-       adap->fe[0] = vp7045_fe_attach(adap->dev);
+       adap->fe_adap[0].fe = vp7045_fe_attach(adap->dev);
 
        return 0;
 }
@@ -263,6 +263,8 @@ static struct dvb_usb_device_properties vp7045_properties = {
        .num_adapters = 1,
        .adapter = {
                {
+               .num_frontends = 1,
+               .fe = {{
                        .frontend_attach  = vp7045_frontend_attach,
                        /* parameter for the MPEG2-data transfer */
                        .stream = {
@@ -275,6 +277,7 @@ static struct dvb_usb_device_properties vp7045_properties = {
                                        }
                                }
                        },
+               }},
                }
        },
        .power_ctrl       = vp7045_power_ctrl,