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