]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/media/dvb/dvb-usb/dib0700_devices.c
V4L/DVB: rename all *_rc_keys to ir_codes_*_nec_table
[net-next-2.6.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
6a207100 476static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
54d75eba
OD
477{
478 u8 key[4];
479 int i;
480 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
481 struct dib0700_state *st = d->priv;
6a207100 482
54d75eba
OD
483 *event = 0;
484 *state = REMOTE_NO_KEY_PRESSED;
6a207100
DH
485
486 if (st->fw_version >= 0x10200) {
487 /* For 1.20 firmware , We need to keep the RC polling
488 callback so we can reuse the input device setup in
489 dvb-usb-remote.c. However, the actual work is being done
490 in the bulk URB completion handler. */
491 return 0;
492 }
493
54d75eba
OD
494 i=dib0700_ctrl_rd(d,rc_request,2,key,4);
495 if (i<=0) {
034d65ed 496 err("RC Query Failed");
89f4267d 497 return -1;
54d75eba 498 }
58e6f95e
PB
499
500 /* losing half of KEY_0 events from Philipps rc5 remotes.. */
54d75eba 501 if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0;
58e6f95e
PB
502
503 /* 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]); */
504
505 dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */
506
507 switch (dvb_usb_dib0700_ir_proto) {
508 case 0: {
509 /* NEC protocol sends repeat code as 0 0 0 FF */
510 if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
511 (key[3] == 0xFF)) {
512 st->rc_counter++;
513 if (st->rc_counter > RC_REPEAT_DELAY) {
514 *event = d->last_event;
515 *state = REMOTE_KEY_PRESSED;
516 st->rc_counter = RC_REPEAT_DELAY;
517 }
518 return 0;
519 }
54d75eba 520 for (i=0;i<d->props.rc_key_map_size; i++) {
2e365883
MCC
521 if (rc5_custom(&keymap[i]) == key[3-2] &&
522 rc5_data(&keymap[i]) == key[3-3]) {
58e6f95e
PB
523 st->rc_counter = 0;
524 *event = keymap[i].event;
525 *state = REMOTE_KEY_PRESSED;
526 d->last_event = keymap[i].event;
527 return 0;
528 }
529 }
530 break;
531 }
532 default: {
533 /* RC-5 protocol changes toggle bit on new keypress */
534 for (i = 0; i < d->props.rc_key_map_size; i++) {
2e365883
MCC
535 if (rc5_custom(&keymap[i]) == key[3-2] &&
536 rc5_data(&keymap[i]) == key[3-3]) {
58e6f95e
PB
537 if (d->last_event == keymap[i].event &&
538 key[3-1] == st->rc_toggle) {
539 st->rc_counter++;
540 /* prevents unwanted double hits */
541 if (st->rc_counter > RC_REPEAT_DELAY) {
542 *event = d->last_event;
543 *state = REMOTE_KEY_PRESSED;
544 st->rc_counter = RC_REPEAT_DELAY;
545 }
546
547 return 0;
548 }
549 st->rc_counter = 0;
54d75eba
OD
550 *event = keymap[i].event;
551 *state = REMOTE_KEY_PRESSED;
58e6f95e
PB
552 st->rc_toggle = key[3-1];
553 d->last_event = keymap[i].event;
54d75eba
OD
554 return 0;
555 }
556 }
58e6f95e
PB
557 break;
558 }
54d75eba 559 }
58e6f95e
PB
560 err("Unknown remote controller key: %2X %2X %2X %2X", (int) key[3-2], (int) key[3-3], (int) key[3-1], (int) key[3]);
561 d->last_event = 0;
54d75eba
OD
562 return 0;
563}
564
e27e971c 565static struct dvb_usb_rc_key ir_codes_dib0700_table[] = {
54d75eba 566 /* Key codes for the tiny Pinnacle remote*/
2e365883
MCC
567 { 0x0700, KEY_MUTE },
568 { 0x0701, KEY_MENU }, /* Pinnacle logo */
569 { 0x0739, KEY_POWER },
570 { 0x0703, KEY_VOLUMEUP },
571 { 0x0709, KEY_VOLUMEDOWN },
572 { 0x0706, KEY_CHANNELUP },
573 { 0x070c, KEY_CHANNELDOWN },
574 { 0x070f, KEY_1 },
575 { 0x0715, KEY_2 },
576 { 0x0710, KEY_3 },
577 { 0x0718, KEY_4 },
578 { 0x071b, KEY_5 },
579 { 0x071e, KEY_6 },
580 { 0x0711, KEY_7 },
581 { 0x0721, KEY_8 },
582 { 0x0712, KEY_9 },
583 { 0x0727, KEY_0 },
584 { 0x0724, KEY_SCREEN }, /* 'Square' key */
585 { 0x072a, KEY_TEXT }, /* 'T' key */
586 { 0x072d, KEY_REWIND },
587 { 0x0730, KEY_PLAY },
588 { 0x0733, KEY_FASTFORWARD },
589 { 0x0736, KEY_RECORD },
590 { 0x073c, KEY_STOP },
591 { 0x073f, KEY_CANCEL }, /* '?' key */
54d75eba 592 /* Key codes for the Terratec Cinergy DT XS Diversity, similar to cinergyT2.c */
2e365883
MCC
593 { 0xeb01, KEY_POWER },
594 { 0xeb02, KEY_1 },
595 { 0xeb03, KEY_2 },
596 { 0xeb04, KEY_3 },
597 { 0xeb05, KEY_4 },
598 { 0xeb06, KEY_5 },
599 { 0xeb07, KEY_6 },
600 { 0xeb08, KEY_7 },
601 { 0xeb09, KEY_8 },
602 { 0xeb0a, KEY_9 },
603 { 0xeb0b, KEY_VIDEO },
604 { 0xeb0c, KEY_0 },
605 { 0xeb0d, KEY_REFRESH },
606 { 0xeb0f, KEY_EPG },
607 { 0xeb10, KEY_UP },
608 { 0xeb11, KEY_LEFT },
609 { 0xeb12, KEY_OK },
610 { 0xeb13, KEY_RIGHT },
611 { 0xeb14, KEY_DOWN },
612 { 0xeb16, KEY_INFO },
613 { 0xeb17, KEY_RED },
614 { 0xeb18, KEY_GREEN },
615 { 0xeb19, KEY_YELLOW },
616 { 0xeb1a, KEY_BLUE },
617 { 0xeb1b, KEY_CHANNELUP },
618 { 0xeb1c, KEY_VOLUMEUP },
619 { 0xeb1d, KEY_MUTE },
620 { 0xeb1e, KEY_VOLUMEDOWN },
621 { 0xeb1f, KEY_CHANNELDOWN },
622 { 0xeb40, KEY_PAUSE },
623 { 0xeb41, KEY_HOME },
624 { 0xeb42, KEY_MENU }, /* DVD Menu */
625 { 0xeb43, KEY_SUBTITLE },
626 { 0xeb44, KEY_TEXT }, /* Teletext */
627 { 0xeb45, KEY_DELETE },
628 { 0xeb46, KEY_TV },
629 { 0xeb47, KEY_DVD },
630 { 0xeb48, KEY_STOP },
631 { 0xeb49, KEY_VIDEO },
632 { 0xeb4a, KEY_AUDIO }, /* Music */
633 { 0xeb4b, KEY_SCREEN }, /* Pic */
634 { 0xeb4c, KEY_PLAY },
635 { 0xeb4d, KEY_BACK },
636 { 0xeb4e, KEY_REWIND },
637 { 0xeb4f, KEY_FASTFORWARD },
638 { 0xeb54, KEY_PREVIOUS },
639 { 0xeb58, KEY_RECORD },
640 { 0xeb5c, KEY_NEXT },
7161f27f
JG
641
642 /* Key codes for the Haupauge WinTV Nova-TD, copied from nova-t-usb2.c (Nova-T USB2) */
2e365883
MCC
643 { 0x1e00, KEY_0 },
644 { 0x1e01, KEY_1 },
645 { 0x1e02, KEY_2 },
646 { 0x1e03, KEY_3 },
647 { 0x1e04, KEY_4 },
648 { 0x1e05, KEY_5 },
649 { 0x1e06, KEY_6 },
650 { 0x1e07, KEY_7 },
651 { 0x1e08, KEY_8 },
652 { 0x1e09, KEY_9 },
653 { 0x1e0a, KEY_KPASTERISK },
654 { 0x1e0b, KEY_RED },
655 { 0x1e0c, KEY_RADIO },
656 { 0x1e0d, KEY_MENU },
657 { 0x1e0e, KEY_GRAVE }, /* # */
658 { 0x1e0f, KEY_MUTE },
659 { 0x1e10, KEY_VOLUMEUP },
660 { 0x1e11, KEY_VOLUMEDOWN },
661 { 0x1e12, KEY_CHANNEL },
662 { 0x1e14, KEY_UP },
663 { 0x1e15, KEY_DOWN },
664 { 0x1e16, KEY_LEFT },
665 { 0x1e17, KEY_RIGHT },
666 { 0x1e18, KEY_VIDEO },
667 { 0x1e19, KEY_AUDIO },
668 { 0x1e1a, KEY_MEDIA },
669 { 0x1e1b, KEY_EPG },
670 { 0x1e1c, KEY_TV },
671 { 0x1e1e, KEY_NEXT },
672 { 0x1e1f, KEY_BACK },
673 { 0x1e20, KEY_CHANNELUP },
674 { 0x1e21, KEY_CHANNELDOWN },
675 { 0x1e24, KEY_LAST }, /* Skip backwards */
676 { 0x1e25, KEY_OK },
677 { 0x1e29, KEY_BLUE},
678 { 0x1e2e, KEY_GREEN },
679 { 0x1e30, KEY_PAUSE },
680 { 0x1e32, KEY_REWIND },
681 { 0x1e34, KEY_FASTFORWARD },
682 { 0x1e35, KEY_PLAY },
683 { 0x1e36, KEY_STOP },
684 { 0x1e37, KEY_RECORD },
685 { 0x1e38, KEY_YELLOW },
686 { 0x1e3b, KEY_GOTO },
687 { 0x1e3d, KEY_POWER },
48e6a017
JB
688
689 /* Key codes for the Leadtek Winfast DTV Dongle */
2e365883
MCC
690 { 0x0042, KEY_POWER },
691 { 0x077c, KEY_TUNER },
692 { 0x0f4e, KEY_PRINT }, /* PREVIEW */
693 { 0x0840, KEY_SCREEN }, /* full screen toggle*/
694 { 0x0f71, KEY_DOT }, /* frequency */
695 { 0x0743, KEY_0 },
696 { 0x0c41, KEY_1 },
697 { 0x0443, KEY_2 },
698 { 0x0b7f, KEY_3 },
699 { 0x0e41, KEY_4 },
700 { 0x0643, KEY_5 },
701 { 0x097f, KEY_6 },
702 { 0x0d7e, KEY_7 },
703 { 0x057c, KEY_8 },
704 { 0x0a40, KEY_9 },
705 { 0x0e4e, KEY_CLEAR },
706 { 0x047c, KEY_CHANNEL }, /* show channel number */
707 { 0x0f41, KEY_LAST }, /* recall */
708 { 0x0342, KEY_MUTE },
709 { 0x064c, KEY_RESERVED }, /* PIP button*/
710 { 0x0172, KEY_SHUFFLE }, /* SNAPSHOT */
711 { 0x0c4e, KEY_PLAYPAUSE }, /* TIMESHIFT */
712 { 0x0b70, KEY_RECORD },
713 { 0x037d, KEY_VOLUMEUP },
714 { 0x017d, KEY_VOLUMEDOWN },
715 { 0x0242, KEY_CHANNELUP },
716 { 0x007d, KEY_CHANNELDOWN },
48aa7391
CR
717
718 /* Key codes for Nova-TD "credit card" remote control. */
2e365883
MCC
719 { 0x1d00, KEY_0 },
720 { 0x1d01, KEY_1 },
721 { 0x1d02, KEY_2 },
722 { 0x1d03, KEY_3 },
723 { 0x1d04, KEY_4 },
724 { 0x1d05, KEY_5 },
725 { 0x1d06, KEY_6 },
726 { 0x1d07, KEY_7 },
727 { 0x1d08, KEY_8 },
728 { 0x1d09, KEY_9 },
729 { 0x1d0a, KEY_TEXT },
730 { 0x1d0d, KEY_MENU },
731 { 0x1d0f, KEY_MUTE },
732 { 0x1d10, KEY_VOLUMEUP },
733 { 0x1d11, KEY_VOLUMEDOWN },
734 { 0x1d12, KEY_CHANNEL },
735 { 0x1d14, KEY_UP },
736 { 0x1d15, KEY_DOWN },
737 { 0x1d16, KEY_LEFT },
738 { 0x1d17, KEY_RIGHT },
739 { 0x1d1c, KEY_TV },
740 { 0x1d1e, KEY_NEXT },
741 { 0x1d1f, KEY_BACK },
742 { 0x1d20, KEY_CHANNELUP },
743 { 0x1d21, KEY_CHANNELDOWN },
744 { 0x1d24, KEY_LAST },
745 { 0x1d25, KEY_OK },
746 { 0x1d30, KEY_PAUSE },
747 { 0x1d32, KEY_REWIND },
748 { 0x1d34, KEY_FASTFORWARD },
749 { 0x1d35, KEY_PLAY },
750 { 0x1d36, KEY_STOP },
751 { 0x1d37, KEY_RECORD },
752 { 0x1d3b, KEY_GOTO },
753 { 0x1d3d, KEY_POWER },
4c5128b3
MCC
754
755 /* Key codes for the Pixelview SBTVD remote (proto NEC) */
756 { 0x8613, KEY_MUTE },
757 { 0x8612, KEY_POWER },
758 { 0x8601, KEY_1 },
759 { 0x8602, KEY_2 },
760 { 0x8603, KEY_3 },
761 { 0x8604, KEY_4 },
762 { 0x8605, KEY_5 },
763 { 0x8606, KEY_6 },
764 { 0x8607, KEY_7 },
765 { 0x8608, KEY_8 },
766 { 0x8609, KEY_9 },
767 { 0x8600, KEY_0 },
768 { 0x860d, KEY_CHANNELUP },
769 { 0x8619, KEY_CHANNELDOWN },
770 { 0x8610, KEY_VOLUMEUP },
771 { 0x860c, KEY_VOLUMEDOWN },
772
773 { 0x860a, KEY_CAMERA },
774 { 0x860b, KEY_ZOOM },
775 { 0x861b, KEY_BACKSPACE },
776 { 0x8615, KEY_ENTER },
777
778 { 0x861d, KEY_UP },
779 { 0x861e, KEY_DOWN },
780 { 0x860e, KEY_LEFT },
781 { 0x860f, KEY_RIGHT },
782
783 { 0x8618, KEY_RECORD },
784 { 0x861a, KEY_STOP },
c86c82b7
SF
785
786 /* Key codes for the EvolutePC TVWay+ remote (proto NEC) */
787 { 0x7a00, KEY_MENU },
788 { 0x7a01, KEY_RECORD },
789 { 0x7a02, KEY_PLAY },
790 { 0x7a03, KEY_STOP },
791 { 0x7a10, KEY_CHANNELUP },
792 { 0x7a11, KEY_CHANNELDOWN },
793 { 0x7a12, KEY_VOLUMEUP },
794 { 0x7a13, KEY_VOLUMEDOWN },
795 { 0x7a40, KEY_POWER },
796 { 0x7a41, KEY_MUTE },
82f3d559 797};
54d75eba 798
b7f54910 799/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
a75763ff 800static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
9c783036 801 BAND_UHF | BAND_VHF,
69ea31e7
PB
802
803 /* 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,
804 * 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
805 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
806 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
807
808 712,
809 41,
810
811 0,
812 118,
813
814 0,
815 4095,
816 0,
817 0,
818
819 42598,
820 17694,
821 45875,
822 2621,
823 0,
824 76,
825 139,
826 52,
827 59,
828 107,
829 172,
830 57,
831 70,
832
833 21,
834 25,
835 28,
836 48,
837
838 1,
839 { 0,
840 107,
841 51800,
842 24700
69ea31e7
PB
843 },
844};
845
a75763ff
PB
846static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
847 BAND_UHF | BAND_VHF,
848
849 /* 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,
850 * 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
851 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
852 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
a75763ff 853
9c783036
OG
854 712,
855 41,
a75763ff 856
9c783036
OG
857 0,
858 118,
a75763ff 859
9c783036
OG
860 0,
861 4095,
862 0,
863 0,
a75763ff 864
9c783036
OG
865 42598,
866 16384,
867 42598,
868 0,
a75763ff 869
9c783036
OG
870 0,
871 137,
872 255,
a75763ff 873
9c783036
OG
874 0,
875 255,
a75763ff 876
9c783036
OG
877 0,
878 0,
a75763ff 879
9c783036
OG
880 0,
881 41,
a75763ff 882
9c783036
OG
883 15,
884 25,
a75763ff 885
9c783036
OG
886 28,
887 48,
a75763ff 888
9c783036 889 0,
a75763ff
PB
890};
891
892static struct dibx000_bandwidth_config stk7700p_pll_config = {
9c783036
OG
893 60000, 30000,
894 1, 8, 3, 1, 0,
895 0, 0, 1, 1, 0,
896 (3 << 14) | (1 << 12) | (524 << 0),
897 60258167,
898 20452225,
899 30000000,
69ea31e7
PB
900};
901
902static struct dib7000m_config stk7700p_dib7000m_config = {
903 .dvbt_mode = 1,
904 .output_mpeg2_in_188_bytes = 1,
905 .quartz_direct = 1,
906
907 .agc_config_count = 1,
a75763ff
PB
908 .agc = &stk7700p_7000m_mt2060_agc_config,
909 .bw = &stk7700p_pll_config,
910
911 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
912 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
913 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
914};
915
916static struct dib7000p_config stk7700p_dib7000p_config = {
917 .output_mpeg2_in_188_bytes = 1,
918
b6884a17 919 .agc_config_count = 1,
a75763ff
PB
920 .agc = &stk7700p_7000p_mt2060_agc_config,
921 .bw = &stk7700p_pll_config,
69ea31e7
PB
922
923 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
924 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
925 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
b7f54910
PB
926};
927
928static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
929{
69ea31e7 930 struct dib0700_state *st = adap->dev->priv;
b7f54910 931 /* unless there is no real power management in DVB - we leave the device on GPIO6 */
a75763ff
PB
932
933 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
934 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(50);
935
69ea31e7 936 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
a75763ff
PB
937 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
938
b7f54910 939 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
a75763ff
PB
940 dib0700_ctrl_clock(adap->dev, 72, 1);
941 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
942
943 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
b7f54910 944
69ea31e7 945 st->mt2060_if1[0] = 1220;
a75763ff
PB
946
947 if (dib7000pc_detection(&adap->dev->i2c_adap)) {
948 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
949 st->is_dib7000pc = 1;
950 } else
951 adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
952
953 return adap->fe == NULL ? -ENODEV : 0;
b7f54910
PB
954}
955
69ea31e7
PB
956static struct mt2060_config stk7700p_mt2060_config = {
957 0x60
958};
959
b7f54910
PB
960static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
961{
c52344fd 962 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
69ea31e7 963 struct dib0700_state *st = adap->dev->priv;
a75763ff 964 struct i2c_adapter *tun_i2c;
c52344fd
OD
965 s8 a;
966 int if1=1220;
da5ee486
AV
967 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
968 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
c52344fd
OD
969 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
970 }
a75763ff
PB
971 if (st->is_dib7000pc)
972 tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
973 else
974 tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
975
976 return dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk7700p_mt2060_config,
c52344fd 977 if1) == NULL ? -ENODEV : 0;
b7f54910
PB
978}
979
01373a5c
PB
980/* DIB7070 generic */
981static struct dibx000_agc_config dib7070_agc_config = {
982 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
983 /* 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,
984 * 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
985 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
986 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
987
988 600,
989 10,
990
991 0,
992 118,
993
994 0,
995 3530,
996 1,
997 5,
998
999 65535,
1000 0,
1001
1002 65535,
1003 0,
1004
1005 0,
1006 40,
1007 183,
1008 206,
1009 255,
1010 72,
1011 152,
1012 88,
1013 90,
1014
1015 17,
1016 27,
1017 23,
1018 51,
1019
1020 0,
01373a5c
PB
1021};
1022
1023static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
1024{
7e5ce651 1025 deb_info("reset: %d", onoff);
01373a5c
PB
1026 return dib7000p_set_gpio(fe, 8, 0, !onoff);
1027}
1028
1029static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
1030{
7e5ce651 1031 deb_info("sleep: %d", onoff);
01373a5c
PB
1032 return dib7000p_set_gpio(fe, 9, 0, onoff);
1033}
1034
1035static struct dib0070_config dib7070p_dib0070_config[2] = {
1036 {
1037 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1038 .reset = dib7070_tuner_reset,
1039 .sleep = dib7070_tuner_sleep,
1040 .clock_khz = 12000,
7e5ce651
PB
1041 .clock_pad_drive = 4,
1042 .charge_pump = 2,
01373a5c
PB
1043 }, {
1044 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1045 .reset = dib7070_tuner_reset,
1046 .sleep = dib7070_tuner_sleep,
1047 .clock_khz = 12000,
7e5ce651 1048 .charge_pump = 2,
01373a5c
PB
1049 }
1050};
1051
d300bd69
OG
1052static struct dib0070_config dib7770p_dib0070_config = {
1053 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1054 .reset = dib7070_tuner_reset,
1055 .sleep = dib7070_tuner_sleep,
1056 .clock_khz = 12000,
1057 .clock_pad_drive = 0,
1058 .flip_chip = 1,
eac1fe10 1059 .charge_pump = 2,
d300bd69
OG
1060};
1061
01373a5c
PB
1062static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
1063{
1064 struct dvb_usb_adapter *adap = fe->dvb->priv;
1065 struct dib0700_adapter_state *state = adap->priv;
1066
1067 u16 offset;
1068 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1069 switch (band) {
1070 case BAND_VHF: offset = 950; break;
1071 case BAND_UHF:
1072 default: offset = 550; break;
1073 }
1074 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1075 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1076 return state->set_param_save(fe, fep);
1077}
1078
d300bd69
OG
1079static int dib7770_set_param_override(struct dvb_frontend *fe,
1080 struct dvb_frontend_parameters *fep)
1081{
1082 struct dvb_usb_adapter *adap = fe->dvb->priv;
1083 struct dib0700_adapter_state *state = adap->priv;
1084
1085 u16 offset;
1086 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1087 switch (band) {
1088 case BAND_VHF:
1089 dib7000p_set_gpio(fe, 0, 0, 1);
1090 offset = 850;
1091 break;
1092 case BAND_UHF:
1093 default:
1094 dib7000p_set_gpio(fe, 0, 0, 0);
1095 offset = 250;
1096 break;
1097 }
1098 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1099 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1100 return state->set_param_save(fe, fep);
1101}
1102
1103static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
1104{
1105 struct dib0700_adapter_state *st = adap->priv;
1106 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe,
1107 DIBX000_I2C_INTERFACE_TUNER, 1);
1108
1109 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1110 &dib7770p_dib0070_config) == NULL)
1111 return -ENODEV;
1112
1113 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1114 adap->fe->ops.tuner_ops.set_params = dib7770_set_param_override;
1115 return 0;
1116}
1117
01373a5c
PB
1118static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
1119{
1120 struct dib0700_adapter_state *st = adap->priv;
1121 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1122
1123 if (adap->id == 0) {
1124 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
1125 return -ENODEV;
1126 } else {
1127 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
1128 return -ENODEV;
1129 }
1130
1131 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1132 adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1133 return 0;
1134}
1135
f8731f4d
OG
1136static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1137{
1138 return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
1139}
1140
1141static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1142{
1143 return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
1144}
1145
01373a5c 1146static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
9c783036
OG
1147 60000, 15000,
1148 1, 20, 3, 1, 0,
1149 0, 0, 1, 1, 2,
1150 (3 << 14) | (1 << 12) | (524 << 0),
1151 (0 << 25) | 0,
1152 20452225,
1153 12000000,
01373a5c
PB
1154};
1155
1156static struct dib7000p_config dib7070p_dib7000p_config = {
1157 .output_mpeg2_in_188_bytes = 1,
1158
1159 .agc_config_count = 1,
1160 .agc = &dib7070_agc_config,
1161 .bw = &dib7070_bw_config_12_mhz,
3cb2c39d
PB
1162 .tuner_is_baseband = 1,
1163 .spur_protect = 1,
01373a5c
PB
1164
1165 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1166 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1167 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1168
1169 .hostbus_diversity = 1,
1170};
1171
1172/* STK7070P */
1173static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
1174{
da5ee486
AV
1175 struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
1176 if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
1177 p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
1178 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
6ca8f0b9 1179 else
da5ee486 1180 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
01373a5c
PB
1181 msleep(10);
1182 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1183 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1184 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1185 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1186
1187 dib0700_ctrl_clock(adap->dev, 72, 1);
1188
1189 msleep(10);
1190 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1191 msleep(10);
1192 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1193
83c4fdf7
DH
1194 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1195 &dib7070p_dib7000p_config) != 0) {
1196 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1197 __func__);
1198 return -ENODEV;
1199 }
01373a5c 1200
6ca8f0b9
AC
1201 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1202 &dib7070p_dib7000p_config);
01373a5c
PB
1203 return adap->fe == NULL ? -ENODEV : 0;
1204}
1205
ba3fe3a9
PB
1206/* DIB807x generic */
1207static struct dibx000_agc_config dib807x_agc_config[2] = {
1208 {
1209 BAND_VHF,
1210 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1211 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1212 * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
1213 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1214 * P_agc_write=0 */
1215 (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
1216 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1217 (0 << 0), /* setup*/
1218
1219 600, /* inv_gain*/
1220 10, /* time_stabiliz*/
1221
1222 0, /* alpha_level*/
1223 118, /* thlock*/
1224
1225 0, /* wbd_inv*/
1226 3530, /* wbd_ref*/
1227 1, /* wbd_sel*/
1228 5, /* wbd_alpha*/
1229
1230 65535, /* agc1_max*/
1231 0, /* agc1_min*/
1232
1233 65535, /* agc2_max*/
1234 0, /* agc2_min*/
1235
1236 0, /* agc1_pt1*/
1237 40, /* agc1_pt2*/
1238 183, /* agc1_pt3*/
1239 206, /* agc1_slope1*/
1240 255, /* agc1_slope2*/
1241 72, /* agc2_pt1*/
1242 152, /* agc2_pt2*/
1243 88, /* agc2_slope1*/
1244 90, /* agc2_slope2*/
1245
1246 17, /* alpha_mant*/
1247 27, /* alpha_exp*/
1248 23, /* beta_mant*/
1249 51, /* beta_exp*/
1250
1251 0, /* perform_agc_softsplit*/
1252 }, {
1253 BAND_UHF,
1254 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1255 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1256 * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1257 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1258 * P_agc_write=0 */
1259 (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
1260 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1261 (0 << 0), /* setup */
1262
1263 600, /* inv_gain*/
1264 10, /* time_stabiliz*/
1265
1266 0, /* alpha_level*/
1267 118, /* thlock*/
1268
1269 0, /* wbd_inv*/
1270 3530, /* wbd_ref*/
1271 1, /* wbd_sel*/
1272 5, /* wbd_alpha*/
1273
1274 65535, /* agc1_max*/
1275 0, /* agc1_min*/
1276
1277 65535, /* agc2_max*/
1278 0, /* agc2_min*/
1279
1280 0, /* agc1_pt1*/
1281 40, /* agc1_pt2*/
1282 183, /* agc1_pt3*/
1283 206, /* agc1_slope1*/
1284 255, /* agc1_slope2*/
1285 72, /* agc2_pt1*/
1286 152, /* agc2_pt2*/
1287 88, /* agc2_slope1*/
1288 90, /* agc2_slope2*/
1289
1290 17, /* alpha_mant*/
1291 27, /* alpha_exp*/
1292 23, /* beta_mant*/
1293 51, /* beta_exp*/
1294
1295 0, /* perform_agc_softsplit*/
1296 }
1297};
1298
1299static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
1300 60000, 15000, /* internal, sampling*/
1301 1, 20, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass*/
1302 0, 0, 1, 1, 2, /* misc: refdiv, bypclk_div, IO_CLK_en_core,
1303 ADClkSrc, modulo */
1304 (3 << 14) | (1 << 12) | (599 << 0), /* sad_cfg: refsel, sel, freq_15k*/
1305 (0 << 25) | 0, /* ifreq = 0.000000 MHz*/
1306 18179755, /* timf*/
1307 12000000, /* xtal_hz*/
1308};
1309
1310static struct dib8000_config dib807x_dib8000_config[2] = {
1311 {
1312 .output_mpeg2_in_188_bytes = 1,
1313
1314 .agc_config_count = 2,
1315 .agc = dib807x_agc_config,
1316 .pll = &dib807x_bw_config_12_mhz,
1317 .tuner_is_baseband = 1,
1318
1319 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1320 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1321 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1322
1323 .hostbus_diversity = 1,
1324 .div_cfg = 1,
1325 .agc_control = &dib0070_ctrl_agc_filter,
1326 .output_mode = OUTMODE_MPEG2_FIFO,
1327 .drives = 0x2d98,
1328 }, {
1329 .output_mpeg2_in_188_bytes = 1,
1330
1331 .agc_config_count = 2,
1332 .agc = dib807x_agc_config,
1333 .pll = &dib807x_bw_config_12_mhz,
1334 .tuner_is_baseband = 1,
1335
1336 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1337 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1338 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1339
1340 .hostbus_diversity = 1,
1341 .agc_control = &dib0070_ctrl_agc_filter,
1342 .output_mode = OUTMODE_MPEG2_FIFO,
1343 .drives = 0x2d98,
1344 }
1345};
1346
03245a5e 1347static int dib80xx_tuner_reset(struct dvb_frontend *fe, int onoff)
ba3fe3a9
PB
1348{
1349 return dib8000_set_gpio(fe, 5, 0, !onoff);
1350}
1351
03245a5e 1352static int dib80xx_tuner_sleep(struct dvb_frontend *fe, int onoff)
ba3fe3a9
PB
1353{
1354 return dib8000_set_gpio(fe, 0, 0, onoff);
1355}
1356
1357static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1358 { 240, 7},
1359 { 0xffff, 6},
1360};
1361
1362static struct dib0070_config dib807x_dib0070_config[2] = {
1363 {
1364 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
03245a5e
OG
1365 .reset = dib80xx_tuner_reset,
1366 .sleep = dib80xx_tuner_sleep,
ba3fe3a9
PB
1367 .clock_khz = 12000,
1368 .clock_pad_drive = 4,
1369 .vga_filter = 1,
1370 .force_crystal_mode = 1,
1371 .enable_third_order_filter = 1,
1372 .charge_pump = 0,
1373 .wbd_gain = dib8070_wbd_gain_cfg,
1374 .osc_buffer_state = 0,
1375 .freq_offset_khz_uhf = -100,
1376 .freq_offset_khz_vhf = -100,
1377 }, {
1378 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
03245a5e
OG
1379 .reset = dib80xx_tuner_reset,
1380 .sleep = dib80xx_tuner_sleep,
ba3fe3a9
PB
1381 .clock_khz = 12000,
1382 .clock_pad_drive = 2,
1383 .vga_filter = 1,
1384 .force_crystal_mode = 1,
1385 .enable_third_order_filter = 1,
1386 .charge_pump = 0,
1387 .wbd_gain = dib8070_wbd_gain_cfg,
1388 .osc_buffer_state = 0,
1389 .freq_offset_khz_uhf = -25,
1390 .freq_offset_khz_vhf = -25,
1391 }
1392};
1393
1394static int dib807x_set_param_override(struct dvb_frontend *fe,
1395 struct dvb_frontend_parameters *fep)
1396{
1397 struct dvb_usb_adapter *adap = fe->dvb->priv;
1398 struct dib0700_adapter_state *state = adap->priv;
1399
1400 u16 offset = dib0070_wbd_offset(fe);
1401 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1402 switch (band) {
1403 case BAND_VHF:
1404 offset += 750;
1405 break;
1406 case BAND_UHF: /* fall-thru wanted */
1407 default:
1408 offset += 250; break;
1409 }
1410 deb_info("WBD for DiB8000: %d\n", offset);
1411 dib8000_set_wbd_ref(fe, offset);
1412
1413 return state->set_param_save(fe, fep);
1414}
1415
1416static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1417{
1418 struct dib0700_adapter_state *st = adap->priv;
1419 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe,
1420 DIBX000_I2C_INTERFACE_TUNER, 1);
1421
1422 if (adap->id == 0) {
1423 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1424 &dib807x_dib0070_config[0]) == NULL)
1425 return -ENODEV;
1426 } else {
1427 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1428 &dib807x_dib0070_config[1]) == NULL)
1429 return -ENODEV;
1430 }
1431
1432 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1433 adap->fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1434 return 0;
1435}
1436
9c783036
OG
1437static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index,
1438 u16 pid, int onoff)
f8731f4d
OG
1439{
1440 return dib8000_pid_filter(adapter->fe, index, pid, onoff);
1441}
1442
9c783036
OG
1443static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter,
1444 int onoff)
f8731f4d
OG
1445{
1446 return dib8000_pid_filter_ctrl(adapter->fe, onoff);
1447}
ba3fe3a9
PB
1448
1449/* STK807x */
1450static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1451{
1452 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1453 msleep(10);
1454 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1455 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1456 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1457
1458 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1459
1460 dib0700_ctrl_clock(adap->dev, 72, 1);
1461
1462 msleep(10);
1463 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1464 msleep(10);
1465 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1466
1467 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1468 0x80);
1469
1470 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1471 &dib807x_dib8000_config[0]);
1472
1473 return adap->fe == NULL ? -ENODEV : 0;
1474}
1475
1476/* STK807xPVR */
1477static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1478{
1479 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1480 msleep(30);
1481 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1482 msleep(500);
1483 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1484 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1485 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1486
1487 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1488
1489 dib0700_ctrl_clock(adap->dev, 72, 1);
1490
1491 msleep(10);
1492 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1493 msleep(10);
1494 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1495
1496 /* initialize IC 0 */
9542f502 1497 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80);
ba3fe3a9
PB
1498
1499 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1500 &dib807x_dib8000_config[0]);
1501
1502 return adap->fe == NULL ? -ENODEV : 0;
1503}
1504
1505static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1506{
1507 /* initialize IC 1 */
9542f502 1508 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x82);
ba3fe3a9
PB
1509
1510 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
1511 &dib807x_dib8000_config[1]);
1512
1513 return adap->fe == NULL ? -ENODEV : 0;
1514}
1515
03245a5e
OG
1516/* STK8096GP */
1517struct dibx000_agc_config dib8090_agc_config[2] = {
1518 {
1519 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
9c783036
OG
1520 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1521 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1522 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1523 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1524 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1525
1526 787,
1527 10,
1528
1529 0,
1530 118,
1531
1532 0,
1533 3530,
1534 1,
1535 5,
1536
1537 65535,
1538 0,
1539
1540 65535,
1541 0,
1542
1543 0,
1544 32,
1545 114,
1546 143,
1547 144,
1548 114,
1549 227,
1550 116,
1551 117,
1552
1553 28,
1554 26,
1555 31,
1556 51,
1557
1558 0,
03245a5e
OG
1559 },
1560 {
1561 BAND_CBAND,
9c783036
OG
1562 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1563 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1564 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1565 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1566 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1567
1568 787,
1569 10,
1570
1571 0,
1572 118,
1573
1574 0,
1575 3530,
1576 1,
1577 5,
1578
1579 0,
1580 0,
1581
1582 65535,
1583 0,
1584
1585 0,
1586 32,
1587 114,
1588 143,
1589 144,
1590 114,
1591 227,
1592 116,
1593 117,
1594
1595 28,
1596 26,
1597 31,
1598 51,
1599
1600 0,
03245a5e
OG
1601 }
1602};
1603
1604static struct dibx000_bandwidth_config dib8090_pll_config_12mhz = {
9c783036
OG
1605 54000, 13500,
1606 1, 18, 3, 1, 0,
1607 0, 0, 1, 1, 2,
1608 (3 << 14) | (1 << 12) | (599 << 0),
1609 (0 << 25) | 0,
1610 20199727,
1611 12000000,
03245a5e
OG
1612};
1613
1614static int dib8090_get_adc_power(struct dvb_frontend *fe)
1615{
1616 return dib8000_get_adc_power(fe, 1);
1617}
1618
1619static struct dib8000_config dib809x_dib8000_config = {
1620 .output_mpeg2_in_188_bytes = 1,
1621
1622 .agc_config_count = 2,
1623 .agc = dib8090_agc_config,
1624 .agc_control = dib0090_dcc_freq,
1625 .pll = &dib8090_pll_config_12mhz,
1626 .tuner_is_baseband = 1,
1627
1628 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1629 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1630 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1631
1632 .hostbus_diversity = 1,
1633 .div_cfg = 0x31,
1634 .output_mode = OUTMODE_MPEG2_FIFO,
1635 .drives = 0x2d98,
1636 .diversity_delay = 144,
1637 .refclksel = 3,
1638};
1639
1640static struct dib0090_config dib809x_dib0090_config = {
1641 .io.pll_bypass = 1,
1642 .io.pll_range = 1,
1643 .io.pll_prediv = 1,
1644 .io.pll_loopdiv = 20,
1645 .io.adc_clock_ratio = 8,
1646 .io.pll_int_loop_filt = 0,
1647 .io.clock_khz = 12000,
1648 .reset = dib80xx_tuner_reset,
1649 .sleep = dib80xx_tuner_sleep,
1650 .clkouttobamse = 1,
1651 .analog_output = 1,
1652 .i2c_address = DEFAULT_DIB0090_I2C_ADDRESS,
1653 .wbd_vhf_offset = 100,
1654 .wbd_cband_offset = 450,
1655 .use_pwm_agc = 1,
1656 .clkoutdrive = 1,
1657 .get_adc_power = dib8090_get_adc_power,
1658 .freq_offset_khz_uhf = 0,
1659 .freq_offset_khz_vhf = -143,
1660};
1661
1662static int dib8096_set_param_override(struct dvb_frontend *fe,
1663 struct dvb_frontend_parameters *fep)
1664{
1665 struct dvb_usb_adapter *adap = fe->dvb->priv;
1666 struct dib0700_adapter_state *state = adap->priv;
1667 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1668 u16 offset;
1669 int ret = 0;
1670 enum frontend_tune_state tune_state = CT_SHUTDOWN;
1671 u16 ltgain, rf_gain_limit;
1672
1673 ret = state->set_param_save(fe, fep);
1674 if (ret < 0)
1675 return ret;
1676
1677 switch (band) {
9c783036 1678 case BAND_VHF:
03245a5e
OG
1679 offset = 100;
1680 break;
9c783036 1681 case BAND_UHF:
03245a5e
OG
1682 offset = 550;
1683 break;
9c783036 1684 default:
03245a5e
OG
1685 offset = 0;
1686 break;
1687 }
1688 offset += (dib0090_get_wbd_offset(fe) * 8 * 18 / 33 + 1) / 2;
1689 dib8000_set_wbd_ref(fe, offset);
1690
1691
9c783036 1692 if (band == BAND_CBAND) {
03245a5e
OG
1693 deb_info("tuning in CBAND - soft-AGC startup\n");
1694 /* TODO specific wbd target for dib0090 - needed for startup ? */
1695 dib0090_set_tune_state(fe, CT_AGC_START);
9c783036
OG
1696 do {
1697 ret = dib0090_gain_control(fe);
1698 msleep(ret);
1699 tune_state = dib0090_get_tune_state(fe);
1700 if (tune_state == CT_AGC_STEP_0)
1701 dib8000_set_gpio(fe, 6, 0, 1);
1702 else if (tune_state == CT_AGC_STEP_1) {
1703 dib0090_get_current_gain(fe, NULL, NULL, &rf_gain_limit, &ltgain);
1704 if (rf_gain_limit == 0)
1705 dib8000_set_gpio(fe, 6, 0, 0);
1706 }
1707 } while (tune_state < CT_AGC_STOP);
03245a5e
OG
1708 dib0090_pwm_gain_reset(fe);
1709 dib8000_pwm_agc_reset(fe);
1710 dib8000_set_tune_state(fe, CT_DEMOD_START);
9c783036 1711 } else {
03245a5e
OG
1712 deb_info("not tuning in CBAND - standard AGC startup\n");
1713 dib0090_pwm_gain_reset(fe);
1714 }
1715
1716 return 0;
1717}
1718
1719static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
1720{
1721 struct dib0700_adapter_state *st = adap->priv;
1722 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1723
1724 if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1725 return -ENODEV;
1726
1727 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1728 adap->fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1729 return 0;
1730}
1731
1732static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1733{
1734 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1735 msleep(10);
1736 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1737 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1738 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1739
1740 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1741
1742 dib0700_ctrl_clock(adap->dev, 72, 1);
1743
1744 msleep(10);
1745 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1746 msleep(10);
1747 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1748
1749 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80);
1750
1751 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config);
1752
1753 return adap->fe == NULL ? -ENODEV : 0;
1754}
ba3fe3a9 1755
01373a5c
PB
1756/* STK7070PD */
1757static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
1758 {
1759 .output_mpeg2_in_188_bytes = 1,
1760
1761 .agc_config_count = 1,
1762 .agc = &dib7070_agc_config,
1763 .bw = &dib7070_bw_config_12_mhz,
3cb2c39d
PB
1764 .tuner_is_baseband = 1,
1765 .spur_protect = 1,
01373a5c
PB
1766
1767 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1768 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1769 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1770
1771 .hostbus_diversity = 1,
1772 }, {
1773 .output_mpeg2_in_188_bytes = 1,
1774
1775 .agc_config_count = 1,
1776 .agc = &dib7070_agc_config,
1777 .bw = &dib7070_bw_config_12_mhz,
3cb2c39d
PB
1778 .tuner_is_baseband = 1,
1779 .spur_protect = 1,
01373a5c
PB
1780
1781 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1782 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1783 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1784
1785 .hostbus_diversity = 1,
1786 }
1787};
1788
1789static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
1790{
1791 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1792 msleep(10);
1793 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1794 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1795 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1796 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1797
1798 dib0700_ctrl_clock(adap->dev, 72, 1);
1799
1800 msleep(10);
1801 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1802 msleep(10);
1803 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1804
83c4fdf7
DH
1805 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
1806 stk7070pd_dib7000p_config) != 0) {
1807 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1808 __func__);
1809 return -ENODEV;
1810 }
01373a5c
PB
1811
1812 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
1813 return adap->fe == NULL ? -ENODEV : 0;
1814}
1815
1816static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
1817{
1818 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
1819 return adap->fe == NULL ? -ENODEV : 0;
1820}
1821
cb22cb52
DH
1822/* S5H1411 */
1823static struct s5h1411_config pinnacle_801e_config = {
1824 .output_mode = S5H1411_PARALLEL_OUTPUT,
1825 .gpio = S5H1411_GPIO_OFF,
1826 .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
1827 .qam_if = S5H1411_IF_44000,
1828 .vsb_if = S5H1411_IF_44000,
1829 .inversion = S5H1411_INVERSION_OFF,
1830 .status_mode = S5H1411_DEMODLOCKING
1831};
1832
1833/* Pinnacle PCTV HD Pro 801e GPIOs map:
1834 GPIO0 - currently unknown
1835 GPIO1 - xc5000 tuner reset
1836 GPIO2 - CX25843 sleep
1837 GPIO3 - currently unknown
1838 GPIO4 - currently unknown
1839 GPIO6 - currently unknown
1840 GPIO7 - currently unknown
1841 GPIO9 - currently unknown
1842 GPIO10 - CX25843 reset
1843 */
1844static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
1845{
1846 struct dib0700_state *st = adap->dev->priv;
1847
1848 /* Make use of the new i2c functions from FW 1.20 */
1849 st->fw_use_new_i2c_api = 1;
1850
1851 /* The s5h1411 requires the dib0700 to not be in master mode */
1852 st->disable_streaming_master_mode = 1;
1853
1854 /* All msleep values taken from Windows USB trace */
1855 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
1856 dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
1857 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1858 msleep(400);
1859 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1860 msleep(60);
1861 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1862 msleep(30);
1863 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1864 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1865 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1866 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1867 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
1868 msleep(30);
1869
1870 /* Put the CX25843 to sleep for now since we're in digital mode */
1871 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
1872
1873 /* GPIOs are initialized, do the attach */
1874 adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
1875 &adap->dev->i2c_adap);
1876 return adap->fe == NULL ? -ENODEV : 0;
1877}
1878
767f3b3b
MK
1879static int dib0700_xc5000_tuner_callback(void *priv, int component,
1880 int command, int arg)
cb22cb52
DH
1881{
1882 struct dvb_usb_adapter *adap = priv;
1883
79025a9e
DH
1884 if (command == XC5000_TUNER_RESET) {
1885 /* Reset the tuner */
1886 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
f0f4633a 1887 msleep(10);
79025a9e 1888 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
f0f4633a 1889 msleep(10);
79025a9e
DH
1890 } else {
1891 err("xc5000: unknown tuner callback command: %d\n", command);
1892 return -EINVAL;
1893 }
cb22cb52
DH
1894
1895 return 0;
1896}
1897
1898static struct xc5000_config s5h1411_xc5000_tunerconfig = {
1899 .i2c_address = 0x64,
1900 .if_khz = 5380,
cb22cb52
DH
1901};
1902
1903static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
1904{
79025a9e
DH
1905 /* FIXME: generalize & move to common area */
1906 adap->fe->callback = dib0700_xc5000_tuner_callback;
1907
cb22cb52 1908 return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
767f3b3b 1909 &s5h1411_xc5000_tunerconfig)
cb22cb52
DH
1910 == NULL ? -ENODEV : 0;
1911}
1912
ce904bcb
MK
1913static struct lgdt3305_config hcw_lgdt3305_config = {
1914 .i2c_addr = 0x0e,
1915 .mpeg_mode = LGDT3305_MPEG_PARALLEL,
1916 .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
1917 .tpvalid_polarity = LGDT3305_TP_VALID_LOW,
1918 .deny_i2c_rptr = 0,
1919 .spectral_inversion = 1,
1920 .qam_if_khz = 6000,
1921 .vsb_if_khz = 6000,
1922 .usref_8vsb = 0x0500,
1923};
1924
1925static struct mxl5007t_config hcw_mxl5007t_config = {
1926 .xtal_freq_hz = MxL_XTAL_25_MHZ,
1927 .if_freq_hz = MxL_IF_6_MHZ,
1928 .invert_if = 1,
1929};
1930
1931/* TIGER-ATSC map:
1932 GPIO0 - LNA_CTR (H: LNA power enabled, L: LNA power disabled)
1933 GPIO1 - ANT_SEL (H: VPA, L: MCX)
1934 GPIO4 - SCL2
1935 GPIO6 - EN_TUNER
1936 GPIO7 - SDA2
1937 GPIO10 - DEM_RST
1938
1939 MXL is behind LG's i2c repeater. LG is on SCL2/SDA2 gpios on the DIB
1940 */
1941static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
1942{
1943 struct dib0700_state *st = adap->dev->priv;
1944
1945 /* Make use of the new i2c functions from FW 1.20 */
1946 st->fw_use_new_i2c_api = 1;
1947
1948 st->disable_streaming_master_mode = 1;
1949
1950 /* fe power enable */
1951 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1952 msleep(30);
1953 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1954 msleep(30);
1955
1956 /* demod reset */
1957 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1958 msleep(30);
1959 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1960 msleep(30);
1961 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1962 msleep(30);
1963
1964 adap->fe = dvb_attach(lgdt3305_attach,
1965 &hcw_lgdt3305_config,
1966 &adap->dev->i2c_adap);
1967
1968 return adap->fe == NULL ? -ENODEV : 0;
1969}
1970
1971static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
1972{
1973 return dvb_attach(mxl5007t_attach, adap->fe,
1974 &adap->dev->i2c_adap, 0x60,
1975 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
1976}
1977
1978
01373a5c 1979/* DVB-USB and USB stuff follows */
b7f54910 1980struct usb_device_id dib0700_usb_id_table[] = {
01373a5c 1981/* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) },
6ca8f0b9
AC
1982 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
1983 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
1984 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
1985 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
01373a5c 1986/* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
6ca8f0b9
AC
1987 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
1988 { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
1989 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
1990 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
01373a5c 1991/* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
6ca8f0b9
AC
1992 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
1993 { USB_DEVICE(USB_VID_TERRATEC,
1994 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
1995 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
1996 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
01373a5c 1997/* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) },
6ca8f0b9
AC
1998 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
1999 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
2000 { USB_DEVICE(USB_VID_PINNACLE,
2001 USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
2002 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
fa3b877e 2003/* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
6ca8f0b9
AC
2004 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
2005 { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
2006 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
2007 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
2008/* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
2009 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
2010 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
2011 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) },
2012 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) },
2013/* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) },
2014 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) },
2015 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
dc88807e 2016 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) },
5da4e2c6 2017 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
af2a887c 2018/* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
9a0c04a1 2019 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
17a370bc 2020 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U8000) },
8751aaa6 2021 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700PH) },
5769743a 2022 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
cb22cb52 2023/* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
d2fc3bfc 2024 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
bb1b082e 2025 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
db4b2d19
NF
2026 { USB_DEVICE(USB_VID_TERRATEC,
2027 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
0a6e1ed2 2028 { USB_DEVICE(USB_VID_SONY, USB_PID_SONY_PLAYTV) },
9abb6e6f 2029/* 45 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_PD378S) },
ce904bcb
MK
2030 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
2031 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
16ba1ee5 2032 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) },
919a5488 2033 { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) },
513846ec 2034/* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) },
f0f4ae76 2035 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) },
a9b8fe30
PB
2036 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) },
2037 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) },
c53d83cc 2038 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) },
74b76f21
OG
2039/* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) },
2040 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) },
e414753c
PB
2041 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV73ESE) },
2042 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV282E) },
d300bd69 2043 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) },
db48138f 2044/* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
ba3fe3a9
PB
2045 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
2046 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
aaeab30f 2047 { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) },
8a378e85 2048 { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
20232c47 2049/* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
e414753c 2050 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
03245a5e 2051 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK8096GP) },
6ca8f0b9 2052 { 0 } /* Terminating entry */
b7f54910
PB
2053};
2054MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
2055
2056#define DIB0700_DEFAULT_DEVICE_PROPERTIES \
2057 .caps = DVB_USB_IS_AN_I2C_ADAPTER, \
2058 .usb_ctrl = DEVICE_SPECIFIC, \
bdc203e1 2059 .firmware = "dvb-usb-dib0700-1.20.fw", \
b7f54910 2060 .download_firmware = dib0700_download_firmware, \
6958effe 2061 .no_reconnect = 1, \
b7f54910 2062 .size_of_priv = sizeof(struct dib0700_state), \
6958effe
PB
2063 .i2c_algo = &dib0700_i2c_algo, \
2064 .identify_state = dib0700_identify_state
b7f54910
PB
2065
2066#define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
2067 .streaming_ctrl = dib0700_streaming_ctrl, \
2068 .stream = { \
2069 .type = USB_BULK, \
2070 .count = 4, \
2071 .endpoint = ep, \
2072 .u = { \
2073 .bulk = { \
2074 .buffersize = 39480, \
2075 } \
2076 } \
2077 }
2078
2079struct dvb_usb_device_properties dib0700_devices[] = {
2080 {
2081 DIB0700_DEFAULT_DEVICE_PROPERTIES,
2082
2083 .num_adapters = 1,
2084 .adapter = {
2085 {
f8731f4d
OG
2086 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2087 .pid_filter_count = 32,
2088 .pid_filter = stk70x0p_pid_filter,
2089 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
b7f54910
PB
2090 .frontend_attach = stk7700p_frontend_attach,
2091 .tuner_attach = stk7700p_tuner_attach,
2092
2093 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2094 },
2095 },
2096
67053a40 2097 .num_device_descs = 8,
b7f54910
PB
2098 .devices = {
2099 { "DiBcom STK7700P reference design",
49a1376c 2100 { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
b7f54910
PB
2101 { NULL },
2102 },
2103 { "Hauppauge Nova-T Stick",
f9aeba45 2104 { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
b7f54910
PB
2105 { NULL },
2106 },
2107 { "AVerMedia AVerTV DVB-T Volar",
ced8feca 2108 { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
b7f54910
PB
2109 { NULL },
2110 },
49a1376c 2111 { "Compro Videomate U500",
1f8ca4b3 2112 { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
49a1376c 2113 { NULL },
0ce215e1
HS
2114 },
2115 { "Uniwill STK7700P based (Hama and others)",
2116 { &dib0700_usb_id_table[7], NULL },
2117 { NULL },
8637a875
MK
2118 },
2119 { "Leadtek Winfast DTV Dongle (STK7700P based)",
1e13c8f0 2120 { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
8637a875 2121 { NULL },
fa3b877e
JS
2122 },
2123 { "AVerMedia AVerTV DVB-T Express",
2124 { &dib0700_usb_id_table[20] },
2125 { NULL },
67053a40 2126 },
67053a40 2127 { "Gigabyte U7000",
2128 { &dib0700_usb_id_table[21], NULL },
2129 { NULL },
49a1376c 2130 }
b1139e35
DS
2131 },
2132
2133 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2134 .rc_key_map = ir_codes_dib0700_table,
2135 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
b1139e35 2136 .rc_query = dib0700_rc_query
b7f54910
PB
2137 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2138
2139 .num_adapters = 2,
2140 .adapter = {
2141 {
2142 .frontend_attach = bristol_frontend_attach,
2143 .tuner_attach = bristol_tuner_attach,
2144
2145 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2146 }, {
2147 .frontend_attach = bristol_frontend_attach,
2148 .tuner_attach = bristol_tuner_attach,
2149
2150 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2151 }
2152 },
2153
2154 .num_device_descs = 1,
2155 .devices = {
2156 { "Hauppauge Nova-T 500 Dual DVB-T",
49a1376c 2157 { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
b7f54910
PB
2158 { NULL },
2159 },
82f3d559
JG
2160 },
2161
2162 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2163 .rc_key_map = ir_codes_dib0700_table,
2164 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
82f3d559 2165 .rc_query = dib0700_rc_query
54d75eba
OD
2166 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2167
2168 .num_adapters = 2,
2169 .adapter = {
2170 {
f8731f4d
OG
2171 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2172 .pid_filter_count = 32,
2173 .pid_filter = stk70x0p_pid_filter,
2174 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
54d75eba
OD
2175 .frontend_attach = stk7700d_frontend_attach,
2176 .tuner_attach = stk7700d_tuner_attach,
2177
2178 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2179 }, {
f8731f4d
OG
2180 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2181 .pid_filter_count = 32,
2182 .pid_filter = stk70x0p_pid_filter,
2183 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
54d75eba
OD
2184 .frontend_attach = stk7700d_frontend_attach,
2185 .tuner_attach = stk7700d_tuner_attach,
2186
2187 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2188 }
2189 },
2190
200e861c 2191 .num_device_descs = 5,
54d75eba
OD
2192 .devices = {
2193 { "Pinnacle PCTV 2000e",
2194 { &dib0700_usb_id_table[11], NULL },
2195 { NULL },
2196 },
2197 { "Terratec Cinergy DT XS Diversity",
2198 { &dib0700_usb_id_table[12], NULL },
2199 { NULL },
2200 },
faebb914 2201 { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
54d75eba
OD
2202 { &dib0700_usb_id_table[13], NULL },
2203 { NULL },
2204 },
01373a5c 2205 { "DiBcom STK7700D reference design",
b6884a17
PB
2206 { &dib0700_usb_id_table[14], NULL },
2207 { NULL },
bb1b082e 2208 },
200e861c
JW
2209 { "YUAN High-Tech DiBcom STK7700D",
2210 { &dib0700_usb_id_table[55], NULL },
2211 { NULL },
2212 },
bb1b082e 2213
54d75eba 2214 },
82f3d559 2215
54d75eba 2216 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2217 .rc_key_map = ir_codes_dib0700_table,
2218 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
82f3d559 2219 .rc_query = dib0700_rc_query
01373a5c 2220
132c3188
DG
2221 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2222
2223 .num_adapters = 1,
2224 .adapter = {
2225 {
f8731f4d
OG
2226 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2227 .pid_filter_count = 32,
2228 .pid_filter = stk70x0p_pid_filter,
2229 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
132c3188
DG
2230 .frontend_attach = stk7700P2_frontend_attach,
2231 .tuner_attach = stk7700d_tuner_attach,
2232
2233 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2234 },
2235 },
2236
bb1b082e 2237 .num_device_descs = 3,
132c3188
DG
2238 .devices = {
2239 { "ASUS My Cinema U3000 Mini DVBT Tuner",
2240 { &dib0700_usb_id_table[23], NULL },
2241 { NULL },
2242 },
6ca8f0b9
AC
2243 { "Yuan EC372S",
2244 { &dib0700_usb_id_table[31], NULL },
2245 { NULL },
bb1b082e
YA
2246 },
2247 { "Terratec Cinergy T Express",
2248 { &dib0700_usb_id_table[42], NULL },
2249 { NULL },
6ca8f0b9 2250 }
48aa7391
CR
2251 },
2252
2253 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2254 .rc_key_map = ir_codes_dib0700_table,
2255 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
48aa7391 2256 .rc_query = dib0700_rc_query
01373a5c
PB
2257 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2258
2259 .num_adapters = 1,
2260 .adapter = {
2261 {
f8731f4d
OG
2262 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2263 .pid_filter_count = 32,
2264 .pid_filter = stk70x0p_pid_filter,
2265 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
01373a5c
PB
2266 .frontend_attach = stk7070p_frontend_attach,
2267 .tuner_attach = dib7070p_tuner_attach,
2268
2269 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2270
2271 .size_of_priv = sizeof(struct dib0700_adapter_state),
2272 },
2273 },
2274
1e13c8f0 2275 .num_device_descs = 11,
01373a5c
PB
2276 .devices = {
2277 { "DiBcom STK7070P reference design",
2278 { &dib0700_usb_id_table[15], NULL },
2279 { NULL },
2280 },
2281 { "Pinnacle PCTV DVB-T Flash Stick",
2282 { &dib0700_usb_id_table[16], NULL },
2283 { NULL },
2284 },
7999a816
YL
2285 { "Artec T14BR DVB-T",
2286 { &dib0700_usb_id_table[22], NULL },
2287 { NULL },
132c3188
DG
2288 },
2289 { "ASUS My Cinema U3100 Mini DVBT Tuner",
2290 { &dib0700_usb_id_table[24], NULL },
2291 { NULL },
2292 },
c7637b1a
TT
2293 { "Hauppauge Nova-T Stick",
2294 { &dib0700_usb_id_table[25], NULL },
2295 { NULL },
2296 },
13b83b5d
DS
2297 { "Hauppauge Nova-T MyTV.t",
2298 { &dib0700_usb_id_table[26], NULL },
2299 { NULL },
2300 },
6ca8f0b9
AC
2301 { "Pinnacle PCTV 72e",
2302 { &dib0700_usb_id_table[29], NULL },
2303 { NULL },
2304 },
2305 { "Pinnacle PCTV 73e",
2306 { &dib0700_usb_id_table[30], NULL },
2307 { NULL },
2308 },
919a5488
KF
2309 { "Elgato EyeTV DTT",
2310 { &dib0700_usb_id_table[49], NULL },
2311 { NULL },
2312 },
9abb6e6f
PT
2313 { "Yuan PD378S",
2314 { &dib0700_usb_id_table[45], NULL },
2315 { NULL },
2316 },
513846ec
AS
2317 { "Elgato EyeTV Dtt Dlx PD378S",
2318 { &dib0700_usb_id_table[50], NULL },
2319 { NULL },
2320 },
c7637b1a
TT
2321 },
2322
2323 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2324 .rc_key_map = ir_codes_dib0700_table,
2325 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
c7637b1a 2326 .rc_query = dib0700_rc_query
74b76f21
OG
2327
2328 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2329
2330 .num_adapters = 1,
2331 .adapter = {
2332 {
648732fc
MCC
2333 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2334 .pid_filter_count = 32,
2335 .pid_filter = stk70x0p_pid_filter,
2336 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
74b76f21
OG
2337 .frontend_attach = stk7070p_frontend_attach,
2338 .tuner_attach = dib7070p_tuner_attach,
2339
2340 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2341
2342 .size_of_priv = sizeof(struct dib0700_adapter_state),
2343 },
2344 },
2345
20232c47 2346 .num_device_descs = 3,
74b76f21
OG
2347 .devices = {
2348 { "Pinnacle PCTV 73A",
2349 { &dib0700_usb_id_table[56], NULL },
2350 { NULL },
2351 },
2352 { "Pinnacle PCTV 73e SE",
20232c47 2353 { &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL },
74b76f21
OG
2354 { NULL },
2355 },
2356 { "Pinnacle PCTV 282e",
20232c47 2357 { &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL },
74b76f21
OG
2358 { NULL },
2359 },
2360 },
2361
2362 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2363 .rc_key_map = ir_codes_dib0700_table,
2364 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
74b76f21 2365 .rc_query = dib0700_rc_query
c7637b1a 2366
01373a5c
PB
2367 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2368
2369 .num_adapters = 2,
2370 .adapter = {
2371 {
f8731f4d
OG
2372 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2373 .pid_filter_count = 32,
2374 .pid_filter = stk70x0p_pid_filter,
2375 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
01373a5c
PB
2376 .frontend_attach = stk7070pd_frontend_attach0,
2377 .tuner_attach = dib7070p_tuner_attach,
2378
2379 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2380
2381 .size_of_priv = sizeof(struct dib0700_adapter_state),
2382 }, {
f8731f4d
OG
2383 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2384 .pid_filter_count = 32,
2385 .pid_filter = stk70x0p_pid_filter,
2386 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
01373a5c
PB
2387 .frontend_attach = stk7070pd_frontend_attach1,
2388 .tuner_attach = dib7070p_tuner_attach,
2389
2390 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2391
2392 .size_of_priv = sizeof(struct dib0700_adapter_state),
2393 }
2394 },
2395
0a6e1ed2 2396 .num_device_descs = 6,
01373a5c
PB
2397 .devices = {
2398 { "DiBcom STK7070PD reference design",
2399 { &dib0700_usb_id_table[17], NULL },
2400 { NULL },
2401 },
2402 { "Pinnacle PCTV Dual DVB-T Diversity Stick",
2403 { &dib0700_usb_id_table[18], NULL },
2404 { NULL },
d01eb2dc
MK
2405 },
2406 { "Hauppauge Nova-TD Stick (52009)",
2407 { &dib0700_usb_id_table[35], NULL },
2408 { NULL },
9a0c04a1
MK
2409 },
2410 { "Hauppauge Nova-TD-500 (84xxx)",
2411 { &dib0700_usb_id_table[36], NULL },
2412 { NULL },
db4b2d19 2413 },
a9b8fe30
PB
2414 { "Terratec Cinergy DT USB XS Diversity/ T5",
2415 { &dib0700_usb_id_table[43],
2416 &dib0700_usb_id_table[53], NULL},
db4b2d19 2417 { NULL },
0a6e1ed2 2418 },
2419 { "Sony PlayTV",
2420 { &dib0700_usb_id_table[44], NULL },
2421 { NULL },
67053a40 2422 }
c985a8dc
AL
2423 },
2424 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2425 .rc_key_map = ir_codes_dib0700_table,
2426 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
c985a8dc 2427 .rc_query = dib0700_rc_query
6ca8f0b9
AC
2428 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2429
2430 .num_adapters = 1,
2431 .adapter = {
2432 {
f8731f4d
OG
2433 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2434 .pid_filter_count = 32,
2435 .pid_filter = stk70x0p_pid_filter,
2436 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
6ca8f0b9
AC
2437 .frontend_attach = stk7700ph_frontend_attach,
2438 .tuner_attach = stk7700ph_tuner_attach,
2439
2440 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2441
2442 .size_of_priv = sizeof(struct
2443 dib0700_adapter_state),
2444 },
2445 },
2446
c53d83cc 2447 .num_device_descs = 9,
6ca8f0b9
AC
2448 .devices = {
2449 { "Terratec Cinergy HT USB XE",
2450 { &dib0700_usb_id_table[27], NULL },
2451 { NULL },
2452 },
2453 { "Pinnacle Expresscard 320cx",
2454 { &dib0700_usb_id_table[28], NULL },
2455 { NULL },
2456 },
2457 { "Terratec Cinergy HT Express",
2458 { &dib0700_usb_id_table[32], NULL },
2459 { NULL },
2460 },
17a370bc
FT
2461 { "Gigabyte U8000-RH",
2462 { &dib0700_usb_id_table[37], NULL },
2463 { NULL },
2464 },
8751aaa6
DON
2465 { "YUAN High-Tech STK7700PH",
2466 { &dib0700_usb_id_table[38], NULL },
2467 { NULL },
2468 },
5769743a
AC
2469 { "Asus My Cinema-U3000Hybrid",
2470 { &dib0700_usb_id_table[39], NULL },
2471 { NULL },
2472 },
16ba1ee5
XL
2473 { "YUAN High-Tech MC770",
2474 { &dib0700_usb_id_table[48], NULL },
2475 { NULL },
2476 },
f0f4ae76 2477 { "Leadtek WinFast DTV Dongle H",
2478 { &dib0700_usb_id_table[51], NULL },
2479 { NULL },
2480 },
c53d83cc
PH
2481 { "YUAN High-Tech STK7700D",
2482 { &dib0700_usb_id_table[54], NULL },
2483 { NULL },
2484 },
6ca8f0b9
AC
2485 },
2486 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2487 .rc_key_map = ir_codes_dib0700_table,
2488 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
6ca8f0b9 2489 .rc_query = dib0700_rc_query
cb22cb52
DH
2490 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2491 .num_adapters = 1,
2492 .adapter = {
2493 {
2494 .frontend_attach = s5h1411_frontend_attach,
2495 .tuner_attach = xc5000_tuner_attach,
2496
2497 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2498
2499 .size_of_priv = sizeof(struct
2500 dib0700_adapter_state),
2501 },
2502 },
2503
d2fc3bfc 2504 .num_device_descs = 2,
cb22cb52
DH
2505 .devices = {
2506 { "Pinnacle PCTV HD Pro USB Stick",
2507 { &dib0700_usb_id_table[40], NULL },
2508 { NULL },
2509 },
d2fc3bfc
DH
2510 { "Pinnacle PCTV HD USB Stick",
2511 { &dib0700_usb_id_table[41], NULL },
2512 { NULL },
2513 },
cb22cb52
DH
2514 },
2515 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2516 .rc_key_map = ir_codes_dib0700_table,
2517 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
cb22cb52 2518 .rc_query = dib0700_rc_query
ce904bcb
MK
2519 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2520 .num_adapters = 1,
2521 .adapter = {
2522 {
2523 .frontend_attach = lgdt3305_frontend_attach,
2524 .tuner_attach = mxl5007t_tuner_attach,
2525
2526 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2527
2528 .size_of_priv = sizeof(struct
2529 dib0700_adapter_state),
2530 },
2531 },
2532
2533 .num_device_descs = 2,
2534 .devices = {
2535 { "Hauppauge ATSC MiniCard (B200)",
2536 { &dib0700_usb_id_table[46], NULL },
2537 { NULL },
2538 },
2539 { "Hauppauge ATSC MiniCard (B210)",
2540 { &dib0700_usb_id_table[47], NULL },
2541 { NULL },
2542 },
2543 },
d300bd69
OG
2544 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2545
2546 .num_adapters = 1,
2547 .adapter = {
2548 {
f8731f4d
OG
2549 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2550 .pid_filter_count = 32,
2551 .pid_filter = stk70x0p_pid_filter,
2552 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
d300bd69
OG
2553 .frontend_attach = stk7070p_frontend_attach,
2554 .tuner_attach = dib7770p_tuner_attach,
2555
2556 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2557
2558 .size_of_priv =
db48138f 2559 sizeof(struct dib0700_adapter_state),
d300bd69
OG
2560 },
2561 },
2562
db48138f 2563 .num_device_descs = 2,
d300bd69
OG
2564 .devices = {
2565 { "DiBcom STK7770P reference design",
2566 { &dib0700_usb_id_table[59], NULL },
2567 { NULL },
2568 },
1e13c8f0
PB
2569 { "Terratec Cinergy T USB XXS (HD)/ T3",
2570 { &dib0700_usb_id_table[33],
2571 &dib0700_usb_id_table[52],
2572 &dib0700_usb_id_table[60], NULL},
db48138f
PB
2573 { NULL },
2574 },
d300bd69 2575 },
ba3fe3a9 2576 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2577 .rc_key_map = ir_codes_dib0700_table,
2578 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
ba3fe3a9
PB
2579 .rc_query = dib0700_rc_query
2580 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2581 .num_adapters = 1,
2582 .adapter = {
2583 {
f8731f4d
OG
2584 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2585 .pid_filter_count = 32,
03245a5e
OG
2586 .pid_filter = stk80xx_pid_filter,
2587 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
ba3fe3a9
PB
2588 .frontend_attach = stk807x_frontend_attach,
2589 .tuner_attach = dib807x_tuner_attach,
2590
2591 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2592
2593 .size_of_priv =
2594 sizeof(struct dib0700_adapter_state),
2595 },
2596 },
2597
8a378e85 2598 .num_device_descs = 3,
ba3fe3a9
PB
2599 .devices = {
2600 { "DiBcom STK807xP reference design",
2601 { &dib0700_usb_id_table[62], NULL },
2602 { NULL },
2603 },
aaeab30f
MCC
2604 { "Prolink Pixelview SBTVD",
2605 { &dib0700_usb_id_table[63], NULL },
2606 { NULL },
2607 },
8a378e85
F
2608 { "EvolutePC TVWay+",
2609 { &dib0700_usb_id_table[64], NULL },
2610 { NULL },
2611 },
ba3fe3a9
PB
2612 },
2613
2614 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2615 .rc_key_map = ir_codes_dib0700_table,
2616 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
ba3fe3a9
PB
2617 .rc_query = dib0700_rc_query
2618
2619 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2620 .num_adapters = 2,
2621 .adapter = {
2622 {
f8731f4d
OG
2623 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2624 .pid_filter_count = 32,
03245a5e
OG
2625 .pid_filter = stk80xx_pid_filter,
2626 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
ba3fe3a9
PB
2627 .frontend_attach = stk807xpvr_frontend_attach0,
2628 .tuner_attach = dib807x_tuner_attach,
2629
2630 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2631
2632 .size_of_priv =
2633 sizeof(struct dib0700_adapter_state),
2634 },
2635 {
f8731f4d
OG
2636 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2637 .pid_filter_count = 32,
03245a5e
OG
2638 .pid_filter = stk80xx_pid_filter,
2639 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
ba3fe3a9
PB
2640 .frontend_attach = stk807xpvr_frontend_attach1,
2641 .tuner_attach = dib807x_tuner_attach,
2642
2643 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2644
2645 .size_of_priv =
2646 sizeof(struct dib0700_adapter_state),
2647 },
2648 },
2649
2650 .num_device_descs = 1,
2651 .devices = {
2652 { "DiBcom STK807xPVR reference design",
2653 { &dib0700_usb_id_table[61], NULL },
2654 { NULL },
2655 },
2656 },
2657
03245a5e 2658 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2659 .rc_key_map = ir_codes_dib0700_table,
2660 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
03245a5e
OG
2661 .rc_query = dib0700_rc_query
2662 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2663 .num_adapters = 1,
2664 .adapter = {
2665 {
2666 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
2667 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2668 .pid_filter_count = 32,
2669 .pid_filter = stk80xx_pid_filter,
2670 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2671 .frontend_attach = stk809x_frontend_attach,
2672 .tuner_attach = dib809x_tuner_attach,
2673
2674 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2675
2676 .size_of_priv =
2677 sizeof(struct dib0700_adapter_state),
2678 },
2679 },
2680
2681 .num_device_descs = 1,
2682 .devices = {
2683 { "DiBcom STK8096GP reference design",
2684 { &dib0700_usb_id_table[67], NULL },
2685 { NULL },
2686 },
2687 },
2688
d300bd69 2689 .rc_interval = DEFAULT_RC_INTERVAL,
e27e971c
MCC
2690 .rc_key_map = ir_codes_dib0700_table,
2691 .rc_key_map_size = ARRAY_SIZE(ir_codes_dib0700_table),
d300bd69 2692 .rc_query = dib0700_rc_query
01373a5c 2693 },
b7f54910
PB
2694};
2695
2696int dib0700_device_count = ARRAY_SIZE(dib0700_devices);