V4L/DVB (13583): DiB8090: Add the DiB0090 tuner driver and STK8096GP-board
[safe/jmp/linux-2.6] / drivers / media / dvb / 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 "mt2060.h"
16 #include "mt2266.h"
17 #include "tuner-xc2028.h"
18 #include "xc5000.h"
19 #include "s5h1411.h"
20 #include "dib0070.h"
21 #include "dib0090.h"
22 #include "lgdt3305.h"
23 #include "mxl5007t.h"
24
25 static int force_lna_activation;
26 module_param(force_lna_activation, int, 0644);
27 MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifyer(s) (LNA), "
28                 "if applicable for the device (default: 0=automatic/off).");
29
30 struct dib0700_adapter_state {
31         int (*set_param_save) (struct dvb_frontend *, struct dvb_frontend_parameters *);
32 };
33
34 /* Hauppauge Nova-T 500 (aka Bristol)
35  *  has a LNA on GPIO0 which is enabled by setting 1 */
36 static struct mt2060_config bristol_mt2060_config[2] = {
37         {
38                 .i2c_address = 0x60,
39                 .clock_out   = 3,
40         }, {
41                 .i2c_address = 0x61,
42         }
43 };
44
45
46 static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
47         .band_caps = BAND_VHF | BAND_UHF,
48         .setup     = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
49
50         .agc1_max = 42598,
51         .agc1_min = 17694,
52         .agc2_max = 45875,
53         .agc2_min = 0,
54
55         .agc1_pt1 = 0,
56         .agc1_pt2 = 59,
57
58         .agc1_slope1 = 0,
59         .agc1_slope2 = 69,
60
61         .agc2_pt1 = 0,
62         .agc2_pt2 = 59,
63
64         .agc2_slope1 = 111,
65         .agc2_slope2 = 28,
66 };
67
68 static struct dib3000mc_config bristol_dib3000mc_config[2] = {
69         {       .agc          = &bristol_dib3000p_mt2060_agc_config,
70                 .max_time     = 0x196,
71                 .ln_adc_level = 0x1cc7,
72                 .output_mpeg2_in_188_bytes = 1,
73         },
74         {       .agc          = &bristol_dib3000p_mt2060_agc_config,
75                 .max_time     = 0x196,
76                 .ln_adc_level = 0x1cc7,
77                 .output_mpeg2_in_188_bytes = 1,
78         }
79 };
80
81 static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
82 {
83         struct dib0700_state *st = adap->dev->priv;
84         if (adap->id == 0) {
85                 dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0); msleep(10);
86                 dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1); msleep(10);
87                 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
88                 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
89
90                 if (force_lna_activation)
91                         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
92                 else
93                         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
94
95                 if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {
96                         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
97                         return -ENODEV;
98                 }
99         }
100         st->mt2060_if1[adap->id] = 1220;
101         return (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
102                 (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
103 }
104
105 static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
106 {
107         struct i2c_msg msg[2] = {
108                 { .addr = 0x50, .flags = 0,        .buf = &adrs, .len = 1 },
109                 { .addr = 0x50, .flags = I2C_M_RD, .buf = pval,  .len = 1 },
110         };
111         if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO;
112         return 0;
113 }
114
115 static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
116 {
117         struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
118         struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
119         s8 a;
120         int if1=1220;
121         if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&
122                 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
123                 if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
124         }
125         return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id],
126                 if1) == NULL ? -ENODEV : 0;
127 }
128
129 /* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity */
130
131 /* MT226x */
132 static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
133         {
134                 BAND_UHF, // band_caps
135
136                 /* 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,
137                 * 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 */
138                 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
139
140                 1130,  // inv_gain
141                 21,  // time_stabiliz
142
143                 0,  // alpha_level
144                 118,  // thlock
145
146                 0,     // wbd_inv
147                 3530,  // wbd_ref
148                 1,     // wbd_sel
149                 0,     // wbd_alpha
150
151                 65535,  // agc1_max
152                 33770,  // agc1_min
153                 65535,  // agc2_max
154                 23592,  // agc2_min
155
156                 0,    // agc1_pt1
157                 62,   // agc1_pt2
158                 255,  // agc1_pt3
159                 64,   // agc1_slope1
160                 64,   // agc1_slope2
161                 132,  // agc2_pt1
162                 192,  // agc2_pt2
163                 80,   // agc2_slope1
164                 80,   // agc2_slope2
165
166                 17,  // alpha_mant
167                 27,  // alpha_exp
168                 23,  // beta_mant
169                 51,  // beta_exp
170
171                 1,  // perform_agc_softsplit
172         }, {
173                 BAND_VHF | BAND_LBAND, // band_caps
174
175                 /* 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,
176                 * 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 */
177                 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
178
179                 2372, // inv_gain
180                 21,   // time_stabiliz
181
182                 0,    // alpha_level
183                 118,  // thlock
184
185                 0,    // wbd_inv
186                 3530, // wbd_ref
187                 1,     // wbd_sel
188                 0,    // wbd_alpha
189
190                 65535, // agc1_max
191                 0,     // agc1_min
192                 65535, // agc2_max
193                 23592, // agc2_min
194
195                 0,    // agc1_pt1
196                 128,  // agc1_pt2
197                 128,  // agc1_pt3
198                 128,  // agc1_slope1
199                 0,    // agc1_slope2
200                 128,  // agc2_pt1
201                 253,  // agc2_pt2
202                 81,   // agc2_slope1
203                 0,    // agc2_slope2
204
205                 17,  // alpha_mant
206                 27,  // alpha_exp
207                 23,  // beta_mant
208                 51,  // beta_exp
209
210                 1,  // perform_agc_softsplit
211         }
212 };
213
214 static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
215         60000, 30000, // internal, sampling
216         1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
217         0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
218         (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
219         0, // ifreq
220         20452225, // timf
221 };
222
223 static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
224         {       .output_mpeg2_in_188_bytes = 1,
225                 .hostbus_diversity = 1,
226                 .tuner_is_baseband = 1,
227
228                 .agc_config_count = 2,
229                 .agc = stk7700d_7000p_mt2266_agc_config,
230                 .bw  = &stk7700d_mt2266_pll_config,
231
232                 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
233                 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
234                 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
235         },
236         {       .output_mpeg2_in_188_bytes = 1,
237                 .hostbus_diversity = 1,
238                 .tuner_is_baseband = 1,
239
240                 .agc_config_count = 2,
241                 .agc = stk7700d_7000p_mt2266_agc_config,
242                 .bw  = &stk7700d_mt2266_pll_config,
243
244                 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
245                 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
246                 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
247         }
248 };
249
250 static struct mt2266_config stk7700d_mt2266_config[2] = {
251         {       .i2c_address = 0x60
252         },
253         {       .i2c_address = 0x60
254         }
255 };
256
257 static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
258 {
259         if (adap->id == 0) {
260                 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
261                 msleep(10);
262                 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
263                 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
264                 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
265                 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
266                 msleep(10);
267                 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
268                 msleep(10);
269                 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
270                                              stk7700d_dib7000p_mt2266_config)
271                     != 0) {
272                         err("%s: dib7000p_i2c_enumeration failed.  Cannot continue\n", __func__);
273                         return -ENODEV;
274                 }
275         }
276
277         adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
278                                 &stk7700d_dib7000p_mt2266_config[adap->id]);
279
280         return adap->fe == NULL ? -ENODEV : 0;
281 }
282
283 static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
284 {
285         if (adap->id == 0) {
286                 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
287                 msleep(10);
288                 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
289                 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
290                 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
291                 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
292                 msleep(10);
293                 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
294                 msleep(10);
295                 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
296                 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
297                                              stk7700d_dib7000p_mt2266_config)
298                     != 0) {
299                         err("%s: dib7000p_i2c_enumeration failed.  Cannot continue\n", __func__);
300                         return -ENODEV;
301                 }
302         }
303
304         adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
305                                 &stk7700d_dib7000p_mt2266_config[adap->id]);
306
307         return adap->fe == NULL ? -ENODEV : 0;
308 }
309
310 static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
311 {
312         struct i2c_adapter *tun_i2c;
313         tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
314         return dvb_attach(mt2266_attach, adap->fe, tun_i2c,
315                 &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
316 }
317
318 /* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
319 static struct dibx000_agc_config xc3028_agc_config = {
320         BAND_VHF | BAND_UHF,       /* band_caps */
321
322         /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
323          * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
324          * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
325         (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
326         (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
327
328         712,    /* inv_gain */
329         21,     /* time_stabiliz */
330
331         0,      /* alpha_level */
332         118,    /* thlock */
333
334         0,      /* wbd_inv */
335         2867,   /* wbd_ref */
336         0,      /* wbd_sel */
337         2,      /* wbd_alpha */
338
339         0,      /* agc1_max */
340         0,      /* agc1_min */
341         39718,  /* agc2_max */
342         9930,   /* agc2_min */
343         0,      /* agc1_pt1 */
344         0,      /* agc1_pt2 */
345         0,      /* agc1_pt3 */
346         0,      /* agc1_slope1 */
347         0,      /* agc1_slope2 */
348         0,      /* agc2_pt1 */
349         128,    /* agc2_pt2 */
350         29,     /* agc2_slope1 */
351         29,     /* agc2_slope2 */
352
353         17,     /* alpha_mant */
354         27,     /* alpha_exp */
355         23,     /* beta_mant */
356         51,     /* beta_exp */
357
358         1,      /* perform_agc_softsplit */
359 };
360
361 /* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
362 static struct dibx000_bandwidth_config xc3028_bw_config = {
363         60000, 30000, /* internal, sampling */
364         1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */
365         0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc,
366                           modulo */
367         (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
368         (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
369         20452225, /* timf */
370         30000000, /* xtal_hz */
371 };
372
373 static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
374         .output_mpeg2_in_188_bytes = 1,
375         .tuner_is_baseband = 1,
376
377         .agc_config_count = 1,
378         .agc = &xc3028_agc_config,
379         .bw  = &xc3028_bw_config,
380
381         .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
382         .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
383         .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
384 };
385
386 static int stk7700ph_xc3028_callback(void *ptr, int component,
387                                      int command, int arg)
388 {
389         struct dvb_usb_adapter *adap = ptr;
390
391         switch (command) {
392         case XC2028_TUNER_RESET:
393                 /* Send the tuner in then out of reset */
394                 dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10);
395                 dib7000p_set_gpio(adap->fe, 8, 0, 1);
396                 break;
397         case XC2028_RESET_CLK:
398                 break;
399         default:
400                 err("%s: unknown command %d, arg %d\n", __func__,
401                         command, arg);
402                 return -EINVAL;
403         }
404         return 0;
405 }
406
407 static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
408         .fname = XC2028_DEFAULT_FIRMWARE,
409         .max_len = 64,
410         .demod = XC3028_FE_DIBCOM52,
411 };
412
413 static struct xc2028_config stk7700ph_xc3028_config = {
414         .i2c_addr = 0x61,
415         .ctrl = &stk7700ph_xc3028_ctrl,
416 };
417
418 static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
419 {
420         struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
421
422         if (desc->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
423             desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
424         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
425         else
426         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
427         msleep(20);
428         dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
429         dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
430         dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
431         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
432         msleep(10);
433         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
434         msleep(20);
435         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
436         msleep(10);
437
438         if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
439                                      &stk7700ph_dib7700_xc3028_config) != 0) {
440                 err("%s: dib7000p_i2c_enumeration failed.  Cannot continue\n",
441                     __func__);
442                 return -ENODEV;
443         }
444
445         adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
446                 &stk7700ph_dib7700_xc3028_config);
447
448         return adap->fe == NULL ? -ENODEV : 0;
449 }
450
451 static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
452 {
453         struct i2c_adapter *tun_i2c;
454
455         tun_i2c = dib7000p_get_i2c_master(adap->fe,
456                 DIBX000_I2C_INTERFACE_TUNER, 1);
457
458         stk7700ph_xc3028_config.i2c_adap = tun_i2c;
459
460         /* FIXME: generalize & move to common area */
461         adap->fe->callback = stk7700ph_xc3028_callback;
462
463         return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config)
464                 == NULL ? -ENODEV : 0;
465 }
466
467 #define DEFAULT_RC_INTERVAL 50
468
469 static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
470
471 /* Number of keypresses to ignore before start repeating */
472 #define RC_REPEAT_DELAY 6
473 #define RC_REPEAT_DELAY_V1_20 10
474
475
476
477 /* Used by firmware versions < 1.20 (deprecated) */
478 static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event,
479                                    int *state)
480 {
481         u8 key[4];
482         int i;
483         struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
484         struct dib0700_state *st = d->priv;
485         *event = 0;
486         *state = REMOTE_NO_KEY_PRESSED;
487         i=dib0700_ctrl_rd(d,rc_request,2,key,4);
488         if (i<=0) {
489                 err("RC Query Failed");
490                 return -1;
491         }
492
493         /* losing half of KEY_0 events from Philipps rc5 remotes.. */
494         if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0;
495
496         /* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)key[3-2],(int)key[3-3],(int)key[3-1],(int)key[3]);  */
497
498         dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */
499
500         switch (dvb_usb_dib0700_ir_proto) {
501         case 0: {
502                 /* NEC protocol sends repeat code as 0 0 0 FF */
503                 if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
504                     (key[3] == 0xFF)) {
505                         st->rc_counter++;
506                         if (st->rc_counter > RC_REPEAT_DELAY) {
507                                 *event = d->last_event;
508                                 *state = REMOTE_KEY_PRESSED;
509                                 st->rc_counter = RC_REPEAT_DELAY;
510                         }
511                         return 0;
512                 }
513                 for (i=0;i<d->props.rc_key_map_size; i++) {
514                         if (rc5_custom(&keymap[i]) == key[3-2] &&
515                             rc5_data(&keymap[i]) == key[3-3]) {
516                                 st->rc_counter = 0;
517                                 *event = keymap[i].event;
518                                 *state = REMOTE_KEY_PRESSED;
519                                 d->last_event = keymap[i].event;
520                                 return 0;
521                         }
522                 }
523                 break;
524         }
525         default: {
526                 /* RC-5 protocol changes toggle bit on new keypress */
527                 for (i = 0; i < d->props.rc_key_map_size; i++) {
528                         if (rc5_custom(&keymap[i]) == key[3-2] &&
529                             rc5_data(&keymap[i]) == key[3-3]) {
530                                 if (d->last_event == keymap[i].event &&
531                                         key[3-1] == st->rc_toggle) {
532                                         st->rc_counter++;
533                                         /* prevents unwanted double hits */
534                                         if (st->rc_counter > RC_REPEAT_DELAY) {
535                                                 *event = d->last_event;
536                                                 *state = REMOTE_KEY_PRESSED;
537                                                 st->rc_counter = RC_REPEAT_DELAY;
538                                         }
539
540                                         return 0;
541                                 }
542                                 st->rc_counter = 0;
543                                 *event = keymap[i].event;
544                                 *state = REMOTE_KEY_PRESSED;
545                                 st->rc_toggle = key[3-1];
546                                 d->last_event = keymap[i].event;
547                                 return 0;
548                         }
549                 }
550                 break;
551         }
552         }
553         err("Unknown remote controller key: %2X %2X %2X %2X", (int) key[3-2], (int) key[3-3], (int) key[3-1], (int) key[3]);
554         d->last_event = 0;
555         return 0;
556 }
557
558 /* This is the structure of the RC response packet starting in firmware 1.20 */
559 struct dib0700_rc_response {
560         u8 report_id;
561         u8 data_state;
562         u16 system;
563         u8 data;
564         u8 not_data;
565 };
566
567 /* This supports the new IR response format for firmware v1.20 */
568 static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event,
569                                   int *state)
570 {
571         struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
572         struct dib0700_state *st = d->priv;
573         struct dib0700_rc_response poll_reply;
574         u8 buf[6];
575         int i;
576         int status;
577         int actlen;
578         int found = 0;
579
580         /* Set initial results in case we exit the function early */
581         *event = 0;
582         *state = REMOTE_NO_KEY_PRESSED;
583
584         /* Firmware v1.20 provides RC data via bulk endpoint 1 */
585         status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf,
586                               sizeof(buf), &actlen, 50);
587         if (status < 0) {
588                 /* No data available (meaning no key press) */
589                 return 0;
590         }
591
592
593         switch (dvb_usb_dib0700_ir_proto) {
594         case 0:
595                 poll_reply.report_id  = 0;
596                 poll_reply.data_state = 1;
597                 poll_reply.system     = buf[2];
598                 poll_reply.data       = buf[4];
599                 poll_reply.not_data   = buf[5];
600
601                 /* NEC protocol sends repeat code as 0 0 0 FF */
602                 if ((poll_reply.system == 0x00) && (poll_reply.data == 0x00)
603                     && (poll_reply.not_data == 0xff)) {
604                         poll_reply.data_state = 2;
605                         break;
606                 }
607                 break;
608         default:
609         if (actlen != sizeof(buf)) {
610                 /* We didn't get back the 6 byte message we expected */
611                 err("Unexpected RC response size [%d]", actlen);
612                 return -1;
613         }
614
615         poll_reply.report_id  = buf[0];
616         poll_reply.data_state = buf[1];
617                 poll_reply.system     = (buf[2] << 8) | buf[3];
618         poll_reply.data       = buf[4];
619         poll_reply.not_data   = buf[5];
620
621                 break;
622         }
623
624         if ((poll_reply.data + poll_reply.not_data) != 0xff) {
625                 /* Key failed integrity check */
626                 err("key failed integrity check: %04x %02x %02x",
627                     poll_reply.system,
628                     poll_reply.data, poll_reply.not_data);
629                 return -1;
630         }
631
632
633         /* Find the key in the map */
634         for (i = 0; i < d->props.rc_key_map_size; i++) {
635                 if (rc5_custom(&keymap[i]) == (poll_reply.system & 0xff) &&
636                         rc5_data(&keymap[i]) == poll_reply.data) {
637                         *event = keymap[i].event;
638                         found = 1;
639                         break;
640                 }
641         }
642
643         if (found == 0) {
644                 err("Unknown remote controller key: %04x %02x %02x",
645                         poll_reply.system,
646                         poll_reply.data, poll_reply.not_data);
647                 d->last_event = 0;
648                 return 0;
649         }
650
651         if (poll_reply.data_state == 1) {
652                 /* New key hit */
653                 st->rc_counter = 0;
654                 *event = keymap[i].event;
655                 *state = REMOTE_KEY_PRESSED;
656                 d->last_event = keymap[i].event;
657         } else if (poll_reply.data_state == 2) {
658                 /* Key repeated */
659                 st->rc_counter++;
660
661                 /* prevents unwanted double hits */
662                 if (st->rc_counter > RC_REPEAT_DELAY_V1_20) {
663                         *event = d->last_event;
664                         *state = REMOTE_KEY_PRESSED;
665                         st->rc_counter = RC_REPEAT_DELAY_V1_20;
666                 }
667         } else {
668                 err("Unknown data state [%d]", poll_reply.data_state);
669         }
670
671         return 0;
672 }
673
674 static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
675 {
676         struct dib0700_state *st = d->priv;
677
678         /* Because some people may have improperly named firmware files,
679            let's figure out whether to use the new firmware call or the legacy
680            call based on the firmware version embedded in the file */
681         if (st->rc_func_version == 0) {
682                 u32 hwver, romver, ramver, fwtype;
683                 int ret = dib0700_get_version(d, &hwver, &romver, &ramver,
684                                               &fwtype);
685                 if (ret < 0) {
686                         err("Could not determine version info");
687                         return -1;
688                 }
689                 if (ramver < 0x10200)
690                         st->rc_func_version = 1;
691                 else
692                         st->rc_func_version = 2;
693         }
694
695         if (st->rc_func_version == 2)
696                 return dib0700_rc_query_v1_20(d, event, state);
697         else
698                 return dib0700_rc_query_legacy(d, event, state);
699 }
700
701 static struct dvb_usb_rc_key dib0700_rc_keys[] = {
702         /* Key codes for the tiny Pinnacle remote*/
703         { 0x0700, KEY_MUTE },
704         { 0x0701, KEY_MENU }, /* Pinnacle logo */
705         { 0x0739, KEY_POWER },
706         { 0x0703, KEY_VOLUMEUP },
707         { 0x0709, KEY_VOLUMEDOWN },
708         { 0x0706, KEY_CHANNELUP },
709         { 0x070c, KEY_CHANNELDOWN },
710         { 0x070f, KEY_1 },
711         { 0x0715, KEY_2 },
712         { 0x0710, KEY_3 },
713         { 0x0718, KEY_4 },
714         { 0x071b, KEY_5 },
715         { 0x071e, KEY_6 },
716         { 0x0711, KEY_7 },
717         { 0x0721, KEY_8 },
718         { 0x0712, KEY_9 },
719         { 0x0727, KEY_0 },
720         { 0x0724, KEY_SCREEN }, /* 'Square' key */
721         { 0x072a, KEY_TEXT },   /* 'T' key */
722         { 0x072d, KEY_REWIND },
723         { 0x0730, KEY_PLAY },
724         { 0x0733, KEY_FASTFORWARD },
725         { 0x0736, KEY_RECORD },
726         { 0x073c, KEY_STOP },
727         { 0x073f, KEY_CANCEL }, /* '?' key */
728         /* Key codes for the Terratec Cinergy DT XS Diversity, similar to cinergyT2.c */
729         { 0xeb01, KEY_POWER },
730         { 0xeb02, KEY_1 },
731         { 0xeb03, KEY_2 },
732         { 0xeb04, KEY_3 },
733         { 0xeb05, KEY_4 },
734         { 0xeb06, KEY_5 },
735         { 0xeb07, KEY_6 },
736         { 0xeb08, KEY_7 },
737         { 0xeb09, KEY_8 },
738         { 0xeb0a, KEY_9 },
739         { 0xeb0b, KEY_VIDEO },
740         { 0xeb0c, KEY_0 },
741         { 0xeb0d, KEY_REFRESH },
742         { 0xeb0f, KEY_EPG },
743         { 0xeb10, KEY_UP },
744         { 0xeb11, KEY_LEFT },
745         { 0xeb12, KEY_OK },
746         { 0xeb13, KEY_RIGHT },
747         { 0xeb14, KEY_DOWN },
748         { 0xeb16, KEY_INFO },
749         { 0xeb17, KEY_RED },
750         { 0xeb18, KEY_GREEN },
751         { 0xeb19, KEY_YELLOW },
752         { 0xeb1a, KEY_BLUE },
753         { 0xeb1b, KEY_CHANNELUP },
754         { 0xeb1c, KEY_VOLUMEUP },
755         { 0xeb1d, KEY_MUTE },
756         { 0xeb1e, KEY_VOLUMEDOWN },
757         { 0xeb1f, KEY_CHANNELDOWN },
758         { 0xeb40, KEY_PAUSE },
759         { 0xeb41, KEY_HOME },
760         { 0xeb42, KEY_MENU }, /* DVD Menu */
761         { 0xeb43, KEY_SUBTITLE },
762         { 0xeb44, KEY_TEXT }, /* Teletext */
763         { 0xeb45, KEY_DELETE },
764         { 0xeb46, KEY_TV },
765         { 0xeb47, KEY_DVD },
766         { 0xeb48, KEY_STOP },
767         { 0xeb49, KEY_VIDEO },
768         { 0xeb4a, KEY_AUDIO }, /* Music */
769         { 0xeb4b, KEY_SCREEN }, /* Pic */
770         { 0xeb4c, KEY_PLAY },
771         { 0xeb4d, KEY_BACK },
772         { 0xeb4e, KEY_REWIND },
773         { 0xeb4f, KEY_FASTFORWARD },
774         { 0xeb54, KEY_PREVIOUS },
775         { 0xeb58, KEY_RECORD },
776         { 0xeb5c, KEY_NEXT },
777
778         /* Key codes for the Haupauge WinTV Nova-TD, copied from nova-t-usb2.c (Nova-T USB2) */
779         { 0x1e00, KEY_0 },
780         { 0x1e01, KEY_1 },
781         { 0x1e02, KEY_2 },
782         { 0x1e03, KEY_3 },
783         { 0x1e04, KEY_4 },
784         { 0x1e05, KEY_5 },
785         { 0x1e06, KEY_6 },
786         { 0x1e07, KEY_7 },
787         { 0x1e08, KEY_8 },
788         { 0x1e09, KEY_9 },
789         { 0x1e0a, KEY_KPASTERISK },
790         { 0x1e0b, KEY_RED },
791         { 0x1e0c, KEY_RADIO },
792         { 0x1e0d, KEY_MENU },
793         { 0x1e0e, KEY_GRAVE }, /* # */
794         { 0x1e0f, KEY_MUTE },
795         { 0x1e10, KEY_VOLUMEUP },
796         { 0x1e11, KEY_VOLUMEDOWN },
797         { 0x1e12, KEY_CHANNEL },
798         { 0x1e14, KEY_UP },
799         { 0x1e15, KEY_DOWN },
800         { 0x1e16, KEY_LEFT },
801         { 0x1e17, KEY_RIGHT },
802         { 0x1e18, KEY_VIDEO },
803         { 0x1e19, KEY_AUDIO },
804         { 0x1e1a, KEY_MEDIA },
805         { 0x1e1b, KEY_EPG },
806         { 0x1e1c, KEY_TV },
807         { 0x1e1e, KEY_NEXT },
808         { 0x1e1f, KEY_BACK },
809         { 0x1e20, KEY_CHANNELUP },
810         { 0x1e21, KEY_CHANNELDOWN },
811         { 0x1e24, KEY_LAST }, /* Skip backwards */
812         { 0x1e25, KEY_OK },
813         { 0x1e29, KEY_BLUE},
814         { 0x1e2e, KEY_GREEN },
815         { 0x1e30, KEY_PAUSE },
816         { 0x1e32, KEY_REWIND },
817         { 0x1e34, KEY_FASTFORWARD },
818         { 0x1e35, KEY_PLAY },
819         { 0x1e36, KEY_STOP },
820         { 0x1e37, KEY_RECORD },
821         { 0x1e38, KEY_YELLOW },
822         { 0x1e3b, KEY_GOTO },
823         { 0x1e3d, KEY_POWER },
824
825         /* Key codes for the Leadtek Winfast DTV Dongle */
826         { 0x0042, KEY_POWER },
827         { 0x077c, KEY_TUNER },
828         { 0x0f4e, KEY_PRINT }, /* PREVIEW */
829         { 0x0840, KEY_SCREEN }, /* full screen toggle*/
830         { 0x0f71, KEY_DOT }, /* frequency */
831         { 0x0743, KEY_0 },
832         { 0x0c41, KEY_1 },
833         { 0x0443, KEY_2 },
834         { 0x0b7f, KEY_3 },
835         { 0x0e41, KEY_4 },
836         { 0x0643, KEY_5 },
837         { 0x097f, KEY_6 },
838         { 0x0d7e, KEY_7 },
839         { 0x057c, KEY_8 },
840         { 0x0a40, KEY_9 },
841         { 0x0e4e, KEY_CLEAR },
842         { 0x047c, KEY_CHANNEL }, /* show channel number */
843         { 0x0f41, KEY_LAST }, /* recall */
844         { 0x0342, KEY_MUTE },
845         { 0x064c, KEY_RESERVED }, /* PIP button*/
846         { 0x0172, KEY_SHUFFLE }, /* SNAPSHOT */
847         { 0x0c4e, KEY_PLAYPAUSE }, /* TIMESHIFT */
848         { 0x0b70, KEY_RECORD },
849         { 0x037d, KEY_VOLUMEUP },
850         { 0x017d, KEY_VOLUMEDOWN },
851         { 0x0242, KEY_CHANNELUP },
852         { 0x007d, KEY_CHANNELDOWN },
853
854         /* Key codes for Nova-TD "credit card" remote control. */
855         { 0x1d00, KEY_0 },
856         { 0x1d01, KEY_1 },
857         { 0x1d02, KEY_2 },
858         { 0x1d03, KEY_3 },
859         { 0x1d04, KEY_4 },
860         { 0x1d05, KEY_5 },
861         { 0x1d06, KEY_6 },
862         { 0x1d07, KEY_7 },
863         { 0x1d08, KEY_8 },
864         { 0x1d09, KEY_9 },
865         { 0x1d0a, KEY_TEXT },
866         { 0x1d0d, KEY_MENU },
867         { 0x1d0f, KEY_MUTE },
868         { 0x1d10, KEY_VOLUMEUP },
869         { 0x1d11, KEY_VOLUMEDOWN },
870         { 0x1d12, KEY_CHANNEL },
871         { 0x1d14, KEY_UP },
872         { 0x1d15, KEY_DOWN },
873         { 0x1d16, KEY_LEFT },
874         { 0x1d17, KEY_RIGHT },
875         { 0x1d1c, KEY_TV },
876         { 0x1d1e, KEY_NEXT },
877         { 0x1d1f, KEY_BACK },
878         { 0x1d20, KEY_CHANNELUP },
879         { 0x1d21, KEY_CHANNELDOWN },
880         { 0x1d24, KEY_LAST },
881         { 0x1d25, KEY_OK },
882         { 0x1d30, KEY_PAUSE },
883         { 0x1d32, KEY_REWIND },
884         { 0x1d34, KEY_FASTFORWARD },
885         { 0x1d35, KEY_PLAY },
886         { 0x1d36, KEY_STOP },
887         { 0x1d37, KEY_RECORD },
888         { 0x1d3b, KEY_GOTO },
889         { 0x1d3d, KEY_POWER },
890
891         /* Key codes for the Pixelview SBTVD remote (proto NEC) */
892         { 0x8613, KEY_MUTE },
893         { 0x8612, KEY_POWER },
894         { 0x8601, KEY_1 },
895         { 0x8602, KEY_2 },
896         { 0x8603, KEY_3 },
897         { 0x8604, KEY_4 },
898         { 0x8605, KEY_5 },
899         { 0x8606, KEY_6 },
900         { 0x8607, KEY_7 },
901         { 0x8608, KEY_8 },
902         { 0x8609, KEY_9 },
903         { 0x8600, KEY_0 },
904         { 0x860d, KEY_CHANNELUP },
905         { 0x8619, KEY_CHANNELDOWN },
906         { 0x8610, KEY_VOLUMEUP },
907         { 0x860c, KEY_VOLUMEDOWN },
908
909         { 0x860a, KEY_CAMERA },
910         { 0x860b, KEY_ZOOM },
911         { 0x861b, KEY_BACKSPACE },
912         { 0x8615, KEY_ENTER },
913
914         { 0x861d, KEY_UP },
915         { 0x861e, KEY_DOWN },
916         { 0x860e, KEY_LEFT },
917         { 0x860f, KEY_RIGHT },
918
919         { 0x8618, KEY_RECORD },
920         { 0x861a, KEY_STOP },
921
922         /* Key codes for the EvolutePC TVWay+ remote (proto NEC) */
923         { 0x7a00, KEY_MENU },
924         { 0x7a01, KEY_RECORD },
925         { 0x7a02, KEY_PLAY },
926         { 0x7a03, KEY_STOP },
927         { 0x7a10, KEY_CHANNELUP },
928         { 0x7a11, KEY_CHANNELDOWN },
929         { 0x7a12, KEY_VOLUMEUP },
930         { 0x7a13, KEY_VOLUMEDOWN },
931         { 0x7a40, KEY_POWER },
932         { 0x7a41, KEY_MUTE },
933 };
934
935 /* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
936 static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
937         BAND_UHF | BAND_VHF,       // band_caps
938
939         /* 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,
940          * 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 */
941         (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
942
943         712,  // inv_gain
944         41,  // time_stabiliz
945
946         0,  // alpha_level
947         118,  // thlock
948
949         0,     // wbd_inv
950         4095,  // wbd_ref
951         0,     // wbd_sel
952         0,     // wbd_alpha
953
954         42598,  // agc1_max
955         17694,  // agc1_min
956         45875,  // agc2_max
957         2621,  // agc2_min
958         0,  // agc1_pt1
959         76,  // agc1_pt2
960         139,  // agc1_pt3
961         52,  // agc1_slope1
962         59,  // agc1_slope2
963         107,  // agc2_pt1
964         172,  // agc2_pt2
965         57,  // agc2_slope1
966         70,  // agc2_slope2
967
968         21,  // alpha_mant
969         25,  // alpha_exp
970         28,  // beta_mant
971         48,  // beta_exp
972
973         1,  // perform_agc_softsplit
974         {  0,     // split_min
975            107,   // split_max
976            51800, // global_split_min
977            24700  // global_split_max
978         },
979 };
980
981 static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
982         BAND_UHF | BAND_VHF,
983
984         /* 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,
985          * 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 */
986         (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
987
988         712, // inv_gain
989         41,  // time_stabiliz
990
991         0,   // alpha_level
992         118, // thlock
993
994         0,    // wbd_inv
995         4095, // wbd_ref
996         0,    // wbd_sel
997         0,    // wbd_alpha
998
999         42598, // agc1_max
1000         16384, // agc1_min
1001         42598, // agc2_max
1002             0, // agc2_min
1003
1004           0,   // agc1_pt1
1005         137,   // agc1_pt2
1006         255,   // agc1_pt3
1007
1008           0,   // agc1_slope1
1009         255,   // agc1_slope2
1010
1011         0,     // agc2_pt1
1012         0,     // agc2_pt2
1013
1014          0,    // agc2_slope1
1015         41,    // agc2_slope2
1016
1017         15, // alpha_mant
1018         25, // alpha_exp
1019
1020         28, // beta_mant
1021         48, // beta_exp
1022
1023         0, // perform_agc_softsplit
1024 };
1025
1026 static struct dibx000_bandwidth_config stk7700p_pll_config = {
1027         60000, 30000, // internal, sampling
1028         1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1029         0, 0, 1, 1, 0, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1030         (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
1031         60258167, // ifreq
1032         20452225, // timf
1033         30000000, // xtal
1034 };
1035
1036 static struct dib7000m_config stk7700p_dib7000m_config = {
1037         .dvbt_mode = 1,
1038         .output_mpeg2_in_188_bytes = 1,
1039         .quartz_direct = 1,
1040
1041         .agc_config_count = 1,
1042         .agc = &stk7700p_7000m_mt2060_agc_config,
1043         .bw  = &stk7700p_pll_config,
1044
1045         .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
1046         .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
1047         .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
1048 };
1049
1050 static struct dib7000p_config stk7700p_dib7000p_config = {
1051         .output_mpeg2_in_188_bytes = 1,
1052
1053         .agc_config_count = 1,
1054         .agc = &stk7700p_7000p_mt2060_agc_config,
1055         .bw  = &stk7700p_pll_config,
1056
1057         .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
1058         .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
1059         .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
1060 };
1061
1062 static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
1063 {
1064         struct dib0700_state *st = adap->dev->priv;
1065         /* unless there is no real power management in DVB - we leave the device on GPIO6 */
1066
1067         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1068         dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0); msleep(50);
1069
1070         dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1); msleep(10);
1071         dib0700_set_gpio(adap->dev, GPIO9,  GPIO_OUT, 1);
1072
1073         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
1074         dib0700_ctrl_clock(adap->dev, 72, 1);
1075         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
1076
1077         dib0700_set_gpio(adap->dev,  GPIO0, GPIO_OUT, 1);
1078
1079         st->mt2060_if1[0] = 1220;
1080
1081         if (dib7000pc_detection(&adap->dev->i2c_adap)) {
1082                 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
1083                 st->is_dib7000pc = 1;
1084         } else
1085                 adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
1086
1087         return adap->fe == NULL ? -ENODEV : 0;
1088 }
1089
1090 static struct mt2060_config stk7700p_mt2060_config = {
1091         0x60
1092 };
1093
1094 static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
1095 {
1096         struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
1097         struct dib0700_state *st = adap->dev->priv;
1098         struct i2c_adapter *tun_i2c;
1099         s8 a;
1100         int if1=1220;
1101         if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&
1102                 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
1103                 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
1104         }
1105         if (st->is_dib7000pc)
1106                 tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1107         else
1108                 tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1109
1110         return dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk7700p_mt2060_config,
1111                 if1) == NULL ? -ENODEV : 0;
1112 }
1113
1114 /* DIB7070 generic */
1115 static struct dibx000_agc_config dib7070_agc_config = {
1116         BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1117         /* 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,
1118          * 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 */
1119         (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
1120
1121         600, // inv_gain
1122         10,  // time_stabiliz
1123
1124         0,  // alpha_level
1125         118,  // thlock
1126
1127         0,     // wbd_inv
1128         3530,  // wbd_ref
1129         1,     // wbd_sel
1130         5,     // wbd_alpha
1131
1132         65535,  // agc1_max
1133                 0,  // agc1_min
1134
1135         65535,  // agc2_max
1136         0,      // agc2_min
1137
1138         0,      // agc1_pt1
1139         40,     // agc1_pt2
1140         183,    // agc1_pt3
1141         206,    // agc1_slope1
1142         255,    // agc1_slope2
1143         72,     // agc2_pt1
1144         152,    // agc2_pt2
1145         88,     // agc2_slope1
1146         90,     // agc2_slope2
1147
1148         17,  // alpha_mant
1149         27,  // alpha_exp
1150         23,  // beta_mant
1151         51,  // beta_exp
1152
1153         0,  // perform_agc_softsplit
1154 };
1155
1156 static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
1157 {
1158         deb_info("reset: %d", onoff);
1159         return dib7000p_set_gpio(fe, 8, 0, !onoff);
1160 }
1161
1162 static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
1163 {
1164         deb_info("sleep: %d", onoff);
1165         return dib7000p_set_gpio(fe, 9, 0, onoff);
1166 }
1167
1168 static struct dib0070_config dib7070p_dib0070_config[2] = {
1169         {
1170                 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1171                 .reset = dib7070_tuner_reset,
1172                 .sleep = dib7070_tuner_sleep,
1173                 .clock_khz = 12000,
1174                 .clock_pad_drive = 4,
1175                 .charge_pump = 2,
1176         }, {
1177                 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1178                 .reset = dib7070_tuner_reset,
1179                 .sleep = dib7070_tuner_sleep,
1180                 .clock_khz = 12000,
1181                 .charge_pump = 2,
1182         }
1183 };
1184
1185 static struct dib0070_config dib7770p_dib0070_config = {
1186          .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1187          .reset = dib7070_tuner_reset,
1188          .sleep = dib7070_tuner_sleep,
1189          .clock_khz = 12000,
1190          .clock_pad_drive = 0,
1191          .flip_chip = 1,
1192          .charge_pump = 2,
1193 };
1194
1195 static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
1196 {
1197         struct dvb_usb_adapter *adap = fe->dvb->priv;
1198         struct dib0700_adapter_state *state = adap->priv;
1199
1200         u16 offset;
1201         u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1202         switch (band) {
1203                 case BAND_VHF: offset = 950; break;
1204                 case BAND_UHF:
1205                 default: offset = 550; break;
1206         }
1207         deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1208         dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1209         return state->set_param_save(fe, fep);
1210 }
1211
1212 static int dib7770_set_param_override(struct dvb_frontend *fe,
1213                 struct dvb_frontend_parameters *fep)
1214 {
1215          struct dvb_usb_adapter *adap = fe->dvb->priv;
1216          struct dib0700_adapter_state *state = adap->priv;
1217
1218          u16 offset;
1219          u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1220          switch (band) {
1221          case BAND_VHF:
1222                   dib7000p_set_gpio(fe, 0, 0, 1);
1223                   offset = 850;
1224                   break;
1225          case BAND_UHF:
1226          default:
1227                   dib7000p_set_gpio(fe, 0, 0, 0);
1228                   offset = 250;
1229                   break;
1230          }
1231          deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1232          dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1233          return state->set_param_save(fe, fep);
1234 }
1235
1236 static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
1237 {
1238          struct dib0700_adapter_state *st = adap->priv;
1239          struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe,
1240                          DIBX000_I2C_INTERFACE_TUNER, 1);
1241
1242          if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1243                                  &dib7770p_dib0070_config) == NULL)
1244                  return -ENODEV;
1245
1246          st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1247          adap->fe->ops.tuner_ops.set_params = dib7770_set_param_override;
1248          return 0;
1249 }
1250
1251 static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
1252 {
1253         struct dib0700_adapter_state *st = adap->priv;
1254         struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1255
1256         if (adap->id == 0) {
1257                 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
1258                         return -ENODEV;
1259         } else {
1260                 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
1261                         return -ENODEV;
1262         }
1263
1264         st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1265         adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1266         return 0;
1267 }
1268
1269 static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1270 {
1271     return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
1272 }
1273
1274 static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1275 {
1276     return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
1277 }
1278
1279 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
1280         60000, 15000, // internal, sampling
1281         1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1282         0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1283         (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
1284         (0 << 25) | 0, // ifreq = 0.000000 MHz
1285         20452225, // timf
1286         12000000, // xtal_hz
1287 };
1288
1289 static struct dib7000p_config dib7070p_dib7000p_config = {
1290         .output_mpeg2_in_188_bytes = 1,
1291
1292         .agc_config_count = 1,
1293         .agc = &dib7070_agc_config,
1294         .bw  = &dib7070_bw_config_12_mhz,
1295         .tuner_is_baseband = 1,
1296         .spur_protect = 1,
1297
1298         .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1299         .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1300         .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1301
1302         .hostbus_diversity = 1,
1303 };
1304
1305 /* STK7070P */
1306 static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
1307 {
1308         struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
1309         if (p->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
1310             p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
1311                 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1312         else
1313                 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1314         msleep(10);
1315         dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1316         dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1317         dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1318         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1319
1320         dib0700_ctrl_clock(adap->dev, 72, 1);
1321
1322         msleep(10);
1323         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1324         msleep(10);
1325         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1326
1327         if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1328                                      &dib7070p_dib7000p_config) != 0) {
1329                 err("%s: dib7000p_i2c_enumeration failed.  Cannot continue\n",
1330                     __func__);
1331                 return -ENODEV;
1332         }
1333
1334         adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1335                 &dib7070p_dib7000p_config);
1336         return adap->fe == NULL ? -ENODEV : 0;
1337 }
1338
1339 /* DIB807x generic */
1340 static struct dibx000_agc_config dib807x_agc_config[2] = {
1341         {
1342                 BAND_VHF,
1343                 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1344                  * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1345                  * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
1346                  * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1347                  * P_agc_write=0 */
1348                 (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
1349                         (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1350                         (0 << 0), /* setup*/
1351
1352                 600, /* inv_gain*/
1353                 10,  /* time_stabiliz*/
1354
1355                 0,  /* alpha_level*/
1356                 118,  /* thlock*/
1357
1358                 0,     /* wbd_inv*/
1359                 3530,  /* wbd_ref*/
1360                 1,     /* wbd_sel*/
1361                 5,     /* wbd_alpha*/
1362
1363                 65535,  /* agc1_max*/
1364                 0,  /* agc1_min*/
1365
1366                 65535,  /* agc2_max*/
1367                 0,      /* agc2_min*/
1368
1369                 0,      /* agc1_pt1*/
1370                 40,     /* agc1_pt2*/
1371                 183,    /* agc1_pt3*/
1372                 206,    /* agc1_slope1*/
1373                 255,    /* agc1_slope2*/
1374                 72,     /* agc2_pt1*/
1375                 152,    /* agc2_pt2*/
1376                 88,     /* agc2_slope1*/
1377                 90,     /* agc2_slope2*/
1378
1379                 17,  /* alpha_mant*/
1380                 27,  /* alpha_exp*/
1381                 23,  /* beta_mant*/
1382                 51,  /* beta_exp*/
1383
1384                 0,  /* perform_agc_softsplit*/
1385         }, {
1386                 BAND_UHF,
1387                 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1388                  * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1389                  * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1390                  * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1391                  * P_agc_write=0 */
1392                 (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
1393                         (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1394                         (0 << 0), /* setup */
1395
1396                 600, /* inv_gain*/
1397                 10,  /* time_stabiliz*/
1398
1399                 0,  /* alpha_level*/
1400                 118,  /* thlock*/
1401
1402                 0,     /* wbd_inv*/
1403                 3530,  /* wbd_ref*/
1404                 1,     /* wbd_sel*/
1405                 5,     /* wbd_alpha*/
1406
1407                 65535,  /* agc1_max*/
1408                 0,  /* agc1_min*/
1409
1410                 65535,  /* agc2_max*/
1411                 0,      /* agc2_min*/
1412
1413                 0,      /* agc1_pt1*/
1414                 40,     /* agc1_pt2*/
1415                 183,    /* agc1_pt3*/
1416                 206,    /* agc1_slope1*/
1417                 255,    /* agc1_slope2*/
1418                 72,     /* agc2_pt1*/
1419                 152,    /* agc2_pt2*/
1420                 88,     /* agc2_slope1*/
1421                 90,     /* agc2_slope2*/
1422
1423                 17,  /* alpha_mant*/
1424                 27,  /* alpha_exp*/
1425                 23,  /* beta_mant*/
1426                 51,  /* beta_exp*/
1427
1428                 0,  /* perform_agc_softsplit*/
1429         }
1430 };
1431
1432 static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
1433         60000, 15000, /* internal, sampling*/
1434         1, 20, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass*/
1435         0, 0, 1, 1, 2, /* misc: refdiv, bypclk_div, IO_CLK_en_core,
1436                           ADClkSrc, modulo */
1437         (3 << 14) | (1 << 12) | (599 << 0), /* sad_cfg: refsel, sel, freq_15k*/
1438         (0 << 25) | 0, /* ifreq = 0.000000 MHz*/
1439         18179755, /* timf*/
1440         12000000, /* xtal_hz*/
1441 };
1442
1443 static struct dib8000_config dib807x_dib8000_config[2] = {
1444         {
1445                 .output_mpeg2_in_188_bytes = 1,
1446
1447                 .agc_config_count = 2,
1448                 .agc = dib807x_agc_config,
1449                 .pll = &dib807x_bw_config_12_mhz,
1450                 .tuner_is_baseband = 1,
1451
1452                 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1453                 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1454                 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1455
1456                 .hostbus_diversity = 1,
1457                 .div_cfg = 1,
1458                 .agc_control = &dib0070_ctrl_agc_filter,
1459                 .output_mode = OUTMODE_MPEG2_FIFO,
1460                 .drives = 0x2d98,
1461         }, {
1462                 .output_mpeg2_in_188_bytes = 1,
1463
1464                 .agc_config_count = 2,
1465                 .agc = dib807x_agc_config,
1466                 .pll = &dib807x_bw_config_12_mhz,
1467                 .tuner_is_baseband = 1,
1468
1469                 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1470                 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1471                 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1472
1473                 .hostbus_diversity = 1,
1474                 .agc_control = &dib0070_ctrl_agc_filter,
1475                 .output_mode = OUTMODE_MPEG2_FIFO,
1476                 .drives = 0x2d98,
1477         }
1478 };
1479
1480 static int dib80xx_tuner_reset(struct dvb_frontend *fe, int onoff)
1481 {
1482         return dib8000_set_gpio(fe, 5, 0, !onoff);
1483 }
1484
1485 static int dib80xx_tuner_sleep(struct dvb_frontend *fe, int onoff)
1486 {
1487         return dib8000_set_gpio(fe, 0, 0, onoff);
1488 }
1489
1490 static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1491     { 240,      7},
1492     { 0xffff,   6},
1493 };
1494
1495 static struct dib0070_config dib807x_dib0070_config[2] = {
1496         {
1497                 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1498                 .reset = dib80xx_tuner_reset,
1499                 .sleep = dib80xx_tuner_sleep,
1500                 .clock_khz = 12000,
1501                 .clock_pad_drive = 4,
1502                 .vga_filter = 1,
1503                 .force_crystal_mode = 1,
1504                 .enable_third_order_filter = 1,
1505                 .charge_pump = 0,
1506                 .wbd_gain = dib8070_wbd_gain_cfg,
1507                 .osc_buffer_state = 0,
1508                 .freq_offset_khz_uhf = -100,
1509                 .freq_offset_khz_vhf = -100,
1510         }, {
1511                 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1512                 .reset = dib80xx_tuner_reset,
1513                 .sleep = dib80xx_tuner_sleep,
1514                 .clock_khz = 12000,
1515                 .clock_pad_drive = 2,
1516                 .vga_filter = 1,
1517                 .force_crystal_mode = 1,
1518                 .enable_third_order_filter = 1,
1519                 .charge_pump = 0,
1520                 .wbd_gain = dib8070_wbd_gain_cfg,
1521                 .osc_buffer_state = 0,
1522                 .freq_offset_khz_uhf = -25,
1523                 .freq_offset_khz_vhf = -25,
1524         }
1525 };
1526
1527 static int dib807x_set_param_override(struct dvb_frontend *fe,
1528                 struct dvb_frontend_parameters *fep)
1529 {
1530         struct dvb_usb_adapter *adap = fe->dvb->priv;
1531         struct dib0700_adapter_state *state = adap->priv;
1532
1533         u16 offset = dib0070_wbd_offset(fe);
1534         u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1535         switch (band) {
1536         case BAND_VHF:
1537                 offset += 750;
1538                 break;
1539         case BAND_UHF:  /* fall-thru wanted */
1540         default:
1541                 offset += 250; break;
1542         }
1543         deb_info("WBD for DiB8000: %d\n", offset);
1544         dib8000_set_wbd_ref(fe, offset);
1545
1546         return state->set_param_save(fe, fep);
1547 }
1548
1549 static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1550 {
1551         struct dib0700_adapter_state *st = adap->priv;
1552         struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe,
1553                         DIBX000_I2C_INTERFACE_TUNER, 1);
1554
1555         if (adap->id == 0) {
1556                 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1557                                 &dib807x_dib0070_config[0]) == NULL)
1558                         return -ENODEV;
1559         } else {
1560                 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1561                                 &dib807x_dib0070_config[1]) == NULL)
1562                         return -ENODEV;
1563         }
1564
1565         st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1566         adap->fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1567         return 0;
1568 }
1569
1570 static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1571 {
1572     return dib8000_pid_filter(adapter->fe, index, pid, onoff);
1573 }
1574
1575 static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1576 {
1577     return dib8000_pid_filter_ctrl(adapter->fe, onoff);
1578 }
1579
1580 /* STK807x */
1581 static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1582 {
1583         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1584         msleep(10);
1585         dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1586         dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1587         dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1588
1589         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1590
1591         dib0700_ctrl_clock(adap->dev, 72, 1);
1592
1593         msleep(10);
1594         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1595         msleep(10);
1596         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1597
1598         dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1599                                 0x80);
1600
1601         adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1602                               &dib807x_dib8000_config[0]);
1603
1604         return adap->fe == NULL ?  -ENODEV : 0;
1605 }
1606
1607 /* STK807xPVR */
1608 static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1609 {
1610         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1611         msleep(30);
1612         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1613         msleep(500);
1614         dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1615         dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1616         dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1617
1618         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1619
1620         dib0700_ctrl_clock(adap->dev, 72, 1);
1621
1622         msleep(10);
1623         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1624         msleep(10);
1625         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1626
1627         /* initialize IC 0 */
1628         dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x80);
1629
1630         adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1631                               &dib807x_dib8000_config[0]);
1632
1633         return adap->fe == NULL ? -ENODEV : 0;
1634 }
1635
1636 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1637 {
1638         /* initialize IC 1 */
1639         dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x82);
1640
1641         adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
1642                               &dib807x_dib8000_config[1]);
1643
1644         return adap->fe == NULL ? -ENODEV : 0;
1645 }
1646
1647 /* STK8096GP */
1648 struct dibx000_agc_config dib8090_agc_config[2] = {
1649     {
1650         BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1651         /* 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,
1652          * 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 */
1653         (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
1654
1655         787,// inv_gain = 1/ 90.4dB // no boost, lower gain due to ramp quantification
1656         10,  // time_stabiliz
1657
1658         0,  // alpha_level
1659         118,  // thlock
1660
1661         0,     // wbd_inv
1662         3530,  // wbd_ref
1663         1,     // wbd_sel
1664         5,     // wbd_alpha
1665
1666         65535,  // agc1_max
1667         0,  // agc1_min
1668
1669         65535,  // agc2_max
1670         0,      // agc2_min
1671
1672         0,      // agc1_pt1
1673         32,     // agc1_pt2
1674         114,    // agc1_pt3  // 40.4dB
1675         143,    // agc1_slope1
1676         144,    // agc1_slope2
1677         114,    // agc2_pt1
1678         227,    // agc2_pt2
1679         116,    // agc2_slope1
1680         117,    // agc2_slope2
1681
1682         28,  // alpha_mant // 5Hz with 90.2dB
1683         26,  // alpha_exp
1684         31,  // beta_mant
1685         51,  // beta_exp
1686
1687         0,  // perform_agc_softsplit
1688     },
1689     {
1690         BAND_CBAND,
1691         /* 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,
1692          * 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 */
1693         (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
1694
1695         787,// inv_gain = 1/ 90.4dB // no boost, lower gain due to ramp quantification
1696         10,  // time_stabiliz
1697
1698         0,  // alpha_level
1699         118,  // thlock
1700
1701         0,     // wbd_inv
1702         3530,  // wbd_ref
1703         1,     // wbd_sel
1704         5,     // wbd_alpha
1705
1706         0,  // agc1_max
1707         0,  // agc1_min
1708
1709         65535,  // agc2_max
1710         0,      // agc2_min
1711
1712         0,      // agc1_pt1
1713         32,     // agc1_pt2
1714         114,    // agc1_pt3  // 40.4dB
1715         143,    // agc1_slope1
1716         144,    // agc1_slope2
1717         114,    // agc2_pt1
1718         227,    // agc2_pt2
1719         116,    // agc2_slope1
1720         117,    // agc2_slope2
1721
1722         28,  // alpha_mant // 5Hz with 90.2dB
1723         26,  // alpha_exp
1724         31,  // beta_mant
1725         51,  // beta_exp
1726
1727         0,  // perform_agc_softsplit
1728     }
1729 };
1730
1731 static struct dibx000_bandwidth_config dib8090_pll_config_12mhz = {
1732     54000, 13500, // internal, sampling
1733     1, 18, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1734     0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1735     (3 << 14) | (1 << 12) | (599 << 0), // sad_cfg: refsel, sel, freq_15k
1736     (0 << 25) | 0, // ifreq = 0 MHz
1737     20199727, // timf
1738     12000000, // xtal_hz
1739 };
1740
1741 static int dib8090_get_adc_power(struct dvb_frontend *fe)
1742 {
1743     return dib8000_get_adc_power(fe, 1);
1744 }
1745
1746 static struct dib8000_config dib809x_dib8000_config = {
1747     .output_mpeg2_in_188_bytes = 1,
1748
1749     .agc_config_count = 2,
1750     .agc = dib8090_agc_config,
1751     .agc_control = dib0090_dcc_freq,
1752     .pll = &dib8090_pll_config_12mhz,
1753     .tuner_is_baseband = 1,
1754
1755     .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1756     .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1757     .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1758
1759     .hostbus_diversity = 1,
1760     .div_cfg = 0x31,
1761     .output_mode = OUTMODE_MPEG2_FIFO,
1762     .drives = 0x2d98,
1763     .diversity_delay = 144,
1764     .refclksel = 3,
1765 };
1766
1767 static struct dib0090_config dib809x_dib0090_config = {
1768     .io.pll_bypass = 1,
1769     .io.pll_range = 1,
1770     .io.pll_prediv = 1,
1771     .io.pll_loopdiv = 20,
1772     .io.adc_clock_ratio = 8,
1773     .io.pll_int_loop_filt = 0,
1774     .io.clock_khz = 12000,
1775     .reset = dib80xx_tuner_reset,
1776     .sleep = dib80xx_tuner_sleep,
1777     .clkouttobamse = 1,
1778     .analog_output = 1,
1779     .i2c_address = DEFAULT_DIB0090_I2C_ADDRESS,
1780     .wbd_vhf_offset = 100,
1781     .wbd_cband_offset = 450,
1782     .use_pwm_agc = 1,
1783     .clkoutdrive = 1,
1784     .get_adc_power = dib8090_get_adc_power,
1785         .freq_offset_khz_uhf = 0,
1786         .freq_offset_khz_vhf = -143,
1787 };
1788
1789 static int dib8096_set_param_override(struct dvb_frontend *fe,
1790                 struct dvb_frontend_parameters *fep)
1791 {
1792     struct dvb_usb_adapter *adap = fe->dvb->priv;
1793     struct dib0700_adapter_state *state = adap->priv;
1794     u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1795     u16 offset;
1796     int ret = 0;
1797     enum frontend_tune_state tune_state = CT_SHUTDOWN;
1798     u16 ltgain, rf_gain_limit;
1799
1800     ret = state->set_param_save(fe, fep);
1801     if (ret < 0)
1802         return ret;
1803
1804     switch (band) {
1805         case BAND_VHF:
1806             offset = 100;
1807             break;
1808         case BAND_UHF:
1809             offset = 550;
1810             break;
1811         default:
1812             offset = 0;
1813             break;
1814     }
1815     offset += (dib0090_get_wbd_offset(fe) * 8 * 18 / 33 + 1) / 2;
1816     dib8000_set_wbd_ref(fe, offset);
1817
1818
1819     if (band == BAND_CBAND)
1820     {
1821         deb_info("tuning in CBAND - soft-AGC startup\n");
1822         /* TODO specific wbd target for dib0090 - needed for startup ? */
1823         dib0090_set_tune_state(fe, CT_AGC_START);
1824         do
1825         {
1826             ret = dib0090_gain_control(fe);
1827             msleep(ret);
1828             tune_state = dib0090_get_tune_state(fe);
1829             if (tune_state == CT_AGC_STEP_0)
1830                 dib8000_set_gpio(fe, 6, 0, 1);
1831             else if (tune_state == CT_AGC_STEP_1)
1832             {
1833                 dib0090_get_current_gain(fe, NULL, NULL, &rf_gain_limit, &ltgain);
1834                 if (rf_gain_limit == 0)
1835                     dib8000_set_gpio(fe, 6, 0, 0);
1836             }
1837         }
1838         while(tune_state<CT_AGC_STOP);
1839         dib0090_pwm_gain_reset(fe);
1840         dib8000_pwm_agc_reset(fe);
1841         dib8000_set_tune_state(fe, CT_DEMOD_START);
1842     }
1843     else {
1844         deb_info("not tuning in CBAND - standard AGC startup\n");
1845         dib0090_pwm_gain_reset(fe);
1846     }
1847
1848     return 0;
1849 }
1850
1851 static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
1852 {
1853     struct dib0700_adapter_state *st = adap->priv;
1854     struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1855
1856     if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1857         return -ENODEV;
1858
1859     st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1860     adap->fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1861     return 0;
1862 }
1863
1864 static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1865 {
1866         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1867         msleep(10);
1868         dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1869         dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1870         dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1871
1872         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1873
1874         dib0700_ctrl_clock(adap->dev, 72, 1);
1875
1876         msleep(10);
1877         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1878         msleep(10);
1879         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1880
1881         dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80);
1882
1883         adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config);
1884
1885         return adap->fe == NULL ?  -ENODEV : 0;
1886 }
1887
1888 /* STK7070PD */
1889 static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
1890         {
1891                 .output_mpeg2_in_188_bytes = 1,
1892
1893                 .agc_config_count = 1,
1894                 .agc = &dib7070_agc_config,
1895                 .bw  = &dib7070_bw_config_12_mhz,
1896                 .tuner_is_baseband = 1,
1897                 .spur_protect = 1,
1898
1899                 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1900                 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1901                 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1902
1903                 .hostbus_diversity = 1,
1904         }, {
1905                 .output_mpeg2_in_188_bytes = 1,
1906
1907                 .agc_config_count = 1,
1908                 .agc = &dib7070_agc_config,
1909                 .bw  = &dib7070_bw_config_12_mhz,
1910                 .tuner_is_baseband = 1,
1911                 .spur_protect = 1,
1912
1913                 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1914                 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1915                 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1916
1917                 .hostbus_diversity = 1,
1918         }
1919 };
1920
1921 static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
1922 {
1923         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1924         msleep(10);
1925         dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1926         dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1927         dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1928         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1929
1930         dib0700_ctrl_clock(adap->dev, 72, 1);
1931
1932         msleep(10);
1933         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1934         msleep(10);
1935         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1936
1937         if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
1938                                      stk7070pd_dib7000p_config) != 0) {
1939                 err("%s: dib7000p_i2c_enumeration failed.  Cannot continue\n",
1940                     __func__);
1941                 return -ENODEV;
1942         }
1943
1944         adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
1945         return adap->fe == NULL ? -ENODEV : 0;
1946 }
1947
1948 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
1949 {
1950         adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
1951         return adap->fe == NULL ? -ENODEV : 0;
1952 }
1953
1954 /* S5H1411 */
1955 static struct s5h1411_config pinnacle_801e_config = {
1956         .output_mode   = S5H1411_PARALLEL_OUTPUT,
1957         .gpio          = S5H1411_GPIO_OFF,
1958         .mpeg_timing   = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
1959         .qam_if        = S5H1411_IF_44000,
1960         .vsb_if        = S5H1411_IF_44000,
1961         .inversion     = S5H1411_INVERSION_OFF,
1962         .status_mode   = S5H1411_DEMODLOCKING
1963 };
1964
1965 /* Pinnacle PCTV HD Pro 801e GPIOs map:
1966    GPIO0  - currently unknown
1967    GPIO1  - xc5000 tuner reset
1968    GPIO2  - CX25843 sleep
1969    GPIO3  - currently unknown
1970    GPIO4  - currently unknown
1971    GPIO6  - currently unknown
1972    GPIO7  - currently unknown
1973    GPIO9  - currently unknown
1974    GPIO10 - CX25843 reset
1975  */
1976 static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
1977 {
1978         struct dib0700_state *st = adap->dev->priv;
1979
1980         /* Make use of the new i2c functions from FW 1.20 */
1981         st->fw_use_new_i2c_api = 1;
1982
1983         /* The s5h1411 requires the dib0700 to not be in master mode */
1984         st->disable_streaming_master_mode = 1;
1985
1986         /* All msleep values taken from Windows USB trace */
1987         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
1988         dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
1989         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1990         msleep(400);
1991         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1992         msleep(60);
1993         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1994         msleep(30);
1995         dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1996         dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1997         dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1998         dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1999         dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
2000         msleep(30);
2001
2002         /* Put the CX25843 to sleep for now since we're in digital mode */
2003         dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
2004
2005         /* GPIOs are initialized, do the attach */
2006         adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
2007                               &adap->dev->i2c_adap);
2008         return adap->fe == NULL ? -ENODEV : 0;
2009 }
2010
2011 static int dib0700_xc5000_tuner_callback(void *priv, int component,
2012                                          int command, int arg)
2013 {
2014         struct dvb_usb_adapter *adap = priv;
2015
2016         if (command == XC5000_TUNER_RESET) {
2017                 /* Reset the tuner */
2018                 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
2019                 msleep(10);
2020                 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
2021                 msleep(10);
2022         } else {
2023                 err("xc5000: unknown tuner callback command: %d\n", command);
2024                 return -EINVAL;
2025         }
2026
2027         return 0;
2028 }
2029
2030 static struct xc5000_config s5h1411_xc5000_tunerconfig = {
2031         .i2c_address      = 0x64,
2032         .if_khz           = 5380,
2033 };
2034
2035 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
2036 {
2037         /* FIXME: generalize & move to common area */
2038         adap->fe->callback = dib0700_xc5000_tuner_callback;
2039
2040         return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
2041                           &s5h1411_xc5000_tunerconfig)
2042                 == NULL ? -ENODEV : 0;
2043 }
2044
2045 static struct lgdt3305_config hcw_lgdt3305_config = {
2046         .i2c_addr           = 0x0e,
2047         .mpeg_mode          = LGDT3305_MPEG_PARALLEL,
2048         .tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
2049         .tpvalid_polarity   = LGDT3305_TP_VALID_LOW,
2050         .deny_i2c_rptr      = 0,
2051         .spectral_inversion = 1,
2052         .qam_if_khz         = 6000,
2053         .vsb_if_khz         = 6000,
2054         .usref_8vsb         = 0x0500,
2055 };
2056
2057 static struct mxl5007t_config hcw_mxl5007t_config = {
2058         .xtal_freq_hz = MxL_XTAL_25_MHZ,
2059         .if_freq_hz = MxL_IF_6_MHZ,
2060         .invert_if = 1,
2061 };
2062
2063 /* TIGER-ATSC map:
2064    GPIO0  - LNA_CTR  (H: LNA power enabled, L: LNA power disabled)
2065    GPIO1  - ANT_SEL  (H: VPA, L: MCX)
2066    GPIO4  - SCL2
2067    GPIO6  - EN_TUNER
2068    GPIO7  - SDA2
2069    GPIO10 - DEM_RST
2070
2071    MXL is behind LG's i2c repeater.  LG is on SCL2/SDA2 gpios on the DIB
2072  */
2073 static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
2074 {
2075         struct dib0700_state *st = adap->dev->priv;
2076
2077         /* Make use of the new i2c functions from FW 1.20 */
2078         st->fw_use_new_i2c_api = 1;
2079
2080         st->disable_streaming_master_mode = 1;
2081
2082         /* fe power enable */
2083         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
2084         msleep(30);
2085         dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2086         msleep(30);
2087
2088         /* demod reset */
2089         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2090         msleep(30);
2091         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2092         msleep(30);
2093         dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2094         msleep(30);
2095
2096         adap->fe = dvb_attach(lgdt3305_attach,
2097                               &hcw_lgdt3305_config,
2098                               &adap->dev->i2c_adap);
2099
2100         return adap->fe == NULL ? -ENODEV : 0;
2101 }
2102
2103 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
2104 {
2105         return dvb_attach(mxl5007t_attach, adap->fe,
2106                           &adap->dev->i2c_adap, 0x60,
2107                           &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
2108 }
2109
2110
2111 /* DVB-USB and USB stuff follows */
2112 struct usb_device_id dib0700_usb_id_table[] = {
2113 /* 0 */ { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P) },
2114         { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700P_PC) },
2115         { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
2116         { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
2117         { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
2118 /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
2119         { USB_DEVICE(USB_VID_COMPRO,    USB_PID_COMPRO_VIDEOMATE_U500) },
2120         { USB_DEVICE(USB_VID_UNIWILL,   USB_PID_UNIWILL_STK7700P) },
2121         { USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
2122         { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
2123 /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
2124         { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV2000E) },
2125         { USB_DEVICE(USB_VID_TERRATEC,
2126                         USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
2127         { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
2128         { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7700D) },
2129 /* 15 */{ USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7070P) },
2130         { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
2131         { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7070PD) },
2132         { USB_DEVICE(USB_VID_PINNACLE,
2133                         USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
2134         { USB_DEVICE(USB_VID_COMPRO,    USB_PID_COMPRO_VIDEOMATE_U500_PC) },
2135 /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
2136         { USB_DEVICE(USB_VID_GIGABYTE,  USB_PID_GIGABYTE_U7000) },
2137         { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
2138         { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3000) },
2139         { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3100) },
2140 /* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
2141         { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
2142         { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
2143         { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_EXPRESSCARD_320CX) },
2144         { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV72E) },
2145 /* 30 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV73E) },
2146         { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_EC372S) },
2147         { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
2148         { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_T_XXS) },
2149         { USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
2150 /* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
2151         { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
2152         { USB_DEVICE(USB_VID_GIGABYTE,  USB_PID_GIGABYTE_U8000) },
2153         { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700PH) },
2154         { USB_DEVICE(USB_VID_ASUS,      USB_PID_ASUS_U3000H) },
2155 /* 40 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV801E) },
2156         { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV801E_SE) },
2157         { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
2158         { USB_DEVICE(USB_VID_TERRATEC,
2159                         USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
2160         { USB_DEVICE(USB_VID_SONY,      USB_PID_SONY_PLAYTV) },
2161 /* 45 */{ USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_PD378S) },
2162         { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
2163         { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
2164         { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_MC770) },
2165         { USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DTT) },
2166 /* 50 */{ USB_DEVICE(USB_VID_ELGATO,    USB_PID_ELGATO_EYETV_DTT_Dlx) },
2167         { USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_H) },
2168         { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_T3) },
2169         { USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_T5) },
2170         { USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700D) },
2171 /* 55 */{ USB_DEVICE(USB_VID_YUAN,      USB_PID_YUAN_STK7700D_2) },
2172         { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV73A) },
2173         { USB_DEVICE(USB_VID_PCTV,      USB_PID_PINNACLE_PCTV73ESE) },
2174         { USB_DEVICE(USB_VID_PCTV,      USB_PID_PINNACLE_PCTV282E) },
2175         { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK7770P) },
2176 /* 60 */{ USB_DEVICE(USB_VID_TERRATEC,  USB_PID_TERRATEC_CINERGY_T_XXS_2) },
2177         { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK807XPVR) },
2178         { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK807XP) },
2179         { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) },
2180         { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
2181 /* 65 */{ USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV73ESE) },
2182         { USB_DEVICE(USB_VID_PINNACLE,  USB_PID_PINNACLE_PCTV282E) },
2183         { USB_DEVICE(USB_VID_DIBCOM,    USB_PID_DIBCOM_STK8096GP) },
2184         { 0 }           /* Terminating entry */
2185 };
2186 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
2187
2188 #define DIB0700_DEFAULT_DEVICE_PROPERTIES \
2189         .caps              = DVB_USB_IS_AN_I2C_ADAPTER, \
2190         .usb_ctrl          = DEVICE_SPECIFIC, \
2191         .firmware          = "dvb-usb-dib0700-1.20.fw", \
2192         .download_firmware = dib0700_download_firmware, \
2193         .no_reconnect      = 1, \
2194         .size_of_priv      = sizeof(struct dib0700_state), \
2195         .i2c_algo          = &dib0700_i2c_algo, \
2196         .identify_state    = dib0700_identify_state
2197
2198 #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
2199         .streaming_ctrl   = dib0700_streaming_ctrl, \
2200         .stream = { \
2201                 .type = USB_BULK, \
2202                 .count = 4, \
2203                 .endpoint = ep, \
2204                 .u = { \
2205                         .bulk = { \
2206                                 .buffersize = 39480, \
2207                         } \
2208                 } \
2209         }
2210
2211 struct dvb_usb_device_properties dib0700_devices[] = {
2212         {
2213                 DIB0700_DEFAULT_DEVICE_PROPERTIES,
2214
2215                 .num_adapters = 1,
2216                 .adapter = {
2217                         {
2218                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2219                                 .pid_filter_count = 32,
2220                                 .pid_filter       = stk70x0p_pid_filter,
2221                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2222                                 .frontend_attach  = stk7700p_frontend_attach,
2223                                 .tuner_attach     = stk7700p_tuner_attach,
2224
2225                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2226                         },
2227                 },
2228
2229                 .num_device_descs = 8,
2230                 .devices = {
2231                         {   "DiBcom STK7700P reference design",
2232                                 { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
2233                                 { NULL },
2234                         },
2235                         {   "Hauppauge Nova-T Stick",
2236                                 { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
2237                                 { NULL },
2238                         },
2239                         {   "AVerMedia AVerTV DVB-T Volar",
2240                                 { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
2241                                 { NULL },
2242                         },
2243                         {   "Compro Videomate U500",
2244                                 { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
2245                                 { NULL },
2246                         },
2247                         {   "Uniwill STK7700P based (Hama and others)",
2248                                 { &dib0700_usb_id_table[7], NULL },
2249                                 { NULL },
2250                         },
2251                         {   "Leadtek Winfast DTV Dongle (STK7700P based)",
2252                                 { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
2253                                 { NULL },
2254                         },
2255                         {   "AVerMedia AVerTV DVB-T Express",
2256                                 { &dib0700_usb_id_table[20] },
2257                                 { NULL },
2258                         },
2259                         {   "Gigabyte U7000",
2260                                 { &dib0700_usb_id_table[21], NULL },
2261                                 { NULL },
2262                         }
2263                 },
2264
2265                 .rc_interval      = DEFAULT_RC_INTERVAL,
2266                 .rc_key_map       = dib0700_rc_keys,
2267                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2268                 .rc_query         = dib0700_rc_query
2269         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2270
2271                 .num_adapters = 2,
2272                 .adapter = {
2273                         {
2274                                 .frontend_attach  = bristol_frontend_attach,
2275                                 .tuner_attach     = bristol_tuner_attach,
2276
2277                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2278                         }, {
2279                                 .frontend_attach  = bristol_frontend_attach,
2280                                 .tuner_attach     = bristol_tuner_attach,
2281
2282                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2283                         }
2284                 },
2285
2286                 .num_device_descs = 1,
2287                 .devices = {
2288                         {   "Hauppauge Nova-T 500 Dual DVB-T",
2289                                 { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
2290                                 { NULL },
2291                         },
2292                 },
2293
2294                 .rc_interval      = DEFAULT_RC_INTERVAL,
2295                 .rc_key_map       = dib0700_rc_keys,
2296                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2297                 .rc_query         = dib0700_rc_query
2298         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2299
2300                 .num_adapters = 2,
2301                 .adapter = {
2302                         {
2303                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2304                                 .pid_filter_count = 32,
2305                                 .pid_filter       = stk70x0p_pid_filter,
2306                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2307                                 .frontend_attach  = stk7700d_frontend_attach,
2308                                 .tuner_attach     = stk7700d_tuner_attach,
2309
2310                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2311                         }, {
2312                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2313                                 .pid_filter_count = 32,
2314                                 .pid_filter       = stk70x0p_pid_filter,
2315                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2316                                 .frontend_attach  = stk7700d_frontend_attach,
2317                                 .tuner_attach     = stk7700d_tuner_attach,
2318
2319                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2320                         }
2321                 },
2322
2323                 .num_device_descs = 5,
2324                 .devices = {
2325                         {   "Pinnacle PCTV 2000e",
2326                                 { &dib0700_usb_id_table[11], NULL },
2327                                 { NULL },
2328                         },
2329                         {   "Terratec Cinergy DT XS Diversity",
2330                                 { &dib0700_usb_id_table[12], NULL },
2331                                 { NULL },
2332                         },
2333                         {   "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
2334                                 { &dib0700_usb_id_table[13], NULL },
2335                                 { NULL },
2336                         },
2337                         {   "DiBcom STK7700D reference design",
2338                                 { &dib0700_usb_id_table[14], NULL },
2339                                 { NULL },
2340                         },
2341                         {   "YUAN High-Tech DiBcom STK7700D",
2342                                 { &dib0700_usb_id_table[55], NULL },
2343                                 { NULL },
2344                         },
2345
2346                 },
2347
2348                 .rc_interval      = DEFAULT_RC_INTERVAL,
2349                 .rc_key_map       = dib0700_rc_keys,
2350                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2351                 .rc_query         = dib0700_rc_query
2352
2353         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2354
2355                 .num_adapters = 1,
2356                 .adapter = {
2357                         {
2358                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2359                                 .pid_filter_count = 32,
2360                                 .pid_filter       = stk70x0p_pid_filter,
2361                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2362                                 .frontend_attach  = stk7700P2_frontend_attach,
2363                                 .tuner_attach     = stk7700d_tuner_attach,
2364
2365                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2366                         },
2367                 },
2368
2369                 .num_device_descs = 3,
2370                 .devices = {
2371                         {   "ASUS My Cinema U3000 Mini DVBT Tuner",
2372                                 { &dib0700_usb_id_table[23], NULL },
2373                                 { NULL },
2374                         },
2375                         {   "Yuan EC372S",
2376                                 { &dib0700_usb_id_table[31], NULL },
2377                                 { NULL },
2378                         },
2379                         {   "Terratec Cinergy T Express",
2380                                 { &dib0700_usb_id_table[42], NULL },
2381                                 { NULL },
2382                         }
2383                 },
2384
2385                 .rc_interval      = DEFAULT_RC_INTERVAL,
2386                 .rc_key_map       = dib0700_rc_keys,
2387                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2388                 .rc_query         = dib0700_rc_query
2389         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2390
2391                 .num_adapters = 1,
2392                 .adapter = {
2393                         {
2394                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2395                                 .pid_filter_count = 32,
2396                                 .pid_filter       = stk70x0p_pid_filter,
2397                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2398                                 .frontend_attach  = stk7070p_frontend_attach,
2399                                 .tuner_attach     = dib7070p_tuner_attach,
2400
2401                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2402
2403                                 .size_of_priv     = sizeof(struct dib0700_adapter_state),
2404                         },
2405                 },
2406
2407                 .num_device_descs = 11,
2408                 .devices = {
2409                         {   "DiBcom STK7070P reference design",
2410                                 { &dib0700_usb_id_table[15], NULL },
2411                                 { NULL },
2412                         },
2413                         {   "Pinnacle PCTV DVB-T Flash Stick",
2414                                 { &dib0700_usb_id_table[16], NULL },
2415                                 { NULL },
2416                         },
2417                         {   "Artec T14BR DVB-T",
2418                                 { &dib0700_usb_id_table[22], NULL },
2419                                 { NULL },
2420                         },
2421                         {   "ASUS My Cinema U3100 Mini DVBT Tuner",
2422                                 { &dib0700_usb_id_table[24], NULL },
2423                                 { NULL },
2424                         },
2425                         {   "Hauppauge Nova-T Stick",
2426                                 { &dib0700_usb_id_table[25], NULL },
2427                                 { NULL },
2428                         },
2429                         {   "Hauppauge Nova-T MyTV.t",
2430                                 { &dib0700_usb_id_table[26], NULL },
2431                                 { NULL },
2432                         },
2433                         {   "Pinnacle PCTV 72e",
2434                                 { &dib0700_usb_id_table[29], NULL },
2435                                 { NULL },
2436                         },
2437                         {   "Pinnacle PCTV 73e",
2438                                 { &dib0700_usb_id_table[30], NULL },
2439                                 { NULL },
2440                         },
2441                         {   "Elgato EyeTV DTT",
2442                                 { &dib0700_usb_id_table[49], NULL },
2443                                 { NULL },
2444                         },
2445                         {   "Yuan PD378S",
2446                                 { &dib0700_usb_id_table[45], NULL },
2447                                 { NULL },
2448                         },
2449                         {   "Elgato EyeTV Dtt Dlx PD378S",
2450                                 { &dib0700_usb_id_table[50], NULL },
2451                                 { NULL },
2452                         },
2453                 },
2454
2455                 .rc_interval      = DEFAULT_RC_INTERVAL,
2456                 .rc_key_map       = dib0700_rc_keys,
2457                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2458                 .rc_query         = dib0700_rc_query
2459
2460         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2461
2462                 .num_adapters = 1,
2463                 .adapter = {
2464                         {
2465                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2466                                 .pid_filter_count = 32,
2467                                 .pid_filter       = stk70x0p_pid_filter,
2468                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2469                                 .frontend_attach  = stk7070p_frontend_attach,
2470                                 .tuner_attach     = dib7070p_tuner_attach,
2471
2472                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2473
2474                                 .size_of_priv     = sizeof(struct dib0700_adapter_state),
2475                         },
2476                 },
2477
2478                 .num_device_descs = 3,
2479                 .devices = {
2480                         {   "Pinnacle PCTV 73A",
2481                                 { &dib0700_usb_id_table[56], NULL },
2482                                 { NULL },
2483                         },
2484                         {   "Pinnacle PCTV 73e SE",
2485                                 { &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL },
2486                                 { NULL },
2487                         },
2488                         {   "Pinnacle PCTV 282e",
2489                                 { &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL },
2490                                 { NULL },
2491                         },
2492                 },
2493
2494                 .rc_interval      = DEFAULT_RC_INTERVAL,
2495                 .rc_key_map       = dib0700_rc_keys,
2496                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2497                 .rc_query         = dib0700_rc_query
2498
2499         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2500
2501                 .num_adapters = 2,
2502                 .adapter = {
2503                         {
2504                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2505                                 .pid_filter_count = 32,
2506                                 .pid_filter       = stk70x0p_pid_filter,
2507                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2508                                 .frontend_attach  = stk7070pd_frontend_attach0,
2509                                 .tuner_attach     = dib7070p_tuner_attach,
2510
2511                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2512
2513                                 .size_of_priv     = sizeof(struct dib0700_adapter_state),
2514                         }, {
2515                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2516                                 .pid_filter_count = 32,
2517                                 .pid_filter       = stk70x0p_pid_filter,
2518                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2519                                 .frontend_attach  = stk7070pd_frontend_attach1,
2520                                 .tuner_attach     = dib7070p_tuner_attach,
2521
2522                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2523
2524                                 .size_of_priv     = sizeof(struct dib0700_adapter_state),
2525                         }
2526                 },
2527
2528                 .num_device_descs = 6,
2529                 .devices = {
2530                         {   "DiBcom STK7070PD reference design",
2531                                 { &dib0700_usb_id_table[17], NULL },
2532                                 { NULL },
2533                         },
2534                         {   "Pinnacle PCTV Dual DVB-T Diversity Stick",
2535                                 { &dib0700_usb_id_table[18], NULL },
2536                                 { NULL },
2537                         },
2538                         {   "Hauppauge Nova-TD Stick (52009)",
2539                                 { &dib0700_usb_id_table[35], NULL },
2540                                 { NULL },
2541                         },
2542                         {   "Hauppauge Nova-TD-500 (84xxx)",
2543                                 { &dib0700_usb_id_table[36], NULL },
2544                                 { NULL },
2545                         },
2546                         {  "Terratec Cinergy DT USB XS Diversity/ T5",
2547                                 { &dib0700_usb_id_table[43],
2548                                         &dib0700_usb_id_table[53], NULL},
2549                                 { NULL },
2550                         },
2551                         {  "Sony PlayTV",
2552                                 { &dib0700_usb_id_table[44], NULL },
2553                                 { NULL },
2554                         }
2555                 },
2556                 .rc_interval      = DEFAULT_RC_INTERVAL,
2557                 .rc_key_map       = dib0700_rc_keys,
2558                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2559                 .rc_query         = dib0700_rc_query
2560         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2561
2562                 .num_adapters = 1,
2563                 .adapter = {
2564                         {
2565                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2566                                 .pid_filter_count = 32,
2567                                 .pid_filter       = stk70x0p_pid_filter,
2568                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2569                                 .frontend_attach  = stk7700ph_frontend_attach,
2570                                 .tuner_attach     = stk7700ph_tuner_attach,
2571
2572                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2573
2574                                 .size_of_priv = sizeof(struct
2575                                                 dib0700_adapter_state),
2576                         },
2577                 },
2578
2579                 .num_device_descs = 9,
2580                 .devices = {
2581                         {   "Terratec Cinergy HT USB XE",
2582                                 { &dib0700_usb_id_table[27], NULL },
2583                                 { NULL },
2584                         },
2585                         {   "Pinnacle Expresscard 320cx",
2586                                 { &dib0700_usb_id_table[28], NULL },
2587                                 { NULL },
2588                         },
2589                         {   "Terratec Cinergy HT Express",
2590                                 { &dib0700_usb_id_table[32], NULL },
2591                                 { NULL },
2592                         },
2593                         {   "Gigabyte U8000-RH",
2594                                 { &dib0700_usb_id_table[37], NULL },
2595                                 { NULL },
2596                         },
2597                         {   "YUAN High-Tech STK7700PH",
2598                                 { &dib0700_usb_id_table[38], NULL },
2599                                 { NULL },
2600                         },
2601                         {   "Asus My Cinema-U3000Hybrid",
2602                                 { &dib0700_usb_id_table[39], NULL },
2603                                 { NULL },
2604                         },
2605                         {   "YUAN High-Tech MC770",
2606                                 { &dib0700_usb_id_table[48], NULL },
2607                                 { NULL },
2608                         },
2609                         {   "Leadtek WinFast DTV Dongle H",
2610                                 { &dib0700_usb_id_table[51], NULL },
2611                                 { NULL },
2612                         },
2613                         {   "YUAN High-Tech STK7700D",
2614                                 { &dib0700_usb_id_table[54], NULL },
2615                                 { NULL },
2616                         },
2617                 },
2618                 .rc_interval      = DEFAULT_RC_INTERVAL,
2619                 .rc_key_map       = dib0700_rc_keys,
2620                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2621                 .rc_query         = dib0700_rc_query
2622         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2623                 .num_adapters = 1,
2624                 .adapter = {
2625                         {
2626                                 .frontend_attach  = s5h1411_frontend_attach,
2627                                 .tuner_attach     = xc5000_tuner_attach,
2628
2629                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2630
2631                                 .size_of_priv = sizeof(struct
2632                                                 dib0700_adapter_state),
2633                         },
2634                 },
2635
2636                 .num_device_descs = 2,
2637                 .devices = {
2638                         {   "Pinnacle PCTV HD Pro USB Stick",
2639                                 { &dib0700_usb_id_table[40], NULL },
2640                                 { NULL },
2641                         },
2642                         {   "Pinnacle PCTV HD USB Stick",
2643                                 { &dib0700_usb_id_table[41], NULL },
2644                                 { NULL },
2645                         },
2646                 },
2647                 .rc_interval      = DEFAULT_RC_INTERVAL,
2648                 .rc_key_map       = dib0700_rc_keys,
2649                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2650                 .rc_query         = dib0700_rc_query
2651         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2652                 .num_adapters = 1,
2653                 .adapter = {
2654                         {
2655                                 .frontend_attach  = lgdt3305_frontend_attach,
2656                                 .tuner_attach     = mxl5007t_tuner_attach,
2657
2658                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2659
2660                                 .size_of_priv = sizeof(struct
2661                                                 dib0700_adapter_state),
2662                         },
2663                 },
2664
2665                 .num_device_descs = 2,
2666                 .devices = {
2667                         {   "Hauppauge ATSC MiniCard (B200)",
2668                                 { &dib0700_usb_id_table[46], NULL },
2669                                 { NULL },
2670                         },
2671                         {   "Hauppauge ATSC MiniCard (B210)",
2672                                 { &dib0700_usb_id_table[47], NULL },
2673                                 { NULL },
2674                         },
2675                 },
2676         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2677
2678                 .num_adapters = 1,
2679                 .adapter = {
2680                         {
2681                                 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2682                                 .pid_filter_count = 32,
2683                                 .pid_filter       = stk70x0p_pid_filter,
2684                                 .pid_filter_ctrl  = stk70x0p_pid_filter_ctrl,
2685                                 .frontend_attach  = stk7070p_frontend_attach,
2686                                 .tuner_attach     = dib7770p_tuner_attach,
2687
2688                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2689
2690                                 .size_of_priv =
2691                                         sizeof(struct dib0700_adapter_state),
2692                         },
2693                 },
2694
2695                 .num_device_descs = 2,
2696                 .devices = {
2697                         {   "DiBcom STK7770P reference design",
2698                                 { &dib0700_usb_id_table[59], NULL },
2699                                 { NULL },
2700                         },
2701                         {   "Terratec Cinergy T USB XXS (HD)/ T3",
2702                                 { &dib0700_usb_id_table[33],
2703                                         &dib0700_usb_id_table[52],
2704                                         &dib0700_usb_id_table[60], NULL},
2705                                 { NULL },
2706                         },
2707                 },
2708                 .rc_interval      = DEFAULT_RC_INTERVAL,
2709                 .rc_key_map       = dib0700_rc_keys,
2710                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2711                 .rc_query         = dib0700_rc_query
2712         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2713                 .num_adapters = 1,
2714                 .adapter = {
2715                         {
2716                                 .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2717                                 .pid_filter_count = 32,
2718                                 .pid_filter = stk80xx_pid_filter,
2719                                 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2720                                 .frontend_attach  = stk807x_frontend_attach,
2721                                 .tuner_attach     = dib807x_tuner_attach,
2722
2723                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2724
2725                                 .size_of_priv =
2726                                         sizeof(struct dib0700_adapter_state),
2727                         },
2728                 },
2729
2730                 .num_device_descs = 3,
2731                 .devices = {
2732                         {   "DiBcom STK807xP reference design",
2733                                 { &dib0700_usb_id_table[62], NULL },
2734                                 { NULL },
2735                         },
2736                         {   "Prolink Pixelview SBTVD",
2737                                 { &dib0700_usb_id_table[63], NULL },
2738                                 { NULL },
2739                         },
2740                         {   "EvolutePC TVWay+",
2741                                 { &dib0700_usb_id_table[64], NULL },
2742                                 { NULL },
2743                         },
2744                 },
2745
2746                 .rc_interval      = DEFAULT_RC_INTERVAL,
2747                 .rc_key_map       = dib0700_rc_keys,
2748                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2749                 .rc_query         = dib0700_rc_query
2750
2751         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2752                 .num_adapters = 2,
2753                 .adapter = {
2754                         {
2755                                 .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2756                                 .pid_filter_count = 32,
2757                                 .pid_filter = stk80xx_pid_filter,
2758                                 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2759                                 .frontend_attach  = stk807xpvr_frontend_attach0,
2760                                 .tuner_attach     = dib807x_tuner_attach,
2761
2762                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2763
2764                                 .size_of_priv =
2765                                         sizeof(struct dib0700_adapter_state),
2766                         },
2767                         {
2768                                 .caps  = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2769                                 .pid_filter_count = 32,
2770                                 .pid_filter = stk80xx_pid_filter,
2771                                 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2772                                 .frontend_attach  = stk807xpvr_frontend_attach1,
2773                                 .tuner_attach     = dib807x_tuner_attach,
2774
2775                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2776
2777                                 .size_of_priv =
2778                                         sizeof(struct dib0700_adapter_state),
2779                         },
2780                 },
2781
2782                 .num_device_descs = 1,
2783                 .devices = {
2784                         {   "DiBcom STK807xPVR reference design",
2785                                 { &dib0700_usb_id_table[61], NULL },
2786                                 { NULL },
2787                         },
2788                 },
2789
2790                 .rc_interval      = DEFAULT_RC_INTERVAL,
2791                 .rc_key_map       = dib0700_rc_keys,
2792                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2793                 .rc_query         = dib0700_rc_query
2794         }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2795                 .num_adapters = 1,
2796                 .adapter = {
2797                         {
2798                                 .caps  = DVB_USB_ADAP_HAS_PID_FILTER |
2799                                         DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2800                                 .pid_filter_count = 32,
2801                                 .pid_filter = stk80xx_pid_filter,
2802                                 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2803                                 .frontend_attach  = stk809x_frontend_attach,
2804                                 .tuner_attach     = dib809x_tuner_attach,
2805
2806                                 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2807
2808                                 .size_of_priv =
2809                                         sizeof(struct dib0700_adapter_state),
2810                         },
2811                 },
2812
2813                 .num_device_descs = 1,
2814                 .devices = {
2815                         {   "DiBcom STK8096GP reference design",
2816                                 { &dib0700_usb_id_table[67], NULL },
2817                                 { NULL },
2818                         },
2819                 },
2820
2821                 .rc_interval      = DEFAULT_RC_INTERVAL,
2822                 .rc_key_map       = dib0700_rc_keys,
2823                 .rc_key_map_size  = ARRAY_SIZE(dib0700_rc_keys),
2824                 .rc_query         = dib0700_rc_query
2825         },
2826 };
2827
2828 int dib0700_device_count = ARRAY_SIZE(dib0700_devices);