[go: nahoru, domu]

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