1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Linux driver for devices based on the DiBcom DiB0700 USB bridge
3  *
4  *  Copyright (C) 2005-9 DiBcom, SA et al
5  */
6 #include "dib0700.h"
7 
8 #include "dib3000mc.h"
9 #include "dib7000m.h"
10 #include "dib7000p.h"
11 #include "dib8000.h"
12 #include "dib9000.h"
13 #include "mt2060.h"
14 #include "mt2266.h"
15 #include "tuner-xc2028.h"
16 #include "xc5000.h"
17 #include "xc4000.h"
18 #include "s5h1411.h"
19 #include "dib0070.h"
20 #include "dib0090.h"
21 #include "lgdt3305.h"
22 #include "mxl5007t.h"
23 #include "mn88472.h"
24 #include "tda18250.h"
25 
26 
27 static int force_lna_activation;
28 module_param(force_lna_activation, int, 0644);
29 MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifier(s) (LNA), if applicable for the device (default: 0=automatic/off).");
30 
31 struct dib0700_adapter_state {
32 	int (*set_param_save) (struct dvb_frontend *);
33 	const struct firmware *frontend_firmware;
34 	struct dib7000p_ops dib7000p_ops;
35 	struct dib8000_ops dib8000_ops;
36 };
37 
38 /* Hauppauge Nova-T 500 (aka Bristol)
39  *  has a LNA on GPIO0 which is enabled by setting 1 */
40 static struct mt2060_config bristol_mt2060_config[2] = {
41 	{
42 		.i2c_address = 0x60,
43 		.clock_out   = 3,
44 	}, {
45 		.i2c_address = 0x61,
46 	}
47 };
48 
49 
50 static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
51 	.band_caps = BAND_VHF | BAND_UHF,
52 	.setup     = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
53 
54 	.agc1_max = 42598,
55 	.agc1_min = 17694,
56 	.agc2_max = 45875,
57 	.agc2_min = 0,
58 
59 	.agc1_pt1 = 0,
60 	.agc1_pt2 = 59,
61 
62 	.agc1_slope1 = 0,
63 	.agc1_slope2 = 69,
64 
65 	.agc2_pt1 = 0,
66 	.agc2_pt2 = 59,
67 
68 	.agc2_slope1 = 111,
69 	.agc2_slope2 = 28,
70 };
71 
72 static struct dib3000mc_config bristol_dib3000mc_config[2] = {
73 	{	.agc          = &bristol_dib3000p_mt2060_agc_config,
74 		.max_time     = 0x196,
75 		.ln_adc_level = 0x1cc7,
76 		.output_mpeg2_in_188_bytes = 1,
77 	},
78 	{	.agc          = &bristol_dib3000p_mt2060_agc_config,
79 		.max_time     = 0x196,
80 		.ln_adc_level = 0x1cc7,
81 		.output_mpeg2_in_188_bytes = 1,
82 	}
83 };
84 
85 static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
86 {
87 	struct dib0700_state *st = adap->dev->priv;
88 	if (adap->id == 0) {
89 		dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0); msleep(10);
90 		dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1); msleep(10);
91 		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
92 		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
93 
94 		if (force_lna_activation)
95 			dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
96 		else
97 			dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
98 
99 		if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {
100 			dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
101 			return -ENODEV;
102 		}
103 	}
104 	st->mt2060_if1[adap->id] = 1220;
105 	return (adap->fe_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
106 		(10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
107 }
108 
109 static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
110 {
111 	struct i2c_msg msg[2] = {
112 		{ .addr = 0x50, .flags = 0,        .buf = &adrs, .len = 1 },
113 		{ .addr = 0x50, .flags = I2C_M_RD, .buf = pval,  .len = 1 },
114 	};
115 	if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO;
116 	return 0;
117 }
118 
119 static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
120 {
121 	struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
122 	struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe_adap[0].fe, 1);
123 	s8 a;
124 	int if1=1220;
125 	if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&
126 		adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
127 		if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
128 	}
129 	return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c,
130 			  &bristol_mt2060_config[adap->id], if1) == NULL ?
131 			  -ENODEV : 0;
132 }
133 
134 /* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity */
135 
136 /* MT226x */
137 static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
138 	{
139 		BAND_UHF,
140 
141 		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,
142 		* P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
143 		(0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8)
144 	    | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
145 
146 		1130,
147 		21,
148 
149 		0,
150 		118,
151 
152 		0,
153 		3530,
154 		1,
155 		0,
156 
157 		65535,
158 		33770,
159 		65535,
160 		23592,
161 
162 		0,
163 		62,
164 		255,
165 		64,
166 		64,
167 		132,
168 		192,
169 		80,
170 		80,
171 
172 		17,
173 		27,
174 		23,
175 		51,
176 
177 		1,
178 	}, {
179 		BAND_VHF | BAND_LBAND,
180 
181 		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,
182 		* P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
183 		(0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8)
184 	    | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
185 
186 		2372,
187 		21,
188 
189 		0,
190 		118,
191 
192 		0,
193 		3530,
194 		1,
195 		0,
196 
197 		65535,
198 		0,
199 		65535,
200 		23592,
201 
202 		0,
203 		128,
204 		128,
205 		128,
206 		0,
207 		128,
208 		253,
209 		81,
210 		0,
211 
212 		17,
213 		27,
214 		23,
215 		51,
216 
217 		1,
218 	}
219 };
220 
221 static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
222 	.internal = 60000,
223 	.sampling = 30000,
224 	.pll_prediv = 1,
225 	.pll_ratio = 8,
226 	.pll_range = 3,
227 	.pll_reset = 1,
228 	.pll_bypass = 0,
229 	.enable_refdiv = 0,
230 	.bypclk_div = 0,
231 	.IO_CLK_en_core = 1,
232 	.ADClkSrc = 1,
233 	.modulo = 2,
234 	.sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
235 	.ifreq = 0,
236 	.timf = 20452225,
237 };
238 
239 static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
240 	{	.output_mpeg2_in_188_bytes = 1,
241 		.hostbus_diversity = 1,
242 		.tuner_is_baseband = 1,
243 
244 		.agc_config_count = 2,
245 		.agc = stk7700d_7000p_mt2266_agc_config,
246 		.bw  = &stk7700d_mt2266_pll_config,
247 
248 		.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
249 		.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
250 		.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
251 	},
252 	{	.output_mpeg2_in_188_bytes = 1,
253 		.hostbus_diversity = 1,
254 		.tuner_is_baseband = 1,
255 
256 		.agc_config_count = 2,
257 		.agc = stk7700d_7000p_mt2266_agc_config,
258 		.bw  = &stk7700d_mt2266_pll_config,
259 
260 		.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
261 		.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
262 		.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
263 	}
264 };
265 
266 static struct mt2266_config stk7700d_mt2266_config[2] = {
267 	{	.i2c_address = 0x60
268 	},
269 	{	.i2c_address = 0x60
270 	}
271 };
272 
273 static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
274 {
275 	struct dib0700_adapter_state *state = adap->priv;
276 
277 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
278 		return -ENODEV;
279 
280 	if (adap->id == 0) {
281 		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
282 		msleep(10);
283 		dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
284 		dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
285 		dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
286 		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
287 		msleep(10);
288 		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
289 		msleep(10);
290 		if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
291 					     stk7700d_dib7000p_mt2266_config)
292 		    != 0) {
293 			err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
294 			dvb_detach(state->dib7000p_ops.set_wbd_ref);
295 			return -ENODEV;
296 		}
297 	}
298 
299 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
300 			   0x80 + (adap->id << 1),
301 			   &stk7700d_dib7000p_mt2266_config[adap->id]);
302 
303 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
304 }
305 
306 static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
307 {
308 	struct dib0700_adapter_state *state = adap->priv;
309 
310 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
311 		return -ENODEV;
312 
313 	if (adap->id == 0) {
314 		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
315 		msleep(10);
316 		dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
317 		dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
318 		dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
319 		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
320 		msleep(10);
321 		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
322 		msleep(10);
323 		dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
324 		if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
325 					     stk7700d_dib7000p_mt2266_config)
326 		    != 0) {
327 			err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
328 			dvb_detach(state->dib7000p_ops.set_wbd_ref);
329 			return -ENODEV;
330 		}
331 	}
332 
333 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
334 			   0x80 + (adap->id << 1),
335 			   &stk7700d_dib7000p_mt2266_config[adap->id]);
336 
337 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
338 }
339 
340 static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
341 {
342 	struct i2c_adapter *tun_i2c;
343 	struct dib0700_adapter_state *state = adap->priv;
344 
345 	tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
346 					    DIBX000_I2C_INTERFACE_TUNER, 1);
347 	return dvb_attach(mt2266_attach, adap->fe_adap[0].fe, tun_i2c,
348 		&stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
349 }
350 
351 /* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
352 static struct dibx000_agc_config xc3028_agc_config = {
353 	.band_caps = BAND_VHF | BAND_UHF,
354 	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
355 	 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
356 	 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
357 	.setup = (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
358 	.inv_gain = 712,
359 	.time_stabiliz = 21,
360 	.alpha_level = 0,
361 	.thlock = 118,
362 	.wbd_inv = 0,
363 	.wbd_ref = 2867,
364 	.wbd_sel = 0,
365 	.wbd_alpha = 2,
366 	.agc1_max = 0,
367 	.agc1_min = 0,
368 	.agc2_max = 39718,
369 	.agc2_min = 9930,
370 	.agc1_pt1 = 0,
371 	.agc1_pt2 = 0,
372 	.agc1_pt3 = 0,
373 	.agc1_slope1 = 0,
374 	.agc1_slope2 = 0,
375 	.agc2_pt1 = 0,
376 	.agc2_pt2 = 128,
377 	.agc2_slope1 = 29,
378 	.agc2_slope2 = 29,
379 	.alpha_mant = 17,
380 	.alpha_exp = 27,
381 	.beta_mant = 23,
382 	.beta_exp = 51,
383 	.perform_agc_softsplit = 1,
384 };
385 
386 /* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
387 static struct dibx000_bandwidth_config xc3028_bw_config = {
388 	.internal = 60000,
389 	.sampling = 30000,
390 	.pll_prediv = 1,
391 	.pll_ratio = 8,
392 	.pll_range = 3,
393 	.pll_reset = 1,
394 	.pll_bypass = 0,
395 	.enable_refdiv = 0,
396 	.bypclk_div = 0,
397 	.IO_CLK_en_core = 1,
398 	.ADClkSrc = 1,
399 	.modulo = 0,
400 	.sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
401 	.ifreq = (1 << 25) | 5816102,  /* ifreq = 5.200000 MHz */
402 	.timf = 20452225,
403 	.xtal_hz = 30000000,
404 };
405 
406 static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
407 	.output_mpeg2_in_188_bytes = 1,
408 	.tuner_is_baseband = 1,
409 
410 	.agc_config_count = 1,
411 	.agc = &xc3028_agc_config,
412 	.bw  = &xc3028_bw_config,
413 
414 	.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
415 	.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
416 	.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
417 };
418 
419 static int stk7700ph_xc3028_callback(void *ptr, int component,
420 				     int command, int arg)
421 {
422 	struct dvb_usb_adapter *adap = ptr;
423 	struct dib0700_adapter_state *state = adap->priv;
424 
425 	switch (command) {
426 	case XC2028_TUNER_RESET:
427 		/* Send the tuner in then out of reset */
428 		state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 0);
429 		msleep(10);
430 		state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
431 		break;
432 	case XC2028_RESET_CLK:
433 	case XC2028_I2C_FLUSH:
434 		break;
435 	default:
436 		err("%s: unknown command %d, arg %d\n", __func__,
437 			command, arg);
438 		return -EINVAL;
439 	}
440 	return 0;
441 }
442 
443 static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
444 	.fname = XC2028_DEFAULT_FIRMWARE,
445 	.max_len = 64,
446 	.demod = XC3028_FE_DIBCOM52,
447 };
448 
449 static struct xc2028_config stk7700ph_xc3028_config = {
450 	.i2c_addr = 0x61,
451 	.ctrl = &stk7700ph_xc3028_ctrl,
452 };
453 
454 static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
455 {
456 	struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
457 	struct dib0700_adapter_state *state = adap->priv;
458 
459 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
460 		return -ENODEV;
461 
462 	if (desc->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
463 	    desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
464 		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
465 	else
466 		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
467 	msleep(20);
468 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
469 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
470 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
471 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
472 	msleep(10);
473 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
474 	msleep(20);
475 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
476 	msleep(10);
477 
478 	if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
479 				     &stk7700ph_dib7700_xc3028_config) != 0) {
480 		err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
481 		    __func__);
482 		dvb_detach(state->dib7000p_ops.set_wbd_ref);
483 		return -ENODEV;
484 	}
485 
486 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80,
487 		&stk7700ph_dib7700_xc3028_config);
488 
489 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
490 }
491 
492 static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
493 {
494 	struct i2c_adapter *tun_i2c;
495 	struct dib0700_adapter_state *state = adap->priv;
496 
497 	tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
498 		DIBX000_I2C_INTERFACE_TUNER, 1);
499 
500 	stk7700ph_xc3028_config.i2c_adap = tun_i2c;
501 
502 	/* FIXME: generalize & move to common area */
503 	adap->fe_adap[0].fe->callback = stk7700ph_xc3028_callback;
504 
505 	return dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &stk7700ph_xc3028_config)
506 		== NULL ? -ENODEV : 0;
507 }
508 
509 #define DEFAULT_RC_INTERVAL 50
510 
511 /*
512  * This function is used only when firmware is < 1.20 version. Newer
513  * firmwares use bulk mode, with functions implemented at dib0700_core,
514  * at dib0700_rc_urb_completion()
515  */
516 static int dib0700_rc_query_old_firmware(struct dvb_usb_device *d)
517 {
518 	enum rc_proto protocol;
519 	u32 scancode;
520 	u8 toggle;
521 	int i;
522 	struct dib0700_state *st = d->priv;
523 
524 	if (st->fw_version >= 0x10200) {
525 		/* For 1.20 firmware , We need to keep the RC polling
526 		   callback so we can reuse the input device setup in
527 		   dvb-usb-remote.c.  However, the actual work is being done
528 		   in the bulk URB completion handler. */
529 		return 0;
530 	}
531 
532 	st->buf[0] = REQUEST_POLL_RC;
533 	st->buf[1] = 0;
534 
535 	i = dib0700_ctrl_rd(d, st->buf, 2, st->buf, 4);
536 	if (i <= 0) {
537 		err("RC Query Failed");
538 		return -EIO;
539 	}
540 
541 	/* losing half of KEY_0 events from Philipps rc5 remotes.. */
542 	if (st->buf[0] == 0 && st->buf[1] == 0
543 	    && st->buf[2] == 0 && st->buf[3] == 0)
544 		return 0;
545 
546 	/* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)st->buf[3 - 2],(int)st->buf[3 - 3],(int)st->buf[3 - 1],(int)st->buf[3]);  */
547 
548 	dib0700_rc_setup(d, NULL); /* reset ir sensor data to prevent false events */
549 
550 	switch (d->props.rc.core.protocol) {
551 	case RC_PROTO_BIT_NEC:
552 		/* NEC protocol sends repeat code as 0 0 0 FF */
553 		if ((st->buf[3 - 2] == 0x00) && (st->buf[3 - 3] == 0x00) &&
554 		    (st->buf[3] == 0xff)) {
555 			rc_repeat(d->rc_dev);
556 			return 0;
557 		}
558 
559 		protocol = RC_PROTO_NEC;
560 		scancode = RC_SCANCODE_NEC(st->buf[3 - 2], st->buf[3 - 3]);
561 		toggle = 0;
562 		break;
563 
564 	default:
565 		/* RC-5 protocol changes toggle bit on new keypress */
566 		protocol = RC_PROTO_RC5;
567 		scancode = RC_SCANCODE_RC5(st->buf[3 - 2], st->buf[3 - 3]);
568 		toggle = st->buf[3 - 1];
569 		break;
570 	}
571 
572 	rc_keydown(d->rc_dev, protocol, scancode, toggle);
573 	return 0;
574 }
575 
576 /* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
577 static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
578 	BAND_UHF | BAND_VHF,
579 
580 	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
581 	 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
582 	(0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
583 	| (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
584 
585 	712,
586 	41,
587 
588 	0,
589 	118,
590 
591 	0,
592 	4095,
593 	0,
594 	0,
595 
596 	42598,
597 	17694,
598 	45875,
599 	2621,
600 	0,
601 	76,
602 	139,
603 	52,
604 	59,
605 	107,
606 	172,
607 	57,
608 	70,
609 
610 	21,
611 	25,
612 	28,
613 	48,
614 
615 	1,
616 	{  0,
617 	   107,
618 	   51800,
619 	   24700
620 	},
621 };
622 
623 static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
624 	.band_caps = BAND_UHF | BAND_VHF,
625 	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
626 	 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
627 	.setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
628 	.inv_gain = 712,
629 	.time_stabiliz = 41,
630 	.alpha_level = 0,
631 	.thlock = 118,
632 	.wbd_inv = 0,
633 	.wbd_ref = 4095,
634 	.wbd_sel = 0,
635 	.wbd_alpha = 0,
636 	.agc1_max = 42598,
637 	.agc1_min = 16384,
638 	.agc2_max = 42598,
639 	.agc2_min = 0,
640 	.agc1_pt1 = 0,
641 	.agc1_pt2 = 137,
642 	.agc1_pt3 = 255,
643 	.agc1_slope1 = 0,
644 	.agc1_slope2 = 255,
645 	.agc2_pt1 = 0,
646 	.agc2_pt2 = 0,
647 	.agc2_slope1 = 0,
648 	.agc2_slope2 = 41,
649 	.alpha_mant = 15,
650 	.alpha_exp = 25,
651 	.beta_mant = 28,
652 	.beta_exp = 48,
653 	.perform_agc_softsplit = 0,
654 };
655 
656 static struct dibx000_bandwidth_config stk7700p_pll_config = {
657 	.internal = 60000,
658 	.sampling = 30000,
659 	.pll_prediv = 1,
660 	.pll_ratio = 8,
661 	.pll_range = 3,
662 	.pll_reset = 1,
663 	.pll_bypass = 0,
664 	.enable_refdiv = 0,
665 	.bypclk_div = 0,
666 	.IO_CLK_en_core = 1,
667 	.ADClkSrc = 1,
668 	.modulo = 0,
669 	.sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
670 	.ifreq = 60258167,
671 	.timf = 20452225,
672 	.xtal_hz = 30000000,
673 };
674 
675 static struct dib7000m_config stk7700p_dib7000m_config = {
676 	.dvbt_mode = 1,
677 	.output_mpeg2_in_188_bytes = 1,
678 	.quartz_direct = 1,
679 
680 	.agc_config_count = 1,
681 	.agc = &stk7700p_7000m_mt2060_agc_config,
682 	.bw  = &stk7700p_pll_config,
683 
684 	.gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
685 	.gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
686 	.gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
687 };
688 
689 static struct dib7000p_config stk7700p_dib7000p_config = {
690 	.output_mpeg2_in_188_bytes = 1,
691 
692 	.agc_config_count = 1,
693 	.agc = &stk7700p_7000p_mt2060_agc_config,
694 	.bw  = &stk7700p_pll_config,
695 
696 	.gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
697 	.gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
698 	.gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
699 };
700 
701 static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
702 {
703 	struct dib0700_state *st = adap->dev->priv;
704 	struct dib0700_adapter_state *state = adap->priv;
705 
706 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
707 		return -ENODEV;
708 
709 	/* unless there is no real power management in DVB - we leave the device on GPIO6 */
710 
711 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
712 	dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0); msleep(50);
713 
714 	dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1); msleep(10);
715 	dib0700_set_gpio(adap->dev, GPIO9,  GPIO_OUT, 1);
716 
717 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
718 	dib0700_ctrl_clock(adap->dev, 72, 1);
719 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
720 
721 	dib0700_set_gpio(adap->dev,  GPIO0, GPIO_OUT, 1);
722 
723 	st->mt2060_if1[0] = 1220;
724 
725 	if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap)) {
726 		adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
727 		st->is_dib7000pc = 1;
728 	} else {
729 		memset(&state->dib7000p_ops, 0, sizeof(state->dib7000p_ops));
730 		adap->fe_adap[0].fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
731 	}
732 
733 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
734 }
735 
736 static struct mt2060_config stk7700p_mt2060_config = {
737 	0x60
738 };
739 
740 static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
741 {
742 	struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
743 	struct dib0700_state *st = adap->dev->priv;
744 	struct i2c_adapter *tun_i2c;
745 	struct dib0700_adapter_state *state = adap->priv;
746 	s8 a;
747 	int if1=1220;
748 
749 	if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&
750 		adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
751 		if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
752 	}
753 	if (st->is_dib7000pc)
754 		tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
755 	else
756 		tun_i2c = dib7000m_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
757 
758 	return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, &stk7700p_mt2060_config,
759 		if1) == NULL ? -ENODEV : 0;
760 }
761 
762 /* DIB7070 generic */
763 static struct dibx000_agc_config dib7070_agc_config = {
764 	.band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
765 	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
766 	 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
767 	.setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
768 	.inv_gain = 600,
769 	.time_stabiliz = 10,
770 	.alpha_level = 0,
771 	.thlock = 118,
772 	.wbd_inv = 0,
773 	.wbd_ref = 3530,
774 	.wbd_sel = 1,
775 	.wbd_alpha = 5,
776 	.agc1_max = 65535,
777 	.agc1_min = 0,
778 	.agc2_max = 65535,
779 	.agc2_min = 0,
780 	.agc1_pt1 = 0,
781 	.agc1_pt2 = 40,
782 	.agc1_pt3 = 183,
783 	.agc1_slope1 = 206,
784 	.agc1_slope2 = 255,
785 	.agc2_pt1 = 72,
786 	.agc2_pt2 = 152,
787 	.agc2_slope1 = 88,
788 	.agc2_slope2 = 90,
789 	.alpha_mant = 17,
790 	.alpha_exp = 27,
791 	.beta_mant = 23,
792 	.beta_exp = 51,
793 	.perform_agc_softsplit = 0,
794 };
795 
796 static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
797 {
798 	struct dvb_usb_adapter *adap = fe->dvb->priv;
799 	struct dib0700_adapter_state *state = adap->priv;
800 
801 	deb_info("reset: %d", onoff);
802 	return state->dib7000p_ops.set_gpio(fe, 8, 0, !onoff);
803 }
804 
805 static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
806 {
807 	struct dvb_usb_adapter *adap = fe->dvb->priv;
808 	struct dib0700_adapter_state *state = adap->priv;
809 
810 	deb_info("sleep: %d", onoff);
811 	return state->dib7000p_ops.set_gpio(fe, 9, 0, onoff);
812 }
813 
814 static struct dib0070_config dib7070p_dib0070_config[2] = {
815 	{
816 		.i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
817 		.reset = dib7070_tuner_reset,
818 		.sleep = dib7070_tuner_sleep,
819 		.clock_khz = 12000,
820 		.clock_pad_drive = 4,
821 		.charge_pump = 2,
822 	}, {
823 		.i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
824 		.reset = dib7070_tuner_reset,
825 		.sleep = dib7070_tuner_sleep,
826 		.clock_khz = 12000,
827 		.charge_pump = 2,
828 	}
829 };
830 
831 static struct dib0070_config dib7770p_dib0070_config = {
832 	 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
833 	 .reset = dib7070_tuner_reset,
834 	 .sleep = dib7070_tuner_sleep,
835 	 .clock_khz = 12000,
836 	 .clock_pad_drive = 0,
837 	 .flip_chip = 1,
838 	 .charge_pump = 2,
839 };
840 
841 static int dib7070_set_param_override(struct dvb_frontend *fe)
842 {
843 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
844 	struct dvb_usb_adapter *adap = fe->dvb->priv;
845 	struct dib0700_adapter_state *state = adap->priv;
846 
847 	u16 offset;
848 	u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
849 	switch (band) {
850 		case BAND_VHF: offset = 950; break;
851 		case BAND_UHF:
852 		default: offset = 550; break;
853 	}
854 	deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
855 	state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
856 	return state->set_param_save(fe);
857 }
858 
859 static int dib7770_set_param_override(struct dvb_frontend *fe)
860 {
861 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
862 	struct dvb_usb_adapter *adap = fe->dvb->priv;
863 	struct dib0700_adapter_state *state = adap->priv;
864 
865 	u16 offset;
866 	u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
867 	switch (band) {
868 	case BAND_VHF:
869 		state->dib7000p_ops.set_gpio(fe, 0, 0, 1);
870 		offset = 850;
871 		break;
872 	case BAND_UHF:
873 	default:
874 		state->dib7000p_ops.set_gpio(fe, 0, 0, 0);
875 		offset = 250;
876 		break;
877 	}
878 	deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
879 	state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
880 	return state->set_param_save(fe);
881 }
882 
883 static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
884 {
885 	struct dib0700_adapter_state *st = adap->priv;
886 	struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
887 			 DIBX000_I2C_INTERFACE_TUNER, 1);
888 
889 	if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
890 		       &dib7770p_dib0070_config) == NULL)
891 		return -ENODEV;
892 
893 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
894 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7770_set_param_override;
895 	return 0;
896 }
897 
898 static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
899 {
900 	struct dib0700_adapter_state *st = adap->priv;
901 	struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
902 
903 	if (adap->id == 0) {
904 		if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
905 			return -ENODEV;
906 	} else {
907 		if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
908 			return -ENODEV;
909 	}
910 
911 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
912 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
913 	return 0;
914 }
915 
916 static int stk7700p_pid_filter(struct dvb_usb_adapter *adapter, int index,
917 		u16 pid, int onoff)
918 {
919 	struct dib0700_adapter_state *state = adapter->priv;
920 	struct dib0700_state *st = adapter->dev->priv;
921 
922 	if (st->is_dib7000pc)
923 		return state->dib7000p_ops.pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
924 	return dib7000m_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
925 }
926 
927 static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
928 {
929 	struct dib0700_state *st = adapter->dev->priv;
930 	struct dib0700_adapter_state *state = adapter->priv;
931 	if (st->is_dib7000pc)
932 		return state->dib7000p_ops.pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
933 	return dib7000m_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
934 }
935 
936 static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
937 {
938 	struct dib0700_adapter_state *state = adapter->priv;
939 	return state->dib7000p_ops.pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
940 }
941 
942 static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
943 {
944 	struct dib0700_adapter_state *state = adapter->priv;
945 	return state->dib7000p_ops.pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
946 }
947 
948 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
949 	.internal = 60000,
950 	.sampling = 15000,
951 	.pll_prediv = 1,
952 	.pll_ratio = 20,
953 	.pll_range = 3,
954 	.pll_reset = 1,
955 	.pll_bypass = 0,
956 	.enable_refdiv = 0,
957 	.bypclk_div = 0,
958 	.IO_CLK_en_core = 1,
959 	.ADClkSrc = 1,
960 	.modulo = 2,
961 	.sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
962 	.ifreq = (0 << 25) | 0,
963 	.timf = 20452225,
964 	.xtal_hz = 12000000,
965 };
966 
967 static struct dib7000p_config dib7070p_dib7000p_config = {
968 	.output_mpeg2_in_188_bytes = 1,
969 
970 	.agc_config_count = 1,
971 	.agc = &dib7070_agc_config,
972 	.bw  = &dib7070_bw_config_12_mhz,
973 	.tuner_is_baseband = 1,
974 	.spur_protect = 1,
975 
976 	.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
977 	.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
978 	.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
979 
980 	.hostbus_diversity = 1,
981 };
982 
983 /* STK7070P */
984 static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
985 {
986 	struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
987 	struct dib0700_adapter_state *state = adap->priv;
988 
989 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
990 		return -ENODEV;
991 
992 	if (p->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
993 	    p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
994 		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
995 	else
996 		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
997 	msleep(10);
998 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
999 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1000 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1001 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1002 
1003 	dib0700_ctrl_clock(adap->dev, 72, 1);
1004 
1005 	msleep(10);
1006 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1007 	msleep(10);
1008 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1009 
1010 	if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1011 				     &dib7070p_dib7000p_config) != 0) {
1012 		err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
1013 		    __func__);
1014 		dvb_detach(state->dib7000p_ops.set_wbd_ref);
1015 		return -ENODEV;
1016 	}
1017 
1018 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80,
1019 		&dib7070p_dib7000p_config);
1020 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1021 }
1022 
1023 /* STK7770P */
1024 static struct dib7000p_config dib7770p_dib7000p_config = {
1025 	.output_mpeg2_in_188_bytes = 1,
1026 
1027 	.agc_config_count = 1,
1028 	.agc = &dib7070_agc_config,
1029 	.bw  = &dib7070_bw_config_12_mhz,
1030 	.tuner_is_baseband = 1,
1031 	.spur_protect = 1,
1032 
1033 	.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1034 	.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1035 	.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1036 
1037 	.hostbus_diversity = 1,
1038 	.enable_current_mirror = 1,
1039 	.disable_sample_and_hold = 0,
1040 };
1041 
1042 static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap)
1043 {
1044 	struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
1045 	struct dib0700_adapter_state *state = adap->priv;
1046 
1047 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
1048 		return -ENODEV;
1049 
1050 	if (p->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
1051 	    p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
1052 		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1053 	else
1054 		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1055 	msleep(10);
1056 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1057 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1058 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1059 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1060 
1061 	dib0700_ctrl_clock(adap->dev, 72, 1);
1062 
1063 	msleep(10);
1064 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1065 	msleep(10);
1066 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1067 
1068 	if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1069 				     &dib7770p_dib7000p_config) != 0) {
1070 		err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
1071 		    __func__);
1072 		dvb_detach(state->dib7000p_ops.set_wbd_ref);
1073 		return -ENODEV;
1074 	}
1075 
1076 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80,
1077 		&dib7770p_dib7000p_config);
1078 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1079 }
1080 
1081 /* DIB807x generic */
1082 static struct dibx000_agc_config dib807x_agc_config[2] = {
1083 	{
1084 		BAND_VHF,
1085 		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1086 		 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1087 		 * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
1088 		 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1089 		 * P_agc_write=0 */
1090 		(0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
1091 			(0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1092 			(0 << 0), /* setup*/
1093 
1094 		600, /* inv_gain*/
1095 		10,  /* time_stabiliz*/
1096 
1097 		0,  /* alpha_level*/
1098 		118,  /* thlock*/
1099 
1100 		0,     /* wbd_inv*/
1101 		3530,  /* wbd_ref*/
1102 		1,     /* wbd_sel*/
1103 		5,     /* wbd_alpha*/
1104 
1105 		65535,  /* agc1_max*/
1106 		0,  /* agc1_min*/
1107 
1108 		65535,  /* agc2_max*/
1109 		0,      /* agc2_min*/
1110 
1111 		0,      /* agc1_pt1*/
1112 		40,     /* agc1_pt2*/
1113 		183,    /* agc1_pt3*/
1114 		206,    /* agc1_slope1*/
1115 		255,    /* agc1_slope2*/
1116 		72,     /* agc2_pt1*/
1117 		152,    /* agc2_pt2*/
1118 		88,     /* agc2_slope1*/
1119 		90,     /* agc2_slope2*/
1120 
1121 		17,  /* alpha_mant*/
1122 		27,  /* alpha_exp*/
1123 		23,  /* beta_mant*/
1124 		51,  /* beta_exp*/
1125 
1126 		0,  /* perform_agc_softsplit*/
1127 	}, {
1128 		BAND_UHF,
1129 		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1130 		 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1131 		 * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1132 		 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1133 		 * P_agc_write=0 */
1134 		(0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
1135 			(0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1136 			(0 << 0), /* setup */
1137 
1138 		600, /* inv_gain*/
1139 		10,  /* time_stabiliz*/
1140 
1141 		0,  /* alpha_level*/
1142 		118,  /* thlock*/
1143 
1144 		0,     /* wbd_inv*/
1145 		3530,  /* wbd_ref*/
1146 		1,     /* wbd_sel*/
1147 		5,     /* wbd_alpha*/
1148 
1149 		65535,  /* agc1_max*/
1150 		0,  /* agc1_min*/
1151 
1152 		65535,  /* agc2_max*/
1153 		0,      /* agc2_min*/
1154 
1155 		0,      /* agc1_pt1*/
1156 		40,     /* agc1_pt2*/
1157 		183,    /* agc1_pt3*/
1158 		206,    /* agc1_slope1*/
1159 		255,    /* agc1_slope2*/
1160 		72,     /* agc2_pt1*/
1161 		152,    /* agc2_pt2*/
1162 		88,     /* agc2_slope1*/
1163 		90,     /* agc2_slope2*/
1164 
1165 		17,  /* alpha_mant*/
1166 		27,  /* alpha_exp*/
1167 		23,  /* beta_mant*/
1168 		51,  /* beta_exp*/
1169 
1170 		0,  /* perform_agc_softsplit*/
1171 	}
1172 };
1173 
1174 static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
1175 	.internal = 60000,
1176 	.sampling = 15000,
1177 	.pll_prediv = 1,
1178 	.pll_ratio = 20,
1179 	.pll_range = 3,
1180 	.pll_reset = 1,
1181 	.pll_bypass = 0,
1182 	.enable_refdiv = 0,
1183 	.bypclk_div = 0,
1184 	.IO_CLK_en_core = 1,
1185 	.ADClkSrc = 1,
1186 	.modulo = 2,
1187 	.sad_cfg = (3 << 14) | (1 << 12) | (599 << 0),	/* sad_cfg: refsel, sel, freq_15k*/
1188 	.ifreq = (0 << 25) | 0,				/* ifreq = 0.000000 MHz*/
1189 	.timf = 18179755,
1190 	.xtal_hz = 12000000,
1191 };
1192 
1193 static struct dib8000_config dib807x_dib8000_config[2] = {
1194 	{
1195 		.output_mpeg2_in_188_bytes = 1,
1196 
1197 		.agc_config_count = 2,
1198 		.agc = dib807x_agc_config,
1199 		.pll = &dib807x_bw_config_12_mhz,
1200 		.tuner_is_baseband = 1,
1201 
1202 		.gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1203 		.gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1204 		.gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1205 
1206 		.hostbus_diversity = 1,
1207 		.div_cfg = 1,
1208 		.agc_control = &dib0070_ctrl_agc_filter,
1209 		.output_mode = OUTMODE_MPEG2_FIFO,
1210 		.drives = 0x2d98,
1211 	}, {
1212 		.output_mpeg2_in_188_bytes = 1,
1213 
1214 		.agc_config_count = 2,
1215 		.agc = dib807x_agc_config,
1216 		.pll = &dib807x_bw_config_12_mhz,
1217 		.tuner_is_baseband = 1,
1218 
1219 		.gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1220 		.gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1221 		.gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1222 
1223 		.hostbus_diversity = 1,
1224 		.agc_control = &dib0070_ctrl_agc_filter,
1225 		.output_mode = OUTMODE_MPEG2_FIFO,
1226 		.drives = 0x2d98,
1227 	}
1228 };
1229 
1230 static int dib80xx_tuner_reset(struct dvb_frontend *fe, int onoff)
1231 {
1232 	struct dvb_usb_adapter *adap = fe->dvb->priv;
1233 	struct dib0700_adapter_state *state = adap->priv;
1234 
1235 	return state->dib8000_ops.set_gpio(fe, 5, 0, !onoff);
1236 }
1237 
1238 static int dib80xx_tuner_sleep(struct dvb_frontend *fe, int onoff)
1239 {
1240 	struct dvb_usb_adapter *adap = fe->dvb->priv;
1241 	struct dib0700_adapter_state *state = adap->priv;
1242 
1243 	return state->dib8000_ops.set_gpio(fe, 0, 0, onoff);
1244 }
1245 
1246 static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1247     { 240,      7},
1248     { 0xffff,   6},
1249 };
1250 
1251 static struct dib0070_config dib807x_dib0070_config[2] = {
1252 	{
1253 		.i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1254 		.reset = dib80xx_tuner_reset,
1255 		.sleep = dib80xx_tuner_sleep,
1256 		.clock_khz = 12000,
1257 		.clock_pad_drive = 4,
1258 		.vga_filter = 1,
1259 		.force_crystal_mode = 1,
1260 		.enable_third_order_filter = 1,
1261 		.charge_pump = 0,
1262 		.wbd_gain = dib8070_wbd_gain_cfg,
1263 		.osc_buffer_state = 0,
1264 		.freq_offset_khz_uhf = -100,
1265 		.freq_offset_khz_vhf = -100,
1266 	}, {
1267 		.i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1268 		.reset = dib80xx_tuner_reset,
1269 		.sleep = dib80xx_tuner_sleep,
1270 		.clock_khz = 12000,
1271 		.clock_pad_drive = 2,
1272 		.vga_filter = 1,
1273 		.force_crystal_mode = 1,
1274 		.enable_third_order_filter = 1,
1275 		.charge_pump = 0,
1276 		.wbd_gain = dib8070_wbd_gain_cfg,
1277 		.osc_buffer_state = 0,
1278 		.freq_offset_khz_uhf = -25,
1279 		.freq_offset_khz_vhf = -25,
1280 	}
1281 };
1282 
1283 static int dib807x_set_param_override(struct dvb_frontend *fe)
1284 {
1285 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1286 	struct dvb_usb_adapter *adap = fe->dvb->priv;
1287 	struct dib0700_adapter_state *state = adap->priv;
1288 
1289 	u16 offset = dib0070_wbd_offset(fe);
1290 	u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
1291 	switch (band) {
1292 	case BAND_VHF:
1293 		offset += 750;
1294 		break;
1295 	case BAND_UHF:  /* fall-thru wanted */
1296 	default:
1297 		offset += 250; break;
1298 	}
1299 	deb_info("WBD for DiB8000: %d\n", offset);
1300 	state->dib8000_ops.set_wbd_ref(fe, offset);
1301 
1302 	return state->set_param_save(fe);
1303 }
1304 
1305 static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1306 {
1307 	struct dib0700_adapter_state *st = adap->priv;
1308 	struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe,
1309 			DIBX000_I2C_INTERFACE_TUNER, 1);
1310 
1311 	if (adap->id == 0) {
1312 		if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1313 				&dib807x_dib0070_config[0]) == NULL)
1314 			return -ENODEV;
1315 	} else {
1316 		if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1317 				&dib807x_dib0070_config[1]) == NULL)
1318 			return -ENODEV;
1319 	}
1320 
1321 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1322 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1323 	return 0;
1324 }
1325 
1326 static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index,
1327 	u16 pid, int onoff)
1328 {
1329 	struct dib0700_adapter_state *state = adapter->priv;
1330 
1331 	return state->dib8000_ops.pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
1332 }
1333 
1334 static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter,
1335 		int onoff)
1336 {
1337 	struct dib0700_adapter_state *state = adapter->priv;
1338 
1339 	return state->dib8000_ops.pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
1340 }
1341 
1342 /* STK807x */
1343 static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1344 {
1345 	struct dib0700_adapter_state *state = adap->priv;
1346 
1347 	if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1348 		return -ENODEV;
1349 
1350 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1351 	msleep(10);
1352 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1353 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1354 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1355 
1356 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1357 
1358 	dib0700_ctrl_clock(adap->dev, 72, 1);
1359 
1360 	msleep(10);
1361 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1362 	msleep(10);
1363 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1364 
1365 	state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1366 				0x80, 0);
1367 
1368 	adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80,
1369 			      &dib807x_dib8000_config[0]);
1370 
1371 	return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
1372 }
1373 
1374 /* STK807xPVR */
1375 static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1376 {
1377 	struct dib0700_adapter_state *state = adap->priv;
1378 
1379 	if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1380 		return -ENODEV;
1381 
1382 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1383 	msleep(30);
1384 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1385 	msleep(500);
1386 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1387 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1388 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1389 
1390 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1391 
1392 	dib0700_ctrl_clock(adap->dev, 72, 1);
1393 
1394 	msleep(10);
1395 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1396 	msleep(10);
1397 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1398 
1399 	/* initialize IC 0 */
1400 	state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80, 0);
1401 
1402 	adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80,
1403 			      &dib807x_dib8000_config[0]);
1404 
1405 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1406 }
1407 
1408 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1409 {
1410 	struct dib0700_adapter_state *state = adap->priv;
1411 
1412 	if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1413 		return -ENODEV;
1414 
1415 	/* initialize IC 1 */
1416 	state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x82, 0);
1417 
1418 	adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82,
1419 			      &dib807x_dib8000_config[1]);
1420 
1421 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1422 }
1423 
1424 /* STK8096GP */
1425 static struct dibx000_agc_config dib8090_agc_config[2] = {
1426 	{
1427 	.band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1428 	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1429 	 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1430 	 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1431 	.setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1432 	| (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1433 
1434 	.inv_gain = 787,
1435 	.time_stabiliz = 10,
1436 
1437 	.alpha_level = 0,
1438 	.thlock = 118,
1439 
1440 	.wbd_inv = 0,
1441 	.wbd_ref = 3530,
1442 	.wbd_sel = 1,
1443 	.wbd_alpha = 5,
1444 
1445 	.agc1_max = 65535,
1446 	.agc1_min = 0,
1447 
1448 	.agc2_max = 65535,
1449 	.agc2_min = 0,
1450 
1451 	.agc1_pt1 = 0,
1452 	.agc1_pt2 = 32,
1453 	.agc1_pt3 = 114,
1454 	.agc1_slope1 = 143,
1455 	.agc1_slope2 = 144,
1456 	.agc2_pt1 = 114,
1457 	.agc2_pt2 = 227,
1458 	.agc2_slope1 = 116,
1459 	.agc2_slope2 = 117,
1460 
1461 	.alpha_mant = 28,
1462 	.alpha_exp = 26,
1463 	.beta_mant = 31,
1464 	.beta_exp = 51,
1465 
1466 	.perform_agc_softsplit = 0,
1467 	},
1468 	{
1469 	.band_caps = BAND_CBAND,
1470 	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1471 	 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1472 	 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1473 	.setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1474 	| (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1475 
1476 	.inv_gain = 787,
1477 	.time_stabiliz = 10,
1478 
1479 	.alpha_level = 0,
1480 	.thlock = 118,
1481 
1482 	.wbd_inv = 0,
1483 	.wbd_ref = 3530,
1484 	.wbd_sel = 1,
1485 	.wbd_alpha = 5,
1486 
1487 	.agc1_max = 0,
1488 	.agc1_min = 0,
1489 
1490 	.agc2_max = 65535,
1491 	.agc2_min = 0,
1492 
1493 	.agc1_pt1 = 0,
1494 	.agc1_pt2 = 32,
1495 	.agc1_pt3 = 114,
1496 	.agc1_slope1 = 143,
1497 	.agc1_slope2 = 144,
1498 	.agc2_pt1 = 114,
1499 	.agc2_pt2 = 227,
1500 	.agc2_slope1 = 116,
1501 	.agc2_slope2 = 117,
1502 
1503 	.alpha_mant = 28,
1504 	.alpha_exp = 26,
1505 	.beta_mant = 31,
1506 	.beta_exp = 51,
1507 
1508 	.perform_agc_softsplit = 0,
1509 	}
1510 };
1511 
1512 static struct dibx000_bandwidth_config dib8090_pll_config_12mhz = {
1513 	.internal = 54000,
1514 	.sampling = 13500,
1515 
1516 	.pll_prediv = 1,
1517 	.pll_ratio = 18,
1518 	.pll_range = 3,
1519 	.pll_reset = 1,
1520 	.pll_bypass = 0,
1521 
1522 	.enable_refdiv = 0,
1523 	.bypclk_div = 0,
1524 	.IO_CLK_en_core = 1,
1525 	.ADClkSrc = 1,
1526 	.modulo = 2,
1527 
1528 	.sad_cfg = (3 << 14) | (1 << 12) | (599 << 0),
1529 
1530 	.ifreq = (0 << 25) | 0,
1531 	.timf = 20199727,
1532 
1533 	.xtal_hz = 12000000,
1534 };
1535 
1536 static int dib8090_get_adc_power(struct dvb_frontend *fe)
1537 {
1538 	struct dvb_usb_adapter *adap = fe->dvb->priv;
1539 	struct dib0700_adapter_state *state = adap->priv;
1540 
1541 	return state->dib8000_ops.get_adc_power(fe, 1);
1542 }
1543 
1544 static void dib8090_agc_control(struct dvb_frontend *fe, u8 restart)
1545 {
1546 	deb_info("AGC control callback: %i\n", restart);
1547 	dib0090_dcc_freq(fe, restart);
1548 
1549 	if (restart == 0) /* before AGC startup */
1550 		dib0090_set_dc_servo(fe, 1);
1551 }
1552 
1553 static struct dib8000_config dib809x_dib8000_config[2] = {
1554 	{
1555 	.output_mpeg2_in_188_bytes = 1,
1556 
1557 	.agc_config_count = 2,
1558 	.agc = dib8090_agc_config,
1559 	.agc_control = dib8090_agc_control,
1560 	.pll = &dib8090_pll_config_12mhz,
1561 	.tuner_is_baseband = 1,
1562 
1563 	.gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1564 	.gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1565 	.gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1566 
1567 	.hostbus_diversity = 1,
1568 	.div_cfg = 0x31,
1569 	.output_mode = OUTMODE_MPEG2_FIFO,
1570 	.drives = 0x2d98,
1571 	.diversity_delay = 48,
1572 	.refclksel = 3,
1573 	}, {
1574 	.output_mpeg2_in_188_bytes = 1,
1575 
1576 	.agc_config_count = 2,
1577 	.agc = dib8090_agc_config,
1578 	.agc_control = dib8090_agc_control,
1579 	.pll = &dib8090_pll_config_12mhz,
1580 	.tuner_is_baseband = 1,
1581 
1582 	.gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1583 	.gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1584 	.gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1585 
1586 	.hostbus_diversity = 1,
1587 	.div_cfg = 0x31,
1588 	.output_mode = OUTMODE_DIVERSITY,
1589 	.drives = 0x2d08,
1590 	.diversity_delay = 1,
1591 	.refclksel = 3,
1592 	}
1593 };
1594 
1595 static struct dib0090_wbd_slope dib8090_wbd_table[] = {
1596 	/* max freq ; cold slope ; cold offset ; warm slope ; warm offset ; wbd gain */
1597 	{ 120,     0, 500,  0,   500, 4 }, /* CBAND */
1598 	{ 170,     0, 450,  0,   450, 4 }, /* CBAND */
1599 	{ 380,    48, 373, 28,   259, 6 }, /* VHF */
1600 	{ 860,    34, 700, 36,   616, 6 }, /* high UHF */
1601 	{ 0xFFFF, 34, 700, 36,   616, 6 }, /* default */
1602 };
1603 
1604 static struct dib0090_config dib809x_dib0090_config = {
1605 	.io.pll_bypass = 1,
1606 	.io.pll_range = 1,
1607 	.io.pll_prediv = 1,
1608 	.io.pll_loopdiv = 20,
1609 	.io.adc_clock_ratio = 8,
1610 	.io.pll_int_loop_filt = 0,
1611 	.io.clock_khz = 12000,
1612 	.reset = dib80xx_tuner_reset,
1613 	.sleep = dib80xx_tuner_sleep,
1614 	.clkouttobamse = 1,
1615 	.analog_output = 1,
1616 	.i2c_address = DEFAULT_DIB0090_I2C_ADDRESS,
1617 	.use_pwm_agc = 1,
1618 	.clkoutdrive = 1,
1619 	.get_adc_power = dib8090_get_adc_power,
1620 	.freq_offset_khz_uhf = -63,
1621 	.freq_offset_khz_vhf = -143,
1622 	.wbd = dib8090_wbd_table,
1623 	.fref_clock_ratio = 6,
1624 };
1625 
1626 static u8 dib8090_compute_pll_parameters(struct dvb_frontend *fe)
1627 {
1628 	u8 optimal_pll_ratio = 20;
1629 	u32 freq_adc, ratio, rest, max = 0;
1630 	u8 pll_ratio;
1631 
1632 	for (pll_ratio = 17; pll_ratio <= 20; pll_ratio++) {
1633 		freq_adc = 12 * pll_ratio * (1 << 8) / 16;
1634 		ratio = ((fe->dtv_property_cache.frequency / 1000) * (1 << 8) / 1000) / freq_adc;
1635 		rest = ((fe->dtv_property_cache.frequency / 1000) * (1 << 8) / 1000) - ratio * freq_adc;
1636 
1637 		if (rest > freq_adc / 2)
1638 			rest = freq_adc - rest;
1639 		deb_info("PLL ratio=%i rest=%i\n", pll_ratio, rest);
1640 		if ((rest > max) && (rest > 717)) {
1641 			optimal_pll_ratio = pll_ratio;
1642 			max = rest;
1643 		}
1644 	}
1645 	deb_info("optimal PLL ratio=%i\n", optimal_pll_ratio);
1646 
1647 	return optimal_pll_ratio;
1648 }
1649 
1650 static int dib8096_set_param_override(struct dvb_frontend *fe)
1651 {
1652 	struct dvb_usb_adapter *adap = fe->dvb->priv;
1653 	struct dib0700_adapter_state *state = adap->priv;
1654 	u8 pll_ratio, band = BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000);
1655 	u16 target, ltgain, rf_gain_limit;
1656 	u32 timf;
1657 	int ret = 0;
1658 	enum frontend_tune_state tune_state = CT_SHUTDOWN;
1659 
1660 	switch (band) {
1661 	default:
1662 			deb_info("Warning : Rf frequency  (%iHz) is not in the supported range, using VHF switch ", fe->dtv_property_cache.frequency);
1663 			/* fall through */
1664 	case BAND_VHF:
1665 			state->dib8000_ops.set_gpio(fe, 3, 0, 1);
1666 			break;
1667 	case BAND_UHF:
1668 			state->dib8000_ops.set_gpio(fe, 3, 0, 0);
1669 			break;
1670 	}
1671 
1672 	ret = state->set_param_save(fe);
1673 	if (ret < 0)
1674 		return ret;
1675 
1676 	if (fe->dtv_property_cache.bandwidth_hz != 6000000) {
1677 		deb_info("only 6MHz bandwidth is supported\n");
1678 		return -EINVAL;
1679 	}
1680 
1681 	/* Update PLL if needed ratio */
1682 	state->dib8000_ops.update_pll(fe, &dib8090_pll_config_12mhz, fe->dtv_property_cache.bandwidth_hz / 1000, 0);
1683 
1684 	/* Get optimize PLL ratio to remove spurious */
1685 	pll_ratio = dib8090_compute_pll_parameters(fe);
1686 	if (pll_ratio == 17)
1687 		timf = 21387946;
1688 	else if (pll_ratio == 18)
1689 		timf = 20199727;
1690 	else if (pll_ratio == 19)
1691 		timf = 19136583;
1692 	else
1693 		timf = 18179756;
1694 
1695 	/* Update ratio */
1696 	state->dib8000_ops.update_pll(fe, &dib8090_pll_config_12mhz, fe->dtv_property_cache.bandwidth_hz / 1000, pll_ratio);
1697 
1698 	state->dib8000_ops.ctrl_timf(fe, DEMOD_TIMF_SET, timf);
1699 
1700 	if (band != BAND_CBAND) {
1701 		/* dib0090_get_wbd_target is returning any possible temperature compensated wbd-target */
1702 		target = (dib0090_get_wbd_target(fe) * 8 * 18 / 33 + 1) / 2;
1703 		state->dib8000_ops.set_wbd_ref(fe, target);
1704 	}
1705 
1706 	if (band == BAND_CBAND) {
1707 		deb_info("tuning in CBAND - soft-AGC startup\n");
1708 		dib0090_set_tune_state(fe, CT_AGC_START);
1709 
1710 		do {
1711 			ret = dib0090_gain_control(fe);
1712 			msleep(ret);
1713 			tune_state = dib0090_get_tune_state(fe);
1714 			if (tune_state == CT_AGC_STEP_0)
1715 				state->dib8000_ops.set_gpio(fe, 6, 0, 1);
1716 			else if (tune_state == CT_AGC_STEP_1) {
1717 				dib0090_get_current_gain(fe, NULL, NULL, &rf_gain_limit, &ltgain);
1718 				if (rf_gain_limit < 2000) /* activate the external attenuator in case of very high input power */
1719 					state->dib8000_ops.set_gpio(fe, 6, 0, 0);
1720 			}
1721 		} while (tune_state < CT_AGC_STOP);
1722 
1723 		deb_info("switching to PWM AGC\n");
1724 		dib0090_pwm_gain_reset(fe);
1725 		state->dib8000_ops.pwm_agc_reset(fe);
1726 		state->dib8000_ops.set_tune_state(fe, CT_DEMOD_START);
1727 	} else {
1728 		/* for everything else than CBAND we are using standard AGC */
1729 		deb_info("not tuning in CBAND - standard AGC startup\n");
1730 		dib0090_pwm_gain_reset(fe);
1731 	}
1732 
1733 	return 0;
1734 }
1735 
1736 static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
1737 {
1738 	struct dib0700_adapter_state *st = adap->priv;
1739 	struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1740 
1741 	if (adap->id == 0) {
1742 		if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1743 			return -ENODEV;
1744 	} else {
1745 		/* FIXME: check if it is fe_adap[1] */
1746 		if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1747 			return -ENODEV;
1748 	}
1749 
1750 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1751 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1752 	return 0;
1753 }
1754 
1755 static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1756 {
1757 	struct dib0700_adapter_state *state = adap->priv;
1758 
1759 	if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1760 		return -ENODEV;
1761 
1762 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1763 	msleep(10);
1764 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1765 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1766 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1767 
1768 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1769 
1770 	dib0700_ctrl_clock(adap->dev, 72, 1);
1771 
1772 	msleep(10);
1773 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1774 	msleep(10);
1775 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1776 
1777 	state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80, 0);
1778 
1779 	adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1780 
1781 	return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
1782 }
1783 
1784 static int stk809x_frontend1_attach(struct dvb_usb_adapter *adap)
1785 {
1786 	struct dib0700_adapter_state *state = adap->priv;
1787 
1788 	if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1789 		return -ENODEV;
1790 
1791 	state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x82, 0);
1792 
1793 	adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
1794 
1795 	return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
1796 }
1797 
1798 static int nim8096md_tuner_attach(struct dvb_usb_adapter *adap)
1799 {
1800 	struct dib0700_adapter_state *st = adap->priv;
1801 	struct i2c_adapter *tun_i2c;
1802 	struct dvb_frontend *fe_slave  = st->dib8000_ops.get_slave_frontend(adap->fe_adap[0].fe, 1);
1803 
1804 	if (fe_slave) {
1805 		tun_i2c = st->dib8000_ops.get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1);
1806 		if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL)
1807 			return -ENODEV;
1808 		fe_slave->dvb = adap->fe_adap[0].fe->dvb;
1809 		fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override;
1810 	}
1811 	tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1812 	if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1813 		return -ENODEV;
1814 
1815 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1816 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1817 
1818 	return 0;
1819 }
1820 
1821 static int nim8096md_frontend_attach(struct dvb_usb_adapter *adap)
1822 {
1823 	struct dvb_frontend *fe_slave;
1824 	struct dib0700_adapter_state *state = adap->priv;
1825 
1826 	if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1827 		return -ENODEV;
1828 
1829 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1830 	msleep(20);
1831 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1832 	msleep(1000);
1833 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1834 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1835 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1836 
1837 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1838 
1839 	dib0700_ctrl_clock(adap->dev, 72, 1);
1840 
1841 	msleep(20);
1842 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1843 	msleep(20);
1844 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1845 
1846 	state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80, 0);
1847 
1848 	adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1849 	if (adap->fe_adap[0].fe == NULL)
1850 		return -ENODEV;
1851 
1852 	/* Needed to increment refcount */
1853 	if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
1854 		return -ENODEV;
1855 
1856 	fe_slave = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
1857 	state->dib8000_ops.set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
1858 
1859 	return fe_slave == NULL ?  -ENODEV : 0;
1860 }
1861 
1862 /* TFE8096P */
1863 static struct dibx000_agc_config dib8096p_agc_config[2] = {
1864 	{
1865 		.band_caps		= BAND_UHF,
1866 		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1867 		   P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1868 		   P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1869 		   P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1870 		   P_agc_write=0 */
1871 		.setup			= (0 << 15) | (0 << 14) | (5 << 11)
1872 			| (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5)
1873 			| (0 << 4) | (5 << 1) | (0 << 0),
1874 
1875 		.inv_gain		= 684,
1876 		.time_stabiliz	= 10,
1877 
1878 		.alpha_level	= 0,
1879 		.thlock			= 118,
1880 
1881 		.wbd_inv		= 0,
1882 		.wbd_ref		= 1200,
1883 		.wbd_sel		= 3,
1884 		.wbd_alpha		= 5,
1885 
1886 		.agc1_max		= 65535,
1887 		.agc1_min		= 0,
1888 
1889 		.agc2_max		= 32767,
1890 		.agc2_min		= 0,
1891 
1892 		.agc1_pt1		= 0,
1893 		.agc1_pt2		= 0,
1894 		.agc1_pt3		= 105,
1895 		.agc1_slope1	= 0,
1896 		.agc1_slope2	= 156,
1897 		.agc2_pt1		= 105,
1898 		.agc2_pt2		= 255,
1899 		.agc2_slope1	= 54,
1900 		.agc2_slope2	= 0,
1901 
1902 		.alpha_mant		= 28,
1903 		.alpha_exp		= 26,
1904 		.beta_mant		= 31,
1905 		.beta_exp		= 51,
1906 
1907 		.perform_agc_softsplit = 0,
1908 	} , {
1909 		.band_caps		= BAND_FM | BAND_VHF | BAND_CBAND,
1910 		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1911 		   P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1912 		   P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1913 		   P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1914 		   P_agc_write=0 */
1915 		.setup			= (0 << 15) | (0 << 14) | (5 << 11)
1916 			| (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5)
1917 			| (0 << 4) | (5 << 1) | (0 << 0),
1918 
1919 		.inv_gain		= 732,
1920 		.time_stabiliz  = 10,
1921 
1922 		.alpha_level	= 0,
1923 		.thlock			= 118,
1924 
1925 		.wbd_inv		= 0,
1926 		.wbd_ref		= 1200,
1927 		.wbd_sel		= 3,
1928 		.wbd_alpha		= 5,
1929 
1930 		.agc1_max		= 65535,
1931 		.agc1_min		= 0,
1932 
1933 		.agc2_max		= 32767,
1934 		.agc2_min		= 0,
1935 
1936 		.agc1_pt1		= 0,
1937 		.agc1_pt2		= 0,
1938 		.agc1_pt3		= 98,
1939 		.agc1_slope1	= 0,
1940 		.agc1_slope2	= 167,
1941 		.agc2_pt1		= 98,
1942 		.agc2_pt2		= 255,
1943 		.agc2_slope1	= 52,
1944 		.agc2_slope2	= 0,
1945 
1946 		.alpha_mant		= 28,
1947 		.alpha_exp		= 26,
1948 		.beta_mant		= 31,
1949 		.beta_exp		= 51,
1950 
1951 		.perform_agc_softsplit = 0,
1952 	}
1953 };
1954 
1955 static struct dibx000_bandwidth_config dib8096p_clock_config_12_mhz = {
1956 	.internal = 108000,
1957 	.sampling = 13500,
1958 	.pll_prediv = 1,
1959 	.pll_ratio = 9,
1960 	.pll_range = 1,
1961 	.pll_reset = 0,
1962 	.pll_bypass = 0,
1963 	.enable_refdiv = 0,
1964 	.bypclk_div = 0,
1965 	.IO_CLK_en_core = 0,
1966 	.ADClkSrc = 0,
1967 	.modulo = 2,
1968 	.sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
1969 	.ifreq = (0 << 25) | 0,
1970 	.timf = 20199729,
1971 	.xtal_hz = 12000000,
1972 };
1973 
1974 static struct dib8000_config tfe8096p_dib8000_config = {
1975 	.output_mpeg2_in_188_bytes	= 1,
1976 	.hostbus_diversity			= 1,
1977 	.update_lna					= NULL,
1978 
1979 	.agc_config_count			= 2,
1980 	.agc						= dib8096p_agc_config,
1981 	.pll						= &dib8096p_clock_config_12_mhz,
1982 
1983 	.gpio_dir					= DIB8000_GPIO_DEFAULT_DIRECTIONS,
1984 	.gpio_val					= DIB8000_GPIO_DEFAULT_VALUES,
1985 	.gpio_pwm_pos				= DIB8000_GPIO_DEFAULT_PWM_POS,
1986 
1987 	.agc_control				= NULL,
1988 	.diversity_delay			= 48,
1989 	.output_mode				= OUTMODE_MPEG2_FIFO,
1990 	.enMpegOutput				= 1,
1991 };
1992 
1993 static struct dib0090_wbd_slope dib8096p_wbd_table[] = {
1994 	{ 380, 81, 850, 64, 540, 4},
1995 	{ 860, 51, 866, 21, 375, 4},
1996 	{1700, 0, 250, 0, 100, 6},
1997 	{2600, 0, 250, 0, 100, 6},
1998 	{ 0xFFFF, 0, 0, 0, 0, 0},
1999 };
2000 
2001 static struct dib0090_config tfe8096p_dib0090_config = {
2002 	.io.clock_khz			= 12000,
2003 	.io.pll_bypass			= 0,
2004 	.io.pll_range			= 0,
2005 	.io.pll_prediv			= 3,
2006 	.io.pll_loopdiv			= 6,
2007 	.io.adc_clock_ratio		= 0,
2008 	.io.pll_int_loop_filt	= 0,
2009 
2010 	.freq_offset_khz_uhf	= -143,
2011 	.freq_offset_khz_vhf	= -143,
2012 
2013 	.get_adc_power			= dib8090_get_adc_power,
2014 
2015 	.clkouttobamse			= 1,
2016 	.analog_output			= 0,
2017 
2018 	.wbd_vhf_offset			= 0,
2019 	.wbd_cband_offset		= 0,
2020 	.use_pwm_agc			= 1,
2021 	.clkoutdrive			= 0,
2022 
2023 	.fref_clock_ratio		= 1,
2024 
2025 	.ls_cfg_pad_drv			= 0,
2026 	.data_tx_drv			= 0,
2027 	.low_if					= NULL,
2028 	.in_soc					= 1,
2029 	.force_cband_input		= 0,
2030 };
2031 
2032 struct dibx090p_adc {
2033 	u32 freq;			/* RF freq MHz */
2034 	u32 timf;			/* New Timf */
2035 	u32 pll_loopdiv;	/* New prediv */
2036 	u32 pll_prediv;		/* New loopdiv */
2037 };
2038 
2039 struct dibx090p_best_adc {
2040 	u32 timf;
2041 	u32 pll_loopdiv;
2042 	u32 pll_prediv;
2043 };
2044 
2045 static int dib8096p_get_best_sampling(struct dvb_frontend *fe, struct dibx090p_best_adc *adc)
2046 {
2047 	u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1;
2048 	u16 xtal = 12000;
2049 	u16 fcp_min = 1900;  /* PLL, Minimum Frequency of phase comparator (KHz) */
2050 	u16 fcp_max = 20000; /* PLL, Maximum Frequency of phase comparator (KHz) */
2051 	u32 fmem_max = 140000; /* 140MHz max SDRAM freq */
2052 	u32 fdem_min = 66000;
2053 	u32 fcp = 0, fs = 0, fdem = 0, fmem = 0;
2054 	u32 harmonic_id = 0;
2055 
2056 	adc->timf = 0;
2057 	adc->pll_loopdiv = loopdiv;
2058 	adc->pll_prediv = prediv;
2059 
2060 	deb_info("bandwidth = %d", fe->dtv_property_cache.bandwidth_hz);
2061 
2062 	/* Find Min and Max prediv */
2063 	while ((xtal / max_prediv) >= fcp_min)
2064 		max_prediv++;
2065 
2066 	max_prediv--;
2067 	min_prediv = max_prediv;
2068 	while ((xtal / min_prediv) <= fcp_max) {
2069 		min_prediv--;
2070 		if (min_prediv == 1)
2071 			break;
2072 	}
2073 	deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv);
2074 
2075 	min_prediv = 1;
2076 
2077 	for (prediv = min_prediv; prediv < max_prediv; prediv++) {
2078 		fcp = xtal / prediv;
2079 		if (fcp > fcp_min && fcp < fcp_max) {
2080 			for (loopdiv = 1; loopdiv < 64; loopdiv++) {
2081 				fmem = ((xtal/prediv) * loopdiv);
2082 				fdem = fmem / 2;
2083 				fs   = fdem / 4;
2084 
2085 				/* test min/max system restrictions */
2086 				if ((fdem >= fdem_min) && (fmem <= fmem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz / 1000)) {
2087 					spur = 0;
2088 					/* test fs harmonics positions */
2089 					for (harmonic_id = (fe->dtv_property_cache.frequency / (1000 * fs));  harmonic_id <= ((fe->dtv_property_cache.frequency / (1000 * fs)) + 1); harmonic_id++) {
2090 						if (((fs * harmonic_id) >= (fe->dtv_property_cache.frequency / 1000 - (fe->dtv_property_cache.bandwidth_hz / 2000))) &&  ((fs * harmonic_id) <= (fe->dtv_property_cache.frequency / 1000 + (fe->dtv_property_cache.bandwidth_hz / 2000)))) {
2091 							spur = 1;
2092 							break;
2093 						}
2094 					}
2095 
2096 					if (!spur) {
2097 						adc->pll_loopdiv = loopdiv;
2098 						adc->pll_prediv = prediv;
2099 						adc->timf = (4260880253U / fdem) * (1 << 8);
2100 						adc->timf += ((4260880253U % fdem) << 8) / fdem;
2101 
2102 						deb_info("RF %6d; BW %6d; Xtal %6d; Fmem %6d; Fdem %6d; Fs %6d; Prediv %2d; Loopdiv %2d; Timf %8d;", fe->dtv_property_cache.frequency, fe->dtv_property_cache.bandwidth_hz, xtal, fmem, fdem, fs, prediv, loopdiv, adc->timf);
2103 						break;
2104 					}
2105 				}
2106 			}
2107 		}
2108 		if (!spur)
2109 			break;
2110 	}
2111 
2112 	if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0)
2113 		return -EINVAL;
2114 	return 0;
2115 }
2116 
2117 static int dib8096p_agc_startup(struct dvb_frontend *fe)
2118 {
2119 	struct dvb_usb_adapter *adap = fe->dvb->priv;
2120 	struct dib0700_adapter_state *state = adap->priv;
2121 	struct dibx000_bandwidth_config pll;
2122 	struct dibx090p_best_adc adc;
2123 	u16 target;
2124 	int ret;
2125 
2126 	ret = state->set_param_save(fe);
2127 	if (ret < 0)
2128 		return ret;
2129 	memset(&pll, 0, sizeof(struct dibx000_bandwidth_config));
2130 
2131 	dib0090_pwm_gain_reset(fe);
2132 	/* dib0090_get_wbd_target is returning any possible
2133 	   temperature compensated wbd-target */
2134 	target = (dib0090_get_wbd_target(fe) * 8  + 1) / 2;
2135 	state->dib8000_ops.set_wbd_ref(fe, target);
2136 
2137 	if (dib8096p_get_best_sampling(fe, &adc) == 0) {
2138 		pll.pll_ratio  = adc.pll_loopdiv;
2139 		pll.pll_prediv = adc.pll_prediv;
2140 
2141 		dib0700_set_i2c_speed(adap->dev, 200);
2142 		state->dib8000_ops.update_pll(fe, &pll, fe->dtv_property_cache.bandwidth_hz / 1000, 0);
2143 		state->dib8000_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf);
2144 		dib0700_set_i2c_speed(adap->dev, 1000);
2145 	}
2146 	return 0;
2147 }
2148 
2149 static int tfe8096p_frontend_attach(struct dvb_usb_adapter *adap)
2150 {
2151 	struct dib0700_state *st = adap->dev->priv;
2152 	u32 fw_version;
2153 	struct dib0700_adapter_state *state = adap->priv;
2154 
2155 	if (!dvb_attach(dib8000_attach, &state->dib8000_ops))
2156 		return -ENODEV;
2157 
2158 	dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
2159 	if (fw_version >= 0x10200)
2160 		st->fw_use_new_i2c_api = 1;
2161 
2162 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2163 	msleep(20);
2164 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2165 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2166 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2167 
2168 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2169 
2170 	dib0700_ctrl_clock(adap->dev, 72, 1);
2171 
2172 	msleep(20);
2173 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2174 	msleep(20);
2175 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2176 
2177 	state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80, 1);
2178 
2179 	adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap,
2180 					     0x80, &tfe8096p_dib8000_config);
2181 
2182 	return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
2183 }
2184 
2185 static int tfe8096p_tuner_attach(struct dvb_usb_adapter *adap)
2186 {
2187 	struct dib0700_adapter_state *st = adap->priv;
2188 	struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_tuner(adap->fe_adap[0].fe);
2189 
2190 	tfe8096p_dib0090_config.reset = st->dib8000_ops.tuner_sleep;
2191 	tfe8096p_dib0090_config.sleep = st->dib8000_ops.tuner_sleep;
2192 	tfe8096p_dib0090_config.wbd = dib8096p_wbd_table;
2193 
2194 	if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c,
2195 				&tfe8096p_dib0090_config) == NULL)
2196 		return -ENODEV;
2197 
2198 	st->dib8000_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2199 
2200 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
2201 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096p_agc_startup;
2202 	return 0;
2203 }
2204 
2205 /* STK9090M */
2206 static int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
2207 {
2208 	return dib9000_fw_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
2209 }
2210 
2211 static int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
2212 {
2213 	return dib9000_fw_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
2214 }
2215 
2216 static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff)
2217 {
2218 	return dib9000_set_gpio(fe, 5, 0, !onoff);
2219 }
2220 
2221 static int dib90x0_tuner_sleep(struct dvb_frontend *fe, int onoff)
2222 {
2223 	return dib9000_set_gpio(fe, 0, 0, onoff);
2224 }
2225 
2226 static int dib01x0_pmu_update(struct i2c_adapter *i2c, u16 *data, u8 len)
2227 {
2228 	u8 wb[4] = { 0xc >> 8, 0xc & 0xff, 0, 0 };
2229 	u8 rb[2];
2230 	struct i2c_msg msg[2] = {
2231 		{.addr = 0x1e >> 1, .flags = 0, .buf = wb, .len = 2},
2232 		{.addr = 0x1e >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2},
2233 	};
2234 	u8 index_data;
2235 
2236 	dibx000_i2c_set_speed(i2c, 250);
2237 
2238 	if (i2c_transfer(i2c, msg, 2) != 2)
2239 		return -EIO;
2240 
2241 	switch (rb[0] << 8 | rb[1]) {
2242 	case 0:
2243 			deb_info("Found DiB0170 rev1: This version of DiB0170 is not supported any longer.\n");
2244 			return -EIO;
2245 	case 1:
2246 			deb_info("Found DiB0170 rev2");
2247 			break;
2248 	case 2:
2249 			deb_info("Found DiB0190 rev2");
2250 			break;
2251 	default:
2252 			deb_info("DiB01x0 not found");
2253 			return -EIO;
2254 	}
2255 
2256 	for (index_data = 0; index_data < len; index_data += 2) {
2257 		wb[2] = (data[index_data + 1] >> 8) & 0xff;
2258 		wb[3] = (data[index_data + 1]) & 0xff;
2259 
2260 		if (data[index_data] == 0) {
2261 			wb[0] = (data[index_data] >> 8) & 0xff;
2262 			wb[1] = (data[index_data]) & 0xff;
2263 			msg[0].len = 2;
2264 			if (i2c_transfer(i2c, msg, 2) != 2)
2265 				return -EIO;
2266 			wb[2] |= rb[0];
2267 			wb[3] |= rb[1] & ~(3 << 4);
2268 		}
2269 
2270 		wb[0] = (data[index_data] >> 8)&0xff;
2271 		wb[1] = (data[index_data])&0xff;
2272 		msg[0].len = 4;
2273 		if (i2c_transfer(i2c, &msg[0], 1) != 1)
2274 			return -EIO;
2275 	}
2276 	return 0;
2277 }
2278 
2279 static struct dib9000_config stk9090m_config = {
2280 	.output_mpeg2_in_188_bytes = 1,
2281 	.output_mode = OUTMODE_MPEG2_FIFO,
2282 	.vcxo_timer = 279620,
2283 	.timing_frequency = 20452225,
2284 	.demod_clock_khz = 60000,
2285 	.xtal_clock_khz = 30000,
2286 	.if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
2287 	.subband = {
2288 		2,
2289 		{
2290 			{ 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0008 } }, /* GPIO 3 to 1 for VHF */
2291 			{ 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0000 } }, /* GPIO 3 to 0 for UHF */
2292 			{ 0 },
2293 		},
2294 	},
2295 	.gpio_function = {
2296 		{ .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 },
2297 		{ .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 },
2298 	},
2299 };
2300 
2301 static struct dib9000_config nim9090md_config[2] = {
2302 	{
2303 		.output_mpeg2_in_188_bytes = 1,
2304 		.output_mode = OUTMODE_MPEG2_FIFO,
2305 		.vcxo_timer = 279620,
2306 		.timing_frequency = 20452225,
2307 		.demod_clock_khz = 60000,
2308 		.xtal_clock_khz = 30000,
2309 		.if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
2310 	}, {
2311 		.output_mpeg2_in_188_bytes = 1,
2312 		.output_mode = OUTMODE_DIVERSITY,
2313 		.vcxo_timer = 279620,
2314 		.timing_frequency = 20452225,
2315 		.demod_clock_khz = 60000,
2316 		.xtal_clock_khz = 30000,
2317 		.if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
2318 		.subband = {
2319 			2,
2320 			{
2321 				{ 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0006 } }, /* GPIO 1 and 2 to 1 for VHF */
2322 				{ 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0000 } }, /* GPIO 1 and 2 to 0 for UHF */
2323 				{ 0 },
2324 			},
2325 		},
2326 		.gpio_function = {
2327 			{ .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 },
2328 			{ .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 },
2329 		},
2330 	}
2331 };
2332 
2333 static struct dib0090_config dib9090_dib0090_config = {
2334 	.io.pll_bypass = 0,
2335 	.io.pll_range = 1,
2336 	.io.pll_prediv = 1,
2337 	.io.pll_loopdiv = 8,
2338 	.io.adc_clock_ratio = 8,
2339 	.io.pll_int_loop_filt = 0,
2340 	.io.clock_khz = 30000,
2341 	.reset = dib90x0_tuner_reset,
2342 	.sleep = dib90x0_tuner_sleep,
2343 	.clkouttobamse = 0,
2344 	.analog_output = 0,
2345 	.use_pwm_agc = 0,
2346 	.clkoutdrive = 0,
2347 	.freq_offset_khz_uhf = 0,
2348 	.freq_offset_khz_vhf = 0,
2349 };
2350 
2351 static struct dib0090_config nim9090md_dib0090_config[2] = {
2352 	{
2353 		.io.pll_bypass = 0,
2354 		.io.pll_range = 1,
2355 		.io.pll_prediv = 1,
2356 		.io.pll_loopdiv = 8,
2357 		.io.adc_clock_ratio = 8,
2358 		.io.pll_int_loop_filt = 0,
2359 		.io.clock_khz = 30000,
2360 		.reset = dib90x0_tuner_reset,
2361 		.sleep = dib90x0_tuner_sleep,
2362 		.clkouttobamse = 1,
2363 		.analog_output = 0,
2364 		.use_pwm_agc = 0,
2365 		.clkoutdrive = 0,
2366 		.freq_offset_khz_uhf = 0,
2367 		.freq_offset_khz_vhf = 0,
2368 	}, {
2369 		.io.pll_bypass = 0,
2370 		.io.pll_range = 1,
2371 		.io.pll_prediv = 1,
2372 		.io.pll_loopdiv = 8,
2373 		.io.adc_clock_ratio = 8,
2374 		.io.pll_int_loop_filt = 0,
2375 		.io.clock_khz = 30000,
2376 		.reset = dib90x0_tuner_reset,
2377 		.sleep = dib90x0_tuner_sleep,
2378 		.clkouttobamse = 0,
2379 		.analog_output = 0,
2380 		.use_pwm_agc = 0,
2381 		.clkoutdrive = 0,
2382 		.freq_offset_khz_uhf = 0,
2383 		.freq_offset_khz_vhf = 0,
2384 	}
2385 };
2386 
2387 
2388 static int stk9090m_frontend_attach(struct dvb_usb_adapter *adap)
2389 {
2390 	struct dib0700_adapter_state *state = adap->priv;
2391 	struct dib0700_state *st = adap->dev->priv;
2392 	u32 fw_version;
2393 
2394 	/* Make use of the new i2c functions from FW 1.20 */
2395 	dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
2396 	if (fw_version >= 0x10200)
2397 		st->fw_use_new_i2c_api = 1;
2398 	dib0700_set_i2c_speed(adap->dev, 340);
2399 
2400 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2401 	msleep(20);
2402 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2403 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2404 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2405 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2406 
2407 	dib0700_ctrl_clock(adap->dev, 72, 1);
2408 
2409 	msleep(20);
2410 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2411 	msleep(20);
2412 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2413 
2414 	dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80);
2415 
2416 	if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
2417 		deb_info("%s: Upload failed. (file not found?)\n", __func__);
2418 		return -ENODEV;
2419 	} else {
2420 		deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size);
2421 	}
2422 	stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size;
2423 	stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data;
2424 
2425 	adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config);
2426 
2427 	return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
2428 }
2429 
2430 static int dib9090_tuner_attach(struct dvb_usb_adapter *adap)
2431 {
2432 	struct dib0700_adapter_state *state = adap->priv;
2433 	struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
2434 	u16 data_dib190[10] = {
2435 		1, 0x1374,
2436 		2, 0x01a2,
2437 		7, 0x0020,
2438 		0, 0x00ef,
2439 		8, 0x0486,
2440 	};
2441 
2442 	if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL)
2443 		return -ENODEV;
2444 	i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
2445 	if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0)
2446 		return -ENODEV;
2447 	dib0700_set_i2c_speed(adap->dev, 1500);
2448 	if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
2449 		return -ENODEV;
2450 	release_firmware(state->frontend_firmware);
2451 	return 0;
2452 }
2453 
2454 static int nim9090md_frontend_attach(struct dvb_usb_adapter *adap)
2455 {
2456 	struct dib0700_adapter_state *state = adap->priv;
2457 	struct dib0700_state *st = adap->dev->priv;
2458 	struct i2c_adapter *i2c;
2459 	struct dvb_frontend *fe_slave;
2460 	u32 fw_version;
2461 
2462 	/* Make use of the new i2c functions from FW 1.20 */
2463 	dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
2464 	if (fw_version >= 0x10200)
2465 		st->fw_use_new_i2c_api = 1;
2466 	dib0700_set_i2c_speed(adap->dev, 340);
2467 
2468 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2469 	msleep(20);
2470 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2471 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2472 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2473 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2474 
2475 	dib0700_ctrl_clock(adap->dev, 72, 1);
2476 
2477 	msleep(20);
2478 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2479 	msleep(20);
2480 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2481 
2482 	if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
2483 		deb_info("%s: Upload failed. (file not found?)\n", __func__);
2484 		return -EIO;
2485 	} else {
2486 		deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size);
2487 	}
2488 	nim9090md_config[0].microcode_B_fe_size = state->frontend_firmware->size;
2489 	nim9090md_config[0].microcode_B_fe_buffer = state->frontend_firmware->data;
2490 	nim9090md_config[1].microcode_B_fe_size = state->frontend_firmware->size;
2491 	nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data;
2492 
2493 	dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80);
2494 	adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]);
2495 
2496 	if (adap->fe_adap[0].fe == NULL)
2497 		return -ENODEV;
2498 
2499 	i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_3_4, 0);
2500 	dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82);
2501 
2502 	fe_slave = dvb_attach(dib9000_attach, i2c, 0x82, &nim9090md_config[1]);
2503 	dib9000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
2504 
2505 	return fe_slave == NULL ?  -ENODEV : 0;
2506 }
2507 
2508 static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap)
2509 {
2510 	struct dib0700_adapter_state *state = adap->priv;
2511 	struct i2c_adapter *i2c;
2512 	struct dvb_frontend *fe_slave;
2513 	u16 data_dib190[10] = {
2514 		1, 0x5374,
2515 		2, 0x01ae,
2516 		7, 0x0020,
2517 		0, 0x00ef,
2518 		8, 0x0406,
2519 	};
2520 	i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
2521 	if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL)
2522 		return -ENODEV;
2523 	i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
2524 	if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0)
2525 		return -ENODEV;
2526 
2527 	dib0700_set_i2c_speed(adap->dev, 1500);
2528 	if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
2529 		return -ENODEV;
2530 
2531 	fe_slave = dib9000_get_slave_frontend(adap->fe_adap[0].fe, 1);
2532 	if (fe_slave != NULL) {
2533 		i2c = dib9000_get_component_bus_interface(adap->fe_adap[0].fe);
2534 		dib9000_set_i2c_adapter(fe_slave, i2c);
2535 
2536 		i2c = dib9000_get_tuner_interface(fe_slave);
2537 		if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL)
2538 			return -ENODEV;
2539 		fe_slave->dvb = adap->fe_adap[0].fe->dvb;
2540 		dib9000_fw_set_component_bus_speed(adap->fe_adap[0].fe, 1500);
2541 		if (dib9000_firmware_post_pll_init(fe_slave) < 0)
2542 			return -ENODEV;
2543 	}
2544 	release_firmware(state->frontend_firmware);
2545 
2546 	return 0;
2547 }
2548 
2549 /* NIM7090 */
2550 static int dib7090p_get_best_sampling(struct dvb_frontend *fe , struct dibx090p_best_adc *adc)
2551 {
2552 	u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1;
2553 
2554 	u16 xtal = 12000;
2555 	u32 fcp_min = 1900;  /* PLL Minimum Frequency comparator KHz */
2556 	u32 fcp_max = 20000; /* PLL Maximum Frequency comparator KHz */
2557 	u32 fdem_max = 76000;
2558 	u32 fdem_min = 69500;
2559 	u32 fcp = 0, fs = 0, fdem = 0;
2560 	u32 harmonic_id = 0;
2561 
2562 	adc->pll_loopdiv = loopdiv;
2563 	adc->pll_prediv = prediv;
2564 	adc->timf = 0;
2565 
2566 	deb_info("bandwidth = %d fdem_min =%d", fe->dtv_property_cache.bandwidth_hz, fdem_min);
2567 
2568 	/* Find Min and Max prediv */
2569 	while ((xtal/max_prediv) >= fcp_min)
2570 		max_prediv++;
2571 
2572 	max_prediv--;
2573 	min_prediv = max_prediv;
2574 	while ((xtal/min_prediv) <= fcp_max) {
2575 		min_prediv--;
2576 		if (min_prediv == 1)
2577 			break;
2578 	}
2579 	deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv);
2580 
2581 	min_prediv = 2;
2582 
2583 	for (prediv = min_prediv ; prediv < max_prediv; prediv++) {
2584 		fcp = xtal / prediv;
2585 		if (fcp > fcp_min && fcp < fcp_max) {
2586 			for (loopdiv = 1 ; loopdiv < 64 ; loopdiv++) {
2587 				fdem = ((xtal/prediv) * loopdiv);
2588 				fs   = fdem / 4;
2589 				/* test min/max system restrictions */
2590 
2591 				if ((fdem >= fdem_min) && (fdem <= fdem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz/1000)) {
2592 					spur = 0;
2593 					/* test fs harmonics positions */
2594 					for (harmonic_id = (fe->dtv_property_cache.frequency / (1000*fs)) ;  harmonic_id <= ((fe->dtv_property_cache.frequency / (1000*fs))+1) ; harmonic_id++) {
2595 						if (((fs*harmonic_id) >= ((fe->dtv_property_cache.frequency/1000) - (fe->dtv_property_cache.bandwidth_hz/2000))) &&  ((fs*harmonic_id) <= ((fe->dtv_property_cache.frequency/1000) + (fe->dtv_property_cache.bandwidth_hz/2000)))) {
2596 							spur = 1;
2597 							break;
2598 						}
2599 					}
2600 
2601 					if (!spur) {
2602 						adc->pll_loopdiv = loopdiv;
2603 						adc->pll_prediv = prediv;
2604 						adc->timf = 2396745143UL/fdem*(1 << 9);
2605 						adc->timf += ((2396745143UL%fdem) << 9)/fdem;
2606 						deb_info("loopdiv=%i prediv=%i timf=%i", loopdiv, prediv, adc->timf);
2607 						break;
2608 					}
2609 				}
2610 			}
2611 		}
2612 		if (!spur)
2613 			break;
2614 	}
2615 
2616 
2617 	if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0)
2618 		return -EINVAL;
2619 	else
2620 		return 0;
2621 }
2622 
2623 static int dib7090_agc_startup(struct dvb_frontend *fe)
2624 {
2625 	struct dvb_usb_adapter *adap = fe->dvb->priv;
2626 	struct dib0700_adapter_state *state = adap->priv;
2627 	struct dibx000_bandwidth_config pll;
2628 	u16 target;
2629 	struct dibx090p_best_adc adc;
2630 	int ret;
2631 
2632 	ret = state->set_param_save(fe);
2633 	if (ret < 0)
2634 		return ret;
2635 
2636 	memset(&pll, 0, sizeof(struct dibx000_bandwidth_config));
2637 	dib0090_pwm_gain_reset(fe);
2638 	target = (dib0090_get_wbd_target(fe) * 8 + 1) / 2;
2639 	state->dib7000p_ops.set_wbd_ref(fe, target);
2640 
2641 	if (dib7090p_get_best_sampling(fe, &adc) == 0) {
2642 		pll.pll_ratio  = adc.pll_loopdiv;
2643 		pll.pll_prediv = adc.pll_prediv;
2644 
2645 		state->dib7000p_ops.update_pll(fe, &pll);
2646 		state->dib7000p_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf);
2647 	}
2648 	return 0;
2649 }
2650 
2651 static int dib7090_agc_restart(struct dvb_frontend *fe, u8 restart)
2652 {
2653 	deb_info("AGC restart callback: %d", restart);
2654 	if (restart == 0) /* before AGC startup */
2655 		dib0090_set_dc_servo(fe, 1);
2656 	return 0;
2657 }
2658 
2659 static int tfe7790p_update_lna(struct dvb_frontend *fe, u16 agc_global)
2660 {
2661 	struct dvb_usb_adapter *adap = fe->dvb->priv;
2662 	struct dib0700_adapter_state *state = adap->priv;
2663 
2664 	deb_info("update LNA: agc global=%i", agc_global);
2665 
2666 	if (agc_global < 25000) {
2667 		state->dib7000p_ops.set_gpio(fe, 8, 0, 0);
2668 		state->dib7000p_ops.set_agc1_min(fe, 0);
2669 	} else {
2670 		state->dib7000p_ops.set_gpio(fe, 8, 0, 1);
2671 		state->dib7000p_ops.set_agc1_min(fe, 32768);
2672 	}
2673 
2674 	return 0;
2675 }
2676 
2677 static struct dib0090_wbd_slope dib7090_wbd_table[] = {
2678 	{ 380,   81, 850, 64, 540,  4},
2679 	{ 860,   51, 866, 21,  375, 4},
2680 	{1700,    0, 250, 0,   100, 6},
2681 	{2600,    0, 250, 0,   100, 6},
2682 	{ 0xFFFF, 0,   0, 0,   0,   0},
2683 };
2684 
2685 static struct dibx000_agc_config dib7090_agc_config[2] = {
2686 	{
2687 		.band_caps      = BAND_UHF,
2688 		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
2689 		* P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
2690 		.setup          = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
2691 
2692 		.inv_gain       = 687,
2693 		.time_stabiliz  = 10,
2694 
2695 		.alpha_level    = 0,
2696 		.thlock         = 118,
2697 
2698 		.wbd_inv        = 0,
2699 		.wbd_ref        = 1200,
2700 		.wbd_sel        = 3,
2701 		.wbd_alpha      = 5,
2702 
2703 		.agc1_max       = 65535,
2704 		.agc1_min       = 32768,
2705 
2706 		.agc2_max       = 65535,
2707 		.agc2_min       = 0,
2708 
2709 		.agc1_pt1       = 0,
2710 		.agc1_pt2       = 32,
2711 		.agc1_pt3       = 114,
2712 		.agc1_slope1    = 143,
2713 		.agc1_slope2    = 144,
2714 		.agc2_pt1       = 114,
2715 		.agc2_pt2       = 227,
2716 		.agc2_slope1    = 116,
2717 		.agc2_slope2    = 117,
2718 
2719 		.alpha_mant     = 18,
2720 		.alpha_exp      = 0,
2721 		.beta_mant      = 20,
2722 		.beta_exp       = 59,
2723 
2724 		.perform_agc_softsplit = 0,
2725 	} , {
2726 		.band_caps      = BAND_FM | BAND_VHF | BAND_CBAND,
2727 		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
2728 		* P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
2729 		.setup          = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
2730 
2731 		.inv_gain       = 732,
2732 		.time_stabiliz  = 10,
2733 
2734 		.alpha_level    = 0,
2735 		.thlock         = 118,
2736 
2737 		.wbd_inv        = 0,
2738 		.wbd_ref        = 1200,
2739 		.wbd_sel        = 3,
2740 		.wbd_alpha      = 5,
2741 
2742 		.agc1_max       = 65535,
2743 		.agc1_min       = 0,
2744 
2745 		.agc2_max       = 65535,
2746 		.agc2_min       = 0,
2747 
2748 		.agc1_pt1       = 0,
2749 		.agc1_pt2       = 0,
2750 		.agc1_pt3       = 98,
2751 		.agc1_slope1    = 0,
2752 		.agc1_slope2    = 167,
2753 		.agc2_pt1       = 98,
2754 		.agc2_pt2       = 255,
2755 		.agc2_slope1    = 104,
2756 		.agc2_slope2    = 0,
2757 
2758 		.alpha_mant     = 18,
2759 		.alpha_exp      = 0,
2760 		.beta_mant      = 20,
2761 		.beta_exp       = 59,
2762 
2763 		.perform_agc_softsplit = 0,
2764 	}
2765 };
2766 
2767 static struct dibx000_bandwidth_config dib7090_clock_config_12_mhz = {
2768 	.internal = 60000,
2769 	.sampling = 15000,
2770 	.pll_prediv = 1,
2771 	.pll_ratio = 5,
2772 	.pll_range = 0,
2773 	.pll_reset = 0,
2774 	.pll_bypass = 0,
2775 	.enable_refdiv = 0,
2776 	.bypclk_div = 0,
2777 	.IO_CLK_en_core = 1,
2778 	.ADClkSrc = 1,
2779 	.modulo = 2,
2780 	.sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
2781 	.ifreq = (0 << 25) | 0,
2782 	.timf = 20452225,
2783 	.xtal_hz = 15000000,
2784 };
2785 
2786 static struct dib7000p_config nim7090_dib7000p_config = {
2787 	.output_mpeg2_in_188_bytes  = 1,
2788 	.hostbus_diversity			= 1,
2789 	.tuner_is_baseband			= 1,
2790 	.update_lna					= tfe7790p_update_lna, /* GPIO used is the same as TFE7790 */
2791 
2792 	.agc_config_count			= 2,
2793 	.agc						= dib7090_agc_config,
2794 
2795 	.bw							= &dib7090_clock_config_12_mhz,
2796 
2797 	.gpio_dir					= DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2798 	.gpio_val					= DIB7000P_GPIO_DEFAULT_VALUES,
2799 	.gpio_pwm_pos				= DIB7000P_GPIO_DEFAULT_PWM_POS,
2800 
2801 	.pwm_freq_div				= 0,
2802 
2803 	.agc_control				= dib7090_agc_restart,
2804 
2805 	.spur_protect				= 0,
2806 	.disable_sample_and_hold	= 0,
2807 	.enable_current_mirror		= 0,
2808 	.diversity_delay			= 0,
2809 
2810 	.output_mode				= OUTMODE_MPEG2_FIFO,
2811 	.enMpegOutput				= 1,
2812 };
2813 
2814 static int tfe7090p_pvr_update_lna(struct dvb_frontend *fe, u16 agc_global)
2815 {
2816 	struct dvb_usb_adapter *adap = fe->dvb->priv;
2817 	struct dib0700_adapter_state *state = adap->priv;
2818 
2819 	deb_info("TFE7090P-PVR update LNA: agc global=%i", agc_global);
2820 	if (agc_global < 25000) {
2821 		state->dib7000p_ops.set_gpio(fe, 5, 0, 0);
2822 		state->dib7000p_ops.set_agc1_min(fe, 0);
2823 	} else {
2824 		state->dib7000p_ops.set_gpio(fe, 5, 0, 1);
2825 		state->dib7000p_ops.set_agc1_min(fe, 32768);
2826 	}
2827 
2828 	return 0;
2829 }
2830 
2831 static struct dib7000p_config tfe7090pvr_dib7000p_config[2] = {
2832 	{
2833 		.output_mpeg2_in_188_bytes  = 1,
2834 		.hostbus_diversity			= 1,
2835 		.tuner_is_baseband			= 1,
2836 		.update_lna					= tfe7090p_pvr_update_lna,
2837 
2838 		.agc_config_count			= 2,
2839 		.agc						= dib7090_agc_config,
2840 
2841 		.bw							= &dib7090_clock_config_12_mhz,
2842 
2843 		.gpio_dir					= DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2844 		.gpio_val					= DIB7000P_GPIO_DEFAULT_VALUES,
2845 		.gpio_pwm_pos				= DIB7000P_GPIO_DEFAULT_PWM_POS,
2846 
2847 		.pwm_freq_div				= 0,
2848 
2849 		.agc_control				= dib7090_agc_restart,
2850 
2851 		.spur_protect				= 0,
2852 		.disable_sample_and_hold	= 0,
2853 		.enable_current_mirror		= 0,
2854 		.diversity_delay			= 0,
2855 
2856 		.output_mode				= OUTMODE_MPEG2_PAR_GATED_CLK,
2857 		.default_i2c_addr			= 0x90,
2858 		.enMpegOutput				= 1,
2859 	}, {
2860 		.output_mpeg2_in_188_bytes  = 1,
2861 		.hostbus_diversity			= 1,
2862 		.tuner_is_baseband			= 1,
2863 		.update_lna					= tfe7090p_pvr_update_lna,
2864 
2865 		.agc_config_count			= 2,
2866 		.agc						= dib7090_agc_config,
2867 
2868 		.bw							= &dib7090_clock_config_12_mhz,
2869 
2870 		.gpio_dir					= DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2871 		.gpio_val					= DIB7000P_GPIO_DEFAULT_VALUES,
2872 		.gpio_pwm_pos				= DIB7000P_GPIO_DEFAULT_PWM_POS,
2873 
2874 		.pwm_freq_div				= 0,
2875 
2876 		.agc_control				= dib7090_agc_restart,
2877 
2878 		.spur_protect				= 0,
2879 		.disable_sample_and_hold	= 0,
2880 		.enable_current_mirror		= 0,
2881 		.diversity_delay			= 0,
2882 
2883 		.output_mode				= OUTMODE_MPEG2_PAR_GATED_CLK,
2884 		.default_i2c_addr			= 0x92,
2885 		.enMpegOutput				= 0,
2886 	}
2887 };
2888 
2889 static struct dib0090_config nim7090_dib0090_config = {
2890 	.io.clock_khz = 12000,
2891 	.io.pll_bypass = 0,
2892 	.io.pll_range = 0,
2893 	.io.pll_prediv = 3,
2894 	.io.pll_loopdiv = 6,
2895 	.io.adc_clock_ratio = 0,
2896 	.io.pll_int_loop_filt = 0,
2897 
2898 	.freq_offset_khz_uhf = 0,
2899 	.freq_offset_khz_vhf = 0,
2900 
2901 	.clkouttobamse = 1,
2902 	.analog_output = 0,
2903 
2904 	.wbd_vhf_offset = 0,
2905 	.wbd_cband_offset = 0,
2906 	.use_pwm_agc = 1,
2907 	.clkoutdrive = 0,
2908 
2909 	.fref_clock_ratio = 0,
2910 
2911 	.wbd = dib7090_wbd_table,
2912 
2913 	.ls_cfg_pad_drv = 0,
2914 	.data_tx_drv = 0,
2915 	.low_if = NULL,
2916 	.in_soc = 1,
2917 };
2918 
2919 static struct dib7000p_config tfe7790p_dib7000p_config = {
2920 	.output_mpeg2_in_188_bytes  = 1,
2921 	.hostbus_diversity			= 1,
2922 	.tuner_is_baseband			= 1,
2923 	.update_lna					= tfe7790p_update_lna,
2924 
2925 	.agc_config_count			= 2,
2926 	.agc						= dib7090_agc_config,
2927 
2928 	.bw							= &dib7090_clock_config_12_mhz,
2929 
2930 	.gpio_dir					= DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2931 	.gpio_val					= DIB7000P_GPIO_DEFAULT_VALUES,
2932 	.gpio_pwm_pos				= DIB7000P_GPIO_DEFAULT_PWM_POS,
2933 
2934 	.pwm_freq_div				= 0,
2935 
2936 	.agc_control				= dib7090_agc_restart,
2937 
2938 	.spur_protect				= 0,
2939 	.disable_sample_and_hold	= 0,
2940 	.enable_current_mirror		= 0,
2941 	.diversity_delay			= 0,
2942 
2943 	.output_mode				= OUTMODE_MPEG2_PAR_GATED_CLK,
2944 	.enMpegOutput				= 1,
2945 };
2946 
2947 static struct dib0090_config tfe7790p_dib0090_config = {
2948 	.io.clock_khz = 12000,
2949 	.io.pll_bypass = 0,
2950 	.io.pll_range = 0,
2951 	.io.pll_prediv = 3,
2952 	.io.pll_loopdiv = 6,
2953 	.io.adc_clock_ratio = 0,
2954 	.io.pll_int_loop_filt = 0,
2955 
2956 	.freq_offset_khz_uhf = 0,
2957 	.freq_offset_khz_vhf = 0,
2958 
2959 	.clkouttobamse = 1,
2960 	.analog_output = 0,
2961 
2962 	.wbd_vhf_offset = 0,
2963 	.wbd_cband_offset = 0,
2964 	.use_pwm_agc = 1,
2965 	.clkoutdrive = 0,
2966 
2967 	.fref_clock_ratio = 0,
2968 
2969 	.wbd = dib7090_wbd_table,
2970 
2971 	.ls_cfg_pad_drv = 0,
2972 	.data_tx_drv = 0,
2973 	.low_if = NULL,
2974 	.in_soc = 1,
2975 	.force_cband_input = 0,
2976 	.is_dib7090e = 0,
2977 	.force_crystal_mode = 1,
2978 };
2979 
2980 static struct dib0090_config tfe7090pvr_dib0090_config[2] = {
2981 	{
2982 		.io.clock_khz = 12000,
2983 		.io.pll_bypass = 0,
2984 		.io.pll_range = 0,
2985 		.io.pll_prediv = 3,
2986 		.io.pll_loopdiv = 6,
2987 		.io.adc_clock_ratio = 0,
2988 		.io.pll_int_loop_filt = 0,
2989 
2990 		.freq_offset_khz_uhf = 50,
2991 		.freq_offset_khz_vhf = 70,
2992 
2993 		.clkouttobamse = 1,
2994 		.analog_output = 0,
2995 
2996 		.wbd_vhf_offset = 0,
2997 		.wbd_cband_offset = 0,
2998 		.use_pwm_agc = 1,
2999 		.clkoutdrive = 0,
3000 
3001 		.fref_clock_ratio = 0,
3002 
3003 		.wbd = dib7090_wbd_table,
3004 
3005 		.ls_cfg_pad_drv = 0,
3006 		.data_tx_drv = 0,
3007 		.low_if = NULL,
3008 		.in_soc = 1,
3009 	}, {
3010 		.io.clock_khz = 12000,
3011 		.io.pll_bypass = 0,
3012 		.io.pll_range = 0,
3013 		.io.pll_prediv = 3,
3014 		.io.pll_loopdiv = 6,
3015 		.io.adc_clock_ratio = 0,
3016 		.io.pll_int_loop_filt = 0,
3017 
3018 		.freq_offset_khz_uhf = -50,
3019 		.freq_offset_khz_vhf = -70,
3020 
3021 		.clkouttobamse = 1,
3022 		.analog_output = 0,
3023 
3024 		.wbd_vhf_offset = 0,
3025 		.wbd_cband_offset = 0,
3026 		.use_pwm_agc = 1,
3027 		.clkoutdrive = 0,
3028 
3029 		.fref_clock_ratio = 0,
3030 
3031 		.wbd = dib7090_wbd_table,
3032 
3033 		.ls_cfg_pad_drv = 0,
3034 		.data_tx_drv = 0,
3035 		.low_if = NULL,
3036 		.in_soc = 1,
3037 	}
3038 };
3039 
3040 static int nim7090_frontend_attach(struct dvb_usb_adapter *adap)
3041 {
3042 	struct dib0700_adapter_state *state = adap->priv;
3043 
3044 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3045 		return -ENODEV;
3046 
3047 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3048 	msleep(20);
3049 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3050 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3051 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3052 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3053 
3054 	msleep(20);
3055 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3056 	msleep(20);
3057 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3058 
3059 	if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, &nim7090_dib7000p_config) != 0) {
3060 		err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
3061 		dvb_detach(state->dib7000p_ops.set_wbd_ref);
3062 		return -ENODEV;
3063 	}
3064 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
3065 
3066 	return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
3067 }
3068 
3069 static int nim7090_tuner_attach(struct dvb_usb_adapter *adap)
3070 {
3071 	struct dib0700_adapter_state *st = adap->priv;
3072 	struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3073 
3074 	nim7090_dib0090_config.reset = st->dib7000p_ops.tuner_sleep,
3075 	nim7090_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep,
3076 	nim7090_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power;
3077 
3078 	if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &nim7090_dib0090_config) == NULL)
3079 		return -ENODEV;
3080 
3081 	st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3082 
3083 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3084 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3085 	return 0;
3086 }
3087 
3088 static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
3089 {
3090 	struct dib0700_state *st = adap->dev->priv;
3091 	struct dib0700_adapter_state *state = adap->priv;
3092 
3093 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3094 		return -ENODEV;
3095 
3096 	/* The TFE7090 requires the dib0700 to not be in master mode */
3097 	st->disable_streaming_master_mode = 1;
3098 
3099 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3100 	msleep(20);
3101 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3102 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3103 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3104 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3105 
3106 	msleep(20);
3107 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3108 	msleep(20);
3109 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3110 
3111 	/* initialize IC 0 */
3112 	if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, &tfe7090pvr_dib7000p_config[0]) != 0) {
3113 		err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
3114 		dvb_detach(state->dib7000p_ops.set_wbd_ref);
3115 		return -ENODEV;
3116 	}
3117 
3118 	dib0700_set_i2c_speed(adap->dev, 340);
3119 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
3120 	if (adap->fe_adap[0].fe == NULL)
3121 		return -ENODEV;
3122 
3123 	state->dib7000p_ops.slave_reset(adap->fe_adap[0].fe);
3124 
3125 	return 0;
3126 }
3127 
3128 static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap)
3129 {
3130 	struct i2c_adapter *i2c;
3131 	struct dib0700_adapter_state *state = adap->priv;
3132 
3133 	if (adap->dev->adapter[0].fe_adap[0].fe == NULL) {
3134 		err("the master dib7090 has to be initialized first");
3135 		return -ENODEV; /* the master device has not been initialized */
3136 	}
3137 
3138 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3139 		return -ENODEV;
3140 
3141 	i2c = state->dib7000p_ops.get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
3142 	if (state->dib7000p_ops.i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) {
3143 		err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n", __func__);
3144 		dvb_detach(state->dib7000p_ops.set_wbd_ref);
3145 		return -ENODEV;
3146 	}
3147 
3148 	adap->fe_adap[0].fe = state->dib7000p_ops.init(i2c, 0x92, &tfe7090pvr_dib7000p_config[1]);
3149 	dib0700_set_i2c_speed(adap->dev, 200);
3150 
3151 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3152 }
3153 
3154 static int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap)
3155 {
3156 	struct dib0700_adapter_state *st = adap->priv;
3157 	struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3158 
3159 	tfe7090pvr_dib0090_config[0].reset = st->dib7000p_ops.tuner_sleep;
3160 	tfe7090pvr_dib0090_config[0].sleep = st->dib7000p_ops.tuner_sleep;
3161 	tfe7090pvr_dib0090_config[0].get_adc_power = st->dib7000p_ops.get_adc_power;
3162 
3163 	if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL)
3164 		return -ENODEV;
3165 
3166 	st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3167 
3168 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3169 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3170 	return 0;
3171 }
3172 
3173 static int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap)
3174 {
3175 	struct dib0700_adapter_state *st = adap->priv;
3176 	struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3177 
3178 	tfe7090pvr_dib0090_config[1].reset = st->dib7000p_ops.tuner_sleep;
3179 	tfe7090pvr_dib0090_config[1].sleep = st->dib7000p_ops.tuner_sleep;
3180 	tfe7090pvr_dib0090_config[1].get_adc_power = st->dib7000p_ops.get_adc_power;
3181 
3182 	if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL)
3183 		return -ENODEV;
3184 
3185 	st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3186 
3187 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3188 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3189 	return 0;
3190 }
3191 
3192 static int tfe7790p_frontend_attach(struct dvb_usb_adapter *adap)
3193 {
3194 	struct dib0700_state *st = adap->dev->priv;
3195 	struct dib0700_adapter_state *state = adap->priv;
3196 
3197 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3198 		return -ENODEV;
3199 
3200 	/* The TFE7790P requires the dib0700 to not be in master mode */
3201 	st->disable_streaming_master_mode = 1;
3202 
3203 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3204 	msleep(20);
3205 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3206 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3207 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3208 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3209 	msleep(20);
3210 	dib0700_ctrl_clock(adap->dev, 72, 1);
3211 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3212 	msleep(20);
3213 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3214 
3215 	if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap,
3216 				1, 0x10, &tfe7790p_dib7000p_config) != 0) {
3217 		err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
3218 				__func__);
3219 		dvb_detach(state->dib7000p_ops.set_wbd_ref);
3220 		return -ENODEV;
3221 	}
3222 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
3223 			0x80, &tfe7790p_dib7000p_config);
3224 
3225 	return adap->fe_adap[0].fe == NULL ?  -ENODEV : 0;
3226 }
3227 
3228 static int tfe7790p_tuner_attach(struct dvb_usb_adapter *adap)
3229 {
3230 	struct dib0700_adapter_state *st = adap->priv;
3231 	struct i2c_adapter *tun_i2c =
3232 		st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe);
3233 
3234 
3235 	tfe7790p_dib0090_config.reset = st->dib7000p_ops.tuner_sleep;
3236 	tfe7790p_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep;
3237 	tfe7790p_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power;
3238 
3239 	if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c,
3240 				&tfe7790p_dib0090_config) == NULL)
3241 		return -ENODEV;
3242 
3243 	st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3244 
3245 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
3246 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
3247 	return 0;
3248 }
3249 
3250 /* STK7070PD */
3251 static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
3252 	{
3253 		.output_mpeg2_in_188_bytes = 1,
3254 
3255 		.agc_config_count = 1,
3256 		.agc = &dib7070_agc_config,
3257 		.bw  = &dib7070_bw_config_12_mhz,
3258 		.tuner_is_baseband = 1,
3259 		.spur_protect = 1,
3260 
3261 		.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
3262 		.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
3263 		.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
3264 
3265 		.hostbus_diversity = 1,
3266 	}, {
3267 		.output_mpeg2_in_188_bytes = 1,
3268 
3269 		.agc_config_count = 1,
3270 		.agc = &dib7070_agc_config,
3271 		.bw  = &dib7070_bw_config_12_mhz,
3272 		.tuner_is_baseband = 1,
3273 		.spur_protect = 1,
3274 
3275 		.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
3276 		.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
3277 		.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
3278 
3279 		.hostbus_diversity = 1,
3280 	}
3281 };
3282 
3283 static void stk7070pd_init(struct dvb_usb_device *dev)
3284 {
3285 	dib0700_set_gpio(dev, GPIO6, GPIO_OUT, 1);
3286 	msleep(10);
3287 	dib0700_set_gpio(dev, GPIO9, GPIO_OUT, 1);
3288 	dib0700_set_gpio(dev, GPIO4, GPIO_OUT, 1);
3289 	dib0700_set_gpio(dev, GPIO7, GPIO_OUT, 1);
3290 	dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 0);
3291 
3292 	dib0700_ctrl_clock(dev, 72, 1);
3293 
3294 	msleep(10);
3295 	dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 1);
3296 }
3297 
3298 static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
3299 {
3300 	struct dib0700_adapter_state *state = adap->priv;
3301 
3302 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3303 		return -ENODEV;
3304 
3305 	stk7070pd_init(adap->dev);
3306 
3307 	msleep(10);
3308 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3309 
3310 	if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
3311 				     stk7070pd_dib7000p_config) != 0) {
3312 		err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
3313 		    __func__);
3314 		dvb_detach(state->dib7000p_ops.set_wbd_ref);
3315 		return -ENODEV;
3316 	}
3317 
3318 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
3319 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3320 }
3321 
3322 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
3323 {
3324 	struct dib0700_adapter_state *state = adap->priv;
3325 
3326 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3327 		return -ENODEV;
3328 
3329 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
3330 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3331 }
3332 
3333 static int novatd_read_status_override(struct dvb_frontend *fe,
3334 				       enum fe_status *stat)
3335 {
3336 	struct dvb_usb_adapter *adap = fe->dvb->priv;
3337 	struct dvb_usb_device *dev = adap->dev;
3338 	struct dib0700_state *state = dev->priv;
3339 	int ret;
3340 
3341 	ret = state->read_status(fe, stat);
3342 
3343 	if (!ret)
3344 		dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT,
3345 				!!(*stat & FE_HAS_LOCK));
3346 
3347 	return ret;
3348 }
3349 
3350 static int novatd_sleep_override(struct dvb_frontend* fe)
3351 {
3352 	struct dvb_usb_adapter *adap = fe->dvb->priv;
3353 	struct dvb_usb_device *dev = adap->dev;
3354 	struct dib0700_state *state = dev->priv;
3355 
3356 	/* turn off LED */
3357 	dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, 0);
3358 
3359 	return state->sleep(fe);
3360 }
3361 
3362 /*
3363  * novatd_frontend_attach - Nova-TD specific attach
3364  *
3365  * Nova-TD has GPIO0, 1 and 2 for LEDs. So do not fiddle with them except for
3366  * information purposes.
3367  */
3368 static int novatd_frontend_attach(struct dvb_usb_adapter *adap)
3369 {
3370 	struct dvb_usb_device *dev = adap->dev;
3371 	struct dib0700_state *st = dev->priv;
3372 	struct dib0700_adapter_state *state = adap->priv;
3373 
3374 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3375 		return -ENODEV;
3376 
3377 	if (adap->id == 0) {
3378 		stk7070pd_init(dev);
3379 
3380 		/* turn the power LED on, the other two off (just in case) */
3381 		dib0700_set_gpio(dev, GPIO0, GPIO_OUT, 0);
3382 		dib0700_set_gpio(dev, GPIO1, GPIO_OUT, 0);
3383 		dib0700_set_gpio(dev, GPIO2, GPIO_OUT, 1);
3384 
3385 		if (state->dib7000p_ops.i2c_enumeration(&dev->i2c_adap, 2, 18,
3386 					     stk7070pd_dib7000p_config) != 0) {
3387 			err("%s: state->dib7000p_ops.i2c_enumeration failed.  Cannot continue\n",
3388 			    __func__);
3389 			dvb_detach(state->dib7000p_ops.set_wbd_ref);
3390 			return -ENODEV;
3391 		}
3392 	}
3393 
3394 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&dev->i2c_adap,
3395 			adap->id == 0 ? 0x80 : 0x82,
3396 			&stk7070pd_dib7000p_config[adap->id]);
3397 
3398 	if (adap->fe_adap[0].fe == NULL)
3399 		return -ENODEV;
3400 
3401 	st->read_status = adap->fe_adap[0].fe->ops.read_status;
3402 	adap->fe_adap[0].fe->ops.read_status = novatd_read_status_override;
3403 	st->sleep = adap->fe_adap[0].fe->ops.sleep;
3404 	adap->fe_adap[0].fe->ops.sleep = novatd_sleep_override;
3405 
3406 	return 0;
3407 }
3408 
3409 /* S5H1411 */
3410 static struct s5h1411_config pinnacle_801e_config = {
3411 	.output_mode   = S5H1411_PARALLEL_OUTPUT,
3412 	.gpio          = S5H1411_GPIO_OFF,
3413 	.mpeg_timing   = S5H1411_MPEGTIMING_NONCONTINUOUS_NONINVERTING_CLOCK,
3414 	.qam_if        = S5H1411_IF_44000,
3415 	.vsb_if        = S5H1411_IF_44000,
3416 	.inversion     = S5H1411_INVERSION_OFF,
3417 	.status_mode   = S5H1411_DEMODLOCKING
3418 };
3419 
3420 /* Pinnacle PCTV HD Pro 801e GPIOs map:
3421    GPIO0  - currently unknown
3422    GPIO1  - xc5000 tuner reset
3423    GPIO2  - CX25843 sleep
3424    GPIO3  - currently unknown
3425    GPIO4  - currently unknown
3426    GPIO6  - currently unknown
3427    GPIO7  - currently unknown
3428    GPIO9  - currently unknown
3429    GPIO10 - CX25843 reset
3430  */
3431 static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
3432 {
3433 	struct dib0700_state *st = adap->dev->priv;
3434 
3435 	/* Make use of the new i2c functions from FW 1.20 */
3436 	st->fw_use_new_i2c_api = 1;
3437 
3438 	/* The s5h1411 requires the dib0700 to not be in master mode */
3439 	st->disable_streaming_master_mode = 1;
3440 
3441 	/* All msleep values taken from Windows USB trace */
3442 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
3443 	dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
3444 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3445 	msleep(400);
3446 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3447 	msleep(60);
3448 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3449 	msleep(30);
3450 	dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
3451 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
3452 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
3453 	dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
3454 	dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
3455 	msleep(30);
3456 
3457 	/* Put the CX25843 to sleep for now since we're in digital mode */
3458 	dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
3459 
3460 	/* GPIOs are initialized, do the attach */
3461 	adap->fe_adap[0].fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
3462 			      &adap->dev->i2c_adap);
3463 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3464 }
3465 
3466 static int dib0700_xc5000_tuner_callback(void *priv, int component,
3467 					 int command, int arg)
3468 {
3469 	struct dvb_usb_adapter *adap = priv;
3470 
3471 	if (command == XC5000_TUNER_RESET) {
3472 		/* Reset the tuner */
3473 		dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
3474 		msleep(10);
3475 		dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
3476 		msleep(10);
3477 	} else {
3478 		err("xc5000: unknown tuner callback command: %d\n", command);
3479 		return -EINVAL;
3480 	}
3481 
3482 	return 0;
3483 }
3484 
3485 static struct xc5000_config s5h1411_xc5000_tunerconfig = {
3486 	.i2c_address      = 0x64,
3487 	.if_khz           = 5380,
3488 };
3489 
3490 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
3491 {
3492 	/* FIXME: generalize & move to common area */
3493 	adap->fe_adap[0].fe->callback = dib0700_xc5000_tuner_callback;
3494 
3495 	return dvb_attach(xc5000_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
3496 			  &s5h1411_xc5000_tunerconfig)
3497 		== NULL ? -ENODEV : 0;
3498 }
3499 
3500 static int dib0700_xc4000_tuner_callback(void *priv, int component,
3501 					 int command, int arg)
3502 {
3503 	struct dvb_usb_adapter *adap = priv;
3504 	struct dib0700_adapter_state *state = adap->priv;
3505 
3506 	if (command == XC4000_TUNER_RESET) {
3507 		/* Reset the tuner */
3508 		state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 0);
3509 		msleep(10);
3510 		state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
3511 	} else {
3512 		err("xc4000: unknown tuner callback command: %d\n", command);
3513 		return -EINVAL;
3514 	}
3515 
3516 	return 0;
3517 }
3518 
3519 static struct dibx000_agc_config stk7700p_7000p_xc4000_agc_config = {
3520 	.band_caps = BAND_UHF | BAND_VHF,
3521 	.setup = 0x64,
3522 	.inv_gain = 0x02c8,
3523 	.time_stabiliz = 0x15,
3524 	.alpha_level = 0x00,
3525 	.thlock = 0x76,
3526 	.wbd_inv = 0x01,
3527 	.wbd_ref = 0x0b33,
3528 	.wbd_sel = 0x00,
3529 	.wbd_alpha = 0x02,
3530 	.agc1_max = 0x00,
3531 	.agc1_min = 0x00,
3532 	.agc2_max = 0x9b26,
3533 	.agc2_min = 0x26ca,
3534 	.agc1_pt1 = 0x00,
3535 	.agc1_pt2 = 0x00,
3536 	.agc1_pt3 = 0x00,
3537 	.agc1_slope1 = 0x00,
3538 	.agc1_slope2 = 0x00,
3539 	.agc2_pt1 = 0x00,
3540 	.agc2_pt2 = 0x80,
3541 	.agc2_slope1 = 0x1d,
3542 	.agc2_slope2 = 0x1d,
3543 	.alpha_mant = 0x11,
3544 	.alpha_exp = 0x1b,
3545 	.beta_mant = 0x17,
3546 	.beta_exp = 0x33,
3547 	.perform_agc_softsplit = 0x00,
3548 };
3549 
3550 static struct dibx000_bandwidth_config stk7700p_xc4000_pll_config = {
3551 	.internal = 60000,
3552 	.sampling = 30000,
3553 	.pll_prediv = 1,
3554 	.pll_ratio = 8,
3555 	.pll_range = 3,
3556 	.pll_reset = 1,
3557 	.pll_bypass = 0,
3558 	.enable_refdiv = 0,
3559 	.bypclk_div = 0,
3560 	.IO_CLK_en_core = 1,
3561 	.ADClkSrc = 1,
3562 	.modulo = 0,
3563 	.sad_cfg = (3 << 14) | (1 << 12) | 524, /* sad_cfg: refsel, sel, freq_15k */
3564 	.ifreq = 39370534,
3565 	.timf = 20452225,
3566 	.xtal_hz = 30000000
3567 };
3568 
3569 /* FIXME: none of these inputs are validated yet */
3570 static struct dib7000p_config pctv_340e_config = {
3571 	.output_mpeg2_in_188_bytes = 1,
3572 
3573 	.agc_config_count = 1,
3574 	.agc = &stk7700p_7000p_xc4000_agc_config,
3575 	.bw  = &stk7700p_xc4000_pll_config,
3576 
3577 	.gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
3578 	.gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
3579 	.gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
3580 };
3581 
3582 /* PCTV 340e GPIOs map:
3583    dib0700:
3584    GPIO2  - CX25843 sleep
3585    GPIO3  - CS5340 reset
3586    GPIO5  - IRD
3587    GPIO6  - Power Supply
3588    GPIO8  - LNA (1=off 0=on)
3589    GPIO10 - CX25843 reset
3590    dib7000:
3591    GPIO8  - xc4000 reset
3592  */
3593 static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap)
3594 {
3595 	struct dib0700_state *st = adap->dev->priv;
3596 	struct dib0700_adapter_state *state = adap->priv;
3597 
3598 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
3599 		return -ENODEV;
3600 
3601 	/* Power Supply on */
3602 	dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0);
3603 	msleep(50);
3604 	dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1);
3605 	msleep(100); /* Allow power supply to settle before probing */
3606 
3607 	/* cx25843 reset */
3608 	dib0700_set_gpio(adap->dev, GPIO10,  GPIO_OUT, 0);
3609 	msleep(1); /* cx25843 datasheet say 350us required */
3610 	dib0700_set_gpio(adap->dev, GPIO10,  GPIO_OUT, 1);
3611 
3612 	/* LNA off for now */
3613 	dib0700_set_gpio(adap->dev, GPIO8,  GPIO_OUT, 1);
3614 
3615 	/* Put the CX25843 to sleep for now since we're in digital mode */
3616 	dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
3617 
3618 	/* FIXME: not verified yet */
3619 	dib0700_ctrl_clock(adap->dev, 72, 1);
3620 
3621 	msleep(500);
3622 
3623 	if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap) == 0) {
3624 		/* Demodulator not found for some reason? */
3625 		dvb_detach(state->dib7000p_ops.set_wbd_ref);
3626 		return -ENODEV;
3627 	}
3628 
3629 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x12,
3630 			      &pctv_340e_config);
3631 	st->is_dib7000pc = 1;
3632 
3633 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3634 }
3635 
3636 static struct xc4000_config dib7000p_xc4000_tunerconfig = {
3637 	.i2c_address	  = 0x61,
3638 	.default_pm	  = 1,
3639 	.dvb_amplitude	  = 0,
3640 	.set_smoothedcvbs = 0,
3641 	.if_khz		  = 5400
3642 };
3643 
3644 static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
3645 {
3646 	struct i2c_adapter *tun_i2c;
3647 	struct dib0700_adapter_state *state = adap->priv;
3648 
3649 	/* The xc4000 is not on the main i2c bus */
3650 	tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
3651 					  DIBX000_I2C_INTERFACE_TUNER, 1);
3652 	if (tun_i2c == NULL) {
3653 		printk(KERN_ERR "Could not reach tuner i2c bus\n");
3654 		return 0;
3655 	}
3656 
3657 	/* Setup the reset callback */
3658 	adap->fe_adap[0].fe->callback = dib0700_xc4000_tuner_callback;
3659 
3660 	return dvb_attach(xc4000_attach, adap->fe_adap[0].fe, tun_i2c,
3661 			  &dib7000p_xc4000_tunerconfig)
3662 		== NULL ? -ENODEV : 0;
3663 }
3664 
3665 static struct lgdt3305_config hcw_lgdt3305_config = {
3666 	.i2c_addr           = 0x0e,
3667 	.mpeg_mode          = LGDT3305_MPEG_PARALLEL,
3668 	.tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
3669 	.tpvalid_polarity   = LGDT3305_TP_VALID_LOW,
3670 	.deny_i2c_rptr      = 0,
3671 	.spectral_inversion = 1,
3672 	.qam_if_khz         = 6000,
3673 	.vsb_if_khz         = 6000,
3674 	.usref_8vsb         = 0x0500,
3675 };
3676 
3677 static struct mxl5007t_config hcw_mxl5007t_config = {
3678 	.xtal_freq_hz = MxL_XTAL_25_MHZ,
3679 	.if_freq_hz = MxL_IF_6_MHZ,
3680 	.invert_if = 1,
3681 };
3682 
3683 /* TIGER-ATSC map:
3684    GPIO0  - LNA_CTR  (H: LNA power enabled, L: LNA power disabled)
3685    GPIO1  - ANT_SEL  (H: VPA, L: MCX)
3686    GPIO4  - SCL2
3687    GPIO6  - EN_TUNER
3688    GPIO7  - SDA2
3689    GPIO10 - DEM_RST
3690 
3691    MXL is behind LG's i2c repeater.  LG is on SCL2/SDA2 gpios on the DIB
3692  */
3693 static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
3694 {
3695 	struct dib0700_state *st = adap->dev->priv;
3696 
3697 	/* Make use of the new i2c functions from FW 1.20 */
3698 	st->fw_use_new_i2c_api = 1;
3699 
3700 	st->disable_streaming_master_mode = 1;
3701 
3702 	/* fe power enable */
3703 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
3704 	msleep(30);
3705 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3706 	msleep(30);
3707 
3708 	/* demod reset */
3709 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3710 	msleep(30);
3711 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3712 	msleep(30);
3713 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3714 	msleep(30);
3715 
3716 	adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach,
3717 			      &hcw_lgdt3305_config,
3718 			      &adap->dev->i2c_adap);
3719 
3720 	return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
3721 }
3722 
3723 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
3724 {
3725 	return dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
3726 			  &adap->dev->i2c_adap, 0x60,
3727 			  &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
3728 }
3729 
3730 static int xbox_one_attach(struct dvb_usb_adapter *adap)
3731 {
3732 	struct dib0700_state *st = adap->dev->priv;
3733 	struct i2c_client *client_demod, *client_tuner;
3734 	struct dvb_usb_device *d = adap->dev;
3735 	struct mn88472_config mn88472_config = { };
3736 	struct tda18250_config tda18250_config;
3737 	struct i2c_board_info info;
3738 
3739 	st->fw_use_new_i2c_api = 1;
3740 	st->disable_streaming_master_mode = 1;
3741 
3742 	/* fe power enable */
3743 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
3744 	msleep(30);
3745 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
3746 	msleep(30);
3747 
3748 	/* demod reset */
3749 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3750 	msleep(30);
3751 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
3752 	msleep(30);
3753 	dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
3754 	msleep(30);
3755 
3756 	/* attach demod */
3757 	mn88472_config.fe = &adap->fe_adap[0].fe;
3758 	mn88472_config.i2c_wr_max = 22;
3759 	mn88472_config.xtal = 20500000;
3760 	mn88472_config.ts_mode = PARALLEL_TS_MODE;
3761 	mn88472_config.ts_clock = FIXED_TS_CLOCK;
3762 	memset(&info, 0, sizeof(struct i2c_board_info));
3763 	strscpy(info.type, "mn88472", I2C_NAME_SIZE);
3764 	info.addr = 0x18;
3765 	info.platform_data = &mn88472_config;
3766 	request_module(info.type);
3767 	client_demod = i2c_new_device(&d->i2c_adap, &info);
3768 	if (client_demod == NULL || client_demod->dev.driver == NULL)
3769 		goto fail_demod_device;
3770 	if (!try_module_get(client_demod->dev.driver->owner))
3771 		goto fail_demod_module;
3772 
3773 	st->i2c_client_demod = client_demod;
3774 
3775 	adap->fe_adap[0].fe = mn88472_config.get_dvb_frontend(client_demod);
3776 
3777 	/* attach tuner */
3778 	memset(&tda18250_config, 0, sizeof(tda18250_config));
3779 	tda18250_config.if_dvbt_6 = 3950;
3780 	tda18250_config.if_dvbt_7 = 4450;
3781 	tda18250_config.if_dvbt_8 = 4950;
3782 	tda18250_config.if_dvbc_6 = 4950;
3783 	tda18250_config.if_dvbc_8 = 4950;
3784 	tda18250_config.if_atsc = 4079;
3785 	tda18250_config.loopthrough = true;
3786 	tda18250_config.xtal_freq = TDA18250_XTAL_FREQ_27MHZ;
3787 	tda18250_config.fe = adap->fe_adap[0].fe;
3788 
3789 	memset(&info, 0, sizeof(struct i2c_board_info));
3790 	strscpy(info.type, "tda18250", I2C_NAME_SIZE);
3791 	info.addr = 0x60;
3792 	info.platform_data = &tda18250_config;
3793 
3794 	request_module(info.type);
3795 	client_tuner = i2c_new_device(&adap->dev->i2c_adap, &info);
3796 	if (client_tuner == NULL || client_tuner->dev.driver == NULL)
3797 		goto fail_tuner_device;
3798 	if (!try_module_get(client_tuner->dev.driver->owner))
3799 		goto fail_tuner_module;
3800 
3801 	st->i2c_client_tuner = client_tuner;
3802 	return 0;
3803 
3804 fail_tuner_module:
3805 	i2c_unregister_device(client_tuner);
3806 fail_tuner_device:
3807 	module_put(client_demod->dev.driver->owner);
3808 fail_demod_module:
3809 	i2c_unregister_device(client_demod);
3810 fail_demod_device:
3811 	return -ENODEV;
3812 }
3813 
3814 
3815 /* DVB-USB and USB stuff follows */
3816 struct usb_device_id dib0700_usb_id_table[] = {
3817 /* 0 */	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P) },
3818 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P_PC) },
3819 	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
3820 	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
3821 	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
3822 /* 5 */	{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
3823 	{ USB_DEVICE(USB_VID_COMPRO,    USB_PID_COMPRO_VIDEOMATE_U500) },
3824 	{ USB_DEVICE(USB_VID_UNIWILL,   USB_PID_UNIWILL_STK7700P) },
3825 	{ USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
3826 	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
3827 /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
3828 	{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV2000E) },
3829 	{ USB_DEVICE(USB_VID_TERRATEC,
3830 			USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
3831 	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
3832 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700D) },
3833 /* 15 */{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7070P) },
3834 	{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
3835 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7070PD) },
3836 	{ USB_DEVICE(USB_VID_PINNACLE,
3837 			USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
3838 	{ USB_DEVICE(USB_VID_COMPRO,    USB_PID_COMPRO_VIDEOMATE_U500_PC) },
3839 /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
3840 	{ USB_DEVICE(USB_VID_GIGABYTE,  USB_PID_GIGABYTE_U7000) },
3841 	{ USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
3842 	{ USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3000) },
3843 	{ USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3100) },
3844 /* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
3845 	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
3846 	{ USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
3847 	{ USB_DEVICE(USB_VID_PINNACLE,	USB_PID_PINNACLE_EXPRESSCARD_320CX) },
3848 	{ USB_DEVICE(USB_VID_PINNACLE,	USB_PID_PINNACLE_PCTV72E) },
3849 /* 30 */{ USB_DEVICE(USB_VID_PINNACLE,	USB_PID_PINNACLE_PCTV73E) },
3850 	{ USB_DEVICE(USB_VID_YUAN,	USB_PID_YUAN_EC372S) },
3851 	{ USB_DEVICE(USB_VID_TERRATEC,	USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
3852 	{ USB_DEVICE(USB_VID_TERRATEC,	USB_PID_TERRATEC_CINERGY_T_XXS) },
3853 	{ USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
3854 /* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
3855 	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
3856 	{ USB_DEVICE(USB_VID_GIGABYTE,  USB_PID_GIGABYTE_U8000) },
3857 	{ USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700PH) },
3858 	{ USB_DEVICE(USB_VID_ASUS,	USB_PID_ASUS_U3000H) },
3859 /* 40 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV801E) },
3860 	{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV801E_SE) },
3861 	{ USB_DEVICE(USB_VID_TERRATEC,	USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
3862 	{ USB_DEVICE(USB_VID_TERRATEC,
3863 			USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
3864 	{ USB_DEVICE(USB_VID_SONY,	USB_PID_SONY_PLAYTV) },
3865 /* 45 */{ USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_PD378S) },
3866 	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
3867 	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
3868 	{ USB_DEVICE(USB_VID_YUAN,	USB_PID_YUAN_MC770) },
3869 	{ USB_DEVICE(USB_VID_ELGATO,	USB_PID_ELGATO_EYETV_DTT) },
3870 /* 50 */{ USB_DEVICE(USB_VID_ELGATO,	USB_PID_ELGATO_EYETV_DTT_Dlx) },
3871 	{ USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_H) },
3872 	{ USB_DEVICE(USB_VID_TERRATEC,	USB_PID_TERRATEC_T3) },
3873 	{ USB_DEVICE(USB_VID_TERRATEC,	USB_PID_TERRATEC_T5) },
3874 	{ USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700D) },
3875 /* 55 */{ USB_DEVICE(USB_VID_YUAN,	USB_PID_YUAN_STK7700D_2) },
3876 	{ USB_DEVICE(USB_VID_PINNACLE,	USB_PID_PINNACLE_PCTV73A) },
3877 	{ USB_DEVICE(USB_VID_PCTV,	USB_PID_PINNACLE_PCTV73ESE) },
3878 	{ USB_DEVICE(USB_VID_PCTV,	USB_PID_PINNACLE_PCTV282E) },
3879 	{ USB_DEVICE(USB_VID_DIBCOM,	USB_PID_DIBCOM_STK7770P) },
3880 /* 60 */{ USB_DEVICE(USB_VID_TERRATEC,	USB_PID_TERRATEC_CINERGY_T_XXS_2) },
3881 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK807XPVR) },
3882 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK807XP) },
3883 	{ USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x000, 0x3f00) },
3884 	{ USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
3885 /* 65 */{ USB_DEVICE(USB_VID_PINNACLE,	USB_PID_PINNACLE_PCTV73ESE) },
3886 	{ USB_DEVICE(USB_VID_PINNACLE,	USB_PID_PINNACLE_PCTV282E) },
3887 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK8096GP) },
3888 	{ USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DIVERSITY) },
3889 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM9090M) },
3890 /* 70 */{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM8096MD) },
3891 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM9090MD) },
3892 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_NIM7090) },
3893 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_TFE7090PVR) },
3894 	{ USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_AIRSTAR_TELESTICK_2) },
3895 /* 75 */{ USB_DEVICE(USB_VID_MEDION,    USB_PID_CREATIX_CTX1921) },
3896 	{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV340E) },
3897 	{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV340E_SE) },
3898 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_TFE7790P) },
3899 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_TFE8096P) },
3900 /* 80 */{ USB_DEVICE(USB_VID_ELGATO,	USB_PID_ELGATO_EYETV_DTT_2) },
3901 	{ USB_DEVICE(USB_VID_PCTV,      USB_PID_PCTV_2002E) },
3902 	{ USB_DEVICE(USB_VID_PCTV,      USB_PID_PCTV_2002E_SE) },
3903 	{ USB_DEVICE(USB_VID_PCTV,      USB_PID_DIBCOM_STK8096PVR) },
3904 	{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK8096PVR) },
3905 /* 85 */{ USB_DEVICE(USB_VID_HAMA,	USB_PID_HAMA_DVBT_HYBRID) },
3906 	{ USB_DEVICE(USB_VID_MICROSOFT,	USB_PID_XBOX_ONE_TUNER) },
3907 	{ 0 }		/* Terminating entry */
3908 };
3909 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
3910 
3911 #define DIB0700_DEFAULT_DEVICE_PROPERTIES \
3912 	.caps              = DVB_USB_IS_AN_I2C_ADAPTER, \
3913 	.usb_ctrl          = DEVICE_SPECIFIC, \
3914 	.firmware          = "dvb-usb-dib0700-1.20.fw", \
3915 	.download_firmware = dib0700_download_firmware, \
3916 	.no_reconnect      = 1, \
3917 	.size_of_priv      = sizeof(struct dib0700_state), \
3918 	.i2c_algo          = &dib0700_i2c_algo, \
3919 	.identify_state    = dib0700_identify_state
3920 
3921 #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
3922 	.streaming_ctrl   = dib0700_streaming_ctrl, \
3923 	.stream = { \
3924 		.type = USB_BULK, \
3925 		.count = 4, \
3926 		.endpoint = ep, \
3927 		.u = { \
3928 			.bulk = { \
3929 				.buffersize = 39480, \
3930 			} \
3931 		} \
3932 	}
3933 
3934 #define DIB0700_NUM_FRONTENDS(n) \
3935 	.num_frontends = n, \
3936 	.size_of_priv     = sizeof(struct dib0700_adapter_state)
3937 
3938 struct dvb_usb_device_properties dib0700_devices[] = {
3939 	{
3940 		DIB0700_DEFAULT_DEVICE_PROPERTIES,
3941 
3942 		.num_adapters = 1,
3943 		.adapter = {
3944 			{
3945 			DIB0700_NUM_FRONTENDS(1),
3946 			.fe = {{
3947 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3948 				.pid_filter_count = 32,
3949 				.pid_filter       = stk7700p_pid_filter,
3950 				.pid_filter_ctrl  = stk7700p_pid_filter_ctrl,
3951 				.frontend_attach  = stk7700p_frontend_attach,
3952 				.tuner_attach     = stk7700p_tuner_attach,
3953 
3954 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3955 			}},
3956 			},
3957 		},
3958 
3959 		.num_device_descs = 8,
3960 		.devices = {
3961 			{   "DiBcom STK7700P reference design",
3962 				{ &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
3963 				{ NULL },
3964 			},
3965 			{   "Hauppauge Nova-T Stick",
3966 				{ &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
3967 				{ NULL },
3968 			},
3969 			{   "AVerMedia AVerTV DVB-T Volar",
3970 				{ &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
3971 				{ NULL },
3972 			},
3973 			{   "Compro Videomate U500",
3974 				{ &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
3975 				{ NULL },
3976 			},
3977 			{   "Uniwill STK7700P based (Hama and others)",
3978 				{ &dib0700_usb_id_table[7], NULL },
3979 				{ NULL },
3980 			},
3981 			{   "Leadtek Winfast DTV Dongle (STK7700P based)",
3982 				{ &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
3983 				{ NULL },
3984 			},
3985 			{   "AVerMedia AVerTV DVB-T Express",
3986 				{ &dib0700_usb_id_table[20] },
3987 				{ NULL },
3988 			},
3989 			{   "Gigabyte U7000",
3990 				{ &dib0700_usb_id_table[21], NULL },
3991 				{ NULL },
3992 			}
3993 		},
3994 
3995 		.rc.core = {
3996 			.rc_interval      = DEFAULT_RC_INTERVAL,
3997 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
3998 			.rc_query         = dib0700_rc_query_old_firmware,
3999 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4000 					    RC_PROTO_BIT_RC6_MCE |
4001 					    RC_PROTO_BIT_NEC,
4002 			.change_protocol  = dib0700_change_protocol,
4003 		},
4004 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4005 
4006 		.num_adapters = 2,
4007 		.adapter = {
4008 			{
4009 			DIB0700_NUM_FRONTENDS(1),
4010 			.fe = {{
4011 				.frontend_attach  = bristol_frontend_attach,
4012 				.tuner_attach     = bristol_tuner_attach,
4013 
4014 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4015 			}},
4016 			}, {
4017 			DIB0700_NUM_FRONTENDS(1),
4018 			.fe = {{
4019 				.frontend_attach  = bristol_frontend_attach,
4020 				.tuner_attach     = bristol_tuner_attach,
4021 
4022 				DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4023 			}},
4024 			}
4025 		},
4026 
4027 		.num_device_descs = 1,
4028 		.devices = {
4029 			{   "Hauppauge Nova-T 500 Dual DVB-T",
4030 				{ &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
4031 				{ NULL },
4032 			},
4033 		},
4034 
4035 		.rc.core = {
4036 			.rc_interval      = DEFAULT_RC_INTERVAL,
4037 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4038 			.rc_query         = dib0700_rc_query_old_firmware,
4039 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4040 					    RC_PROTO_BIT_RC6_MCE |
4041 					    RC_PROTO_BIT_NEC,
4042 			.change_protocol = dib0700_change_protocol,
4043 		},
4044 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4045 
4046 		.num_adapters = 2,
4047 		.adapter = {
4048 			{
4049 			DIB0700_NUM_FRONTENDS(1),
4050 			.fe = {{
4051 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4052 				.pid_filter_count = 32,
4053 				.pid_filter       = stk70x0p_pid_filter,
4054 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4055 				.frontend_attach  = stk7700d_frontend_attach,
4056 				.tuner_attach     = stk7700d_tuner_attach,
4057 
4058 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4059 			}},
4060 			}, {
4061 			DIB0700_NUM_FRONTENDS(1),
4062 			.fe = {{
4063 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4064 				.pid_filter_count = 32,
4065 				.pid_filter       = stk70x0p_pid_filter,
4066 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4067 				.frontend_attach  = stk7700d_frontend_attach,
4068 				.tuner_attach     = stk7700d_tuner_attach,
4069 
4070 				DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4071 			}},
4072 			}
4073 		},
4074 
4075 		.num_device_descs = 5,
4076 		.devices = {
4077 			{   "Pinnacle PCTV 2000e",
4078 				{ &dib0700_usb_id_table[11], NULL },
4079 				{ NULL },
4080 			},
4081 			{   "Terratec Cinergy DT XS Diversity",
4082 				{ &dib0700_usb_id_table[12], NULL },
4083 				{ NULL },
4084 			},
4085 			{   "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
4086 				{ &dib0700_usb_id_table[13], NULL },
4087 				{ NULL },
4088 			},
4089 			{   "DiBcom STK7700D reference design",
4090 				{ &dib0700_usb_id_table[14], NULL },
4091 				{ NULL },
4092 			},
4093 			{   "YUAN High-Tech DiBcom STK7700D",
4094 				{ &dib0700_usb_id_table[55], NULL },
4095 				{ NULL },
4096 			},
4097 
4098 		},
4099 
4100 		.rc.core = {
4101 			.rc_interval      = DEFAULT_RC_INTERVAL,
4102 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4103 			.rc_query         = dib0700_rc_query_old_firmware,
4104 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4105 					    RC_PROTO_BIT_RC6_MCE |
4106 					    RC_PROTO_BIT_NEC,
4107 			.change_protocol = dib0700_change_protocol,
4108 		},
4109 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4110 
4111 		.num_adapters = 1,
4112 		.adapter = {
4113 			{
4114 			DIB0700_NUM_FRONTENDS(1),
4115 			.fe = {{
4116 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4117 				.pid_filter_count = 32,
4118 				.pid_filter       = stk70x0p_pid_filter,
4119 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4120 				.frontend_attach  = stk7700P2_frontend_attach,
4121 				.tuner_attach     = stk7700d_tuner_attach,
4122 
4123 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4124 			}},
4125 			},
4126 		},
4127 
4128 		.num_device_descs = 3,
4129 		.devices = {
4130 			{   "ASUS My Cinema U3000 Mini DVBT Tuner",
4131 				{ &dib0700_usb_id_table[23], NULL },
4132 				{ NULL },
4133 			},
4134 			{   "Yuan EC372S",
4135 				{ &dib0700_usb_id_table[31], NULL },
4136 				{ NULL },
4137 			},
4138 			{   "Terratec Cinergy T Express",
4139 				{ &dib0700_usb_id_table[42], NULL },
4140 				{ NULL },
4141 			}
4142 		},
4143 
4144 		.rc.core = {
4145 			.rc_interval      = DEFAULT_RC_INTERVAL,
4146 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4147 			.module_name	  = "dib0700",
4148 			.rc_query         = dib0700_rc_query_old_firmware,
4149 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4150 					    RC_PROTO_BIT_RC6_MCE |
4151 					    RC_PROTO_BIT_NEC,
4152 			.change_protocol = dib0700_change_protocol,
4153 		},
4154 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4155 
4156 		.num_adapters = 1,
4157 		.adapter = {
4158 			{
4159 			DIB0700_NUM_FRONTENDS(1),
4160 			.fe = {{
4161 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4162 				.pid_filter_count = 32,
4163 				.pid_filter       = stk70x0p_pid_filter,
4164 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4165 				.frontend_attach  = stk7070p_frontend_attach,
4166 				.tuner_attach     = dib7070p_tuner_attach,
4167 
4168 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4169 			}},
4170 			},
4171 		},
4172 
4173 		.num_device_descs = 12,
4174 		.devices = {
4175 			{   "DiBcom STK7070P reference design",
4176 				{ &dib0700_usb_id_table[15], NULL },
4177 				{ NULL },
4178 			},
4179 			{   "Pinnacle PCTV DVB-T Flash Stick",
4180 				{ &dib0700_usb_id_table[16], NULL },
4181 				{ NULL },
4182 			},
4183 			{   "Artec T14BR DVB-T",
4184 				{ &dib0700_usb_id_table[22], NULL },
4185 				{ NULL },
4186 			},
4187 			{   "ASUS My Cinema U3100 Mini DVBT Tuner",
4188 				{ &dib0700_usb_id_table[24], NULL },
4189 				{ NULL },
4190 			},
4191 			{   "Hauppauge Nova-T Stick",
4192 				{ &dib0700_usb_id_table[25], NULL },
4193 				{ NULL },
4194 			},
4195 			{   "Hauppauge Nova-T MyTV.t",
4196 				{ &dib0700_usb_id_table[26], NULL },
4197 				{ NULL },
4198 			},
4199 			{   "Pinnacle PCTV 72e",
4200 				{ &dib0700_usb_id_table[29], NULL },
4201 				{ NULL },
4202 			},
4203 			{   "Pinnacle PCTV 73e",
4204 				{ &dib0700_usb_id_table[30], NULL },
4205 				{ NULL },
4206 			},
4207 			{   "Elgato EyeTV DTT",
4208 				{ &dib0700_usb_id_table[49], NULL },
4209 				{ NULL },
4210 			},
4211 			{   "Yuan PD378S",
4212 				{ &dib0700_usb_id_table[45], NULL },
4213 				{ NULL },
4214 			},
4215 			{   "Elgato EyeTV Dtt Dlx PD378S",
4216 				{ &dib0700_usb_id_table[50], NULL },
4217 				{ NULL },
4218 			},
4219 			{   "Elgato EyeTV DTT rev. 2",
4220 				{ &dib0700_usb_id_table[80], NULL },
4221 				{ NULL },
4222 			},
4223 		},
4224 
4225 		.rc.core = {
4226 			.rc_interval      = DEFAULT_RC_INTERVAL,
4227 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4228 			.module_name	  = "dib0700",
4229 			.rc_query         = dib0700_rc_query_old_firmware,
4230 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4231 					    RC_PROTO_BIT_RC6_MCE |
4232 					    RC_PROTO_BIT_NEC,
4233 			.change_protocol  = dib0700_change_protocol,
4234 		},
4235 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4236 
4237 		.num_adapters = 1,
4238 		.adapter = {
4239 			{
4240 			DIB0700_NUM_FRONTENDS(1),
4241 			.fe = {{
4242 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4243 				.pid_filter_count = 32,
4244 				.pid_filter       = stk70x0p_pid_filter,
4245 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4246 				.frontend_attach  = stk7070p_frontend_attach,
4247 				.tuner_attach     = dib7070p_tuner_attach,
4248 
4249 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4250 			}},
4251 			},
4252 		},
4253 
4254 		.num_device_descs = 3,
4255 		.devices = {
4256 			{   "Pinnacle PCTV 73A",
4257 				{ &dib0700_usb_id_table[56], NULL },
4258 				{ NULL },
4259 			},
4260 			{   "Pinnacle PCTV 73e SE",
4261 				{ &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL },
4262 				{ NULL },
4263 			},
4264 			{   "Pinnacle PCTV 282e",
4265 				{ &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL },
4266 				{ NULL },
4267 			},
4268 		},
4269 
4270 		.rc.core = {
4271 			.rc_interval      = DEFAULT_RC_INTERVAL,
4272 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4273 			.module_name	  = "dib0700",
4274 			.rc_query         = dib0700_rc_query_old_firmware,
4275 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4276 					    RC_PROTO_BIT_RC6_MCE |
4277 					    RC_PROTO_BIT_NEC,
4278 			.change_protocol  = dib0700_change_protocol,
4279 		},
4280 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4281 
4282 		.num_adapters = 2,
4283 		.adapter = {
4284 			{
4285 			DIB0700_NUM_FRONTENDS(1),
4286 			.fe = {{
4287 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4288 				.pid_filter_count = 32,
4289 				.pid_filter       = stk70x0p_pid_filter,
4290 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4291 				.frontend_attach  = novatd_frontend_attach,
4292 				.tuner_attach     = dib7070p_tuner_attach,
4293 
4294 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4295 			}},
4296 			}, {
4297 			DIB0700_NUM_FRONTENDS(1),
4298 			.fe = {{
4299 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4300 				.pid_filter_count = 32,
4301 				.pid_filter       = stk70x0p_pid_filter,
4302 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4303 				.frontend_attach  = novatd_frontend_attach,
4304 				.tuner_attach     = dib7070p_tuner_attach,
4305 
4306 				DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4307 			}},
4308 			}
4309 		},
4310 
4311 		.num_device_descs = 3,
4312 		.devices = {
4313 			{   "Hauppauge Nova-TD Stick (52009)",
4314 				{ &dib0700_usb_id_table[35], NULL },
4315 				{ NULL },
4316 			},
4317 			{   "PCTV 2002e",
4318 				{ &dib0700_usb_id_table[81], NULL },
4319 				{ NULL },
4320 			},
4321 			{   "PCTV 2002e SE",
4322 				{ &dib0700_usb_id_table[82], NULL },
4323 				{ NULL },
4324 			},
4325 		},
4326 
4327 		.rc.core = {
4328 			.rc_interval      = DEFAULT_RC_INTERVAL,
4329 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4330 			.module_name	  = "dib0700",
4331 			.rc_query         = dib0700_rc_query_old_firmware,
4332 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4333 					    RC_PROTO_BIT_RC6_MCE |
4334 					    RC_PROTO_BIT_NEC,
4335 			.change_protocol = dib0700_change_protocol,
4336 		},
4337 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4338 
4339 		.num_adapters = 2,
4340 		.adapter = {
4341 			{
4342 			DIB0700_NUM_FRONTENDS(1),
4343 			.fe = {{
4344 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4345 				.pid_filter_count = 32,
4346 				.pid_filter       = stk70x0p_pid_filter,
4347 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4348 				.frontend_attach  = stk7070pd_frontend_attach0,
4349 				.tuner_attach     = dib7070p_tuner_attach,
4350 
4351 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4352 			}},
4353 			}, {
4354 			DIB0700_NUM_FRONTENDS(1),
4355 			.fe = {{
4356 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4357 				.pid_filter_count = 32,
4358 				.pid_filter       = stk70x0p_pid_filter,
4359 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4360 				.frontend_attach  = stk7070pd_frontend_attach1,
4361 				.tuner_attach     = dib7070p_tuner_attach,
4362 
4363 				DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4364 			}},
4365 			}
4366 		},
4367 
4368 		.num_device_descs = 5,
4369 		.devices = {
4370 			{   "DiBcom STK7070PD reference design",
4371 				{ &dib0700_usb_id_table[17], NULL },
4372 				{ NULL },
4373 			},
4374 			{   "Pinnacle PCTV Dual DVB-T Diversity Stick",
4375 				{ &dib0700_usb_id_table[18], NULL },
4376 				{ NULL },
4377 			},
4378 			{   "Hauppauge Nova-TD-500 (84xxx)",
4379 				{ &dib0700_usb_id_table[36], NULL },
4380 				{ NULL },
4381 			},
4382 			{  "Terratec Cinergy DT USB XS Diversity/ T5",
4383 				{ &dib0700_usb_id_table[43],
4384 					&dib0700_usb_id_table[53], NULL},
4385 				{ NULL },
4386 			},
4387 			{  "Sony PlayTV",
4388 				{ &dib0700_usb_id_table[44], NULL },
4389 				{ NULL },
4390 			},
4391 		},
4392 
4393 		.rc.core = {
4394 			.rc_interval      = DEFAULT_RC_INTERVAL,
4395 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4396 			.module_name	  = "dib0700",
4397 			.rc_query         = dib0700_rc_query_old_firmware,
4398 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4399 					    RC_PROTO_BIT_RC6_MCE |
4400 					    RC_PROTO_BIT_NEC,
4401 			.change_protocol = dib0700_change_protocol,
4402 		},
4403 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4404 
4405 		.num_adapters = 2,
4406 		.adapter = {
4407 			{
4408 			DIB0700_NUM_FRONTENDS(1),
4409 			.fe = {{
4410 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4411 				.pid_filter_count = 32,
4412 				.pid_filter       = stk70x0p_pid_filter,
4413 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4414 				.frontend_attach  = stk7070pd_frontend_attach0,
4415 				.tuner_attach     = dib7070p_tuner_attach,
4416 
4417 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4418 			}},
4419 			}, {
4420 			DIB0700_NUM_FRONTENDS(1),
4421 			.fe = {{
4422 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4423 				.pid_filter_count = 32,
4424 				.pid_filter       = stk70x0p_pid_filter,
4425 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4426 				.frontend_attach  = stk7070pd_frontend_attach1,
4427 				.tuner_attach     = dib7070p_tuner_attach,
4428 
4429 				DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4430 			}},
4431 			}
4432 		},
4433 
4434 		.num_device_descs = 1,
4435 		.devices = {
4436 			{   "Elgato EyeTV Diversity",
4437 				{ &dib0700_usb_id_table[68], NULL },
4438 				{ NULL },
4439 			},
4440 		},
4441 
4442 		.rc.core = {
4443 			.rc_interval      = DEFAULT_RC_INTERVAL,
4444 			.rc_codes         = RC_MAP_DIB0700_NEC_TABLE,
4445 			.module_name	  = "dib0700",
4446 			.rc_query         = dib0700_rc_query_old_firmware,
4447 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4448 					    RC_PROTO_BIT_RC6_MCE |
4449 					    RC_PROTO_BIT_NEC,
4450 			.change_protocol  = dib0700_change_protocol,
4451 		},
4452 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4453 
4454 		.num_adapters = 1,
4455 		.adapter = {
4456 			{
4457 			DIB0700_NUM_FRONTENDS(1),
4458 			.fe = {{
4459 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4460 				.pid_filter_count = 32,
4461 				.pid_filter       = stk70x0p_pid_filter,
4462 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4463 				.frontend_attach  = stk7700ph_frontend_attach,
4464 				.tuner_attach     = stk7700ph_tuner_attach,
4465 
4466 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4467 			}},
4468 			},
4469 		},
4470 
4471 		.num_device_descs = 10,
4472 		.devices = {
4473 			{   "Terratec Cinergy HT USB XE",
4474 				{ &dib0700_usb_id_table[27], NULL },
4475 				{ NULL },
4476 			},
4477 			{   "Pinnacle Expresscard 320cx",
4478 				{ &dib0700_usb_id_table[28], NULL },
4479 				{ NULL },
4480 			},
4481 			{   "Terratec Cinergy HT Express",
4482 				{ &dib0700_usb_id_table[32], NULL },
4483 				{ NULL },
4484 			},
4485 			{   "Gigabyte U8000-RH",
4486 				{ &dib0700_usb_id_table[37], NULL },
4487 				{ NULL },
4488 			},
4489 			{   "YUAN High-Tech STK7700PH",
4490 				{ &dib0700_usb_id_table[38], NULL },
4491 				{ NULL },
4492 			},
4493 			{   "Asus My Cinema-U3000Hybrid",
4494 				{ &dib0700_usb_id_table[39], NULL },
4495 				{ NULL },
4496 			},
4497 			{   "YUAN High-Tech MC770",
4498 				{ &dib0700_usb_id_table[48], NULL },
4499 				{ NULL },
4500 			},
4501 			{   "Leadtek WinFast DTV Dongle H",
4502 				{ &dib0700_usb_id_table[51], NULL },
4503 				{ NULL },
4504 			},
4505 			{   "YUAN High-Tech STK7700D",
4506 				{ &dib0700_usb_id_table[54], NULL },
4507 				{ NULL },
4508 			},
4509 			{   "Hama DVB=T Hybrid USB Stick",
4510 				{ &dib0700_usb_id_table[85], NULL },
4511 				{ NULL },
4512 			},
4513 		},
4514 
4515 		.rc.core = {
4516 			.rc_interval      = DEFAULT_RC_INTERVAL,
4517 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4518 			.module_name	  = "dib0700",
4519 			.rc_query         = dib0700_rc_query_old_firmware,
4520 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4521 					    RC_PROTO_BIT_RC6_MCE |
4522 					    RC_PROTO_BIT_NEC,
4523 			.change_protocol  = dib0700_change_protocol,
4524 		},
4525 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4526 		.num_adapters = 1,
4527 		.adapter = {
4528 			{
4529 			DIB0700_NUM_FRONTENDS(1),
4530 			.fe = {{
4531 				.frontend_attach  = s5h1411_frontend_attach,
4532 				.tuner_attach     = xc5000_tuner_attach,
4533 
4534 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4535 			}},
4536 			},
4537 		},
4538 
4539 		.num_device_descs = 2,
4540 		.devices = {
4541 			{   "Pinnacle PCTV HD Pro USB Stick",
4542 				{ &dib0700_usb_id_table[40], NULL },
4543 				{ NULL },
4544 			},
4545 			{   "Pinnacle PCTV HD USB Stick",
4546 				{ &dib0700_usb_id_table[41], NULL },
4547 				{ NULL },
4548 			},
4549 		},
4550 
4551 		.rc.core = {
4552 			.rc_interval      = DEFAULT_RC_INTERVAL,
4553 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4554 			.module_name	  = "dib0700",
4555 			.rc_query         = dib0700_rc_query_old_firmware,
4556 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4557 					    RC_PROTO_BIT_RC6_MCE |
4558 					    RC_PROTO_BIT_NEC,
4559 			.change_protocol  = dib0700_change_protocol,
4560 		},
4561 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4562 		.num_adapters = 1,
4563 		.adapter = {
4564 			{
4565 			DIB0700_NUM_FRONTENDS(1),
4566 			.fe = {{
4567 				.frontend_attach  = lgdt3305_frontend_attach,
4568 				.tuner_attach     = mxl5007t_tuner_attach,
4569 
4570 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4571 			}},
4572 			},
4573 		},
4574 
4575 		.num_device_descs = 2,
4576 		.devices = {
4577 			{   "Hauppauge ATSC MiniCard (B200)",
4578 				{ &dib0700_usb_id_table[46], NULL },
4579 				{ NULL },
4580 			},
4581 			{   "Hauppauge ATSC MiniCard (B210)",
4582 				{ &dib0700_usb_id_table[47], NULL },
4583 				{ NULL },
4584 			},
4585 		},
4586 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4587 
4588 		.num_adapters = 1,
4589 		.adapter = {
4590 			{
4591 			DIB0700_NUM_FRONTENDS(1),
4592 			.fe = {{
4593 				.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4594 				.pid_filter_count = 32,
4595 				.pid_filter       = stk70x0p_pid_filter,
4596 				.pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
4597 				.frontend_attach  = stk7770p_frontend_attach,
4598 				.tuner_attach     = dib7770p_tuner_attach,
4599 
4600 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4601 			}},
4602 			},
4603 		},
4604 
4605 		.num_device_descs = 4,
4606 		.devices = {
4607 			{   "DiBcom STK7770P reference design",
4608 				{ &dib0700_usb_id_table[59], NULL },
4609 				{ NULL },
4610 			},
4611 			{   "Terratec Cinergy T USB XXS (HD)/ T3",
4612 				{ &dib0700_usb_id_table[33],
4613 					&dib0700_usb_id_table[52],
4614 					&dib0700_usb_id_table[60], NULL},
4615 				{ NULL },
4616 			},
4617 			{   "TechniSat AirStar TeleStick 2",
4618 				{ &dib0700_usb_id_table[74], NULL },
4619 				{ NULL },
4620 			},
4621 			{   "Medion CTX1921 DVB-T USB",
4622 				{ &dib0700_usb_id_table[75], NULL },
4623 				{ NULL },
4624 			},
4625 		},
4626 
4627 		.rc.core = {
4628 			.rc_interval      = DEFAULT_RC_INTERVAL,
4629 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4630 			.module_name	  = "dib0700",
4631 			.rc_query         = dib0700_rc_query_old_firmware,
4632 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4633 					    RC_PROTO_BIT_RC6_MCE |
4634 					    RC_PROTO_BIT_NEC,
4635 			.change_protocol  = dib0700_change_protocol,
4636 		},
4637 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4638 		.num_adapters = 1,
4639 		.adapter = {
4640 			{
4641 			DIB0700_NUM_FRONTENDS(1),
4642 			.fe = {{
4643 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4644 				.pid_filter_count = 32,
4645 				.pid_filter = stk80xx_pid_filter,
4646 				.pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4647 				.frontend_attach  = stk807x_frontend_attach,
4648 				.tuner_attach     = dib807x_tuner_attach,
4649 
4650 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4651 			}},
4652 			},
4653 		},
4654 
4655 		.num_device_descs = 3,
4656 		.devices = {
4657 			{   "DiBcom STK807xP reference design",
4658 				{ &dib0700_usb_id_table[62], NULL },
4659 				{ NULL },
4660 			},
4661 			{   "Prolink Pixelview SBTVD",
4662 				{ &dib0700_usb_id_table[63], NULL },
4663 				{ NULL },
4664 			},
4665 			{   "EvolutePC TVWay+",
4666 				{ &dib0700_usb_id_table[64], NULL },
4667 				{ NULL },
4668 			},
4669 		},
4670 
4671 		.rc.core = {
4672 			.rc_interval      = DEFAULT_RC_INTERVAL,
4673 			.rc_codes         = RC_MAP_DIB0700_NEC_TABLE,
4674 			.module_name	  = "dib0700",
4675 			.rc_query         = dib0700_rc_query_old_firmware,
4676 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4677 					    RC_PROTO_BIT_RC6_MCE |
4678 					    RC_PROTO_BIT_NEC,
4679 			.change_protocol  = dib0700_change_protocol,
4680 		},
4681 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4682 		.num_adapters = 2,
4683 		.adapter = {
4684 			{
4685 			DIB0700_NUM_FRONTENDS(1),
4686 			.fe = {{
4687 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4688 				.pid_filter_count = 32,
4689 				.pid_filter = stk80xx_pid_filter,
4690 				.pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4691 				.frontend_attach  = stk807xpvr_frontend_attach0,
4692 				.tuner_attach     = dib807x_tuner_attach,
4693 
4694 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4695 			}},
4696 			},
4697 			{
4698 			DIB0700_NUM_FRONTENDS(1),
4699 			.fe = {{
4700 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4701 				.pid_filter_count = 32,
4702 				.pid_filter = stk80xx_pid_filter,
4703 				.pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4704 				.frontend_attach  = stk807xpvr_frontend_attach1,
4705 				.tuner_attach     = dib807x_tuner_attach,
4706 
4707 				DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4708 			}},
4709 			},
4710 		},
4711 
4712 		.num_device_descs = 1,
4713 		.devices = {
4714 			{   "DiBcom STK807xPVR reference design",
4715 				{ &dib0700_usb_id_table[61], NULL },
4716 				{ NULL },
4717 			},
4718 		},
4719 
4720 		.rc.core = {
4721 			.rc_interval      = DEFAULT_RC_INTERVAL,
4722 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4723 			.module_name	  = "dib0700",
4724 			.rc_query         = dib0700_rc_query_old_firmware,
4725 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4726 					    RC_PROTO_BIT_RC6_MCE |
4727 					    RC_PROTO_BIT_NEC,
4728 			.change_protocol  = dib0700_change_protocol,
4729 		},
4730 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4731 		.num_adapters = 1,
4732 		.adapter = {
4733 			{
4734 			DIB0700_NUM_FRONTENDS(1),
4735 			.fe = {{
4736 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4737 					DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4738 				.pid_filter_count = 32,
4739 				.pid_filter = stk80xx_pid_filter,
4740 				.pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4741 				.frontend_attach  = stk809x_frontend_attach,
4742 				.tuner_attach     = dib809x_tuner_attach,
4743 
4744 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4745 			}},
4746 			},
4747 		},
4748 
4749 		.num_device_descs = 1,
4750 		.devices = {
4751 			{   "DiBcom STK8096GP reference design",
4752 				{ &dib0700_usb_id_table[67], NULL },
4753 				{ NULL },
4754 			},
4755 		},
4756 
4757 		.rc.core = {
4758 			.rc_interval      = DEFAULT_RC_INTERVAL,
4759 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4760 			.module_name	  = "dib0700",
4761 			.rc_query         = dib0700_rc_query_old_firmware,
4762 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4763 					    RC_PROTO_BIT_RC6_MCE |
4764 					    RC_PROTO_BIT_NEC,
4765 			.change_protocol  = dib0700_change_protocol,
4766 		},
4767 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4768 		.num_adapters = 1,
4769 		.adapter = {
4770 			{
4771 			DIB0700_NUM_FRONTENDS(1),
4772 			.fe = {{
4773 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4774 					DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4775 				.pid_filter_count = 32,
4776 				.pid_filter = dib90x0_pid_filter,
4777 				.pid_filter_ctrl = dib90x0_pid_filter_ctrl,
4778 				.frontend_attach  = stk9090m_frontend_attach,
4779 				.tuner_attach     = dib9090_tuner_attach,
4780 
4781 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4782 			}},
4783 			},
4784 		},
4785 
4786 		.num_device_descs = 1,
4787 		.devices = {
4788 			{   "DiBcom STK9090M reference design",
4789 				{ &dib0700_usb_id_table[69], NULL },
4790 				{ NULL },
4791 			},
4792 		},
4793 
4794 		.rc.core = {
4795 			.rc_interval      = DEFAULT_RC_INTERVAL,
4796 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4797 			.module_name	  = "dib0700",
4798 			.rc_query         = dib0700_rc_query_old_firmware,
4799 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4800 					    RC_PROTO_BIT_RC6_MCE |
4801 					    RC_PROTO_BIT_NEC,
4802 			.change_protocol  = dib0700_change_protocol,
4803 		},
4804 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4805 		.num_adapters = 1,
4806 		.adapter = {
4807 			{
4808 			DIB0700_NUM_FRONTENDS(1),
4809 			.fe = {{
4810 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4811 					DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4812 				.pid_filter_count = 32,
4813 				.pid_filter = stk80xx_pid_filter,
4814 				.pid_filter_ctrl = stk80xx_pid_filter_ctrl,
4815 				.frontend_attach  = nim8096md_frontend_attach,
4816 				.tuner_attach     = nim8096md_tuner_attach,
4817 
4818 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4819 			}},
4820 			},
4821 		},
4822 
4823 		.num_device_descs = 1,
4824 		.devices = {
4825 			{   "DiBcom NIM8096MD reference design",
4826 				{ &dib0700_usb_id_table[70], NULL },
4827 				{ NULL },
4828 			},
4829 		},
4830 
4831 		.rc.core = {
4832 			.rc_interval      = DEFAULT_RC_INTERVAL,
4833 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4834 			.module_name	  = "dib0700",
4835 			.rc_query         = dib0700_rc_query_old_firmware,
4836 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4837 					    RC_PROTO_BIT_RC6_MCE |
4838 					    RC_PROTO_BIT_NEC,
4839 			.change_protocol  = dib0700_change_protocol,
4840 		},
4841 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4842 		.num_adapters = 1,
4843 		.adapter = {
4844 			{
4845 			DIB0700_NUM_FRONTENDS(1),
4846 			.fe = {{
4847 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4848 					DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4849 				.pid_filter_count = 32,
4850 				.pid_filter = dib90x0_pid_filter,
4851 				.pid_filter_ctrl = dib90x0_pid_filter_ctrl,
4852 				.frontend_attach  = nim9090md_frontend_attach,
4853 				.tuner_attach     = nim9090md_tuner_attach,
4854 
4855 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4856 			}},
4857 			},
4858 		},
4859 
4860 		.num_device_descs = 1,
4861 		.devices = {
4862 			{   "DiBcom NIM9090MD reference design",
4863 				{ &dib0700_usb_id_table[71], NULL },
4864 				{ NULL },
4865 			},
4866 		},
4867 
4868 		.rc.core = {
4869 			.rc_interval      = DEFAULT_RC_INTERVAL,
4870 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4871 			.module_name	  = "dib0700",
4872 			.rc_query         = dib0700_rc_query_old_firmware,
4873 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4874 					    RC_PROTO_BIT_RC6_MCE |
4875 					    RC_PROTO_BIT_NEC,
4876 			.change_protocol  = dib0700_change_protocol,
4877 		},
4878 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4879 		.num_adapters = 1,
4880 		.adapter = {
4881 			{
4882 			DIB0700_NUM_FRONTENDS(1),
4883 			.fe = {{
4884 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4885 					DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4886 				.pid_filter_count = 32,
4887 				.pid_filter = stk70x0p_pid_filter,
4888 				.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
4889 				.frontend_attach  = nim7090_frontend_attach,
4890 				.tuner_attach     = nim7090_tuner_attach,
4891 
4892 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4893 			}},
4894 			},
4895 		},
4896 
4897 		.num_device_descs = 1,
4898 		.devices = {
4899 			{   "DiBcom NIM7090 reference design",
4900 				{ &dib0700_usb_id_table[72], NULL },
4901 				{ NULL },
4902 			},
4903 		},
4904 
4905 		.rc.core = {
4906 			.rc_interval      = DEFAULT_RC_INTERVAL,
4907 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4908 			.module_name	  = "dib0700",
4909 			.rc_query         = dib0700_rc_query_old_firmware,
4910 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4911 					    RC_PROTO_BIT_RC6_MCE |
4912 					    RC_PROTO_BIT_NEC,
4913 			.change_protocol  = dib0700_change_protocol,
4914 		},
4915 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4916 		.num_adapters = 2,
4917 		.adapter = {
4918 			{
4919 			DIB0700_NUM_FRONTENDS(1),
4920 			.fe = {{
4921 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4922 					DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4923 				.pid_filter_count = 32,
4924 				.pid_filter = stk70x0p_pid_filter,
4925 				.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
4926 				.frontend_attach  = tfe7090pvr_frontend0_attach,
4927 				.tuner_attach     = tfe7090pvr_tuner0_attach,
4928 
4929 				DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
4930 			}},
4931 			},
4932 			{
4933 			DIB0700_NUM_FRONTENDS(1),
4934 			.fe = {{
4935 				.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
4936 					DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
4937 				.pid_filter_count = 32,
4938 				.pid_filter = stk70x0p_pid_filter,
4939 				.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
4940 				.frontend_attach  = tfe7090pvr_frontend1_attach,
4941 				.tuner_attach     = tfe7090pvr_tuner1_attach,
4942 
4943 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4944 			}},
4945 			},
4946 		},
4947 
4948 		.num_device_descs = 1,
4949 		.devices = {
4950 			{   "DiBcom TFE7090PVR reference design",
4951 				{ &dib0700_usb_id_table[73], NULL },
4952 				{ NULL },
4953 			},
4954 		},
4955 
4956 		.rc.core = {
4957 			.rc_interval      = DEFAULT_RC_INTERVAL,
4958 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4959 			.module_name	  = "dib0700",
4960 			.rc_query         = dib0700_rc_query_old_firmware,
4961 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4962 					    RC_PROTO_BIT_RC6_MCE |
4963 					    RC_PROTO_BIT_NEC,
4964 			.change_protocol  = dib0700_change_protocol,
4965 		},
4966 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
4967 		.num_adapters = 1,
4968 		.adapter = {
4969 			{
4970 			DIB0700_NUM_FRONTENDS(1),
4971 			.fe = {{
4972 				.frontend_attach  = pctv340e_frontend_attach,
4973 				.tuner_attach     = xc4000_tuner_attach,
4974 
4975 				DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4976 			}},
4977 			},
4978 		},
4979 
4980 		.num_device_descs = 2,
4981 		.devices = {
4982 			{   "Pinnacle PCTV 340e HD Pro USB Stick",
4983 				{ &dib0700_usb_id_table[76], NULL },
4984 				{ NULL },
4985 			},
4986 			{   "Pinnacle PCTV Hybrid Stick Solo",
4987 				{ &dib0700_usb_id_table[77], NULL },
4988 				{ NULL },
4989 			},
4990 		},
4991 		.rc.core = {
4992 			.rc_interval      = DEFAULT_RC_INTERVAL,
4993 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
4994 			.module_name	  = "dib0700",
4995 			.rc_query         = dib0700_rc_query_old_firmware,
4996 			.allowed_protos   = RC_PROTO_BIT_RC5 |
4997 					    RC_PROTO_BIT_RC6_MCE |
4998 					    RC_PROTO_BIT_NEC,
4999 			.change_protocol  = dib0700_change_protocol,
5000 		},
5001 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5002 		.num_adapters = 1,
5003 		.adapter = {
5004 			{
5005 				DIB0700_NUM_FRONTENDS(1),
5006 				.fe = {{
5007 					.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5008 						DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5009 					.pid_filter_count = 32,
5010 					.pid_filter = stk70x0p_pid_filter,
5011 					.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
5012 					.frontend_attach  = tfe7790p_frontend_attach,
5013 					.tuner_attach     = tfe7790p_tuner_attach,
5014 
5015 					DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
5016 				} },
5017 			},
5018 		},
5019 
5020 		.num_device_descs = 1,
5021 		.devices = {
5022 			{   "DiBcom TFE7790P reference design",
5023 				{ &dib0700_usb_id_table[78], NULL },
5024 				{ NULL },
5025 			},
5026 		},
5027 
5028 		.rc.core = {
5029 			.rc_interval      = DEFAULT_RC_INTERVAL,
5030 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
5031 			.module_name	  = "dib0700",
5032 			.rc_query         = dib0700_rc_query_old_firmware,
5033 			.allowed_protos   = RC_PROTO_BIT_RC5 |
5034 					    RC_PROTO_BIT_RC6_MCE |
5035 					    RC_PROTO_BIT_NEC,
5036 			.change_protocol  = dib0700_change_protocol,
5037 		},
5038 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5039 		.num_adapters = 1,
5040 		.adapter = {
5041 			{
5042 				DIB0700_NUM_FRONTENDS(1),
5043 				.fe = {{
5044 					.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5045 						DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5046 					.pid_filter_count = 32,
5047 					.pid_filter = stk80xx_pid_filter,
5048 					.pid_filter_ctrl = stk80xx_pid_filter_ctrl,
5049 					.frontend_attach  = tfe8096p_frontend_attach,
5050 					.tuner_attach     = tfe8096p_tuner_attach,
5051 
5052 					DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
5053 
5054 				} },
5055 			},
5056 		},
5057 
5058 		.num_device_descs = 1,
5059 		.devices = {
5060 			{   "DiBcom TFE8096P reference design",
5061 				{ &dib0700_usb_id_table[79], NULL },
5062 				{ NULL },
5063 			},
5064 		},
5065 
5066 		.rc.core = {
5067 			.rc_interval      = DEFAULT_RC_INTERVAL,
5068 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
5069 			.module_name	  = "dib0700",
5070 			.rc_query         = dib0700_rc_query_old_firmware,
5071 			.allowed_protos   = RC_PROTO_BIT_RC5 |
5072 					    RC_PROTO_BIT_RC6_MCE |
5073 					    RC_PROTO_BIT_NEC,
5074 			.change_protocol  = dib0700_change_protocol,
5075 		},
5076 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5077 		.num_adapters = 2,
5078 		.adapter = {
5079 			{
5080 				.num_frontends = 1,
5081 				.fe = {{
5082 					.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5083 						DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5084 					.pid_filter_count = 32,
5085 					.pid_filter = stk80xx_pid_filter,
5086 					.pid_filter_ctrl = stk80xx_pid_filter_ctrl,
5087 					.frontend_attach  = stk809x_frontend_attach,
5088 					.tuner_attach     = dib809x_tuner_attach,
5089 
5090 					DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
5091 				} },
5092 				.size_of_priv =
5093 					sizeof(struct dib0700_adapter_state),
5094 			}, {
5095 				.num_frontends = 1,
5096 				.fe = { {
5097 					.caps  = DVB_USB_ADAP_HAS_PID_FILTER |
5098 						DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
5099 					.pid_filter_count = 32,
5100 					.pid_filter = stk80xx_pid_filter,
5101 					.pid_filter_ctrl = stk80xx_pid_filter_ctrl,
5102 					.frontend_attach  = stk809x_frontend1_attach,
5103 					.tuner_attach     = dib809x_tuner_attach,
5104 
5105 					DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
5106 				} },
5107 				.size_of_priv =
5108 					sizeof(struct dib0700_adapter_state),
5109 			},
5110 		},
5111 		.num_device_descs = 1,
5112 		.devices = {
5113 			{   "DiBcom STK8096-PVR reference design",
5114 				{ &dib0700_usb_id_table[83],
5115 					&dib0700_usb_id_table[84], NULL},
5116 				{ NULL },
5117 			},
5118 		},
5119 
5120 		.rc.core = {
5121 			.rc_interval      = DEFAULT_RC_INTERVAL,
5122 			.rc_codes         = RC_MAP_DIB0700_RC5_TABLE,
5123 			.module_name  = "dib0700",
5124 			.rc_query         = dib0700_rc_query_old_firmware,
5125 			.allowed_protos   = RC_PROTO_BIT_RC5 |
5126 				RC_PROTO_BIT_RC6_MCE |
5127 				RC_PROTO_BIT_NEC,
5128 			.change_protocol  = dib0700_change_protocol,
5129 		},
5130 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
5131 		.num_adapters = 1,
5132 		.adapter = {
5133 			{
5134 				DIB0700_NUM_FRONTENDS(1),
5135 				.fe = {{
5136 					.frontend_attach = xbox_one_attach,
5137 
5138 					DIB0700_DEFAULT_STREAMING_CONFIG(0x82),
5139 				} },
5140 			},
5141 		},
5142 		.num_device_descs = 1,
5143 		.devices = {
5144 			{ "Microsoft Xbox One Digital TV Tuner",
5145 				{ &dib0700_usb_id_table[86], NULL },
5146 				{ NULL },
5147 			},
5148 		},
5149 	},
5150 };
5151 
5152 int dib0700_device_count = ARRAY_SIZE(dib0700_devices);
5153