^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* DVB USB compliant linux driver for mobile DVB-T USB devices based on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * reference designs made by DiBcom (http://www.dibcom.fr/) (DiB3000M-B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * based on GPL code from DiBcom, which has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 2004 Amaury Demol for DiBcom
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "dibusb.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static int dib3000mb_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) struct dvb_usb_adapter *adap = fe->dvb->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) return st->ops.tuner_pass_ctrl(fe, enable, st->tuner_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static int dibusb_dib3000mb_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct dib3000_config demod_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) demod_cfg.demod_address = 0x8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) adap->fe_adap[0].fe = dvb_attach(dib3000mb_attach, &demod_cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) &adap->dev->i2c_adap, &st->ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) if ((adap->fe_adap[0].fe) == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) adap->fe_adap[0].fe->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) static int dibusb_thomson_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) st->tuner_addr = 0x61;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, &adap->dev->i2c_adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) DVB_PLL_TUA6010XS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) static int dibusb_panasonic_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) st->tuner_addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60, &adap->dev->i2c_adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) DVB_PLL_TDA665X);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* Some of the Artec 1.1 device aren't equipped with the default tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * (Thomson Cable), but with a Panasonic ENV77H11D5. This function figures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * this out. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) static int dibusb_tuner_probe_and_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) u8 b[2] = { 0,0 }, b2[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct i2c_msg msg[2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) { .flags = 0, .buf = b, .len = 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) { .flags = I2C_M_RD, .buf = b2, .len = 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) /* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) msg[0].addr = msg[1].addr = st->tuner_addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) err("tuner i2c write failed.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) if (b2[0] == 0xfe) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) info("This device has the Thomson Cable onboard. Which is default.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) ret = dibusb_thomson_tuner_attach(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) info("This device has the Panasonic ENV77H11D5 onboard.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) ret = dibusb_panasonic_tuner_attach(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* USB Driver stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) static struct dvb_usb_device_properties dibusb1_1_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) static struct dvb_usb_device_properties dibusb1_1_an2235_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static struct dvb_usb_device_properties dibusb2_0b_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static struct dvb_usb_device_properties artec_t1_usb2_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static int dibusb_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (0 == dvb_usb_device_init(intf, &dibusb1_1_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 0 == dvb_usb_device_init(intf, &dibusb1_1_an2235_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 0 == dvb_usb_device_init(intf, &dibusb2_0b_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 0 == dvb_usb_device_init(intf, &artec_t1_usb2_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) THIS_MODULE, NULL, adapter_nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* do not change the order of the ID table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static struct usb_device_id dibusb_dib3000mb_table [] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* 00 */ { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_AVERMEDIA_DVBT_USB_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /* 01 */ { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_AVERMEDIA_DVBT_USB_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* 02 */ { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_DVBU2000_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /* 03 */ { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_DVBU2000_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /* 04 */ { USB_DEVICE(USB_VID_COMPRO_UNK, USB_PID_COMPRO_DVBU2000_UNK_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* 05 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3000_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) /* 06 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3000_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /* 07 */ { USB_DEVICE(USB_VID_EMPIA, USB_PID_KWORLD_VSTREAM_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* 08 */ { USB_DEVICE(USB_VID_EMPIA, USB_PID_KWORLD_VSTREAM_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /* 09 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_GRANDTEC_DVBT_USB_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /* 10 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_GRANDTEC_DVBT_USB_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) /* 11 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_DIBCOM_MOD3000_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /* 12 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_DIBCOM_MOD3000_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* 13 */ { USB_DEVICE(USB_VID_HYPER_PALTEK, USB_PID_UNK_HYPER_PALTEK_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* 14 */ { USB_DEVICE(USB_VID_HYPER_PALTEK, USB_PID_UNK_HYPER_PALTEK_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* 15 */ { USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TWINHAN_VP7041_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) /* 16 */ { USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TWINHAN_VP7041_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* 17 */ { USB_DEVICE(USB_VID_TWINHAN, USB_PID_TWINHAN_VP7041_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* 18 */ { USB_DEVICE(USB_VID_TWINHAN, USB_PID_TWINHAN_VP7041_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* 19 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* 20 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /* 21 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_AN2235_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* 22 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_AN2235_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* 23 */ { USB_DEVICE(USB_VID_ADSTECH, USB_PID_ADSTECH_USB2_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /* device ID with default DIBUSB2_0-firmware and with the hacked firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* 24 */ { USB_DEVICE(USB_VID_ADSTECH, USB_PID_ADSTECH_USB2_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* 25 */ { USB_DEVICE(USB_VID_KYE, USB_PID_KYE_DVB_T_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /* 26 */ { USB_DEVICE(USB_VID_KYE, USB_PID_KYE_DVB_T_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) /* 27 */ { USB_DEVICE(USB_VID_KWORLD, USB_PID_KWORLD_VSTREAM_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /* 28 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_USB2_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /* 29 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_USB2_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * XXX: As Artec just 'forgot' to program the EEPROM on some Artec T1 devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * we don't catch these faulty IDs (namely 'Cypress FX1 USB controller') that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * have been left on the device. If you don't have such a device but an Artec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * device that's supposed to work with this driver but is not detected by it,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * free to enable CONFIG_DVB_USB_DIBUSB_MB_FAULTY via your kernel config.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) /* 30 */ { USB_DEVICE(USB_VID_ANCHOR, USB_PID_ULTIMA_TVBOX_ANCHOR_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) { } /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) MODULE_DEVICE_TABLE (usb, dibusb_dib3000mb_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static struct dvb_usb_device_properties dibusb1_1_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) .usb_ctrl = CYPRESS_AN2135,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .firmware = "dvb-usb-dibusb-5.0.0.11.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .pid_filter_count = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) .streaming_ctrl = dibusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) .pid_filter = dibusb_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) .pid_filter_ctrl = dibusb_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) .frontend_attach = dibusb_dib3000mb_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) .tuner_attach = dibusb_tuner_probe_and_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) .count = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) .buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) .size_of_priv = sizeof(struct dibusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) .power_ctrl = dibusb_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) .rc.legacy = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .rc_interval = DEFAULT_RC_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) .rc_map_table = rc_map_dibusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) .rc_query = dibusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) .i2c_algo = &dibusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) .num_device_descs = 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) { "AVerMedia AverTV DVBT USB1.1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) { &dibusb_dib3000mb_table[0], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) { &dibusb_dib3000mb_table[1], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) { "Compro Videomate DVB-U2000 - DVB-T USB1.1 (please confirm to linux-dvb)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) { &dibusb_dib3000mb_table[2], &dibusb_dib3000mb_table[4], NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) { &dibusb_dib3000mb_table[3], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) { "DiBcom USB1.1 DVB-T reference design (MOD3000)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) { &dibusb_dib3000mb_table[5], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) { &dibusb_dib3000mb_table[6], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) { "KWorld V-Stream XPERT DTV - DVB-T USB1.1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) { &dibusb_dib3000mb_table[7], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) { &dibusb_dib3000mb_table[8], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) { "Grandtec USB1.1 DVB-T",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) { &dibusb_dib3000mb_table[9], &dibusb_dib3000mb_table[11], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) { &dibusb_dib3000mb_table[10], &dibusb_dib3000mb_table[12], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) { "Unknown USB1.1 DVB-T device ???? please report the name to the author",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) { &dibusb_dib3000mb_table[13], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) { &dibusb_dib3000mb_table[14], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) { "TwinhanDTV USB-Ter USB1.1 / Magic Box I / HAMA USB1.1 DVB-T device",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) { &dibusb_dib3000mb_table[15], &dibusb_dib3000mb_table[17], NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) { &dibusb_dib3000mb_table[16], &dibusb_dib3000mb_table[18], NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) { "Artec T1 USB1.1 TVBOX with AN2135",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) { &dibusb_dib3000mb_table[19], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) { &dibusb_dib3000mb_table[20], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) { "VideoWalker DVB-T USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) { &dibusb_dib3000mb_table[25], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) { &dibusb_dib3000mb_table[26], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) static struct dvb_usb_device_properties dibusb1_1_an2235_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) .usb_ctrl = CYPRESS_AN2235,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) .firmware = "dvb-usb-dibusb-an2235-01.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .caps = DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_ADAP_HAS_PID_FILTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) .pid_filter_count = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) .streaming_ctrl = dibusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) .pid_filter = dibusb_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) .pid_filter_ctrl = dibusb_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) .frontend_attach = dibusb_dib3000mb_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) .tuner_attach = dibusb_tuner_probe_and_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) .count = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) .buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) }},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) .size_of_priv = sizeof(struct dibusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) .power_ctrl = dibusb_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .rc.legacy = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) .rc_interval = DEFAULT_RC_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) .rc_map_table = rc_map_dibusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) .rc_query = dibusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) .i2c_algo = &dibusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) #ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) .num_device_descs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) { "Artec T1 USB1.1 TVBOX with AN2235",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) { &dibusb_dib3000mb_table[21], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) { &dibusb_dib3000mb_table[22], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) #ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) { "Artec T1 USB1.1 TVBOX with AN2235 (faulty USB IDs)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) { &dibusb_dib3000mb_table[30], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) static struct dvb_usb_device_properties dibusb2_0b_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) .firmware = "dvb-usb-adstech-usb2-02.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) .pid_filter_count = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) .streaming_ctrl = dibusb2_0_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) .pid_filter = dibusb_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) .pid_filter_ctrl = dibusb_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) .frontend_attach = dibusb_dib3000mb_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) .tuner_attach = dibusb_thomson_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) .count = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) .endpoint = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) .buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) }},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) .size_of_priv = sizeof(struct dibusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) .power_ctrl = dibusb2_0_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) .rc.legacy = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) .rc_interval = DEFAULT_RC_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) .rc_map_table = rc_map_dibusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) .rc_query = dibusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) .i2c_algo = &dibusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) .num_device_descs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) { "KWorld/ADSTech Instant DVB-T USB2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) { &dibusb_dib3000mb_table[23], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) { &dibusb_dib3000mb_table[24], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) { "KWorld Xpert DVB-T USB2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) { &dibusb_dib3000mb_table[27], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) { NULL }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) static struct dvb_usb_device_properties artec_t1_usb2_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) .firmware = "dvb-usb-dibusb-6.0.0.8.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) .pid_filter_count = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) .streaming_ctrl = dibusb2_0_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) .pid_filter = dibusb_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) .pid_filter_ctrl = dibusb_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) .frontend_attach = dibusb_dib3000mb_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) .tuner_attach = dibusb_tuner_probe_and_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) .count = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) .endpoint = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) .buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) .size_of_priv = sizeof(struct dibusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) .power_ctrl = dibusb2_0_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) .rc.legacy = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) .rc_interval = DEFAULT_RC_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) .rc_map_table = rc_map_dibusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) .rc_query = dibusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) .i2c_algo = &dibusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) { "Artec T1 USB2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) { &dibusb_dib3000mb_table[28], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) { &dibusb_dib3000mb_table[29], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) static struct usb_driver dibusb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) .name = "dvb_usb_dibusb_mb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) .probe = dibusb_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) .disconnect = dvb_usb_device_exit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) .id_table = dibusb_dib3000mb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) module_usb_driver(dibusb_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) MODULE_DESCRIPTION("Driver for DiBcom USB DVB-T devices (DiB3000M-B based)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) MODULE_VERSION("1.0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) MODULE_LICENSE("GPL");