Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Michael Krufky and committed by
Mauro Carvalho Chehab
77eed219 4c66c920

+858 -509
+3 -1
drivers/media/dvb/dvb-usb/a800.c
··· 127 127 .num_adapters = 1, 128 128 .adapter = { 129 129 { 130 + .num_frontends = 1, 131 + .fe = {{ 130 132 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 131 133 .pid_filter_count = 32, 132 134 .streaming_ctrl = dibusb2_0_streaming_ctrl, ··· 149 147 } 150 148 } 151 149 }, 152 - 150 + }}, 153 151 .size_of_priv = sizeof(struct dibusb_state), 154 152 }, 155 153 },
+4 -1
drivers/media/dvb/dvb-usb/af9005.c
··· 815 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 819 return 0; 820 820 } 821 821 ··· 999 999 .num_adapters = 1, 1000 1000 .adapter = { 1001 1001 { 1002 + .num_frontends = 1, 1003 + .fe = {{ 1002 1004 .caps = 1003 1005 DVB_USB_ADAP_HAS_PID_FILTER | 1004 1006 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, ··· 1020 1018 } 1021 1019 } 1022 1020 }, 1021 + }}, 1023 1022 } 1024 1023 }, 1025 1024 .power_ctrl = af9005_power_ctrl,
+31 -13
drivers/media/dvb/dvb-usb/af9015.c
··· 861 861 for (i = 0; i < af9015_properties_count; i++) { 862 862 /* USB1.1 set smaller buffersize and disable 2nd adapter */ 863 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 865 = TS_USB11_FRAME_SIZE; 866 866 /* disable 2nd adapter because we don't have 867 867 PID-filters */ 868 868 af9015_config.dual_mode = 0; 869 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 871 = TS_USB20_FRAME_SIZE; 872 872 } 873 873 } ··· 1113 1113 } 1114 1114 1115 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 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 1122 1122 static struct mt2060_config af9015_mt2060_config = { ··· 1190 1190 switch (af9015_af9013_config[adap->id].tuner) { 1191 1191 case AF9013_TUNER_MT2060: 1192 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 1194 &af9015_mt2060_config, 1195 1195 af9015_config.mt2060_if1[adap->id]) 1196 1196 == NULL ? -ENODEV : 0; 1197 1197 break; 1198 1198 case AF9013_TUNER_QT1010: 1199 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 1201 &af9015_qt1010_config) == NULL ? -ENODEV : 0; 1202 1202 break; 1203 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 1205 &adap->dev->i2c_adap, 1206 1206 &af9015_tda18271_config) == NULL ? -ENODEV : 0; 1207 1207 break; 1208 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 1210 &adap->dev->i2c_adap, 1211 1211 &af9015_tda18218_config) == NULL ? -ENODEV : 0; 1212 1212 break; 1213 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 1215 &adap->dev->i2c_adap, 1216 1216 &af9015_mxl5003_config) == NULL ? -ENODEV : 0; 1217 1217 break; 1218 1218 case AF9013_TUNER_MXL5005D: 1219 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 1221 &adap->dev->i2c_adap, 1222 1222 &af9015_mxl5005_config) == NULL ? -ENODEV : 0; 1223 1223 break; 1224 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 1226 &adap->dev->i2c_adap, 1227 1227 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0; 1228 1228 break; 1229 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 1231 &adap->dev->i2c_adap, 1232 1232 &af9015_mc44s803_config) == NULL ? -ENODEV : 0; 1233 1233 break; 1234 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 1236 &adap->dev->i2c_adap, 1237 1237 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0; 1238 1238 break; ··· 1306 1306 .num_adapters = 2, 1307 1307 .adapter = { 1308 1308 { 1309 + .num_frontends = 1, 1310 + .fe = {{ 1309 1311 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 1310 1312 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1311 1313 ··· 1323 1321 .count = 6, 1324 1322 .endpoint = 0x84, 1325 1323 }, 1324 + }}, 1326 1325 }, 1327 1326 { 1327 + .num_frontends = 1, 1328 + .fe = {{ 1328 1329 .frontend_attach = 1329 1330 af9015_af9013_frontend_attach, 1330 1331 .tuner_attach = af9015_tuner_attach, ··· 1342 1337 } 1343 1338 } 1344 1339 }, 1340 + }}, 1345 1341 } 1346 1342 }, 1347 1343 ··· 1440 1434 .num_adapters = 2, 1441 1435 .adapter = { 1442 1436 { 1437 + .num_frontends = 1, 1438 + .fe = {{ 1443 1439 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 1444 1440 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1445 1441 ··· 1457 1449 .count = 6, 1458 1450 .endpoint = 0x84, 1459 1451 }, 1452 + }}, 1460 1453 }, 1461 1454 { 1455 + .num_frontends = 1, 1456 + .fe = {{ 1462 1457 .frontend_attach = 1463 1458 af9015_af9013_frontend_attach, 1464 1459 .tuner_attach = af9015_tuner_attach, ··· 1476 1465 } 1477 1466 } 1478 1467 }, 1468 + }}, 1479 1469 } 1480 1470 }, 1481 1471 ··· 1563 1551 .num_adapters = 2, 1564 1552 .adapter = { 1565 1553 { 1554 + .num_frontends = 1, 1555 + .fe = {{ 1566 1556 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 1567 1557 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1568 1558 ··· 1580 1566 .count = 6, 1581 1567 .endpoint = 0x84, 1582 1568 }, 1569 + }}, 1583 1570 }, 1584 1571 { 1572 + .num_frontends = 1, 1573 + .fe = {{ 1585 1574 .frontend_attach = 1586 1575 af9015_af9013_frontend_attach, 1587 1576 .tuner_attach = af9015_tuner_attach, ··· 1599 1582 } 1600 1583 } 1601 1584 }, 1585 + }}, 1602 1586 } 1603 1587 }, 1604 1588
+43 -27
drivers/media/dvb/dvb-usb/anysee.c
··· 575 575 }; 576 576 577 577 /* detect hardware only once */ 578 - if (adap->fe[0] == NULL) { 578 + if (adap->fe_adap[0].fe == NULL) { 579 579 /* Check which hardware we have. 580 580 * We must do this call two times to get reliable values (hw bug). 581 581 */ ··· 595 595 } 596 596 597 597 /* set current frondend ID for devices having two frondends */ 598 - if (adap->fe[0]) 598 + if (adap->fe_adap[0].fe) 599 599 state->fe_id++; 600 600 601 601 switch (state->hw) { ··· 606 606 break; 607 607 608 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 610 &adap->dev->i2c_adap); 611 - if (adap->fe[0]) 611 + if (adap->fe_adap[0].fe) 612 612 break; 613 613 614 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 616 &adap->dev->i2c_adap); 617 617 618 618 break; ··· 633 633 goto error; 634 634 635 635 /* attach demod */ 636 - adap->fe[0] = dvb_attach(zl10353_attach, 636 + adap->fe_adap[0].fe = dvb_attach(zl10353_attach, 637 637 &anysee_zl10353_config, &adap->dev->i2c_adap); 638 638 639 639 break; ··· 649 649 goto error; 650 650 651 651 /* attach demod */ 652 - adap->fe[0] = dvb_attach(tda10023_attach, 652 + adap->fe_adap[0].fe = dvb_attach(tda10023_attach, 653 653 &anysee_tda10023_config, &adap->dev->i2c_adap, 0x48); 654 654 655 655 break; ··· 665 665 goto error; 666 666 667 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 669 &adap->dev->i2c_adap); 670 670 671 671 break; ··· 707 707 /* attach demod */ 708 708 if (tmp == 0xc7) { 709 709 /* TDA18212 config */ 710 - adap->fe[state->fe_id] = dvb_attach( 710 + adap->fe_adap[state->fe_id].fe = dvb_attach( 711 711 tda10023_attach, 712 712 &anysee_tda10023_tda18212_config, 713 713 &adap->dev->i2c_adap, 0x48); 714 714 } else { 715 715 /* PLL config */ 716 - adap->fe[state->fe_id] = dvb_attach( 716 + adap->fe_adap[state->fe_id].fe = dvb_attach( 717 717 tda10023_attach, 718 718 &anysee_tda10023_config, 719 719 &adap->dev->i2c_adap, 0x48); ··· 734 734 /* attach demod */ 735 735 if (tmp == 0xc7) { 736 736 /* TDA18212 config */ 737 - adap->fe[state->fe_id] = dvb_attach( 737 + adap->fe_adap[state->fe_id].fe = dvb_attach( 738 738 zl10353_attach, 739 739 &anysee_zl10353_tda18212_config2, 740 740 &adap->dev->i2c_adap); 741 741 } else { 742 742 /* PLL config */ 743 - adap->fe[state->fe_id] = dvb_attach( 743 + adap->fe_adap[state->fe_id].fe = dvb_attach( 744 744 zl10353_attach, 745 745 &anysee_zl10353_config, 746 746 &adap->dev->i2c_adap); ··· 772 772 goto error; 773 773 774 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 776 &anysee_tda10023_tda18212_config, 777 777 &adap->dev->i2c_adap, 0x48); 778 778 } else { ··· 789 789 goto error; 790 790 791 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 793 &anysee_zl10353_tda18212_config, 794 794 &adap->dev->i2c_adap); 795 795 } ··· 814 814 goto error; 815 815 816 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 818 &adap->dev->i2c_adap, 0); 819 819 820 820 break; 821 821 } 822 822 823 - if (!adap->fe[0]) { 823 + if (!adap->fe_adap[0].fe) { 824 824 /* we have no frontend :-( */ 825 825 ret = -ENODEV; 826 826 err("Unsupported Anysee version. " \ ··· 842 842 /* E30 */ 843 843 844 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 846 NULL, DVB_PLL_THOMSON_DTT7579); 847 847 848 848 break; ··· 850 850 /* E30 Plus */ 851 851 852 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 854 &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579); 855 855 856 856 break; ··· 858 858 /* E30 C Plus */ 859 859 860 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 862 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A); 863 863 864 864 break; ··· 866 866 /* E30 S2 Plus */ 867 867 868 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 870 &adap->dev->i2c_adap, &anysee_isl6423_config); 871 871 872 872 break; ··· 883 883 goto error; 884 884 885 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 887 &adap->dev->i2c_adap, &anysee_tda18212_config); 888 888 if (fe) 889 889 break; ··· 894 894 goto error; 895 895 896 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 898 (0xc0 >> 1), &adap->dev->i2c_adap, 899 899 DVB_PLL_SAMSUNG_DTOS403IH102A); 900 900 ··· 910 910 goto error; 911 911 912 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 914 &adap->dev->i2c_adap, &anysee_tda18212_config); 915 915 916 916 break; ··· 920 920 /* E7 PS2 */ 921 921 922 922 /* attach tuner */ 923 - fe = dvb_attach(stv6110_attach, adap->fe[0], 923 + fe = dvb_attach(stv6110_attach, adap->fe_adap[0].fe, 924 924 &anysee_stv6110_config, &adap->dev->i2c_adap); 925 925 926 926 if (fe) { 927 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 929 &adap->dev->i2c_adap, &anysee_isl6423_config); 930 930 } 931 931 ··· 1027 1027 .num_adapters = 1, 1028 1028 .adapter = { 1029 1029 { 1030 - .num_frontends = 2, 1031 - .frontend_ctrl = anysee_frontend_ctrl, 1030 + .num_frontends = 2, 1031 + .frontend_ctrl = anysee_frontend_ctrl, 1032 + .fe = {{ 1032 1033 .streaming_ctrl = anysee_streaming_ctrl, 1033 1034 .frontend_attach = anysee_frontend_attach, 1034 1035 .tuner_attach = anysee_tuner_attach, ··· 1043 1042 } 1044 1043 } 1045 1044 }, 1045 + }, { 1046 + .streaming_ctrl = anysee_streaming_ctrl, 1047 + .frontend_attach = anysee_frontend_attach, 1048 + .tuner_attach = anysee_tuner_attach, 1049 + .stream = { 1050 + .type = USB_BULK, 1051 + .count = 8, 1052 + .endpoint = 0x82, 1053 + .u = { 1054 + .bulk = { 1055 + .buffersize = (16*512), 1056 + } 1057 + } 1058 + }, 1059 + }}, 1046 1060 } 1047 1061 }, 1048 1062
+6 -3
drivers/media/dvb/dvb-usb/au6610.c
··· 140 140 141 141 static 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 144 &adap->dev->i2c_adap); 145 - if (adap->fe[0] == NULL) 145 + if (adap->fe_adap[0].fe == NULL) 146 146 return -ENODEV; 147 147 148 148 return 0; ··· 155 155 static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap) 156 156 { 157 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 159 &au6610_qt1010_config) == NULL ? -ENODEV : 0; 160 160 } 161 161 ··· 204 204 .num_adapters = 1, 205 205 .adapter = { 206 206 { 207 + .num_frontends = 1, 208 + .fe = {{ 207 209 .frontend_attach = au6610_zl10353_frontend_attach, 208 210 .tuner_attach = au6610_qt1010_tuner_attach, 209 211 ··· 221 219 } 222 220 } 223 221 }, 222 + }}, 224 223 } 225 224 }, 226 225
+8 -5
drivers/media/dvb/dvb-usb/az6027.c
··· 910 910 az6027_frontend_reset(adap); 911 911 912 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 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 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 920 az6027_ci_init(adap); 921 921 } else { 922 - adap->fe[0] = NULL; 922 + adap->fe_adap[0].fe = NULL; 923 923 } 924 924 } else 925 925 warn("no front-end attached\n"); ··· 1106 1106 .num_adapters = 1, 1107 1107 .adapter = { 1108 1108 { 1109 + .num_frontends = 1, 1110 + .fe = {{ 1109 1111 .streaming_ctrl = az6027_streaming_ctrl, 1110 1112 .frontend_attach = az6027_frontend_attach, 1111 1113 ··· 1122 1120 } 1123 1121 } 1124 1122 }, 1123 + }}, 1125 1124 } 1126 1125 }, 1127 1126 /*
+6 -3
drivers/media/dvb/dvb-usb/ce6230.c
··· 186 186 static int ce6230_zl10353_frontend_attach(struct dvb_usb_adapter *adap) 187 187 { 188 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 190 &adap->dev->i2c_adap); 191 - if (adap->fe[0] == NULL) 191 + if (adap->fe_adap[0].fe == NULL) 192 192 return -ENODEV; 193 193 return 0; 194 194 } ··· 214 214 { 215 215 int ret; 216 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 218 &ce6230_mxl5003s_config) == NULL ? -ENODEV : 0; 219 219 return ret; 220 220 } ··· 273 273 .num_adapters = 1, 274 274 .adapter = { 275 275 { 276 + .num_frontends = 1, 277 + .fe = {{ 276 278 .frontend_attach = ce6230_zl10353_frontend_attach, 277 279 .tuner_attach = ce6230_mxl5003s_tuner_attach, 278 280 .stream = { ··· 287 285 } 288 286 } 289 287 }, 288 + }}, 290 289 } 291 290 }, 292 291
+4 -1
drivers/media/dvb/dvb-usb/cinergyT2-core.c
··· 69 69 char state[3]; 70 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 74 ret = dvb_usb_generic_rw(adap->dev, query, sizeof(query), state, 75 75 sizeof(state), 0); ··· 198 198 .num_adapters = 1, 199 199 .adapter = { 200 200 { 201 + .num_frontends = 1, 202 + .fe = {{ 201 203 .streaming_ctrl = cinergyt2_streaming_ctrl, 202 204 .frontend_attach = cinergyt2_frontend_attach, 203 205 ··· 214 212 } 215 213 } 216 214 }, 215 + }}, 217 216 } 218 217 }, 219 218
+70 -36
drivers/media/dvb/dvb-usb/cxusb.c
··· 347 347 348 348 static 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 351 const int timeout = 100; 352 352 const int junk_len = p->u.bulk.buffersize; 353 353 u8 *junk; ··· 725 725 /* Callbacks for DVB USB */ 726 726 static 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 729 &adap->dev->i2c_adap, 0x61, 730 730 TUNER_PHILIPS_FMD1216ME_MK3); 731 731 return 0; ··· 733 733 734 734 static 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 737 NULL, DVB_PLL_THOMSON_DTT7579); 738 738 return 0; 739 739 } 740 740 741 741 static 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 744 return 0; 745 745 } 746 746 747 747 static 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 750 NULL, DVB_PLL_THOMSON_DTT7579); 751 751 return 0; 752 752 } 753 753 754 754 static 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 757 &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF); 758 758 return 0; 759 759 } ··· 795 795 }; 796 796 797 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 801 if (fe == NULL || fe->ops.tuner_ops.set_config == NULL) 802 802 return -EIO; 803 803 ··· 808 808 809 809 static 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 812 &adap->dev->i2c_adap, &aver_a868r_tuner); 813 813 return 0; 814 814 } ··· 816 816 static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap) 817 817 { 818 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 820 &adap->dev->i2c_adap, &d680_dmb_tuner); 821 821 return (fe == NULL) ? -EIO : 0; 822 822 } ··· 824 824 static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap) 825 825 { 826 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 828 &adap->dev->i2c_adap, &mygica_d689_max2165_cfg); 829 829 return (fe == NULL) ? -EIO : 0; 830 830 } ··· 837 837 838 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 841 &adap->dev->i2c_adap)) != NULL) 842 842 return 0; 843 843 ··· 851 851 852 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 855 &adap->dev->i2c_adap)) != NULL) 856 856 return 0; 857 857 ··· 860 860 861 861 static 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 864 &adap->dev->i2c_adap); 865 - if (adap->fe[0] != NULL) 865 + if (adap->fe_adap[0].fe != NULL) 866 866 return 0; 867 867 868 868 return -EIO; ··· 876 876 877 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 880 &adap->dev->i2c_adap)) != NULL) 881 881 return 0; 882 882 ··· 890 890 891 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 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 896 &cxusb_zl10353_dee1601_config, 897 897 &adap->dev->i2c_adap)) != NULL)) 898 898 return 0; ··· 917 917 cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1); 918 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 921 &cxusb_zl10353_xc3028_config_no_i2c_gate, 922 922 &adap->dev->i2c_adap)) == NULL) 923 923 return -EIO; ··· 1031 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 1035 &cxusb_dualdig4_rev2_config); 1036 - if (adap->fe[0] == NULL) 1036 + if (adap->fe_adap[0].fe == NULL) 1037 1037 return -EIO; 1038 1038 1039 1039 return 0; ··· 1084 1084 { 1085 1085 struct dib0700_adapter_state *st = adap->priv; 1086 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 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 1091 &dib7070p_dib0070_config) == NULL) 1092 1092 return -ENODEV; 1093 1093 1094 - st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 1095 - adap->fe[0]->ops.tuner_ops.set_params = dib7070_set_param_override; 1094 + st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 1095 + adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override; 1096 1096 return 0; 1097 1097 } 1098 1098 ··· 1108 1108 cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1); 1109 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 1112 &cxusb_zl10353_xc3028_config, 1113 1113 &adap->dev->i2c_adap)) != NULL) 1114 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 1117 &cxusb_mt352_xc3028_config, 1118 1118 &adap->dev->i2c_adap)) != NULL) 1119 1119 return 0; ··· 1150 1150 usb_clear_halt(d->udev, 1151 1151 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); 1152 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 1155 /* Drain USB pipes to avoid hang after reboot */ 1156 1156 for (n = 0; n < 5; n++) { ··· 1172 1172 msleep(100); 1173 1173 1174 1174 /* Attach frontend */ 1175 - adap->fe[0] = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap); 1176 - if (adap->fe[0] == NULL) 1175 + adap->fe_adap[0].fe = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap); 1176 + if (adap->fe_adap[0].fe == NULL) 1177 1177 return -EIO; 1178 1178 1179 1179 return 0; ··· 1207 1207 usb_clear_halt(d->udev, 1208 1208 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); 1209 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 1213 /* Reset the tuner */ ··· 1223 1223 msleep(100); 1224 1224 1225 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 1227 &d->i2c_adap); 1228 - if (adap->fe[0] == NULL) 1228 + if (adap->fe_adap[0].fe == NULL) 1229 1229 return -EIO; 1230 1230 1231 1231 return 0; ··· 1383 1383 .num_adapters = 1, 1384 1384 .adapter = { 1385 1385 { 1386 + .num_frontends = 1, 1387 + .fe = {{ 1386 1388 .streaming_ctrl = cxusb_streaming_ctrl, 1387 1389 .frontend_attach = cxusb_cx22702_frontend_attach, 1388 1390 .tuner_attach = cxusb_fmd1216me_tuner_attach, ··· 1399 1397 } 1400 1398 } 1401 1399 }, 1402 - 1400 + }}, 1403 1401 }, 1404 1402 }, 1405 1403 .power_ctrl = cxusb_power_ctrl, ··· 1431 1429 .num_adapters = 1, 1432 1430 .adapter = { 1433 1431 { 1432 + .num_frontends = 1, 1433 + .fe = {{ 1434 1434 .streaming_ctrl = cxusb_streaming_ctrl, 1435 1435 .frontend_attach = cxusb_lgdt3303_frontend_attach, 1436 1436 .tuner_attach = cxusb_lgh064f_tuner_attach, ··· 1448 1444 } 1449 1445 } 1450 1446 }, 1447 + }}, 1451 1448 }, 1452 1449 }, 1453 1450 ··· 1488 1483 .num_adapters = 1, 1489 1484 .adapter = { 1490 1485 { 1486 + .num_frontends = 1, 1487 + .fe = {{ 1491 1488 .streaming_ctrl = cxusb_streaming_ctrl, 1492 1489 .frontend_attach = cxusb_dee1601_frontend_attach, 1493 1490 .tuner_attach = cxusb_dee1601_tuner_attach, ··· 1504 1497 } 1505 1498 } 1506 1499 }, 1500 + }}, 1507 1501 }, 1508 1502 }, 1509 1503 ··· 1552 1544 .num_adapters = 2, 1553 1545 .adapter = { 1554 1546 { 1547 + .num_frontends = 1, 1548 + .fe = {{ 1555 1549 .streaming_ctrl = cxusb_streaming_ctrl, 1556 1550 .frontend_attach = cxusb_mt352_frontend_attach, 1557 1551 .tuner_attach = cxusb_lgz201_tuner_attach, ··· 1569 1559 } 1570 1560 } 1571 1561 }, 1562 + }}, 1572 1563 }, 1573 1564 }, 1574 1565 .power_ctrl = cxusb_bluebird_power_ctrl, ··· 1607 1596 .num_adapters = 1, 1608 1597 .adapter = { 1609 1598 { 1599 + .num_frontends = 1, 1600 + .fe = {{ 1610 1601 .streaming_ctrl = cxusb_streaming_ctrl, 1611 1602 .frontend_attach = cxusb_mt352_frontend_attach, 1612 1603 .tuner_attach = cxusb_dtt7579_tuner_attach, ··· 1624 1611 } 1625 1612 } 1626 1613 }, 1614 + }}, 1627 1615 }, 1628 1616 }, 1629 1617 .power_ctrl = cxusb_bluebird_power_ctrl, ··· 1659 1645 .num_adapters = 1, 1660 1646 .adapter = { 1661 1647 { 1648 + .num_frontends = 1, 1649 + .fe = {{ 1662 1650 .streaming_ctrl = cxusb_streaming_ctrl, 1663 1651 .frontend_attach = cxusb_dualdig4_frontend_attach, 1664 1652 .tuner_attach = cxusb_dvico_xc3028_tuner_attach, ··· 1675 1659 } 1676 1660 } 1677 1661 }, 1662 + }}, 1678 1663 }, 1679 1664 }, 1680 1665 ··· 1712 1695 .num_adapters = 1, 1713 1696 .adapter = { 1714 1697 { 1698 + .num_frontends = 1, 1699 + .fe = {{ 1715 1700 .streaming_ctrl = cxusb_streaming_ctrl, 1716 1701 .frontend_attach = cxusb_nano2_frontend_attach, 1717 1702 .tuner_attach = cxusb_dvico_xc3028_tuner_attach, ··· 1728 1709 } 1729 1710 } 1730 1711 }, 1712 + }}, 1731 1713 }, 1732 1714 }, 1733 1715 ··· 1767 1747 .num_adapters = 1, 1768 1748 .adapter = { 1769 1749 { 1750 + .num_frontends = 1, 1751 + .fe = {{ 1770 1752 .streaming_ctrl = cxusb_streaming_ctrl, 1771 1753 .frontend_attach = cxusb_nano2_frontend_attach, 1772 1754 .tuner_attach = cxusb_dvico_xc3028_tuner_attach, ··· 1783 1761 } 1784 1762 } 1785 1763 }, 1764 + }}, 1786 1765 }, 1787 1766 }, 1788 1767 ··· 1819 1796 .num_adapters = 1, 1820 1797 .adapter = { 1821 1798 { 1799 + .num_frontends = 1, 1800 + .fe = {{ 1822 1801 .streaming_ctrl = cxusb_aver_streaming_ctrl, 1823 1802 .frontend_attach = cxusb_aver_lgdt3303_frontend_attach, 1824 1803 .tuner_attach = cxusb_mxl5003s_tuner_attach, ··· 1835 1810 } 1836 1811 } 1837 1812 }, 1838 - 1813 + }}, 1839 1814 }, 1840 1815 }, 1841 1816 .power_ctrl = cxusb_aver_power_ctrl, ··· 1864 1839 .num_adapters = 1, 1865 1840 .adapter = { 1866 1841 { 1842 + .size_of_priv = sizeof(struct dib0700_adapter_state), 1843 + .num_frontends = 1, 1844 + .fe = {{ 1867 1845 .streaming_ctrl = cxusb_streaming_ctrl, 1868 1846 .frontend_attach = cxusb_dualdig4_rev2_frontend_attach, 1869 1847 .tuner_attach = cxusb_dualdig4_rev2_tuner_attach, 1870 - .size_of_priv = sizeof(struct dib0700_adapter_state), 1871 1848 /* parameter for the MPEG2-data transfer */ 1872 1849 .stream = { 1873 1850 .type = USB_BULK, ··· 1881 1854 } 1882 1855 } 1883 1856 }, 1857 + }}, 1884 1858 }, 1885 1859 }, 1886 1860 ··· 1917 1889 .num_adapters = 1, 1918 1890 .adapter = { 1919 1891 { 1892 + .num_frontends = 1, 1893 + .fe = {{ 1920 1894 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl, 1921 1895 .frontend_attach = cxusb_d680_dmb_frontend_attach, 1922 1896 .tuner_attach = cxusb_d680_dmb_tuner_attach, ··· 1934 1904 } 1935 1905 } 1936 1906 }, 1907 + }}, 1937 1908 }, 1938 1909 }, 1939 1910 ··· 1971 1940 .num_adapters = 1, 1972 1941 .adapter = { 1973 1942 { 1943 + .num_frontends = 1, 1944 + .fe = {{ 1974 1945 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl, 1975 1946 .frontend_attach = cxusb_mygica_d689_frontend_attach, 1976 1947 .tuner_attach = cxusb_mygica_d689_tuner_attach, ··· 1988 1955 } 1989 1956 } 1990 1957 }, 1958 + }}, 1991 1959 }, 1992 1960 }, 1993 1961
+9 -9
drivers/media/dvb/dvb-usb/dib0700_core.c
··· 528 528 for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters; 529 529 adap_num++) { 530 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 532 } else { 533 533 /* for fw version older than 1.20.1, 534 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; 536 - if (dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize < 512) 537 - dib0700_devices[i].adapter[adap_num].stream.u.bulk.buffersize = 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].fe[0].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 579 deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id); 580 580 581 581 st->channel_state &= ~0x3; 582 - if ((adap->stream.props.endpoint != 2) 583 - && (adap->stream.props.endpoint != 3)) { 584 - deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->stream.props.endpoint); 582 + if ((adap->fe_adap[0].stream.props.endpoint != 2) 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->fe_adap[0].stream.props.endpoint); 585 585 if (onoff) 586 586 st->channel_state |= 1 << (adap->id); 587 587 else 588 588 st->channel_state |= 1 << ~(adap->id); 589 589 } else { 590 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 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 596 st->buf[2] |= st->channel_state;
+212 -152
drivers/media/dvb/dvb-usb/dib0700_devices.c
··· 101 101 } 102 102 } 103 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 105 (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0; 106 106 } 107 107 ··· 118 118 static int bristol_tuner_attach(struct dvb_usb_adapter *adap) 119 119 { 120 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 122 s8 a; 123 123 int if1=1220; 124 124 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) && 125 125 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) { 126 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 129 if1) == NULL ? -ENODEV : 0; 130 130 } 131 131 ··· 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 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 288 288 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 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 315 315 static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap) 316 316 { 317 317 struct i2c_adapter *tun_i2c; 318 - tun_i2c = dib7000p_get_i2c_master(adap->fe[0], DIBX000_I2C_INTERFACE_TUNER, 1); 319 - return dvb_attach(mt2266_attach, adap->fe[0], tun_i2c, 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_adap[0].fe, tun_i2c, 320 320 &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0; 321 321 } 322 322 ··· 396 396 switch (command) { 397 397 case XC2028_TUNER_RESET: 398 398 /* Send the tuner in then out of reset */ 399 - dib7000p_set_gpio(adap->fe[0], 8, 0, 0); msleep(10); 400 - dib7000p_set_gpio(adap->fe[0], 8, 0, 1); 399 + dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 0); msleep(10); 400 + dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 401 401 break; 402 402 case XC2028_RESET_CLK: 403 403 break; ··· 447 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 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 456 456 static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap) 457 457 { 458 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 461 DIBX000_I2C_INTERFACE_TUNER, 1); 462 462 463 463 stk7700ph_xc3028_config.i2c_adap = tun_i2c; 464 464 465 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 469 == NULL ? -ENODEV : 0; 470 470 } 471 471 ··· 685 685 st->mt2060_if1[0] = 1220; 686 686 687 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 689 st->is_dib7000pc = 1; 690 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 696 696 static struct mt2060_config stk7700p_mt2060_config = { ··· 709 709 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a; 710 710 } 711 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 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 717 if1) == NULL ? -ENODEV : 0; 718 718 } 719 719 ··· 843 843 static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap) 844 844 { 845 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 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 850 &dib7770p_dib0070_config) == NULL) 851 851 return -ENODEV; 852 852 853 - st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 854 - adap->fe[0]->ops.tuner_ops.set_params = dib7770_set_param_override; 853 + st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 854 + adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7770_set_param_override; 855 855 return 0; 856 856 } 857 857 858 858 static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap) 859 859 { 860 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 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 865 return -ENODEV; 866 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 868 return -ENODEV; 869 869 } 870 870 871 - st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 872 - adap->fe[0]->ops.tuner_ops.set_params = dib7070_set_param_override; 871 + st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 872 + adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override; 873 873 return 0; 874 874 } 875 875 ··· 878 878 { 879 879 struct dib0700_state *st = adapter->dev->priv; 880 880 if (st->is_dib7000pc) 881 - return dib7000p_pid_filter(adapter->fe[0], index, pid, onoff); 882 - return dib7000m_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_adap[0].fe, index, pid, onoff); 883 883 } 884 884 885 885 static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) 886 886 { 887 887 struct dib0700_state *st = adapter->dev->priv; 888 888 if (st->is_dib7000pc) 889 - return dib7000p_pid_filter_ctrl(adapter->fe[0], onoff); 890 - return dib7000m_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_adap[0].fe, onoff); 891 891 } 892 892 893 893 static 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 898 898 static 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 903 903 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = { ··· 955 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 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 963 /* STK7770P */ ··· 1007 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 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 1015 /* DIB807x generic */ ··· 1225 1225 static int dib807x_tuner_attach(struct dvb_usb_adapter *adap) 1226 1226 { 1227 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 1229 DIBX000_I2C_INTERFACE_TUNER, 1); 1230 1230 1231 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 1233 &dib807x_dib0070_config[0]) == NULL) 1234 1234 return -ENODEV; 1235 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 1237 &dib807x_dib0070_config[1]) == NULL) 1238 1238 return -ENODEV; 1239 1239 } 1240 1240 1241 - st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 1242 - adap->fe[0]->ops.tuner_ops.set_params = dib807x_set_param_override; 1241 + st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 1242 + adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib807x_set_param_override; 1243 1243 return 0; 1244 1244 } 1245 1245 1246 1246 static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index, 1247 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 1252 1252 static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter, 1253 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 1258 /* STK807x */ ··· 1276 1276 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 1277 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 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 1285 /* STK807xPVR */ ··· 1305 1305 /* initialize IC 0 */ 1306 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 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 1314 1314 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap) ··· 1316 1316 /* initialize IC 1 */ 1317 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 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 1325 /* STK8096GP */ ··· 1546 1546 static int dib809x_tuner_attach(struct dvb_usb_adapter *adap) 1547 1547 { 1548 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 1552 return -ENODEV; 1553 1553 1554 - st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 1555 - adap->fe[0]->ops.tuner_ops.set_params = dib8096_set_param_override; 1554 + st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 1555 + adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override; 1556 1556 return 0; 1557 1557 } 1558 1558 ··· 1575 1575 1576 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 1583 1583 static int nim8096md_tuner_attach(struct dvb_usb_adapter *adap) 1584 1584 { 1585 1585 struct dib0700_adapter_state *st = adap->priv; 1586 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 1589 if (fe_slave) { 1590 1590 tun_i2c = dib8000_get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1); 1591 1591 if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL) 1592 1592 return -ENODEV; 1593 - fe_slave->dvb = adap->fe[0]->dvb; 1593 + fe_slave->dvb = adap->fe_adap[0].fe->dvb; 1594 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); 1597 - if (dvb_attach(dib0090_register, adap->fe[0], tun_i2c, &dib809x_dib0090_config) == NULL) 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_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL) 1598 1598 return -ENODEV; 1599 1599 1600 - st->set_param_save = adap->fe[0]->ops.tuner_ops.set_params; 1601 - adap->fe[0]->ops.tuner_ops.set_params = dib8096_set_param_override; 1600 + st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 1601 + adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override; 1602 1602 1603 1603 return 0; 1604 1604 } ··· 1626 1626 1627 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]); 1630 - if (adap->fe[0] == NULL) 1629 + adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]); 1630 + if (adap->fe_adap[0].fe == NULL) 1631 1631 return -ENODEV; 1632 1632 1633 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 1636 return fe_slave == NULL ? -ENODEV : 0; 1637 1637 } ··· 1639 1639 /* STK9090M */ 1640 1640 static 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 1645 1645 static 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 1650 1650 static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff) ··· 1856 1856 stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size; 1857 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 1864 1864 static int dib9090_tuner_attach(struct dvb_usb_adapter *adap) 1865 1865 { 1866 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 1868 u16 data_dib190[10] = { 1869 1869 1, 0x1374, 1870 1870 2, 0x01a2, ··· 1873 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 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 1879 if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0) 1880 1880 return -ENODEV; 1881 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 1883 return -ENODEV; 1884 1884 release_firmware(state->frontend_firmware); 1885 1885 return 0; ··· 1925 1925 nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data; 1926 1926 1927 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 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 1934 dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82); 1935 1935 1936 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 1939 return fe_slave == NULL ? -ENODEV : 0; 1940 1940 } ··· 1951 1951 0, 0x00ef, 1952 1952 8, 0x0406, 1953 1953 }; 1954 - i2c = dib9000_get_tuner_interface(adap->fe[0]); 1955 - if (dvb_attach(dib0090_fw_register, adap->fe[0], i2c, &nim9090md_dib0090_config[0]) == NULL) 1954 + i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe); 1955 + if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL) 1956 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 1958 if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0) 1959 1959 return -ENODEV; 1960 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 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 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 1967 dib9000_set_i2c_adapter(fe_slave, i2c); 1968 1968 1969 1969 i2c = dib9000_get_tuner_interface(fe_slave); 1970 1970 if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL) 1971 1971 return -ENODEV; 1972 - fe_slave->dvb = adap->fe[0]->dvb; 1973 - dib9000_fw_set_component_bus_speed(adap->fe[0], 2000); 1972 + fe_slave->dvb = adap->fe_adap[0].fe->dvb; 1973 + dib9000_fw_set_component_bus_speed(adap->fe_adap[0].fe, 2000); 1974 1974 if (dib9000_firmware_post_pll_init(fe_slave) < 0) 1975 1975 return -ENODEV; 1976 1976 } ··· 2393 2393 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__); 2394 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 2401 2401 static int nim7090_tuner_attach(struct dvb_usb_adapter *adap) 2402 2402 { 2403 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 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; 2412 - adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup; 2411 + st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 2412 + adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 2413 2413 return 0; 2414 2414 } 2415 2415 ··· 2439 2439 } 2440 2440 2441 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]); 2443 - if (adap->fe[0] == NULL) 2442 + adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]); 2443 + if (adap->fe_adap[0].fe == NULL) 2444 2444 return -ENODEV; 2445 2445 2446 - dib7090_slave_reset(adap->fe[0]); 2446 + dib7090_slave_reset(adap->fe_adap[0].fe); 2447 2447 2448 2448 return 0; 2449 2449 } ··· 2452 2452 { 2453 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 2456 err("the master dib7090 has to be initialized first"); 2457 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 2461 if (dib7000p_i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) { 2462 2462 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__); 2463 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 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 2472 2472 static int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap) 2473 2473 { 2474 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 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; 2483 - adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup; 2482 + st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 2483 + adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 2484 2484 return 0; 2485 2485 } 2486 2486 2487 2487 static int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap) 2488 2488 { 2489 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 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; 2498 - adap->fe[0]->ops.tuner_ops.set_params = dib7090_agc_startup; 2497 + st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 2498 + adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 2499 2499 return 0; 2500 2500 } 2501 2501 ··· 2555 2555 return -ENODEV; 2556 2556 } 2557 2557 2558 - adap->fe[0] = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]); 2559 - return adap->fe[0] == NULL ? -ENODEV : 0; 2558 + adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]); 2559 + return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 2560 2560 } 2561 2561 2562 2562 static 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]); 2565 - return adap->fe[0] == NULL ? -ENODEV : 0; 2564 + adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]); 2565 + return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 2566 2566 } 2567 2567 2568 2568 /* S5H1411 */ ··· 2617 2617 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1); 2618 2618 2619 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 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 2625 2625 static int dib0700_xc5000_tuner_callback(void *priv, int component, ··· 2649 2649 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap) 2650 2650 { 2651 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 2655 &s5h1411_xc5000_tunerconfig) 2656 2656 == NULL ? -ENODEV : 0; 2657 2657 } ··· 2663 2663 2664 2664 if (command == XC4000_TUNER_RESET) { 2665 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 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 2669 } else { 2670 2670 err("xc4000: unknown tuner callback command: %d\n", command); 2671 2671 return -EINVAL; ··· 2771 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 2775 &pctv_340e_config); 2776 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 2781 2781 static struct xc4000_config dib7000p_xc4000_tunerconfig = { ··· 2791 2791 struct i2c_adapter *tun_i2c; 2792 2792 2793 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 2795 DIBX000_I2C_INTERFACE_TUNER, 1); 2796 2796 if (tun_i2c == NULL) { 2797 2797 printk(KERN_ERR "Could not reach tuner i2c bus\n"); ··· 2799 2799 } 2800 2800 2801 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 2805 &dib7000p_xc4000_tunerconfig) 2806 2806 == NULL ? -ENODEV : 0; 2807 2807 } ··· 2857 2857 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 2858 2858 msleep(30); 2859 2859 2860 - adap->fe[0] = dvb_attach(lgdt3305_attach, 2860 + adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach, 2861 2861 &hcw_lgdt3305_config, 2862 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 2867 2867 static 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 2870 &adap->dev->i2c_adap, 0x60, 2871 2871 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0; 2872 2872 } ··· 2989 2989 .num_adapters = 1, 2990 2990 .adapter = { 2991 2991 { 2992 + .num_frontends = 1, 2993 + .fe = {{ 2992 2994 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 2993 2995 .pid_filter_count = 32, 2994 2996 .pid_filter = stk7700p_pid_filter, ··· 2999 2997 .tuner_attach = stk7700p_tuner_attach, 3000 2998 3001 2999 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3000 + }}, 3002 3001 }, 3003 3002 }, 3004 3003 ··· 3053 3050 .num_adapters = 2, 3054 3051 .adapter = { 3055 3052 { 3053 + .num_frontends = 1, 3054 + .fe = {{ 3056 3055 .frontend_attach = bristol_frontend_attach, 3057 3056 .tuner_attach = bristol_tuner_attach, 3058 3057 3059 3058 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3059 + }}, 3060 3060 }, { 3061 + .num_frontends = 1, 3062 + .fe = {{ 3061 3063 .frontend_attach = bristol_frontend_attach, 3062 3064 .tuner_attach = bristol_tuner_attach, 3063 3065 3064 3066 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3067 + }}, 3065 3068 } 3066 3069 }, 3067 3070 ··· 3093 3084 .num_adapters = 2, 3094 3085 .adapter = { 3095 3086 { 3087 + .num_frontends = 1, 3088 + .fe = {{ 3096 3089 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3097 3090 .pid_filter_count = 32, 3098 3091 .pid_filter = stk70x0p_pid_filter, ··· 3103 3092 .tuner_attach = stk7700d_tuner_attach, 3104 3093 3105 3094 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3095 + }}, 3106 3096 }, { 3097 + .num_frontends = 1, 3098 + .fe = {{ 3107 3099 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3108 3100 .pid_filter_count = 32, 3109 3101 .pid_filter = stk70x0p_pid_filter, ··· 3115 3101 .tuner_attach = stk7700d_tuner_attach, 3116 3102 3117 3103 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3104 + }}, 3118 3105 } 3119 3106 }, 3120 3107 ··· 3158 3143 .num_adapters = 1, 3159 3144 .adapter = { 3160 3145 { 3146 + .num_frontends = 1, 3147 + .fe = {{ 3161 3148 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3162 3149 .pid_filter_count = 32, 3163 3150 .pid_filter = stk70x0p_pid_filter, ··· 3168 3151 .tuner_attach = stk7700d_tuner_attach, 3169 3152 3170 3153 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3154 + }}, 3171 3155 }, 3172 3156 }, 3173 3157 ··· 3203 3185 .num_adapters = 1, 3204 3186 .adapter = { 3205 3187 { 3188 + .num_frontends = 1, 3189 + .fe = {{ 3206 3190 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3207 3191 .pid_filter_count = 32, 3208 3192 .pid_filter = stk70x0p_pid_filter, ··· 3213 3193 .tuner_attach = dib7070p_tuner_attach, 3214 3194 3215 3195 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3216 - 3196 + }}, 3217 3197 .size_of_priv = sizeof(struct dib0700_adapter_state), 3218 3198 }, 3219 3199 }, ··· 3281 3261 .num_adapters = 1, 3282 3262 .adapter = { 3283 3263 { 3264 + .num_frontends = 1, 3265 + .fe = {{ 3284 3266 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3285 3267 .pid_filter_count = 32, 3286 3268 .pid_filter = stk70x0p_pid_filter, ··· 3291 3269 .tuner_attach = dib7070p_tuner_attach, 3292 3270 3293 3271 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3294 - 3272 + }}, 3295 3273 .size_of_priv = sizeof(struct dib0700_adapter_state), 3296 3274 }, 3297 3275 }, ··· 3327 3305 .num_adapters = 2, 3328 3306 .adapter = { 3329 3307 { 3308 + .num_frontends = 1, 3309 + .fe = {{ 3330 3310 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3331 3311 .pid_filter_count = 32, 3332 3312 .pid_filter = stk70x0p_pid_filter, ··· 3337 3313 .tuner_attach = dib7070p_tuner_attach, 3338 3314 3339 3315 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3340 - 3316 + }}, 3341 3317 .size_of_priv = sizeof(struct dib0700_adapter_state), 3342 3318 }, { 3319 + .num_frontends = 1, 3320 + .fe = {{ 3343 3321 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3344 3322 .pid_filter_count = 32, 3345 3323 .pid_filter = stk70x0p_pid_filter, ··· 3350 3324 .tuner_attach = dib7070p_tuner_attach, 3351 3325 3352 3326 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3353 - 3327 + }}, 3354 3328 .size_of_priv = sizeof(struct dib0700_adapter_state), 3355 3329 } 3356 3330 }, ··· 3399 3373 .num_adapters = 2, 3400 3374 .adapter = { 3401 3375 { 3376 + .num_frontends = 1, 3377 + .fe = {{ 3402 3378 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3403 3379 .pid_filter_count = 32, 3404 3380 .pid_filter = stk70x0p_pid_filter, ··· 3409 3381 .tuner_attach = dib7070p_tuner_attach, 3410 3382 3411 3383 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3412 - 3384 + }}, 3413 3385 .size_of_priv = sizeof(struct dib0700_adapter_state), 3414 3386 }, { 3387 + .num_frontends = 1, 3388 + .fe = {{ 3415 3389 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3416 3390 .pid_filter_count = 32, 3417 3391 .pid_filter = stk70x0p_pid_filter, ··· 3422 3392 .tuner_attach = dib7070p_tuner_attach, 3423 3393 3424 3394 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3425 - 3395 + }}, 3426 3396 .size_of_priv = sizeof(struct dib0700_adapter_state), 3427 3397 } 3428 3398 }, ··· 3450 3420 .num_adapters = 1, 3451 3421 .adapter = { 3452 3422 { 3423 + .num_frontends = 1, 3424 + .fe = {{ 3453 3425 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3454 3426 .pid_filter_count = 32, 3455 3427 .pid_filter = stk70x0p_pid_filter, ··· 3460 3428 .tuner_attach = stk7700ph_tuner_attach, 3461 3429 3462 3430 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3463 - 3431 + }}, 3464 3432 .size_of_priv = sizeof(struct 3465 3433 dib0700_adapter_state), 3466 3434 }, ··· 3520 3488 .num_adapters = 1, 3521 3489 .adapter = { 3522 3490 { 3491 + .num_frontends = 1, 3492 + .fe = {{ 3523 3493 .frontend_attach = s5h1411_frontend_attach, 3524 3494 .tuner_attach = xc5000_tuner_attach, 3525 3495 3526 3496 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3527 - 3497 + }}, 3528 3498 .size_of_priv = sizeof(struct 3529 3499 dib0700_adapter_state), 3530 3500 }, ··· 3558 3524 .num_adapters = 1, 3559 3525 .adapter = { 3560 3526 { 3527 + .num_frontends = 1, 3528 + .fe = {{ 3561 3529 .frontend_attach = lgdt3305_frontend_attach, 3562 3530 .tuner_attach = mxl5007t_tuner_attach, 3563 3531 3564 3532 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3565 - 3533 + }}, 3566 3534 .size_of_priv = sizeof(struct 3567 3535 dib0700_adapter_state), 3568 3536 }, ··· 3586 3550 .num_adapters = 1, 3587 3551 .adapter = { 3588 3552 { 3553 + .num_frontends = 1, 3554 + .fe = {{ 3589 3555 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3590 3556 .pid_filter_count = 32, 3591 3557 .pid_filter = stk70x0p_pid_filter, ··· 3596 3558 .tuner_attach = dib7770p_tuner_attach, 3597 3559 3598 3560 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3599 - 3561 + }}, 3600 3562 .size_of_priv = 3601 3563 sizeof(struct dib0700_adapter_state), 3602 3564 }, ··· 3638 3600 .num_adapters = 1, 3639 3601 .adapter = { 3640 3602 { 3603 + .num_frontends = 1, 3604 + .fe = {{ 3641 3605 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3642 3606 .pid_filter_count = 32, 3643 3607 .pid_filter = stk80xx_pid_filter, ··· 3648 3608 .tuner_attach = dib807x_tuner_attach, 3649 3609 3650 3610 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3651 - 3611 + }}, 3652 3612 .size_of_priv = 3653 3613 sizeof(struct dib0700_adapter_state), 3654 3614 }, ··· 3684 3644 .num_adapters = 2, 3685 3645 .adapter = { 3686 3646 { 3647 + .num_frontends = 1, 3648 + .fe = {{ 3687 3649 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3688 3650 .pid_filter_count = 32, 3689 3651 .pid_filter = stk80xx_pid_filter, ··· 3694 3652 .tuner_attach = dib807x_tuner_attach, 3695 3653 3696 3654 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3697 - 3655 + }}, 3698 3656 .size_of_priv = 3699 3657 sizeof(struct dib0700_adapter_state), 3700 3658 }, 3701 3659 { 3660 + .num_frontends = 1, 3661 + .fe = {{ 3702 3662 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3703 3663 .pid_filter_count = 32, 3704 3664 .pid_filter = stk80xx_pid_filter, ··· 3709 3665 .tuner_attach = dib807x_tuner_attach, 3710 3666 3711 3667 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3712 - 3668 + }}, 3713 3669 .size_of_priv = 3714 3670 sizeof(struct dib0700_adapter_state), 3715 3671 }, ··· 3737 3693 .num_adapters = 1, 3738 3694 .adapter = { 3739 3695 { 3696 + .num_frontends = 1, 3697 + .fe = {{ 3740 3698 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3741 3699 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3742 3700 .pid_filter_count = 32, ··· 3748 3702 .tuner_attach = dib809x_tuner_attach, 3749 3703 3750 3704 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3751 - 3705 + }}, 3752 3706 .size_of_priv = 3753 3707 sizeof(struct dib0700_adapter_state), 3754 3708 }, ··· 3776 3730 .num_adapters = 1, 3777 3731 .adapter = { 3778 3732 { 3733 + .num_frontends = 1, 3734 + .fe = {{ 3779 3735 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3780 3736 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3781 3737 .pid_filter_count = 32, ··· 3787 3739 .tuner_attach = dib9090_tuner_attach, 3788 3740 3789 3741 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3790 - 3742 + }}, 3791 3743 .size_of_priv = 3792 3744 sizeof(struct dib0700_adapter_state), 3793 3745 }, ··· 3815 3767 .num_adapters = 1, 3816 3768 .adapter = { 3817 3769 { 3770 + .num_frontends = 1, 3771 + .fe = {{ 3818 3772 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3819 3773 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3820 3774 .pid_filter_count = 32, ··· 3826 3776 .tuner_attach = nim8096md_tuner_attach, 3827 3777 3828 3778 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3829 - 3779 + }}, 3830 3780 .size_of_priv = 3831 3781 sizeof(struct dib0700_adapter_state), 3832 3782 }, ··· 3854 3804 .num_adapters = 1, 3855 3805 .adapter = { 3856 3806 { 3807 + .num_frontends = 1, 3808 + .fe = {{ 3857 3809 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3858 3810 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3859 3811 .pid_filter_count = 32, ··· 3865 3813 .tuner_attach = nim9090md_tuner_attach, 3866 3814 3867 3815 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3868 - 3816 + }}, 3869 3817 .size_of_priv = 3870 3818 sizeof(struct dib0700_adapter_state), 3871 3819 }, ··· 3893 3841 .num_adapters = 1, 3894 3842 .adapter = { 3895 3843 { 3844 + .num_frontends = 1, 3845 + .fe = {{ 3896 3846 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3897 3847 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3898 3848 .pid_filter_count = 32, ··· 3904 3850 .tuner_attach = nim7090_tuner_attach, 3905 3851 3906 3852 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3907 - 3853 + }}, 3908 3854 .size_of_priv = 3909 3855 sizeof(struct dib0700_adapter_state), 3910 3856 }, ··· 3932 3878 .num_adapters = 2, 3933 3879 .adapter = { 3934 3880 { 3881 + .num_frontends = 1, 3882 + .fe = {{ 3935 3883 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3936 3884 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3937 3885 .pid_filter_count = 32, ··· 3943 3887 .tuner_attach = tfe7090pvr_tuner0_attach, 3944 3888 3945 3889 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 3946 - 3890 + }}, 3947 3891 .size_of_priv = 3948 3892 sizeof(struct dib0700_adapter_state), 3949 3893 }, 3950 3894 { 3895 + .num_frontends = 1, 3896 + .fe = {{ 3951 3897 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 3952 3898 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 3953 3899 .pid_filter_count = 32, ··· 3959 3901 .tuner_attach = tfe7090pvr_tuner1_attach, 3960 3902 3961 3903 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3962 - 3904 + }}, 3963 3905 .size_of_priv = 3964 3906 sizeof(struct dib0700_adapter_state), 3965 3907 }, ··· 3987 3929 .num_adapters = 1, 3988 3930 .adapter = { 3989 3931 { 3932 + .num_frontends = 1, 3933 + .fe = {{ 3990 3934 .frontend_attach = pctv340e_frontend_attach, 3991 3935 .tuner_attach = xc4000_tuner_attach, 3992 3936 3993 3937 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 3994 - 3938 + }}, 3995 3939 .size_of_priv = sizeof(struct 3996 3940 dib0700_adapter_state), 3997 3941 },
+9 -9
drivers/media/dvb/dvb-usb/dibusb-common.c
··· 23 23 if (adap->priv != NULL) { 24 24 struct dibusb_state *st = adap->priv; 25 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 27 err("error while controlling the fifo of the demod."); 28 28 return -ENODEV; 29 29 } ··· 37 37 if (adap->priv != NULL) { 38 38 struct dibusb_state *st = adap->priv; 39 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 42 return 0; 43 43 } ··· 48 48 if (adap->priv != NULL) { 49 49 struct dibusb_state *st = adap->priv; 50 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 52 err("could not handle pid_parser"); 53 53 } 54 54 return 0; ··· 254 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 || 258 - (adap->fe[0] = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_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_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL) { 259 259 if (adap->priv != NULL) { 260 260 struct dibusb_state *st = adap->priv; 261 261 st->ops.pid_parse = dib3000mc_pid_parse; ··· 309 309 } 310 310 } 311 311 312 - tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe[0], 1); 313 - if (dvb_attach(mt2060_attach, adap->fe[0], tun_i2c, &stk3000p_mt2060_config, if1) == NULL) { 312 + tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe_adap[0].fe, 1); 313 + if (dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, &stk3000p_mt2060_config, if1) == NULL) { 314 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 316 return -ENOMEM; 317 317 } else { 318 318 st->mt2060_present = 1; 319 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 322 return 0; 323 323 }
+20 -8
drivers/media/dvb/dvb-usb/dibusb-mb.c
··· 31 31 32 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 35 &adap->dev->i2c_adap, &st->ops)) == NULL) 36 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 40 return 0; 41 41 } ··· 46 46 47 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 50 DVB_PLL_TUA6010XS); 51 51 return 0; 52 52 } ··· 57 57 58 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 61 DVB_PLL_TDA665X); 62 62 return 0; 63 63 } ··· 78 78 /* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */ 79 79 msg[0].addr = msg[1].addr = st->tuner_addr = 0x60; 80 80 81 - if (adap->fe[0]->ops.i2c_gate_ctrl) 82 - adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0],1); 81 + if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl) 82 + adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe,1); 83 83 84 84 if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) { 85 85 err("tuner i2c write failed."); 86 86 ret = -EREMOTEIO; 87 87 } 88 88 89 - if (adap->fe[0]->ops.i2c_gate_ctrl) 90 - adap->fe[0]->ops.i2c_gate_ctrl(adap->fe[0],0); 89 + if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl) 90 + adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe,0); 91 91 92 92 if (b2[0] == 0xfe) { 93 93 info("This device has the Thomson Cable onboard. Which is default."); ··· 185 185 .num_adapters = 1, 186 186 .adapter = { 187 187 { 188 + .num_frontends = 1, 189 + .fe = {{ 188 190 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 189 191 .pid_filter_count = 16, 190 192 ··· 207 205 } 208 206 } 209 207 }, 208 + }}, 210 209 .size_of_priv = sizeof(struct dibusb_state), 211 210 } 212 211 }, ··· 275 272 .num_adapters = 1, 276 273 .adapter = { 277 274 { 275 + .num_frontends = 1, 276 + .fe = {{ 278 277 .caps = DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_ADAP_HAS_PID_FILTER, 279 278 .pid_filter_count = 16, 280 279 ··· 297 292 } 298 293 } 299 294 }, 295 + }}, 300 296 .size_of_priv = sizeof(struct dibusb_state), 301 297 }, 302 298 }, ··· 344 338 .num_adapters = 1, 345 339 .adapter = { 346 340 { 341 + .num_frontends = 1, 342 + .fe = {{ 347 343 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 348 344 .pid_filter_count = 16, 349 345 ··· 366 358 } 367 359 } 368 360 }, 361 + }}, 369 362 .size_of_priv = sizeof(struct dibusb_state), 370 363 } 371 364 }, ··· 407 398 .num_adapters = 1, 408 399 .adapter = { 409 400 { 401 + .num_frontends = 1, 402 + .fe = {{ 410 403 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 411 404 .pid_filter_count = 16, 412 405 ··· 428 417 } 429 418 } 430 419 }, 420 + }}, 431 421 .size_of_priv = sizeof(struct dibusb_state), 432 422 } 433 423 },
+3
drivers/media/dvb/dvb-usb/dibusb-mc.c
··· 57 57 .num_adapters = 1, 58 58 .adapter = { 59 59 { 60 + .num_frontends = 1, 61 + .fe = {{ 60 62 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 61 63 .pid_filter_count = 32, 62 64 .streaming_ctrl = dibusb2_0_streaming_ctrl, ··· 78 76 } 79 77 } 80 78 }, 79 + }}, 81 80 .size_of_priv = sizeof(struct dibusb_state), 82 81 } 83 82 },
+7 -4
drivers/media/dvb/dvb-usb/digitv.c
··· 137 137 { 138 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 141 st->is_nxt6000 = 0; 142 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 145 st->is_nxt6000 = 1; 146 146 return 0; 147 147 } ··· 152 152 { 153 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 156 return -ENODEV; 157 157 158 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 161 return 0; 162 162 } ··· 292 292 .num_adapters = 1, 293 293 .adapter = { 294 294 { 295 + .num_frontends = 1, 296 + .fe = {{ 295 297 .frontend_attach = digitv_frontend_attach, 296 298 .tuner_attach = digitv_tuner_attach, 297 299 ··· 308 306 } 309 307 } 310 308 }, 309 + }}, 311 310 } 312 311 }, 313 312 .identify_state = digitv_identify_state,
+13 -1
drivers/media/dvb/dvb-usb/dtt200u.c
··· 90 90 91 91 static 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 94 return 0; 95 95 } 96 96 ··· 140 140 .num_adapters = 1, 141 141 .adapter = { 142 142 { 143 + .num_frontends = 1, 144 + .fe = {{ 143 145 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 144 146 .pid_filter_count = 15, 145 147 ··· 159 157 } 160 158 } 161 159 }, 160 + }}, 162 161 } 163 162 }, 164 163 .power_ctrl = dtt200u_power_ctrl, ··· 190 187 .num_adapters = 1, 191 188 .adapter = { 192 189 { 190 + .num_frontends = 1, 191 + .fe = {{ 193 192 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 194 193 .pid_filter_count = 15, 195 194 ··· 209 204 } 210 205 } 211 206 }, 207 + }}, 212 208 } 213 209 }, 214 210 .power_ctrl = dtt200u_power_ctrl, ··· 240 234 .num_adapters = 1, 241 235 .adapter = { 242 236 { 237 + .num_frontends = 1, 238 + .fe = {{ 243 239 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 244 240 .pid_filter_count = 15, 245 241 ··· 259 251 } 260 252 } 261 253 }, 254 + }}, 262 255 } 263 256 }, 264 257 .power_ctrl = dtt200u_power_ctrl, ··· 290 281 .num_adapters = 1, 291 282 .adapter = { 292 283 { 284 + .num_frontends = 1, 285 + .fe = {{ 293 286 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 294 287 .pid_filter_count = 15, 295 288 ··· 309 298 } 310 299 } 311 300 }, 301 + }}, 312 302 } 313 303 }, 314 304 .power_ctrl = dtt200u_power_ctrl,
+7 -4
drivers/media/dvb/dvb-usb/dtv5100.c
··· 115 115 116 116 static 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 119 &adap->dev->i2c_adap); 120 - if (adap->fe[0] == NULL) 120 + if (adap->fe_adap[0].fe == NULL) 121 121 return -EIO; 122 122 123 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 126 return 0; 127 127 } ··· 133 133 static int dtv5100_tuner_attach(struct dvb_usb_adapter *adap) 134 134 { 135 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 137 &dtv5100_qt1010_config) == NULL ? -ENODEV : 0; 138 138 } 139 139 ··· 180 180 181 181 .num_adapters = 1, 182 182 .adapter = {{ 183 + .num_frontends = 1, 184 + .fe = {{ 183 185 .frontend_attach = dtv5100_frontend_attach, 184 186 .tuner_attach = dtv5100_tuner_attach, 185 187 ··· 195 193 } 196 194 } 197 195 }, 196 + }}, 198 197 } }, 199 198 200 199 .i2c_algo = &dtv5100_i2c_algo,
+82 -61
drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
··· 17 17 if (adap == NULL) 18 18 return -ENODEV; 19 19 20 + if (adap->active_fe < 0) { 21 + return -EINVAL; 22 + } 23 + 20 24 newfeedcount = adap->feedcount + (onoff ? 1 : -1); 21 25 22 26 /* stop feed before setting a new pid if there will be no pid anymore */ 23 27 if (newfeedcount == 0) { 24 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) { 28 - ret = adap->props.streaming_ctrl(adap, 0); 31 + if (adap->props.fe[adap->active_fe].streaming_ctrl != NULL) { 32 + ret = adap->props.fe[adap->active_fe].streaming_ctrl(adap, 0); 29 33 if (ret < 0) { 30 34 err("error while stopping stream."); 31 35 return ret; ··· 40 36 adap->feedcount = newfeedcount; 41 37 42 38 /* activate the pid on the device specific pid_filter */ 43 - deb_ts("setting pid (%s): %5d %04x at index %d '%s'\n",adap->pid_filtering ? 39 + deb_ts("setting pid (%s): %5d %04x at index %d '%s'\n",adap->fe_adap[adap->active_fe].pid_filtering ? 44 40 "yes" : "no", dvbdmxfeed->pid,dvbdmxfeed->pid,dvbdmxfeed->index,onoff ? 45 41 "on" : "off"); 46 - if (adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER && 47 - adap->pid_filtering && 48 - adap->props.pid_filter != NULL) 49 - adap->props.pid_filter(adap, dvbdmxfeed->index, dvbdmxfeed->pid,onoff); 42 + if (adap->props.fe[adap->active_fe].caps & DVB_USB_ADAP_HAS_PID_FILTER && 43 + adap->fe_adap[adap->active_fe].pid_filtering && 44 + adap->props.fe[adap->active_fe].pid_filter != NULL) 45 + adap->props.fe[adap->active_fe].pid_filter(adap, dvbdmxfeed->index, dvbdmxfeed->pid, onoff); 50 46 51 47 /* start the feed if this was the first feed and there is still a feed 52 48 * for reception. 53 49 */ 54 50 if (adap->feedcount == onoff && adap->feedcount > 0) { 55 51 deb_ts("submitting all URBs\n"); 56 - usb_urb_submit(&adap->stream); 52 + usb_urb_submit(&adap->fe_adap[adap->active_fe].stream); 57 53 58 54 deb_ts("controlling pid parser\n"); 59 - if (adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER && 60 - adap->props.caps & 55 + if (adap->props.fe[adap->active_fe].caps & DVB_USB_ADAP_HAS_PID_FILTER && 56 + adap->props.fe[adap->active_fe].caps & 61 57 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF && 62 - adap->props.pid_filter_ctrl != NULL) { 63 - ret = adap->props.pid_filter_ctrl(adap, 64 - adap->pid_filtering); 58 + adap->props.fe[adap->active_fe].pid_filter_ctrl != NULL) { 59 + ret = adap->props.fe[adap->active_fe].pid_filter_ctrl(adap, 60 + adap->fe_adap[adap->active_fe].pid_filtering); 65 61 if (ret < 0) { 66 62 err("could not handle pid_parser"); 67 63 return ret; 68 64 } 69 65 } 70 66 deb_ts("start feeding\n"); 71 - if (adap->props.streaming_ctrl != NULL) { 72 - ret = adap->props.streaming_ctrl(adap, 1); 67 + if (adap->props.fe[adap->active_fe].streaming_ctrl != NULL) { 68 + ret = adap->props.fe[adap->active_fe].streaming_ctrl(adap, 1); 73 69 if (ret < 0) { 74 70 err("error while enabling fifo."); 75 71 return ret; ··· 77 73 } 78 74 79 75 } 76 + if ((adap->feedcount == onoff) && (!onoff)) 77 + adap->active_fe = -1; 78 + 80 79 return 0; 81 80 } 82 81 ··· 97 90 98 91 int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums) 99 92 { 93 + int i; 100 94 int ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->desc->name, 101 95 adap->dev->owner, &adap->dev->udev->dev, 102 96 adapter_nums); ··· 120 112 adap->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING; 121 113 adap->demux.priv = adap; 122 114 123 - adap->demux.feednum = adap->demux.filternum = adap->max_feed_count; 115 + adap->demux.filternum = 0; 116 + for (i = 0; i < adap->props.num_frontends; i++) { 117 + if (adap->demux.filternum < adap->fe_adap[i].max_feed_count) 118 + adap->demux.filternum = adap->fe_adap[i].max_feed_count; 119 + } 120 + adap->demux.feednum = adap->demux.filternum; 124 121 adap->demux.start_feed = dvb_usb_start_feed; 125 122 adap->demux.stop_feed = dvb_usb_stop_feed; 126 123 adap->demux.write_to_decoder = NULL; ··· 169 156 return 0; 170 157 } 171 158 159 + static int dvb_usb_set_active_fe(struct dvb_frontend *fe, int onoff) 160 + { 161 + struct dvb_usb_adapter *adap = fe->dvb->priv; 162 + 163 + int ret = (adap->props.frontend_ctrl) ? 164 + adap->props.frontend_ctrl(fe, onoff) : 0; 165 + 166 + if (ret < 0) { 167 + err("frontend_ctrl request failed"); 168 + return ret; 169 + } 170 + if (onoff) 171 + adap->active_fe = fe->id; 172 + 173 + return 0; 174 + } 175 + 172 176 static int dvb_usb_fe_wakeup(struct dvb_frontend *fe) 173 177 { 174 178 struct dvb_usb_adapter *adap = fe->dvb->priv; 175 179 176 180 dvb_usb_device_power_ctrl(adap->dev, 1); 177 181 178 - if (adap->props.frontend_ctrl) 179 - adap->props.frontend_ctrl(fe, 1); 182 + dvb_usb_set_active_fe(fe, 1); 180 183 181 - if (adap->fe_init[fe->id]) 182 - adap->fe_init[fe->id](fe); 184 + if (adap->fe_adap[fe->id].fe_init) 185 + adap->fe_adap[fe->id].fe_init(fe); 183 186 184 187 return 0; 185 188 } ··· 204 175 { 205 176 struct dvb_usb_adapter *adap = fe->dvb->priv; 206 177 207 - if (adap->fe_sleep[fe->id]) 208 - adap->fe_sleep[fe->id](fe); 178 + if (adap->fe_adap[fe->id].fe_sleep) 179 + adap->fe_adap[fe->id].fe_sleep(fe); 209 180 210 - if (adap->props.frontend_ctrl) 211 - adap->props.frontend_ctrl(fe, 0); 181 + dvb_usb_set_active_fe(fe, 0); 212 182 213 183 return dvb_usb_device_power_ctrl(adap->dev, 0); 214 184 } 215 185 216 186 int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap) 217 187 { 218 - int ret, i, x; 219 - 220 - memset(adap->fe, 0, sizeof(adap->fe)); 221 - 222 - if (adap->props.frontend_attach == NULL) { 223 - err("strange: '%s' #%d doesn't want to attach a frontend.", 224 - adap->dev->desc->name, adap->id); 225 - 226 - return 0; 227 - } 188 + int ret, i; 228 189 229 190 /* register all given adapter frontends */ 230 - if (adap->props.num_frontends) 231 - x = adap->props.num_frontends - 1; 232 - else 233 - x = 0; 191 + for (i = 0; i < adap->props.num_frontends; i++) { 234 192 235 - for (i = 0; i <= x; i++) { 236 - ret = adap->props.frontend_attach(adap); 237 - if (ret || adap->fe[i] == NULL) { 193 + if (adap->props.fe[i].frontend_attach == NULL) { 194 + err("strange: '%s' #%d,%d " 195 + "doesn't want to attach a frontend.", 196 + adap->dev->desc->name, adap->id, i); 197 + 198 + return 0; 199 + } 200 + 201 + ret = adap->props.fe[i].frontend_attach(adap); 202 + if (ret || adap->fe_adap[i].fe == NULL) { 238 203 /* only print error when there is no FE at all */ 239 204 if (i == 0) 240 205 err("no frontend was attached by '%s'", ··· 237 214 return 0; 238 215 } 239 216 240 - adap->fe[i]->id = i; 217 + adap->fe_adap[i].fe->id = i; 241 218 242 219 /* re-assign sleep and wakeup functions */ 243 - adap->fe_init[i] = adap->fe[i]->ops.init; 244 - adap->fe[i]->ops.init = dvb_usb_fe_wakeup; 245 - adap->fe_sleep[i] = adap->fe[i]->ops.sleep; 246 - adap->fe[i]->ops.sleep = dvb_usb_fe_sleep; 220 + adap->fe_adap[i].fe_init = adap->fe_adap[i].fe->ops.init; 221 + adap->fe_adap[i].fe->ops.init = dvb_usb_fe_wakeup; 222 + adap->fe_adap[i].fe_sleep = adap->fe_adap[i].fe->ops.sleep; 223 + adap->fe_adap[i].fe->ops.sleep = dvb_usb_fe_sleep; 247 224 248 - if (dvb_register_frontend(&adap->dvb_adap, adap->fe[i])) { 225 + if (dvb_register_frontend(&adap->dvb_adap, adap->fe_adap[i].fe)) { 249 226 err("Frontend %d registration failed.", i); 250 - dvb_frontend_detach(adap->fe[i]); 251 - adap->fe[i] = NULL; 227 + dvb_frontend_detach(adap->fe_adap[i].fe); 228 + adap->fe_adap[i].fe = NULL; 252 229 /* In error case, do not try register more FEs, 253 230 * still leaving already registered FEs alive. */ 254 231 if (i == 0) ··· 258 235 } 259 236 260 237 /* only attach the tuner if the demod is there */ 261 - if (adap->props.tuner_attach != NULL) 262 - adap->props.tuner_attach(adap); 238 + if (adap->props.fe[i].tuner_attach != NULL) 239 + adap->props.fe[i].tuner_attach(adap); 240 + 241 + adap->num_frontends_initialized++; 263 242 } 264 243 265 244 return 0; ··· 269 244 270 245 int dvb_usb_adapter_frontend_exit(struct dvb_usb_adapter *adap) 271 246 { 272 - int i; 247 + int i = adap->num_frontends_initialized - 1; 273 248 274 249 /* unregister all given adapter frontends */ 275 - if (adap->props.num_frontends) 276 - i = adap->props.num_frontends - 1; 277 - else 278 - i = 0; 279 - 280 250 for (; i >= 0; i--) { 281 - if (adap->fe[i] != NULL) { 282 - dvb_unregister_frontend(adap->fe[i]); 283 - dvb_frontend_detach(adap->fe[i]); 251 + if (adap->fe_adap[i].fe != NULL) { 252 + dvb_unregister_frontend(adap->fe_adap[i].fe); 253 + dvb_frontend_detach(adap->fe_adap[i].fe); 284 254 } 285 255 } 256 + adap->num_frontends_initialized = 0; 286 257 287 258 return 0; 288 259 }
+25 -14
drivers/media/dvb/dvb-usb/dvb-usb-init.c
··· 29 29 static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs) 30 30 { 31 31 struct dvb_usb_adapter *adap; 32 - int ret, n; 32 + int ret, n, o; 33 33 34 34 for (n = 0; n < d->props.num_adapters; n++) { 35 35 adap = &d->adapter[n]; ··· 38 38 39 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 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 45 err("This USB2.0 device cannot be run on a USB1.1 port. (it lacks a hardware PID filter)"); 44 46 return -ENODEV; 45 47 } 46 48 47 - if ((d->udev->speed == USB_SPEED_FULL && adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER) || 48 - (adap->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); 50 - adap->pid_filtering = 1; 51 - adap->max_feed_count = adap->props.pid_filter_count; 49 + if ((d->udev->speed == USB_SPEED_FULL && props->caps & DVB_USB_ADAP_HAS_PID_FILTER) || 50 + (props->caps & DVB_USB_ADAP_NEED_PID_FILTERING)) { 51 + info("will use the device's hardware PID filter (table count: %d).", props->pid_filter_count); 52 + adap->fe_adap[o].pid_filtering = 1; 53 + adap->fe_adap[o].max_feed_count = props->pid_filter_count; 52 54 } else { 53 55 info("will pass the complete MPEG2 transport stream to the software demuxer."); 54 - adap->pid_filtering = 0; 55 - adap->max_feed_count = 255; 56 + adap->fe_adap[o].pid_filtering = 0; 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 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 63 info("pid filter enabled by module option."); 62 - adap->pid_filtering = 1; 63 - adap->max_feed_count = adap->props.pid_filter_count; 64 + adap->fe_adap[o].pid_filtering = 1; 65 + adap->fe_adap[o].max_feed_count = props->pid_filter_count; 64 66 } 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 + } 65 76 66 77 if (adap->props.size_of_priv > 0) { 67 78 adap->priv = kzalloc(adap->props.size_of_priv, GFP_KERNEL); ··· 89 78 } 90 79 91 80 /* use exclusive FE lock if there is multiple shared FEs */ 92 - if (adap->fe[1]) 81 + if (adap->fe_adap[1].fe) 93 82 adap->dvb_adap.mfe_shared = 1; 94 83 95 84 d->num_adapters_initialized++;
+20 -8
drivers/media/dvb/dvb-usb/dvb-usb-urb.c
··· 82 82 83 83 int dvb_usb_adapter_stream_init(struct dvb_usb_adapter *adap) 84 84 { 85 - adap->stream.udev = adap->dev->udev; 86 - if (adap->props.caps & DVB_USB_ADAP_RECEIVES_204_BYTE_TS) 87 - adap->stream.complete = dvb_usb_data_complete_204; 88 - else 89 - adap->stream.complete = dvb_usb_data_complete; 90 - adap->stream.user_priv = adap; 91 - return usb_urb_init(&adap->stream, &adap->props.stream); 85 + int i, ret = 0; 86 + for (i = 0; i < adap->props.num_frontends; i++) { 87 + 88 + adap->fe_adap[i].stream.udev = adap->dev->udev; 89 + if (adap->props.fe[i].caps & DVB_USB_ADAP_RECEIVES_204_BYTE_TS) 90 + adap->fe_adap[i].stream.complete = 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 94 103 int 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 }
+27 -11
drivers/media/dvb/dvb-usb/dvb-usb.h
··· 136 136 * pll_desc and pll_init_buf of struct dvb_usb_device). 137 137 * @stream: configuration of the USB streaming 138 138 */ 139 - struct dvb_usb_adapter_properties { 139 + struct dvb_usb_adapter_fe_properties { 140 140 #define DVB_USB_ADAP_HAS_PID_FILTER 0x01 141 141 #define DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF 0x02 142 142 #define DVB_USB_ADAP_NEED_PID_FILTERING 0x04 143 143 #define DVB_USB_ADAP_RECEIVES_204_BYTE_TS 0x08 144 144 int caps; 145 145 int pid_filter_count; 146 - int num_frontends; 147 146 148 - int (*frontend_ctrl) (struct dvb_frontend *, int); 149 147 int (*streaming_ctrl) (struct dvb_usb_adapter *, int); 150 148 int (*pid_filter_ctrl) (struct dvb_usb_adapter *, int); 151 149 int (*pid_filter) (struct dvb_usb_adapter *, int, u16, int); ··· 154 156 struct usb_data_stream_properties stream; 155 157 156 158 int size_of_priv; 159 + }; 157 160 161 + #define MAX_NO_OF_FE_PER_ADAP 2 162 + struct dvb_usb_adapter_properties { 163 + int size_of_priv; 164 + 165 + int (*frontend_ctrl) (struct dvb_frontend *, int); 158 166 int (*fe_ioctl_override) (struct dvb_frontend *, 159 167 unsigned int, void *, unsigned int); 168 + 169 + int num_frontends; 170 + struct dvb_usb_adapter_fe_properties fe[MAX_NO_OF_FE_PER_ADAP]; 160 171 }; 161 172 162 173 /** ··· 356 349 * 357 350 * @stream: the usb data stream. 358 351 */ 359 - #define MAX_NO_OF_FE_PER_ADAP 2 352 + struct dvb_usb_fe_adapter { 353 + struct dvb_frontend *fe; 354 + 355 + int (*fe_init) (struct dvb_frontend *); 356 + int (*fe_sleep) (struct dvb_frontend *); 357 + 358 + struct usb_data_stream stream; 359 + 360 + int pid_filtering; 361 + int max_feed_count; 362 + 363 + void *priv; 364 + }; 365 + 360 366 struct dvb_usb_adapter { 361 367 struct dvb_usb_device *dev; 362 368 struct dvb_usb_adapter_properties props; ··· 381 361 u8 id; 382 362 383 363 int feedcount; 384 - int pid_filtering; 385 364 386 365 /* dvb */ 387 366 struct dvb_adapter dvb_adap; 388 367 struct dmxdev dmxdev; 389 368 struct dvb_demux demux; 390 369 struct dvb_net dvb_net; 391 - struct dvb_frontend *fe[MAX_NO_OF_FE_PER_ADAP]; 392 - int max_feed_count; 393 370 394 - int (*fe_init[MAX_NO_OF_FE_PER_ADAP]) (struct dvb_frontend *); 395 - int (*fe_sleep[MAX_NO_OF_FE_PER_ADAP]) (struct dvb_frontend *); 396 - 397 - struct usb_data_stream stream; 371 + struct dvb_usb_fe_adapter fe_adap[MAX_NO_OF_FE_PER_ADAP]; 372 + int active_fe; 373 + int num_frontends_initialized; 398 374 399 375 void *priv; 400 376 };
+65 -50
drivers/media/dvb/dvb-usb/dw2102.c
··· 992 992 struct dvb_tuner_ops *tuner_ops = NULL; 993 993 994 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 996 &d->dev->i2c_adap, 0); 997 - if (d->fe[0] != NULL) { 998 - if (dvb_attach(stb6100_attach, d->fe[0], 997 + if (d->fe_adap[0].fe != NULL) { 998 + if (dvb_attach(stb6100_attach, d->fe_adap[0].fe, 999 999 &dw2104a_stb6100_config, 1000 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 1002 tuner_ops->set_frequency = stb6100_set_freq; 1003 1003 tuner_ops->get_frequency = stb6100_get_freq; 1004 1004 tuner_ops->set_bandwidth = stb6100_set_bandw; 1005 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 1007 info("Attached STV0900+STB6100!\n"); 1008 1008 return 0; 1009 1009 } ··· 1011 1011 } 1012 1012 1013 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 1015 &d->dev->i2c_adap, 0); 1016 - if (d->fe[0] != NULL) { 1017 - if (dvb_attach(stv6110_attach, d->fe[0], 1016 + if (d->fe_adap[0].fe != NULL) { 1017 + if (dvb_attach(stv6110_attach, d->fe_adap[0].fe, 1018 1018 &dw2104_stv6110_config, 1019 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 1021 info("Attached STV0900+STV6110A!\n"); 1022 1022 return 0; 1023 1023 } ··· 1025 1025 } 1026 1026 1027 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 1029 &d->dev->i2c_adap); 1030 - if (d->fe[0] != NULL) { 1031 - d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1030 + if (d->fe_adap[0].fe != NULL) { 1031 + d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage; 1032 1032 info("Attached cx24116!\n"); 1033 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 1038 &d->dev->i2c_adap); 1039 - if (d->fe[0] != NULL) { 1040 - d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1039 + if (d->fe_adap[0].fe != NULL) { 1040 + d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage; 1041 1041 info("Attached DS3000!\n"); 1042 1042 return 0; 1043 1043 } ··· 1053 1053 { 1054 1054 if (dw2102_properties.i2c_algo == &dw2102_serit_i2c_algo) { 1055 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 1057 &d->dev->i2c_adap); 1058 - if (d->fe[0] != NULL) { 1059 - d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1058 + if (d->fe_adap[0].fe != NULL) { 1059 + d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage; 1060 1060 info("Attached si21xx!\n"); 1061 1061 return 0; 1062 1062 } 1063 1063 } 1064 1064 1065 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 1067 &d->dev->i2c_adap); 1068 - if (d->fe[0] != NULL) { 1069 - if (dvb_attach(stb6000_attach, d->fe[0], 0x61, 1068 + if (d->fe_adap[0].fe != NULL) { 1069 + if (dvb_attach(stb6000_attach, d->fe_adap[0].fe, 0x61, 1070 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 1072 info("Attached stv0288!\n"); 1073 1073 return 0; 1074 1074 } ··· 1077 1077 1078 1078 if (dw2102_properties.i2c_algo == &dw2102_i2c_algo) { 1079 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 1081 &d->dev->i2c_adap); 1082 - if (d->fe[0] != NULL) { 1083 - d->fe[0]->ops.set_voltage = dw210x_set_voltage; 1082 + if (d->fe_adap[0].fe != NULL) { 1083 + d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage; 1084 1084 info("Attached stv0299!\n"); 1085 1085 return 0; 1086 1086 } ··· 1090 1090 1091 1091 static 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 1094 &d->dev->i2c_adap, 0x48); 1095 - if (d->fe[0] != NULL) { 1095 + if (d->fe_adap[0].fe != NULL) { 1096 1096 info("Attached tda10023!\n"); 1097 1097 return 0; 1098 1098 } ··· 1101 1101 1102 1102 static 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 1105 &d->dev->i2c_adap); 1106 - if (d->fe[0] != NULL) { 1107 - if (dvb_attach(zl10039_attach, d->fe[0], 0x60, 1106 + if (d->fe_adap[0].fe != NULL) { 1107 + if (dvb_attach(zl10039_attach, d->fe_adap[0].fe, 0x60, 1108 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 1110 info("Attached zl100313+zl10039!\n"); 1111 1111 return 0; 1112 1112 } ··· 1119 1119 { 1120 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 1123 &d->dev->i2c_adap); 1124 1124 1125 - if (d->fe[0] == NULL) 1125 + if (d->fe_adap[0].fe == NULL) 1126 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 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 1133 dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG); 1134 1134 ··· 1143 1143 struct s6x0_state *st = (struct s6x0_state *)d->dev->priv; 1144 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 1147 &d->dev->i2c_adap); 1148 1148 1149 - if (d->fe[0] == NULL) 1149 + if (d->fe_adap[0].fe == NULL) 1150 1150 return -EIO; 1151 1151 1152 - st->old_set_voltage = d->fe[0]->ops.set_voltage; 1153 - d->fe[0]->ops.set_voltage = s660_set_voltage; 1152 + st->old_set_voltage = d->fe_adap[0].fe->ops.set_voltage; 1153 + d->fe_adap[0].fe->ops.set_voltage = s660_set_voltage; 1154 1154 1155 1155 dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG); 1156 1156 ··· 1163 1163 { 1164 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 1167 &d->dev->i2c_adap, 0); 1168 - if (d->fe[0] == NULL) 1168 + if (d->fe_adap[0].fe == NULL) 1169 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 1173 dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG); 1174 1174 ··· 1204 1204 if (dvb_usb_generic_rw(d->dev, obuf, 1, ibuf, 1, 0) < 0) 1205 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 1208 &d->dev->i2c_adap); 1209 - if (d->fe[0] == NULL) 1209 + if (d->fe_adap[0].fe == NULL) 1210 1210 return -EIO; 1211 1211 1212 1212 info("Attached DS3000!\n"); ··· 1216 1216 1217 1217 static 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 1220 &adap->dev->i2c_adap, DVB_PLL_OPERA1); 1221 1221 return 0; 1222 1222 } 1223 1223 1224 1224 static 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 1227 &adap->dev->i2c_adap, DVB_PLL_TUA6034); 1228 1228 1229 1229 return 0; ··· 1535 1535 DW210X_READ_MSG); 1536 1536 if ((reset16[0] == 0xa1) || (reset16[0] == 0x80)) { 1537 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 1539 break; 1540 1540 } else { 1541 1541 /* check STV0288 frontend */ ··· 1591 1591 .read_mac_address = dw210x_read_mac_address, 1592 1592 .adapter = { 1593 1593 { 1594 + .num_frontends = 1, 1595 + .fe = {{ 1594 1596 .frontend_attach = dw2102_frontend_attach, 1595 1597 .stream = { 1596 1598 .type = USB_BULK, ··· 1604 1602 } 1605 1603 } 1606 1604 }, 1605 + }}, 1607 1606 } 1608 1607 }, 1609 1608 .num_device_descs = 3, ··· 1645 1642 .read_mac_address = dw210x_read_mac_address, 1646 1643 .adapter = { 1647 1644 { 1645 + .num_frontends = 1, 1646 + .fe = {{ 1648 1647 .frontend_attach = dw2104_frontend_attach, 1649 1648 .stream = { 1650 1649 .type = USB_BULK, ··· 1658 1653 } 1659 1654 } 1660 1655 }, 1656 + }}, 1661 1657 } 1662 1658 }, 1663 1659 .num_device_descs = 2, ··· 1695 1689 .read_mac_address = dw210x_read_mac_address, 1696 1690 .adapter = { 1697 1691 { 1692 + .num_frontends = 1, 1693 + .fe = {{ 1698 1694 .frontend_attach = dw3101_frontend_attach, 1699 1695 .tuner_attach = dw3101_tuner_attach, 1700 1696 .stream = { ··· 1709 1701 } 1710 1702 } 1711 1703 }, 1704 + }}, 1712 1705 } 1713 1706 }, 1714 1707 .num_device_descs = 1, ··· 1742 1733 .read_mac_address = s6x0_read_mac_address, 1743 1734 .adapter = { 1744 1735 { 1736 + .num_frontends = 1, 1737 + .fe = {{ 1745 1738 .frontend_attach = zl100313_frontend_attach, 1746 1739 .stream = { 1747 1740 .type = USB_BULK, ··· 1755 1744 } 1756 1745 } 1757 1746 }, 1747 + }}, 1758 1748 } 1759 1749 }, 1760 1750 .num_device_descs = 1, ··· 1822 1810 1823 1811 .adapter = { 1824 1812 { 1813 + .num_frontends = 1, 1814 + .fe = {{ 1825 1815 .streaming_ctrl = su3000_streaming_ctrl, 1826 1816 .frontend_attach = su3000_frontend_attach, 1827 1817 .stream = { ··· 1836 1822 } 1837 1823 } 1838 1824 } 1825 + }}, 1839 1826 } 1840 1827 }, 1841 1828 .num_device_descs = 3, ··· 1870 1855 p1100->devices[0] = d1100; 1871 1856 p1100->rc.legacy.rc_map_table = rc_map_tbs_table; 1872 1857 p1100->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table); 1873 - p1100->adapter->frontend_attach = stv0288_frontend_attach; 1858 + p1100->adapter->fe[0].frontend_attach = stv0288_frontend_attach; 1874 1859 1875 1860 s660 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL); 1876 1861 if (!s660) { ··· 1884 1869 s660->devices[0] = d660; 1885 1870 s660->devices[1] = d480_1; 1886 1871 s660->devices[2] = d480_2; 1887 - s660->adapter->frontend_attach = ds3000_frontend_attach; 1872 + s660->adapter->fe[0].frontend_attach = ds3000_frontend_attach; 1888 1873 1889 1874 p7500 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL); 1890 1875 if (!p7500) { ··· 1898 1883 p7500->devices[0] = d7500; 1899 1884 p7500->rc.legacy.rc_map_table = rc_map_tbs_table; 1900 1885 p7500->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table); 1901 - p7500->adapter->frontend_attach = prof_7500_frontend_attach; 1886 + p7500->adapter->fe[0].frontend_attach = prof_7500_frontend_attach; 1902 1887 1903 1888 if (0 == dvb_usb_device_init(intf, &dw2102_properties, 1904 1889 THIS_MODULE, NULL, adapter_nr) ||
+6 -3
drivers/media/dvb/dvb-usb/ec168.c
··· 200 200 static int ec168_ec100_frontend_attach(struct dvb_usb_adapter *adap) 201 201 { 202 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 204 &adap->dev->i2c_adap); 205 - if (adap->fe[0] == NULL) 205 + if (adap->fe_adap[0].fe == NULL) 206 206 return -ENODEV; 207 207 208 208 return 0; ··· 228 228 static int ec168_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap) 229 229 { 230 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 232 &ec168_mxl5003s_config) == NULL ? -ENODEV : 0; 233 233 } 234 234 ··· 382 382 .num_adapters = 1, 383 383 .adapter = { 384 384 { 385 + .num_frontends = 1, 386 + .fe = {{ 385 387 .streaming_ctrl = ec168_streaming_ctrl, 386 388 .frontend_attach = ec168_ec100_frontend_attach, 387 389 .tuner_attach = ec168_mxl5003s_tuner_attach, ··· 397 395 } 398 396 } 399 397 }, 398 + }}, 400 399 } 401 400 }, 402 401
+5 -2
drivers/media/dvb/dvb-usb/friio.c
··· 403 403 if (friio_initialize(adap->dev) < 0) 404 404 return -EIO; 405 405 406 - adap->fe[0] = jdvbt90502_attach(adap->dev); 407 - if (adap->fe[0] == NULL) 406 + adap->fe_adap[0].fe = jdvbt90502_attach(adap->dev); 407 + if (adap->fe_adap[0].fe == NULL) 408 408 return -EIO; 409 409 410 410 return 0; ··· 473 473 /* caps:0 => no pid filter, 188B TS packet */ 474 474 /* GL861 has a HW pid filter, but no info available. */ 475 475 { 476 + .num_frontends = 1, 477 + .fe = {{ 476 478 .caps = 0, 477 479 478 480 .frontend_attach = friio_frontend_attach, ··· 492 490 } 493 491 } 494 492 }, 493 + }}, 495 494 } 496 495 }, 497 496 .i2c_algo = &gl861_i2c_algo,
+6 -3
drivers/media/dvb/dvb-usb/gl861.c
··· 103 103 static 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 107 &adap->dev->i2c_adap); 108 - if (adap->fe[0] == NULL) 108 + if (adap->fe_adap[0].fe == NULL) 109 109 return -EIO; 110 110 111 111 return 0; ··· 118 118 static int gl861_tuner_attach(struct dvb_usb_adapter *adap) 119 119 { 120 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 122 &gl861_qt1010_config) == NULL ? -ENODEV : 0; 123 123 } 124 124 ··· 167 167 168 168 .num_adapters = 1, 169 169 .adapter = {{ 170 + .num_frontends = 1, 171 + .fe = {{ 170 172 171 173 .frontend_attach = gl861_frontend_attach, 172 174 .tuner_attach = gl861_tuner_attach, ··· 183 181 } 184 182 } 185 183 }, 184 + }}, 186 185 } }, 187 186 .i2c_algo = &gl861_i2c_algo, 188 187
+4 -1
drivers/media/dvb/dvb-usb/gp8psk.c
··· 230 230 231 231 static 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 234 return 0; 235 235 } 236 236 ··· 268 268 .num_adapters = 1, 269 269 .adapter = { 270 270 { 271 + .num_frontends = 1, 272 + .fe = {{ 271 273 .streaming_ctrl = gp8psk_streaming_ctrl, 272 274 .frontend_attach = gp8psk_frontend_attach, 273 275 /* parameter for the MPEG2-data transfer */ ··· 283 281 } 284 282 } 285 283 }, 284 + }}, 286 285 } 287 286 }, 288 287 .power_ctrl = gp8psk_power_ctrl,
+11 -5
drivers/media/dvb/dvb-usb/it913x.c
··· 436 436 { 437 437 const char *desc = adap->dev->desc->name; 438 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 441 strlcpy(name, desc, 128); 442 442 strlcat(name, fe_name[adap->id], 128); ··· 450 450 int ret = 0; 451 451 u8 adf = it913x_read_reg(udev, IO_MUX_POWER_CLK); 452 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 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 459 ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2_SW_RST, 0x1); 460 460 ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2IF2_SW_RST, 0x1); 461 461 ret = it913x_wr_reg(udev, DEV_0, EP0_TX_EN, 0x0f); ··· 465 465 ep_size & 0xff); 466 466 ret = it913x_wr_reg(udev, DEV_0, EP4_TX_LEN_MSB, ep_size >> 8); 467 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 469 ret = it913x_wr_reg(udev, DEV_0, EP0_TX_EN, 0x6f); 470 470 ret = it913x_wr_reg(udev, DEV_0, EP5_TX_LEN_LSB, 471 471 ep_size & 0xff); ··· 524 524 .num_adapters = 2, 525 525 .adapter = { 526 526 { 527 + .num_frontends = 1, 528 + .fe = {{ 527 529 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 528 530 DVB_USB_ADAP_NEED_PID_FILTERING| 529 531 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, ··· 546 544 } 547 545 } 548 546 } 547 + }}, 549 548 }, 550 549 { 550 + .num_frontends = 1, 551 + .fe = {{ 551 552 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 552 553 DVB_USB_ADAP_NEED_PID_FILTERING| 553 554 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, ··· 571 566 } 572 567 } 573 568 } 569 + }}, 574 570 } 575 571 }, 576 572 .identify_state = it913x_identify_state,
+21 -15
drivers/media/dvb/dvb-usb/lmedm04.c
··· 941 941 const char *desc = adap->dev->desc->name; 942 942 char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395", 943 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 946 strlcpy(name, desc, 128); 947 947 strlcat(name, fe_name[st->tuner_config], 128); ··· 958 958 st->i2c_talk_onoff = 1; 959 959 960 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 962 &adap->dev->i2c_adap); 963 963 964 - if (adap->fe[0]) { 964 + if (adap->fe_adap[0].fe) { 965 965 info("TUN Found Frontend TDA10086"); 966 966 st->i2c_tuner_gate_w = 4; 967 967 st->i2c_tuner_gate_r = 4; ··· 975 975 } 976 976 977 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 979 &adap->dev->i2c_adap); 980 - if (adap->fe[0]) { 980 + if (adap->fe_adap[0].fe) { 981 981 info("FE Found Stv0299"); 982 982 st->i2c_tuner_gate_w = 4; 983 983 st->i2c_tuner_gate_r = 5; ··· 991 991 } 992 992 993 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 995 &adap->dev->i2c_adap); 996 - if (adap->fe[0]) { 996 + if (adap->fe_adap[0].fe) { 997 997 info("FE Found Stv0288"); 998 998 st->i2c_tuner_gate_w = 4; 999 999 st->i2c_tuner_gate_r = 5; ··· 1010 1010 1011 1011 1012 1012 end: if (ret) { 1013 - if (adap->fe[0]) { 1014 - dvb_frontend_detach(adap->fe[0]); 1015 - adap->fe[0] = NULL; 1013 + if (adap->fe_adap[0].fe) { 1014 + dvb_frontend_detach(adap->fe_adap[0].fe); 1015 + adap->fe_adap[0].fe = NULL; 1016 1016 } 1017 1017 adap->dev->props.rc.core.rc_codes = NULL; 1018 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 1022 ret = lme_name(adap); 1023 1023 return ret; 1024 1024 } ··· 1031 1031 1032 1032 switch (st->tuner_config) { 1033 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 1035 &adap->dev->i2c_adap, 1)) 1036 1036 ret = st->tuner_config; 1037 1037 break; 1038 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 1040 &adap->dev->i2c_adap)) 1041 1041 ret = st->tuner_config; 1042 1042 break; 1043 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 1045 &adap->dev->i2c_adap, DVB_PLL_OPERA1)) 1046 1046 ret = st->tuner_config; 1047 1047 break; ··· 1145 1145 .num_adapters = 1, 1146 1146 .adapter = { 1147 1147 { 1148 + .num_frontends = 1, 1149 + .fe = {{ 1148 1150 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 1149 1151 DVB_USB_ADAP_NEED_PID_FILTERING| 1150 1152 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, ··· 1168 1166 } 1169 1167 } 1170 1168 } 1169 + }}, 1171 1170 } 1172 1171 }, 1173 1172 .rc.core = { ··· 1196 1193 .num_adapters = 1, 1197 1194 .adapter = { 1198 1195 { 1196 + .num_frontends = 1, 1197 + .fe = {{ 1199 1198 .caps = DVB_USB_ADAP_HAS_PID_FILTER| 1200 1199 DVB_USB_ADAP_NEED_PID_FILTERING| 1201 1200 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, ··· 1219 1214 } 1220 1215 } 1221 1216 } 1217 + }}, 1222 1218 } 1223 1219 }, 1224 1220 .rc.core = { ··· 1247 1241 void *buffer = NULL; 1248 1242 1249 1243 if (adap != NULL) { 1250 - lme2510_kill_urb(&adap->stream); 1244 + lme2510_kill_urb(&adap->fe_adap[0].stream); 1251 1245 adap->feedcount = 0; 1252 1246 } 1253 1247
+33 -10
drivers/media/dvb/dvb-usb/m920x.c
··· 86 86 } 87 87 88 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 91 /* Some devices(Dposh) might crash if we attempt touch at all. */ 92 92 if (flags & DVB_USB_ADAP_HAS_PID_FILTER) { 93 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 96 if (epi < 0 || epi >= M9206_MAX_ADAPTERS) { 97 97 printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n"); ··· 292 292 struct m920x_state *m = adap->dev->priv; 293 293 int enabled = m->filtering_enabled[adap->id]; 294 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 297 for (i = 0; i < M9206_MAX_FILTERS; i++) 298 298 if (m->filters[adap->id][i] == 8192) ··· 501 501 { 502 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 505 &m920x_mt352_config, 506 506 &adap->dev->i2c_adap)) == NULL) 507 507 return -EIO; ··· 513 513 { 514 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 517 &m920x_tda10046_08_config, 518 518 &adap->dev->i2c_adap)) == NULL) 519 519 return -EIO; ··· 525 525 { 526 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 529 &m920x_tda10046_0b_config, 530 530 &adap->dev->i2c_adap)) == NULL) 531 531 return -EIO; ··· 537 537 { 538 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 541 return -ENODEV; 542 542 543 543 return 0; ··· 547 547 { 548 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 551 return -ENODEV; 552 552 553 553 return 0; ··· 557 557 { 558 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 561 return -ENODEV; 562 562 563 563 return 0; ··· 565 565 566 566 static 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 569 &adap->dev->i2c_adap, 0x61, 570 570 TUNER_PHILIPS_FMD1216ME_MK3); 571 571 return 0; ··· 807 807 .identify_state = m920x_identify_state, 808 808 .num_adapters = 1, 809 809 .adapter = {{ 810 + .num_frontends = 1, 811 + .fe = {{ 812 + 810 813 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 811 814 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 812 815 ··· 830 827 } 831 828 } 832 829 }, 830 + }}, 833 831 }}, 834 832 .i2c_algo = &m920x_i2c_algo, 835 833 ··· 855 851 .identify_state = m920x_identify_state, 856 852 .num_adapters = 1, 857 853 .adapter = {{ 854 + .num_frontends = 1, 855 + .fe = {{ 856 + 858 857 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 859 858 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 860 859 ··· 878 871 } 879 872 } 880 873 }, 874 + }}, 881 875 }}, 882 876 .i2c_algo = &m920x_i2c_algo, 883 877 ··· 918 910 .identify_state = m920x_identify_state, 919 911 .num_adapters = 2, 920 912 .adapter = {{ 913 + .num_frontends = 1, 914 + .fe = {{ 915 + 921 916 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 922 917 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 923 918 ··· 940 929 .buffersize = 512, 941 930 } 942 931 } 932 + }}, 943 933 }},{ 934 + .num_frontends = 1, 935 + .fe = {{ 936 + 944 937 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 945 938 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 946 939 ··· 964 949 .buffersize = 512, 965 950 } 966 951 } 952 + }}, 967 953 }, 968 954 }}, 969 955 .i2c_algo = &m920x_i2c_algo, ··· 990 974 .identify_state = m920x_identify_state, 991 975 .num_adapters = 1, 992 976 .adapter = {{ 977 + .num_frontends = 1, 978 + .fe = {{ 993 979 /* Hardware pid filters don't work with this device/firmware */ 994 980 995 981 .frontend_attach = m920x_mt352_frontend_attach, ··· 1007 989 } 1008 990 } 1009 991 }, 992 + }}, 1010 993 }}, 1011 994 .i2c_algo = &m920x_i2c_algo, 1012 995 ··· 1038 1019 .identify_state = m920x_identify_state, 1039 1020 .num_adapters = 1, 1040 1021 .adapter = {{ 1022 + .num_frontends = 1, 1023 + .fe = {{ 1024 + 1041 1025 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 1042 1026 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 1043 1027 ··· 1063 1041 } 1064 1042 } 1065 1043 }, 1044 + }}, 1066 1045 } }, 1067 1046 .i2c_algo = &m920x_i2c_algo, 1068 1047
+20 -13
drivers/media/dvb/dvb-usb/mxl111sf.c
··· 253 253 struct dvb_usb_adapter *adap = fe->dvb->priv; 254 254 struct dvb_usb_device *d = adap->dev; 255 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 258 int err; 258 259 259 260 /* exit if we didnt initialize the driver yet */ ··· 312 311 struct dvb_usb_adapter *adap = fe->dvb->priv; 313 312 struct dvb_usb_device *d = adap->dev; 314 313 struct mxl111sf_state *state = d->priv; 315 - struct mxl111sf_adap_state *adap_state = adap->priv; 314 + struct mxl111sf_adap_state *adap_state = adap->fe_adap[fe->id].priv; 316 315 int err; 317 316 318 317 /* exit if we didnt initialize the driver yet */ ··· 337 336 { 338 337 struct dvb_usb_device *d = adap->dev; 339 338 struct mxl111sf_state *state = d->priv; 340 - struct mxl111sf_adap_state *adap_state = adap->priv; 339 + struct mxl111sf_adap_state *adap_state = adap->fe_adap[adap->active_fe].priv; 341 340 int ret = 0; 342 341 u8 tmp; 343 342 ··· 379 378 { 380 379 struct dvb_usb_device *d = adap->dev; 381 380 struct mxl111sf_state *state = d->priv; 382 - struct mxl111sf_adap_state *adap_state = adap->priv; 381 + struct mxl111sf_adap_state *adap_state = adap->fe_adap[0].priv; 383 382 int ret; 384 383 385 384 deb_adv("%s()\n", __func__); ··· 422 421 if (mxl_fail(ret)) 423 422 goto fail; 424 423 425 - adap->fe[0] = dvb_attach(lgdt3305_attach, 424 + adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach, 426 425 &hauppauge_lgdt3305_config, 427 426 &adap->dev->i2c_adap); 428 - if (adap->fe[0]) { 429 - adap_state->fe_init = adap->fe[0]->ops.init; 430 - adap->fe[0]->ops.init = mxl111sf_adap_fe_init; 431 - adap_state->fe_sleep = adap->fe[0]->ops.sleep; 432 - adap->fe[0]->ops.sleep = mxl111sf_adap_fe_sleep; 427 + if (adap->fe_adap[0].fe) { 428 + adap_state->fe_init = adap->fe_adap[0].fe->ops.init; 429 + adap->fe_adap[0].fe->ops.init = mxl111sf_adap_fe_init; 430 + adap_state->fe_sleep = adap->fe_adap[0].fe->ops.sleep; 431 + adap->fe_adap[0].fe->ops.sleep = mxl111sf_adap_fe_sleep; 433 432 return 0; 434 433 } 435 434 ret = -EIO; ··· 517 516 518 517 deb_adv("%s()\n", __func__); 519 518 520 - if (NULL != dvb_attach(mxl111sf_tuner_attach, adap->fe[0], state, 519 + if (NULL != dvb_attach(mxl111sf_tuner_attach, adap->fe_adap[0].fe, state, 521 520 &mxl_tuner_config)) 522 521 return 0; 523 522 ··· 715 714 .num_adapters = 1, 716 715 .adapter = { 717 716 { 717 + .fe_ioctl_override = mxl111sf_fe_ioctl_override, 718 + .num_frontends = 1, 719 + .fe = {{ 718 720 .size_of_priv = sizeof(struct mxl111sf_adap_state), 719 - .fe_ioctl_override = mxl111sf_fe_ioctl_override, 720 721 721 722 .frontend_attach = mxl111sf_lgdt3305_frontend_attach, 722 723 .tuner_attach = mxl111sf_attach_tuner, 723 724 724 725 MXL111SF_EP6_BULK_STREAMING_CONFIG, 726 + }}, 725 727 }, 726 728 }, 727 729 .num_device_descs = 6, ··· 772 768 .num_adapters = 1, 773 769 .adapter = { 774 770 { 771 + .fe_ioctl_override = mxl111sf_fe_ioctl_override, 772 + .num_frontends = 1, 773 + .fe = {{ 775 774 .size_of_priv = sizeof(struct mxl111sf_adap_state), 776 - .fe_ioctl_override = mxl111sf_fe_ioctl_override, 777 775 778 776 .frontend_attach = mxl111sf_lgdt3305_frontend_attach, 779 777 .tuner_attach = mxl111sf_attach_tuner, 780 778 781 779 MXL111SF_EP6_ISOC_STREAMING_CONFIG, 780 + }}, 782 781 }, 783 782 }, 784 783 .num_device_descs = 6,
+3 -1
drivers/media/dvb/dvb-usb/nova-t-usb2.c
··· 166 166 .num_adapters = 1, 167 167 .adapter = { 168 168 { 169 + .num_frontends = 1, 170 + .fe = {{ 169 171 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 170 172 .pid_filter_count = 32, 171 173 ··· 188 186 } 189 187 } 190 188 }, 191 - 189 + }}, 192 190 .size_of_priv = sizeof(struct dibusb_state), 193 191 } 194 192 },
+6 -3
drivers/media/dvb/dvb-usb/opera1.c
··· 263 263 264 264 static int opera1_frontend_attach(struct dvb_usb_adapter *d) 265 265 { 266 - if ((d->fe[0] = 266 + if ((d->fe_adap[0].fe = 267 267 dvb_attach(stv0299_attach, &opera1_stv0299_config, 268 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 270 return 0; 271 271 } 272 272 info("not attached stv0299"); ··· 276 276 static int opera1_tuner_attach(struct dvb_usb_adapter *adap) 277 277 { 278 278 dvb_attach( 279 - dvb_pll_attach, adap->fe[0], 0xc0>>1, 279 + dvb_pll_attach, adap->fe_adap[0].fe, 0xc0>>1, 280 280 &adap->dev->i2c_adap, DVB_PLL_OPERA1 281 281 ); 282 282 return 0; ··· 516 516 .num_adapters = 1, 517 517 .adapter = { 518 518 { 519 + .num_frontends = 1, 520 + .fe = {{ 519 521 .frontend_attach = opera1_frontend_attach, 520 522 .streaming_ctrl = opera1_streaming_ctrl, 521 523 .tuner_attach = opera1_tuner_attach, ··· 537 535 } 538 536 } 539 537 }, 538 + }}, 540 539 } 541 540 }, 542 541 .num_device_descs = 1,
+15 -13
drivers/media/dvb/dvb-usb/technisat-usb2.c
··· 292 292 { 293 293 struct technisat_usb2_state *state = 294 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 297 if (state->power_state == 0) 298 298 goto schedule; ··· 505 505 struct usb_device *udev = a->dev->udev; 506 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 509 &a->dev->i2c_adap, STV090x_DEMODULATOR_0); 510 510 511 - if (a->fe[0]) { 511 + if (a->fe_adap[0].fe) { 512 512 struct stv6110x_devctl *ctl; 513 513 514 514 ctl = dvb_attach(stv6110x_attach, 515 - a->fe[0], 515 + a->fe_adap[0].fe, 516 516 &technisat_usb2_stv6110x_config, 517 517 &a->dev->i2c_adap); 518 518 ··· 532 532 /* call the init function once to initialize 533 533 tuner's clock output divider and demod's 534 534 master clock */ 535 - if (a->fe[0]->ops.init) 536 - a->fe[0]->ops.init(a->fe[0]); 535 + if (a->fe_adap[0].fe->ops.init) 536 + a->fe_adap[0].fe->ops.init(a->fe_adap[0].fe); 537 537 538 538 if (mutex_lock_interruptible(&a->dev->i2c_mutex) < 0) 539 539 return -EAGAIN; ··· 548 548 if (ret != 0) 549 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 553 /* if everything was successful assign a nice name to the frontend */ 554 - strlcpy(a->fe[0]->ops.info.name, a->dev->desc->name, 555 - sizeof(a->fe[0]->ops.info.name)); 554 + strlcpy(a->fe_adap[0].fe->ops.info.name, a->dev->desc->name, 555 + sizeof(a->fe_adap[0].fe->ops.info.name)); 556 556 } else { 557 - dvb_frontend_detach(a->fe[0]); 558 - a->fe[0] = NULL; 557 + dvb_frontend_detach(a->fe_adap[0].fe); 558 + a->fe_adap[0].fe = NULL; 559 559 } 560 560 } 561 561 562 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 567 /* Remote control */ ··· 697 697 .num_adapters = 1, 698 698 .adapter = { 699 699 { 700 + .num_frontends = 1, 701 + .fe = {{ 700 702 .frontend_attach = technisat_usb2_frontend_attach, 701 703 702 704 .stream = { ··· 713 711 } 714 712 } 715 713 }, 716 - 714 + }}, 717 715 .size_of_priv = 0, 718 716 }, 719 717 },
+41 -14
drivers/media/dvb/dvb-usb/ttusb2.c
··· 222 222 if (usb_set_interface(adap->dev->udev,0,3) < 0) 223 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 226 deb_info("TDA10086 attach failed\n"); 227 227 return -ENODEV; 228 228 } ··· 234 234 { 235 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 240 240 static int ttusb2_frontend_tda10023_attach(struct dvb_usb_adapter *adap) ··· 242 242 if (usb_set_interface(adap->dev->udev, 0, 3) < 0) 243 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 246 /* FE 0 DVB-C */ 247 - adap->fe[0] = dvb_attach(tda10023_attach, 247 + adap->fe_adap[0].fe = dvb_attach(tda10023_attach, 248 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 251 deb_info("TDA10023 attach failed\n"); 252 252 return -ENODEV; 253 253 } 254 254 } else { 255 - adap->fe[1] = dvb_attach(tda10048_attach, 255 + adap->fe_adap[1].fe = dvb_attach(tda10048_attach, 256 256 &tda10048_config, &adap->dev->i2c_adap); 257 257 258 - if (adap->fe[1] == NULL) { 258 + if (adap->fe_adap[1].fe == NULL) { 259 259 deb_info("TDA10048 attach failed\n"); 260 260 return -ENODEV; 261 261 } 262 262 263 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 273 struct dvb_frontend *fe; 274 274 275 275 /* MFE: select correct FE to attach tuner since that's called twice */ 276 - if (adap->fe[1] == NULL) 277 - fe = adap->fe[0]; 276 + if (adap->fe_adap[1].fe == NULL) 277 + fe = adap->fe_adap[0].fe; 278 278 else 279 - fe = adap->fe[1]; 279 + fe = adap->fe_adap[1].fe; 280 280 281 281 /* attach tuner */ 282 282 if (dvb_attach(tda827x_attach, fe, 0x61, &adap->dev->i2c_adap, &tda827x_config) == NULL) { ··· 288 288 289 289 static 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 292 deb_info("TDA8263 attach failed\n"); 293 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 297 deb_info("LNBP21 attach failed\n"); 298 298 return -ENODEV; 299 299 } ··· 340 340 .num_adapters = 1, 341 341 .adapter = { 342 342 { 343 + .num_frontends = 1, 344 + .fe = {{ 343 345 .streaming_ctrl = NULL, // ttusb2_streaming_ctrl, 344 346 345 347 .frontend_attach = ttusb2_frontend_tda10086_attach, ··· 360 358 } 361 359 } 362 360 } 361 + }}, 363 362 } 364 363 }, 365 364 ··· 395 392 .num_adapters = 1, 396 393 .adapter = { 397 394 { 395 + .num_frontends = 1, 396 + .fe = {{ 398 397 .streaming_ctrl = NULL, 399 398 400 399 .frontend_attach = ttusb2_frontend_tda10086_attach, ··· 415 410 } 416 411 } 417 412 } 413 + }}, 418 414 } 419 415 }, 420 416 ··· 452 446 .num_adapters = 1, 453 447 .adapter = { 454 448 { 449 + .num_frontends = 2, 450 + .fe = {{ 455 451 .streaming_ctrl = NULL, 456 452 457 - .num_frontends = 2, 458 453 .frontend_attach = ttusb2_frontend_tda10023_attach, 459 454 .tuner_attach = ttusb2_tuner_tda827x_attach, 460 455 ··· 472 465 } 473 466 } 474 467 } 468 + },{ 469 + .streaming_ctrl = NULL, 470 + 471 + .frontend_attach = ttusb2_frontend_tda10023_attach, 472 + .tuner_attach = ttusb2_tuner_tda827x_attach, 473 + 474 + /* parameter for the MPEG2-data transfer */ 475 + .stream = { 476 + .type = USB_ISOC, 477 + .count = 5, 478 + .endpoint = 0x02, 479 + .u = { 480 + .isoc = { 481 + .framesperurb = 4, 482 + .framesize = 940, 483 + .interval = 1, 484 + } 485 + } 486 + } 487 + }}, 475 488 }, 476 489 }, 477 490
+5 -3
drivers/media/dvb/dvb-usb/umt-010.c
··· 60 60 umt_config.demod_init = umt_mt352_demod_init; 61 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 65 return 0; 66 66 } 67 67 68 68 static 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 71 return 0; 72 72 } 73 73 ··· 100 100 .num_adapters = 1, 101 101 .adapter = { 102 102 { 103 + .num_frontends = 1, 104 + .fe = {{ 103 105 .streaming_ctrl = dibusb2_0_streaming_ctrl, 104 106 .frontend_attach = umt_mt352_frontend_attach, 105 107 .tuner_attach = umt_tuner_attach, ··· 117 115 } 118 116 } 119 117 }, 120 - 118 + }}, 121 119 .size_of_priv = sizeof(struct dibusb_state), 122 120 } 123 121 },
+4 -1
drivers/media/dvb/dvb-usb/vp702x.c
··· 320 320 321 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 324 vp702x_usb_out_op(adap->dev, SET_TUNER_POWER_REQ, 1, 7, NULL, 0); 325 325 326 326 return 0; ··· 383 383 .num_adapters = 1, 384 384 .adapter = { 385 385 { 386 + .num_frontends = 1, 387 + .fe = {{ 386 388 .caps = DVB_USB_ADAP_RECEIVES_204_BYTE_TS, 387 389 388 390 .streaming_ctrl = vp702x_streaming_ctrl, ··· 401 399 } 402 400 } 403 401 }, 402 + }}, 404 403 .size_of_priv = sizeof(struct vp702x_adapter_state), 405 404 } 406 405 },
+4 -1
drivers/media/dvb/dvb-usb/vp7045.c
··· 214 214 /* Dump the EEPROM */ 215 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 219 return 0; 220 220 } ··· 263 263 .num_adapters = 1, 264 264 .adapter = { 265 265 { 266 + .num_frontends = 1, 267 + .fe = {{ 266 268 .frontend_attach = vp7045_frontend_attach, 267 269 /* parameter for the MPEG2-data transfer */ 268 270 .stream = { ··· 277 275 } 278 276 } 279 277 }, 278 + }}, 280 279 } 281 280 }, 282 281 .power_ctrl = vp7045_power_ctrl,