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