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