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