xref: /OK3568_Linux_fs/kernel/drivers/media/usb/dvb-usb/dibusb-mc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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