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