Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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-B)
^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) static int dib3000mb_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	struct dvb_usb_adapter *adap = fe->dvb->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	return st->ops.tuner_pass_ctrl(fe, enable, st->tuner_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) static int dibusb_dib3000mb_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	struct dib3000_config demod_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	demod_cfg.demod_address = 0x8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	adap->fe_adap[0].fe = dvb_attach(dib3000mb_attach, &demod_cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 					 &adap->dev->i2c_adap, &st->ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	if ((adap->fe_adap[0].fe) == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	adap->fe_adap[0].fe->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) static int dibusb_thomson_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	st->tuner_addr = 0x61;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, &adap->dev->i2c_adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 		   DVB_PLL_TUA6010XS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) static int dibusb_panasonic_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	st->tuner_addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60, &adap->dev->i2c_adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 		   DVB_PLL_TDA665X);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) /* Some of the Artec 1.1 device aren't equipped with the default tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64)  * (Thomson Cable), but with a Panasonic ENV77H11D5.  This function figures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65)  * this out. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) static int dibusb_tuner_probe_and_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	u8 b[2] = { 0,0 }, b2[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	struct i2c_msg msg[2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 		{ .flags = 0,        .buf = b,  .len = 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		{ .flags = I2C_M_RD, .buf = b2, .len = 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	struct dibusb_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	/* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	msg[0].addr = msg[1].addr = st->tuner_addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		err("tuner i2c write failed.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	if (adap->fe_adap[0].fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		adap->fe_adap[0].fe->ops.i2c_gate_ctrl(adap->fe_adap[0].fe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	if (b2[0] == 0xfe) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 		info("This device has the Thomson Cable onboard. Which is default.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 		ret = dibusb_thomson_tuner_attach(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 		info("This device has the Panasonic ENV77H11D5 onboard.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 		ret = dibusb_panasonic_tuner_attach(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* USB Driver stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) static struct dvb_usb_device_properties dibusb1_1_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) static struct dvb_usb_device_properties dibusb1_1_an2235_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static struct dvb_usb_device_properties dibusb2_0b_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static struct dvb_usb_device_properties artec_t1_usb2_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static int dibusb_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	if (0 == dvb_usb_device_init(intf, &dibusb1_1_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 				     THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	    0 == dvb_usb_device_init(intf, &dibusb1_1_an2235_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 				     THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	    0 == dvb_usb_device_init(intf, &dibusb2_0b_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 				     THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	    0 == dvb_usb_device_init(intf, &artec_t1_usb2_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 				     THIS_MODULE, NULL, adapter_nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* do not change the order of the ID table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static struct usb_device_id dibusb_dib3000mb_table [] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* 00 */	{ USB_DEVICE(USB_VID_WIDEVIEW,		USB_PID_AVERMEDIA_DVBT_USB_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /* 01 */	{ USB_DEVICE(USB_VID_WIDEVIEW,		USB_PID_AVERMEDIA_DVBT_USB_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* 02 */	{ USB_DEVICE(USB_VID_COMPRO,		USB_PID_COMPRO_DVBU2000_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /* 03 */	{ USB_DEVICE(USB_VID_COMPRO,		USB_PID_COMPRO_DVBU2000_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /* 04 */	{ USB_DEVICE(USB_VID_COMPRO_UNK,	USB_PID_COMPRO_DVBU2000_UNK_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* 05 */	{ USB_DEVICE(USB_VID_DIBCOM,		USB_PID_DIBCOM_MOD3000_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) /* 06 */	{ USB_DEVICE(USB_VID_DIBCOM,		USB_PID_DIBCOM_MOD3000_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /* 07 */	{ USB_DEVICE(USB_VID_EMPIA,		USB_PID_KWORLD_VSTREAM_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* 08 */	{ USB_DEVICE(USB_VID_EMPIA,		USB_PID_KWORLD_VSTREAM_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /* 09 */	{ USB_DEVICE(USB_VID_GRANDTEC,		USB_PID_GRANDTEC_DVBT_USB_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /* 10 */	{ USB_DEVICE(USB_VID_GRANDTEC,		USB_PID_GRANDTEC_DVBT_USB_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) /* 11 */	{ USB_DEVICE(USB_VID_GRANDTEC,		USB_PID_DIBCOM_MOD3000_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /* 12 */	{ USB_DEVICE(USB_VID_GRANDTEC,		USB_PID_DIBCOM_MOD3000_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* 13 */	{ USB_DEVICE(USB_VID_HYPER_PALTEK,	USB_PID_UNK_HYPER_PALTEK_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* 14 */	{ USB_DEVICE(USB_VID_HYPER_PALTEK,	USB_PID_UNK_HYPER_PALTEK_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* 15 */	{ USB_DEVICE(USB_VID_VISIONPLUS,	USB_PID_TWINHAN_VP7041_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) /* 16 */	{ USB_DEVICE(USB_VID_VISIONPLUS,	USB_PID_TWINHAN_VP7041_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* 17 */	{ USB_DEVICE(USB_VID_TWINHAN,		USB_PID_TWINHAN_VP7041_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* 18 */	{ USB_DEVICE(USB_VID_TWINHAN,		USB_PID_TWINHAN_VP7041_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* 19 */	{ USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC,	USB_PID_ULTIMA_TVBOX_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* 20 */	{ USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC,	USB_PID_ULTIMA_TVBOX_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /* 21 */	{ USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC,	USB_PID_ULTIMA_TVBOX_AN2235_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* 22 */	{ USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC,	USB_PID_ULTIMA_TVBOX_AN2235_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* 23 */	{ USB_DEVICE(USB_VID_ADSTECH,		USB_PID_ADSTECH_USB2_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /* device ID with default DIBUSB2_0-firmware and with the hacked firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* 24 */	{ USB_DEVICE(USB_VID_ADSTECH,		USB_PID_ADSTECH_USB2_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* 25 */	{ USB_DEVICE(USB_VID_KYE,		USB_PID_KYE_DVB_T_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /* 26 */	{ USB_DEVICE(USB_VID_KYE,		USB_PID_KYE_DVB_T_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) /* 27 */	{ USB_DEVICE(USB_VID_KWORLD,		USB_PID_KWORLD_VSTREAM_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /* 28 */	{ USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC,	USB_PID_ULTIMA_TVBOX_USB2_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /* 29 */	{ USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC,	USB_PID_ULTIMA_TVBOX_USB2_WARM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)  * XXX: As Artec just 'forgot' to program the EEPROM on some Artec T1 devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)  *      we don't catch these faulty IDs (namely 'Cypress FX1 USB controller') that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)  *      have been left on the device. If you don't have such a device but an Artec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)  *      device that's supposed to work with this driver but is not detected by it,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)  *      free to enable CONFIG_DVB_USB_DIBUSB_MB_FAULTY via your kernel config.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) /* 30 */	{ USB_DEVICE(USB_VID_ANCHOR,		USB_PID_ULTIMA_TVBOX_ANCHOR_COLD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 			{ }		/* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) MODULE_DEVICE_TABLE (usb, dibusb_dib3000mb_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static struct dvb_usb_device_properties dibusb1_1_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	.caps =  DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	.usb_ctrl = CYPRESS_AN2135,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	.firmware = "dvb-usb-dibusb-5.0.0.11.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	.num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	.adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		.num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		.fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 			.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 189) 			.pid_filter_count = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 			.streaming_ctrl   = dibusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 			.pid_filter       = dibusb_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 			.pid_filter_ctrl  = dibusb_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 			.frontend_attach  = dibusb_dib3000mb_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 			.tuner_attach     = dibusb_tuner_probe_and_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 			/* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 			.stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 				.type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 				.count = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 				.endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 				.u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 					.bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 						.buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 			},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 		}},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 			.size_of_priv     = sizeof(struct dibusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	.power_ctrl       = dibusb_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	.rc.legacy = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 		.rc_interval      = DEFAULT_RC_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 		.rc_map_table     = rc_map_dibusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 		.rc_map_size      = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 		.rc_query         = dibusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	.i2c_algo         = &dibusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	.generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	.num_device_descs = 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	.devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 		{	"AVerMedia AverTV DVBT USB1.1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 			{ &dibusb_dib3000mb_table[0],  NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 			{ &dibusb_dib3000mb_table[1],  NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 		{	"Compro Videomate DVB-U2000 - DVB-T USB1.1 (please confirm to linux-dvb)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 			{ &dibusb_dib3000mb_table[2], &dibusb_dib3000mb_table[4], NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 			{ &dibusb_dib3000mb_table[3], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 		{	"DiBcom USB1.1 DVB-T reference design (MOD3000)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 			{ &dibusb_dib3000mb_table[5],  NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 			{ &dibusb_dib3000mb_table[6],  NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 		{	"KWorld V-Stream XPERT DTV - DVB-T USB1.1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 			{ &dibusb_dib3000mb_table[7], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 			{ &dibusb_dib3000mb_table[8], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 		{	"Grandtec USB1.1 DVB-T",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 			{ &dibusb_dib3000mb_table[9],  &dibusb_dib3000mb_table[11], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 			{ &dibusb_dib3000mb_table[10], &dibusb_dib3000mb_table[12], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 		{	"Unknown USB1.1 DVB-T device ???? please report the name to the author",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 			{ &dibusb_dib3000mb_table[13], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 			{ &dibusb_dib3000mb_table[14], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 		{	"TwinhanDTV USB-Ter USB1.1 / Magic Box I / HAMA USB1.1 DVB-T device",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 			{ &dibusb_dib3000mb_table[15], &dibusb_dib3000mb_table[17], NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 			{ &dibusb_dib3000mb_table[16], &dibusb_dib3000mb_table[18], NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 		{	"Artec T1 USB1.1 TVBOX with AN2135",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 			{ &dibusb_dib3000mb_table[19], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 			{ &dibusb_dib3000mb_table[20], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 		{	"VideoWalker DVB-T USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 			{ &dibusb_dib3000mb_table[25], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 			{ &dibusb_dib3000mb_table[26], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) static struct dvb_usb_device_properties dibusb1_1_an2235_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	.usb_ctrl = CYPRESS_AN2235,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	.firmware = "dvb-usb-dibusb-an2235-01.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	.num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	.adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 		.num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 		.fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 			.caps = DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF | DVB_USB_ADAP_HAS_PID_FILTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 			.pid_filter_count = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 			.streaming_ctrl   = dibusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 			.pid_filter       = dibusb_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 			.pid_filter_ctrl  = dibusb_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 			.frontend_attach  = dibusb_dib3000mb_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 			.tuner_attach     = dibusb_tuner_probe_and_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 			/* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 			.stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 				.type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 				.count = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 				.endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 				.u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 					.bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 						.buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 			},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 		}},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 			.size_of_priv     = sizeof(struct dibusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	.power_ctrl       = dibusb_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	.rc.legacy = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 		.rc_interval      = DEFAULT_RC_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 		.rc_map_table     = rc_map_dibusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 		.rc_map_size      = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 		.rc_query         = dibusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	.i2c_algo         = &dibusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	.generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) #ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	.num_device_descs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	.num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	.devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 		{	"Artec T1 USB1.1 TVBOX with AN2235",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 			{ &dibusb_dib3000mb_table[21], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 			{ &dibusb_dib3000mb_table[22], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) #ifdef CONFIG_DVB_USB_DIBUSB_MB_FAULTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 		{	"Artec T1 USB1.1 TVBOX with AN2235 (faulty USB IDs)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 			{ &dibusb_dib3000mb_table[30], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 			{ NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 		{ NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) static struct dvb_usb_device_properties dibusb2_0b_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	.usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	.firmware = "dvb-usb-adstech-usb2-02.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	.num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	.adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 		.num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 		.fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 			.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 348) 			.pid_filter_count = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 			.streaming_ctrl   = dibusb2_0_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 			.pid_filter       = dibusb_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 			.pid_filter_ctrl  = dibusb_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 			.frontend_attach  = dibusb_dib3000mb_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 			.tuner_attach     = dibusb_thomson_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 			/* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 			.stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 				.type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 				.count = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 				.endpoint = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 				.u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 					.bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 						.buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 			},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 		}},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 			.size_of_priv     = sizeof(struct dibusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	.power_ctrl       = dibusb2_0_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	.rc.legacy = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 		.rc_interval      = DEFAULT_RC_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 		.rc_map_table     = rc_map_dibusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 		.rc_map_size      = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 		.rc_query         = dibusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	.i2c_algo         = &dibusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 	.generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	.num_device_descs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	.devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 		{	"KWorld/ADSTech Instant DVB-T USB2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 			{ &dibusb_dib3000mb_table[23], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 			{ &dibusb_dib3000mb_table[24], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 		{	"KWorld Xpert DVB-T USB2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 			{ &dibusb_dib3000mb_table[27], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 			{ NULL }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 		{ NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) static struct dvb_usb_device_properties artec_t1_usb2_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 	.usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 	.firmware = "dvb-usb-dibusb-6.0.0.8.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 	.num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	.adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 		.num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 		.fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 			.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 411) 			.pid_filter_count = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 			.streaming_ctrl   = dibusb2_0_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 			.pid_filter       = dibusb_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 			.pid_filter_ctrl  = dibusb_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 			.frontend_attach  = dibusb_dib3000mb_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 			.tuner_attach     = dibusb_tuner_probe_and_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 			/* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 			.stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 				.type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 				.count = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 				.endpoint = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 				.u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 					.bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 						.buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 			},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 		}},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 			.size_of_priv     = sizeof(struct dibusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	.power_ctrl       = dibusb2_0_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	.rc.legacy = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 		.rc_interval      = DEFAULT_RC_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 		.rc_map_table     = rc_map_dibusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 		.rc_map_size      = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 		.rc_query         = dibusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	.i2c_algo         = &dibusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	.generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 	.num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	.devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 		{	"Artec T1 USB2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 			{ &dibusb_dib3000mb_table[28], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 			{ &dibusb_dib3000mb_table[29], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 		{ NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) static struct usb_driver dibusb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	.name		= "dvb_usb_dibusb_mb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	.probe		= dibusb_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 	.disconnect = dvb_usb_device_exit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	.id_table	= dibusb_dib3000mb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) module_usb_driver(dibusb_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) MODULE_DESCRIPTION("Driver for DiBcom USB DVB-T devices (DiB3000M-B based)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) MODULE_VERSION("1.0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) MODULE_LICENSE("GPL");