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