162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* DVB USB compliant linux driver for mobile DVB-T USB devices based on 362306a36Sopenharmony_ci * reference designs made by DiBcom (http://www.dibcom.fr/) (DiB3000M-B) 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de) 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * based on GPL code from DiBcom, which has 862306a36Sopenharmony_ci * Copyright (C) 2004 Amaury Demol for DiBcom 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci#include "dibusb.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ciDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic int dib3000mb_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci struct dvb_usb_adapter *adap = fe->dvb->priv; 1962306a36Sopenharmony_ci struct dibusb_state *st = adap->priv; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci return st->ops.tuner_pass_ctrl(fe, enable, st->tuner_addr); 2262306a36Sopenharmony_ci} 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic int dibusb_dib3000mb_frontend_attach(struct dvb_usb_adapter *adap) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci struct dib3000_config demod_cfg; 2762306a36Sopenharmony_ci struct dibusb_state *st = adap->priv; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci demod_cfg.demod_address = 0x8; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci adap->fe_adap[0].fe = dvb_attach(dib3000mb_attach, &demod_cfg, 3262306a36Sopenharmony_ci &adap->dev->i2c_adap, &st->ops); 3362306a36Sopenharmony_ci if ((adap->fe_adap[0].fe) == NULL) 3462306a36Sopenharmony_ci return -ENODEV; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci adap->fe_adap[0].fe->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci return 0; 3962306a36Sopenharmony_ci} 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic int dibusb_thomson_tuner_attach(struct dvb_usb_adapter *adap) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci struct dibusb_state *st = adap->priv; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci st->tuner_addr = 0x61; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, &adap->dev->i2c_adap, 4862306a36Sopenharmony_ci DVB_PLL_TUA6010XS); 4962306a36Sopenharmony_ci return 0; 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic int dibusb_panasonic_tuner_attach(struct dvb_usb_adapter *adap) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci struct dibusb_state *st = adap->priv; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci st->tuner_addr = 0x60; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60, &adap->dev->i2c_adap, 5962306a36Sopenharmony_ci DVB_PLL_TDA665X); 6062306a36Sopenharmony_ci return 0; 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* Some of the Artec 1.1 device aren't equipped with the default tuner 6462306a36Sopenharmony_ci * (Thomson Cable), but with a Panasonic ENV77H11D5. This function figures 6562306a36Sopenharmony_ci * this out. */ 6662306a36Sopenharmony_cistatic int dibusb_tuner_probe_and_attach(struct dvb_usb_adapter *adap) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci u8 b[2] = { 0,0 }, b2[1]; 6962306a36Sopenharmony_ci int ret = 0; 7062306a36Sopenharmony_ci struct i2c_msg msg[2] = { 7162306a36Sopenharmony_ci { .flags = 0, .buf = b, .len = 2 }, 7262306a36Sopenharmony_ci { .flags = I2C_M_RD, .buf = b2, .len = 1 }, 7362306a36Sopenharmony_ci }; 7462306a36Sopenharmony_ci struct dibusb_state *st = adap->priv; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci /* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */ 7762306a36Sopenharmony_ci msg[0].addr = msg[1].addr = st->tuner_addr = 0x60; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl) 8062306a36Sopenharmony_ci adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe, 1); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) { 8362306a36Sopenharmony_ci err("tuner i2c write failed."); 8462306a36Sopenharmony_ci return -EREMOTEIO; 8562306a36Sopenharmony_ci } 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl) 8862306a36Sopenharmony_ci adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe, 0); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci if (b2[0] == 0xfe) { 9162306a36Sopenharmony_ci info("This device has the Thomson Cable onboard. Which is default."); 9262306a36Sopenharmony_ci ret = dibusb_thomson_tuner_attach(adap); 9362306a36Sopenharmony_ci } else { 9462306a36Sopenharmony_ci info("This device has the Panasonic ENV77H11D5 onboard."); 9562306a36Sopenharmony_ci ret = dibusb_panasonic_tuner_attach(adap); 9662306a36Sopenharmony_ci } 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci return ret; 9962306a36Sopenharmony_ci} 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* USB Driver stuff */ 10262306a36Sopenharmony_cistatic struct dvb_usb_device_properties dibusb1_1_properties; 10362306a36Sopenharmony_cistatic struct dvb_usb_device_properties dibusb1_1_an2235_properties; 10462306a36Sopenharmony_cistatic struct dvb_usb_device_properties dibusb2_0b_properties; 10562306a36Sopenharmony_cistatic struct dvb_usb_device_properties artec_t1_usb2_properties; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic int dibusb_probe(struct usb_interface *intf, 10862306a36Sopenharmony_ci const struct usb_device_id *id) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci if (0 == dvb_usb_device_init(intf, &dibusb1_1_properties, 11162306a36Sopenharmony_ci THIS_MODULE, NULL, adapter_nr) || 11262306a36Sopenharmony_ci 0 == dvb_usb_device_init(intf, &dibusb1_1_an2235_properties, 11362306a36Sopenharmony_ci THIS_MODULE, NULL, adapter_nr) || 11462306a36Sopenharmony_ci 0 == dvb_usb_device_init(intf, &dibusb2_0b_properties, 11562306a36Sopenharmony_ci THIS_MODULE, NULL, adapter_nr) || 11662306a36Sopenharmony_ci 0 == dvb_usb_device_init(intf, &artec_t1_usb2_properties, 11762306a36Sopenharmony_ci THIS_MODULE, NULL, adapter_nr)) 11862306a36Sopenharmony_ci return 0; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci return -EINVAL; 12162306a36Sopenharmony_ci} 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci/* do not change the order of the ID table */ 12462306a36Sopenharmony_cienum { 12562306a36Sopenharmony_ci WIDEVIEW_DVBT_USB_COLD, 12662306a36Sopenharmony_ci WIDEVIEW_DVBT_USB_WARM, 12762306a36Sopenharmony_ci COMPRO_DVBU2000_COLD, 12862306a36Sopenharmony_ci COMPRO_DVBU2000_WARM, 12962306a36Sopenharmony_ci COMPRO_DVBU2000_UNK_COLD, 13062306a36Sopenharmony_ci DIBCOM_MOD3000_COLD, 13162306a36Sopenharmony_ci DIBCOM_MOD3000_WARM, 13262306a36Sopenharmony_ci EMPIA_VSTREAM_COLD, 13362306a36Sopenharmony_ci EMPIA_VSTREAM_WARM, 13462306a36Sopenharmony_ci GRANDTEC_DVBT_USB_COLD, 13562306a36Sopenharmony_ci GRANDTEC_DVBT_USB_WARM, 13662306a36Sopenharmony_ci GRANDTEC_MOD3000_COLD, 13762306a36Sopenharmony_ci GRANDTEC_MOD3000_WARM, 13862306a36Sopenharmony_ci UNK_HYPER_PALTEK_COLD, 13962306a36Sopenharmony_ci UNK_HYPER_PALTEK_WARM, 14062306a36Sopenharmony_ci VISIONPLUS_VP7041_COLD, 14162306a36Sopenharmony_ci VISIONPLUS_VP7041_WARM, 14262306a36Sopenharmony_ci TWINHAN_VP7041_COLD, 14362306a36Sopenharmony_ci TWINHAN_VP7041_WARM, 14462306a36Sopenharmony_ci ULTIMA_TVBOX_COLD, 14562306a36Sopenharmony_ci ULTIMA_TVBOX_WARM, 14662306a36Sopenharmony_ci ULTIMA_TVBOX_AN2235_COLD, 14762306a36Sopenharmony_ci ULTIMA_TVBOX_AN2235_WARM, 14862306a36Sopenharmony_ci ADSTECH_USB2_COLD, 14962306a36Sopenharmony_ci ADSTECH_USB2_WARM, 15062306a36Sopenharmony_ci KYE_DVB_T_COLD, 15162306a36Sopenharmony_ci KYE_DVB_T_WARM, 15262306a36Sopenharmony_ci KWORLD_VSTREAM_COLD, 15362306a36Sopenharmony_ci ULTIMA_TVBOX_USB2_COLD, 15462306a36Sopenharmony_ci ULTIMA_TVBOX_USB2_WARM, 15562306a36Sopenharmony_ci ULTIMA_TVBOX_ANCHOR_COLD, 15662306a36Sopenharmony_ci}; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cistatic struct usb_device_id dibusb_dib3000mb_table[] = { 15962306a36Sopenharmony_ci DVB_USB_DEV(WIDEVIEW, WIDEVIEW_DVBT_USB_COLD), 16062306a36Sopenharmony_ci DVB_USB_DEV(WIDEVIEW, WIDEVIEW_DVBT_USB_WARM), 16162306a36Sopenharmony_ci DVB_USB_DEV(COMPRO, COMPRO_DVBU2000_COLD), 16262306a36Sopenharmony_ci DVB_USB_DEV(COMPRO, COMPRO_DVBU2000_WARM), 16362306a36Sopenharmony_ci DVB_USB_DEV(COMPRO_UNK, COMPRO_DVBU2000_UNK_COLD), 16462306a36Sopenharmony_ci DVB_USB_DEV(DIBCOM, DIBCOM_MOD3000_COLD), 16562306a36Sopenharmony_ci DVB_USB_DEV(DIBCOM, DIBCOM_MOD3000_WARM), 16662306a36Sopenharmony_ci DVB_USB_DEV(EMPIA, EMPIA_VSTREAM_COLD), 16762306a36Sopenharmony_ci DVB_USB_DEV(EMPIA, EMPIA_VSTREAM_WARM), 16862306a36Sopenharmony_ci DVB_USB_DEV(GRANDTEC, GRANDTEC_DVBT_USB_COLD), 16962306a36Sopenharmony_ci DVB_USB_DEV(GRANDTEC, GRANDTEC_DVBT_USB_WARM), 17062306a36Sopenharmony_ci DVB_USB_DEV(GRANDTEC, GRANDTEC_MOD3000_COLD), 17162306a36Sopenharmony_ci DVB_USB_DEV(GRANDTEC, GRANDTEC_MOD3000_WARM), 17262306a36Sopenharmony_ci DVB_USB_DEV(HYPER_PALTEK, UNK_HYPER_PALTEK_COLD), 17362306a36Sopenharmony_ci DVB_USB_DEV(HYPER_PALTEK, UNK_HYPER_PALTEK_WARM), 17462306a36Sopenharmony_ci DVB_USB_DEV(VISIONPLUS, VISIONPLUS_VP7041_COLD), 17562306a36Sopenharmony_ci DVB_USB_DEV(VISIONPLUS, VISIONPLUS_VP7041_WARM), 17662306a36Sopenharmony_ci DVB_USB_DEV(TWINHAN, TWINHAN_VP7041_COLD), 17762306a36Sopenharmony_ci DVB_USB_DEV(TWINHAN, TWINHAN_VP7041_WARM), 17862306a36Sopenharmony_ci DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_TVBOX_COLD), 17962306a36Sopenharmony_ci DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_TVBOX_WARM), 18062306a36Sopenharmony_ci DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_TVBOX_AN2235_COLD), 18162306a36Sopenharmony_ci DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_TVBOX_AN2235_WARM), 18262306a36Sopenharmony_ci DVB_USB_DEV(ADSTECH, ADSTECH_USB2_COLD), 18362306a36Sopenharmony_ci DVB_USB_DEV(ADSTECH, ADSTECH_USB2_WARM), 18462306a36Sopenharmony_ci DVB_USB_DEV(KYE, KYE_DVB_T_COLD), 18562306a36Sopenharmony_ci DVB_USB_DEV(KYE, KYE_DVB_T_WARM), 18662306a36Sopenharmony_ci DVB_USB_DEV(KWORLD, KWORLD_VSTREAM_COLD), 18762306a36Sopenharmony_ci DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_TVBOX_USB2_COLD), 18862306a36Sopenharmony_ci DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_TVBOX_USB2_WARM), 18962306a36Sopenharmony_ci#ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY 19062306a36Sopenharmony_ci DVB_USB_DEV(ANCHOR, ULTIMA_TVBOX_ANCHOR_COLD), 19162306a36Sopenharmony_ci#endif 19262306a36Sopenharmony_ci { } 19362306a36Sopenharmony_ci}; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ciMODULE_DEVICE_TABLE (usb, dibusb_dib3000mb_table); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistatic struct dvb_usb_device_properties dibusb1_1_properties = { 19862306a36Sopenharmony_ci .caps = DVB_USB_IS_AN_I2C_ADAPTER, 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci .usb_ctrl = CYPRESS_AN2135, 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci .firmware = "dvb-usb-dibusb-5.0.0.11.fw", 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci .num_adapters = 1, 20562306a36Sopenharmony_ci .adapter = { 20662306a36Sopenharmony_ci { 20762306a36Sopenharmony_ci .num_frontends = 1, 20862306a36Sopenharmony_ci .fe = {{ 20962306a36Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 21062306a36Sopenharmony_ci .pid_filter_count = 16, 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci .streaming_ctrl = dibusb_streaming_ctrl, 21362306a36Sopenharmony_ci .pid_filter = dibusb_pid_filter, 21462306a36Sopenharmony_ci .pid_filter_ctrl = dibusb_pid_filter_ctrl, 21562306a36Sopenharmony_ci .frontend_attach = dibusb_dib3000mb_frontend_attach, 21662306a36Sopenharmony_ci .tuner_attach = dibusb_tuner_probe_and_attach, 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci /* parameter for the MPEG2-data transfer */ 21962306a36Sopenharmony_ci .stream = { 22062306a36Sopenharmony_ci .type = USB_BULK, 22162306a36Sopenharmony_ci .count = 7, 22262306a36Sopenharmony_ci .endpoint = 0x02, 22362306a36Sopenharmony_ci .u = { 22462306a36Sopenharmony_ci .bulk = { 22562306a36Sopenharmony_ci .buffersize = 4096, 22662306a36Sopenharmony_ci } 22762306a36Sopenharmony_ci } 22862306a36Sopenharmony_ci }, 22962306a36Sopenharmony_ci }}, 23062306a36Sopenharmony_ci .size_of_priv = sizeof(struct dibusb_state), 23162306a36Sopenharmony_ci } 23262306a36Sopenharmony_ci }, 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci .power_ctrl = dibusb_power_ctrl, 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci .rc.legacy = { 23762306a36Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 23862306a36Sopenharmony_ci .rc_map_table = rc_map_dibusb_table, 23962306a36Sopenharmony_ci .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */ 24062306a36Sopenharmony_ci .rc_query = dibusb_rc_query, 24162306a36Sopenharmony_ci }, 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci .i2c_algo = &dibusb_i2c_algo, 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci .generic_bulk_ctrl_endpoint = 0x01, 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci .num_device_descs = 9, 24862306a36Sopenharmony_ci .devices = { 24962306a36Sopenharmony_ci { "AVerMedia AverTV DVBT USB1.1", 25062306a36Sopenharmony_ci { &dibusb_dib3000mb_table[WIDEVIEW_DVBT_USB_COLD], NULL }, 25162306a36Sopenharmony_ci { &dibusb_dib3000mb_table[WIDEVIEW_DVBT_USB_WARM], NULL }, 25262306a36Sopenharmony_ci }, 25362306a36Sopenharmony_ci { "Compro Videomate DVB-U2000 - DVB-T USB1.1 (please confirm to linux-dvb)", 25462306a36Sopenharmony_ci { &dibusb_dib3000mb_table[COMPRO_DVBU2000_COLD], &dibusb_dib3000mb_table[COMPRO_DVBU2000_UNK_COLD], NULL}, 25562306a36Sopenharmony_ci { &dibusb_dib3000mb_table[COMPRO_DVBU2000_WARM], NULL }, 25662306a36Sopenharmony_ci }, 25762306a36Sopenharmony_ci { "DiBcom USB1.1 DVB-T reference design (MOD3000)", 25862306a36Sopenharmony_ci { &dibusb_dib3000mb_table[DIBCOM_MOD3000_COLD], NULL }, 25962306a36Sopenharmony_ci { &dibusb_dib3000mb_table[DIBCOM_MOD3000_WARM], NULL }, 26062306a36Sopenharmony_ci }, 26162306a36Sopenharmony_ci { "KWorld V-Stream XPERT DTV - DVB-T USB1.1", 26262306a36Sopenharmony_ci { &dibusb_dib3000mb_table[EMPIA_VSTREAM_COLD], NULL }, 26362306a36Sopenharmony_ci { &dibusb_dib3000mb_table[EMPIA_VSTREAM_WARM], NULL }, 26462306a36Sopenharmony_ci }, 26562306a36Sopenharmony_ci { "Grandtec USB1.1 DVB-T", 26662306a36Sopenharmony_ci { &dibusb_dib3000mb_table[GRANDTEC_DVBT_USB_COLD], &dibusb_dib3000mb_table[GRANDTEC_MOD3000_COLD], NULL }, 26762306a36Sopenharmony_ci { &dibusb_dib3000mb_table[GRANDTEC_DVBT_USB_WARM], &dibusb_dib3000mb_table[GRANDTEC_MOD3000_WARM], NULL }, 26862306a36Sopenharmony_ci }, 26962306a36Sopenharmony_ci { "Unknown USB1.1 DVB-T device ???? please report the name to the author", 27062306a36Sopenharmony_ci { &dibusb_dib3000mb_table[UNK_HYPER_PALTEK_COLD], NULL }, 27162306a36Sopenharmony_ci { &dibusb_dib3000mb_table[UNK_HYPER_PALTEK_WARM], NULL }, 27262306a36Sopenharmony_ci }, 27362306a36Sopenharmony_ci { "TwinhanDTV USB-Ter USB1.1 / Magic Box I / HAMA USB1.1 DVB-T device", 27462306a36Sopenharmony_ci { &dibusb_dib3000mb_table[VISIONPLUS_VP7041_COLD], &dibusb_dib3000mb_table[TWINHAN_VP7041_COLD], NULL}, 27562306a36Sopenharmony_ci { &dibusb_dib3000mb_table[VISIONPLUS_VP7041_WARM], &dibusb_dib3000mb_table[TWINHAN_VP7041_WARM], NULL}, 27662306a36Sopenharmony_ci }, 27762306a36Sopenharmony_ci { "Artec T1 USB1.1 TVBOX with AN2135", 27862306a36Sopenharmony_ci { &dibusb_dib3000mb_table[ULTIMA_TVBOX_COLD], NULL }, 27962306a36Sopenharmony_ci { &dibusb_dib3000mb_table[ULTIMA_TVBOX_WARM], NULL }, 28062306a36Sopenharmony_ci }, 28162306a36Sopenharmony_ci { "VideoWalker DVB-T USB", 28262306a36Sopenharmony_ci { &dibusb_dib3000mb_table[KYE_DVB_T_COLD], NULL }, 28362306a36Sopenharmony_ci { &dibusb_dib3000mb_table[KYE_DVB_T_WARM], NULL }, 28462306a36Sopenharmony_ci }, 28562306a36Sopenharmony_ci } 28662306a36Sopenharmony_ci}; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cistatic struct dvb_usb_device_properties dibusb1_1_an2235_properties = { 28962306a36Sopenharmony_ci .caps = DVB_USB_IS_AN_I2C_ADAPTER, 29062306a36Sopenharmony_ci .usb_ctrl = CYPRESS_AN2235, 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci .firmware = "dvb-usb-dibusb-an2235-01.fw", 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci .num_adapters = 1, 29562306a36Sopenharmony_ci .adapter = { 29662306a36Sopenharmony_ci { 29762306a36Sopenharmony_ci .num_frontends = 1, 29862306a36Sopenharmony_ci .fe = {{ 29962306a36Sopenharmony_ci .caps = DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_ADAP_HAS_PID_FILTER, 30062306a36Sopenharmony_ci .pid_filter_count = 16, 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci .streaming_ctrl = dibusb_streaming_ctrl, 30362306a36Sopenharmony_ci .pid_filter = dibusb_pid_filter, 30462306a36Sopenharmony_ci .pid_filter_ctrl = dibusb_pid_filter_ctrl, 30562306a36Sopenharmony_ci .frontend_attach = dibusb_dib3000mb_frontend_attach, 30662306a36Sopenharmony_ci .tuner_attach = dibusb_tuner_probe_and_attach, 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci /* parameter for the MPEG2-data transfer */ 30962306a36Sopenharmony_ci .stream = { 31062306a36Sopenharmony_ci .type = USB_BULK, 31162306a36Sopenharmony_ci .count = 7, 31262306a36Sopenharmony_ci .endpoint = 0x02, 31362306a36Sopenharmony_ci .u = { 31462306a36Sopenharmony_ci .bulk = { 31562306a36Sopenharmony_ci .buffersize = 4096, 31662306a36Sopenharmony_ci } 31762306a36Sopenharmony_ci } 31862306a36Sopenharmony_ci }, 31962306a36Sopenharmony_ci }}, 32062306a36Sopenharmony_ci .size_of_priv = sizeof(struct dibusb_state), 32162306a36Sopenharmony_ci }, 32262306a36Sopenharmony_ci }, 32362306a36Sopenharmony_ci .power_ctrl = dibusb_power_ctrl, 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci .rc.legacy = { 32662306a36Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 32762306a36Sopenharmony_ci .rc_map_table = rc_map_dibusb_table, 32862306a36Sopenharmony_ci .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */ 32962306a36Sopenharmony_ci .rc_query = dibusb_rc_query, 33062306a36Sopenharmony_ci }, 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci .i2c_algo = &dibusb_i2c_algo, 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci .generic_bulk_ctrl_endpoint = 0x01, 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci#ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY 33762306a36Sopenharmony_ci .num_device_descs = 2, 33862306a36Sopenharmony_ci#else 33962306a36Sopenharmony_ci .num_device_descs = 1, 34062306a36Sopenharmony_ci#endif 34162306a36Sopenharmony_ci .devices = { 34262306a36Sopenharmony_ci { "Artec T1 USB1.1 TVBOX with AN2235", 34362306a36Sopenharmony_ci { &dibusb_dib3000mb_table[ULTIMA_TVBOX_AN2235_COLD], NULL }, 34462306a36Sopenharmony_ci { &dibusb_dib3000mb_table[ULTIMA_TVBOX_AN2235_WARM], NULL }, 34562306a36Sopenharmony_ci }, 34662306a36Sopenharmony_ci#ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY 34762306a36Sopenharmony_ci { "Artec T1 USB1.1 TVBOX with AN2235 (faulty USB IDs)", 34862306a36Sopenharmony_ci { &dibusb_dib3000mb_table[ULTIMA_TVBOX_ANCHOR_COLD], NULL }, 34962306a36Sopenharmony_ci { NULL }, 35062306a36Sopenharmony_ci }, 35162306a36Sopenharmony_ci { NULL }, 35262306a36Sopenharmony_ci#endif 35362306a36Sopenharmony_ci } 35462306a36Sopenharmony_ci}; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_cistatic struct dvb_usb_device_properties dibusb2_0b_properties = { 35762306a36Sopenharmony_ci .caps = DVB_USB_IS_AN_I2C_ADAPTER, 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci .usb_ctrl = CYPRESS_FX2, 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci .firmware = "dvb-usb-adstech-usb2-02.fw", 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci .num_adapters = 1, 36462306a36Sopenharmony_ci .adapter = { 36562306a36Sopenharmony_ci { 36662306a36Sopenharmony_ci .num_frontends = 1, 36762306a36Sopenharmony_ci .fe = {{ 36862306a36Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 36962306a36Sopenharmony_ci .pid_filter_count = 16, 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci .streaming_ctrl = dibusb2_0_streaming_ctrl, 37262306a36Sopenharmony_ci .pid_filter = dibusb_pid_filter, 37362306a36Sopenharmony_ci .pid_filter_ctrl = dibusb_pid_filter_ctrl, 37462306a36Sopenharmony_ci .frontend_attach = dibusb_dib3000mb_frontend_attach, 37562306a36Sopenharmony_ci .tuner_attach = dibusb_thomson_tuner_attach, 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci /* parameter for the MPEG2-data transfer */ 37862306a36Sopenharmony_ci .stream = { 37962306a36Sopenharmony_ci .type = USB_BULK, 38062306a36Sopenharmony_ci .count = 7, 38162306a36Sopenharmony_ci .endpoint = 0x06, 38262306a36Sopenharmony_ci .u = { 38362306a36Sopenharmony_ci .bulk = { 38462306a36Sopenharmony_ci .buffersize = 4096, 38562306a36Sopenharmony_ci } 38662306a36Sopenharmony_ci } 38762306a36Sopenharmony_ci }, 38862306a36Sopenharmony_ci }}, 38962306a36Sopenharmony_ci .size_of_priv = sizeof(struct dibusb_state), 39062306a36Sopenharmony_ci } 39162306a36Sopenharmony_ci }, 39262306a36Sopenharmony_ci .power_ctrl = dibusb2_0_power_ctrl, 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci .rc.legacy = { 39562306a36Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 39662306a36Sopenharmony_ci .rc_map_table = rc_map_dibusb_table, 39762306a36Sopenharmony_ci .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */ 39862306a36Sopenharmony_ci .rc_query = dibusb_rc_query, 39962306a36Sopenharmony_ci }, 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci .i2c_algo = &dibusb_i2c_algo, 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci .generic_bulk_ctrl_endpoint = 0x01, 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci .num_device_descs = 2, 40662306a36Sopenharmony_ci .devices = { 40762306a36Sopenharmony_ci { "KWorld/ADSTech Instant DVB-T USB2.0", 40862306a36Sopenharmony_ci { &dibusb_dib3000mb_table[ADSTECH_USB2_COLD], NULL }, 40962306a36Sopenharmony_ci { &dibusb_dib3000mb_table[ADSTECH_USB2_WARM], NULL }, 41062306a36Sopenharmony_ci }, 41162306a36Sopenharmony_ci { "KWorld Xpert DVB-T USB2.0", 41262306a36Sopenharmony_ci { &dibusb_dib3000mb_table[KWORLD_VSTREAM_COLD], NULL }, 41362306a36Sopenharmony_ci { NULL } 41462306a36Sopenharmony_ci }, 41562306a36Sopenharmony_ci { NULL }, 41662306a36Sopenharmony_ci } 41762306a36Sopenharmony_ci}; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_cistatic struct dvb_usb_device_properties artec_t1_usb2_properties = { 42062306a36Sopenharmony_ci .caps = DVB_USB_IS_AN_I2C_ADAPTER, 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci .usb_ctrl = CYPRESS_FX2, 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci .firmware = "dvb-usb-dibusb-6.0.0.8.fw", 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci .num_adapters = 1, 42762306a36Sopenharmony_ci .adapter = { 42862306a36Sopenharmony_ci { 42962306a36Sopenharmony_ci .num_frontends = 1, 43062306a36Sopenharmony_ci .fe = {{ 43162306a36Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 43262306a36Sopenharmony_ci .pid_filter_count = 16, 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci .streaming_ctrl = dibusb2_0_streaming_ctrl, 43562306a36Sopenharmony_ci .pid_filter = dibusb_pid_filter, 43662306a36Sopenharmony_ci .pid_filter_ctrl = dibusb_pid_filter_ctrl, 43762306a36Sopenharmony_ci .frontend_attach = dibusb_dib3000mb_frontend_attach, 43862306a36Sopenharmony_ci .tuner_attach = dibusb_tuner_probe_and_attach, 43962306a36Sopenharmony_ci /* parameter for the MPEG2-data transfer */ 44062306a36Sopenharmony_ci .stream = { 44162306a36Sopenharmony_ci .type = USB_BULK, 44262306a36Sopenharmony_ci .count = 7, 44362306a36Sopenharmony_ci .endpoint = 0x06, 44462306a36Sopenharmony_ci .u = { 44562306a36Sopenharmony_ci .bulk = { 44662306a36Sopenharmony_ci .buffersize = 4096, 44762306a36Sopenharmony_ci } 44862306a36Sopenharmony_ci } 44962306a36Sopenharmony_ci }, 45062306a36Sopenharmony_ci }}, 45162306a36Sopenharmony_ci .size_of_priv = sizeof(struct dibusb_state), 45262306a36Sopenharmony_ci } 45362306a36Sopenharmony_ci }, 45462306a36Sopenharmony_ci .power_ctrl = dibusb2_0_power_ctrl, 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci .rc.legacy = { 45762306a36Sopenharmony_ci .rc_interval = DEFAULT_RC_INTERVAL, 45862306a36Sopenharmony_ci .rc_map_table = rc_map_dibusb_table, 45962306a36Sopenharmony_ci .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */ 46062306a36Sopenharmony_ci .rc_query = dibusb_rc_query, 46162306a36Sopenharmony_ci }, 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci .i2c_algo = &dibusb_i2c_algo, 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci .generic_bulk_ctrl_endpoint = 0x01, 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci .num_device_descs = 1, 46862306a36Sopenharmony_ci .devices = { 46962306a36Sopenharmony_ci { "Artec T1 USB2.0", 47062306a36Sopenharmony_ci { &dibusb_dib3000mb_table[ULTIMA_TVBOX_USB2_COLD], NULL }, 47162306a36Sopenharmony_ci { &dibusb_dib3000mb_table[ULTIMA_TVBOX_USB2_WARM], NULL }, 47262306a36Sopenharmony_ci }, 47362306a36Sopenharmony_ci { NULL }, 47462306a36Sopenharmony_ci } 47562306a36Sopenharmony_ci}; 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_cistatic struct usb_driver dibusb_driver = { 47862306a36Sopenharmony_ci .name = "dvb_usb_dibusb_mb", 47962306a36Sopenharmony_ci .probe = dibusb_probe, 48062306a36Sopenharmony_ci .disconnect = dvb_usb_device_exit, 48162306a36Sopenharmony_ci .id_table = dibusb_dib3000mb_table, 48262306a36Sopenharmony_ci}; 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_cimodule_usb_driver(dibusb_driver); 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ciMODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>"); 48762306a36Sopenharmony_ciMODULE_DESCRIPTION("Driver for DiBcom USB DVB-T devices (DiB3000M-B based)"); 48862306a36Sopenharmony_ciMODULE_VERSION("1.0"); 48962306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 490