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-C/P)
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_ci/* USB Driver stuff */
1762306a36Sopenharmony_cistatic struct dvb_usb_device_properties dibusb_mc_properties;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic int dibusb_mc_probe(struct usb_interface *intf,
2062306a36Sopenharmony_ci		const struct usb_device_id *id)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	return dvb_usb_device_init(intf, &dibusb_mc_properties, THIS_MODULE,
2362306a36Sopenharmony_ci				   NULL, adapter_nr);
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/* do not change the order of the ID table */
2762306a36Sopenharmony_cienum {
2862306a36Sopenharmony_ci	DIBCOM_MOD3001_COLD,
2962306a36Sopenharmony_ci	DIBCOM_MOD3001_WARM,
3062306a36Sopenharmony_ci	ULTIMA_TVBOX_USB2_COLD,
3162306a36Sopenharmony_ci	ULTIMA_TVBOX_USB2_WARM,
3262306a36Sopenharmony_ci	LITEON_DVB_T_COLD,
3362306a36Sopenharmony_ci	LITEON_DVB_T_WARM,
3462306a36Sopenharmony_ci	EMPIA_DIGIVOX_MINI_SL_COLD,
3562306a36Sopenharmony_ci	EMPIA_DIGIVOX_MINI_SL_WARM,
3662306a36Sopenharmony_ci	GRANDTEC_DVBT_USB2_COLD,
3762306a36Sopenharmony_ci	GRANDTEC_DVBT_USB2_WARM,
3862306a36Sopenharmony_ci	ULTIMA_ARTEC_T14_COLD,
3962306a36Sopenharmony_ci	ULTIMA_ARTEC_T14_WARM,
4062306a36Sopenharmony_ci	LEADTEK_WINFAST_DTV_DONGLE_COLD,
4162306a36Sopenharmony_ci	LEADTEK_WINFAST_DTV_DONGLE_WARM,
4262306a36Sopenharmony_ci	HUMAX_DVB_T_STICK_HIGH_SPEED_COLD,
4362306a36Sopenharmony_ci	HUMAX_DVB_T_STICK_HIGH_SPEED_WARM,
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic struct usb_device_id dibusb_dib3000mc_table[] = {
4762306a36Sopenharmony_ci	DVB_USB_DEV(DIBCOM, DIBCOM_MOD3001_COLD),
4862306a36Sopenharmony_ci	DVB_USB_DEV(DIBCOM, DIBCOM_MOD3001_WARM),
4962306a36Sopenharmony_ci	DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_TVBOX_USB2_COLD),
5062306a36Sopenharmony_ci	DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_TVBOX_USB2_WARM),
5162306a36Sopenharmony_ci	DVB_USB_DEV(LITEON, LITEON_DVB_T_COLD),
5262306a36Sopenharmony_ci	DVB_USB_DEV(LITEON, LITEON_DVB_T_WARM),
5362306a36Sopenharmony_ci	DVB_USB_DEV(EMPIA, EMPIA_DIGIVOX_MINI_SL_COLD),
5462306a36Sopenharmony_ci	DVB_USB_DEV(EMPIA, EMPIA_DIGIVOX_MINI_SL_WARM),
5562306a36Sopenharmony_ci	DVB_USB_DEV(GRANDTEC, GRANDTEC_DVBT_USB2_COLD),
5662306a36Sopenharmony_ci	DVB_USB_DEV(GRANDTEC, GRANDTEC_DVBT_USB2_WARM),
5762306a36Sopenharmony_ci	DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_ARTEC_T14_COLD),
5862306a36Sopenharmony_ci	DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_ARTEC_T14_WARM),
5962306a36Sopenharmony_ci	DVB_USB_DEV(LEADTEK, LEADTEK_WINFAST_DTV_DONGLE_COLD),
6062306a36Sopenharmony_ci	DVB_USB_DEV(LEADTEK, LEADTEK_WINFAST_DTV_DONGLE_WARM),
6162306a36Sopenharmony_ci	DVB_USB_DEV(HUMAX_COEX, HUMAX_DVB_T_STICK_HIGH_SPEED_COLD),
6262306a36Sopenharmony_ci	DVB_USB_DEV(HUMAX_COEX, HUMAX_DVB_T_STICK_HIGH_SPEED_WARM),
6362306a36Sopenharmony_ci	{ }
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ciMODULE_DEVICE_TABLE (usb, dibusb_dib3000mc_table);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistatic struct dvb_usb_device_properties dibusb_mc_properties = {
6962306a36Sopenharmony_ci	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	.usb_ctrl = CYPRESS_FX2,
7262306a36Sopenharmony_ci	.firmware = "dvb-usb-dibusb-6.0.0.8.fw",
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	.num_adapters = 1,
7562306a36Sopenharmony_ci	.adapter = {
7662306a36Sopenharmony_ci		{
7762306a36Sopenharmony_ci		.num_frontends = 1,
7862306a36Sopenharmony_ci		.fe = {{
7962306a36Sopenharmony_ci			.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
8062306a36Sopenharmony_ci			.pid_filter_count = 32,
8162306a36Sopenharmony_ci			.streaming_ctrl   = dibusb2_0_streaming_ctrl,
8262306a36Sopenharmony_ci			.pid_filter       = dibusb_pid_filter,
8362306a36Sopenharmony_ci			.pid_filter_ctrl  = dibusb_pid_filter_ctrl,
8462306a36Sopenharmony_ci			.frontend_attach  = dibusb_dib3000mc_frontend_attach,
8562306a36Sopenharmony_ci			.tuner_attach     = dibusb_dib3000mc_tuner_attach,
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	/* parameter for the MPEG2-data transfer */
8862306a36Sopenharmony_ci			.stream = {
8962306a36Sopenharmony_ci				.type = USB_BULK,
9062306a36Sopenharmony_ci				.count = 8,
9162306a36Sopenharmony_ci				.endpoint = 0x06,
9262306a36Sopenharmony_ci				.u = {
9362306a36Sopenharmony_ci					.bulk = {
9462306a36Sopenharmony_ci						.buffersize = 4096,
9562306a36Sopenharmony_ci					}
9662306a36Sopenharmony_ci				}
9762306a36Sopenharmony_ci			},
9862306a36Sopenharmony_ci		}},
9962306a36Sopenharmony_ci			.size_of_priv     = sizeof(struct dibusb_state),
10062306a36Sopenharmony_ci		}
10162306a36Sopenharmony_ci	},
10262306a36Sopenharmony_ci	.power_ctrl       = dibusb2_0_power_ctrl,
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	.rc.legacy = {
10562306a36Sopenharmony_ci		.rc_interval      = DEFAULT_RC_INTERVAL,
10662306a36Sopenharmony_ci		.rc_map_table     = rc_map_dibusb_table,
10762306a36Sopenharmony_ci		.rc_map_size      = 111, /* FIXME */
10862306a36Sopenharmony_ci		.rc_query         = dibusb_rc_query,
10962306a36Sopenharmony_ci	},
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	.i2c_algo         = &dibusb_i2c_algo,
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	.generic_bulk_ctrl_endpoint = 0x01,
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	.num_device_descs = 8,
11662306a36Sopenharmony_ci	.devices = {
11762306a36Sopenharmony_ci		{   "DiBcom USB2.0 DVB-T reference design (MOD3000P)",
11862306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[DIBCOM_MOD3001_COLD], NULL },
11962306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[DIBCOM_MOD3001_WARM], NULL },
12062306a36Sopenharmony_ci		},
12162306a36Sopenharmony_ci		{   "Artec T1 USB2.0 TVBOX (please check the warm ID)",
12262306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[ULTIMA_TVBOX_USB2_COLD], NULL },
12362306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[ULTIMA_TVBOX_USB2_WARM], NULL },
12462306a36Sopenharmony_ci		},
12562306a36Sopenharmony_ci		{   "LITE-ON USB2.0 DVB-T Tuner",
12662306a36Sopenharmony_ci		    /* Also rebranded as Intuix S800, Toshiba */
12762306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[LITEON_DVB_T_COLD], NULL },
12862306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[LITEON_DVB_T_WARM], NULL },
12962306a36Sopenharmony_ci		},
13062306a36Sopenharmony_ci		{   "MSI Digivox Mini SL",
13162306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[EMPIA_DIGIVOX_MINI_SL_COLD], NULL },
13262306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[EMPIA_DIGIVOX_MINI_SL_WARM], NULL },
13362306a36Sopenharmony_ci		},
13462306a36Sopenharmony_ci		{   "GRAND - USB2.0 DVB-T adapter",
13562306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[GRANDTEC_DVBT_USB2_COLD], NULL },
13662306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[GRANDTEC_DVBT_USB2_WARM], NULL },
13762306a36Sopenharmony_ci		},
13862306a36Sopenharmony_ci		{   "Artec T14 - USB2.0 DVB-T",
13962306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[ULTIMA_ARTEC_T14_COLD], NULL },
14062306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[ULTIMA_ARTEC_T14_WARM], NULL },
14162306a36Sopenharmony_ci		},
14262306a36Sopenharmony_ci		{   "Leadtek - USB2.0 Winfast DTV dongle",
14362306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[LEADTEK_WINFAST_DTV_DONGLE_COLD], NULL },
14462306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[LEADTEK_WINFAST_DTV_DONGLE_WARM], NULL },
14562306a36Sopenharmony_ci		},
14662306a36Sopenharmony_ci		{   "Humax/Coex DVB-T USB Stick 2.0 High Speed",
14762306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[HUMAX_DVB_T_STICK_HIGH_SPEED_COLD], NULL },
14862306a36Sopenharmony_ci			{ &dibusb_dib3000mc_table[HUMAX_DVB_T_STICK_HIGH_SPEED_WARM], NULL },
14962306a36Sopenharmony_ci		},
15062306a36Sopenharmony_ci		{ NULL },
15162306a36Sopenharmony_ci	}
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistatic struct usb_driver dibusb_mc_driver = {
15562306a36Sopenharmony_ci	.name		= "dvb_usb_dibusb_mc",
15662306a36Sopenharmony_ci	.probe		= dibusb_mc_probe,
15762306a36Sopenharmony_ci	.disconnect = dvb_usb_device_exit,
15862306a36Sopenharmony_ci	.id_table	= dibusb_dib3000mc_table,
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cimodule_usb_driver(dibusb_mc_driver);
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ciMODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
16462306a36Sopenharmony_ciMODULE_DESCRIPTION("Driver for DiBcom USB2.0 DVB-T (DiB3000M-C/P based) devices");
16562306a36Sopenharmony_ciMODULE_VERSION("1.0");
16662306a36Sopenharmony_ciMODULE_LICENSE("GPL");
167