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