aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Krufky <mkrufky@kernellabs.com>2011-09-06 08:31:57 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-09-06 13:21:42 -0400
commit77eed219fed5a913f59329cc846420fdeab0150f (patch)
treeabcbcb0a970fb7b81efb11e229151adce78e166b
parent4c66c9205c0788e18eb09d482461aa2f551ee046 (diff)
[media] dvb-usb: refactor MFE code for individual streaming config per frontend
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>
-rw-r--r--drivers/media/dvb/dvb-usb/a800.c4
-rw-r--r--drivers/media/dvb/dvb-usb/af9005.c5
-rw-r--r--drivers/media/dvb/dvb-usb/af9015.c44
-rw-r--r--drivers/media/dvb/dvb-usb/anysee.c70
-rw-r--r--drivers/media/dvb/dvb-usb/au6610.c9
-rw-r--r--drivers/media/dvb/dvb-usb/az6027.c13
-rw-r--r--drivers/media/dvb/dvb-usb/ce6230.c9
-rw-r--r--drivers/media/dvb/dvb-usb/cinergyT2-core.c5
-rw-r--r--drivers/media/dvb/dvb-usb/cxusb.c106
-rw-r--r--drivers/media/dvb/dvb-usb/dib0700_core.c18
-rw-r--r--drivers/media/dvb/dvb-usb/dib0700_devices.c364
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-common.c18
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-mb.c28
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-mc.c3
-rw-r--r--drivers/media/dvb/dvb-usb/digitv.c11
-rw-r--r--drivers/media/dvb/dvb-usb/dtt200u.c14
-rw-r--r--drivers/media/dvb/dvb-usb/dtv5100.c11
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-dvb.c141
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-init.c39
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-urb.c28
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb.h38
-rw-r--r--drivers/media/dvb/dvb-usb/dw2102.c115
-rw-r--r--drivers/media/dvb/dvb-usb/ec168.c9
-rw-r--r--drivers/media/dvb/dvb-usb/friio.c7
-rw-r--r--drivers/media/dvb/dvb-usb/gl861.c9
-rw-r--r--drivers/media/dvb/dvb-usb/gp8psk.c5
-rw-r--r--drivers/media/dvb/dvb-usb/it913x.c16
-rw-r--r--drivers/media/dvb/dvb-usb/lmedm04.c36
-rw-r--r--drivers/media/dvb/dvb-usb/m920x.c43
-rw-r--r--drivers/media/dvb/dvb-usb/mxl111sf.c33
-rw-r--r--drivers/media/dvb/dvb-usb/nova-t-usb2.c4
-rw-r--r--drivers/media/dvb/dvb-usb/opera1.c9
-rw-r--r--drivers/media/dvb/dvb-usb/technisat-usb2.c28
-rw-r--r--drivers/media/dvb/dvb-usb/ttusb2.c55
-rw-r--r--drivers/media/dvb/dvb-usb/umt-010.c8
-rw-r--r--drivers/media/dvb/dvb-usb/vp702x.c5
-rw-r--r--drivers/media/dvb/dvb-usb/vp7045.c5
37 files changed, 857 insertions, 508 deletions
diff --git a/drivers/media/dvb/dvb-usb/a800.c b/drivers/media/dvb/dvb-usb/a800.c
index b95a95e17840..2aef3c89e9fa 100644
--- a/drivers/media/dvb/dvb-usb/a800.c
+++ b/drivers/media/dvb/dvb-usb/a800.c
@@ -127,6 +127,8 @@ static struct dvb_usb_device_properties a800_properties = {
127 .num_adapters = 1, 127 .num_adapters = 1,
128 .adapter = { 128 .adapter = {
129 { 129 {
130 .num_frontends = 1,
131 .fe = {{
130 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 132 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
131 .pid_filter_count = 32, 133 .pid_filter_count = 32,
132 .streaming_ctrl = dibusb2_0_streaming_ctrl, 134 .streaming_ctrl = dibusb2_0_streaming_ctrl,
@@ -147,7 +149,7 @@ static struct dvb_usb_device_properties a800_properties = {
147 } 149 }
148 } 150 }
149 }, 151 },
150 152 }},
151 .size_of_priv = sizeof(struct dibusb_state), 153 .size_of_priv = sizeof(struct dibusb_state),
152 }, 154 },
153 }, 155 },
diff --git a/drivers/media/dvb/dvb-usb/af9005.c b/drivers/media/dvb/dvb-usb/af9005.c
index 753b86eafa25..0cf692c2ebdf 100644
--- a/drivers/media/dvb/dvb-usb/af9005.c
+++ b/drivers/media/dvb/dvb-usb/af9005.c
@@ -815,7 +815,7 @@ static int af9005_frontend_attach(struct dvb_usb_adapter *adap)
815 debug_dump(buf, 8, printk); 815 debug_dump(buf, 8, printk);
816 } 816 }
817 } 817 }
818 adap->fe[0] = af9005_fe_attach(adap->dev); 818 adap->fe_adap[0].fe = af9005_fe_attach(adap->dev);
819 return 0; 819 return 0;
820} 820}
821 821
@@ -999,6 +999,8 @@ static struct dvb_usb_device_properties af9005_properties = {
999 .num_adapters = 1, 999 .num_adapters = 1,
1000 .adapter = { 1000 .adapter = {
1001 { 1001 {
1002 .num_frontends = 1,
1003 .fe = {{
1002 .caps = 1004 .caps =
1003 DVB_USB_ADAP_HAS_PID_FILTER | 1005 DVB_USB_ADAP_HAS_PID_FILTER |
1004 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1006 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -1018,6 +1020,7 @@ static struct dvb_usb_device_properties af9005_properties = {
1018 } 1020 }
1019 } 1021 }
1020 }, 1022 },
1023 }},
1021 } 1024 }
1022 }, 1025 },
1023 .power_ctrl = af9005_power_ctrl, 1026 .power_ctrl = af9005_power_ctrl,
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c
index b816600d641c..c6c275bac08e 100644
--- a/drivers/media/dvb/dvb-usb/af9015.c
+++ b/drivers/media/dvb/dvb-usb/af9015.c
@@ -861,13 +861,13 @@ static int af9015_read_config(struct usb_device *udev)
861 for (i = 0; i < af9015_properties_count; i++) { 861 for (i = 0; i < af9015_properties_count; i++) {
862 /* USB1.1 set smaller buffersize and disable 2nd adapter */ 862 /* USB1.1 set smaller buffersize and disable 2nd adapter */
863 if (udev->speed == USB_SPEED_FULL) { 863 if (udev->speed == USB_SPEED_FULL) {
864 af9015_properties[i].adapter[0].stream.u.bulk.buffersize 864 af9015_properties[i].adapter[0].fe[0].stream.u.bulk.buffersize
865 = TS_USB11_FRAME_SIZE; 865 = TS_USB11_FRAME_SIZE;
866 /* disable 2nd adapter because we don't have 866 /* disable 2nd adapter because we don't have
867 PID-filters */ 867 PID-filters */
868 af9015_config.dual_mode = 0; 868 af9015_config.dual_mode = 0;
869 } else { 869 } else {
870 af9015_properties[i].adapter[0].stream.u.bulk.buffersize 870 af9015_properties[i].adapter[0].fe[0].stream.u.bulk.buffersize
871 = TS_USB20_FRAME_SIZE; 871 = TS_USB20_FRAME_SIZE;
872 } 872 }
873 } 873 }
@@ -1113,10 +1113,10 @@ static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
1113 } 1113 }
1114 1114
1115 /* attach demodulator */ 1115 /* attach demodulator */
1116 adap->fe[0] = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id], 1116 adap->fe_adap[0].fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
1117 &adap->dev->i2c_adap); 1117 &adap->dev->i2c_adap);
1118 1118
1119 return adap->fe[0] == NULL ? -ENODEV : 0; 1119 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1120} 1120}
1121 1121
1122static struct mt2060_config af9015_mt2060_config = { 1122static struct mt2060_config af9015_mt2060_config = {
@@ -1190,49 +1190,49 @@ static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
1190 switch (af9015_af9013_config[adap->id].tuner) { 1190 switch (af9015_af9013_config[adap->id].tuner) {
1191 case AF9013_TUNER_MT2060: 1191 case AF9013_TUNER_MT2060:
1192 case AF9013_TUNER_MT2060_2: 1192 case AF9013_TUNER_MT2060_2:
1193 ret = dvb_attach(mt2060_attach, adap->fe[0], &adap->dev->i2c_adap, 1193 ret = dvb_attach(mt2060_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
1194 &af9015_mt2060_config, 1194 &af9015_mt2060_config,
1195 af9015_config.mt2060_if1[adap->id]) 1195 af9015_config.mt2060_if1[adap->id])
1196 == NULL ? -ENODEV : 0; 1196 == NULL ? -ENODEV : 0;
1197 break; 1197 break;
1198 case AF9013_TUNER_QT1010: 1198 case AF9013_TUNER_QT1010:
1199 case AF9013_TUNER_QT1010A: 1199 case AF9013_TUNER_QT1010A:
1200 ret = dvb_attach(qt1010_attach, adap->fe[0], &adap->dev->i2c_adap, 1200 ret = dvb_attach(qt1010_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
1201 &af9015_qt1010_config) == NULL ? -ENODEV : 0; 1201 &af9015_qt1010_config) == NULL ? -ENODEV : 0;
1202 break; 1202 break;
1203 case AF9013_TUNER_TDA18271: 1203 case AF9013_TUNER_TDA18271:
1204 ret = dvb_attach(tda18271_attach, adap->fe[0], 0xc0, 1204 ret = dvb_attach(tda18271_attach, adap->fe_adap[0].fe, 0xc0,
1205 &adap->dev->i2c_adap, 1205 &adap->dev->i2c_adap,
1206 &af9015_tda18271_config) == NULL ? -ENODEV : 0; 1206 &af9015_tda18271_config) == NULL ? -ENODEV : 0;
1207 break; 1207 break;
1208 case AF9013_TUNER_TDA18218: 1208 case AF9013_TUNER_TDA18218:
1209 ret = dvb_attach(tda18218_attach, adap->fe[0], 1209 ret = dvb_attach(tda18218_attach, adap->fe_adap[0].fe,
1210 &adap->dev->i2c_adap, 1210 &adap->dev->i2c_adap,
1211 &af9015_tda18218_config) == NULL ? -ENODEV : 0; 1211 &af9015_tda18218_config) == NULL ? -ENODEV : 0;
1212 break; 1212 break;
1213 case AF9013_TUNER_MXL5003D: 1213 case AF9013_TUNER_MXL5003D:
1214 ret = dvb_attach(mxl5005s_attach, adap->fe[0], 1214 ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
1215 &adap->dev->i2c_adap, 1215 &adap->dev->i2c_adap,
1216 &af9015_mxl5003_config) == NULL ? -ENODEV : 0; 1216 &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
1217 break; 1217 break;
1218 case AF9013_TUNER_MXL5005D: 1218 case AF9013_TUNER_MXL5005D:
1219 case AF9013_TUNER_MXL5005R: 1219 case AF9013_TUNER_MXL5005R:
1220 ret = dvb_attach(mxl5005s_attach, adap->fe[0], 1220 ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
1221 &adap->dev->i2c_adap, 1221 &adap->dev->i2c_adap,
1222 &af9015_mxl5005_config) == NULL ? -ENODEV : 0; 1222 &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
1223 break; 1223 break;
1224 case AF9013_TUNER_ENV77H11D5: 1224 case AF9013_TUNER_ENV77H11D5:
1225 ret = dvb_attach(dvb_pll_attach, adap->fe[0], 0xc0, 1225 ret = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0xc0,
1226 &adap->dev->i2c_adap, 1226 &adap->dev->i2c_adap,
1227 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0; 1227 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
1228 break; 1228 break;
1229 case AF9013_TUNER_MC44S803: 1229 case AF9013_TUNER_MC44S803:
1230 ret = dvb_attach(mc44s803_attach, adap->fe[0], 1230 ret = dvb_attach(mc44s803_attach, adap->fe_adap[0].fe,
1231 &adap->dev->i2c_adap, 1231 &adap->dev->i2c_adap,
1232 &af9015_mc44s803_config) == NULL ? -ENODEV : 0; 1232 &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
1233 break; 1233 break;
1234 case AF9013_TUNER_MXL5007T: 1234 case AF9013_TUNER_MXL5007T:
1235 ret = dvb_attach(mxl5007t_attach, adap->fe[0], 1235 ret = dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
1236 &adap->dev->i2c_adap, 1236 &adap->dev->i2c_adap,
1237 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0; 1237 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
1238 break; 1238 break;
@@ -1306,6 +1306,8 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1306 .num_adapters = 2, 1306 .num_adapters = 2,
1307 .adapter = { 1307 .adapter = {
1308 { 1308 {
1309 .num_frontends = 1,
1310 .fe = {{
1309 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 1311 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1310 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1312 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1311 1313
@@ -1321,8 +1323,11 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1321 .count = 6, 1323 .count = 6,
1322 .endpoint = 0x84, 1324 .endpoint = 0x84,
1323 }, 1325 },
1326 }},
1324 }, 1327 },
1325 { 1328 {
1329 .num_frontends = 1,
1330 .fe = {{
1326 .frontend_attach = 1331 .frontend_attach =
1327 af9015_af9013_frontend_attach, 1332 af9015_af9013_frontend_attach,
1328 .tuner_attach = af9015_tuner_attach, 1333 .tuner_attach = af9015_tuner_attach,
@@ -1337,6 +1342,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1337 } 1342 }
1338 } 1343 }
1339 }, 1344 },
1345 }},
1340 } 1346 }
1341 }, 1347 },
1342 1348
@@ -1434,6 +1440,8 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1434 .num_adapters = 2, 1440 .num_adapters = 2,
1435 .adapter = { 1441 .adapter = {
1436 { 1442 {
1443 .num_frontends = 1,
1444 .fe = {{
1437 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 1445 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1438 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1446 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1439 1447
@@ -1449,8 +1457,11 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1449 .count = 6, 1457 .count = 6,
1450 .endpoint = 0x84, 1458 .endpoint = 0x84,
1451 }, 1459 },
1460 }},
1452 }, 1461 },
1453 { 1462 {
1463 .num_frontends = 1,
1464 .fe = {{
1454 .frontend_attach = 1465 .frontend_attach =
1455 af9015_af9013_frontend_attach, 1466 af9015_af9013_frontend_attach,
1456 .tuner_attach = af9015_tuner_attach, 1467 .tuner_attach = af9015_tuner_attach,
@@ -1465,6 +1476,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1465 } 1476 }
1466 } 1477 }
1467 }, 1478 },
1479 }},
1468 } 1480 }
1469 }, 1481 },
1470 1482
@@ -1551,6 +1563,8 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1551 .num_adapters = 2, 1563 .num_adapters = 2,
1552 .adapter = { 1564 .adapter = {
1553 { 1565 {
1566 .num_frontends = 1,
1567 .fe = {{
1554 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 1568 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1555 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1569 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1556 1570
@@ -1566,8 +1580,11 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1566 .count = 6, 1580 .count = 6,
1567 .endpoint = 0x84, 1581 .endpoint = 0x84,
1568 }, 1582 },
1583 }},
1569 }, 1584 },
1570 { 1585 {
1586 .num_frontends = 1,
1587 .fe = {{
1571 .frontend_attach = 1588 .frontend_attach =
1572 af9015_af9013_frontend_attach, 1589 af9015_af9013_frontend_attach,
1573 .tuner_attach = af9015_tuner_attach, 1590 .tuner_attach = af9015_tuner_attach,
@@ -1582,6 +1599,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1582 } 1599 }
1583 } 1600 }
1584 }, 1601 },
1602 }},
1585 } 1603 }
1586 }, 1604 },
1587 1605
diff --git a/drivers/media/dvb/dvb-usb/anysee.c b/drivers/media/dvb/dvb-usb/anysee.c
index d4d2420155b4..5f2278b73ee9 100644
--- a/drivers/media/dvb/dvb-usb/anysee.c
+++ b/drivers/media/dvb/dvb-usb/anysee.c
@@ -575,7 +575,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
575 }; 575 };
576 576
577 /* detect hardware only once */ 577 /* detect hardware only once */
578 if (adap->fe[0] == NULL) { 578 if (adap->fe_adap[0].fe == NULL) {
579 /* Check which hardware we have. 579 /* Check which hardware we have.
580 * We must do this call two times to get reliable values (hw bug). 580 * We must do this call two times to get reliable values (hw bug).
581 */ 581 */
@@ -595,7 +595,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
595 } 595 }
596 596
597 /* set current frondend ID for devices having two frondends */ 597 /* set current frondend ID for devices having two frondends */
598 if (adap->fe[0]) 598 if (adap->fe_adap[0].fe)
599 state->fe_id++; 599 state->fe_id++;
600 600
601 switch (state->hw) { 601 switch (state->hw) {
@@ -606,13 +606,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
606 break; 606 break;
607 607
608 /* attach demod */ 608 /* attach demod */
609 adap->fe[0] = dvb_attach(mt352_attach, &anysee_mt352_config, 609 adap->fe_adap[0].fe = dvb_attach(mt352_attach, &anysee_mt352_config,
610 &adap->dev->i2c_adap); 610 &adap->dev->i2c_adap);
611 if (adap->fe[0]) 611 if (adap->fe_adap[0].fe)
612 break; 612 break;
613 613
614 /* attach demod */ 614 /* attach demod */
615 adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config, 615 adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
616 &adap->dev->i2c_adap); 616 &adap->dev->i2c_adap);
617 617
618 break; 618 break;
@@ -633,7 +633,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
633 goto error; 633 goto error;
634 634
635 /* attach demod */ 635 /* attach demod */
636 adap->fe[0] = dvb_attach(zl10353_attach, 636 adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
637 &anysee_zl10353_config, &adap->dev->i2c_adap); 637 &anysee_zl10353_config, &adap->dev->i2c_adap);
638 638
639 break; 639 break;
@@ -649,7 +649,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
649 goto error; 649 goto error;
650 650
651 /* attach demod */ 651 /* attach demod */
652 adap->fe[0] = dvb_attach(tda10023_attach, 652 adap->fe_adap[0].fe = dvb_attach(tda10023_attach,
653 &anysee_tda10023_config, &adap->dev->i2c_adap, 0x48); 653 &anysee_tda10023_config, &adap->dev->i2c_adap, 0x48);
654 654
655 break; 655 break;
@@ -665,7 +665,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
665 goto error; 665 goto error;
666 666
667 /* attach demod */ 667 /* attach demod */
668 adap->fe[0] = dvb_attach(cx24116_attach, &anysee_cx24116_config, 668 adap->fe_adap[0].fe = dvb_attach(cx24116_attach, &anysee_cx24116_config,
669 &adap->dev->i2c_adap); 669 &adap->dev->i2c_adap);
670 670
671 break; 671 break;
@@ -707,13 +707,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
707 /* attach demod */ 707 /* attach demod */
708 if (tmp == 0xc7) { 708 if (tmp == 0xc7) {
709 /* TDA18212 config */ 709 /* TDA18212 config */
710 adap->fe[state->fe_id] = dvb_attach( 710 adap->fe_adap[state->fe_id].fe = dvb_attach(
711 tda10023_attach, 711 tda10023_attach,
712 &anysee_tda10023_tda18212_config, 712 &anysee_tda10023_tda18212_config,
713 &adap->dev->i2c_adap, 0x48); 713 &adap->dev->i2c_adap, 0x48);
714 } else { 714 } else {
715 /* PLL config */ 715 /* PLL config */
716 adap->fe[state->fe_id] = dvb_attach( 716 adap->fe_adap[state->fe_id].fe = dvb_attach(
717 tda10023_attach, 717 tda10023_attach,
718 &anysee_tda10023_config, 718 &anysee_tda10023_config,
719 &adap->dev->i2c_adap, 0x48); 719 &adap->dev->i2c_adap, 0x48);
@@ -734,13 +734,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
734 /* attach demod */ 734 /* attach demod */
735 if (tmp == 0xc7) { 735 if (tmp == 0xc7) {
736 /* TDA18212 config */ 736 /* TDA18212 config */
737 adap->fe[state->fe_id] = dvb_attach( 737 adap->fe_adap[state->fe_id].fe = dvb_attach(
738 zl10353_attach, 738 zl10353_attach,
739 &anysee_zl10353_tda18212_config2, 739 &anysee_zl10353_tda18212_config2,
740 &adap->dev->i2c_adap); 740 &adap->dev->i2c_adap);
741 } else { 741 } else {
742 /* PLL config */ 742 /* PLL config */
743 adap->fe[state->fe_id] = dvb_attach( 743 adap->fe_adap[state->fe_id].fe = dvb_attach(
744 zl10353_attach, 744 zl10353_attach,
745 &anysee_zl10353_config, 745 &anysee_zl10353_config,
746 &adap->dev->i2c_adap); 746 &adap->dev->i2c_adap);
@@ -772,7 +772,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
772 goto error; 772 goto error;
773 773
774 /* attach demod */ 774 /* attach demod */
775 adap->fe[state->fe_id] = dvb_attach(tda10023_attach, 775 adap->fe_adap[state->fe_id].fe = dvb_attach(tda10023_attach,
776 &anysee_tda10023_tda18212_config, 776 &anysee_tda10023_tda18212_config,
777 &adap->dev->i2c_adap, 0x48); 777 &adap->dev->i2c_adap, 0x48);
778 } else { 778 } else {
@@ -789,7 +789,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
789 goto error; 789 goto error;
790 790
791 /* attach demod */ 791 /* attach demod */
792 adap->fe[state->fe_id] = dvb_attach(zl10353_attach, 792 adap->fe_adap[state->fe_id].fe = dvb_attach(zl10353_attach,
793 &anysee_zl10353_tda18212_config, 793 &anysee_zl10353_tda18212_config,
794 &adap->dev->i2c_adap); 794 &adap->dev->i2c_adap);
795 } 795 }
@@ -814,13 +814,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
814 goto error; 814 goto error;
815 815
816 /* attach demod */ 816 /* attach demod */
817 adap->fe[0] = dvb_attach(stv0900_attach, &anysee_stv0900_config, 817 adap->fe_adap[0].fe = dvb_attach(stv0900_attach, &anysee_stv0900_config,
818 &adap->dev->i2c_adap, 0); 818 &adap->dev->i2c_adap, 0);
819 819
820 break; 820 break;
821 } 821 }
822 822
823 if (!adap->fe[0]) { 823 if (!adap->fe_adap[0].fe) {
824 /* we have no frontend :-( */ 824 /* we have no frontend :-( */
825 ret = -ENODEV; 825 ret = -ENODEV;
826 err("Unsupported Anysee version. " \ 826 err("Unsupported Anysee version. " \
@@ -842,7 +842,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
842 /* E30 */ 842 /* E30 */
843 843
844 /* attach tuner */ 844 /* attach tuner */
845 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1), 845 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
846 NULL, DVB_PLL_THOMSON_DTT7579); 846 NULL, DVB_PLL_THOMSON_DTT7579);
847 847
848 break; 848 break;
@@ -850,7 +850,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
850 /* E30 Plus */ 850 /* E30 Plus */
851 851
852 /* attach tuner */ 852 /* attach tuner */
853 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1), 853 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
854 &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579); 854 &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
855 855
856 break; 856 break;
@@ -858,7 +858,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
858 /* E30 C Plus */ 858 /* E30 C Plus */
859 859
860 /* attach tuner */ 860 /* attach tuner */
861 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1), 861 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc0 >> 1),
862 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A); 862 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
863 863
864 break; 864 break;
@@ -866,7 +866,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
866 /* E30 S2 Plus */ 866 /* E30 S2 Plus */
867 867
868 /* attach LNB controller */ 868 /* attach LNB controller */
869 fe = dvb_attach(isl6423_attach, adap->fe[0], 869 fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
870 &adap->dev->i2c_adap, &anysee_isl6423_config); 870 &adap->dev->i2c_adap, &anysee_isl6423_config);
871 871
872 break; 872 break;
@@ -883,7 +883,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
883 goto error; 883 goto error;
884 884
885 /* attach tuner */ 885 /* attach tuner */
886 fe = dvb_attach(tda18212_attach, adap->fe[state->fe_id], 886 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
887 &adap->dev->i2c_adap, &anysee_tda18212_config); 887 &adap->dev->i2c_adap, &anysee_tda18212_config);
888 if (fe) 888 if (fe)
889 break; 889 break;
@@ -894,7 +894,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
894 goto error; 894 goto error;
895 895
896 /* attach tuner */ 896 /* attach tuner */
897 fe = dvb_attach(dvb_pll_attach, adap->fe[state->fe_id], 897 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[state->fe_id].fe,
898 (0xc0 >> 1), &adap->dev->i2c_adap, 898 (0xc0 >> 1), &adap->dev->i2c_adap,
899 DVB_PLL_SAMSUNG_DTOS403IH102A); 899 DVB_PLL_SAMSUNG_DTOS403IH102A);
900 900
@@ -910,7 +910,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
910 goto error; 910 goto error;
911 911
912 /* attach tuner */ 912 /* attach tuner */
913 fe = dvb_attach(tda18212_attach, adap->fe[state->fe_id], 913 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
914 &adap->dev->i2c_adap, &anysee_tda18212_config); 914 &adap->dev->i2c_adap, &anysee_tda18212_config);
915 915
916 break; 916 break;
@@ -920,12 +920,12 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
920 /* E7 PS2 */ 920 /* E7 PS2 */
921 921
922 /* attach tuner */ 922 /* attach tuner */
923 fe = dvb_attach(stv6110_attach, adap->fe[0], 923 fe = dvb_attach(stv6110_attach, adap->fe_adap[0].fe,
924 &anysee_stv6110_config, &adap->dev->i2c_adap); 924 &anysee_stv6110_config, &adap->dev->i2c_adap);
925 925
926 if (fe) { 926 if (fe) {
927 /* attach LNB controller */ 927 /* attach LNB controller */
928 fe = dvb_attach(isl6423_attach, adap->fe[0], 928 fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
929 &adap->dev->i2c_adap, &anysee_isl6423_config); 929 &adap->dev->i2c_adap, &anysee_isl6423_config);
930 } 930 }
931 931
@@ -1027,8 +1027,9 @@ static struct dvb_usb_device_properties anysee_properties = {
1027 .num_adapters = 1, 1027 .num_adapters = 1,
1028 .adapter = { 1028 .adapter = {
1029 { 1029 {
1030 .num_frontends = 2, 1030 .num_frontends = 2,
1031 .frontend_ctrl = anysee_frontend_ctrl, 1031 .frontend_ctrl = anysee_frontend_ctrl,
1032 .fe = {{
1032 .streaming_ctrl = anysee_streaming_ctrl, 1033 .streaming_ctrl = anysee_streaming_ctrl,
1033 .frontend_attach = anysee_frontend_attach, 1034 .frontend_attach = anysee_frontend_attach,
1034 .tuner_attach = anysee_tuner_attach, 1035 .tuner_attach = anysee_tuner_attach,
@@ -1042,6 +1043,21 @@ static struct dvb_usb_device_properties anysee_properties = {
1042 } 1043 }
1043 } 1044 }
1044 }, 1045 },
1046 }, {
1047 .streaming_ctrl = anysee_streaming_ctrl,
1048 .frontend_attach = anysee_frontend_attach,
1049 .tuner_attach = anysee_tuner_attach,
1050 .stream = {
1051 .type = USB_BULK,
1052 .count = 8,
1053 .endpoint = 0x82,
1054 .u = {
1055 .bulk = {
1056 .buffersize = (16*512),
1057 }
1058 }
1059 },
1060 }},
1045 } 1061 }
1046 }, 1062 },
1047 1063
diff --git a/drivers/media/dvb/dvb-usb/au6610.c b/drivers/media/dvb/dvb-usb/au6610.c
index ebe6e1ffc319..b77994967b9b 100644
--- a/drivers/media/dvb/dvb-usb/au6610.c
+++ b/drivers/media/dvb/dvb-usb/au6610.c
@@ -140,9 +140,9 @@ static struct zl10353_config au6610_zl10353_config = {
140 140
141static int au6610_zl10353_frontend_attach(struct dvb_usb_adapter *adap) 141static int au6610_zl10353_frontend_attach(struct dvb_usb_adapter *adap)
142{ 142{
143 adap->fe[0] = dvb_attach(zl10353_attach, &au6610_zl10353_config, 143 adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &au6610_zl10353_config,
144 &adap->dev->i2c_adap); 144 &adap->dev->i2c_adap);
145 if (adap->fe[0] == NULL) 145 if (adap->fe_adap[0].fe == NULL)
146 return -ENODEV; 146 return -ENODEV;
147 147
148 return 0; 148 return 0;
@@ -155,7 +155,7 @@ static struct qt1010_config au6610_qt1010_config = {
155static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap) 155static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
156{ 156{
157 return dvb_attach(qt1010_attach, 157 return dvb_attach(qt1010_attach,
158 adap->fe[0], &adap->dev->i2c_adap, 158 adap->fe_adap[0].fe, &adap->dev->i2c_adap,
159 &au6610_qt1010_config) == NULL ? -ENODEV : 0; 159 &au6610_qt1010_config) == NULL ? -ENODEV : 0;
160} 160}
161 161
@@ -204,6 +204,8 @@ static struct dvb_usb_device_properties au6610_properties = {
204 .num_adapters = 1, 204 .num_adapters = 1,
205 .adapter = { 205 .adapter = {
206 { 206 {
207 .num_frontends = 1,
208 .fe = {{
207 .frontend_attach = au6610_zl10353_frontend_attach, 209 .frontend_attach = au6610_zl10353_frontend_attach,
208 .tuner_attach = au6610_qt1010_tuner_attach, 210 .tuner_attach = au6610_qt1010_tuner_attach,
209 211
@@ -219,6 +221,7 @@ static struct dvb_usb_device_properties au6610_properties = {
219 } 221 }
220 } 222 }
221 }, 223 },
224 }},
222 } 225 }
223 }, 226 },
224 227
diff --git a/drivers/media/dvb/dvb-usb/az6027.c b/drivers/media/dvb/dvb-usb/az6027.c
index d59430c48158..82c5f45e3053 100644
--- a/drivers/media/dvb/dvb-usb/az6027.c
+++ b/drivers/media/dvb/dvb-usb/az6027.c
@@ -910,16 +910,16 @@ static int az6027_frontend_attach(struct dvb_usb_adapter *adap)
910 az6027_frontend_reset(adap); 910 az6027_frontend_reset(adap);
911 911
912 deb_info("adap = %p, dev = %p\n", adap, adap->dev); 912 deb_info("adap = %p, dev = %p\n", adap, adap->dev);
913 adap->fe[0] = stb0899_attach(&az6027_stb0899_config, &adap->dev->i2c_adap); 913 adap->fe_adap[0].fe = stb0899_attach(&az6027_stb0899_config, &adap->dev->i2c_adap);
914 914
915 if (adap->fe[0]) { 915 if (adap->fe_adap[0].fe) {
916 deb_info("found STB0899 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb0899_config.demod_address); 916 deb_info("found STB0899 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb0899_config.demod_address);
917 if (stb6100_attach(adap->fe[0], &az6027_stb6100_config, &adap->dev->i2c_adap)) { 917 if (stb6100_attach(adap->fe_adap[0].fe, &az6027_stb6100_config, &adap->dev->i2c_adap)) {
918 deb_info("found STB6100 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb6100_config.tuner_address); 918 deb_info("found STB6100 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb6100_config.tuner_address);
919 adap->fe[0]->ops.set_voltage = az6027_set_voltage; 919 adap->fe_adap[0].fe->ops.set_voltage = az6027_set_voltage;
920 az6027_ci_init(adap); 920 az6027_ci_init(adap);
921 } else { 921 } else {
922 adap->fe[0] = NULL; 922 adap->fe_adap[0].fe = NULL;
923 } 923 }
924 } else 924 } else
925 warn("no front-end attached\n"); 925 warn("no front-end attached\n");
@@ -1106,6 +1106,8 @@ static struct dvb_usb_device_properties az6027_properties = {
1106 .num_adapters = 1, 1106 .num_adapters = 1,
1107 .adapter = { 1107 .adapter = {
1108 { 1108 {
1109 .num_frontends = 1,
1110 .fe = {{
1109 .streaming_ctrl = az6027_streaming_ctrl, 1111 .streaming_ctrl = az6027_streaming_ctrl,
1110 .frontend_attach = az6027_frontend_attach, 1112 .frontend_attach = az6027_frontend_attach,
1111 1113
@@ -1120,6 +1122,7 @@ static struct dvb_usb_device_properties az6027_properties = {
1120 } 1122 }
1121 } 1123 }
1122 }, 1124 },
1125 }},
1123 } 1126 }
1124 }, 1127 },
1125/* 1128/*
diff --git a/drivers/media/dvb/dvb-usb/ce6230.c b/drivers/media/dvb/dvb-usb/ce6230.c
index 5655ce411d70..57afb5a9157e 100644
--- a/drivers/media/dvb/dvb-usb/ce6230.c
+++ b/drivers/media/dvb/dvb-usb/ce6230.c
@@ -186,9 +186,9 @@ static struct zl10353_config ce6230_zl10353_config = {
186static int ce6230_zl10353_frontend_attach(struct dvb_usb_adapter *adap) 186static int ce6230_zl10353_frontend_attach(struct dvb_usb_adapter *adap)
187{ 187{
188 deb_info("%s:\n", __func__); 188 deb_info("%s:\n", __func__);
189 adap->fe[0] = dvb_attach(zl10353_attach, &ce6230_zl10353_config, 189 adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &ce6230_zl10353_config,
190 &adap->dev->i2c_adap); 190 &adap->dev->i2c_adap);
191 if (adap->fe[0] == NULL) 191 if (adap->fe_adap[0].fe == NULL)
192 return -ENODEV; 192 return -ENODEV;
193 return 0; 193 return 0;
194} 194}
@@ -214,7 +214,7 @@ static int ce6230_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
214{ 214{
215 int ret; 215 int ret;
216 deb_info("%s:\n", __func__); 216 deb_info("%s:\n", __func__);
217 ret = dvb_attach(mxl5005s_attach, adap->fe[0], &adap->dev->i2c_adap, 217 ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
218 &ce6230_mxl5003s_config) == NULL ? -ENODEV : 0; 218 &ce6230_mxl5003s_config) == NULL ? -ENODEV : 0;
219 return ret; 219 return ret;
220} 220}
@@ -273,6 +273,8 @@ static struct dvb_usb_device_properties ce6230_properties = {
273 .num_adapters = 1, 273 .num_adapters = 1,
274 .adapter = { 274 .adapter = {
275 { 275 {
276 .num_frontends = 1,
277 .fe = {{
276 .frontend_attach = ce6230_zl10353_frontend_attach, 278 .frontend_attach = ce6230_zl10353_frontend_attach,
277 .tuner_attach = ce6230_mxl5003s_tuner_attach, 279 .tuner_attach = ce6230_mxl5003s_tuner_attach,
278 .stream = { 280 .stream = {
@@ -285,6 +287,7 @@ static struct dvb_usb_device_properties ce6230_properties = {
285 } 287 }
286 } 288 }
287 }, 289 },
290 }},
288 } 291 }
289 }, 292 },
290 293
diff --git a/drivers/media/dvb/dvb-usb/cinergyT2-core.c b/drivers/media/dvb/dvb-usb/cinergyT2-core.c
index 0dd42bdbe285..f9d905002ec9 100644
--- a/drivers/media/dvb/dvb-usb/cinergyT2-core.c
+++ b/drivers/media/dvb/dvb-usb/cinergyT2-core.c
@@ -69,7 +69,7 @@ static int cinergyt2_frontend_attach(struct dvb_usb_adapter *adap)
69 char state[3]; 69 char state[3];
70 int ret; 70 int ret;
71 71
72 adap->fe[0] = cinergyt2_fe_attach(adap->dev); 72 adap->fe_adap[0].fe = cinergyt2_fe_attach(adap->dev);
73 73
74 ret = dvb_usb_generic_rw(adap->dev, query, sizeof(query), state, 74 ret = dvb_usb_generic_rw(adap->dev, query, sizeof(query), state,
75 sizeof(state), 0); 75 sizeof(state), 0);
@@ -198,6 +198,8 @@ static struct dvb_usb_device_properties cinergyt2_properties = {
198 .num_adapters = 1, 198 .num_adapters = 1,
199 .adapter = { 199 .adapter = {
200 { 200 {
201 .num_frontends = 1,
202 .fe = {{
201 .streaming_ctrl = cinergyt2_streaming_ctrl, 203 .streaming_ctrl = cinergyt2_streaming_ctrl,
202 .frontend_attach = cinergyt2_frontend_attach, 204 .frontend_attach = cinergyt2_frontend_attach,
203 205
@@ -212,6 +214,7 @@ static struct dvb_usb_device_properties cinergyt2_properties = {
212 } 214 }
213 } 215 }
214 }, 216 },
217 }},
215 } 218 }
216 }, 219 },
217 220
diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c
index a76f431d6a26..7f610da8cca8 100644
--- a/drivers/media/dvb/dvb-usb/cxusb.c
+++ b/drivers/media/dvb/dvb-usb/cxusb.c
@@ -347,7 +347,7 @@ static void cxusb_d680_dmb_drain_message(struct dvb_usb_device *d)
347 347
348static void cxusb_d680_dmb_drain_video(struct dvb_usb_device *d) 348static void cxusb_d680_dmb_drain_video(struct dvb_usb_device *d)
349{ 349{
350 struct usb_data_stream_properties *p = &d->props.adapter[0].stream; 350 struct usb_data_stream_properties *p = &d->props.adapter[0].fe[0].stream;
351 const int timeout = 100; 351 const int timeout = 100;
352 const int junk_len = p->u.bulk.buffersize; 352 const int junk_len = p->u.bulk.buffersize;
353 u8 *junk; 353 u8 *junk;
@@ -725,7 +725,7 @@ static struct max2165_config mygica_d689_max2165_cfg = {
725/* Callbacks for DVB USB */ 725/* Callbacks for DVB USB */
726static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap) 726static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
727{ 727{
728 dvb_attach(simple_tuner_attach, adap->fe[0], 728 dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
729 &adap->dev->i2c_adap, 0x61, 729 &adap->dev->i2c_adap, 0x61,
730 TUNER_PHILIPS_FMD1216ME_MK3); 730 TUNER_PHILIPS_FMD1216ME_MK3);
731 return 0; 731 return 0;
@@ -733,27 +733,27 @@ static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
733 733
734static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap) 734static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
735{ 735{
736 dvb_attach(dvb_pll_attach, adap->fe[0], 0x61, 736 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61,
737 NULL, DVB_PLL_THOMSON_DTT7579); 737 NULL, DVB_PLL_THOMSON_DTT7579);
738 return 0; 738 return 0;
739} 739}
740 740
741static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap) 741static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
742{ 742{
743 dvb_attach(dvb_pll_attach, adap->fe[0], 0x61, NULL, DVB_PLL_LG_Z201); 743 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, NULL, DVB_PLL_LG_Z201);
744 return 0; 744 return 0;
745} 745}
746 746
747static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap) 747static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
748{ 748{
749 dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, 749 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
750 NULL, DVB_PLL_THOMSON_DTT7579); 750 NULL, DVB_PLL_THOMSON_DTT7579);
751 return 0; 751 return 0;
752} 752}
753 753
754static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap) 754static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
755{ 755{
756 dvb_attach(simple_tuner_attach, adap->fe[0], 756 dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
757 &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF); 757 &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
758 return 0; 758 return 0;
759} 759}
@@ -795,9 +795,9 @@ static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
795 }; 795 };
796 796
797 /* FIXME: generalize & move to common area */ 797 /* FIXME: generalize & move to common area */
798 adap->fe[0]->callback = dvico_bluebird_xc2028_callback; 798 adap->fe_adap[0].fe->callback = dvico_bluebird_xc2028_callback;
799 799
800 fe = dvb_attach(xc2028_attach, adap->fe[0], &cfg); 800 fe = dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &cfg);
801 if (fe == NULL || fe->ops.tuner_ops.set_config == NULL) 801 if (fe == NULL || fe->ops.tuner_ops.set_config == NULL)
802 return -EIO; 802 return -EIO;
803 803
@@ -808,7 +808,7 @@ static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
808 808
809static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap) 809static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
810{ 810{
811 dvb_attach(mxl5005s_attach, adap->fe[0], 811 dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
812 &adap->dev->i2c_adap, &aver_a868r_tuner); 812 &adap->dev->i2c_adap, &aver_a868r_tuner);
813 return 0; 813 return 0;
814} 814}
@@ -816,7 +816,7 @@ static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
816static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap) 816static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
817{ 817{
818 struct dvb_frontend *fe; 818 struct dvb_frontend *fe;
819 fe = dvb_attach(mxl5005s_attach, adap->fe[0], 819 fe = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
820 &adap->dev->i2c_adap, &d680_dmb_tuner); 820 &adap->dev->i2c_adap, &d680_dmb_tuner);
821 return (fe == NULL) ? -EIO : 0; 821 return (fe == NULL) ? -EIO : 0;
822} 822}
@@ -824,7 +824,7 @@ static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
824static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap) 824static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap)
825{ 825{
826 struct dvb_frontend *fe; 826 struct dvb_frontend *fe;
827 fe = dvb_attach(max2165_attach, adap->fe[0], 827 fe = dvb_attach(max2165_attach, adap->fe_adap[0].fe,
828 &adap->dev->i2c_adap, &mygica_d689_max2165_cfg); 828 &adap->dev->i2c_adap, &mygica_d689_max2165_cfg);
829 return (fe == NULL) ? -EIO : 0; 829 return (fe == NULL) ? -EIO : 0;
830} 830}
@@ -837,7 +837,7 @@ static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
837 837
838 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1); 838 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1);
839 839
840 if ((adap->fe[0] = dvb_attach(cx22702_attach, &cxusb_cx22702_config, 840 if ((adap->fe_adap[0].fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
841 &adap->dev->i2c_adap)) != NULL) 841 &adap->dev->i2c_adap)) != NULL)
842 return 0; 842 return 0;
843 843
@@ -851,7 +851,7 @@ static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
851 851
852 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0); 852 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
853 853
854 if ((adap->fe[0] = dvb_attach(lgdt330x_attach, &cxusb_lgdt3303_config, 854 if ((adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach, &cxusb_lgdt3303_config,
855 &adap->dev->i2c_adap)) != NULL) 855 &adap->dev->i2c_adap)) != NULL)
856 return 0; 856 return 0;
857 857
@@ -860,9 +860,9 @@ static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
860 860
861static int cxusb_aver_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap) 861static int cxusb_aver_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
862{ 862{
863 adap->fe[0] = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config, 863 adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config,
864 &adap->dev->i2c_adap); 864 &adap->dev->i2c_adap);
865 if (adap->fe[0] != NULL) 865 if (adap->fe_adap[0].fe != NULL)
866 return 0; 866 return 0;
867 867
868 return -EIO; 868 return -EIO;
@@ -876,7 +876,7 @@ static int cxusb_mt352_frontend_attach(struct dvb_usb_adapter *adap)
876 876
877 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0); 877 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
878 878
879 if ((adap->fe[0] = dvb_attach(mt352_attach, &cxusb_mt352_config, 879 if ((adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_mt352_config,
880 &adap->dev->i2c_adap)) != NULL) 880 &adap->dev->i2c_adap)) != NULL)
881 return 0; 881 return 0;
882 882
@@ -890,9 +890,9 @@ static int cxusb_dee1601_frontend_attach(struct dvb_usb_adapter *adap)
890 890
891 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0); 891 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
892 892
893 if (((adap->fe[0] = dvb_attach(mt352_attach, &cxusb_dee1601_config, 893 if (((adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_dee1601_config,
894 &adap->dev->i2c_adap)) != NULL) || 894 &adap->dev->i2c_adap)) != NULL) ||
895 ((adap->fe[0] = dvb_attach(zl10353_attach, 895 ((adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
896 &cxusb_zl10353_dee1601_config, 896 &cxusb_zl10353_dee1601_config,
897 &adap->dev->i2c_adap)) != NULL)) 897 &adap->dev->i2c_adap)) != NULL))
898 return 0; 898 return 0;
@@ -917,7 +917,7 @@ static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
917 cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1); 917 cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
918 cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1); 918 cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
919 919
920 if ((adap->fe[0] = dvb_attach(zl10353_attach, 920 if ((adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
921 &cxusb_zl10353_xc3028_config_no_i2c_gate, 921 &cxusb_zl10353_xc3028_config_no_i2c_gate,
922 &adap->dev->i2c_adap)) == NULL) 922 &adap->dev->i2c_adap)) == NULL)
923 return -EIO; 923 return -EIO;
@@ -1031,9 +1031,9 @@ static int cxusb_dualdig4_rev2_frontend_attach(struct dvb_usb_adapter *adap)
1031 return -ENODEV; 1031 return -ENODEV;
1032 } 1032 }
1033 1033
1034 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, 1034 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1035 &cxusb_dualdig4_rev2_config); 1035 &cxusb_dualdig4_rev2_config);
1036 if (adap->fe[0] == NULL) 1036 if (adap->fe_adap[0].fe == NULL)
1037 return -EIO; 1037 return -EIO;
1038 1038
1039 return 0; 1039 return 0;
@@ -1084,15 +1084,15 @@ static int cxusb_dualdig4_rev2_tuner_attach(struct dvb_usb_adapter *adap)
1084{ 1084{
1085 struct dib0700_adapter_state *st = adap->priv; 1085 struct dib0700_adapter_state *st = adap->priv;
1086 struct i2c_adapter *tun_i2c = 1086 struct i2c_adapter *tun_i2c =
1087 dib7000p_get_i2c_master(adap->fe[0], 1087 dib7000p_get_i2c_master(adap->fe_adap[0].fe,
1088 DIBX000_I2C_INTERFACE_TUNER, 1); 1088 DIBX000_I2C_INTERFACE_TUNER, 1);
1089 1089
1090 if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, 1090 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1091 &dib7070p_dib0070_config) == NULL) 1091 &dib7070p_dib0070_config) == NULL)
1092 return -ENODEV; 1092 return -ENODEV;
1093 1093
1094 st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 1094 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1095 adap->fe[0]->ops.tuner_ops.set_params = dib7070_set_param_override; 1095 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1096 return 0; 1096 return 0;
1097} 1097}
1098 1098
@@ -1108,12 +1108,12 @@ static int cxusb_nano2_frontend_attach(struct dvb_usb_adapter *adap)
1108 cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1); 1108 cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
1109 cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1); 1109 cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
1110 1110
1111 if ((adap->fe[0] = dvb_attach(zl10353_attach, 1111 if ((adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
1112 &cxusb_zl10353_xc3028_config, 1112 &cxusb_zl10353_xc3028_config,
1113 &adap->dev->i2c_adap)) != NULL) 1113 &adap->dev->i2c_adap)) != NULL)
1114 return 0; 1114 return 0;
1115 1115
1116 if ((adap->fe[0] = dvb_attach(mt352_attach, 1116 if ((adap->fe_adap[0].fe = dvb_attach(mt352_attach,
1117 &cxusb_mt352_xc3028_config, 1117 &cxusb_mt352_xc3028_config,
1118 &adap->dev->i2c_adap)) != NULL) 1118 &adap->dev->i2c_adap)) != NULL)
1119 return 0; 1119 return 0;
@@ -1150,7 +1150,7 @@ static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
1150 usb_clear_halt(d->udev, 1150 usb_clear_halt(d->udev,
1151 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); 1151 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1152 usb_clear_halt(d->udev, 1152 usb_clear_halt(d->udev,
1153 usb_rcvbulkpipe(d->udev, d->props.adapter[0].stream.endpoint)); 1153 usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1154 1154
1155 /* Drain USB pipes to avoid hang after reboot */ 1155 /* Drain USB pipes to avoid hang after reboot */
1156 for (n = 0; n < 5; n++) { 1156 for (n = 0; n < 5; n++) {
@@ -1172,8 +1172,8 @@ static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
1172 msleep(100); 1172 msleep(100);
1173 1173
1174 /* Attach frontend */ 1174 /* Attach frontend */
1175 adap->fe[0] = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap); 1175 adap->fe_adap[0].fe = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap);
1176 if (adap->fe[0] == NULL) 1176 if (adap->fe_adap[0].fe == NULL)
1177 return -EIO; 1177 return -EIO;
1178 1178
1179 return 0; 1179 return 0;
@@ -1207,7 +1207,7 @@ static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
1207 usb_clear_halt(d->udev, 1207 usb_clear_halt(d->udev,
1208 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); 1208 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1209 usb_clear_halt(d->udev, 1209 usb_clear_halt(d->udev,
1210 usb_rcvbulkpipe(d->udev, d->props.adapter[0].stream.endpoint)); 1210 usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1211 1211
1212 1212
1213 /* Reset the tuner */ 1213 /* Reset the tuner */
@@ -1223,9 +1223,9 @@ static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
1223 msleep(100); 1223 msleep(100);
1224 1224
1225 /* Attach frontend */ 1225 /* Attach frontend */
1226 adap->fe[0] = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg, 1226 adap->fe_adap[0].fe = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
1227 &d->i2c_adap); 1227 &d->i2c_adap);
1228 if (adap->fe[0] == NULL) 1228 if (adap->fe_adap[0].fe == NULL)
1229 return -EIO; 1229 return -EIO;
1230 1230
1231 return 0; 1231 return 0;
@@ -1383,6 +1383,8 @@ static struct dvb_usb_device_properties cxusb_medion_properties = {
1383 .num_adapters = 1, 1383 .num_adapters = 1,
1384 .adapter = { 1384 .adapter = {
1385 { 1385 {
1386 .num_frontends = 1,
1387 .fe = {{
1386 .streaming_ctrl = cxusb_streaming_ctrl, 1388 .streaming_ctrl = cxusb_streaming_ctrl,
1387 .frontend_attach = cxusb_cx22702_frontend_attach, 1389 .frontend_attach = cxusb_cx22702_frontend_attach,
1388 .tuner_attach = cxusb_fmd1216me_tuner_attach, 1390 .tuner_attach = cxusb_fmd1216me_tuner_attach,
@@ -1397,7 +1399,7 @@ static struct dvb_usb_device_properties cxusb_medion_properties = {
1397 } 1399 }
1398 } 1400 }
1399 }, 1401 },
1400 1402 }},
1401 }, 1403 },
1402 }, 1404 },
1403 .power_ctrl = cxusb_power_ctrl, 1405 .power_ctrl = cxusb_power_ctrl,
@@ -1429,6 +1431,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
1429 .num_adapters = 1, 1431 .num_adapters = 1,
1430 .adapter = { 1432 .adapter = {
1431 { 1433 {
1434 .num_frontends = 1,
1435 .fe = {{
1432 .streaming_ctrl = cxusb_streaming_ctrl, 1436 .streaming_ctrl = cxusb_streaming_ctrl,
1433 .frontend_attach = cxusb_lgdt3303_frontend_attach, 1437 .frontend_attach = cxusb_lgdt3303_frontend_attach,
1434 .tuner_attach = cxusb_lgh064f_tuner_attach, 1438 .tuner_attach = cxusb_lgh064f_tuner_attach,
@@ -1444,6 +1448,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
1444 } 1448 }
1445 } 1449 }
1446 }, 1450 },
1451 }},
1447 }, 1452 },
1448 }, 1453 },
1449 1454
@@ -1483,6 +1488,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
1483 .num_adapters = 1, 1488 .num_adapters = 1,
1484 .adapter = { 1489 .adapter = {
1485 { 1490 {
1491 .num_frontends = 1,
1492 .fe = {{
1486 .streaming_ctrl = cxusb_streaming_ctrl, 1493 .streaming_ctrl = cxusb_streaming_ctrl,
1487 .frontend_attach = cxusb_dee1601_frontend_attach, 1494 .frontend_attach = cxusb_dee1601_frontend_attach,
1488 .tuner_attach = cxusb_dee1601_tuner_attach, 1495 .tuner_attach = cxusb_dee1601_tuner_attach,
@@ -1497,6 +1504,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
1497 } 1504 }
1498 } 1505 }
1499 }, 1506 },
1507 }},
1500 }, 1508 },
1501 }, 1509 },
1502 1510
@@ -1544,6 +1552,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
1544 .num_adapters = 2, 1552 .num_adapters = 2,
1545 .adapter = { 1553 .adapter = {
1546 { 1554 {
1555 .num_frontends = 1,
1556 .fe = {{
1547 .streaming_ctrl = cxusb_streaming_ctrl, 1557 .streaming_ctrl = cxusb_streaming_ctrl,
1548 .frontend_attach = cxusb_mt352_frontend_attach, 1558 .frontend_attach = cxusb_mt352_frontend_attach,
1549 .tuner_attach = cxusb_lgz201_tuner_attach, 1559 .tuner_attach = cxusb_lgz201_tuner_attach,
@@ -1559,6 +1569,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
1559 } 1569 }
1560 } 1570 }
1561 }, 1571 },
1572 }},
1562 }, 1573 },
1563 }, 1574 },
1564 .power_ctrl = cxusb_bluebird_power_ctrl, 1575 .power_ctrl = cxusb_bluebird_power_ctrl,
@@ -1596,6 +1607,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
1596 .num_adapters = 1, 1607 .num_adapters = 1,
1597 .adapter = { 1608 .adapter = {
1598 { 1609 {
1610 .num_frontends = 1,
1611 .fe = {{
1599 .streaming_ctrl = cxusb_streaming_ctrl, 1612 .streaming_ctrl = cxusb_streaming_ctrl,
1600 .frontend_attach = cxusb_mt352_frontend_attach, 1613 .frontend_attach = cxusb_mt352_frontend_attach,
1601 .tuner_attach = cxusb_dtt7579_tuner_attach, 1614 .tuner_attach = cxusb_dtt7579_tuner_attach,
@@ -1611,6 +1624,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
1611 } 1624 }
1612 } 1625 }
1613 }, 1626 },
1627 }},
1614 }, 1628 },
1615 }, 1629 },
1616 .power_ctrl = cxusb_bluebird_power_ctrl, 1630 .power_ctrl = cxusb_bluebird_power_ctrl,
@@ -1645,6 +1659,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
1645 .num_adapters = 1, 1659 .num_adapters = 1,
1646 .adapter = { 1660 .adapter = {
1647 { 1661 {
1662 .num_frontends = 1,
1663 .fe = {{
1648 .streaming_ctrl = cxusb_streaming_ctrl, 1664 .streaming_ctrl = cxusb_streaming_ctrl,
1649 .frontend_attach = cxusb_dualdig4_frontend_attach, 1665 .frontend_attach = cxusb_dualdig4_frontend_attach,
1650 .tuner_attach = cxusb_dvico_xc3028_tuner_attach, 1666 .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
@@ -1659,6 +1675,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
1659 } 1675 }
1660 } 1676 }
1661 }, 1677 },
1678 }},
1662 }, 1679 },
1663 }, 1680 },
1664 1681
@@ -1695,6 +1712,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
1695 .num_adapters = 1, 1712 .num_adapters = 1,
1696 .adapter = { 1713 .adapter = {
1697 { 1714 {
1715 .num_frontends = 1,
1716 .fe = {{
1698 .streaming_ctrl = cxusb_streaming_ctrl, 1717 .streaming_ctrl = cxusb_streaming_ctrl,
1699 .frontend_attach = cxusb_nano2_frontend_attach, 1718 .frontend_attach = cxusb_nano2_frontend_attach,
1700 .tuner_attach = cxusb_dvico_xc3028_tuner_attach, 1719 .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
@@ -1709,6 +1728,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
1709 } 1728 }
1710 } 1729 }
1711 }, 1730 },
1731 }},
1712 }, 1732 },
1713 }, 1733 },
1714 1734
@@ -1747,6 +1767,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_prope
1747 .num_adapters = 1, 1767 .num_adapters = 1,
1748 .adapter = { 1768 .adapter = {
1749 { 1769 {
1770 .num_frontends = 1,
1771 .fe = {{
1750 .streaming_ctrl = cxusb_streaming_ctrl, 1772 .streaming_ctrl = cxusb_streaming_ctrl,
1751 .frontend_attach = cxusb_nano2_frontend_attach, 1773 .frontend_attach = cxusb_nano2_frontend_attach,
1752 .tuner_attach = cxusb_dvico_xc3028_tuner_attach, 1774 .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
@@ -1761,6 +1783,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_prope
1761 } 1783 }
1762 } 1784 }
1763 }, 1785 },
1786 }},
1764 }, 1787 },
1765 }, 1788 },
1766 1789
@@ -1796,6 +1819,8 @@ static struct dvb_usb_device_properties cxusb_aver_a868r_properties = {
1796 .num_adapters = 1, 1819 .num_adapters = 1,
1797 .adapter = { 1820 .adapter = {
1798 { 1821 {
1822 .num_frontends = 1,
1823 .fe = {{
1799 .streaming_ctrl = cxusb_aver_streaming_ctrl, 1824 .streaming_ctrl = cxusb_aver_streaming_ctrl,
1800 .frontend_attach = cxusb_aver_lgdt3303_frontend_attach, 1825 .frontend_attach = cxusb_aver_lgdt3303_frontend_attach,
1801 .tuner_attach = cxusb_mxl5003s_tuner_attach, 1826 .tuner_attach = cxusb_mxl5003s_tuner_attach,
@@ -1810,7 +1835,7 @@ static struct dvb_usb_device_properties cxusb_aver_a868r_properties = {
1810 } 1835 }
1811 } 1836 }
1812 }, 1837 },
1813 1838 }},
1814 }, 1839 },
1815 }, 1840 },
1816 .power_ctrl = cxusb_aver_power_ctrl, 1841 .power_ctrl = cxusb_aver_power_ctrl,
@@ -1839,10 +1864,12 @@ struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
1839 .num_adapters = 1, 1864 .num_adapters = 1,
1840 .adapter = { 1865 .adapter = {
1841 { 1866 {
1867 .size_of_priv = sizeof(struct dib0700_adapter_state),
1868 .num_frontends = 1,
1869 .fe = {{
1842 .streaming_ctrl = cxusb_streaming_ctrl, 1870 .streaming_ctrl = cxusb_streaming_ctrl,
1843 .frontend_attach = cxusb_dualdig4_rev2_frontend_attach, 1871 .frontend_attach = cxusb_dualdig4_rev2_frontend_attach,
1844 .tuner_attach = cxusb_dualdig4_rev2_tuner_attach, 1872 .tuner_attach = cxusb_dualdig4_rev2_tuner_attach,
1845 .size_of_priv = sizeof(struct dib0700_adapter_state),
1846 /* parameter for the MPEG2-data transfer */ 1873 /* parameter for the MPEG2-data transfer */
1847 .stream = { 1874 .stream = {
1848 .type = USB_BULK, 1875 .type = USB_BULK,
@@ -1854,6 +1881,7 @@ struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
1854 } 1881 }
1855 } 1882 }
1856 }, 1883 },
1884 }},
1857 }, 1885 },
1858 }, 1886 },
1859 1887
@@ -1889,6 +1917,8 @@ static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
1889 .num_adapters = 1, 1917 .num_adapters = 1,
1890 .adapter = { 1918 .adapter = {
1891 { 1919 {
1920 .num_frontends = 1,
1921 .fe = {{
1892 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl, 1922 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
1893 .frontend_attach = cxusb_d680_dmb_frontend_attach, 1923 .frontend_attach = cxusb_d680_dmb_frontend_attach,
1894 .tuner_attach = cxusb_d680_dmb_tuner_attach, 1924 .tuner_attach = cxusb_d680_dmb_tuner_attach,
@@ -1904,6 +1934,7 @@ static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
1904 } 1934 }
1905 } 1935 }
1906 }, 1936 },
1937 }},
1907 }, 1938 },
1908 }, 1939 },
1909 1940
@@ -1940,6 +1971,8 @@ static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
1940 .num_adapters = 1, 1971 .num_adapters = 1,
1941 .adapter = { 1972 .adapter = {
1942 { 1973 {
1974 .num_frontends = 1,
1975 .fe = {{
1943 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl, 1976 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
1944 .frontend_attach = cxusb_mygica_d689_frontend_attach, 1977 .frontend_attach = cxusb_mygica_d689_frontend_attach,
1945 .tuner_attach = cxusb_mygica_d689_tuner_attach, 1978 .tuner_attach = cxusb_mygica_d689_tuner_attach,
@@ -1955,6 +1988,7 @@ static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
1955 } 1988 }
1956 } 1989 }
1957 }, 1990 },
1991 }},
1958 }, 1992 },
1959 }, 1993 },
1960 1994
diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c
index b693ed13602d..156cbfc9c79d 100644
--- a/drivers/media/dvb/dvb-usb/dib0700_core.c
+++ b/drivers/media/dvb/dvb-usb/dib0700_core.c
@@ -528,13 +528,13 @@ int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw
528 for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters; 528 for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters;
529 adap_num++) { 529 adap_num++) {
530 if (fw_version >= 0x10201) { 530 if (fw_version >= 0x10201) {
531 dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = 188*nb_packet_buffer_size; 531 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 188*nb_packet_buffer_size;
532 } else { 532 } else {
533 /* for fw version older than 1.20.1, 533 /* for fw version older than 1.20.1,
534 * the buffersize has to be n times 512 */ 534 * the buffersize has to be n times 512 */
535 dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512; 535 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
536 if (dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize < 512) 536 if (dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize < 512)
537 dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = 512; 537 dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 512;
538 } 538 }
539 } 539 }
540 } 540 }
@@ -579,18 +579,18 @@ int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
579 deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id); 579 deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id);
580 580
581 st->channel_state &= ~0x3; 581 st->channel_state &= ~0x3;
582 if ((adap->stream.props.endpoint != 2) 582 if ((adap->fe_adap[0].stream.props.endpoint != 2)
583 && (adap->stream.props.endpoint != 3)) { 583 && (adap->fe_adap[0].stream.props.endpoint != 3)) {
584 deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->stream.props.endpoint); 584 deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->fe_adap[0].stream.props.endpoint);
585 if (onoff) 585 if (onoff)
586 st->channel_state |= 1 << (adap->id); 586 st->channel_state |= 1 << (adap->id);
587 else 587 else
588 st->channel_state |= 1 << ~(adap->id); 588 st->channel_state |= 1 << ~(adap->id);
589 } else { 589 } else {
590 if (onoff) 590 if (onoff)
591 st->channel_state |= 1 << (adap->stream.props.endpoint-2); 591 st->channel_state |= 1 << (adap->fe_adap[0].stream.props.endpoint-2);
592 else 592 else
593 st->channel_state |= 1 << (3-adap->stream.props.endpoint); 593 st->channel_state |= 1 << (3-adap->fe_adap[0].stream.props.endpoint);
594 } 594 }
595 595
596 st->buf[2] |= st->channel_state; 596 st->buf[2] |= st->channel_state;
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c
index 754f8ec77e05..3ed6203be437 100644
--- a/drivers/media/dvb/dvb-usb/dib0700_devices.c
+++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c
@@ -101,7 +101,7 @@ static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
101 } 101 }
102 } 102 }
103 st->mt2060_if1[adap->id] = 1220; 103 st->mt2060_if1[adap->id] = 1220;
104 return (adap->fe[0] = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, 104 return (adap->fe_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
105 (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0; 105 (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
106} 106}
107 107
@@ -118,14 +118,14 @@ static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
118static int bristol_tuner_attach(struct dvb_usb_adapter *adap) 118static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
119{ 119{
120 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap; 120 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
121 struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe[0], 1); 121 struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe_adap[0].fe, 1);
122 s8 a; 122 s8 a;
123 int if1=1220; 123 int if1=1220;
124 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) && 124 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
125 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) { 125 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
126 if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a; 126 if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
127 } 127 }
128 return dvb_attach(mt2060_attach,adap->fe[0], tun_i2c,&bristol_mt2060_config[adap->id], 128 return dvb_attach(mt2060_attach,adap->fe_adap[0].fe, tun_i2c,&bristol_mt2060_config[adap->id],
129 if1) == NULL ? -ENODEV : 0; 129 if1) == NULL ? -ENODEV : 0;
130} 130}
131 131
@@ -279,10 +279,10 @@ static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
279 } 279 }
280 } 280 }
281 281
282 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1), 282 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
283 &stk7700d_dib7000p_mt2266_config[adap->id]); 283 &stk7700d_dib7000p_mt2266_config[adap->id]);
284 284
285 return adap->fe[0] == NULL ? -ENODEV : 0; 285 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
286} 286}
287 287
288static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap) 288static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
@@ -306,17 +306,17 @@ static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
306 } 306 }
307 } 307 }
308 308
309 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1), 309 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
310 &stk7700d_dib7000p_mt2266_config[adap->id]); 310 &stk7700d_dib7000p_mt2266_config[adap->id]);
311 311
312 return adap->fe[0] == NULL ? -ENODEV : 0; 312 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
313} 313}
314 314
315static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap) 315static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
316{ 316{
317 struct i2c_adapter *tun_i2c; 317 struct i2c_adapter *tun_i2c;
318 tun_i2c = dib7000p_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1); 318 tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
319 return dvb_attach(mt2266_attach, adap->fe[0], tun_i2c, 319 return dvb_attach(mt2266_attach, adap->fe_adap[0].fe, tun_i2c,
320 &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0; 320 &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
321} 321}
322 322
@@ -396,8 +396,8 @@ static int stk7700ph_xc3028_callback(void *ptr, int component,
396 switch (command) { 396 switch (command) {
397 case XC2028_TUNER_RESET: 397 case XC2028_TUNER_RESET:
398 /* Send the tuner in then out of reset */ 398 /* Send the tuner in then out of reset */
399 dib7000p_set_gpio(adap->fe[0], 8, 0, 0); msleep(10); 399 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 0); msleep(10);
400 dib7000p_set_gpio(adap->fe[0], 8, 0, 1); 400 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
401 break; 401 break;
402 case XC2028_RESET_CLK: 402 case XC2028_RESET_CLK:
403 break; 403 break;
@@ -447,25 +447,25 @@ static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
447 return -ENODEV; 447 return -ENODEV;
448 } 448 }
449 449
450 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, 450 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
451 &stk7700ph_dib7700_xc3028_config); 451 &stk7700ph_dib7700_xc3028_config);
452 452
453 return adap->fe[0] == NULL ? -ENODEV : 0; 453 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
454} 454}
455 455
456static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap) 456static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
457{ 457{
458 struct i2c_adapter *tun_i2c; 458 struct i2c_adapter *tun_i2c;
459 459
460 tun_i2c = dib7000p_get_i2c_master(adap->fe[0], 460 tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe,
461 DIBX000_I2C_INTERFACE_TUNER, 1); 461 DIBX000_I2C_INTERFACE_TUNER, 1);
462 462
463 stk7700ph_xc3028_config.i2c_adap = tun_i2c; 463 stk7700ph_xc3028_config.i2c_adap = tun_i2c;
464 464
465 /* FIXME: generalize & move to common area */ 465 /* FIXME: generalize & move to common area */
466 adap->fe[0]->callback = stk7700ph_xc3028_callback; 466 adap->fe_adap[0].fe->callback = stk7700ph_xc3028_callback;
467 467
468 return dvb_attach(xc2028_attach, adap->fe[0], &stk7700ph_xc3028_config) 468 return dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &stk7700ph_xc3028_config)
469 == NULL ? -ENODEV : 0; 469 == NULL ? -ENODEV : 0;
470} 470}
471 471
@@ -685,12 +685,12 @@ static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
685 st->mt2060_if1[0] = 1220; 685 st->mt2060_if1[0] = 1220;
686 686
687 if (dib7000pc_detection(&adap->dev->i2c_adap)) { 687 if (dib7000pc_detection(&adap->dev->i2c_adap)) {
688 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config); 688 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
689 st->is_dib7000pc = 1; 689 st->is_dib7000pc = 1;
690 } else 690 } else
691 adap->fe[0] = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config); 691 adap->fe_adap[0].fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
692 692
693 return adap->fe[0] == NULL ? -ENODEV : 0; 693 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
694} 694}
695 695
696static struct mt2060_config stk7700p_mt2060_config = { 696static struct mt2060_config stk7700p_mt2060_config = {
@@ -709,11 +709,11 @@ static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
709 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a; 709 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
710 } 710 }
711 if (st->is_dib7000pc) 711 if (st->is_dib7000pc)
712 tun_i2c = dib7000p_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1); 712 tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
713 else 713 else
714 tun_i2c = dib7000m_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1); 714 tun_i2c = dib7000m_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
715 715
716 return dvb_attach(mt2060_attach, adap->fe[0], tun_i2c, &stk7700p_mt2060_config, 716 return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, &stk7700p_mt2060_config,
717 if1) == NULL ? -ENODEV : 0; 717 if1) == NULL ? -ENODEV : 0;
718} 718}
719 719
@@ -843,33 +843,33 @@ static int dib7770_set_param_override(struct dvb_frontend *fe,
843static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap) 843static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
844{ 844{
845 struct dib0700_adapter_state *st = adap->priv; 845 struct dib0700_adapter_state *st = adap->priv;
846 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe[0], 846 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe,
847 DIBX000_I2C_INTERFACE_TUNER, 1); 847 DIBX000_I2C_INTERFACE_TUNER, 1);
848 848
849 if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, 849 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
850 &dib7770p_dib0070_config) == NULL) 850 &dib7770p_dib0070_config) == NULL)
851 return -ENODEV; 851 return -ENODEV;
852 852
853 st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 853 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
854 adap->fe[0]->ops.tuner_ops.set_params = dib7770_set_param_override; 854 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7770_set_param_override;
855 return 0; 855 return 0;
856} 856}
857 857
858static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap) 858static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
859{ 859{
860 struct dib0700_adapter_state *st = adap->priv; 860 struct dib0700_adapter_state *st = adap->priv;
861 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1); 861 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
862 862
863 if (adap->id == 0) { 863 if (adap->id == 0) {
864 if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, &dib7070p_dib0070_config[0]) == NULL) 864 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
865 return -ENODEV; 865 return -ENODEV;
866 } else { 866 } else {
867 if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, &dib7070p_dib0070_config[1]) == NULL) 867 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
868 return -ENODEV; 868 return -ENODEV;
869 } 869 }
870 870
871 st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 871 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
872 adap->fe[0]->ops.tuner_ops.set_params = dib7070_set_param_override; 872 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
873 return 0; 873 return 0;
874} 874}
875 875
@@ -878,26 +878,26 @@ static int stk7700p_pid_filter(struct dvb_usb_adapter *adapter, int index,
878{ 878{
879 struct dib0700_state *st = adapter->dev->priv; 879 struct dib0700_state *st = adapter->dev->priv;
880 if (st->is_dib7000pc) 880 if (st->is_dib7000pc)
881 return dib7000p_pid_filter(adapter->fe[0], index, pid, onoff); 881 return dib7000p_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
882 return dib7000m_pid_filter(adapter->fe[0], index, pid, onoff); 882 return dib7000m_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
883} 883}
884 884
885static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) 885static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
886{ 886{
887 struct dib0700_state *st = adapter->dev->priv; 887 struct dib0700_state *st = adapter->dev->priv;
888 if (st->is_dib7000pc) 888 if (st->is_dib7000pc)
889 return dib7000p_pid_filter_ctrl(adapter->fe[0], onoff); 889 return dib7000p_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
890 return dib7000m_pid_filter_ctrl(adapter->fe[0], onoff); 890 return dib7000m_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
891} 891}
892 892
893static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff) 893static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
894{ 894{
895 return dib7000p_pid_filter(adapter->fe[0], index, pid, onoff); 895 return dib7000p_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
896} 896}
897 897
898static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) 898static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
899{ 899{
900 return dib7000p_pid_filter_ctrl(adapter->fe[0], onoff); 900 return dib7000p_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
901} 901}
902 902
903static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = { 903static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
@@ -955,9 +955,9 @@ static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
955 return -ENODEV; 955 return -ENODEV;
956 } 956 }
957 957
958 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, 958 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
959 &dib7070p_dib7000p_config); 959 &dib7070p_dib7000p_config);
960 return adap->fe[0] == NULL ? -ENODEV : 0; 960 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
961} 961}
962 962
963/* STK7770P */ 963/* STK7770P */
@@ -1007,9 +1007,9 @@ static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap)
1007 return -ENODEV; 1007 return -ENODEV;
1008 } 1008 }
1009 1009
1010 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, 1010 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1011 &dib7770p_dib7000p_config); 1011 &dib7770p_dib7000p_config);
1012 return adap->fe[0] == NULL ? -ENODEV : 0; 1012 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1013} 1013}
1014 1014
1015/* DIB807x generic */ 1015/* DIB807x generic */
@@ -1225,34 +1225,34 @@ static int dib807x_set_param_override(struct dvb_frontend *fe,
1225static int dib807x_tuner_attach(struct dvb_usb_adapter *adap) 1225static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1226{ 1226{
1227 struct dib0700_adapter_state *st = adap->priv; 1227 struct dib0700_adapter_state *st = adap->priv;
1228 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe[0], 1228 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe_adap[0].fe,
1229 DIBX000_I2C_INTERFACE_TUNER, 1); 1229 DIBX000_I2C_INTERFACE_TUNER, 1);
1230 1230
1231 if (adap->id == 0) { 1231 if (adap->id == 0) {
1232 if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, 1232 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1233 &dib807x_dib0070_config[0]) == NULL) 1233 &dib807x_dib0070_config[0]) == NULL)
1234 return -ENODEV; 1234 return -ENODEV;
1235 } else { 1235 } else {
1236 if (dvb_attach(dib0070_attach, adap->fe[0], tun_i2c, 1236 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1237 &dib807x_dib0070_config[1]) == NULL) 1237 &dib807x_dib0070_config[1]) == NULL)
1238 return -ENODEV; 1238 return -ENODEV;
1239 } 1239 }
1240 1240
1241 st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 1241 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1242 adap->fe[0]->ops.tuner_ops.set_params = dib807x_set_param_override; 1242 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1243 return 0; 1243 return 0;
1244} 1244}
1245 1245
1246static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index, 1246static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index,
1247 u16 pid, int onoff) 1247 u16 pid, int onoff)
1248{ 1248{
1249 return dib8000_pid_filter(adapter->fe[0], index, pid, onoff); 1249 return dib8000_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
1250} 1250}
1251 1251
1252static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter, 1252static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter,
1253 int onoff) 1253 int onoff)
1254{ 1254{
1255 return dib8000_pid_filter_ctrl(adapter->fe[0], onoff); 1255 return dib8000_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
1256} 1256}
1257 1257
1258/* STK807x */ 1258/* STK807x */
@@ -1276,10 +1276,10 @@ static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1276 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 1276 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1277 0x80); 1277 0x80);
1278 1278
1279 adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, 1279 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1280 &dib807x_dib8000_config[0]); 1280 &dib807x_dib8000_config[0]);
1281 1281
1282 return adap->fe[0] == NULL ? -ENODEV : 0; 1282 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1283} 1283}
1284 1284
1285/* STK807xPVR */ 1285/* STK807xPVR */
@@ -1305,10 +1305,10 @@ static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1305 /* initialize IC 0 */ 1305 /* initialize IC 0 */
1306 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80); 1306 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80);
1307 1307
1308 adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, 1308 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1309 &dib807x_dib8000_config[0]); 1309 &dib807x_dib8000_config[0]);
1310 1310
1311 return adap->fe[0] == NULL ? -ENODEV : 0; 1311 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1312} 1312}
1313 1313
1314static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap) 1314static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
@@ -1316,10 +1316,10 @@ static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1316 /* initialize IC 1 */ 1316 /* initialize IC 1 */
1317 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x82); 1317 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x82);
1318 1318
1319 adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82, 1319 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
1320 &dib807x_dib8000_config[1]); 1320 &dib807x_dib8000_config[1]);
1321 1321
1322 return adap->fe[0] == NULL ? -ENODEV : 0; 1322 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1323} 1323}
1324 1324
1325/* STK8096GP */ 1325/* STK8096GP */
@@ -1546,13 +1546,13 @@ static int dib8096_set_param_override(struct dvb_frontend *fe,
1546static int dib809x_tuner_attach(struct dvb_usb_adapter *adap) 1546static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
1547{ 1547{
1548 struct dib0700_adapter_state *st = adap->priv; 1548 struct dib0700_adapter_state *st = adap->priv;
1549 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1); 1549 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1550 1550
1551 if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &dib809x_dib0090_config) == NULL) 1551 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1552 return -ENODEV; 1552 return -ENODEV;
1553 1553
1554 st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 1554 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1555 adap->fe[0]->ops.tuner_ops.set_params = dib8096_set_param_override; 1555 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1556 return 0; 1556 return 0;
1557} 1557}
1558 1558
@@ -1575,30 +1575,30 @@ static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1575 1575
1576 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80); 1576 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80);
1577 1577
1578 adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]); 1578 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1579 1579
1580 return adap->fe[0] == NULL ? -ENODEV : 0; 1580 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1581} 1581}
1582 1582
1583static int nim8096md_tuner_attach(struct dvb_usb_adapter *adap) 1583static int nim8096md_tuner_attach(struct dvb_usb_adapter *adap)
1584{ 1584{
1585 struct dib0700_adapter_state *st = adap->priv; 1585 struct dib0700_adapter_state *st = adap->priv;
1586 struct i2c_adapter *tun_i2c; 1586 struct i2c_adapter *tun_i2c;
1587 struct dvb_frontend *fe_slave = dib8000_get_slave_frontend(adap->fe[0], 1); 1587 struct dvb_frontend *fe_slave = dib8000_get_slave_frontend(adap->fe_adap[0].fe, 1);
1588 1588
1589 if (fe_slave) { 1589 if (fe_slave) {
1590 tun_i2c = dib8000_get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1); 1590 tun_i2c = dib8000_get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1);
1591 if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL) 1591 if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL)
1592 return -ENODEV; 1592 return -ENODEV;
1593 fe_slave->dvb = adap->fe[0]->dvb; 1593 fe_slave->dvb = adap->fe_adap[0].fe->dvb;
1594 fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override; 1594 fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override;
1595 } 1595 }
1596 tun_i2c = dib8000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1); 1596 tun_i2c = dib8000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1597 if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &dib809x_dib0090_config) == NULL) 1597 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1598 return -ENODEV; 1598 return -ENODEV;
1599 1599
1600 st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 1600 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1601 adap->fe[0]->ops.tuner_ops.set_params = dib8096_set_param_override; 1601 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1602 1602
1603 return 0; 1603 return 0;
1604} 1604}
@@ -1626,12 +1626,12 @@ static int nim8096md_frontend_attach(struct dvb_usb_adapter *adap)
1626 1626
1627 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80); 1627 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80);
1628 1628
1629 adap->fe[0] = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]); 1629 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1630 if (adap->fe[0] == NULL) 1630 if (adap->fe_adap[0].fe == NULL)
1631 return -ENODEV; 1631 return -ENODEV;
1632 1632
1633 fe_slave = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]); 1633 fe_slave = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
1634 dib8000_set_slave_frontend(adap->fe[0], fe_slave); 1634 dib8000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
1635 1635
1636 return fe_slave == NULL ? -ENODEV : 0; 1636 return fe_slave == NULL ? -ENODEV : 0;
1637} 1637}
@@ -1639,12 +1639,12 @@ static int nim8096md_frontend_attach(struct dvb_usb_adapter *adap)
1639/* STK9090M */ 1639/* STK9090M */
1640static int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff) 1640static int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1641{ 1641{
1642 return dib9000_fw_pid_filter(adapter->fe[0], index, pid, onoff); 1642 return dib9000_fw_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
1643} 1643}
1644 1644
1645static int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) 1645static int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1646{ 1646{
1647 return dib9000_fw_pid_filter_ctrl(adapter->fe[0], onoff); 1647 return dib9000_fw_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
1648} 1648}
1649 1649
1650static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff) 1650static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff)
@@ -1856,15 +1856,15 @@ static int stk9090m_frontend_attach(struct dvb_usb_adapter *adap)
1856 stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size; 1856 stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size;
1857 stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data; 1857 stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data;
1858 1858
1859 adap->fe[0] = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config); 1859 adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config);
1860 1860
1861 return adap->fe[0] == NULL ? -ENODEV : 0; 1861 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1862} 1862}
1863 1863
1864static int dib9090_tuner_attach(struct dvb_usb_adapter *adap) 1864static int dib9090_tuner_attach(struct dvb_usb_adapter *adap)
1865{ 1865{
1866 struct dib0700_adapter_state *state = adap->priv; 1866 struct dib0700_adapter_state *state = adap->priv;
1867 struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe[0]); 1867 struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
1868 u16 data_dib190[10] = { 1868 u16 data_dib190[10] = {
1869 1, 0x1374, 1869 1, 0x1374,
1870 2, 0x01a2, 1870 2, 0x01a2,
@@ -1873,13 +1873,13 @@ static int dib9090_tuner_attach(struct dvb_usb_adapter *adap)
1873 8, 0x0486, 1873 8, 0x0486,
1874 }; 1874 };
1875 1875
1876 if (dvb_attach(dib0090_fw_register, adap->fe[0], i2c, &dib9090_dib0090_config) == NULL) 1876 if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL)
1877 return -ENODEV; 1877 return -ENODEV;
1878 i2c = dib9000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_GPIO_1_2, 0); 1878 i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
1879 if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0) 1879 if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0)
1880 return -ENODEV; 1880 return -ENODEV;
1881 dib0700_set_i2c_speed(adap->dev, 2000); 1881 dib0700_set_i2c_speed(adap->dev, 2000);
1882 if (dib9000_firmware_post_pll_init(adap->fe[0]) < 0) 1882 if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
1883 return -ENODEV; 1883 return -ENODEV;
1884 release_firmware(state->frontend_firmware); 1884 release_firmware(state->frontend_firmware);
1885 return 0; 1885 return 0;
@@ -1925,16 +1925,16 @@ static int nim9090md_frontend_attach(struct dvb_usb_adapter *adap)
1925 nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data; 1925 nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data;
1926 1926
1927 dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80); 1927 dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80);
1928 adap->fe[0] = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]); 1928 adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]);
1929 1929
1930 if (adap->fe[0] == NULL) 1930 if (adap->fe_adap[0].fe == NULL)
1931 return -ENODEV; 1931 return -ENODEV;
1932 1932
1933 i2c = dib9000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_GPIO_3_4, 0); 1933 i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_3_4, 0);
1934 dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82); 1934 dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82);
1935 1935
1936 fe_slave = dvb_attach(dib9000_attach, i2c, 0x82, &nim9090md_config[1]); 1936 fe_slave = dvb_attach(dib9000_attach, i2c, 0x82, &nim9090md_config[1]);
1937 dib9000_set_slave_frontend(adap->fe[0], fe_slave); 1937 dib9000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
1938 1938
1939 return fe_slave == NULL ? -ENODEV : 0; 1939 return fe_slave == NULL ? -ENODEV : 0;
1940} 1940}
@@ -1951,26 +1951,26 @@ static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap)
1951 0, 0x00ef, 1951 0, 0x00ef,
1952 8, 0x0406, 1952 8, 0x0406,
1953 }; 1953 };
1954 i2c = dib9000_get_tuner_interface(adap->fe[0]); 1954 i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
1955 if (dvb_attach(dib0090_fw_register, adap->fe[0], i2c, &nim9090md_dib0090_config[0]) == NULL) 1955 if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL)
1956 return -ENODEV; 1956 return -ENODEV;
1957 i2c = dib9000_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_GPIO_1_2, 0); 1957 i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
1958 if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0) 1958 if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0)
1959 return -ENODEV; 1959 return -ENODEV;
1960 dib0700_set_i2c_speed(adap->dev, 2000); 1960 dib0700_set_i2c_speed(adap->dev, 2000);
1961 if (dib9000_firmware_post_pll_init(adap->fe[0]) < 0) 1961 if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
1962 return -ENODEV; 1962 return -ENODEV;
1963 1963
1964 fe_slave = dib9000_get_slave_frontend(adap->fe[0], 1); 1964 fe_slave = dib9000_get_slave_frontend(adap->fe_adap[0].fe, 1);
1965 if (fe_slave != NULL) { 1965 if (fe_slave != NULL) {
1966 i2c = dib9000_get_component_bus_interface(adap->fe[0]); 1966 i2c = dib9000_get_component_bus_interface(adap->fe_adap[0].fe);
1967 dib9000_set_i2c_adapter(fe_slave, i2c); 1967 dib9000_set_i2c_adapter(fe_slave, i2c);
1968 1968
1969 i2c = dib9000_get_tuner_interface(fe_slave); 1969 i2c = dib9000_get_tuner_interface(fe_slave);
1970 if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL) 1970 if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL)
1971 return -ENODEV; 1971 return -ENODEV;
1972 fe_slave->dvb = adap->fe[0]->dvb; 1972 fe_slave->dvb = adap->fe_adap[0].fe->dvb;
1973 dib9000_fw_set_component_bus_speed(adap->fe[0], 2000); 1973 dib9000_fw_set_component_bus_speed(adap->fe_adap[0].fe, 2000);
1974 if (dib9000_firmware_post_pll_init(fe_slave) < 0) 1974 if (dib9000_firmware_post_pll_init(fe_slave) < 0)
1975 return -ENODEV; 1975 return -ENODEV;
1976 } 1976 }
@@ -2393,23 +2393,23 @@ static int nim7090_frontend_attach(struct dvb_usb_adapter *adap)
2393 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__); 2393 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
2394 return -ENODEV; 2394 return -ENODEV;
2395 } 2395 }
2396 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config); 2396 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
2397 2397
2398 return adap->fe[0] == NULL ? -ENODEV : 0; 2398 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2399} 2399}
2400 2400
2401static int nim7090_tuner_attach(struct dvb_usb_adapter *adap) 2401static int nim7090_tuner_attach(struct dvb_usb_adapter *adap)
2402{ 2402{
2403 struct dib0700_adapter_state *st = adap->priv; 2403 struct dib0700_adapter_state *st = adap->priv;
2404 struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe[0]); 2404 struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe_adap[0].fe);
2405 2405
2406 if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &nim7090_dib0090_config) == NULL) 2406 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &nim7090_dib0090_config) == NULL)
2407 return -ENODEV; 2407 return -ENODEV;
2408 2408
2409 dib7000p_set_gpio(adap->fe[0], 8, 0, 1); 2409 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2410 2410
2411 st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 2411 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
2412 adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup; 2412 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
2413 return 0; 2413 return 0;
2414} 2414}
2415 2415
@@ -2439,11 +2439,11 @@ static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
2439 } 2439 }
2440 2440
2441 dib0700_set_i2c_speed(adap->dev, 340); 2441 dib0700_set_i2c_speed(adap->dev, 340);
2442 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]); 2442 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
2443 if (adap->fe[0] == NULL) 2443 if (adap->fe_adap[0].fe == NULL)
2444 return -ENODEV; 2444 return -ENODEV;
2445 2445
2446 dib7090_slave_reset(adap->fe[0]); 2446 dib7090_slave_reset(adap->fe_adap[0].fe);
2447 2447
2448 return 0; 2448 return 0;
2449} 2449}
@@ -2452,50 +2452,50 @@ static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap)
2452{ 2452{
2453 struct i2c_adapter *i2c; 2453 struct i2c_adapter *i2c;
2454 2454
2455 if (adap->dev->adapter[0].fe[0] == NULL) { 2455 if (adap->dev->adapter[0].fe_adap[0].fe == NULL) {
2456 err("the master dib7090 has to be initialized first"); 2456 err("the master dib7090 has to be initialized first");
2457 return -ENODEV; /* the master device has not been initialized */ 2457 return -ENODEV; /* the master device has not been initialized */
2458 } 2458 }
2459 2459
2460 i2c = dib7000p_get_i2c_master(adap->dev->adapter[0].fe[0], DIBX000_I2C_INTERFACE_GPIO_6_7, 1); 2460 i2c = dib7000p_get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
2461 if (dib7000p_i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) { 2461 if (dib7000p_i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) {
2462 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__); 2462 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
2463 return -ENODEV; 2463 return -ENODEV;
2464 } 2464 }
2465 2465
2466 adap->fe[0] = dvb_attach(dib7000p_attach, i2c, 0x92, &tfe7090pvr_dib7000p_config[1]); 2466 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, i2c, 0x92, &tfe7090pvr_dib7000p_config[1]);
2467 dib0700_set_i2c_speed(adap->dev, 200); 2467 dib0700_set_i2c_speed(adap->dev, 200);
2468 2468
2469 return adap->fe[0] == NULL ? -ENODEV : 0; 2469 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2470} 2470}
2471 2471
2472static int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap) 2472static int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap)
2473{ 2473{
2474 struct dib0700_adapter_state *st = adap->priv; 2474 struct dib0700_adapter_state *st = adap->priv;
2475 struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe[0]); 2475 struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe_adap[0].fe);
2476 2476
2477 if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL) 2477 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL)
2478 return -ENODEV; 2478 return -ENODEV;
2479 2479
2480 dib7000p_set_gpio(adap->fe[0], 8, 0, 1); 2480 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2481 2481
2482 st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 2482 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
2483 adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup; 2483 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
2484 return 0; 2484 return 0;
2485} 2485}
2486 2486
2487static int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap) 2487static int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap)
2488{ 2488{
2489 struct dib0700_adapter_state *st = adap->priv; 2489 struct dib0700_adapter_state *st = adap->priv;
2490 struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe[0]); 2490 struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe_adap[0].fe);
2491 2491
2492 if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL) 2492 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL)
2493 return -ENODEV; 2493 return -ENODEV;
2494 2494
2495 dib7000p_set_gpio(adap->fe[0], 8, 0, 1); 2495 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2496 2496
2497 st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 2497 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
2498 adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup; 2498 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
2499 return 0; 2499 return 0;
2500} 2500}
2501 2501
@@ -2555,14 +2555,14 @@ static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
2555 return -ENODEV; 2555 return -ENODEV;
2556 } 2556 }
2557 2557
2558 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]); 2558 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
2559 return adap->fe[0] == NULL ? -ENODEV : 0; 2559 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2560} 2560}
2561 2561
2562static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap) 2562static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
2563{ 2563{
2564 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]); 2564 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
2565 return adap->fe[0] == NULL ? -ENODEV : 0; 2565 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2566} 2566}
2567 2567
2568/* S5H1411 */ 2568/* S5H1411 */
@@ -2617,9 +2617,9 @@ static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
2617 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1); 2617 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
2618 2618
2619 /* GPIOs are initialized, do the attach */ 2619 /* GPIOs are initialized, do the attach */
2620 adap->fe[0] = dvb_attach(s5h1411_attach, &pinnacle_801e_config, 2620 adap->fe_adap[0].fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
2621 &adap->dev->i2c_adap); 2621 &adap->dev->i2c_adap);
2622 return adap->fe[0] == NULL ? -ENODEV : 0; 2622 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2623} 2623}
2624 2624
2625static int dib0700_xc5000_tuner_callback(void *priv, int component, 2625static int dib0700_xc5000_tuner_callback(void *priv, int component,
@@ -2649,9 +2649,9 @@ static struct xc5000_config s5h1411_xc5000_tunerconfig = {
2649static int xc5000_tuner_attach(struct dvb_usb_adapter *adap) 2649static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
2650{ 2650{
2651 /* FIXME: generalize & move to common area */ 2651 /* FIXME: generalize & move to common area */
2652 adap->fe[0]->callback = dib0700_xc5000_tuner_callback; 2652 adap->fe_adap[0].fe->callback = dib0700_xc5000_tuner_callback;
2653 2653
2654 return dvb_attach(xc5000_attach, adap->fe[0], &adap->dev->i2c_adap, 2654 return dvb_attach(xc5000_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
2655 &s5h1411_xc5000_tunerconfig) 2655 &s5h1411_xc5000_tunerconfig)
2656 == NULL ? -ENODEV : 0; 2656 == NULL ? -ENODEV : 0;
2657} 2657}
@@ -2663,9 +2663,9 @@ static int dib0700_xc4000_tuner_callback(void *priv, int component,
2663 2663
2664 if (command == XC4000_TUNER_RESET) { 2664 if (command == XC4000_TUNER_RESET) {
2665 /* Reset the tuner */ 2665 /* Reset the tuner */
2666 dib7000p_set_gpio(adap->fe[0], 8, 0, 0); 2666 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 0);
2667 msleep(10); 2667 msleep(10);
2668 dib7000p_set_gpio(adap->fe[0], 8, 0, 1); 2668 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2669 } else { 2669 } else {
2670 err("xc4000: unknown tuner callback command: %d\n", command); 2670 err("xc4000: unknown tuner callback command: %d\n", command);
2671 return -EINVAL; 2671 return -EINVAL;
@@ -2771,11 +2771,11 @@ static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap)
2771 return -ENODEV; 2771 return -ENODEV;
2772 } 2772 }
2773 2773
2774 adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x12, 2774 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x12,
2775 &pctv_340e_config); 2775 &pctv_340e_config);
2776 st->is_dib7000pc = 1; 2776 st->is_dib7000pc = 1;
2777 2777
2778 return adap->fe[0] == NULL ? -ENODEV : 0; 2778 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2779} 2779}
2780 2780
2781static struct xc4000_config dib7000p_xc4000_tunerconfig = { 2781static struct xc4000_config dib7000p_xc4000_tunerconfig = {
@@ -2791,7 +2791,7 @@ static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
2791 struct i2c_adapter *tun_i2c; 2791 struct i2c_adapter *tun_i2c;
2792 2792
2793 /* The xc4000 is not on the main i2c bus */ 2793 /* The xc4000 is not on the main i2c bus */
2794 tun_i2c = dib7000p_get_i2c_master(adap->fe[0], 2794 tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe,
2795 DIBX000_I2C_INTERFACE_TUNER, 1); 2795 DIBX000_I2C_INTERFACE_TUNER, 1);
2796 if (tun_i2c == NULL) { 2796 if (tun_i2c == NULL) {
2797 printk(KERN_ERR "Could not reach tuner i2c bus\n"); 2797 printk(KERN_ERR "Could not reach tuner i2c bus\n");
@@ -2799,9 +2799,9 @@ static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
2799 } 2799 }
2800 2800
2801 /* Setup the reset callback */ 2801 /* Setup the reset callback */
2802 adap->fe[0]->callback = dib0700_xc4000_tuner_callback; 2802 adap->fe_adap[0].fe->callback = dib0700_xc4000_tuner_callback;
2803 2803
2804 return dvb_attach(xc4000_attach, adap->fe[0], tun_i2c, 2804 return dvb_attach(xc4000_attach, adap->fe_adap[0].fe, tun_i2c,
2805 &dib7000p_xc4000_tunerconfig) 2805 &dib7000p_xc4000_tunerconfig)
2806 == NULL ? -ENODEV : 0; 2806 == NULL ? -ENODEV : 0;
2807} 2807}
@@ -2857,16 +2857,16 @@ static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
2857 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 2857 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2858 msleep(30); 2858 msleep(30);
2859 2859
2860 adap->fe[0] = dvb_attach(lgdt3305_attach, 2860 adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach,
2861 &hcw_lgdt3305_config, 2861 &hcw_lgdt3305_config,
2862 &adap->dev->i2c_adap); 2862 &adap->dev->i2c_adap);
2863 2863
2864 return adap->fe[0] == NULL ? -ENODEV : 0; 2864 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2865} 2865}
2866 2866
2867static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap) 2867static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
2868{ 2868{
2869 return dvb_attach(mxl5007t_attach, adap->fe[0], 2869 return dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
2870 &adap->dev->i2c_adap, 0x60, 2870 &adap->dev->i2c_adap, 0x60,
2871 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0; 2871 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
2872} 2872}
@@ -2989,6 +2989,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2989 .num_adapters = 1, 2989 .num_adapters = 1,
2990 .adapter = { 2990 .adapter = {
2991 { 2991 {
2992 .num_frontends = 1,
2993 .fe = {{
2992 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 2994 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2993 .pid_filter_count = 32, 2995 .pid_filter_count = 32,
2994 .pid_filter = stk7700p_pid_filter, 2996 .pid_filter = stk7700p_pid_filter,
@@ -2997,6 +2999,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2997 .tuner_attach = stk7700p_tuner_attach, 2999 .tuner_attach = stk7700p_tuner_attach,
2998 3000
2999 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3001 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3002 }},
3000 }, 3003 },
3001 }, 3004 },
3002 3005
@@ -3050,15 +3053,21 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3050 .num_adapters = 2, 3053 .num_adapters = 2,
3051 .adapter = { 3054 .adapter = {
3052 { 3055 {
3056 .num_frontends = 1,
3057 .fe = {{
3053 .frontend_attach = bristol_frontend_attach, 3058 .frontend_attach = bristol_frontend_attach,
3054 .tuner_attach = bristol_tuner_attach, 3059 .tuner_attach = bristol_tuner_attach,
3055 3060
3056 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3061 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3062 }},
3057 }, { 3063 }, {
3064 .num_frontends = 1,
3065 .fe = {{
3058 .frontend_attach = bristol_frontend_attach, 3066 .frontend_attach = bristol_frontend_attach,
3059 .tuner_attach = bristol_tuner_attach, 3067 .tuner_attach = bristol_tuner_attach,
3060 3068
3061 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3069 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3070 }},
3062 } 3071 }
3063 }, 3072 },
3064 3073
@@ -3084,6 +3093,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3084 .num_adapters = 2, 3093 .num_adapters = 2,
3085 .adapter = { 3094 .adapter = {
3086 { 3095 {
3096 .num_frontends = 1,
3097 .fe = {{
3087 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3098 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3088 .pid_filter_count = 32, 3099 .pid_filter_count = 32,
3089 .pid_filter = stk70x0p_pid_filter, 3100 .pid_filter = stk70x0p_pid_filter,
@@ -3092,7 +3103,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3092 .tuner_attach = stk7700d_tuner_attach, 3103 .tuner_attach = stk7700d_tuner_attach,
3093 3104
3094 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3105 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3106 }},
3095 }, { 3107 }, {
3108 .num_frontends = 1,
3109 .fe = {{
3096 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3110 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3097 .pid_filter_count = 32, 3111 .pid_filter_count = 32,
3098 .pid_filter = stk70x0p_pid_filter, 3112 .pid_filter = stk70x0p_pid_filter,
@@ -3101,6 +3115,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3101 .tuner_attach = stk7700d_tuner_attach, 3115 .tuner_attach = stk7700d_tuner_attach,
3102 3116
3103 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3117 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3118 }},
3104 } 3119 }
3105 }, 3120 },
3106 3121
@@ -3143,6 +3158,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3143 .num_adapters = 1, 3158 .num_adapters = 1,
3144 .adapter = { 3159 .adapter = {
3145 { 3160 {
3161 .num_frontends = 1,
3162 .fe = {{
3146 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3163 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3147 .pid_filter_count = 32, 3164 .pid_filter_count = 32,
3148 .pid_filter = stk70x0p_pid_filter, 3165 .pid_filter = stk70x0p_pid_filter,
@@ -3151,6 +3168,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3151 .tuner_attach = stk7700d_tuner_attach, 3168 .tuner_attach = stk7700d_tuner_attach,
3152 3169
3153 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3170 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3171 }},
3154 }, 3172 },
3155 }, 3173 },
3156 3174
@@ -3185,6 +3203,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3185 .num_adapters = 1, 3203 .num_adapters = 1,
3186 .adapter = { 3204 .adapter = {
3187 { 3205 {
3206 .num_frontends = 1,
3207 .fe = {{
3188 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3208 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3189 .pid_filter_count = 32, 3209 .pid_filter_count = 32,
3190 .pid_filter = stk70x0p_pid_filter, 3210 .pid_filter = stk70x0p_pid_filter,
@@ -3193,7 +3213,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3193 .tuner_attach = dib7070p_tuner_attach, 3213 .tuner_attach = dib7070p_tuner_attach,
3194 3214
3195 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3215 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3196 3216 }},
3197 .size_of_priv = sizeof(struct dib0700_adapter_state), 3217 .size_of_priv = sizeof(struct dib0700_adapter_state),
3198 }, 3218 },
3199 }, 3219 },
@@ -3261,6 +3281,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3261 .num_adapters = 1, 3281 .num_adapters = 1,
3262 .adapter = { 3282 .adapter = {
3263 { 3283 {
3284 .num_frontends = 1,
3285 .fe = {{
3264 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3286 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3265 .pid_filter_count = 32, 3287 .pid_filter_count = 32,
3266 .pid_filter = stk70x0p_pid_filter, 3288 .pid_filter = stk70x0p_pid_filter,
@@ -3269,7 +3291,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3269 .tuner_attach = dib7070p_tuner_attach, 3291 .tuner_attach = dib7070p_tuner_attach,
3270 3292
3271 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3293 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3272 3294 }},
3273 .size_of_priv = sizeof(struct dib0700_adapter_state), 3295 .size_of_priv = sizeof(struct dib0700_adapter_state),
3274 }, 3296 },
3275 }, 3297 },
@@ -3305,6 +3327,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3305 .num_adapters = 2, 3327 .num_adapters = 2,
3306 .adapter = { 3328 .adapter = {
3307 { 3329 {
3330 .num_frontends = 1,
3331 .fe = {{
3308 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3332 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3309 .pid_filter_count = 32, 3333 .pid_filter_count = 32,
3310 .pid_filter = stk70x0p_pid_filter, 3334 .pid_filter = stk70x0p_pid_filter,
@@ -3313,9 +3337,11 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3313 .tuner_attach = dib7070p_tuner_attach, 3337 .tuner_attach = dib7070p_tuner_attach,
3314 3338
3315 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3339 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3316 3340 }},
3317 .size_of_priv = sizeof(struct dib0700_adapter_state), 3341 .size_of_priv = sizeof(struct dib0700_adapter_state),
3318 }, { 3342 }, {
3343 .num_frontends = 1,
3344 .fe = {{
3319 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3345 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3320 .pid_filter_count = 32, 3346 .pid_filter_count = 32,
3321 .pid_filter = stk70x0p_pid_filter, 3347 .pid_filter = stk70x0p_pid_filter,
@@ -3324,7 +3350,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3324 .tuner_attach = dib7070p_tuner_attach, 3350 .tuner_attach = dib7070p_tuner_attach,
3325 3351
3326 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3352 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3327 3353 }},
3328 .size_of_priv = sizeof(struct dib0700_adapter_state), 3354 .size_of_priv = sizeof(struct dib0700_adapter_state),
3329 } 3355 }
3330 }, 3356 },
@@ -3373,6 +3399,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3373 .num_adapters = 2, 3399 .num_adapters = 2,
3374 .adapter = { 3400 .adapter = {
3375 { 3401 {
3402 .num_frontends = 1,
3403 .fe = {{
3376 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3404 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3377 .pid_filter_count = 32, 3405 .pid_filter_count = 32,
3378 .pid_filter = stk70x0p_pid_filter, 3406 .pid_filter = stk70x0p_pid_filter,
@@ -3381,9 +3409,11 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3381 .tuner_attach = dib7070p_tuner_attach, 3409 .tuner_attach = dib7070p_tuner_attach,
3382 3410
3383 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3411 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3384 3412 }},
3385 .size_of_priv = sizeof(struct dib0700_adapter_state), 3413 .size_of_priv = sizeof(struct dib0700_adapter_state),
3386 }, { 3414 }, {
3415 .num_frontends = 1,
3416 .fe = {{
3387 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3417 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3388 .pid_filter_count = 32, 3418 .pid_filter_count = 32,
3389 .pid_filter = stk70x0p_pid_filter, 3419 .pid_filter = stk70x0p_pid_filter,
@@ -3392,7 +3422,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3392 .tuner_attach = dib7070p_tuner_attach, 3422 .tuner_attach = dib7070p_tuner_attach,
3393 3423
3394 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3424 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3395 3425 }},
3396 .size_of_priv = sizeof(struct dib0700_adapter_state), 3426 .size_of_priv = sizeof(struct dib0700_adapter_state),
3397 } 3427 }
3398 }, 3428 },
@@ -3420,6 +3450,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3420 .num_adapters = 1, 3450 .num_adapters = 1,
3421 .adapter = { 3451 .adapter = {
3422 { 3452 {
3453 .num_frontends = 1,
3454 .fe = {{
3423 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3455 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3424 .pid_filter_count = 32, 3456 .pid_filter_count = 32,
3425 .pid_filter = stk70x0p_pid_filter, 3457 .pid_filter = stk70x0p_pid_filter,
@@ -3428,7 +3460,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3428 .tuner_attach = stk7700ph_tuner_attach, 3460 .tuner_attach = stk7700ph_tuner_attach,
3429 3461
3430 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3462 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3431 3463 }},
3432 .size_of_priv = sizeof(struct 3464 .size_of_priv = sizeof(struct
3433 dib0700_adapter_state), 3465 dib0700_adapter_state),
3434 }, 3466 },
@@ -3488,11 +3520,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3488 .num_adapters = 1, 3520 .num_adapters = 1,
3489 .adapter = { 3521 .adapter = {
3490 { 3522 {
3523 .num_frontends = 1,
3524 .fe = {{
3491 .frontend_attach = s5h1411_frontend_attach, 3525 .frontend_attach = s5h1411_frontend_attach,
3492 .tuner_attach = xc5000_tuner_attach, 3526 .tuner_attach = xc5000_tuner_attach,
3493 3527
3494 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3528 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3495 3529 }},
3496 .size_of_priv = sizeof(struct 3530 .size_of_priv = sizeof(struct
3497 dib0700_adapter_state), 3531 dib0700_adapter_state),
3498 }, 3532 },
@@ -3524,11 +3558,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3524 .num_adapters = 1, 3558 .num_adapters = 1,
3525 .adapter = { 3559 .adapter = {
3526 { 3560 {
3561 .num_frontends = 1,
3562 .fe = {{
3527 .frontend_attach = lgdt3305_frontend_attach, 3563 .frontend_attach = lgdt3305_frontend_attach,
3528 .tuner_attach = mxl5007t_tuner_attach, 3564 .tuner_attach = mxl5007t_tuner_attach,
3529 3565
3530 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3566 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3531 3567 }},
3532 .size_of_priv = sizeof(struct 3568 .size_of_priv = sizeof(struct
3533 dib0700_adapter_state), 3569 dib0700_adapter_state),
3534 }, 3570 },
@@ -3550,6 +3586,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3550 .num_adapters = 1, 3586 .num_adapters = 1,
3551 .adapter = { 3587 .adapter = {
3552 { 3588 {
3589 .num_frontends = 1,
3590 .fe = {{
3553 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3591 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3554 .pid_filter_count = 32, 3592 .pid_filter_count = 32,
3555 .pid_filter = stk70x0p_pid_filter, 3593 .pid_filter = stk70x0p_pid_filter,
@@ -3558,7 +3596,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3558 .tuner_attach = dib7770p_tuner_attach, 3596 .tuner_attach = dib7770p_tuner_attach,
3559 3597
3560 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3598 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3561 3599 }},
3562 .size_of_priv = 3600 .size_of_priv =
3563 sizeof(struct dib0700_adapter_state), 3601 sizeof(struct dib0700_adapter_state),
3564 }, 3602 },
@@ -3600,6 +3638,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3600 .num_adapters = 1, 3638 .num_adapters = 1,
3601 .adapter = { 3639 .adapter = {
3602 { 3640 {
3641 .num_frontends = 1,
3642 .fe = {{
3603 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3643 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3604 .pid_filter_count = 32, 3644 .pid_filter_count = 32,
3605 .pid_filter = stk80xx_pid_filter, 3645 .pid_filter = stk80xx_pid_filter,
@@ -3608,7 +3648,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3608 .tuner_attach = dib807x_tuner_attach, 3648 .tuner_attach = dib807x_tuner_attach,
3609 3649
3610 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3650 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3611 3651 }},
3612 .size_of_priv = 3652 .size_of_priv =
3613 sizeof(struct dib0700_adapter_state), 3653 sizeof(struct dib0700_adapter_state),
3614 }, 3654 },
@@ -3644,6 +3684,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3644 .num_adapters = 2, 3684 .num_adapters = 2,
3645 .adapter = { 3685 .adapter = {
3646 { 3686 {
3687 .num_frontends = 1,
3688 .fe = {{
3647 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3689 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3648 .pid_filter_count = 32, 3690 .pid_filter_count = 32,
3649 .pid_filter = stk80xx_pid_filter, 3691 .pid_filter = stk80xx_pid_filter,
@@ -3652,11 +3694,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3652 .tuner_attach = dib807x_tuner_attach, 3694 .tuner_attach = dib807x_tuner_attach,
3653 3695
3654 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3696 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3655 3697 }},
3656 .size_of_priv = 3698 .size_of_priv =
3657 sizeof(struct dib0700_adapter_state), 3699 sizeof(struct dib0700_adapter_state),
3658 }, 3700 },
3659 { 3701 {
3702 .num_frontends = 1,
3703 .fe = {{
3660 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3704 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3661 .pid_filter_count = 32, 3705 .pid_filter_count = 32,
3662 .pid_filter = stk80xx_pid_filter, 3706 .pid_filter = stk80xx_pid_filter,
@@ -3665,7 +3709,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3665 .tuner_attach = dib807x_tuner_attach, 3709 .tuner_attach = dib807x_tuner_attach,
3666 3710
3667 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3711 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3668 3712 }},
3669 .size_of_priv = 3713 .size_of_priv =
3670 sizeof(struct dib0700_adapter_state), 3714 sizeof(struct dib0700_adapter_state),
3671 }, 3715 },
@@ -3693,6 +3737,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3693 .num_adapters = 1, 3737 .num_adapters = 1,
3694 .adapter = { 3738 .adapter = {
3695 { 3739 {
3740 .num_frontends = 1,
3741 .fe = {{
3696 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3742 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3697 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3743 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3698 .pid_filter_count = 32, 3744 .pid_filter_count = 32,
@@ -3702,7 +3748,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3702 .tuner_attach = dib809x_tuner_attach, 3748 .tuner_attach = dib809x_tuner_attach,
3703 3749
3704 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3750 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3705 3751 }},
3706 .size_of_priv = 3752 .size_of_priv =
3707 sizeof(struct dib0700_adapter_state), 3753 sizeof(struct dib0700_adapter_state),
3708 }, 3754 },
@@ -3730,6 +3776,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3730 .num_adapters = 1, 3776 .num_adapters = 1,
3731 .adapter = { 3777 .adapter = {
3732 { 3778 {
3779 .num_frontends = 1,
3780 .fe = {{
3733 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3781 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3734 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3782 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3735 .pid_filter_count = 32, 3783 .pid_filter_count = 32,
@@ -3739,7 +3787,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3739 .tuner_attach = dib9090_tuner_attach, 3787 .tuner_attach = dib9090_tuner_attach,
3740 3788
3741 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3789 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3742 3790 }},
3743 .size_of_priv = 3791 .size_of_priv =
3744 sizeof(struct dib0700_adapter_state), 3792 sizeof(struct dib0700_adapter_state),
3745 }, 3793 },
@@ -3767,6 +3815,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3767 .num_adapters = 1, 3815 .num_adapters = 1,
3768 .adapter = { 3816 .adapter = {
3769 { 3817 {
3818 .num_frontends = 1,
3819 .fe = {{
3770 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3820 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3771 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3821 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3772 .pid_filter_count = 32, 3822 .pid_filter_count = 32,
@@ -3776,7 +3826,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3776 .tuner_attach = nim8096md_tuner_attach, 3826 .tuner_attach = nim8096md_tuner_attach,
3777 3827
3778 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3828 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3779 3829 }},
3780 .size_of_priv = 3830 .size_of_priv =
3781 sizeof(struct dib0700_adapter_state), 3831 sizeof(struct dib0700_adapter_state),
3782 }, 3832 },
@@ -3804,6 +3854,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3804 .num_adapters = 1, 3854 .num_adapters = 1,
3805 .adapter = { 3855 .adapter = {
3806 { 3856 {
3857 .num_frontends = 1,
3858 .fe = {{
3807 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3859 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3808 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3860 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3809 .pid_filter_count = 32, 3861 .pid_filter_count = 32,
@@ -3813,7 +3865,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3813 .tuner_attach = nim9090md_tuner_attach, 3865 .tuner_attach = nim9090md_tuner_attach,
3814 3866
3815 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3867 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3816 3868 }},
3817 .size_of_priv = 3869 .size_of_priv =
3818 sizeof(struct dib0700_adapter_state), 3870 sizeof(struct dib0700_adapter_state),
3819 }, 3871 },
@@ -3841,6 +3893,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3841 .num_adapters = 1, 3893 .num_adapters = 1,
3842 .adapter = { 3894 .adapter = {
3843 { 3895 {
3896 .num_frontends = 1,
3897 .fe = {{
3844 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3898 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3845 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3899 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3846 .pid_filter_count = 32, 3900 .pid_filter_count = 32,
@@ -3850,7 +3904,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3850 .tuner_attach = nim7090_tuner_attach, 3904 .tuner_attach = nim7090_tuner_attach,
3851 3905
3852 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3906 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3853 3907 }},
3854 .size_of_priv = 3908 .size_of_priv =
3855 sizeof(struct dib0700_adapter_state), 3909 sizeof(struct dib0700_adapter_state),
3856 }, 3910 },
@@ -3878,6 +3932,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3878 .num_adapters = 2, 3932 .num_adapters = 2,
3879 .adapter = { 3933 .adapter = {
3880 { 3934 {
3935 .num_frontends = 1,
3936 .fe = {{
3881 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3937 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3882 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3938 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3883 .pid_filter_count = 32, 3939 .pid_filter_count = 32,
@@ -3887,11 +3943,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3887 .tuner_attach = tfe7090pvr_tuner0_attach, 3943 .tuner_attach = tfe7090pvr_tuner0_attach,
3888 3944
3889 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3945 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3890 3946 }},
3891 .size_of_priv = 3947 .size_of_priv =
3892 sizeof(struct dib0700_adapter_state), 3948 sizeof(struct dib0700_adapter_state),
3893 }, 3949 },
3894 { 3950 {
3951 .num_frontends = 1,
3952 .fe = {{
3895 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3953 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3896 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3954 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3897 .pid_filter_count = 32, 3955 .pid_filter_count = 32,
@@ -3901,7 +3959,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3901 .tuner_attach = tfe7090pvr_tuner1_attach, 3959 .tuner_attach = tfe7090pvr_tuner1_attach,
3902 3960
3903 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3961 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3904 3962 }},
3905 .size_of_priv = 3963 .size_of_priv =
3906 sizeof(struct dib0700_adapter_state), 3964 sizeof(struct dib0700_adapter_state),
3907 }, 3965 },
@@ -3929,11 +3987,13 @@ struct dvb_usb_device_properties dib0700_devices[] = {
3929 .num_adapters = 1, 3987 .num_adapters = 1,
3930 .adapter = { 3988 .adapter = {
3931 { 3989 {
3990 .num_frontends = 1,
3991 .fe = {{
3932 .frontend_attach = pctv340e_frontend_attach, 3992 .frontend_attach = pctv340e_frontend_attach,
3933 .tuner_attach = xc4000_tuner_attach, 3993 .tuner_attach = xc4000_tuner_attach,
3934 3994
3935 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3995 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3936 3996 }},
3937 .size_of_priv = sizeof(struct 3997 .size_of_priv = sizeof(struct
3938 dib0700_adapter_state), 3998 dib0700_adapter_state),
3939 }, 3999 },
diff --git a/drivers/media/dvb/dvb-usb/dibusb-common.c b/drivers/media/dvb/dvb-usb/dibusb-common.c
index 263235e194f9..735e914815e6 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-common.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-common.c
@@ -23,7 +23,7 @@ int dibusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
23 if (adap->priv != NULL) { 23 if (adap->priv != NULL) {
24 struct dibusb_state *st = adap->priv; 24 struct dibusb_state *st = adap->priv;
25 if (st->ops.fifo_ctrl != NULL) 25 if (st->ops.fifo_ctrl != NULL)
26 if (st->ops.fifo_ctrl(adap->fe[0],onoff)) { 26 if (st->ops.fifo_ctrl(adap->fe_adap[0].fe,onoff)) {
27 err("error while controlling the fifo of the demod."); 27 err("error while controlling the fifo of the demod.");
28 return -ENODEV; 28 return -ENODEV;
29 } 29 }
@@ -37,7 +37,7 @@ int dibusb_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onof
37 if (adap->priv != NULL) { 37 if (adap->priv != NULL) {
38 struct dibusb_state *st = adap->priv; 38 struct dibusb_state *st = adap->priv;
39 if (st->ops.pid_ctrl != NULL) 39 if (st->ops.pid_ctrl != NULL)
40 st->ops.pid_ctrl(adap->fe[0],index,pid,onoff); 40 st->ops.pid_ctrl(adap->fe_adap[0].fe,index,pid,onoff);
41 } 41 }
42 return 0; 42 return 0;
43} 43}
@@ -48,7 +48,7 @@ int dibusb_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
48 if (adap->priv != NULL) { 48 if (adap->priv != NULL) {
49 struct dibusb_state *st = adap->priv; 49 struct dibusb_state *st = adap->priv;
50 if (st->ops.pid_parse != NULL) 50 if (st->ops.pid_parse != NULL)
51 if (st->ops.pid_parse(adap->fe[0],onoff) < 0) 51 if (st->ops.pid_parse(adap->fe_adap[0].fe,onoff) < 0)
52 err("could not handle pid_parser"); 52 err("could not handle pid_parser");
53 } 53 }
54 return 0; 54 return 0;
@@ -254,8 +254,8 @@ int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *adap)
254 msleep(1000); 254 msleep(1000);
255 } 255 }
256 256
257 if ((adap->fe[0] = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000P_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL || 257 if ((adap->fe_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000P_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL ||
258 (adap->fe[0] = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL) { 258 (adap->fe_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL) {
259 if (adap->priv != NULL) { 259 if (adap->priv != NULL) {
260 struct dibusb_state *st = adap->priv; 260 struct dibusb_state *st = adap->priv;
261 st->ops.pid_parse = dib3000mc_pid_parse; 261 st->ops.pid_parse = dib3000mc_pid_parse;
@@ -309,15 +309,15 @@ int dibusb_dib3000mc_tuner_attach(struct dvb_usb_adapter *adap)
309 } 309 }
310 } 310 }
311 311
312 tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe[0], 1); 312 tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe_adap[0].fe, 1);
313 if (dvb_attach(mt2060_attach, adap->fe[0], tun_i2c, &stk3000p_mt2060_config, if1) == NULL) { 313 if (dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, &stk3000p_mt2060_config, if1) == NULL) {
314 /* not found - use panasonic pll parameters */ 314 /* not found - use panasonic pll parameters */
315 if (dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, tun_i2c, DVB_PLL_ENV57H1XD5) == NULL) 315 if (dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60, tun_i2c, DVB_PLL_ENV57H1XD5) == NULL)
316 return -ENOMEM; 316 return -ENOMEM;
317 } else { 317 } else {
318 st->mt2060_present = 1; 318 st->mt2060_present = 1;
319 /* set the correct parameters for the dib3000p */ 319 /* set the correct parameters for the dib3000p */
320 dib3000mc_set_config(adap->fe[0], &stk3000p_dib3000p_config); 320 dib3000mc_set_config(adap->fe_adap[0].fe, &stk3000p_dib3000p_config);
321 } 321 }
322 return 0; 322 return 0;
323} 323}
diff --git a/drivers/media/dvb/dvb-usb/dibusb-mb.c b/drivers/media/dvb/dvb-usb/dibusb-mb.c
index c653b321e428..f13b3a3605c0 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-mb.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-mb.c
@@ -31,11 +31,11 @@ static int dibusb_dib3000mb_frontend_attach(struct dvb_usb_adapter *adap)
31 31
32 demod_cfg.demod_address = 0x8; 32 demod_cfg.demod_address = 0x8;
33 33
34 if ((adap->fe[0] = dvb_attach(dib3000mb_attach, &demod_cfg, 34 if ((adap->fe_adap[0].fe = dvb_attach(dib3000mb_attach, &demod_cfg,
35 &adap->dev->i2c_adap, &st->ops)) == NULL) 35 &adap->dev->i2c_adap, &st->ops)) == NULL)
36 return -ENODEV; 36 return -ENODEV;
37 37
38 adap->fe[0]->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl; 38 adap->fe_adap[0].fe->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl;
39 39
40 return 0; 40 return 0;
41} 41}
@@ -46,7 +46,7 @@ static int dibusb_thomson_tuner_attach(struct dvb_usb_adapter *adap)
46 46
47 st->tuner_addr = 0x61; 47 st->tuner_addr = 0x61;
48 48
49 dvb_attach(dvb_pll_attach, adap->fe[0], 0x61, &adap->dev->i2c_adap, 49 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, &adap->dev->i2c_adap,
50 DVB_PLL_TUA6010XS); 50 DVB_PLL_TUA6010XS);
51 return 0; 51 return 0;
52} 52}
@@ -57,7 +57,7 @@ static int dibusb_panasonic_tuner_attach(struct dvb_usb_adapter *adap)
57 57
58 st->tuner_addr = 0x60; 58 st->tuner_addr = 0x60;
59 59
60 dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, &adap->dev->i2c_adap, 60 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60, &adap->dev->i2c_adap,
61 DVB_PLL_TDA665X); 61 DVB_PLL_TDA665X);
62 return 0; 62 return 0;
63} 63}
@@ -78,16 +78,16 @@ static int dibusb_tuner_probe_and_attach(struct dvb_usb_adapter *adap)
78 /* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */ 78 /* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */
79 msg[0].addr = msg[1].addr = st->tuner_addr = 0x60; 79 msg[0].addr = msg[1].addr = st->tuner_addr = 0x60;
80 80
81 if (adap->fe[0]->ops.i2c_gate_ctrl) 81 if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl)
82 adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0],1); 82 adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe,1);
83 83
84 if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) { 84 if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) {
85 err("tuner i2c write failed."); 85 err("tuner i2c write failed.");
86 ret = -EREMOTEIO; 86 ret = -EREMOTEIO;
87 } 87 }
88 88
89 if (adap->fe[0]->ops.i2c_gate_ctrl) 89 if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl)
90 adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0],0); 90 adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe,0);
91 91
92 if (b2[0] == 0xfe) { 92 if (b2[0] == 0xfe) {
93 info("This device has the Thomson Cable onboard. Which is default."); 93 info("This device has the Thomson Cable onboard. Which is default.");
@@ -185,6 +185,8 @@ static struct dvb_usb_device_properties dibusb1_1_properties = {
185 .num_adapters = 1, 185 .num_adapters = 1,
186 .adapter = { 186 .adapter = {
187 { 187 {
188 .num_frontends = 1,
189 .fe = {{
188 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 190 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
189 .pid_filter_count = 16, 191 .pid_filter_count = 16,
190 192
@@ -205,6 +207,7 @@ static struct dvb_usb_device_properties dibusb1_1_properties = {
205 } 207 }
206 } 208 }
207 }, 209 },
210 }},
208 .size_of_priv = sizeof(struct dibusb_state), 211 .size_of_priv = sizeof(struct dibusb_state),
209 } 212 }
210 }, 213 },
@@ -272,6 +275,8 @@ static struct dvb_usb_device_properties dibusb1_1_an2235_properties = {
272 .num_adapters = 1, 275 .num_adapters = 1,
273 .adapter = { 276 .adapter = {
274 { 277 {
278 .num_frontends = 1,
279 .fe = {{
275 .caps = DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_ADAP_HAS_PID_FILTER, 280 .caps = DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_ADAP_HAS_PID_FILTER,
276 .pid_filter_count = 16, 281 .pid_filter_count = 16,
277 282
@@ -292,6 +297,7 @@ static struct dvb_usb_device_properties dibusb1_1_an2235_properties = {
292 } 297 }
293 } 298 }
294 }, 299 },
300 }},
295 .size_of_priv = sizeof(struct dibusb_state), 301 .size_of_priv = sizeof(struct dibusb_state),
296 }, 302 },
297 }, 303 },
@@ -338,6 +344,8 @@ static struct dvb_usb_device_properties dibusb2_0b_properties = {
338 .num_adapters = 1, 344 .num_adapters = 1,
339 .adapter = { 345 .adapter = {
340 { 346 {
347 .num_frontends = 1,
348 .fe = {{
341 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 349 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
342 .pid_filter_count = 16, 350 .pid_filter_count = 16,
343 351
@@ -358,6 +366,7 @@ static struct dvb_usb_device_properties dibusb2_0b_properties = {
358 } 366 }
359 } 367 }
360 }, 368 },
369 }},
361 .size_of_priv = sizeof(struct dibusb_state), 370 .size_of_priv = sizeof(struct dibusb_state),
362 } 371 }
363 }, 372 },
@@ -398,6 +407,8 @@ static struct dvb_usb_device_properties artec_t1_usb2_properties = {
398 .num_adapters = 1, 407 .num_adapters = 1,
399 .adapter = { 408 .adapter = {
400 { 409 {
410 .num_frontends = 1,
411 .fe = {{
401 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 412 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
402 .pid_filter_count = 16, 413 .pid_filter_count = 16,
403 414
@@ -417,6 +428,7 @@ static struct dvb_usb_device_properties artec_t1_usb2_properties = {
417 } 428 }
418 } 429 }
419 }, 430 },
431 }},
420 .size_of_priv = sizeof(struct dibusb_state), 432 .size_of_priv = sizeof(struct dibusb_state),
421 } 433 }
422 }, 434 },
diff --git a/drivers/media/dvb/dvb-usb/dibusb-mc.c b/drivers/media/dvb/dvb-usb/dibusb-mc.c
index c1d9094b61e5..9c165e2569d4 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-mc.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-mc.c
@@ -57,6 +57,8 @@ static struct dvb_usb_device_properties dibusb_mc_properties = {
57 .num_adapters = 1, 57 .num_adapters = 1,
58 .adapter = { 58 .adapter = {
59 { 59 {
60 .num_frontends = 1,
61 .fe = {{
60 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 62 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
61 .pid_filter_count = 32, 63 .pid_filter_count = 32,
62 .streaming_ctrl = dibusb2_0_streaming_ctrl, 64 .streaming_ctrl = dibusb2_0_streaming_ctrl,
@@ -76,6 +78,7 @@ static struct dvb_usb_device_properties dibusb_mc_properties = {
76 } 78 }
77 } 79 }
78 }, 80 },
81 }},
79 .size_of_priv = sizeof(struct dibusb_state), 82 .size_of_priv = sizeof(struct dibusb_state),
80 } 83 }
81 }, 84 },
diff --git a/drivers/media/dvb/dvb-usb/digitv.c b/drivers/media/dvb/dvb-usb/digitv.c
index 1e17d15bd3e9..edabdae5accb 100644
--- a/drivers/media/dvb/dvb-usb/digitv.c
+++ b/drivers/media/dvb/dvb-usb/digitv.c
@@ -137,11 +137,11 @@ static int digitv_frontend_attach(struct dvb_usb_adapter *adap)
137{ 137{
138 struct digitv_state *st = adap->dev->priv; 138 struct digitv_state *st = adap->dev->priv;
139 139
140 if ((adap->fe[0] = dvb_attach(mt352_attach, &digitv_mt352_config, &adap->dev->i2c_adap)) != NULL) { 140 if ((adap->fe_adap[0].fe = dvb_attach(mt352_attach, &digitv_mt352_config, &adap->dev->i2c_adap)) != NULL) {
141 st->is_nxt6000 = 0; 141 st->is_nxt6000 = 0;
142 return 0; 142 return 0;
143 } 143 }
144 if ((adap->fe[0] = dvb_attach(nxt6000_attach, &digitv_nxt6000_config, &adap->dev->i2c_adap)) != NULL) { 144 if ((adap->fe_adap[0].fe = dvb_attach(nxt6000_attach, &digitv_nxt6000_config, &adap->dev->i2c_adap)) != NULL) {
145 st->is_nxt6000 = 1; 145 st->is_nxt6000 = 1;
146 return 0; 146 return 0;
147 } 147 }
@@ -152,11 +152,11 @@ static int digitv_tuner_attach(struct dvb_usb_adapter *adap)
152{ 152{
153 struct digitv_state *st = adap->dev->priv; 153 struct digitv_state *st = adap->dev->priv;
154 154
155 if (!dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, NULL, DVB_PLL_TDED4)) 155 if (!dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60, NULL, DVB_PLL_TDED4))
156 return -ENODEV; 156 return -ENODEV;
157 157
158 if (st->is_nxt6000) 158 if (st->is_nxt6000)
159 adap->fe[0]->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params; 159 adap->fe_adap[0].fe->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params;
160 160
161 return 0; 161 return 0;
162} 162}
@@ -292,6 +292,8 @@ static struct dvb_usb_device_properties digitv_properties = {
292 .num_adapters = 1, 292 .num_adapters = 1,
293 .adapter = { 293 .adapter = {
294 { 294 {
295 .num_frontends = 1,
296 .fe = {{
295 .frontend_attach = digitv_frontend_attach, 297 .frontend_attach = digitv_frontend_attach,
296 .tuner_attach = digitv_tuner_attach, 298 .tuner_attach = digitv_tuner_attach,
297 299
@@ -306,6 +308,7 @@ static struct dvb_usb_device_properties digitv_properties = {
306 } 308 }
307 } 309 }
308 }, 310 },
311 }},
309 } 312 }
310 }, 313 },
311 .identify_state = digitv_identify_state, 314 .identify_state = digitv_identify_state,
diff --git a/drivers/media/dvb/dvb-usb/dtt200u.c b/drivers/media/dvb/dvb-usb/dtt200u.c
index ea2a46ffbb0a..106dfd55ff9c 100644
--- a/drivers/media/dvb/dvb-usb/dtt200u.c
+++ b/drivers/media/dvb/dvb-usb/dtt200u.c
@@ -90,7 +90,7 @@ static int dtt200u_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
90 90
91static int dtt200u_frontend_attach(struct dvb_usb_adapter *adap) 91static int dtt200u_frontend_attach(struct dvb_usb_adapter *adap)
92{ 92{
93 adap->fe[0] = dtt200u_fe_attach(adap->dev); 93 adap->fe_adap[0].fe = dtt200u_fe_attach(adap->dev);
94 return 0; 94 return 0;
95} 95}
96 96
@@ -140,6 +140,8 @@ static struct dvb_usb_device_properties dtt200u_properties = {
140 .num_adapters = 1, 140 .num_adapters = 1,
141 .adapter = { 141 .adapter = {
142 { 142 {
143 .num_frontends = 1,
144 .fe = {{
143 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 145 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
144 .pid_filter_count = 15, 146 .pid_filter_count = 15,
145 147
@@ -157,6 +159,7 @@ static struct dvb_usb_device_properties dtt200u_properties = {
157 } 159 }
158 } 160 }
159 }, 161 },
162 }},
160 } 163 }
161 }, 164 },
162 .power_ctrl = dtt200u_power_ctrl, 165 .power_ctrl = dtt200u_power_ctrl,
@@ -187,6 +190,8 @@ static struct dvb_usb_device_properties wt220u_properties = {
187 .num_adapters = 1, 190 .num_adapters = 1,
188 .adapter = { 191 .adapter = {
189 { 192 {
193 .num_frontends = 1,
194 .fe = {{
190 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 195 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
191 .pid_filter_count = 15, 196 .pid_filter_count = 15,
192 197
@@ -204,6 +209,7 @@ static struct dvb_usb_device_properties wt220u_properties = {
204 } 209 }
205 } 210 }
206 }, 211 },
212 }},
207 } 213 }
208 }, 214 },
209 .power_ctrl = dtt200u_power_ctrl, 215 .power_ctrl = dtt200u_power_ctrl,
@@ -234,6 +240,8 @@ static struct dvb_usb_device_properties wt220u_fc_properties = {
234 .num_adapters = 1, 240 .num_adapters = 1,
235 .adapter = { 241 .adapter = {
236 { 242 {
243 .num_frontends = 1,
244 .fe = {{
237 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 245 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
238 .pid_filter_count = 15, 246 .pid_filter_count = 15,
239 247
@@ -251,6 +259,7 @@ static struct dvb_usb_device_properties wt220u_fc_properties = {
251 } 259 }
252 } 260 }
253 }, 261 },
262 }},
254 } 263 }
255 }, 264 },
256 .power_ctrl = dtt200u_power_ctrl, 265 .power_ctrl = dtt200u_power_ctrl,
@@ -281,6 +290,8 @@ static struct dvb_usb_device_properties wt220u_zl0353_properties = {
281 .num_adapters = 1, 290 .num_adapters = 1,
282 .adapter = { 291 .adapter = {
283 { 292 {
293 .num_frontends = 1,
294 .fe = {{
284 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 295 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
285 .pid_filter_count = 15, 296 .pid_filter_count = 15,
286 297
@@ -298,6 +309,7 @@ static struct dvb_usb_device_properties wt220u_zl0353_properties = {
298 } 309 }
299 } 310 }
300 }, 311 },
312 }},
301 } 313 }
302 }, 314 },
303 .power_ctrl = dtt200u_power_ctrl, 315 .power_ctrl = dtt200u_power_ctrl,
diff --git a/drivers/media/dvb/dvb-usb/dtv5100.c b/drivers/media/dvb/dvb-usb/dtv5100.c
index 75ed55cdd8a0..7373132163d2 100644
--- a/drivers/media/dvb/dvb-usb/dtv5100.c
+++ b/drivers/media/dvb/dvb-usb/dtv5100.c
@@ -115,13 +115,13 @@ static struct zl10353_config dtv5100_zl10353_config = {
115 115
116static int dtv5100_frontend_attach(struct dvb_usb_adapter *adap) 116static int dtv5100_frontend_attach(struct dvb_usb_adapter *adap)
117{ 117{
118 adap->fe[0] = dvb_attach(zl10353_attach, &dtv5100_zl10353_config, 118 adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &dtv5100_zl10353_config,
119 &adap->dev->i2c_adap); 119 &adap->dev->i2c_adap);
120 if (adap->fe[0] == NULL) 120 if (adap->fe_adap[0].fe == NULL)
121 return -EIO; 121 return -EIO;
122 122
123 /* disable i2c gate, or it won't work... is this safe? */ 123 /* disable i2c gate, or it won't work... is this safe? */
124 adap->fe[0]->ops.i2c_gate_ctrl = NULL; 124 adap->fe_adap[0].fe->ops.i2c_gate_ctrl = NULL;
125 125
126 return 0; 126 return 0;
127} 127}
@@ -133,7 +133,7 @@ static struct qt1010_config dtv5100_qt1010_config = {
133static int dtv5100_tuner_attach(struct dvb_usb_adapter *adap) 133static int dtv5100_tuner_attach(struct dvb_usb_adapter *adap)
134{ 134{
135 return dvb_attach(qt1010_attach, 135 return dvb_attach(qt1010_attach,
136 adap->fe[0], &adap->dev->i2c_adap, 136 adap->fe_adap[0].fe, &adap->dev->i2c_adap,
137 &dtv5100_qt1010_config) == NULL ? -ENODEV : 0; 137 &dtv5100_qt1010_config) == NULL ? -ENODEV : 0;
138} 138}
139 139
@@ -180,6 +180,8 @@ static struct dvb_usb_device_properties dtv5100_properties = {
180 180
181 .num_adapters = 1, 181 .num_adapters = 1,
182 .adapter = {{ 182 .adapter = {{
183 .num_frontends = 1,
184 .fe = {{
183 .frontend_attach = dtv5100_frontend_attach, 185 .frontend_attach = dtv5100_frontend_attach,
184 .tuner_attach = dtv5100_tuner_attach, 186 .tuner_attach = dtv5100_tuner_attach,
185 187
@@ -193,6 +195,7 @@ static struct dvb_usb_device_properties dtv5100_properties = {
193 } 195 }
194 } 196 }
195 }, 197 },
198 }},
196 } }, 199 } },
197 200
198 .i2c_algo = &dtv5100_i2c_algo, 201 .i2c_algo = &dtv5100_i2c_algo,
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c b/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
index 5e34df70ad6e..3f1115925ce6 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
@@ -17,15 +17,19 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
17 if (adap == NULL) 17 if (adap == NULL)
18 return -ENODEV; 18 return -ENODEV;
19 19
20 if (adap->active_fe < 0) {
21 return -EINVAL;
22 }
23
20 newfeedcount = adap->feedcount + (onoff ? 1 : -1); 24 newfeedcount = adap->feedcount + (onoff ? 1 : -1);
21 25
22 /* stop feed before setting a new pid if there will be no pid anymore */ 26 /* stop feed before setting a new pid if there will be no pid anymore */
23 if (newfeedcount == 0) { 27 if (newfeedcount == 0) {
24 deb_ts("stop feeding\n"); 28 deb_ts("stop feeding\n");
25 usb_urb_kill(&adap->stream); 29 usb_urb_kill(&adap->fe_adap[adap->active_fe].stream);
26 30
27 if (adap->props.streaming_ctrl != NULL) { 31 if (adap->props.fe[adap->active_fe].streaming_ctrl != NULL) {
28 ret = adap->props.streaming_ctrl(adap, 0); 32 ret = adap->props.fe[adap->active_fe].streaming_ctrl(adap, 0);
29 if (ret < 0) { 33 if (ret < 0) {
30 err("error while stopping stream."); 34 err("error while stopping stream.");
31 return ret; 35 return ret;
@@ -36,36 +40,36 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
36 adap->feedcount = newfeedcount; 40 adap->feedcount = newfeedcount;
37 41
38 /* activate the pid on the device specific pid_filter */ 42 /* activate the pid on the device specific pid_filter */
39 deb_ts("setting pid (%s): %5d %04x at index %d '%s'\n",adap->pid_filtering ? 43 deb_ts("setting pid (%s): %5d %04x at index %d '%s'\n",adap->fe_adap[adap->active_fe].pid_filtering ?
40 "yes" : "no", dvbdmxfeed->pid,dvbdmxfeed->pid,dvbdmxfeed->index,onoff ? 44 "yes" : "no", dvbdmxfeed->pid,dvbdmxfeed->pid,dvbdmxfeed->index,onoff ?
41 "on" : "off"); 45 "on" : "off");
42 if (adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER && 46 if (adap->props.fe[adap->active_fe].caps & DVB_USB_ADAP_HAS_PID_FILTER &&
43 adap->pid_filtering && 47 adap->fe_adap[adap->active_fe].pid_filtering &&
44 adap->props.pid_filter != NULL) 48 adap->props.fe[adap->active_fe].pid_filter != NULL)
45 adap->props.pid_filter(adap, dvbdmxfeed->index, dvbdmxfeed->pid,onoff); 49 adap->props.fe[adap->active_fe].pid_filter(adap, dvbdmxfeed->index, dvbdmxfeed->pid, onoff);
46 50
47 /* start the feed if this was the first feed and there is still a feed 51 /* start the feed if this was the first feed and there is still a feed
48 * for reception. 52 * for reception.
49 */ 53 */
50 if (adap->feedcount == onoff && adap->feedcount > 0) { 54 if (adap->feedcount == onoff && adap->feedcount > 0) {
51 deb_ts("submitting all URBs\n"); 55 deb_ts("submitting all URBs\n");
52 usb_urb_submit(&adap->stream); 56 usb_urb_submit(&adap->fe_adap[adap->active_fe].stream);
53 57
54 deb_ts("controlling pid parser\n"); 58 deb_ts("controlling pid parser\n");
55 if (adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER && 59 if (adap->props.fe[adap->active_fe].caps & DVB_USB_ADAP_HAS_PID_FILTER &&
56 adap->props.caps & 60 adap->props.fe[adap->active_fe].caps &
57 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF && 61 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF &&
58 adap->props.pid_filter_ctrl != NULL) { 62 adap->props.fe[adap->active_fe].pid_filter_ctrl != NULL) {
59 ret = adap->props.pid_filter_ctrl(adap, 63 ret = adap->props.fe[adap->active_fe].pid_filter_ctrl(adap,
60 adap->pid_filtering); 64 adap->fe_adap[adap->active_fe].pid_filtering);
61 if (ret < 0) { 65 if (ret < 0) {
62 err("could not handle pid_parser"); 66 err("could not handle pid_parser");
63 return ret; 67 return ret;
64 } 68 }
65 } 69 }
66 deb_ts("start feeding\n"); 70 deb_ts("start feeding\n");
67 if (adap->props.streaming_ctrl != NULL) { 71 if (adap->props.fe[adap->active_fe].streaming_ctrl != NULL) {
68 ret = adap->props.streaming_ctrl(adap, 1); 72 ret = adap->props.fe[adap->active_fe].streaming_ctrl(adap, 1);
69 if (ret < 0) { 73 if (ret < 0) {
70 err("error while enabling fifo."); 74 err("error while enabling fifo.");
71 return ret; 75 return ret;
@@ -73,6 +77,9 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
73 } 77 }
74 78
75 } 79 }
80 if ((adap->feedcount == onoff) && (!onoff))
81 adap->active_fe = -1;
82
76 return 0; 83 return 0;
77} 84}
78 85
@@ -90,6 +97,7 @@ static int dvb_usb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
90 97
91int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums) 98int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums)
92{ 99{
100 int i;
93 int ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->desc->name, 101 int ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->desc->name,
94 adap->dev->owner, &adap->dev->udev->dev, 102 adap->dev->owner, &adap->dev->udev->dev,
95 adapter_nums); 103 adapter_nums);
@@ -112,7 +120,12 @@ int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums)
112 adap->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING; 120 adap->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
113 adap->demux.priv = adap; 121 adap->demux.priv = adap;
114 122
115 adap->demux.feednum = adap->demux.filternum = adap->max_feed_count; 123 adap->demux.filternum = 0;
124 for (i = 0; i < adap->props.num_frontends; i++) {
125 if (adap->demux.filternum < adap->fe_adap[i].max_feed_count)
126 adap->demux.filternum = adap->fe_adap[i].max_feed_count;
127 }
128 adap->demux.feednum = adap->demux.filternum;
116 adap->demux.start_feed = dvb_usb_start_feed; 129 adap->demux.start_feed = dvb_usb_start_feed;
117 adap->demux.stop_feed = dvb_usb_stop_feed; 130 adap->demux.stop_feed = dvb_usb_stop_feed;
118 adap->demux.write_to_decoder = NULL; 131 adap->demux.write_to_decoder = NULL;
@@ -156,17 +169,33 @@ int dvb_usb_adapter_dvb_exit(struct dvb_usb_adapter *adap)
156 return 0; 169 return 0;
157} 170}
158 171
172static int dvb_usb_set_active_fe(struct dvb_frontend *fe, int onoff)
173{
174 struct dvb_usb_adapter *adap = fe->dvb->priv;
175
176 int ret = (adap->props.frontend_ctrl) ?
177 adap->props.frontend_ctrl(fe, onoff) : 0;
178
179 if (ret < 0) {
180 err("frontend_ctrl request failed");
181 return ret;
182 }
183 if (onoff)
184 adap->active_fe = fe->id;
185
186 return 0;
187}
188
159static int dvb_usb_fe_wakeup(struct dvb_frontend *fe) 189static int dvb_usb_fe_wakeup(struct dvb_frontend *fe)
160{ 190{
161 struct dvb_usb_adapter *adap = fe->dvb->priv; 191 struct dvb_usb_adapter *adap = fe->dvb->priv;
162 192
163 dvb_usb_device_power_ctrl(adap->dev, 1); 193 dvb_usb_device_power_ctrl(adap->dev, 1);
164 194
165 if (adap->props.frontend_ctrl) 195 dvb_usb_set_active_fe(fe, 1);
166 adap->props.frontend_ctrl(fe, 1);
167 196
168 if (adap->fe_init[fe->id]) 197 if (adap->fe_adap[fe->id].fe_init)
169 adap->fe_init[fe->id](fe); 198 adap->fe_adap[fe->id].fe_init(fe);
170 199
171 return 0; 200 return 0;
172} 201}
@@ -175,37 +204,31 @@ static int dvb_usb_fe_sleep(struct dvb_frontend *fe)
175{ 204{
176 struct dvb_usb_adapter *adap = fe->dvb->priv; 205 struct dvb_usb_adapter *adap = fe->dvb->priv;
177 206
178 if (adap->fe_sleep[fe->id]) 207 if (adap->fe_adap[fe->id].fe_sleep)
179 adap->fe_sleep[fe->id](fe); 208 adap->fe_adap[fe->id].fe_sleep(fe);
180 209
181 if (adap->props.frontend_ctrl) 210 dvb_usb_set_active_fe(fe, 0);
182 adap->props.frontend_ctrl(fe, 0);
183 211
184 return dvb_usb_device_power_ctrl(adap->dev, 0); 212 return dvb_usb_device_power_ctrl(adap->dev, 0);
185} 213}
186 214
187int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap) 215int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
188{ 216{
189 int ret, i, x; 217 int ret, i;
190 218
191 memset(adap->fe, 0, sizeof(adap->fe)); 219 /* register all given adapter frontends */
220 for (i = 0; i < adap->props.num_frontends; i++) {
192 221
193 if (adap->props.frontend_attach == NULL) { 222 if (adap->props.fe[i].frontend_attach == NULL) {
194 err("strange: '%s' #%d doesn't want to attach a frontend.", 223 err("strange: '%s' #%d,%d "
195 adap->dev->desc->name, adap->id); 224 "doesn't want to attach a frontend.",
225 adap->dev->desc->name, adap->id, i);
196 226
197 return 0; 227 return 0;
198 } 228 }
199 229
200 /* register all given adapter frontends */ 230 ret = adap->props.fe[i].frontend_attach(adap);
201 if (adap->props.num_frontends) 231 if (ret || adap->fe_adap[i].fe == NULL) {
202 x = adap->props.num_frontends - 1;
203 else
204 x = 0;
205
206 for (i = 0; i <= x; i++) {
207 ret = adap->props.frontend_attach(adap);
208 if (ret || adap->fe[i] == NULL) {
209 /* only print error when there is no FE at all */ 232 /* only print error when there is no FE at all */
210 if (i == 0) 233 if (i == 0)
211 err("no frontend was attached by '%s'", 234 err("no frontend was attached by '%s'",
@@ -214,18 +237,18 @@ int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
214 return 0; 237 return 0;
215 } 238 }
216 239
217 adap->fe[i]->id = i; 240 adap->fe_adap[i].fe->id = i;
218 241
219 /* re-assign sleep and wakeup functions */ 242 /* re-assign sleep and wakeup functions */
220 adap->fe_init[i] = adap->fe[i]->ops.init; 243 adap->fe_adap[i].fe_init = adap->fe_adap[i].fe->ops.init;
221 adap->fe[i]->ops.init = dvb_usb_fe_wakeup; 244 adap->fe_adap[i].fe->ops.init = dvb_usb_fe_wakeup;
222 adap->fe_sleep[i] = adap->fe[i]->ops.sleep; 245 adap->fe_adap[i].fe_sleep = adap->fe_adap[i].fe->ops.sleep;
223 adap->fe[i]->ops.sleep = dvb_usb_fe_sleep; 246 adap->fe_adap[i].fe->ops.sleep = dvb_usb_fe_sleep;
224 247
225 if (dvb_register_frontend(&adap->dvb_adap, adap->fe[i])) { 248 if (dvb_register_frontend(&adap->dvb_adap, adap->fe_adap[i].fe)) {
226 err("Frontend %d registration failed.", i); 249 err("Frontend %d registration failed.", i);
227 dvb_frontend_detach(adap->fe[i]); 250 dvb_frontend_detach(adap->fe_adap[i].fe);
228 adap->fe[i] = NULL; 251 adap->fe_adap[i].fe = NULL;
229 /* In error case, do not try register more FEs, 252 /* In error case, do not try register more FEs,
230 * still leaving already registered FEs alive. */ 253 * still leaving already registered FEs alive. */
231 if (i == 0) 254 if (i == 0)
@@ -235,8 +258,10 @@ int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
235 } 258 }
236 259
237 /* only attach the tuner if the demod is there */ 260 /* only attach the tuner if the demod is there */
238 if (adap->props.tuner_attach != NULL) 261 if (adap->props.fe[i].tuner_attach != NULL)
239 adap->props.tuner_attach(adap); 262 adap->props.fe[i].tuner_attach(adap);
263
264 adap->num_frontends_initialized++;
240 } 265 }
241 266
242 return 0; 267 return 0;
@@ -244,20 +269,16 @@ int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
244 269
245int dvb_usb_adapter_frontend_exit(struct dvb_usb_adapter *adap) 270int dvb_usb_adapter_frontend_exit(struct dvb_usb_adapter *adap)
246{ 271{
247 int i; 272 int i = adap->num_frontends_initialized - 1;
248 273
249 /* unregister all given adapter frontends */ 274 /* unregister all given adapter frontends */
250 if (adap->props.num_frontends)
251 i = adap->props.num_frontends - 1;
252 else
253 i = 0;
254
255 for (; i >= 0; i--) { 275 for (; i >= 0; i--) {
256 if (adap->fe[i] != NULL) { 276 if (adap->fe_adap[i].fe != NULL) {
257 dvb_unregister_frontend(adap->fe[i]); 277 dvb_unregister_frontend(adap->fe_adap[i].fe);
258 dvb_frontend_detach(adap->fe[i]); 278 dvb_frontend_detach(adap->fe_adap[i].fe);
259 } 279 }
260 } 280 }
281 adap->num_frontends_initialized = 0;
261 282
262 return 0; 283 return 0;
263} 284}
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-init.c b/drivers/media/dvb/dvb-usb/dvb-usb-init.c
index f9af3484834f..169196ec2d4e 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-init.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-init.c
@@ -29,7 +29,7 @@ MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a PID
29static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs) 29static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
30{ 30{
31 struct dvb_usb_adapter *adap; 31 struct dvb_usb_adapter *adap;
32 int ret, n; 32 int ret, n, o;
33 33
34 for (n = 0; n < d->props.num_adapters; n++) { 34 for (n = 0; n < d->props.num_adapters; n++) {
35 adap = &d->adapter[n]; 35 adap = &d->adapter[n];
@@ -38,31 +38,42 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
38 38
39 memcpy(&adap->props, &d->props.adapter[n], sizeof(struct dvb_usb_adapter_properties)); 39 memcpy(&adap->props, &d->props.adapter[n], sizeof(struct dvb_usb_adapter_properties));
40 40
41 for (o = 0; o < adap->props.num_frontends; o++) {
42 struct dvb_usb_adapter_fe_properties *props = &adap->props.fe[o];
41 /* speed - when running at FULL speed we need a HW PID filter */ 43 /* speed - when running at FULL speed we need a HW PID filter */
42 if (d->udev->speed == USB_SPEED_FULL && !(adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER)) { 44 if (d->udev->speed == USB_SPEED_FULL && !(props->caps & DVB_USB_ADAP_HAS_PID_FILTER)) {
43 err("This USB2.0 device cannot be run on a USB1.1 port. (it lacks a hardware PID filter)"); 45 err("This USB2.0 device cannot be run on a USB1.1 port. (it lacks a hardware PID filter)");
44 return -ENODEV; 46 return -ENODEV;
45 } 47 }
46 48
47 if ((d->udev->speed == USB_SPEED_FULL && adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER) || 49 if ((d->udev->speed == USB_SPEED_FULL && props->caps & DVB_USB_ADAP_HAS_PID_FILTER) ||
48 (adap->props.caps & DVB_USB_ADAP_NEED_PID_FILTERING)) { 50 (props->caps & DVB_USB_ADAP_NEED_PID_FILTERING)) {
49 info("will use the device's hardware PID filter (table count: %d).", adap->props.pid_filter_count); 51 info("will use the device's hardware PID filter (table count: %d).", props->pid_filter_count);
50 adap->pid_filtering = 1; 52 adap->fe_adap[o].pid_filtering = 1;
51 adap->max_feed_count = adap->props.pid_filter_count; 53 adap->fe_adap[o].max_feed_count = props->pid_filter_count;
52 } else { 54 } else {
53 info("will pass the complete MPEG2 transport stream to the software demuxer."); 55 info("will pass the complete MPEG2 transport stream to the software demuxer.");
54 adap->pid_filtering = 0; 56 adap->fe_adap[o].pid_filtering = 0;
55 adap->max_feed_count = 255; 57 adap->fe_adap[o].max_feed_count = 255;
56 } 58 }
57 59
58 if (!adap->pid_filtering && 60 if (!adap->fe_adap[o].pid_filtering &&
59 dvb_usb_force_pid_filter_usage && 61 dvb_usb_force_pid_filter_usage &&
60 adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER) { 62 props->caps & DVB_USB_ADAP_HAS_PID_FILTER) {
61 info("pid filter enabled by module option."); 63 info("pid filter enabled by module option.");
62 adap->pid_filtering = 1; 64 adap->fe_adap[o].pid_filtering = 1;
63 adap->max_feed_count = adap->props.pid_filter_count; 65 adap->fe_adap[o].max_feed_count = props->pid_filter_count;
64 } 66 }
65 67
68 if (props->size_of_priv > 0) {
69 adap->fe_adap[o].priv = kzalloc(props->size_of_priv, GFP_KERNEL);
70 if (adap->fe_adap[o].priv == NULL) {
71 err("no memory for priv for adapter %d fe %d.", n, o);
72 return -ENOMEM;
73 }
74 }
75 }
76
66 if (adap->props.size_of_priv > 0) { 77 if (adap->props.size_of_priv > 0) {
67 adap->priv = kzalloc(adap->props.size_of_priv, GFP_KERNEL); 78 adap->priv = kzalloc(adap->props.size_of_priv, GFP_KERNEL);
68 if (adap->priv == NULL) { 79 if (adap->priv == NULL) {
@@ -78,7 +89,7 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
78 } 89 }
79 90
80 /* use exclusive FE lock if there is multiple shared FEs */ 91 /* use exclusive FE lock if there is multiple shared FEs */
81 if (adap->fe[1]) 92 if (adap->fe_adap[1].fe)
82 adap->dvb_adap.mfe_shared = 1; 93 adap->dvb_adap.mfe_shared = 1;
83 94
84 d->num_adapters_initialized++; 95 d->num_adapters_initialized++;
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-urb.c b/drivers/media/dvb/dvb-usb/dvb-usb-urb.c
index bb46ba6a3573..53a5c30b51b2 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-urb.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-urb.c
@@ -82,16 +82,28 @@ static void dvb_usb_data_complete_204(struct usb_data_stream *stream, u8 *buffer
82 82
83int dvb_usb_adapter_stream_init(struct dvb_usb_adapter *adap) 83int dvb_usb_adapter_stream_init(struct dvb_usb_adapter *adap)
84{ 84{
85 adap->stream.udev = adap->dev->udev; 85 int i, ret = 0;
86 if (adap->props.caps & DVB_USB_ADAP_RECEIVES_204_BYTE_TS) 86 for (i = 0; i < adap->props.num_frontends; i++) {
87 adap->stream.complete = dvb_usb_data_complete_204; 87
88 else 88 adap->fe_adap[i].stream.udev = adap->dev->udev;
89 adap->stream.complete = dvb_usb_data_complete; 89 if (adap->props.fe[i].caps & DVB_USB_ADAP_RECEIVES_204_BYTE_TS)
90 adap->stream.user_priv = adap; 90 adap->fe_adap[i].stream.complete =
91 return usb_urb_init(&adap->stream, &adap->props.stream); 91 dvb_usb_data_complete_204;
92 else
93 adap->fe_adap[i].stream.complete = dvb_usb_data_complete;
94 adap->fe_adap[i].stream.user_priv = adap;
95 ret = usb_urb_init(&adap->fe_adap[i].stream,
96 &adap->props.fe[i].stream);
97 if (ret < 0)
98 break;
99 }
100 return ret;
92} 101}
93 102
94int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter *adap) 103int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter *adap)
95{ 104{
96 return usb_urb_exit(&adap->stream); 105 int i;
106 for (i = 0; i < adap->props.num_frontends; i++)
107 usb_urb_exit(&adap->fe_adap[i].stream);
108 return 0;
97} 109}
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb.h b/drivers/media/dvb/dvb-usb/dvb-usb.h
index a3e77b2e2261..6d7d13f9ce68 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb.h
@@ -136,16 +136,14 @@ struct usb_data_stream_properties {
136 * pll_desc and pll_init_buf of struct dvb_usb_device). 136 * pll_desc and pll_init_buf of struct dvb_usb_device).
137 * @stream: configuration of the USB streaming 137 * @stream: configuration of the USB streaming
138 */ 138 */
139struct dvb_usb_adapter_properties { 139struct dvb_usb_adapter_fe_properties {
140#define DVB_USB_ADAP_HAS_PID_FILTER 0x01 140#define DVB_USB_ADAP_HAS_PID_FILTER 0x01
141#define DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF 0x02 141#define DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF 0x02
142#define DVB_USB_ADAP_NEED_PID_FILTERING 0x04 142#define DVB_USB_ADAP_NEED_PID_FILTERING 0x04
143#define DVB_USB_ADAP_RECEIVES_204_BYTE_TS 0x08 143#define DVB_USB_ADAP_RECEIVES_204_BYTE_TS 0x08
144 int caps; 144 int caps;
145 int pid_filter_count; 145 int pid_filter_count;
146 int num_frontends;
147 146
148 int (*frontend_ctrl) (struct dvb_frontend *, int);
149 int (*streaming_ctrl) (struct dvb_usb_adapter *, int); 147 int (*streaming_ctrl) (struct dvb_usb_adapter *, int);
150 int (*pid_filter_ctrl) (struct dvb_usb_adapter *, int); 148 int (*pid_filter_ctrl) (struct dvb_usb_adapter *, int);
151 int (*pid_filter) (struct dvb_usb_adapter *, int, u16, int); 149 int (*pid_filter) (struct dvb_usb_adapter *, int, u16, int);
@@ -156,9 +154,18 @@ struct dvb_usb_adapter_properties {
156 struct usb_data_stream_properties stream; 154 struct usb_data_stream_properties stream;
157 155
158 int size_of_priv; 156 int size_of_priv;
157};
158
159#define MAX_NO_OF_FE_PER_ADAP 2
160struct dvb_usb_adapter_properties {
161 int size_of_priv;
159 162
163 int (*frontend_ctrl) (struct dvb_frontend *, int);
160 int (*fe_ioctl_override) (struct dvb_frontend *, 164 int (*fe_ioctl_override) (struct dvb_frontend *,
161 unsigned int, void *, unsigned int); 165 unsigned int, void *, unsigned int);
166
167 int num_frontends;
168 struct dvb_usb_adapter_fe_properties fe[MAX_NO_OF_FE_PER_ADAP];
162}; 169};
163 170
164/** 171/**
@@ -349,7 +356,20 @@ struct usb_data_stream {
349 * 356 *
350 * @stream: the usb data stream. 357 * @stream: the usb data stream.
351 */ 358 */
352#define MAX_NO_OF_FE_PER_ADAP 2 359struct dvb_usb_fe_adapter {
360 struct dvb_frontend *fe;
361
362 int (*fe_init) (struct dvb_frontend *);
363 int (*fe_sleep) (struct dvb_frontend *);
364
365 struct usb_data_stream stream;
366
367 int pid_filtering;
368 int max_feed_count;
369
370 void *priv;
371};
372
353struct dvb_usb_adapter { 373struct dvb_usb_adapter {
354 struct dvb_usb_device *dev; 374 struct dvb_usb_device *dev;
355 struct dvb_usb_adapter_properties props; 375 struct dvb_usb_adapter_properties props;
@@ -361,20 +381,16 @@ struct dvb_usb_adapter {
361 u8 id; 381 u8 id;
362 382
363 int feedcount; 383 int feedcount;
364 int pid_filtering;
365 384
366 /* dvb */ 385 /* dvb */
367 struct dvb_adapter dvb_adap; 386 struct dvb_adapter dvb_adap;
368 struct dmxdev dmxdev; 387 struct dmxdev dmxdev;
369 struct dvb_demux demux; 388 struct dvb_demux demux;
370 struct dvb_net dvb_net; 389 struct dvb_net dvb_net;
371 struct dvb_frontend *fe[MAX_NO_OF_FE_PER_ADAP];
372 int max_feed_count;
373
374 int (*fe_init[MAX_NO_OF_FE_PER_ADAP]) (struct dvb_frontend *);
375 int (*fe_sleep[MAX_NO_OF_FE_PER_ADAP]) (struct dvb_frontend *);
376 390
377 struct usb_data_stream stream; 391 struct dvb_usb_fe_adapter fe_adap[MAX_NO_OF_FE_PER_ADAP];
392 int active_fe;
393 int num_frontends_initialized;
378 394
379 void *priv; 395 void *priv;
380}; 396};
diff --git a/drivers/media/dvb/dvb-usb/dw2102.c b/drivers/media/dvb/dvb-usb/dw2102.c
index eb5dff59251d..f103ec1fe82e 100644
--- a/drivers/media/dvb/dvb-usb/dw2102.c
+++ b/drivers/media/dvb/dvb-usb/dw2102.c
@@ -992,18 +992,18 @@ static int dw2104_frontend_attach(struct dvb_usb_adapter *d)
992 struct dvb_tuner_ops *tuner_ops = NULL; 992 struct dvb_tuner_ops *tuner_ops = NULL;
993 993
994 if (demod_probe & 4) { 994 if (demod_probe & 4) {
995 d->fe[0] = dvb_attach(stv0900_attach, &dw2104a_stv0900_config, 995 d->fe_adap[0].fe = dvb_attach(stv0900_attach, &dw2104a_stv0900_config,
996 &d->dev->i2c_adap, 0); 996 &d->dev->i2c_adap, 0);
997 if (d->fe[0] != NULL) { 997 if (d->fe_adap[0].fe != NULL) {
998 if (dvb_attach(stb6100_attach, d->fe[0], 998 if (dvb_attach(stb6100_attach, d->fe_adap[0].fe,
999 &dw2104a_stb6100_config, 999 &dw2104a_stb6100_config,
1000 &d->dev->i2c_adap)) { 1000 &d->dev->i2c_adap)) {
1001 tuner_ops = &d->fe[0]->ops.tuner_ops; 1001 tuner_ops = &d->fe_adap[0].fe->ops.tuner_ops;
1002 tuner_ops->set_frequency = stb6100_set_freq; 1002 tuner_ops->set_frequency = stb6100_set_freq;
1003 tuner_ops->get_frequency = stb6100_get_freq; 1003 tuner_ops->get_frequency = stb6100_get_freq;
1004 tuner_ops->set_bandwidth = stb6100_set_bandw; 1004 tuner_ops->set_bandwidth = stb6100_set_bandw;
1005 tuner_ops->get_bandwidth = stb6100_get_bandw; 1005 tuner_ops->get_bandwidth = stb6100_get_bandw;
1006 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1006 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1007 info("Attached STV0900+STB6100!\n"); 1007 info("Attached STV0900+STB6100!\n");
1008 return 0; 1008 return 0;
1009 } 1009 }
@@ -1011,13 +1011,13 @@ static int dw2104_frontend_attach(struct dvb_usb_adapter *d)
1011 } 1011 }
1012 1012
1013 if (demod_probe & 2) { 1013 if (demod_probe & 2) {
1014 d->fe[0] = dvb_attach(stv0900_attach, &dw2104_stv0900_config, 1014 d->fe_adap[0].fe = dvb_attach(stv0900_attach, &dw2104_stv0900_config,
1015 &d->dev->i2c_adap, 0); 1015 &d->dev->i2c_adap, 0);
1016 if (d->fe[0] != NULL) { 1016 if (d->fe_adap[0].fe != NULL) {
1017 if (dvb_attach(stv6110_attach, d->fe[0], 1017 if (dvb_attach(stv6110_attach, d->fe_adap[0].fe,
1018 &dw2104_stv6110_config, 1018 &dw2104_stv6110_config,
1019 &d->dev->i2c_adap)) { 1019 &d->dev->i2c_adap)) {
1020 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1020 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1021 info("Attached STV0900+STV6110A!\n"); 1021 info("Attached STV0900+STV6110A!\n");
1022 return 0; 1022 return 0;
1023 } 1023 }
@@ -1025,19 +1025,19 @@ static int dw2104_frontend_attach(struct dvb_usb_adapter *d)
1025 } 1025 }
1026 1026
1027 if (demod_probe & 1) { 1027 if (demod_probe & 1) {
1028 d->fe[0] = dvb_attach(cx24116_attach, &dw2104_config, 1028 d->fe_adap[0].fe = dvb_attach(cx24116_attach, &dw2104_config,
1029 &d->dev->i2c_adap); 1029 &d->dev->i2c_adap);
1030 if (d->fe[0] != NULL) { 1030 if (d->fe_adap[0].fe != NULL) {
1031 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1031 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1032 info("Attached cx24116!\n"); 1032 info("Attached cx24116!\n");
1033 return 0; 1033 return 0;
1034 } 1034 }
1035 } 1035 }
1036 1036
1037 d->fe[0] = dvb_attach(ds3000_attach, &dw2104_ds3000_config, 1037 d->fe_adap[0].fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
1038 &d->dev->i2c_adap); 1038 &d->dev->i2c_adap);
1039 if (d->fe[0] != NULL) { 1039 if (d->fe_adap[0].fe != NULL) {
1040 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1040 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1041 info("Attached DS3000!\n"); 1041 info("Attached DS3000!\n");
1042 return 0; 1042 return 0;
1043 } 1043 }
@@ -1053,22 +1053,22 @@ static int dw2102_frontend_attach(struct dvb_usb_adapter *d)
1053{ 1053{
1054 if (dw2102_properties.i2c_algo == &dw2102_serit_i2c_algo) { 1054 if (dw2102_properties.i2c_algo == &dw2102_serit_i2c_algo) {
1055 /*dw2102_properties.adapter->tuner_attach = NULL;*/ 1055 /*dw2102_properties.adapter->tuner_attach = NULL;*/
1056 d->fe[0] = dvb_attach(si21xx_attach, &serit_sp1511lhb_config, 1056 d->fe_adap[0].fe = dvb_attach(si21xx_attach, &serit_sp1511lhb_config,
1057 &d->dev->i2c_adap); 1057 &d->dev->i2c_adap);
1058 if (d->fe[0] != NULL) { 1058 if (d->fe_adap[0].fe != NULL) {
1059 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1059 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1060 info("Attached si21xx!\n"); 1060 info("Attached si21xx!\n");
1061 return 0; 1061 return 0;
1062 } 1062 }
1063 } 1063 }
1064 1064
1065 if (dw2102_properties.i2c_algo == &dw2102_earda_i2c_algo) { 1065 if (dw2102_properties.i2c_algo == &dw2102_earda_i2c_algo) {
1066 d->fe[0] = dvb_attach(stv0288_attach, &earda_config, 1066 d->fe_adap[0].fe = dvb_attach(stv0288_attach, &earda_config,
1067 &d->dev->i2c_adap); 1067 &d->dev->i2c_adap);
1068 if (d->fe[0] != NULL) { 1068 if (d->fe_adap[0].fe != NULL) {
1069 if (dvb_attach(stb6000_attach, d->fe[0], 0x61, 1069 if (dvb_attach(stb6000_attach, d->fe_adap[0].fe, 0x61,
1070 &d->dev->i2c_adap)) { 1070 &d->dev->i2c_adap)) {
1071 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1071 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1072 info("Attached stv0288!\n"); 1072 info("Attached stv0288!\n");
1073 return 0; 1073 return 0;
1074 } 1074 }
@@ -1077,10 +1077,10 @@ static int dw2102_frontend_attach(struct dvb_usb_adapter *d)
1077 1077
1078 if (dw2102_properties.i2c_algo == &dw2102_i2c_algo) { 1078 if (dw2102_properties.i2c_algo == &dw2102_i2c_algo) {
1079 /*dw2102_properties.adapter->tuner_attach = dw2102_tuner_attach;*/ 1079 /*dw2102_properties.adapter->tuner_attach = dw2102_tuner_attach;*/
1080 d->fe[0] = dvb_attach(stv0299_attach, &sharp_z0194a_config, 1080 d->fe_adap[0].fe = dvb_attach(stv0299_attach, &sharp_z0194a_config,
1081 &d->dev->i2c_adap); 1081 &d->dev->i2c_adap);
1082 if (d->fe[0] != NULL) { 1082 if (d->fe_adap[0].fe != NULL) {
1083 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1083 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1084 info("Attached stv0299!\n"); 1084 info("Attached stv0299!\n");
1085 return 0; 1085 return 0;
1086 } 1086 }
@@ -1090,9 +1090,9 @@ static int dw2102_frontend_attach(struct dvb_usb_adapter *d)
1090 1090
1091static int dw3101_frontend_attach(struct dvb_usb_adapter *d) 1091static int dw3101_frontend_attach(struct dvb_usb_adapter *d)
1092{ 1092{
1093 d->fe[0] = dvb_attach(tda10023_attach, &dw3101_tda10023_config, 1093 d->fe_adap[0].fe = dvb_attach(tda10023_attach, &dw3101_tda10023_config,
1094 &d->dev->i2c_adap, 0x48); 1094 &d->dev->i2c_adap, 0x48);
1095 if (d->fe[0] != NULL) { 1095 if (d->fe_adap[0].fe != NULL) {
1096 info("Attached tda10023!\n"); 1096 info("Attached tda10023!\n");
1097 return 0; 1097 return 0;
1098 } 1098 }
@@ -1101,12 +1101,12 @@ static int dw3101_frontend_attach(struct dvb_usb_adapter *d)
1101 1101
1102static int zl100313_frontend_attach(struct dvb_usb_adapter *d) 1102static int zl100313_frontend_attach(struct dvb_usb_adapter *d)
1103{ 1103{
1104 d->fe[0] = dvb_attach(mt312_attach, &zl313_config, 1104 d->fe_adap[0].fe = dvb_attach(mt312_attach, &zl313_config,
1105 &d->dev->i2c_adap); 1105 &d->dev->i2c_adap);
1106 if (d->fe[0] != NULL) { 1106 if (d->fe_adap[0].fe != NULL) {
1107 if (dvb_attach(zl10039_attach, d->fe[0], 0x60, 1107 if (dvb_attach(zl10039_attach, d->fe_adap[0].fe, 0x60,
1108 &d->dev->i2c_adap)) { 1108 &d->dev->i2c_adap)) {
1109 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1109 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1110 info("Attached zl100313+zl10039!\n"); 1110 info("Attached zl100313+zl10039!\n");
1111 return 0; 1111 return 0;
1112 } 1112 }
@@ -1119,16 +1119,16 @@ static int stv0288_frontend_attach(struct dvb_usb_adapter *d)
1119{ 1119{
1120 u8 obuf[] = {7, 1}; 1120 u8 obuf[] = {7, 1};
1121 1121
1122 d->fe[0] = dvb_attach(stv0288_attach, &earda_config, 1122 d->fe_adap[0].fe = dvb_attach(stv0288_attach, &earda_config,
1123 &d->dev->i2c_adap); 1123 &d->dev->i2c_adap);
1124 1124
1125 if (d->fe[0] == NULL) 1125 if (d->fe_adap[0].fe == NULL)
1126 return -EIO; 1126 return -EIO;
1127 1127
1128 if (NULL == dvb_attach(stb6000_attach, d->fe[0], 0x61, &d->dev->i2c_adap)) 1128 if (NULL == dvb_attach(stb6000_attach, d->fe_adap[0].fe, 0x61, &d->dev->i2c_adap))
1129 return -EIO; 1129 return -EIO;
1130 1130
1131 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1131 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1132 1132
1133 dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG); 1133 dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
1134 1134
@@ -1143,14 +1143,14 @@ static int ds3000_frontend_attach(struct dvb_usb_adapter *d)
1143 struct s6x0_state *st = (struct s6x0_state *)d->dev->priv; 1143 struct s6x0_state *st = (struct s6x0_state *)d->dev->priv;
1144 u8 obuf[] = {7, 1}; 1144 u8 obuf[] = {7, 1};
1145 1145
1146 d->fe[0] = dvb_attach(ds3000_attach, &dw2104_ds3000_config, 1146 d->fe_adap[0].fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
1147 &d->dev->i2c_adap); 1147 &d->dev->i2c_adap);
1148 1148
1149 if (d->fe[0] == NULL) 1149 if (d->fe_adap[0].fe == NULL)
1150 return -EIO; 1150 return -EIO;
1151 1151
1152 st->old_set_voltage = d->fe[0]->ops.set_voltage; 1152 st->old_set_voltage = d->fe_adap[0].fe->ops.set_voltage;
1153 d->fe[0]->ops.set_voltage = s660_set_voltage; 1153 d->fe_adap[0].fe->ops.set_voltage = s660_set_voltage;
1154 1154
1155 dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG); 1155 dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
1156 1156
@@ -1163,12 +1163,12 @@ static int prof_7500_frontend_attach(struct dvb_usb_adapter *d)
1163{ 1163{
1164 u8 obuf[] = {7, 1}; 1164 u8 obuf[] = {7, 1};
1165 1165
1166 d->fe[0] = dvb_attach(stv0900_attach, &prof_7500_stv0900_config, 1166 d->fe_adap[0].fe = dvb_attach(stv0900_attach, &prof_7500_stv0900_config,
1167 &d->dev->i2c_adap, 0); 1167 &d->dev->i2c_adap, 0);
1168 if (d->fe[0] == NULL) 1168 if (d->fe_adap[0].fe == NULL)
1169 return -EIO; 1169 return -EIO;
1170 1170
1171 d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1171 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1172 1172
1173 dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG); 1173 dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
1174 1174
@@ -1204,9 +1204,9 @@ static int su3000_frontend_attach(struct dvb_usb_adapter *d)
1204 if (dvb_usb_generic_rw(d->dev, obuf, 1, ibuf, 1, 0) < 0) 1204 if (dvb_usb_generic_rw(d->dev, obuf, 1, ibuf, 1, 0) < 0)
1205 err("command 0x51 transfer failed."); 1205 err("command 0x51 transfer failed.");
1206 1206
1207 d->fe[0] = dvb_attach(ds3000_attach, &su3000_ds3000_config, 1207 d->fe_adap[0].fe = dvb_attach(ds3000_attach, &su3000_ds3000_config,
1208 &d->dev->i2c_adap); 1208 &d->dev->i2c_adap);
1209 if (d->fe[0] == NULL) 1209 if (d->fe_adap[0].fe == NULL)
1210 return -EIO; 1210 return -EIO;
1211 1211
1212 info("Attached DS3000!\n"); 1212 info("Attached DS3000!\n");
@@ -1216,14 +1216,14 @@ static int su3000_frontend_attach(struct dvb_usb_adapter *d)
1216 1216
1217static int dw2102_tuner_attach(struct dvb_usb_adapter *adap) 1217static int dw2102_tuner_attach(struct dvb_usb_adapter *adap)
1218{ 1218{
1219 dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, 1219 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
1220 &adap->dev->i2c_adap, DVB_PLL_OPERA1); 1220 &adap->dev->i2c_adap, DVB_PLL_OPERA1);
1221 return 0; 1221 return 0;
1222} 1222}
1223 1223
1224static int dw3101_tuner_attach(struct dvb_usb_adapter *adap) 1224static int dw3101_tuner_attach(struct dvb_usb_adapter *adap)
1225{ 1225{
1226 dvb_attach(dvb_pll_attach, adap->fe[0], 0x60, 1226 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
1227 &adap->dev->i2c_adap, DVB_PLL_TUA6034); 1227 &adap->dev->i2c_adap, DVB_PLL_TUA6034);
1228 1228
1229 return 0; 1229 return 0;
@@ -1535,7 +1535,7 @@ static int dw2102_load_firmware(struct usb_device *dev,
1535 DW210X_READ_MSG); 1535 DW210X_READ_MSG);
1536 if ((reset16[0] == 0xa1) || (reset16[0] == 0x80)) { 1536 if ((reset16[0] == 0xa1) || (reset16[0] == 0x80)) {
1537 dw2102_properties.i2c_algo = &dw2102_i2c_algo; 1537 dw2102_properties.i2c_algo = &dw2102_i2c_algo;
1538 dw2102_properties.adapter->tuner_attach = &dw2102_tuner_attach; 1538 dw2102_properties.adapter->fe[0].tuner_attach = &dw2102_tuner_attach;
1539 break; 1539 break;
1540 } else { 1540 } else {
1541 /* check STV0288 frontend */ 1541 /* check STV0288 frontend */
@@ -1591,6 +1591,8 @@ static struct dvb_usb_device_properties dw2102_properties = {
1591 .read_mac_address = dw210x_read_mac_address, 1591 .read_mac_address = dw210x_read_mac_address,
1592 .adapter = { 1592 .adapter = {
1593 { 1593 {
1594 .num_frontends = 1,
1595 .fe = {{
1594 .frontend_attach = dw2102_frontend_attach, 1596 .frontend_attach = dw2102_frontend_attach,
1595 .stream = { 1597 .stream = {
1596 .type = USB_BULK, 1598 .type = USB_BULK,
@@ -1602,6 +1604,7 @@ static struct dvb_usb_device_properties dw2102_properties = {
1602 } 1604 }
1603 } 1605 }
1604 }, 1606 },
1607 }},
1605 } 1608 }
1606 }, 1609 },
1607 .num_device_descs = 3, 1610 .num_device_descs = 3,
@@ -1642,6 +1645,8 @@ static struct dvb_usb_device_properties dw2104_properties = {
1642 .read_mac_address = dw210x_read_mac_address, 1645 .read_mac_address = dw210x_read_mac_address,
1643 .adapter = { 1646 .adapter = {
1644 { 1647 {
1648 .num_frontends = 1,
1649 .fe = {{
1645 .frontend_attach = dw2104_frontend_attach, 1650 .frontend_attach = dw2104_frontend_attach,
1646 .stream = { 1651 .stream = {
1647 .type = USB_BULK, 1652 .type = USB_BULK,
@@ -1653,6 +1658,7 @@ static struct dvb_usb_device_properties dw2104_properties = {
1653 } 1658 }
1654 } 1659 }
1655 }, 1660 },
1661 }},
1656 } 1662 }
1657 }, 1663 },
1658 .num_device_descs = 2, 1664 .num_device_descs = 2,
@@ -1689,6 +1695,8 @@ static struct dvb_usb_device_properties dw3101_properties = {
1689 .read_mac_address = dw210x_read_mac_address, 1695 .read_mac_address = dw210x_read_mac_address,
1690 .adapter = { 1696 .adapter = {
1691 { 1697 {
1698 .num_frontends = 1,
1699 .fe = {{
1692 .frontend_attach = dw3101_frontend_attach, 1700 .frontend_attach = dw3101_frontend_attach,
1693 .tuner_attach = dw3101_tuner_attach, 1701 .tuner_attach = dw3101_tuner_attach,
1694 .stream = { 1702 .stream = {
@@ -1701,6 +1709,7 @@ static struct dvb_usb_device_properties dw3101_properties = {
1701 } 1709 }
1702 } 1710 }
1703 }, 1711 },
1712 }},
1704 } 1713 }
1705 }, 1714 },
1706 .num_device_descs = 1, 1715 .num_device_descs = 1,
@@ -1733,6 +1742,8 @@ static struct dvb_usb_device_properties s6x0_properties = {
1733 .read_mac_address = s6x0_read_mac_address, 1742 .read_mac_address = s6x0_read_mac_address,
1734 .adapter = { 1743 .adapter = {
1735 { 1744 {
1745 .num_frontends = 1,
1746 .fe = {{
1736 .frontend_attach = zl100313_frontend_attach, 1747 .frontend_attach = zl100313_frontend_attach,
1737 .stream = { 1748 .stream = {
1738 .type = USB_BULK, 1749 .type = USB_BULK,
@@ -1744,6 +1755,7 @@ static struct dvb_usb_device_properties s6x0_properties = {
1744 } 1755 }
1745 } 1756 }
1746 }, 1757 },
1758 }},
1747 } 1759 }
1748 }, 1760 },
1749 .num_device_descs = 1, 1761 .num_device_descs = 1,
@@ -1810,6 +1822,8 @@ static struct dvb_usb_device_properties su3000_properties = {
1810 1822
1811 .adapter = { 1823 .adapter = {
1812 { 1824 {
1825 .num_frontends = 1,
1826 .fe = {{
1813 .streaming_ctrl = su3000_streaming_ctrl, 1827 .streaming_ctrl = su3000_streaming_ctrl,
1814 .frontend_attach = su3000_frontend_attach, 1828 .frontend_attach = su3000_frontend_attach,
1815 .stream = { 1829 .stream = {
@@ -1822,6 +1836,7 @@ static struct dvb_usb_device_properties su3000_properties = {
1822 } 1836 }
1823 } 1837 }
1824 } 1838 }
1839 }},
1825 } 1840 }
1826 }, 1841 },
1827 .num_device_descs = 3, 1842 .num_device_descs = 3,
@@ -1855,7 +1870,7 @@ static int dw2102_probe(struct usb_interface *intf,
1855 p1100->devices[0] = d1100; 1870 p1100->devices[0] = d1100;
1856 p1100->rc.legacy.rc_map_table = rc_map_tbs_table; 1871 p1100->rc.legacy.rc_map_table = rc_map_tbs_table;
1857 p1100->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table); 1872 p1100->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table);
1858 p1100->adapter->frontend_attach = stv0288_frontend_attach; 1873 p1100->adapter->fe[0].frontend_attach = stv0288_frontend_attach;
1859 1874
1860 s660 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL); 1875 s660 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
1861 if (!s660) { 1876 if (!s660) {
@@ -1869,7 +1884,7 @@ static int dw2102_probe(struct usb_interface *intf,
1869 s660->devices[0] = d660; 1884 s660->devices[0] = d660;
1870 s660->devices[1] = d480_1; 1885 s660->devices[1] = d480_1;
1871 s660->devices[2] = d480_2; 1886 s660->devices[2] = d480_2;
1872 s660->adapter->frontend_attach = ds3000_frontend_attach; 1887 s660->adapter->fe[0].frontend_attach = ds3000_frontend_attach;
1873 1888
1874 p7500 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL); 1889 p7500 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
1875 if (!p7500) { 1890 if (!p7500) {
@@ -1883,7 +1898,7 @@ static int dw2102_probe(struct usb_interface *intf,
1883 p7500->devices[0] = d7500; 1898 p7500->devices[0] = d7500;
1884 p7500->rc.legacy.rc_map_table = rc_map_tbs_table; 1899 p7500->rc.legacy.rc_map_table = rc_map_tbs_table;
1885 p7500->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table); 1900 p7500->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table);
1886 p7500->adapter->frontend_attach = prof_7500_frontend_attach; 1901 p7500->adapter->fe[0].frontend_attach = prof_7500_frontend_attach;
1887 1902
1888 if (0 == dvb_usb_device_init(intf, &dw2102_properties, 1903 if (0 == dvb_usb_device_init(intf, &dw2102_properties,
1889 THIS_MODULE, NULL, adapter_nr) || 1904 THIS_MODULE, NULL, adapter_nr) ||
diff --git a/drivers/media/dvb/dvb-usb/ec168.c b/drivers/media/dvb/dvb-usb/ec168.c
index 581bdfc0b1ff..78442fe4aa5e 100644
--- a/drivers/media/dvb/dvb-usb/ec168.c
+++ b/drivers/media/dvb/dvb-usb/ec168.c
@@ -200,9 +200,9 @@ static struct ec100_config ec168_ec100_config = {
200static int ec168_ec100_frontend_attach(struct dvb_usb_adapter *adap) 200static int ec168_ec100_frontend_attach(struct dvb_usb_adapter *adap)
201{ 201{
202 deb_info("%s:\n", __func__); 202 deb_info("%s:\n", __func__);
203 adap->fe[0] = dvb_attach(ec100_attach, &ec168_ec100_config, 203 adap->fe_adap[0].fe = dvb_attach(ec100_attach, &ec168_ec100_config,
204 &adap->dev->i2c_adap); 204 &adap->dev->i2c_adap);
205 if (adap->fe[0] == NULL) 205 if (adap->fe_adap[0].fe == NULL)
206 return -ENODEV; 206 return -ENODEV;
207 207
208 return 0; 208 return 0;
@@ -228,7 +228,7 @@ static struct mxl5005s_config ec168_mxl5003s_config = {
228static int ec168_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap) 228static int ec168_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
229{ 229{
230 deb_info("%s:\n", __func__); 230 deb_info("%s:\n", __func__);
231 return dvb_attach(mxl5005s_attach, adap->fe[0], &adap->dev->i2c_adap, 231 return dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
232 &ec168_mxl5003s_config) == NULL ? -ENODEV : 0; 232 &ec168_mxl5003s_config) == NULL ? -ENODEV : 0;
233} 233}
234 234
@@ -382,6 +382,8 @@ static struct dvb_usb_device_properties ec168_properties = {
382 .num_adapters = 1, 382 .num_adapters = 1,
383 .adapter = { 383 .adapter = {
384 { 384 {
385 .num_frontends = 1,
386 .fe = {{
385 .streaming_ctrl = ec168_streaming_ctrl, 387 .streaming_ctrl = ec168_streaming_ctrl,
386 .frontend_attach = ec168_ec100_frontend_attach, 388 .frontend_attach = ec168_ec100_frontend_attach,
387 .tuner_attach = ec168_mxl5003s_tuner_attach, 389 .tuner_attach = ec168_mxl5003s_tuner_attach,
@@ -395,6 +397,7 @@ static struct dvb_usb_device_properties ec168_properties = {
395 } 397 }
396 } 398 }
397 }, 399 },
400 }},
398 } 401 }
399 }, 402 },
400 403
diff --git a/drivers/media/dvb/dvb-usb/friio.c b/drivers/media/dvb/dvb-usb/friio.c
index 0e4b559720ea..b092dc2137cd 100644
--- a/drivers/media/dvb/dvb-usb/friio.c
+++ b/drivers/media/dvb/dvb-usb/friio.c
@@ -403,8 +403,8 @@ static int friio_frontend_attach(struct dvb_usb_adapter *adap)
403 if (friio_initialize(adap->dev) < 0) 403 if (friio_initialize(adap->dev) < 0)
404 return -EIO; 404 return -EIO;
405 405
406 adap->fe[0] = jdvbt90502_attach(adap->dev); 406 adap->fe_adap[0].fe = jdvbt90502_attach(adap->dev);
407 if (adap->fe[0] == NULL) 407 if (adap->fe_adap[0].fe == NULL)
408 return -EIO; 408 return -EIO;
409 409
410 return 0; 410 return 0;
@@ -473,6 +473,8 @@ static struct dvb_usb_device_properties friio_properties = {
473 /* caps:0 => no pid filter, 188B TS packet */ 473 /* caps:0 => no pid filter, 188B TS packet */
474 /* GL861 has a HW pid filter, but no info available. */ 474 /* GL861 has a HW pid filter, but no info available. */
475 { 475 {
476 .num_frontends = 1,
477 .fe = {{
476 .caps = 0, 478 .caps = 0,
477 479
478 .frontend_attach = friio_frontend_attach, 480 .frontend_attach = friio_frontend_attach,
@@ -490,6 +492,7 @@ static struct dvb_usb_device_properties friio_properties = {
490 } 492 }
491 } 493 }
492 }, 494 },
495 }},
493 } 496 }
494 }, 497 },
495 .i2c_algo = &gl861_i2c_algo, 498 .i2c_algo = &gl861_i2c_algo,
diff --git a/drivers/media/dvb/dvb-usb/gl861.c b/drivers/media/dvb/dvb-usb/gl861.c
index fba24ed2e843..63681df244c4 100644
--- a/drivers/media/dvb/dvb-usb/gl861.c
+++ b/drivers/media/dvb/dvb-usb/gl861.c
@@ -103,9 +103,9 @@ static struct zl10353_config gl861_zl10353_config = {
103static int gl861_frontend_attach(struct dvb_usb_adapter *adap) 103static int gl861_frontend_attach(struct dvb_usb_adapter *adap)
104{ 104{
105 105
106 adap->fe[0] = dvb_attach(zl10353_attach, &gl861_zl10353_config, 106 adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &gl861_zl10353_config,
107 &adap->dev->i2c_adap); 107 &adap->dev->i2c_adap);
108 if (adap->fe[0] == NULL) 108 if (adap->fe_adap[0].fe == NULL)
109 return -EIO; 109 return -EIO;
110 110
111 return 0; 111 return 0;
@@ -118,7 +118,7 @@ static struct qt1010_config gl861_qt1010_config = {
118static int gl861_tuner_attach(struct dvb_usb_adapter *adap) 118static int gl861_tuner_attach(struct dvb_usb_adapter *adap)
119{ 119{
120 return dvb_attach(qt1010_attach, 120 return dvb_attach(qt1010_attach,
121 adap->fe[0], &adap->dev->i2c_adap, 121 adap->fe_adap[0].fe, &adap->dev->i2c_adap,
122 &gl861_qt1010_config) == NULL ? -ENODEV : 0; 122 &gl861_qt1010_config) == NULL ? -ENODEV : 0;
123} 123}
124 124
@@ -167,6 +167,8 @@ static struct dvb_usb_device_properties gl861_properties = {
167 167
168 .num_adapters = 1, 168 .num_adapters = 1,
169 .adapter = {{ 169 .adapter = {{
170 .num_frontends = 1,
171 .fe = {{
170 172
171 .frontend_attach = gl861_frontend_attach, 173 .frontend_attach = gl861_frontend_attach,
172 .tuner_attach = gl861_tuner_attach, 174 .tuner_attach = gl861_tuner_attach,
@@ -181,6 +183,7 @@ static struct dvb_usb_device_properties gl861_properties = {
181 } 183 }
182 } 184 }
183 }, 185 },
186 }},
184 } }, 187 } },
185 .i2c_algo = &gl861_i2c_algo, 188 .i2c_algo = &gl861_i2c_algo,
186 189
diff --git a/drivers/media/dvb/dvb-usb/gp8psk.c b/drivers/media/dvb/dvb-usb/gp8psk.c
index f254e13c35be..5f71284703d0 100644
--- a/drivers/media/dvb/dvb-usb/gp8psk.c
+++ b/drivers/media/dvb/dvb-usb/gp8psk.c
@@ -230,7 +230,7 @@ static int gp8psk_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
230 230
231static int gp8psk_frontend_attach(struct dvb_usb_adapter *adap) 231static int gp8psk_frontend_attach(struct dvb_usb_adapter *adap)
232{ 232{
233 adap->fe[0] = gp8psk_fe_attach(adap->dev); 233 adap->fe_adap[0].fe = gp8psk_fe_attach(adap->dev);
234 return 0; 234 return 0;
235} 235}
236 236
@@ -268,6 +268,8 @@ static struct dvb_usb_device_properties gp8psk_properties = {
268 .num_adapters = 1, 268 .num_adapters = 1,
269 .adapter = { 269 .adapter = {
270 { 270 {
271 .num_frontends = 1,
272 .fe = {{
271 .streaming_ctrl = gp8psk_streaming_ctrl, 273 .streaming_ctrl = gp8psk_streaming_ctrl,
272 .frontend_attach = gp8psk_frontend_attach, 274 .frontend_attach = gp8psk_frontend_attach,
273 /* parameter for the MPEG2-data transfer */ 275 /* parameter for the MPEG2-data transfer */
@@ -281,6 +283,7 @@ static struct dvb_usb_device_properties gp8psk_properties = {
281 } 283 }
282 } 284 }
283 }, 285 },
286 }},
284 } 287 }
285 }, 288 },
286 .power_ctrl = gp8psk_power_ctrl, 289 .power_ctrl = gp8psk_power_ctrl,
diff --git a/drivers/media/dvb/dvb-usb/it913x.c b/drivers/media/dvb/dvb-usb/it913x.c
index 3900068a2928..6d2f281510c3 100644
--- a/drivers/media/dvb/dvb-usb/it913x.c
+++ b/drivers/media/dvb/dvb-usb/it913x.c
@@ -436,7 +436,7 @@ static int it913x_name(struct dvb_usb_adapter *adap)
436{ 436{
437 const char *desc = adap->dev->desc->name; 437 const char *desc = adap->dev->desc->name;
438 char *fe_name[] = {"_1", "_2", "_3", "_4"}; 438 char *fe_name[] = {"_1", "_2", "_3", "_4"};
439 char *name = adap->fe[0]->ops.info.name; 439 char *name = adap->fe_adap[0].fe->ops.info.name;
440 440
441 strlcpy(name, desc, 128); 441 strlcpy(name, desc, 128);
442 strlcat(name, fe_name[adap->id], 128); 442 strlcat(name, fe_name[adap->id], 128);
@@ -450,12 +450,12 @@ static int it913x_frontend_attach(struct dvb_usb_adapter *adap)
450 int ret = 0; 450 int ret = 0;
451 u8 adf = it913x_read_reg(udev, IO_MUX_POWER_CLK); 451 u8 adf = it913x_read_reg(udev, IO_MUX_POWER_CLK);
452 u8 adap_addr = I2C_BASE_ADDR + (adap->id << 5); 452 u8 adap_addr = I2C_BASE_ADDR + (adap->id << 5);
453 u16 ep_size = adap->props.stream.u.bulk.buffersize; 453 u16 ep_size = adap->props.fe[0].stream.u.bulk.buffersize;
454 454
455 adap->fe[0] = dvb_attach(it913x_fe_attach, 455 adap->fe_adap[0].fe = dvb_attach(it913x_fe_attach,
456 &adap->dev->i2c_adap, adap_addr, adf, IT9137); 456 &adap->dev->i2c_adap, adap_addr, adf, IT9137);
457 457
458 if (adap->id == 0 && adap->fe[0]) { 458 if (adap->id == 0 && adap->fe_adap[0].fe) {
459 ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2_SW_RST, 0x1); 459 ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2_SW_RST, 0x1);
460 ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2IF2_SW_RST, 0x1); 460 ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2IF2_SW_RST, 0x1);
461 ret = it913x_wr_reg(udev, DEV_0, EP0_TX_EN, 0x0f); 461 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)
465 ep_size & 0xff); 465 ep_size & 0xff);
466 ret = it913x_wr_reg(udev, DEV_0, EP4_TX_LEN_MSB, ep_size >> 8); 466 ret = it913x_wr_reg(udev, DEV_0, EP4_TX_LEN_MSB, ep_size >> 8);
467 ret = it913x_wr_reg(udev, DEV_0, EP4_MAX_PKT, 0x80); 467 ret = it913x_wr_reg(udev, DEV_0, EP4_MAX_PKT, 0x80);
468 } else if (adap->id == 1 && adap->fe[0]) { 468 } else if (adap->id == 1 && adap->fe_adap[0].fe) {
469 ret = it913x_wr_reg(udev, DEV_0, EP0_TX_EN, 0x6f); 469 ret = it913x_wr_reg(udev, DEV_0, EP0_TX_EN, 0x6f);
470 ret = it913x_wr_reg(udev, DEV_0, EP5_TX_LEN_LSB, 470 ret = it913x_wr_reg(udev, DEV_0, EP5_TX_LEN_LSB,
471 ep_size & 0xff); 471 ep_size & 0xff);
@@ -524,6 +524,8 @@ static struct dvb_usb_device_properties it913x_properties = {
524 .num_adapters = 2, 524 .num_adapters = 2,
525 .adapter = { 525 .adapter = {
526 { 526 {
527 .num_frontends = 1,
528 .fe = {{
527 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 529 .caps = DVB_USB_ADAP_HAS_PID_FILTER|
528 DVB_USB_ADAP_NEED_PID_FILTERING| 530 DVB_USB_ADAP_NEED_PID_FILTERING|
529 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 531 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -544,8 +546,11 @@ static struct dvb_usb_device_properties it913x_properties = {
544 } 546 }
545 } 547 }
546 } 548 }
549 }},
547 }, 550 },
548 { 551 {
552 .num_frontends = 1,
553 .fe = {{
549 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 554 .caps = DVB_USB_ADAP_HAS_PID_FILTER|
550 DVB_USB_ADAP_NEED_PID_FILTERING| 555 DVB_USB_ADAP_NEED_PID_FILTERING|
551 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 556 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -566,6 +571,7 @@ static struct dvb_usb_device_properties it913x_properties = {
566 } 571 }
567 } 572 }
568 } 573 }
574 }},
569 } 575 }
570 }, 576 },
571 .identify_state = it913x_identify_state, 577 .identify_state = it913x_identify_state,
diff --git a/drivers/media/dvb/dvb-usb/lmedm04.c b/drivers/media/dvb/dvb-usb/lmedm04.c
index ef5911a2d342..55b25be072ee 100644
--- a/drivers/media/dvb/dvb-usb/lmedm04.c
+++ b/drivers/media/dvb/dvb-usb/lmedm04.c
@@ -941,7 +941,7 @@ static int lme_name(struct dvb_usb_adapter *adap)
941 const char *desc = adap->dev->desc->name; 941 const char *desc = adap->dev->desc->name;
942 char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395", 942 char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
943 " SHARP:BS2F7HZ0194"}; 943 " SHARP:BS2F7HZ0194"};
944 char *name = adap->fe[0]->ops.info.name; 944 char *name = adap->fe_adap[0].fe->ops.info.name;
945 945
946 strlcpy(name, desc, 128); 946 strlcpy(name, desc, 128);
947 strlcat(name, fe_name[st->tuner_config], 128); 947 strlcat(name, fe_name[st->tuner_config], 128);
@@ -958,10 +958,10 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
958 st->i2c_talk_onoff = 1; 958 st->i2c_talk_onoff = 1;
959 959
960 st->i2c_gate = 4; 960 st->i2c_gate = 4;
961 adap->fe[0] = dvb_attach(tda10086_attach, &tda10086_config, 961 adap->fe_adap[0].fe = dvb_attach(tda10086_attach, &tda10086_config,
962 &adap->dev->i2c_adap); 962 &adap->dev->i2c_adap);
963 963
964 if (adap->fe[0]) { 964 if (adap->fe_adap[0].fe) {
965 info("TUN Found Frontend TDA10086"); 965 info("TUN Found Frontend TDA10086");
966 st->i2c_tuner_gate_w = 4; 966 st->i2c_tuner_gate_w = 4;
967 st->i2c_tuner_gate_r = 4; 967 st->i2c_tuner_gate_r = 4;
@@ -975,9 +975,9 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
975 } 975 }
976 976
977 st->i2c_gate = 4; 977 st->i2c_gate = 4;
978 adap->fe[0] = dvb_attach(stv0299_attach, &sharp_z0194_config, 978 adap->fe_adap[0].fe = dvb_attach(stv0299_attach, &sharp_z0194_config,
979 &adap->dev->i2c_adap); 979 &adap->dev->i2c_adap);
980 if (adap->fe[0]) { 980 if (adap->fe_adap[0].fe) {
981 info("FE Found Stv0299"); 981 info("FE Found Stv0299");
982 st->i2c_tuner_gate_w = 4; 982 st->i2c_tuner_gate_w = 4;
983 st->i2c_tuner_gate_r = 5; 983 st->i2c_tuner_gate_r = 5;
@@ -991,9 +991,9 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
991 } 991 }
992 992
993 st->i2c_gate = 5; 993 st->i2c_gate = 5;
994 adap->fe[0] = dvb_attach(stv0288_attach, &lme_config, 994 adap->fe_adap[0].fe = dvb_attach(stv0288_attach, &lme_config,
995 &adap->dev->i2c_adap); 995 &adap->dev->i2c_adap);
996 if (adap->fe[0]) { 996 if (adap->fe_adap[0].fe) {
997 info("FE Found Stv0288"); 997 info("FE Found Stv0288");
998 st->i2c_tuner_gate_w = 4; 998 st->i2c_tuner_gate_w = 4;
999 st->i2c_tuner_gate_r = 5; 999 st->i2c_tuner_gate_r = 5;
@@ -1010,15 +1010,15 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
1010 1010
1011 1011
1012end: if (ret) { 1012end: if (ret) {
1013 if (adap->fe[0]) { 1013 if (adap->fe_adap[0].fe) {
1014 dvb_frontend_detach(adap->fe[0]); 1014 dvb_frontend_detach(adap->fe_adap[0].fe);
1015 adap->fe[0] = NULL; 1015 adap->fe_adap[0].fe = NULL;
1016 } 1016 }
1017 adap->dev->props.rc.core.rc_codes = NULL; 1017 adap->dev->props.rc.core.rc_codes = NULL;
1018 return -ENODEV; 1018 return -ENODEV;
1019 } 1019 }
1020 1020
1021 adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage; 1021 adap->fe_adap[0].fe->ops.set_voltage = dm04_lme2510_set_voltage;
1022 ret = lme_name(adap); 1022 ret = lme_name(adap);
1023 return ret; 1023 return ret;
1024} 1024}
@@ -1031,17 +1031,17 @@ static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
1031 1031
1032 switch (st->tuner_config) { 1032 switch (st->tuner_config) {
1033 case TUNER_LG: 1033 case TUNER_LG:
1034 if (dvb_attach(tda826x_attach, adap->fe[0], 0xc0, 1034 if (dvb_attach(tda826x_attach, adap->fe_adap[0].fe, 0xc0,
1035 &adap->dev->i2c_adap, 1)) 1035 &adap->dev->i2c_adap, 1))
1036 ret = st->tuner_config; 1036 ret = st->tuner_config;
1037 break; 1037 break;
1038 case TUNER_S7395: 1038 case TUNER_S7395:
1039 if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner, 1039 if (dvb_attach(ix2505v_attach , adap->fe_adap[0].fe, &lme_tuner,
1040 &adap->dev->i2c_adap)) 1040 &adap->dev->i2c_adap))
1041 ret = st->tuner_config; 1041 ret = st->tuner_config;
1042 break; 1042 break;
1043 case TUNER_S0194: 1043 case TUNER_S0194:
1044 if (dvb_attach(dvb_pll_attach , adap->fe[0], 0xc0, 1044 if (dvb_attach(dvb_pll_attach , adap->fe_adap[0].fe, 0xc0,
1045 &adap->dev->i2c_adap, DVB_PLL_OPERA1)) 1045 &adap->dev->i2c_adap, DVB_PLL_OPERA1))
1046 ret = st->tuner_config; 1046 ret = st->tuner_config;
1047 break; 1047 break;
@@ -1145,6 +1145,8 @@ static struct dvb_usb_device_properties lme2510_properties = {
1145 .num_adapters = 1, 1145 .num_adapters = 1,
1146 .adapter = { 1146 .adapter = {
1147 { 1147 {
1148 .num_frontends = 1,
1149 .fe = {{
1148 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 1150 .caps = DVB_USB_ADAP_HAS_PID_FILTER|
1149 DVB_USB_ADAP_NEED_PID_FILTERING| 1151 DVB_USB_ADAP_NEED_PID_FILTERING|
1150 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1152 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -1166,6 +1168,7 @@ static struct dvb_usb_device_properties lme2510_properties = {
1166 } 1168 }
1167 } 1169 }
1168 } 1170 }
1171 }},
1169 } 1172 }
1170 }, 1173 },
1171 .rc.core = { 1174 .rc.core = {
@@ -1193,6 +1196,8 @@ static struct dvb_usb_device_properties lme2510c_properties = {
1193 .num_adapters = 1, 1196 .num_adapters = 1,
1194 .adapter = { 1197 .adapter = {
1195 { 1198 {
1199 .num_frontends = 1,
1200 .fe = {{
1196 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 1201 .caps = DVB_USB_ADAP_HAS_PID_FILTER|
1197 DVB_USB_ADAP_NEED_PID_FILTERING| 1202 DVB_USB_ADAP_NEED_PID_FILTERING|
1198 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1203 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -1214,6 +1219,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
1214 } 1219 }
1215 } 1220 }
1216 } 1221 }
1222 }},
1217 } 1223 }
1218 }, 1224 },
1219 .rc.core = { 1225 .rc.core = {
@@ -1241,7 +1247,7 @@ static void *lme2510_exit_int(struct dvb_usb_device *d)
1241 void *buffer = NULL; 1247 void *buffer = NULL;
1242 1248
1243 if (adap != NULL) { 1249 if (adap != NULL) {
1244 lme2510_kill_urb(&adap->stream); 1250 lme2510_kill_urb(&adap->fe_adap[0].stream);
1245 adap->feedcount = 0; 1251 adap->feedcount = 0;
1246 } 1252 }
1247 1253
diff --git a/drivers/media/dvb/dvb-usb/m920x.c b/drivers/media/dvb/dvb-usb/m920x.c
index ed5c161c1c4b..c3e461e9fa71 100644
--- a/drivers/media/dvb/dvb-usb/m920x.c
+++ b/drivers/media/dvb/dvb-usb/m920x.c
@@ -86,12 +86,12 @@ static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq)
86 } 86 }
87 87
88 for (i = 0; i < d->props.num_adapters; i++) 88 for (i = 0; i < d->props.num_adapters; i++)
89 flags |= d->adapter[i].props.caps; 89 flags |= d->adapter[i].props.fe[0].caps;
90 90
91 /* Some devices(Dposh) might crash if we attempt touch at all. */ 91 /* Some devices(Dposh) might crash if we attempt touch at all. */
92 if (flags & DVB_USB_ADAP_HAS_PID_FILTER) { 92 if (flags & DVB_USB_ADAP_HAS_PID_FILTER) {
93 for (i = 0; i < d->props.num_adapters; i++) { 93 for (i = 0; i < d->props.num_adapters; i++) {
94 epi = d->adapter[i].props.stream.endpoint - 0x81; 94 epi = d->adapter[i].props.fe[0].stream.endpoint - 0x81;
95 95
96 if (epi < 0 || epi >= M9206_MAX_ADAPTERS) { 96 if (epi < 0 || epi >= M9206_MAX_ADAPTERS) {
97 printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n"); 97 printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n");
@@ -292,7 +292,7 @@ static int m920x_update_filters(struct dvb_usb_adapter *adap)
292 struct m920x_state *m = adap->dev->priv; 292 struct m920x_state *m = adap->dev->priv;
293 int enabled = m->filtering_enabled[adap->id]; 293 int enabled = m->filtering_enabled[adap->id];
294 int i, ret = 0, filter = 0; 294 int i, ret = 0, filter = 0;
295 int ep = adap->props.stream.endpoint; 295 int ep = adap->props.fe[0].stream.endpoint;
296 296
297 for (i = 0; i < M9206_MAX_FILTERS; i++) 297 for (i = 0; i < M9206_MAX_FILTERS; i++)
298 if (m->filters[adap->id][i] == 8192) 298 if (m->filters[adap->id][i] == 8192)
@@ -501,7 +501,7 @@ static int m920x_mt352_frontend_attach(struct dvb_usb_adapter *adap)
501{ 501{
502 deb("%s\n",__func__); 502 deb("%s\n",__func__);
503 503
504 if ((adap->fe[0] = dvb_attach(mt352_attach, 504 if ((adap->fe_adap[0].fe = dvb_attach(mt352_attach,
505 &m920x_mt352_config, 505 &m920x_mt352_config,
506 &adap->dev->i2c_adap)) == NULL) 506 &adap->dev->i2c_adap)) == NULL)
507 return -EIO; 507 return -EIO;
@@ -513,7 +513,7 @@ static int m920x_tda10046_08_frontend_attach(struct dvb_usb_adapter *adap)
513{ 513{
514 deb("%s\n",__func__); 514 deb("%s\n",__func__);
515 515
516 if ((adap->fe[0] = dvb_attach(tda10046_attach, 516 if ((adap->fe_adap[0].fe = dvb_attach(tda10046_attach,
517 &m920x_tda10046_08_config, 517 &m920x_tda10046_08_config,
518 &adap->dev->i2c_adap)) == NULL) 518 &adap->dev->i2c_adap)) == NULL)
519 return -EIO; 519 return -EIO;
@@ -525,7 +525,7 @@ static int m920x_tda10046_0b_frontend_attach(struct dvb_usb_adapter *adap)
525{ 525{
526 deb("%s\n",__func__); 526 deb("%s\n",__func__);
527 527
528 if ((adap->fe[0] = dvb_attach(tda10046_attach, 528 if ((adap->fe_adap[0].fe = dvb_attach(tda10046_attach,
529 &m920x_tda10046_0b_config, 529 &m920x_tda10046_0b_config,
530 &adap->dev->i2c_adap)) == NULL) 530 &adap->dev->i2c_adap)) == NULL)
531 return -EIO; 531 return -EIO;
@@ -537,7 +537,7 @@ static int m920x_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
537{ 537{
538 deb("%s\n",__func__); 538 deb("%s\n",__func__);
539 539
540 if (dvb_attach(qt1010_attach, adap->fe[0], &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL) 540 if (dvb_attach(qt1010_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL)
541 return -ENODEV; 541 return -ENODEV;
542 542
543 return 0; 543 return 0;
@@ -547,7 +547,7 @@ static int m920x_tda8275_60_tuner_attach(struct dvb_usb_adapter *adap)
547{ 547{
548 deb("%s\n",__func__); 548 deb("%s\n",__func__);
549 549
550 if (dvb_attach(tda827x_attach, adap->fe[0], 0x60, &adap->dev->i2c_adap, NULL) == NULL) 550 if (dvb_attach(tda827x_attach, adap->fe_adap[0].fe, 0x60, &adap->dev->i2c_adap, NULL) == NULL)
551 return -ENODEV; 551 return -ENODEV;
552 552
553 return 0; 553 return 0;
@@ -557,7 +557,7 @@ static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap)
557{ 557{
558 deb("%s\n",__func__); 558 deb("%s\n",__func__);
559 559
560 if (dvb_attach(tda827x_attach, adap->fe[0], 0x61, &adap->dev->i2c_adap, NULL) == NULL) 560 if (dvb_attach(tda827x_attach, adap->fe_adap[0].fe, 0x61, &adap->dev->i2c_adap, NULL) == NULL)
561 return -ENODEV; 561 return -ENODEV;
562 562
563 return 0; 563 return 0;
@@ -565,7 +565,7 @@ static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap)
565 565
566static int m920x_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap) 566static int m920x_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
567{ 567{
568 dvb_attach(simple_tuner_attach, adap->fe[0], 568 dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
569 &adap->dev->i2c_adap, 0x61, 569 &adap->dev->i2c_adap, 0x61,
570 TUNER_PHILIPS_FMD1216ME_MK3); 570 TUNER_PHILIPS_FMD1216ME_MK3);
571 return 0; 571 return 0;
@@ -807,6 +807,9 @@ static struct dvb_usb_device_properties megasky_properties = {
807 .identify_state = m920x_identify_state, 807 .identify_state = m920x_identify_state,
808 .num_adapters = 1, 808 .num_adapters = 1,
809 .adapter = {{ 809 .adapter = {{
810 .num_frontends = 1,
811 .fe = {{
812
810 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 813 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
811 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 814 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
812 815
@@ -827,6 +830,7 @@ static struct dvb_usb_device_properties megasky_properties = {
827 } 830 }
828 } 831 }
829 }, 832 },
833 }},
830 }}, 834 }},
831 .i2c_algo = &m920x_i2c_algo, 835 .i2c_algo = &m920x_i2c_algo,
832 836
@@ -851,6 +855,9 @@ static struct dvb_usb_device_properties digivox_mini_ii_properties = {
851 .identify_state = m920x_identify_state, 855 .identify_state = m920x_identify_state,
852 .num_adapters = 1, 856 .num_adapters = 1,
853 .adapter = {{ 857 .adapter = {{
858 .num_frontends = 1,
859 .fe = {{
860
854 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 861 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
855 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 862 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
856 863
@@ -871,6 +878,7 @@ static struct dvb_usb_device_properties digivox_mini_ii_properties = {
871 } 878 }
872 } 879 }
873 }, 880 },
881 }},
874 }}, 882 }},
875 .i2c_algo = &m920x_i2c_algo, 883 .i2c_algo = &m920x_i2c_algo,
876 884
@@ -910,6 +918,9 @@ static struct dvb_usb_device_properties tvwalkertwin_properties = {
910 .identify_state = m920x_identify_state, 918 .identify_state = m920x_identify_state,
911 .num_adapters = 2, 919 .num_adapters = 2,
912 .adapter = {{ 920 .adapter = {{
921 .num_frontends = 1,
922 .fe = {{
923
913 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 924 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
914 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 925 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
915 926
@@ -929,7 +940,11 @@ static struct dvb_usb_device_properties tvwalkertwin_properties = {
929 .buffersize = 512, 940 .buffersize = 512,
930 } 941 }
931 } 942 }
943 }},
932 }},{ 944 }},{
945 .num_frontends = 1,
946 .fe = {{
947
933 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 948 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
934 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 949 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
935 950
@@ -949,6 +964,7 @@ static struct dvb_usb_device_properties tvwalkertwin_properties = {
949 .buffersize = 512, 964 .buffersize = 512,
950 } 965 }
951 } 966 }
967 }},
952 }, 968 },
953 }}, 969 }},
954 .i2c_algo = &m920x_i2c_algo, 970 .i2c_algo = &m920x_i2c_algo,
@@ -974,6 +990,8 @@ static struct dvb_usb_device_properties dposh_properties = {
974 .identify_state = m920x_identify_state, 990 .identify_state = m920x_identify_state,
975 .num_adapters = 1, 991 .num_adapters = 1,
976 .adapter = {{ 992 .adapter = {{
993 .num_frontends = 1,
994 .fe = {{
977 /* Hardware pid filters don't work with this device/firmware */ 995 /* Hardware pid filters don't work with this device/firmware */
978 996
979 .frontend_attach = m920x_mt352_frontend_attach, 997 .frontend_attach = m920x_mt352_frontend_attach,
@@ -989,6 +1007,7 @@ static struct dvb_usb_device_properties dposh_properties = {
989 } 1007 }
990 } 1008 }
991 }, 1009 },
1010 }},
992 }}, 1011 }},
993 .i2c_algo = &m920x_i2c_algo, 1012 .i2c_algo = &m920x_i2c_algo,
994 1013
@@ -1019,6 +1038,9 @@ static struct dvb_usb_device_properties pinnacle_pctv310e_properties = {
1019 .identify_state = m920x_identify_state, 1038 .identify_state = m920x_identify_state,
1020 .num_adapters = 1, 1039 .num_adapters = 1,
1021 .adapter = {{ 1040 .adapter = {{
1041 .num_frontends = 1,
1042 .fe = {{
1043
1022 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 1044 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1023 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1045 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1024 1046
@@ -1041,6 +1063,7 @@ static struct dvb_usb_device_properties pinnacle_pctv310e_properties = {
1041 } 1063 }
1042 } 1064 }
1043 }, 1065 },
1066 }},
1044 } }, 1067 } },
1045 .i2c_algo = &m920x_i2c_algo, 1068 .i2c_algo = &m920x_i2c_algo,
1046 1069
diff --git a/drivers/media/dvb/dvb-usb/mxl111sf.c b/drivers/media/dvb/dvb-usb/mxl111sf.c
index 3da452a1a06f..0c3f69ae946a 100644
--- a/drivers/media/dvb/dvb-usb/mxl111sf.c
+++ b/drivers/media/dvb/dvb-usb/mxl111sf.c
@@ -253,7 +253,8 @@ static int mxl111sf_adap_fe_init(struct dvb_frontend *fe)
253 struct dvb_usb_adapter *adap = fe->dvb->priv; 253 struct dvb_usb_adapter *adap = fe->dvb->priv;
254 struct dvb_usb_device *d = adap->dev; 254 struct dvb_usb_device *d = adap->dev;
255 struct mxl111sf_state *state = d->priv; 255 struct mxl111sf_state *state = d->priv;
256 struct mxl111sf_adap_state *adap_state = adap->priv; 256 struct mxl111sf_adap_state *adap_state = adap->fe_adap[fe->id].priv;
257
257 int err; 258 int err;
258 259
259 /* exit if we didnt initialize the driver yet */ 260 /* exit if we didnt initialize the driver yet */
@@ -311,7 +312,7 @@ static int mxl111sf_adap_fe_sleep(struct dvb_frontend *fe)
311 struct dvb_usb_adapter *adap = fe->dvb->priv; 312 struct dvb_usb_adapter *adap = fe->dvb->priv;
312 struct dvb_usb_device *d = adap->dev; 313 struct dvb_usb_device *d = adap->dev;
313 struct mxl111sf_state *state = d->priv; 314 struct mxl111sf_state *state = d->priv;
314 struct mxl111sf_adap_state *adap_state = adap->priv; 315 struct mxl111sf_adap_state *adap_state = adap->fe_adap[fe->id].priv;
315 int err; 316 int err;
316 317
317 /* exit if we didnt initialize the driver yet */ 318 /* 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)
336{ 337{
337 struct dvb_usb_device *d = adap->dev; 338 struct dvb_usb_device *d = adap->dev;
338 struct mxl111sf_state *state = d->priv; 339 struct mxl111sf_state *state = d->priv;
339 struct mxl111sf_adap_state *adap_state = adap->priv; 340 struct mxl111sf_adap_state *adap_state = adap->fe_adap[adap->active_fe].priv;
340 int ret = 0; 341 int ret = 0;
341 u8 tmp; 342 u8 tmp;
342 343
@@ -378,7 +379,7 @@ static int mxl111sf_lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
378{ 379{
379 struct dvb_usb_device *d = adap->dev; 380 struct dvb_usb_device *d = adap->dev;
380 struct mxl111sf_state *state = d->priv; 381 struct mxl111sf_state *state = d->priv;
381 struct mxl111sf_adap_state *adap_state = adap->priv; 382 struct mxl111sf_adap_state *adap_state = adap->fe_adap[0].priv;
382 int ret; 383 int ret;
383 384
384 deb_adv("%s()\n", __func__); 385 deb_adv("%s()\n", __func__);
@@ -421,14 +422,14 @@ static int mxl111sf_lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
421 if (mxl_fail(ret)) 422 if (mxl_fail(ret))
422 goto fail; 423 goto fail;
423 424
424 adap->fe[0] = dvb_attach(lgdt3305_attach, 425 adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach,
425 &hauppauge_lgdt3305_config, 426 &hauppauge_lgdt3305_config,
426 &adap->dev->i2c_adap); 427 &adap->dev->i2c_adap);
427 if (adap->fe[0]) { 428 if (adap->fe_adap[0].fe) {
428 adap_state->fe_init = adap->fe[0]->ops.init; 429 adap_state->fe_init = adap->fe_adap[0].fe->ops.init;
429 adap->fe[0]->ops.init = mxl111sf_adap_fe_init; 430 adap->fe_adap[0].fe->ops.init = mxl111sf_adap_fe_init;
430 adap_state->fe_sleep = adap->fe[0]->ops.sleep; 431 adap_state->fe_sleep = adap->fe_adap[0].fe->ops.sleep;
431 adap->fe[0]->ops.sleep = mxl111sf_adap_fe_sleep; 432 adap->fe_adap[0].fe->ops.sleep = mxl111sf_adap_fe_sleep;
432 return 0; 433 return 0;
433 } 434 }
434 ret = -EIO; 435 ret = -EIO;
@@ -516,7 +517,7 @@ static int mxl111sf_attach_tuner(struct dvb_usb_adapter *adap)
516 517
517 deb_adv("%s()\n", __func__); 518 deb_adv("%s()\n", __func__);
518 519
519 if (NULL != dvb_attach(mxl111sf_tuner_attach, adap->fe[0], state, 520 if (NULL != dvb_attach(mxl111sf_tuner_attach, adap->fe_adap[0].fe, state,
520 &mxl_tuner_config)) 521 &mxl_tuner_config))
521 return 0; 522 return 0;
522 523
@@ -714,13 +715,16 @@ static struct dvb_usb_device_properties mxl111sf_atsc_bulk_properties = {
714 .num_adapters = 1, 715 .num_adapters = 1,
715 .adapter = { 716 .adapter = {
716 { 717 {
718 .fe_ioctl_override = mxl111sf_fe_ioctl_override,
719 .num_frontends = 1,
720 .fe = {{
717 .size_of_priv = sizeof(struct mxl111sf_adap_state), 721 .size_of_priv = sizeof(struct mxl111sf_adap_state),
718 .fe_ioctl_override = mxl111sf_fe_ioctl_override,
719 722
720 .frontend_attach = mxl111sf_lgdt3305_frontend_attach, 723 .frontend_attach = mxl111sf_lgdt3305_frontend_attach,
721 .tuner_attach = mxl111sf_attach_tuner, 724 .tuner_attach = mxl111sf_attach_tuner,
722 725
723 MXL111SF_EP6_BULK_STREAMING_CONFIG, 726 MXL111SF_EP6_BULK_STREAMING_CONFIG,
727 }},
724 }, 728 },
725 }, 729 },
726 .num_device_descs = 6, 730 .num_device_descs = 6,
@@ -768,13 +772,16 @@ static struct dvb_usb_device_properties mxl111sf_atsc_isoc_properties = {
768 .num_adapters = 1, 772 .num_adapters = 1,
769 .adapter = { 773 .adapter = {
770 { 774 {
775 .fe_ioctl_override = mxl111sf_fe_ioctl_override,
776 .num_frontends = 1,
777 .fe = {{
771 .size_of_priv = sizeof(struct mxl111sf_adap_state), 778 .size_of_priv = sizeof(struct mxl111sf_adap_state),
772 .fe_ioctl_override = mxl111sf_fe_ioctl_override,
773 779
774 .frontend_attach = mxl111sf_lgdt3305_frontend_attach, 780 .frontend_attach = mxl111sf_lgdt3305_frontend_attach,
775 .tuner_attach = mxl111sf_attach_tuner, 781 .tuner_attach = mxl111sf_attach_tuner,
776 782
777 MXL111SF_EP6_ISOC_STREAMING_CONFIG, 783 MXL111SF_EP6_ISOC_STREAMING_CONFIG,
784 }},
778 }, 785 },
779 }, 786 },
780 .num_device_descs = 6, 787 .num_device_descs = 6,
diff --git a/drivers/media/dvb/dvb-usb/nova-t-usb2.c b/drivers/media/dvb/dvb-usb/nova-t-usb2.c
index bc350e982b72..21384da6570e 100644
--- a/drivers/media/dvb/dvb-usb/nova-t-usb2.c
+++ b/drivers/media/dvb/dvb-usb/nova-t-usb2.c
@@ -166,6 +166,8 @@ static struct dvb_usb_device_properties nova_t_properties = {
166 .num_adapters = 1, 166 .num_adapters = 1,
167 .adapter = { 167 .adapter = {
168 { 168 {
169 .num_frontends = 1,
170 .fe = {{
169 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 171 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
170 .pid_filter_count = 32, 172 .pid_filter_count = 32,
171 173
@@ -186,7 +188,7 @@ static struct dvb_usb_device_properties nova_t_properties = {
186 } 188 }
187 } 189 }
188 }, 190 },
189 191 }},
190 .size_of_priv = sizeof(struct dibusb_state), 192 .size_of_priv = sizeof(struct dibusb_state),
191 } 193 }
192 }, 194 },
diff --git a/drivers/media/dvb/dvb-usb/opera1.c b/drivers/media/dvb/dvb-usb/opera1.c
index 170b1ef16fac..b6e12f9665b3 100644
--- a/drivers/media/dvb/dvb-usb/opera1.c
+++ b/drivers/media/dvb/dvb-usb/opera1.c
@@ -263,10 +263,10 @@ static struct stv0299_config opera1_stv0299_config = {
263 263
264static int opera1_frontend_attach(struct dvb_usb_adapter *d) 264static int opera1_frontend_attach(struct dvb_usb_adapter *d)
265{ 265{
266 if ((d->fe[0] = 266 if ((d->fe_adap[0].fe =
267 dvb_attach(stv0299_attach, &opera1_stv0299_config, 267 dvb_attach(stv0299_attach, &opera1_stv0299_config,
268 &d->dev->i2c_adap)) != NULL) { 268 &d->dev->i2c_adap)) != NULL) {
269 d->fe[0]->ops.set_voltage = opera1_set_voltage; 269 d->fe_adap[0].fe->ops.set_voltage = opera1_set_voltage;
270 return 0; 270 return 0;
271 } 271 }
272 info("not attached stv0299"); 272 info("not attached stv0299");
@@ -276,7 +276,7 @@ static int opera1_frontend_attach(struct dvb_usb_adapter *d)
276static int opera1_tuner_attach(struct dvb_usb_adapter *adap) 276static int opera1_tuner_attach(struct dvb_usb_adapter *adap)
277{ 277{
278 dvb_attach( 278 dvb_attach(
279 dvb_pll_attach, adap->fe[0], 0xc0>>1, 279 dvb_pll_attach, adap->fe_adap[0].fe, 0xc0>>1,
280 &adap->dev->i2c_adap, DVB_PLL_OPERA1 280 &adap->dev->i2c_adap, DVB_PLL_OPERA1
281 ); 281 );
282 return 0; 282 return 0;
@@ -516,6 +516,8 @@ static struct dvb_usb_device_properties opera1_properties = {
516 .num_adapters = 1, 516 .num_adapters = 1,
517 .adapter = { 517 .adapter = {
518 { 518 {
519 .num_frontends = 1,
520 .fe = {{
519 .frontend_attach = opera1_frontend_attach, 521 .frontend_attach = opera1_frontend_attach,
520 .streaming_ctrl = opera1_streaming_ctrl, 522 .streaming_ctrl = opera1_streaming_ctrl,
521 .tuner_attach = opera1_tuner_attach, 523 .tuner_attach = opera1_tuner_attach,
@@ -535,6 +537,7 @@ static struct dvb_usb_device_properties opera1_properties = {
535 } 537 }
536 } 538 }
537 }, 539 },
540 }},
538 } 541 }
539 }, 542 },
540 .num_device_descs = 1, 543 .num_device_descs = 1,
diff --git a/drivers/media/dvb/dvb-usb/technisat-usb2.c b/drivers/media/dvb/dvb-usb/technisat-usb2.c
index 2a89d1ef89a3..0998fe961950 100644
--- a/drivers/media/dvb/dvb-usb/technisat-usb2.c
+++ b/drivers/media/dvb/dvb-usb/technisat-usb2.c
@@ -292,7 +292,7 @@ static void technisat_usb2_green_led_control(struct work_struct *work)
292{ 292{
293 struct technisat_usb2_state *state = 293 struct technisat_usb2_state *state =
294 container_of(work, struct technisat_usb2_state, green_led_work.work); 294 container_of(work, struct technisat_usb2_state, green_led_work.work);
295 struct dvb_frontend *fe = state->dev->adapter[0].fe[0]; 295 struct dvb_frontend *fe = state->dev->adapter[0].fe_adap[0].fe;
296 296
297 if (state->power_state == 0) 297 if (state->power_state == 0)
298 goto schedule; 298 goto schedule;
@@ -505,14 +505,14 @@ static int technisat_usb2_frontend_attach(struct dvb_usb_adapter *a)
505 struct usb_device *udev = a->dev->udev; 505 struct usb_device *udev = a->dev->udev;
506 int ret; 506 int ret;
507 507
508 a->fe[0] = dvb_attach(stv090x_attach, &technisat_usb2_stv090x_config, 508 a->fe_adap[0].fe = dvb_attach(stv090x_attach, &technisat_usb2_stv090x_config,
509 &a->dev->i2c_adap, STV090x_DEMODULATOR_0); 509 &a->dev->i2c_adap, STV090x_DEMODULATOR_0);
510 510
511 if (a->fe[0]) { 511 if (a->fe_adap[0].fe) {
512 struct stv6110x_devctl *ctl; 512 struct stv6110x_devctl *ctl;
513 513
514 ctl = dvb_attach(stv6110x_attach, 514 ctl = dvb_attach(stv6110x_attach,
515 a->fe[0], 515 a->fe_adap[0].fe,
516 &technisat_usb2_stv6110x_config, 516 &technisat_usb2_stv6110x_config,
517 &a->dev->i2c_adap); 517 &a->dev->i2c_adap);
518 518
@@ -532,8 +532,8 @@ static int technisat_usb2_frontend_attach(struct dvb_usb_adapter *a)
532 /* call the init function once to initialize 532 /* call the init function once to initialize
533 tuner's clock output divider and demod's 533 tuner's clock output divider and demod's
534 master clock */ 534 master clock */
535 if (a->fe[0]->ops.init) 535 if (a->fe_adap[0].fe->ops.init)
536 a->fe[0]->ops.init(a->fe[0]); 536 a->fe_adap[0].fe->ops.init(a->fe_adap[0].fe);
537 537
538 if (mutex_lock_interruptible(&a->dev->i2c_mutex) < 0) 538 if (mutex_lock_interruptible(&a->dev->i2c_mutex) < 0)
539 return -EAGAIN; 539 return -EAGAIN;
@@ -548,20 +548,20 @@ static int technisat_usb2_frontend_attach(struct dvb_usb_adapter *a)
548 if (ret != 0) 548 if (ret != 0)
549 err("could not set IF_CLK to external"); 549 err("could not set IF_CLK to external");
550 550
551 a->fe[0]->ops.set_voltage = technisat_usb2_set_voltage; 551 a->fe_adap[0].fe->ops.set_voltage = technisat_usb2_set_voltage;
552 552
553 /* if everything was successful assign a nice name to the frontend */ 553 /* if everything was successful assign a nice name to the frontend */
554 strlcpy(a->fe[0]->ops.info.name, a->dev->desc->name, 554 strlcpy(a->fe_adap[0].fe->ops.info.name, a->dev->desc->name,
555 sizeof(a->fe[0]->ops.info.name)); 555 sizeof(a->fe_adap[0].fe->ops.info.name));
556 } else { 556 } else {
557 dvb_frontend_detach(a->fe[0]); 557 dvb_frontend_detach(a->fe_adap[0].fe);
558 a->fe[0] = NULL; 558 a->fe_adap[0].fe = NULL;
559 } 559 }
560 } 560 }
561 561
562 technisat_usb2_set_led_timer(a->dev, 1, 1); 562 technisat_usb2_set_led_timer(a->dev, 1, 1);
563 563
564 return a->fe[0] == NULL ? -ENODEV : 0; 564 return a->fe_adap[0].fe == NULL ? -ENODEV : 0;
565} 565}
566 566
567/* Remote control */ 567/* Remote control */
@@ -697,6 +697,8 @@ static struct dvb_usb_device_properties technisat_usb2_devices = {
697 .num_adapters = 1, 697 .num_adapters = 1,
698 .adapter = { 698 .adapter = {
699 { 699 {
700 .num_frontends = 1,
701 .fe = {{
700 .frontend_attach = technisat_usb2_frontend_attach, 702 .frontend_attach = technisat_usb2_frontend_attach,
701 703
702 .stream = { 704 .stream = {
@@ -711,7 +713,7 @@ static struct dvb_usb_device_properties technisat_usb2_devices = {
711 } 713 }
712 } 714 }
713 }, 715 },
714 716 }},
715 .size_of_priv = 0, 717 .size_of_priv = 0,
716 }, 718 },
717 }, 719 },
diff --git a/drivers/media/dvb/dvb-usb/ttusb2.c b/drivers/media/dvb/dvb-usb/ttusb2.c
index bda37ce05627..130d2960ddf5 100644
--- a/drivers/media/dvb/dvb-usb/ttusb2.c
+++ b/drivers/media/dvb/dvb-usb/ttusb2.c
@@ -222,7 +222,7 @@ static int ttusb2_frontend_tda10086_attach(struct dvb_usb_adapter *adap)
222 if (usb_set_interface(adap->dev->udev,0,3) < 0) 222 if (usb_set_interface(adap->dev->udev,0,3) < 0)
223 err("set interface to alts=3 failed"); 223 err("set interface to alts=3 failed");
224 224
225 if ((adap->fe[0] = dvb_attach(tda10086_attach, &tda10086_config, &adap->dev->i2c_adap)) == NULL) { 225 if ((adap->fe_adap[0].fe = dvb_attach(tda10086_attach, &tda10086_config, &adap->dev->i2c_adap)) == NULL) {
226 deb_info("TDA10086 attach failed\n"); 226 deb_info("TDA10086 attach failed\n");
227 return -ENODEV; 227 return -ENODEV;
228 } 228 }
@@ -234,7 +234,7 @@ static int ttusb2_ct3650_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
234{ 234{
235 struct dvb_usb_adapter *adap = fe->dvb->priv; 235 struct dvb_usb_adapter *adap = fe->dvb->priv;
236 236
237 return adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0], enable); 237 return adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe, enable);
238} 238}
239 239
240static int ttusb2_frontend_tda10023_attach(struct dvb_usb_adapter *adap) 240static 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)
242 if (usb_set_interface(adap->dev->udev, 0, 3) < 0) 242 if (usb_set_interface(adap->dev->udev, 0, 3) < 0)
243 err("set interface to alts=3 failed"); 243 err("set interface to alts=3 failed");
244 244
245 if (adap->fe[0] == NULL) { 245 if (adap->fe_adap[0].fe == NULL) {
246 /* FE 0 DVB-C */ 246 /* FE 0 DVB-C */
247 adap->fe[0] = dvb_attach(tda10023_attach, 247 adap->fe_adap[0].fe = dvb_attach(tda10023_attach,
248 &tda10023_config, &adap->dev->i2c_adap, 0x48); 248 &tda10023_config, &adap->dev->i2c_adap, 0x48);
249 249
250 if (adap->fe[0] == NULL) { 250 if (adap->fe_adap[0].fe == NULL) {
251 deb_info("TDA10023 attach failed\n"); 251 deb_info("TDA10023 attach failed\n");
252 return -ENODEV; 252 return -ENODEV;
253 } 253 }
254 } else { 254 } else {
255 adap->fe[1] = dvb_attach(tda10048_attach, 255 adap->fe_adap[1].fe = dvb_attach(tda10048_attach,
256 &tda10048_config, &adap->dev->i2c_adap); 256 &tda10048_config, &adap->dev->i2c_adap);
257 257
258 if (adap->fe[1] == NULL) { 258 if (adap->fe_adap[1].fe == NULL) {
259 deb_info("TDA10048 attach failed\n"); 259 deb_info("TDA10048 attach failed\n");
260 return -ENODEV; 260 return -ENODEV;
261 } 261 }
262 262
263 /* tuner is behind TDA10023 I2C-gate */ 263 /* tuner is behind TDA10023 I2C-gate */
264 adap->fe[1]->ops.i2c_gate_ctrl = ttusb2_ct3650_i2c_gate_ctrl; 264 adap->fe_adap[1].fe->ops.i2c_gate_ctrl = ttusb2_ct3650_i2c_gate_ctrl;
265 265
266 } 266 }
267 267
@@ -273,10 +273,10 @@ static int ttusb2_tuner_tda827x_attach(struct dvb_usb_adapter *adap)
273 struct dvb_frontend *fe; 273 struct dvb_frontend *fe;
274 274
275 /* MFE: select correct FE to attach tuner since that's called twice */ 275 /* MFE: select correct FE to attach tuner since that's called twice */
276 if (adap->fe[1] == NULL) 276 if (adap->fe_adap[1].fe == NULL)
277 fe = adap->fe[0]; 277 fe = adap->fe_adap[0].fe;
278 else 278 else
279 fe = adap->fe[1]; 279 fe = adap->fe_adap[1].fe;
280 280
281 /* attach tuner */ 281 /* attach tuner */
282 if (dvb_attach(tda827x_attach, fe, 0x61, &adap->dev->i2c_adap, &tda827x_config) == NULL) { 282 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)
288 288
289static int ttusb2_tuner_tda826x_attach(struct dvb_usb_adapter *adap) 289static int ttusb2_tuner_tda826x_attach(struct dvb_usb_adapter *adap)
290{ 290{
291 if (dvb_attach(tda826x_attach, adap->fe[0], 0x60, &adap->dev->i2c_adap, 0) == NULL) { 291 if (dvb_attach(tda826x_attach, adap->fe_adap[0].fe, 0x60, &adap->dev->i2c_adap, 0) == NULL) {
292 deb_info("TDA8263 attach failed\n"); 292 deb_info("TDA8263 attach failed\n");
293 return -ENODEV; 293 return -ENODEV;
294 } 294 }
295 295
296 if (dvb_attach(lnbp21_attach, adap->fe[0], &adap->dev->i2c_adap, 0, 0) == NULL) { 296 if (dvb_attach(lnbp21_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap, 0, 0) == NULL) {
297 deb_info("LNBP21 attach failed\n"); 297 deb_info("LNBP21 attach failed\n");
298 return -ENODEV; 298 return -ENODEV;
299 } 299 }
@@ -340,6 +340,8 @@ static struct dvb_usb_device_properties ttusb2_properties = {
340 .num_adapters = 1, 340 .num_adapters = 1,
341 .adapter = { 341 .adapter = {
342 { 342 {
343 .num_frontends = 1,
344 .fe = {{
343 .streaming_ctrl = NULL, // ttusb2_streaming_ctrl, 345 .streaming_ctrl = NULL, // ttusb2_streaming_ctrl,
344 346
345 .frontend_attach = ttusb2_frontend_tda10086_attach, 347 .frontend_attach = ttusb2_frontend_tda10086_attach,
@@ -358,6 +360,7 @@ static struct dvb_usb_device_properties ttusb2_properties = {
358 } 360 }
359 } 361 }
360 } 362 }
363 }},
361 } 364 }
362 }, 365 },
363 366
@@ -392,6 +395,8 @@ static struct dvb_usb_device_properties ttusb2_properties_s2400 = {
392 .num_adapters = 1, 395 .num_adapters = 1,
393 .adapter = { 396 .adapter = {
394 { 397 {
398 .num_frontends = 1,
399 .fe = {{
395 .streaming_ctrl = NULL, 400 .streaming_ctrl = NULL,
396 401
397 .frontend_attach = ttusb2_frontend_tda10086_attach, 402 .frontend_attach = ttusb2_frontend_tda10086_attach,
@@ -410,6 +415,7 @@ static struct dvb_usb_device_properties ttusb2_properties_s2400 = {
410 } 415 }
411 } 416 }
412 } 417 }
418 }},
413 } 419 }
414 }, 420 },
415 421
@@ -446,9 +452,10 @@ static struct dvb_usb_device_properties ttusb2_properties_ct3650 = {
446 .num_adapters = 1, 452 .num_adapters = 1,
447 .adapter = { 453 .adapter = {
448 { 454 {
455 .num_frontends = 2,
456 .fe = {{
449 .streaming_ctrl = NULL, 457 .streaming_ctrl = NULL,
450 458
451 .num_frontends = 2,
452 .frontend_attach = ttusb2_frontend_tda10023_attach, 459 .frontend_attach = ttusb2_frontend_tda10023_attach,
453 .tuner_attach = ttusb2_tuner_tda827x_attach, 460 .tuner_attach = ttusb2_tuner_tda827x_attach,
454 461
@@ -465,6 +472,26 @@ static struct dvb_usb_device_properties ttusb2_properties_ct3650 = {
465 } 472 }
466 } 473 }
467 } 474 }
475 },{
476 .streaming_ctrl = NULL,
477
478 .frontend_attach = ttusb2_frontend_tda10023_attach,
479 .tuner_attach = ttusb2_tuner_tda827x_attach,
480
481 /* parameter for the MPEG2-data transfer */
482 .stream = {
483 .type = USB_ISOC,
484 .count = 5,
485 .endpoint = 0x02,
486 .u = {
487 .isoc = {
488 .framesperurb = 4,
489 .framesize = 940,
490 .interval = 1,
491 }
492 }
493 }
494 }},
468 }, 495 },
469 }, 496 },
470 497
diff --git a/drivers/media/dvb/dvb-usb/umt-010.c b/drivers/media/dvb/dvb-usb/umt-010.c
index ed4765a1f323..463673a5c2b2 100644
--- a/drivers/media/dvb/dvb-usb/umt-010.c
+++ b/drivers/media/dvb/dvb-usb/umt-010.c
@@ -60,14 +60,14 @@ static int umt_mt352_frontend_attach(struct dvb_usb_adapter *adap)
60 umt_config.demod_init = umt_mt352_demod_init; 60 umt_config.demod_init = umt_mt352_demod_init;
61 umt_config.demod_address = 0xf; 61 umt_config.demod_address = 0xf;
62 62
63 adap->fe[0] = dvb_attach(mt352_attach, &umt_config, &adap->dev->i2c_adap); 63 adap->fe_adap[0].fe = dvb_attach(mt352_attach, &umt_config, &adap->dev->i2c_adap);
64 64
65 return 0; 65 return 0;
66} 66}
67 67
68static int umt_tuner_attach (struct dvb_usb_adapter *adap) 68static int umt_tuner_attach (struct dvb_usb_adapter *adap)
69{ 69{
70 dvb_attach(dvb_pll_attach, adap->fe[0], 0x61, NULL, DVB_PLL_TUA6034); 70 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, NULL, DVB_PLL_TUA6034);
71 return 0; 71 return 0;
72} 72}
73 73
@@ -100,6 +100,8 @@ static struct dvb_usb_device_properties umt_properties = {
100 .num_adapters = 1, 100 .num_adapters = 1,
101 .adapter = { 101 .adapter = {
102 { 102 {
103 .num_frontends = 1,
104 .fe = {{
103 .streaming_ctrl = dibusb2_0_streaming_ctrl, 105 .streaming_ctrl = dibusb2_0_streaming_ctrl,
104 .frontend_attach = umt_mt352_frontend_attach, 106 .frontend_attach = umt_mt352_frontend_attach,
105 .tuner_attach = umt_tuner_attach, 107 .tuner_attach = umt_tuner_attach,
@@ -115,7 +117,7 @@ static struct dvb_usb_device_properties umt_properties = {
115 } 117 }
116 } 118 }
117 }, 119 },
118 120 }},
119 .size_of_priv = sizeof(struct dibusb_state), 121 .size_of_priv = sizeof(struct dibusb_state),
120 } 122 }
121 }, 123 },
diff --git a/drivers/media/dvb/dvb-usb/vp702x.c b/drivers/media/dvb/dvb-usb/vp702x.c
index 47b3462cead8..45e31f224814 100644
--- a/drivers/media/dvb/dvb-usb/vp702x.c
+++ b/drivers/media/dvb/dvb-usb/vp702x.c
@@ -320,7 +320,7 @@ static int vp702x_frontend_attach(struct dvb_usb_adapter *adap)
320 320
321 vp702x_init_pid_filter(adap); 321 vp702x_init_pid_filter(adap);
322 322
323 adap->fe[0] = vp702x_fe_attach(adap->dev); 323 adap->fe_adap[0].fe = vp702x_fe_attach(adap->dev);
324 vp702x_usb_out_op(adap->dev, SET_TUNER_POWER_REQ, 1, 7, NULL, 0); 324 vp702x_usb_out_op(adap->dev, SET_TUNER_POWER_REQ, 1, 7, NULL, 0);
325 325
326 return 0; 326 return 0;
@@ -383,6 +383,8 @@ static struct dvb_usb_device_properties vp702x_properties = {
383 .num_adapters = 1, 383 .num_adapters = 1,
384 .adapter = { 384 .adapter = {
385 { 385 {
386 .num_frontends = 1,
387 .fe = {{
386 .caps = DVB_USB_ADAP_RECEIVES_204_BYTE_TS, 388 .caps = DVB_USB_ADAP_RECEIVES_204_BYTE_TS,
387 389
388 .streaming_ctrl = vp702x_streaming_ctrl, 390 .streaming_ctrl = vp702x_streaming_ctrl,
@@ -399,6 +401,7 @@ static struct dvb_usb_device_properties vp702x_properties = {
399 } 401 }
400 } 402 }
401 }, 403 },
404 }},
402 .size_of_priv = sizeof(struct vp702x_adapter_state), 405 .size_of_priv = sizeof(struct vp702x_adapter_state),
403 } 406 }
404 }, 407 },
diff --git a/drivers/media/dvb/dvb-usb/vp7045.c b/drivers/media/dvb/dvb-usb/vp7045.c
index 4264523fcf67..498024cec2d3 100644
--- a/drivers/media/dvb/dvb-usb/vp7045.c
+++ b/drivers/media/dvb/dvb-usb/vp7045.c
@@ -214,7 +214,7 @@ static int vp7045_frontend_attach(struct dvb_usb_adapter *adap)
214/* Dump the EEPROM */ 214/* Dump the EEPROM */
215/* vp7045_read_eeprom(d,buf, 255, FX2_ID_ADDR); */ 215/* vp7045_read_eeprom(d,buf, 255, FX2_ID_ADDR); */
216 216
217 adap->fe[0] = vp7045_fe_attach(adap->dev); 217 adap->fe_adap[0].fe = vp7045_fe_attach(adap->dev);
218 218
219 return 0; 219 return 0;
220} 220}
@@ -263,6 +263,8 @@ static struct dvb_usb_device_properties vp7045_properties = {
263 .num_adapters = 1, 263 .num_adapters = 1,
264 .adapter = { 264 .adapter = {
265 { 265 {
266 .num_frontends = 1,
267 .fe = {{
266 .frontend_attach = vp7045_frontend_attach, 268 .frontend_attach = vp7045_frontend_attach,
267 /* parameter for the MPEG2-data transfer */ 269 /* parameter for the MPEG2-data transfer */
268 .stream = { 270 .stream = {
@@ -275,6 +277,7 @@ static struct dvb_usb_device_properties vp7045_properties = {
275 } 277 }
276 } 278 }
277 }, 279 },
280 }},
278 } 281 }
279 }, 282 },
280 .power_ctrl = vp7045_power_ctrl, 283 .power_ctrl = vp7045_power_ctrl,