^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-C/P)
^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) /* USB Driver stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) static struct dvb_usb_device_properties dibusb_mc_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) static int dibusb_mc_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) return dvb_usb_device_init(intf, &dibusb_mc_properties, THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) NULL, adapter_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* do not change the order of the ID table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static struct usb_device_id dibusb_dib3000mc_table [] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /* 00 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3001_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* 01 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3001_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) /* 02 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_USB2_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) /* 03 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_USB2_WARM) }, // ( ? )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /* 04 */ { USB_DEVICE(USB_VID_LITEON, USB_PID_LITEON_DVB_T_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /* 05 */ { USB_DEVICE(USB_VID_LITEON, USB_PID_LITEON_DVB_T_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* 06 */ { USB_DEVICE(USB_VID_EMPIA, USB_PID_DIGIVOX_MINI_SL_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* 07 */ { USB_DEVICE(USB_VID_EMPIA, USB_PID_DIGIVOX_MINI_SL_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* 08 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_GRANDTEC_DVBT_USB2_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /* 09 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_GRANDTEC_DVBT_USB2_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /* 10 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* 11 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* 12 */ { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) /* 13 */ { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* 14 */ { USB_DEVICE(USB_VID_HUMAX_COEX, USB_PID_DVB_T_USB_STICK_HIGH_SPEED_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /* 15 */ { USB_DEVICE(USB_VID_HUMAX_COEX, USB_PID_DVB_T_USB_STICK_HIGH_SPEED_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) { } /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) MODULE_DEVICE_TABLE (usb, dibusb_dib3000mc_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) static struct dvb_usb_device_properties dibusb_mc_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .firmware = "dvb-usb-dibusb-6.0.0.8.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .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 60) .pid_filter_count = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .streaming_ctrl = dibusb2_0_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .pid_filter = dibusb_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .pid_filter_ctrl = dibusb_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) .frontend_attach = dibusb_dib3000mc_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .tuner_attach = dibusb_dib3000mc_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .count = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .endpoint = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .size_of_priv = sizeof(struct dibusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .power_ctrl = dibusb2_0_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .rc.legacy = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .rc_interval = DEFAULT_RC_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .rc_map_table = rc_map_dibusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .rc_map_size = 111, /* FIXME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .rc_query = dibusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .i2c_algo = &dibusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .num_device_descs = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) { "DiBcom USB2.0 DVB-T reference design (MOD3000P)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) { &dibusb_dib3000mc_table[0], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) { &dibusb_dib3000mc_table[1], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) { "Artec T1 USB2.0 TVBOX (please check the warm ID)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) { &dibusb_dib3000mc_table[2], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) { &dibusb_dib3000mc_table[3], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) { "LITE-ON USB2.0 DVB-T Tuner",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /* Also rebranded as Intuix S800, Toshiba */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) { &dibusb_dib3000mc_table[4], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) { &dibusb_dib3000mc_table[5], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) { "MSI Digivox Mini SL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) { &dibusb_dib3000mc_table[6], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) { &dibusb_dib3000mc_table[7], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) { "GRAND - USB2.0 DVB-T adapter",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) { &dibusb_dib3000mc_table[8], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) { &dibusb_dib3000mc_table[9], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) { "Artec T14 - USB2.0 DVB-T",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) { &dibusb_dib3000mc_table[10], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) { &dibusb_dib3000mc_table[11], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) { "Leadtek - USB2.0 Winfast DTV dongle",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) { &dibusb_dib3000mc_table[12], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) { &dibusb_dib3000mc_table[13], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) { "Humax/Coex DVB-T USB Stick 2.0 High Speed",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) { &dibusb_dib3000mc_table[14], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) { &dibusb_dib3000mc_table[15], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static struct usb_driver dibusb_mc_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .name = "dvb_usb_dibusb_mc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .probe = dibusb_mc_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .disconnect = dvb_usb_device_exit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .id_table = dibusb_dib3000mc_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) module_usb_driver(dibusb_mc_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) MODULE_DESCRIPTION("Driver for DiBcom USB2.0 DVB-T (DiB3000M-C/P based) devices");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) MODULE_VERSION("1.0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) MODULE_LICENSE("GPL");