cfq-iosched: fix use-after-free of cfqq
[deliverable/linux.git] / drivers / media / dvb / dvb-usb / dib0700_devices.c
1 /* Linux driver for devices based on the DiBcom DiB0700 USB bridge
2 *
3 * This program is free software; you can redistribute it and/or modify it
4 * under the terms of the GNU General Public License as published by the Free
5 * Software Foundation, version 2.
6 *
7 * Copyright (C) 2005-9 DiBcom, SA et al
8 */
9 #include "dib0700.h"
10
11 #include "dib3000mc.h"
12 #include "dib7000m.h"
13 #include "dib7000p.h"
14 #include "dib8000.h"
15 #include "dib9000.h"
16 #include "mt2060.h"
17 #include "mt2266.h"
18 #include "tuner-xc2028.h"
19 #include "xc5000.h"
20 #include "xc4000.h"
21 #include "s5h1411.h"
22 #include "dib0070.h"
23 #include "dib0090.h"
24 #include "lgdt3305.h"
25 #include "mxl5007t.h"
26
27 static int force_lna_activation;
28 module_param(force_lna_activation, int, 0644);
29 MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifyer(s) (LNA), "
30 "if applicable for the device (default: 0=automatic/off).");
31
32 struct dib0700_adapter_state {
33 int (*set_param_save) (struct dvb_frontend *, struct dvb_frontend_parameters *);
34 const struct firmware *frontend_firmware;
35 };
36
37 /* Hauppauge Nova-T 500 (aka Bristol)
38 * has a LNA on GPIO0 which is enabled by setting 1 */
39 static struct mt2060_config bristol_mt2060_config[2] = {
40 {
41 .i2c_address = 0x60,
42 .clock_out = 3,
43 }, {
44 .i2c_address = 0x61,
45 }
46 };
47
48
49 static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
50 .band_caps = BAND_VHF | BAND_UHF,
51 .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
52
53 .agc1_max = 42598,
54 .agc1_min = 17694,
55 .agc2_max = 45875,
56 .agc2_min = 0,
57
58 .agc1_pt1 = 0,
59 .agc1_pt2 = 59,
60
61 .agc1_slope1 = 0,
62 .agc1_slope2 = 69,
63
64 .agc2_pt1 = 0,
65 .agc2_pt2 = 59,
66
67 .agc2_slope1 = 111,
68 .agc2_slope2 = 28,
69 };
70
71 static struct dib3000mc_config bristol_dib3000mc_config[2] = {
72 { .agc = &bristol_dib3000p_mt2060_agc_config,
73 .max_time = 0x196,
74 .ln_adc_level = 0x1cc7,
75 .output_mpeg2_in_188_bytes = 1,
76 },
77 { .agc = &bristol_dib3000p_mt2060_agc_config,
78 .max_time = 0x196,
79 .ln_adc_level = 0x1cc7,
80 .output_mpeg2_in_188_bytes = 1,
81 }
82 };
83
84 static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
85 {
86 struct dib0700_state *st = adap->dev->priv;
87 if (adap->id == 0) {
88 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
89 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
90 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
91 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
92
93 if (force_lna_activation)
94 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
95 else
96 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
97
98 if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {
99 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
100 return -ENODEV;
101 }
102 }
103 st->mt2060_if1[adap->id] = 1220;
104 return (adap->fe_adap[0].fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
105 (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
106 }
107
108 static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
109 {
110 struct i2c_msg msg[2] = {
111 { .addr = 0x50, .flags = 0, .buf = &adrs, .len = 1 },
112 { .addr = 0x50, .flags = I2C_M_RD, .buf = pval, .len = 1 },
113 };
114 if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO;
115 return 0;
116 }
117
118 static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
119 {
120 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
121 struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe_adap[0].fe, 1);
122 s8 a;
123 int if1=1220;
124 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
125 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
126 if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
127 }
128 return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c,
129 &bristol_mt2060_config[adap->id], if1) == NULL ?
130 -ENODEV : 0;
131 }
132
133 /* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity */
134
135 /* MT226x */
136 static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
137 {
138 BAND_UHF,
139
140 /* 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,
141 * 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 */
142 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8)
143 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
144
145 1130,
146 21,
147
148 0,
149 118,
150
151 0,
152 3530,
153 1,
154 0,
155
156 65535,
157 33770,
158 65535,
159 23592,
160
161 0,
162 62,
163 255,
164 64,
165 64,
166 132,
167 192,
168 80,
169 80,
170
171 17,
172 27,
173 23,
174 51,
175
176 1,
177 }, {
178 BAND_VHF | BAND_LBAND,
179
180 /* 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,
181 * 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 */
182 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8)
183 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
184
185 2372,
186 21,
187
188 0,
189 118,
190
191 0,
192 3530,
193 1,
194 0,
195
196 65535,
197 0,
198 65535,
199 23592,
200
201 0,
202 128,
203 128,
204 128,
205 0,
206 128,
207 253,
208 81,
209 0,
210
211 17,
212 27,
213 23,
214 51,
215
216 1,
217 }
218 };
219
220 static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
221 60000, 30000,
222 1, 8, 3, 1, 0,
223 0, 0, 1, 1, 2,
224 (3 << 14) | (1 << 12) | (524 << 0),
225 0,
226 20452225,
227 };
228
229 static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
230 { .output_mpeg2_in_188_bytes = 1,
231 .hostbus_diversity = 1,
232 .tuner_is_baseband = 1,
233
234 .agc_config_count = 2,
235 .agc = stk7700d_7000p_mt2266_agc_config,
236 .bw = &stk7700d_mt2266_pll_config,
237
238 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
239 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
240 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
241 },
242 { .output_mpeg2_in_188_bytes = 1,
243 .hostbus_diversity = 1,
244 .tuner_is_baseband = 1,
245
246 .agc_config_count = 2,
247 .agc = stk7700d_7000p_mt2266_agc_config,
248 .bw = &stk7700d_mt2266_pll_config,
249
250 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
251 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
252 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
253 }
254 };
255
256 static struct mt2266_config stk7700d_mt2266_config[2] = {
257 { .i2c_address = 0x60
258 },
259 { .i2c_address = 0x60
260 }
261 };
262
263 static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
264 {
265 if (adap->id == 0) {
266 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
267 msleep(10);
268 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
269 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
270 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
271 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
272 msleep(10);
273 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
274 msleep(10);
275 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
276 stk7700d_dib7000p_mt2266_config)
277 != 0) {
278 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
279 return -ENODEV;
280 }
281 }
282
283 adap->fe_adap[0].fe =
284 dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,
285 0x80 + (adap->id << 1),
286 &stk7700d_dib7000p_mt2266_config[adap->id]);
287
288 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
289 }
290
291 static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
292 {
293 if (adap->id == 0) {
294 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
295 msleep(10);
296 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
297 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
298 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
299 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
300 msleep(10);
301 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
302 msleep(10);
303 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
304 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
305 stk7700d_dib7000p_mt2266_config)
306 != 0) {
307 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
308 return -ENODEV;
309 }
310 }
311
312 adap->fe_adap[0].fe =
313 dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,
314 0x80 + (adap->id << 1),
315 &stk7700d_dib7000p_mt2266_config[adap->id]);
316
317 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
318 }
319
320 static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
321 {
322 struct i2c_adapter *tun_i2c;
323 tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
324 return dvb_attach(mt2266_attach, adap->fe_adap[0].fe, tun_i2c,
325 &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
326 }
327
328 /* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
329 static struct dibx000_agc_config xc3028_agc_config = {
330 BAND_VHF | BAND_UHF, /* band_caps */
331
332 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
333 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
334 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
335 (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
336 (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
337
338 712, /* inv_gain */
339 21, /* time_stabiliz */
340
341 0, /* alpha_level */
342 118, /* thlock */
343
344 0, /* wbd_inv */
345 2867, /* wbd_ref */
346 0, /* wbd_sel */
347 2, /* wbd_alpha */
348
349 0, /* agc1_max */
350 0, /* agc1_min */
351 39718, /* agc2_max */
352 9930, /* agc2_min */
353 0, /* agc1_pt1 */
354 0, /* agc1_pt2 */
355 0, /* agc1_pt3 */
356 0, /* agc1_slope1 */
357 0, /* agc1_slope2 */
358 0, /* agc2_pt1 */
359 128, /* agc2_pt2 */
360 29, /* agc2_slope1 */
361 29, /* agc2_slope2 */
362
363 17, /* alpha_mant */
364 27, /* alpha_exp */
365 23, /* beta_mant */
366 51, /* beta_exp */
367
368 1, /* perform_agc_softsplit */
369 };
370
371 /* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
372 static struct dibx000_bandwidth_config xc3028_bw_config = {
373 60000, 30000, /* internal, sampling */
374 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */
375 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc,
376 modulo */
377 (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
378 (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
379 20452225, /* timf */
380 30000000, /* xtal_hz */
381 };
382
383 static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
384 .output_mpeg2_in_188_bytes = 1,
385 .tuner_is_baseband = 1,
386
387 .agc_config_count = 1,
388 .agc = &xc3028_agc_config,
389 .bw = &xc3028_bw_config,
390
391 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
392 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
393 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
394 };
395
396 static int stk7700ph_xc3028_callback(void *ptr, int component,
397 int command, int arg)
398 {
399 struct dvb_usb_adapter *adap = ptr;
400
401 switch (command) {
402 case XC2028_TUNER_RESET:
403 /* Send the tuner in then out of reset */
404 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 0); msleep(10);
405 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
406 break;
407 case XC2028_RESET_CLK:
408 break;
409 default:
410 err("%s: unknown command %d, arg %d\n", __func__,
411 command, arg);
412 return -EINVAL;
413 }
414 return 0;
415 }
416
417 static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
418 .fname = XC2028_DEFAULT_FIRMWARE,
419 .max_len = 64,
420 .demod = XC3028_FE_DIBCOM52,
421 };
422
423 static struct xc2028_config stk7700ph_xc3028_config = {
424 .i2c_addr = 0x61,
425 .ctrl = &stk7700ph_xc3028_ctrl,
426 };
427
428 static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
429 {
430 struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
431
432 if (desc->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
433 desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
434 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
435 else
436 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
437 msleep(20);
438 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
439 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
440 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
441 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
442 msleep(10);
443 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
444 msleep(20);
445 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
446 msleep(10);
447
448 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
449 &stk7700ph_dib7700_xc3028_config) != 0) {
450 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
451 __func__);
452 return -ENODEV;
453 }
454
455 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
456 &stk7700ph_dib7700_xc3028_config);
457
458 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
459 }
460
461 static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
462 {
463 struct i2c_adapter *tun_i2c;
464
465 tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe,
466 DIBX000_I2C_INTERFACE_TUNER, 1);
467
468 stk7700ph_xc3028_config.i2c_adap = tun_i2c;
469
470 /* FIXME: generalize & move to common area */
471 adap->fe_adap[0].fe->callback = stk7700ph_xc3028_callback;
472
473 return dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &stk7700ph_xc3028_config)
474 == NULL ? -ENODEV : 0;
475 }
476
477 #define DEFAULT_RC_INTERVAL 50
478
479 static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
480
481 /* Number of keypresses to ignore before start repeating */
482 #define RC_REPEAT_DELAY 6
483
484 /*
485 * This function is used only when firmware is < 1.20 version. Newer
486 * firmwares use bulk mode, with functions implemented at dib0700_core,
487 * at dib0700_rc_urb_completion()
488 */
489 static int dib0700_rc_query_old_firmware(struct dvb_usb_device *d)
490 {
491 u8 key[4];
492 u32 keycode;
493 u8 toggle;
494 int i;
495 struct dib0700_state *st = d->priv;
496
497 if (st->fw_version >= 0x10200) {
498 /* For 1.20 firmware , We need to keep the RC polling
499 callback so we can reuse the input device setup in
500 dvb-usb-remote.c. However, the actual work is being done
501 in the bulk URB completion handler. */
502 return 0;
503 }
504
505 i = dib0700_ctrl_rd(d, rc_request, 2, key, 4);
506 if (i <= 0) {
507 err("RC Query Failed");
508 return -1;
509 }
510
511 /* losing half of KEY_0 events from Philipps rc5 remotes.. */
512 if (key[0] == 0 && key[1] == 0 && key[2] == 0 && key[3] == 0)
513 return 0;
514
515 /* 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]); */
516
517 dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */
518
519 d->last_event = 0;
520 switch (d->props.rc.core.protocol) {
521 case RC_TYPE_NEC:
522 /* NEC protocol sends repeat code as 0 0 0 FF */
523 if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
524 (key[3] == 0xff))
525 keycode = d->last_event;
526 else {
527 keycode = key[3-2] << 8 | key[3-3];
528 d->last_event = keycode;
529 }
530
531 rc_keydown(d->rc_dev, keycode, 0);
532 break;
533 default:
534 /* RC-5 protocol changes toggle bit on new keypress */
535 keycode = key[3-2] << 8 | key[3-3];
536 toggle = key[3-1];
537 rc_keydown(d->rc_dev, keycode, toggle);
538
539 break;
540 }
541 return 0;
542 }
543
544 /* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
545 static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
546 BAND_UHF | BAND_VHF,
547
548 /* 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,
549 * 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 */
550 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
551 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
552
553 712,
554 41,
555
556 0,
557 118,
558
559 0,
560 4095,
561 0,
562 0,
563
564 42598,
565 17694,
566 45875,
567 2621,
568 0,
569 76,
570 139,
571 52,
572 59,
573 107,
574 172,
575 57,
576 70,
577
578 21,
579 25,
580 28,
581 48,
582
583 1,
584 { 0,
585 107,
586 51800,
587 24700
588 },
589 };
590
591 static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
592 BAND_UHF | BAND_VHF,
593
594 /* 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,
595 * 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 */
596 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
597 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
598
599 712,
600 41,
601
602 0,
603 118,
604
605 0,
606 4095,
607 0,
608 0,
609
610 42598,
611 16384,
612 42598,
613 0,
614
615 0,
616 137,
617 255,
618
619 0,
620 255,
621
622 0,
623 0,
624
625 0,
626 41,
627
628 15,
629 25,
630
631 28,
632 48,
633
634 0,
635 };
636
637 static struct dibx000_bandwidth_config stk7700p_pll_config = {
638 60000, 30000,
639 1, 8, 3, 1, 0,
640 0, 0, 1, 1, 0,
641 (3 << 14) | (1 << 12) | (524 << 0),
642 60258167,
643 20452225,
644 30000000,
645 };
646
647 static struct dib7000m_config stk7700p_dib7000m_config = {
648 .dvbt_mode = 1,
649 .output_mpeg2_in_188_bytes = 1,
650 .quartz_direct = 1,
651
652 .agc_config_count = 1,
653 .agc = &stk7700p_7000m_mt2060_agc_config,
654 .bw = &stk7700p_pll_config,
655
656 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
657 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
658 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
659 };
660
661 static struct dib7000p_config stk7700p_dib7000p_config = {
662 .output_mpeg2_in_188_bytes = 1,
663
664 .agc_config_count = 1,
665 .agc = &stk7700p_7000p_mt2060_agc_config,
666 .bw = &stk7700p_pll_config,
667
668 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
669 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
670 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
671 };
672
673 static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
674 {
675 struct dib0700_state *st = adap->dev->priv;
676 /* unless there is no real power management in DVB - we leave the device on GPIO6 */
677
678 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
679 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(50);
680
681 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
682 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
683
684 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
685 dib0700_ctrl_clock(adap->dev, 72, 1);
686 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
687
688 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
689
690 st->mt2060_if1[0] = 1220;
691
692 if (dib7000pc_detection(&adap->dev->i2c_adap)) {
693 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
694 st->is_dib7000pc = 1;
695 } else
696 adap->fe_adap[0].fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
697
698 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
699 }
700
701 static struct mt2060_config stk7700p_mt2060_config = {
702 0x60
703 };
704
705 static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
706 {
707 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
708 struct dib0700_state *st = adap->dev->priv;
709 struct i2c_adapter *tun_i2c;
710 s8 a;
711 int if1=1220;
712 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
713 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
714 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
715 }
716 if (st->is_dib7000pc)
717 tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
718 else
719 tun_i2c = dib7000m_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
720
721 return dvb_attach(mt2060_attach, adap->fe_adap[0].fe, tun_i2c, &stk7700p_mt2060_config,
722 if1) == NULL ? -ENODEV : 0;
723 }
724
725 /* DIB7070 generic */
726 static struct dibx000_agc_config dib7070_agc_config = {
727 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
728 /* 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,
729 * 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 */
730 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
731 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
732
733 600,
734 10,
735
736 0,
737 118,
738
739 0,
740 3530,
741 1,
742 5,
743
744 65535,
745 0,
746
747 65535,
748 0,
749
750 0,
751 40,
752 183,
753 206,
754 255,
755 72,
756 152,
757 88,
758 90,
759
760 17,
761 27,
762 23,
763 51,
764
765 0,
766 };
767
768 static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
769 {
770 deb_info("reset: %d", onoff);
771 return dib7000p_set_gpio(fe, 8, 0, !onoff);
772 }
773
774 static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
775 {
776 deb_info("sleep: %d", onoff);
777 return dib7000p_set_gpio(fe, 9, 0, onoff);
778 }
779
780 static struct dib0070_config dib7070p_dib0070_config[2] = {
781 {
782 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
783 .reset = dib7070_tuner_reset,
784 .sleep = dib7070_tuner_sleep,
785 .clock_khz = 12000,
786 .clock_pad_drive = 4,
787 .charge_pump = 2,
788 }, {
789 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
790 .reset = dib7070_tuner_reset,
791 .sleep = dib7070_tuner_sleep,
792 .clock_khz = 12000,
793 .charge_pump = 2,
794 }
795 };
796
797 static struct dib0070_config dib7770p_dib0070_config = {
798 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
799 .reset = dib7070_tuner_reset,
800 .sleep = dib7070_tuner_sleep,
801 .clock_khz = 12000,
802 .clock_pad_drive = 0,
803 .flip_chip = 1,
804 .charge_pump = 2,
805 };
806
807 static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
808 {
809 struct dvb_usb_adapter *adap = fe->dvb->priv;
810 struct dib0700_adapter_state *state = adap->priv;
811
812 u16 offset;
813 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
814 switch (band) {
815 case BAND_VHF: offset = 950; break;
816 case BAND_UHF:
817 default: offset = 550; break;
818 }
819 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
820 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
821 return state->set_param_save(fe, fep);
822 }
823
824 static int dib7770_set_param_override(struct dvb_frontend *fe,
825 struct dvb_frontend_parameters *fep)
826 {
827 struct dvb_usb_adapter *adap = fe->dvb->priv;
828 struct dib0700_adapter_state *state = adap->priv;
829
830 u16 offset;
831 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
832 switch (band) {
833 case BAND_VHF:
834 dib7000p_set_gpio(fe, 0, 0, 1);
835 offset = 850;
836 break;
837 case BAND_UHF:
838 default:
839 dib7000p_set_gpio(fe, 0, 0, 0);
840 offset = 250;
841 break;
842 }
843 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
844 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
845 return state->set_param_save(fe, fep);
846 }
847
848 static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
849 {
850 struct dib0700_adapter_state *st = adap->priv;
851 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe,
852 DIBX000_I2C_INTERFACE_TUNER, 1);
853
854 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
855 &dib7770p_dib0070_config) == NULL)
856 return -ENODEV;
857
858 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
859 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7770_set_param_override;
860 return 0;
861 }
862
863 static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
864 {
865 struct dib0700_adapter_state *st = adap->priv;
866 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
867
868 if (adap->id == 0) {
869 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
870 return -ENODEV;
871 } else {
872 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
873 return -ENODEV;
874 }
875
876 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
877 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
878 return 0;
879 }
880
881 static int stk7700p_pid_filter(struct dvb_usb_adapter *adapter, int index,
882 u16 pid, int onoff)
883 {
884 struct dib0700_state *st = adapter->dev->priv;
885 if (st->is_dib7000pc)
886 return dib7000p_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
887 return dib7000m_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
888 }
889
890 static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
891 {
892 struct dib0700_state *st = adapter->dev->priv;
893 if (st->is_dib7000pc)
894 return dib7000p_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
895 return dib7000m_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
896 }
897
898 static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
899 {
900 return dib7000p_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
901 }
902
903 static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
904 {
905 return dib7000p_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
906 }
907
908 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
909 60000, 15000,
910 1, 20, 3, 1, 0,
911 0, 0, 1, 1, 2,
912 (3 << 14) | (1 << 12) | (524 << 0),
913 (0 << 25) | 0,
914 20452225,
915 12000000,
916 };
917
918 static struct dib7000p_config dib7070p_dib7000p_config = {
919 .output_mpeg2_in_188_bytes = 1,
920
921 .agc_config_count = 1,
922 .agc = &dib7070_agc_config,
923 .bw = &dib7070_bw_config_12_mhz,
924 .tuner_is_baseband = 1,
925 .spur_protect = 1,
926
927 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
928 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
929 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
930
931 .hostbus_diversity = 1,
932 };
933
934 /* STK7070P */
935 static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
936 {
937 struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
938 if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
939 p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
940 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
941 else
942 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
943 msleep(10);
944 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
945 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
946 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
947 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
948
949 dib0700_ctrl_clock(adap->dev, 72, 1);
950
951 msleep(10);
952 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
953 msleep(10);
954 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
955
956 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
957 &dib7070p_dib7000p_config) != 0) {
958 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
959 __func__);
960 return -ENODEV;
961 }
962
963 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
964 &dib7070p_dib7000p_config);
965 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
966 }
967
968 /* STK7770P */
969 static struct dib7000p_config dib7770p_dib7000p_config = {
970 .output_mpeg2_in_188_bytes = 1,
971
972 .agc_config_count = 1,
973 .agc = &dib7070_agc_config,
974 .bw = &dib7070_bw_config_12_mhz,
975 .tuner_is_baseband = 1,
976 .spur_protect = 1,
977
978 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
979 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
980 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
981
982 .hostbus_diversity = 1,
983 .enable_current_mirror = 1,
984 .disable_sample_and_hold = 0,
985 };
986
987 static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap)
988 {
989 struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
990 if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
991 p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
992 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
993 else
994 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
995 msleep(10);
996 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
997 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
998 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
999 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1000
1001 dib0700_ctrl_clock(adap->dev, 72, 1);
1002
1003 msleep(10);
1004 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1005 msleep(10);
1006 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1007
1008 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1009 &dib7770p_dib7000p_config) != 0) {
1010 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1011 __func__);
1012 return -ENODEV;
1013 }
1014
1015 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1016 &dib7770p_dib7000p_config);
1017 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1018 }
1019
1020 /* DIB807x generic */
1021 static struct dibx000_agc_config dib807x_agc_config[2] = {
1022 {
1023 BAND_VHF,
1024 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1025 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1026 * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
1027 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1028 * P_agc_write=0 */
1029 (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
1030 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1031 (0 << 0), /* setup*/
1032
1033 600, /* inv_gain*/
1034 10, /* time_stabiliz*/
1035
1036 0, /* alpha_level*/
1037 118, /* thlock*/
1038
1039 0, /* wbd_inv*/
1040 3530, /* wbd_ref*/
1041 1, /* wbd_sel*/
1042 5, /* wbd_alpha*/
1043
1044 65535, /* agc1_max*/
1045 0, /* agc1_min*/
1046
1047 65535, /* agc2_max*/
1048 0, /* agc2_min*/
1049
1050 0, /* agc1_pt1*/
1051 40, /* agc1_pt2*/
1052 183, /* agc1_pt3*/
1053 206, /* agc1_slope1*/
1054 255, /* agc1_slope2*/
1055 72, /* agc2_pt1*/
1056 152, /* agc2_pt2*/
1057 88, /* agc2_slope1*/
1058 90, /* agc2_slope2*/
1059
1060 17, /* alpha_mant*/
1061 27, /* alpha_exp*/
1062 23, /* beta_mant*/
1063 51, /* beta_exp*/
1064
1065 0, /* perform_agc_softsplit*/
1066 }, {
1067 BAND_UHF,
1068 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1069 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1070 * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1071 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1072 * P_agc_write=0 */
1073 (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
1074 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1075 (0 << 0), /* setup */
1076
1077 600, /* inv_gain*/
1078 10, /* time_stabiliz*/
1079
1080 0, /* alpha_level*/
1081 118, /* thlock*/
1082
1083 0, /* wbd_inv*/
1084 3530, /* wbd_ref*/
1085 1, /* wbd_sel*/
1086 5, /* wbd_alpha*/
1087
1088 65535, /* agc1_max*/
1089 0, /* agc1_min*/
1090
1091 65535, /* agc2_max*/
1092 0, /* agc2_min*/
1093
1094 0, /* agc1_pt1*/
1095 40, /* agc1_pt2*/
1096 183, /* agc1_pt3*/
1097 206, /* agc1_slope1*/
1098 255, /* agc1_slope2*/
1099 72, /* agc2_pt1*/
1100 152, /* agc2_pt2*/
1101 88, /* agc2_slope1*/
1102 90, /* agc2_slope2*/
1103
1104 17, /* alpha_mant*/
1105 27, /* alpha_exp*/
1106 23, /* beta_mant*/
1107 51, /* beta_exp*/
1108
1109 0, /* perform_agc_softsplit*/
1110 }
1111 };
1112
1113 static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
1114 60000, 15000, /* internal, sampling*/
1115 1, 20, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass*/
1116 0, 0, 1, 1, 2, /* misc: refdiv, bypclk_div, IO_CLK_en_core,
1117 ADClkSrc, modulo */
1118 (3 << 14) | (1 << 12) | (599 << 0), /* sad_cfg: refsel, sel, freq_15k*/
1119 (0 << 25) | 0, /* ifreq = 0.000000 MHz*/
1120 18179755, /* timf*/
1121 12000000, /* xtal_hz*/
1122 };
1123
1124 static struct dib8000_config dib807x_dib8000_config[2] = {
1125 {
1126 .output_mpeg2_in_188_bytes = 1,
1127
1128 .agc_config_count = 2,
1129 .agc = dib807x_agc_config,
1130 .pll = &dib807x_bw_config_12_mhz,
1131 .tuner_is_baseband = 1,
1132
1133 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1134 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1135 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1136
1137 .hostbus_diversity = 1,
1138 .div_cfg = 1,
1139 .agc_control = &dib0070_ctrl_agc_filter,
1140 .output_mode = OUTMODE_MPEG2_FIFO,
1141 .drives = 0x2d98,
1142 }, {
1143 .output_mpeg2_in_188_bytes = 1,
1144
1145 .agc_config_count = 2,
1146 .agc = dib807x_agc_config,
1147 .pll = &dib807x_bw_config_12_mhz,
1148 .tuner_is_baseband = 1,
1149
1150 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1151 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1152 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1153
1154 .hostbus_diversity = 1,
1155 .agc_control = &dib0070_ctrl_agc_filter,
1156 .output_mode = OUTMODE_MPEG2_FIFO,
1157 .drives = 0x2d98,
1158 }
1159 };
1160
1161 static int dib80xx_tuner_reset(struct dvb_frontend *fe, int onoff)
1162 {
1163 return dib8000_set_gpio(fe, 5, 0, !onoff);
1164 }
1165
1166 static int dib80xx_tuner_sleep(struct dvb_frontend *fe, int onoff)
1167 {
1168 return dib8000_set_gpio(fe, 0, 0, onoff);
1169 }
1170
1171 static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1172 { 240, 7},
1173 { 0xffff, 6},
1174 };
1175
1176 static struct dib0070_config dib807x_dib0070_config[2] = {
1177 {
1178 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1179 .reset = dib80xx_tuner_reset,
1180 .sleep = dib80xx_tuner_sleep,
1181 .clock_khz = 12000,
1182 .clock_pad_drive = 4,
1183 .vga_filter = 1,
1184 .force_crystal_mode = 1,
1185 .enable_third_order_filter = 1,
1186 .charge_pump = 0,
1187 .wbd_gain = dib8070_wbd_gain_cfg,
1188 .osc_buffer_state = 0,
1189 .freq_offset_khz_uhf = -100,
1190 .freq_offset_khz_vhf = -100,
1191 }, {
1192 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1193 .reset = dib80xx_tuner_reset,
1194 .sleep = dib80xx_tuner_sleep,
1195 .clock_khz = 12000,
1196 .clock_pad_drive = 2,
1197 .vga_filter = 1,
1198 .force_crystal_mode = 1,
1199 .enable_third_order_filter = 1,
1200 .charge_pump = 0,
1201 .wbd_gain = dib8070_wbd_gain_cfg,
1202 .osc_buffer_state = 0,
1203 .freq_offset_khz_uhf = -25,
1204 .freq_offset_khz_vhf = -25,
1205 }
1206 };
1207
1208 static int dib807x_set_param_override(struct dvb_frontend *fe,
1209 struct dvb_frontend_parameters *fep)
1210 {
1211 struct dvb_usb_adapter *adap = fe->dvb->priv;
1212 struct dib0700_adapter_state *state = adap->priv;
1213
1214 u16 offset = dib0070_wbd_offset(fe);
1215 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1216 switch (band) {
1217 case BAND_VHF:
1218 offset += 750;
1219 break;
1220 case BAND_UHF: /* fall-thru wanted */
1221 default:
1222 offset += 250; break;
1223 }
1224 deb_info("WBD for DiB8000: %d\n", offset);
1225 dib8000_set_wbd_ref(fe, offset);
1226
1227 return state->set_param_save(fe, fep);
1228 }
1229
1230 static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1231 {
1232 struct dib0700_adapter_state *st = adap->priv;
1233 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe_adap[0].fe,
1234 DIBX000_I2C_INTERFACE_TUNER, 1);
1235
1236 if (adap->id == 0) {
1237 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1238 &dib807x_dib0070_config[0]) == NULL)
1239 return -ENODEV;
1240 } else {
1241 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1242 &dib807x_dib0070_config[1]) == NULL)
1243 return -ENODEV;
1244 }
1245
1246 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1247 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1248 return 0;
1249 }
1250
1251 static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index,
1252 u16 pid, int onoff)
1253 {
1254 return dib8000_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
1255 }
1256
1257 static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter,
1258 int onoff)
1259 {
1260 return dib8000_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
1261 }
1262
1263 /* STK807x */
1264 static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1265 {
1266 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1267 msleep(10);
1268 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1269 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1270 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1271
1272 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1273
1274 dib0700_ctrl_clock(adap->dev, 72, 1);
1275
1276 msleep(10);
1277 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1278 msleep(10);
1279 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1280
1281 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1282 0x80);
1283
1284 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1285 &dib807x_dib8000_config[0]);
1286
1287 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1288 }
1289
1290 /* STK807xPVR */
1291 static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1292 {
1293 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1294 msleep(30);
1295 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1296 msleep(500);
1297 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1298 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1299 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1300
1301 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1302
1303 dib0700_ctrl_clock(adap->dev, 72, 1);
1304
1305 msleep(10);
1306 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1307 msleep(10);
1308 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1309
1310 /* initialize IC 0 */
1311 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x80);
1312
1313 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1314 &dib807x_dib8000_config[0]);
1315
1316 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1317 }
1318
1319 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1320 {
1321 /* initialize IC 1 */
1322 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x82);
1323
1324 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
1325 &dib807x_dib8000_config[1]);
1326
1327 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1328 }
1329
1330 /* STK8096GP */
1331 struct dibx000_agc_config dib8090_agc_config[2] = {
1332 {
1333 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1334 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1335 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1336 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1337 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1338 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1339
1340 787,
1341 10,
1342
1343 0,
1344 118,
1345
1346 0,
1347 3530,
1348 1,
1349 5,
1350
1351 65535,
1352 0,
1353
1354 65535,
1355 0,
1356
1357 0,
1358 32,
1359 114,
1360 143,
1361 144,
1362 114,
1363 227,
1364 116,
1365 117,
1366
1367 28,
1368 26,
1369 31,
1370 51,
1371
1372 0,
1373 },
1374 {
1375 BAND_CBAND,
1376 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1377 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1378 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1379 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1380 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1381
1382 787,
1383 10,
1384
1385 0,
1386 118,
1387
1388 0,
1389 3530,
1390 1,
1391 5,
1392
1393 0,
1394 0,
1395
1396 65535,
1397 0,
1398
1399 0,
1400 32,
1401 114,
1402 143,
1403 144,
1404 114,
1405 227,
1406 116,
1407 117,
1408
1409 28,
1410 26,
1411 31,
1412 51,
1413
1414 0,
1415 }
1416 };
1417
1418 static struct dibx000_bandwidth_config dib8090_pll_config_12mhz = {
1419 54000, 13500,
1420 1, 18, 3, 1, 0,
1421 0, 0, 1, 1, 2,
1422 (3 << 14) | (1 << 12) | (599 << 0),
1423 (0 << 25) | 0,
1424 20199727,
1425 12000000,
1426 };
1427
1428 static int dib8090_get_adc_power(struct dvb_frontend *fe)
1429 {
1430 return dib8000_get_adc_power(fe, 1);
1431 }
1432
1433 static struct dib8000_config dib809x_dib8000_config[2] = {
1434 {
1435 .output_mpeg2_in_188_bytes = 1,
1436
1437 .agc_config_count = 2,
1438 .agc = dib8090_agc_config,
1439 .agc_control = dib0090_dcc_freq,
1440 .pll = &dib8090_pll_config_12mhz,
1441 .tuner_is_baseband = 1,
1442
1443 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1444 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1445 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1446
1447 .hostbus_diversity = 1,
1448 .div_cfg = 0x31,
1449 .output_mode = OUTMODE_MPEG2_FIFO,
1450 .drives = 0x2d98,
1451 .diversity_delay = 48,
1452 .refclksel = 3,
1453 }, {
1454 .output_mpeg2_in_188_bytes = 1,
1455
1456 .agc_config_count = 2,
1457 .agc = dib8090_agc_config,
1458 .agc_control = dib0090_dcc_freq,
1459 .pll = &dib8090_pll_config_12mhz,
1460 .tuner_is_baseband = 1,
1461
1462 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1463 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1464 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1465
1466 .hostbus_diversity = 1,
1467 .div_cfg = 0x31,
1468 .output_mode = OUTMODE_DIVERSITY,
1469 .drives = 0x2d08,
1470 .diversity_delay = 1,
1471 .refclksel = 3,
1472 }
1473 };
1474
1475 static struct dib0090_wbd_slope dib8090_wbd_table[] = {
1476 /* max freq ; cold slope ; cold offset ; warm slope ; warm offset ; wbd gain */
1477 { 120, 0, 500, 0, 500, 4 }, /* CBAND */
1478 { 170, 0, 450, 0, 450, 4 }, /* CBAND */
1479 { 380, 48, 373, 28, 259, 6 }, /* VHF */
1480 { 860, 34, 700, 36, 616, 6 }, /* high UHF */
1481 { 0xFFFF, 34, 700, 36, 616, 6 }, /* default */
1482 };
1483
1484 static struct dib0090_config dib809x_dib0090_config = {
1485 .io.pll_bypass = 1,
1486 .io.pll_range = 1,
1487 .io.pll_prediv = 1,
1488 .io.pll_loopdiv = 20,
1489 .io.adc_clock_ratio = 8,
1490 .io.pll_int_loop_filt = 0,
1491 .io.clock_khz = 12000,
1492 .reset = dib80xx_tuner_reset,
1493 .sleep = dib80xx_tuner_sleep,
1494 .clkouttobamse = 1,
1495 .analog_output = 1,
1496 .i2c_address = DEFAULT_DIB0090_I2C_ADDRESS,
1497 .use_pwm_agc = 1,
1498 .clkoutdrive = 1,
1499 .get_adc_power = dib8090_get_adc_power,
1500 .freq_offset_khz_uhf = -63,
1501 .freq_offset_khz_vhf = -143,
1502 .wbd = dib8090_wbd_table,
1503 .fref_clock_ratio = 6,
1504 };
1505
1506 static int dib8096_set_param_override(struct dvb_frontend *fe,
1507 struct dvb_frontend_parameters *fep)
1508 {
1509 struct dvb_usb_adapter *adap = fe->dvb->priv;
1510 struct dib0700_adapter_state *state = adap->priv;
1511 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1512 u16 target;
1513 int ret = 0;
1514 enum frontend_tune_state tune_state = CT_SHUTDOWN;
1515 u16 ltgain, rf_gain_limit;
1516
1517 ret = state->set_param_save(fe, fep);
1518 if (ret < 0)
1519 return ret;
1520
1521 target = (dib0090_get_wbd_offset(fe) * 8 * 18 / 33 + 1) / 2;
1522 dib8000_set_wbd_ref(fe, target);
1523
1524
1525 if (band == BAND_CBAND) {
1526 deb_info("tuning in CBAND - soft-AGC startup\n");
1527 dib0090_set_tune_state(fe, CT_AGC_START);
1528 do {
1529 ret = dib0090_gain_control(fe);
1530 msleep(ret);
1531 tune_state = dib0090_get_tune_state(fe);
1532 if (tune_state == CT_AGC_STEP_0)
1533 dib8000_set_gpio(fe, 6, 0, 1);
1534 else if (tune_state == CT_AGC_STEP_1) {
1535 dib0090_get_current_gain(fe, NULL, NULL, &rf_gain_limit, &ltgain);
1536 if (rf_gain_limit == 0)
1537 dib8000_set_gpio(fe, 6, 0, 0);
1538 }
1539 } while (tune_state < CT_AGC_STOP);
1540 dib0090_pwm_gain_reset(fe);
1541 dib8000_pwm_agc_reset(fe);
1542 dib8000_set_tune_state(fe, CT_DEMOD_START);
1543 } else {
1544 deb_info("not tuning in CBAND - standard AGC startup\n");
1545 dib0090_pwm_gain_reset(fe);
1546 }
1547
1548 return 0;
1549 }
1550
1551 static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
1552 {
1553 struct dib0700_adapter_state *st = adap->priv;
1554 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1555
1556 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1557 return -ENODEV;
1558
1559 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1560 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1561 return 0;
1562 }
1563
1564 static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1565 {
1566 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1567 msleep(10);
1568 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1569 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1570 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1571
1572 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1573
1574 dib0700_ctrl_clock(adap->dev, 72, 1);
1575
1576 msleep(10);
1577 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1578 msleep(10);
1579 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1580
1581 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80);
1582
1583 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1584
1585 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1586 }
1587
1588 static int nim8096md_tuner_attach(struct dvb_usb_adapter *adap)
1589 {
1590 struct dib0700_adapter_state *st = adap->priv;
1591 struct i2c_adapter *tun_i2c;
1592 struct dvb_frontend *fe_slave = dib8000_get_slave_frontend(adap->fe_adap[0].fe, 1);
1593
1594 if (fe_slave) {
1595 tun_i2c = dib8000_get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1);
1596 if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL)
1597 return -ENODEV;
1598 fe_slave->dvb = adap->fe_adap[0].fe->dvb;
1599 fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override;
1600 }
1601 tun_i2c = dib8000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1602 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1603 return -ENODEV;
1604
1605 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1606 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1607
1608 return 0;
1609 }
1610
1611 static int nim8096md_frontend_attach(struct dvb_usb_adapter *adap)
1612 {
1613 struct dvb_frontend *fe_slave;
1614
1615 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1616 msleep(20);
1617 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1618 msleep(1000);
1619 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1620 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1621 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1622
1623 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1624
1625 dib0700_ctrl_clock(adap->dev, 72, 1);
1626
1627 msleep(20);
1628 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1629 msleep(20);
1630 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1631
1632 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80);
1633
1634 adap->fe_adap[0].fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]);
1635 if (adap->fe_adap[0].fe == NULL)
1636 return -ENODEV;
1637
1638 fe_slave = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]);
1639 dib8000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
1640
1641 return fe_slave == NULL ? -ENODEV : 0;
1642 }
1643
1644 /* STK9090M */
1645 static int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1646 {
1647 return dib9000_fw_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff);
1648 }
1649
1650 static int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1651 {
1652 return dib9000_fw_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff);
1653 }
1654
1655 static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff)
1656 {
1657 return dib9000_set_gpio(fe, 5, 0, !onoff);
1658 }
1659
1660 static int dib90x0_tuner_sleep(struct dvb_frontend *fe, int onoff)
1661 {
1662 return dib9000_set_gpio(fe, 0, 0, onoff);
1663 }
1664
1665 static int dib01x0_pmu_update(struct i2c_adapter *i2c, u16 *data, u8 len)
1666 {
1667 u8 wb[4] = { 0xc >> 8, 0xc & 0xff, 0, 0 };
1668 u8 rb[2];
1669 struct i2c_msg msg[2] = {
1670 {.addr = 0x1e >> 1, .flags = 0, .buf = wb, .len = 2},
1671 {.addr = 0x1e >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2},
1672 };
1673 u8 index_data;
1674
1675 dibx000_i2c_set_speed(i2c, 250);
1676
1677 if (i2c_transfer(i2c, msg, 2) != 2)
1678 return -EIO;
1679
1680 switch (rb[0] << 8 | rb[1]) {
1681 case 0:
1682 deb_info("Found DiB0170 rev1: This version of DiB0170 is not supported any longer.\n");
1683 return -EIO;
1684 case 1:
1685 deb_info("Found DiB0170 rev2");
1686 break;
1687 case 2:
1688 deb_info("Found DiB0190 rev2");
1689 break;
1690 default:
1691 deb_info("DiB01x0 not found");
1692 return -EIO;
1693 }
1694
1695 for (index_data = 0; index_data < len; index_data += 2) {
1696 wb[2] = (data[index_data + 1] >> 8) & 0xff;
1697 wb[3] = (data[index_data + 1]) & 0xff;
1698
1699 if (data[index_data] == 0) {
1700 wb[0] = (data[index_data] >> 8) & 0xff;
1701 wb[1] = (data[index_data]) & 0xff;
1702 msg[0].len = 2;
1703 if (i2c_transfer(i2c, msg, 2) != 2)
1704 return -EIO;
1705 wb[2] |= rb[0];
1706 wb[3] |= rb[1] & ~(3 << 4);
1707 }
1708
1709 wb[0] = (data[index_data] >> 8)&0xff;
1710 wb[1] = (data[index_data])&0xff;
1711 msg[0].len = 4;
1712 if (i2c_transfer(i2c, &msg[0], 1) != 1)
1713 return -EIO;
1714 }
1715 return 0;
1716 }
1717
1718 static struct dib9000_config stk9090m_config = {
1719 .output_mpeg2_in_188_bytes = 1,
1720 .output_mode = OUTMODE_MPEG2_FIFO,
1721 .vcxo_timer = 279620,
1722 .timing_frequency = 20452225,
1723 .demod_clock_khz = 60000,
1724 .xtal_clock_khz = 30000,
1725 .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
1726 .subband = {
1727 2,
1728 {
1729 { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0008 } }, /* GPIO 3 to 1 for VHF */
1730 { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0000 } }, /* GPIO 3 to 0 for UHF */
1731 { 0 },
1732 },
1733 },
1734 .gpio_function = {
1735 { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 },
1736 { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 },
1737 },
1738 };
1739
1740 static struct dib9000_config nim9090md_config[2] = {
1741 {
1742 .output_mpeg2_in_188_bytes = 1,
1743 .output_mode = OUTMODE_MPEG2_FIFO,
1744 .vcxo_timer = 279620,
1745 .timing_frequency = 20452225,
1746 .demod_clock_khz = 60000,
1747 .xtal_clock_khz = 30000,
1748 .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
1749 }, {
1750 .output_mpeg2_in_188_bytes = 1,
1751 .output_mode = OUTMODE_DIVERSITY,
1752 .vcxo_timer = 279620,
1753 .timing_frequency = 20452225,
1754 .demod_clock_khz = 60000,
1755 .xtal_clock_khz = 30000,
1756 .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0),
1757 .subband = {
1758 2,
1759 {
1760 { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0006 } }, /* GPIO 1 and 2 to 1 for VHF */
1761 { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0000 } }, /* GPIO 1 and 2 to 0 for UHF */
1762 { 0 },
1763 },
1764 },
1765 .gpio_function = {
1766 { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 },
1767 { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 },
1768 },
1769 }
1770 };
1771
1772 static struct dib0090_config dib9090_dib0090_config = {
1773 .io.pll_bypass = 0,
1774 .io.pll_range = 1,
1775 .io.pll_prediv = 1,
1776 .io.pll_loopdiv = 8,
1777 .io.adc_clock_ratio = 8,
1778 .io.pll_int_loop_filt = 0,
1779 .io.clock_khz = 30000,
1780 .reset = dib90x0_tuner_reset,
1781 .sleep = dib90x0_tuner_sleep,
1782 .clkouttobamse = 0,
1783 .analog_output = 0,
1784 .use_pwm_agc = 0,
1785 .clkoutdrive = 0,
1786 .freq_offset_khz_uhf = 0,
1787 .freq_offset_khz_vhf = 0,
1788 };
1789
1790 static struct dib0090_config nim9090md_dib0090_config[2] = {
1791 {
1792 .io.pll_bypass = 0,
1793 .io.pll_range = 1,
1794 .io.pll_prediv = 1,
1795 .io.pll_loopdiv = 8,
1796 .io.adc_clock_ratio = 8,
1797 .io.pll_int_loop_filt = 0,
1798 .io.clock_khz = 30000,
1799 .reset = dib90x0_tuner_reset,
1800 .sleep = dib90x0_tuner_sleep,
1801 .clkouttobamse = 1,
1802 .analog_output = 0,
1803 .use_pwm_agc = 0,
1804 .clkoutdrive = 0,
1805 .freq_offset_khz_uhf = 0,
1806 .freq_offset_khz_vhf = 0,
1807 }, {
1808 .io.pll_bypass = 0,
1809 .io.pll_range = 1,
1810 .io.pll_prediv = 1,
1811 .io.pll_loopdiv = 8,
1812 .io.adc_clock_ratio = 8,
1813 .io.pll_int_loop_filt = 0,
1814 .io.clock_khz = 30000,
1815 .reset = dib90x0_tuner_reset,
1816 .sleep = dib90x0_tuner_sleep,
1817 .clkouttobamse = 0,
1818 .analog_output = 0,
1819 .use_pwm_agc = 0,
1820 .clkoutdrive = 0,
1821 .freq_offset_khz_uhf = 0,
1822 .freq_offset_khz_vhf = 0,
1823 }
1824 };
1825
1826
1827 static int stk9090m_frontend_attach(struct dvb_usb_adapter *adap)
1828 {
1829 struct dib0700_adapter_state *state = adap->priv;
1830 struct dib0700_state *st = adap->dev->priv;
1831 u32 fw_version;
1832
1833 /* Make use of the new i2c functions from FW 1.20 */
1834 dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
1835 if (fw_version >= 0x10200)
1836 st->fw_use_new_i2c_api = 1;
1837 dib0700_set_i2c_speed(adap->dev, 340);
1838
1839 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1840 msleep(20);
1841 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1842 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1843 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1844 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1845
1846 dib0700_ctrl_clock(adap->dev, 72, 1);
1847
1848 msleep(20);
1849 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1850 msleep(20);
1851 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1852
1853 dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80);
1854
1855 if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
1856 deb_info("%s: Upload failed. (file not found?)\n", __func__);
1857 return -ENODEV;
1858 } else {
1859 deb_info("%s: firmware read %Zu bytes.\n", __func__, state->frontend_firmware->size);
1860 }
1861 stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size;
1862 stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data;
1863
1864 adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config);
1865
1866 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1867 }
1868
1869 static int dib9090_tuner_attach(struct dvb_usb_adapter *adap)
1870 {
1871 struct dib0700_adapter_state *state = adap->priv;
1872 struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
1873 u16 data_dib190[10] = {
1874 1, 0x1374,
1875 2, 0x01a2,
1876 7, 0x0020,
1877 0, 0x00ef,
1878 8, 0x0486,
1879 };
1880
1881 if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL)
1882 return -ENODEV;
1883 i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
1884 if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0)
1885 return -ENODEV;
1886 dib0700_set_i2c_speed(adap->dev, 2000);
1887 if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
1888 return -ENODEV;
1889 release_firmware(state->frontend_firmware);
1890 return 0;
1891 }
1892
1893 static int nim9090md_frontend_attach(struct dvb_usb_adapter *adap)
1894 {
1895 struct dib0700_adapter_state *state = adap->priv;
1896 struct dib0700_state *st = adap->dev->priv;
1897 struct i2c_adapter *i2c;
1898 struct dvb_frontend *fe_slave;
1899 u32 fw_version;
1900
1901 /* Make use of the new i2c functions from FW 1.20 */
1902 dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL);
1903 if (fw_version >= 0x10200)
1904 st->fw_use_new_i2c_api = 1;
1905 dib0700_set_i2c_speed(adap->dev, 340);
1906
1907 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1908 msleep(20);
1909 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1910 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1911 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1912 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1913
1914 dib0700_ctrl_clock(adap->dev, 72, 1);
1915
1916 msleep(20);
1917 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1918 msleep(20);
1919 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1920
1921 if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
1922 deb_info("%s: Upload failed. (file not found?)\n", __func__);
1923 return -EIO;
1924 } else {
1925 deb_info("%s: firmware read %Zu bytes.\n", __func__, state->frontend_firmware->size);
1926 }
1927 nim9090md_config[0].microcode_B_fe_size = state->frontend_firmware->size;
1928 nim9090md_config[0].microcode_B_fe_buffer = state->frontend_firmware->data;
1929 nim9090md_config[1].microcode_B_fe_size = state->frontend_firmware->size;
1930 nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data;
1931
1932 dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80);
1933 adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]);
1934
1935 if (adap->fe_adap[0].fe == NULL)
1936 return -ENODEV;
1937
1938 i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_3_4, 0);
1939 dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82);
1940
1941 fe_slave = dvb_attach(dib9000_attach, i2c, 0x82, &nim9090md_config[1]);
1942 dib9000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave);
1943
1944 return fe_slave == NULL ? -ENODEV : 0;
1945 }
1946
1947 static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap)
1948 {
1949 struct dib0700_adapter_state *state = adap->priv;
1950 struct i2c_adapter *i2c;
1951 struct dvb_frontend *fe_slave;
1952 u16 data_dib190[10] = {
1953 1, 0x5374,
1954 2, 0x01ae,
1955 7, 0x0020,
1956 0, 0x00ef,
1957 8, 0x0406,
1958 };
1959 i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
1960 if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL)
1961 return -ENODEV;
1962 i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
1963 if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0)
1964 return -ENODEV;
1965 dib0700_set_i2c_speed(adap->dev, 2000);
1966 if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0)
1967 return -ENODEV;
1968
1969 fe_slave = dib9000_get_slave_frontend(adap->fe_adap[0].fe, 1);
1970 if (fe_slave != NULL) {
1971 i2c = dib9000_get_component_bus_interface(adap->fe_adap[0].fe);
1972 dib9000_set_i2c_adapter(fe_slave, i2c);
1973
1974 i2c = dib9000_get_tuner_interface(fe_slave);
1975 if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL)
1976 return -ENODEV;
1977 fe_slave->dvb = adap->fe_adap[0].fe->dvb;
1978 dib9000_fw_set_component_bus_speed(adap->fe_adap[0].fe, 2000);
1979 if (dib9000_firmware_post_pll_init(fe_slave) < 0)
1980 return -ENODEV;
1981 }
1982 release_firmware(state->frontend_firmware);
1983
1984 return 0;
1985 }
1986
1987 /* NIM7090 */
1988 struct dib7090p_best_adc {
1989 u32 timf;
1990 u32 pll_loopdiv;
1991 u32 pll_prediv;
1992 };
1993
1994 static int dib7090p_get_best_sampling(struct dvb_frontend *fe , struct dib7090p_best_adc *adc)
1995 {
1996 u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1;
1997
1998 u16 xtal = 12000;
1999 u32 fcp_min = 1900; /* PLL Minimum Frequency comparator KHz */
2000 u32 fcp_max = 20000; /* PLL Maximum Frequency comparator KHz */
2001 u32 fdem_max = 76000;
2002 u32 fdem_min = 69500;
2003 u32 fcp = 0, fs = 0, fdem = 0;
2004 u32 harmonic_id = 0;
2005
2006 adc->pll_loopdiv = loopdiv;
2007 adc->pll_prediv = prediv;
2008 adc->timf = 0;
2009
2010 deb_info("bandwidth = %d fdem_min =%d", fe->dtv_property_cache.bandwidth_hz, fdem_min);
2011
2012 /* Find Min and Max prediv */
2013 while ((xtal/max_prediv) >= fcp_min)
2014 max_prediv++;
2015
2016 max_prediv--;
2017 min_prediv = max_prediv;
2018 while ((xtal/min_prediv) <= fcp_max) {
2019 min_prediv--;
2020 if (min_prediv == 1)
2021 break;
2022 }
2023 deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv);
2024
2025 min_prediv = 2;
2026
2027 for (prediv = min_prediv ; prediv < max_prediv; prediv++) {
2028 fcp = xtal / prediv;
2029 if (fcp > fcp_min && fcp < fcp_max) {
2030 for (loopdiv = 1 ; loopdiv < 64 ; loopdiv++) {
2031 fdem = ((xtal/prediv) * loopdiv);
2032 fs = fdem / 4;
2033 /* test min/max system restrictions */
2034
2035 if ((fdem >= fdem_min) && (fdem <= fdem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz/1000)) {
2036 spur = 0;
2037 /* test fs harmonics positions */
2038 for (harmonic_id = (fe->dtv_property_cache.frequency / (1000*fs)) ; harmonic_id <= ((fe->dtv_property_cache.frequency / (1000*fs))+1) ; harmonic_id++) {
2039 if (((fs*harmonic_id) >= ((fe->dtv_property_cache.frequency/1000) - (fe->dtv_property_cache.bandwidth_hz/2000))) && ((fs*harmonic_id) <= ((fe->dtv_property_cache.frequency/1000) + (fe->dtv_property_cache.bandwidth_hz/2000)))) {
2040 spur = 1;
2041 break;
2042 }
2043 }
2044
2045 if (!spur) {
2046 adc->pll_loopdiv = loopdiv;
2047 adc->pll_prediv = prediv;
2048 adc->timf = 2396745143UL/fdem*(1 << 9);
2049 adc->timf += ((2396745143UL%fdem) << 9)/fdem;
2050 deb_info("loopdiv=%i prediv=%i timf=%i", loopdiv, prediv, adc->timf);
2051 break;
2052 }
2053 }
2054 }
2055 }
2056 if (!spur)
2057 break;
2058 }
2059
2060
2061 if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0)
2062 return -EINVAL;
2063 else
2064 return 0;
2065 }
2066
2067 static int dib7090_agc_startup(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
2068 {
2069 struct dvb_usb_adapter *adap = fe->dvb->priv;
2070 struct dib0700_adapter_state *state = adap->priv;
2071 struct dibx000_bandwidth_config pll;
2072 u16 target;
2073 struct dib7090p_best_adc adc;
2074 int ret;
2075
2076 ret = state->set_param_save(fe, fep);
2077 if (ret < 0)
2078 return ret;
2079
2080 memset(&pll, 0, sizeof(struct dibx000_bandwidth_config));
2081 dib0090_pwm_gain_reset(fe);
2082 target = (dib0090_get_wbd_offset(fe) * 8 + 1) / 2;
2083 dib7000p_set_wbd_ref(fe, target);
2084
2085 if (dib7090p_get_best_sampling(fe, &adc) == 0) {
2086 pll.pll_ratio = adc.pll_loopdiv;
2087 pll.pll_prediv = adc.pll_prediv;
2088
2089 dib7000p_update_pll(fe, &pll);
2090 dib7000p_ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf);
2091 }
2092 return 0;
2093 }
2094
2095 static struct dib0090_wbd_slope dib7090_wbd_table[] = {
2096 { 380, 81, 850, 64, 540, 4},
2097 { 860, 51, 866, 21, 375, 4},
2098 {1700, 0, 250, 0, 100, 6},
2099 {2600, 0, 250, 0, 100, 6},
2100 { 0xFFFF, 0, 0, 0, 0, 0},
2101 };
2102
2103 struct dibx000_agc_config dib7090_agc_config[2] = {
2104 {
2105 .band_caps = BAND_UHF,
2106 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
2107 * 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 */
2108 .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
2109
2110 .inv_gain = 687,
2111 .time_stabiliz = 10,
2112
2113 .alpha_level = 0,
2114 .thlock = 118,
2115
2116 .wbd_inv = 0,
2117 .wbd_ref = 1200,
2118 .wbd_sel = 3,
2119 .wbd_alpha = 5,
2120
2121 .agc1_max = 65535,
2122 .agc1_min = 0,
2123
2124 .agc2_max = 65535,
2125 .agc2_min = 0,
2126
2127 .agc1_pt1 = 0,
2128 .agc1_pt2 = 32,
2129 .agc1_pt3 = 114,
2130 .agc1_slope1 = 143,
2131 .agc1_slope2 = 144,
2132 .agc2_pt1 = 114,
2133 .agc2_pt2 = 227,
2134 .agc2_slope1 = 116,
2135 .agc2_slope2 = 117,
2136
2137 .alpha_mant = 18,
2138 .alpha_exp = 0,
2139 .beta_mant = 20,
2140 .beta_exp = 59,
2141
2142 .perform_agc_softsplit = 0,
2143 } , {
2144 .band_caps = BAND_FM | BAND_VHF | BAND_CBAND,
2145 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
2146 * 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 */
2147 .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
2148
2149 .inv_gain = 732,
2150 .time_stabiliz = 10,
2151
2152 .alpha_level = 0,
2153 .thlock = 118,
2154
2155 .wbd_inv = 0,
2156 .wbd_ref = 1200,
2157 .wbd_sel = 3,
2158 .wbd_alpha = 5,
2159
2160 .agc1_max = 65535,
2161 .agc1_min = 0,
2162
2163 .agc2_max = 65535,
2164 .agc2_min = 0,
2165
2166 .agc1_pt1 = 0,
2167 .agc1_pt2 = 0,
2168 .agc1_pt3 = 98,
2169 .agc1_slope1 = 0,
2170 .agc1_slope2 = 167,
2171 .agc2_pt1 = 98,
2172 .agc2_pt2 = 255,
2173 .agc2_slope1 = 104,
2174 .agc2_slope2 = 0,
2175
2176 .alpha_mant = 18,
2177 .alpha_exp = 0,
2178 .beta_mant = 20,
2179 .beta_exp = 59,
2180
2181 .perform_agc_softsplit = 0,
2182 }
2183 };
2184
2185 static struct dibx000_bandwidth_config dib7090_clock_config_12_mhz = {
2186 60000, 15000,
2187 1, 5, 0, 0, 0,
2188 0, 0, 1, 1, 2,
2189 (3 << 14) | (1 << 12) | (524 << 0),
2190 (0 << 25) | 0,
2191 20452225,
2192 15000000,
2193 };
2194
2195 static struct dib7000p_config nim7090_dib7000p_config = {
2196 .output_mpeg2_in_188_bytes = 1,
2197 .hostbus_diversity = 1,
2198 .tuner_is_baseband = 1,
2199 .update_lna = NULL,
2200
2201 .agc_config_count = 2,
2202 .agc = dib7090_agc_config,
2203
2204 .bw = &dib7090_clock_config_12_mhz,
2205
2206 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2207 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
2208 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
2209
2210 .pwm_freq_div = 0,
2211
2212 .agc_control = dib7090_agc_restart,
2213
2214 .spur_protect = 0,
2215 .disable_sample_and_hold = 0,
2216 .enable_current_mirror = 0,
2217 .diversity_delay = 0,
2218
2219 .output_mode = OUTMODE_MPEG2_FIFO,
2220 .enMpegOutput = 1,
2221 };
2222
2223 static struct dib7000p_config tfe7090pvr_dib7000p_config[2] = {
2224 {
2225 .output_mpeg2_in_188_bytes = 1,
2226 .hostbus_diversity = 1,
2227 .tuner_is_baseband = 1,
2228 .update_lna = NULL,
2229
2230 .agc_config_count = 2,
2231 .agc = dib7090_agc_config,
2232
2233 .bw = &dib7090_clock_config_12_mhz,
2234
2235 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2236 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
2237 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
2238
2239 .pwm_freq_div = 0,
2240
2241 .agc_control = dib7090_agc_restart,
2242
2243 .spur_protect = 0,
2244 .disable_sample_and_hold = 0,
2245 .enable_current_mirror = 0,
2246 .diversity_delay = 0,
2247
2248 .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK,
2249 .default_i2c_addr = 0x90,
2250 .enMpegOutput = 1,
2251 }, {
2252 .output_mpeg2_in_188_bytes = 1,
2253 .hostbus_diversity = 1,
2254 .tuner_is_baseband = 1,
2255 .update_lna = NULL,
2256
2257 .agc_config_count = 2,
2258 .agc = dib7090_agc_config,
2259
2260 .bw = &dib7090_clock_config_12_mhz,
2261
2262 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2263 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
2264 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
2265
2266 .pwm_freq_div = 0,
2267
2268 .agc_control = dib7090_agc_restart,
2269
2270 .spur_protect = 0,
2271 .disable_sample_and_hold = 0,
2272 .enable_current_mirror = 0,
2273 .diversity_delay = 0,
2274
2275 .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK,
2276 .default_i2c_addr = 0x92,
2277 .enMpegOutput = 0,
2278 }
2279 };
2280
2281 static const struct dib0090_config nim7090_dib0090_config = {
2282 .io.clock_khz = 12000,
2283 .io.pll_bypass = 0,
2284 .io.pll_range = 0,
2285 .io.pll_prediv = 3,
2286 .io.pll_loopdiv = 6,
2287 .io.adc_clock_ratio = 0,
2288 .io.pll_int_loop_filt = 0,
2289 .reset = dib7090_tuner_sleep,
2290 .sleep = dib7090_tuner_sleep,
2291
2292 .freq_offset_khz_uhf = 0,
2293 .freq_offset_khz_vhf = 0,
2294
2295 .get_adc_power = dib7090_get_adc_power,
2296
2297 .clkouttobamse = 1,
2298 .analog_output = 0,
2299
2300 .wbd_vhf_offset = 0,
2301 .wbd_cband_offset = 0,
2302 .use_pwm_agc = 1,
2303 .clkoutdrive = 0,
2304
2305 .fref_clock_ratio = 0,
2306
2307 .wbd = dib7090_wbd_table,
2308
2309 .ls_cfg_pad_drv = 0,
2310 .data_tx_drv = 0,
2311 .low_if = NULL,
2312 .in_soc = 1,
2313 };
2314
2315 static const struct dib0090_config tfe7090pvr_dib0090_config[2] = {
2316 {
2317 .io.clock_khz = 12000,
2318 .io.pll_bypass = 0,
2319 .io.pll_range = 0,
2320 .io.pll_prediv = 3,
2321 .io.pll_loopdiv = 6,
2322 .io.adc_clock_ratio = 0,
2323 .io.pll_int_loop_filt = 0,
2324 .reset = dib7090_tuner_sleep,
2325 .sleep = dib7090_tuner_sleep,
2326
2327 .freq_offset_khz_uhf = 50,
2328 .freq_offset_khz_vhf = 70,
2329
2330 .get_adc_power = dib7090_get_adc_power,
2331
2332 .clkouttobamse = 1,
2333 .analog_output = 0,
2334
2335 .wbd_vhf_offset = 0,
2336 .wbd_cband_offset = 0,
2337 .use_pwm_agc = 1,
2338 .clkoutdrive = 0,
2339
2340 .fref_clock_ratio = 0,
2341
2342 .wbd = dib7090_wbd_table,
2343
2344 .ls_cfg_pad_drv = 0,
2345 .data_tx_drv = 0,
2346 .low_if = NULL,
2347 .in_soc = 1,
2348 }, {
2349 .io.clock_khz = 12000,
2350 .io.pll_bypass = 0,
2351 .io.pll_range = 0,
2352 .io.pll_prediv = 3,
2353 .io.pll_loopdiv = 6,
2354 .io.adc_clock_ratio = 0,
2355 .io.pll_int_loop_filt = 0,
2356 .reset = dib7090_tuner_sleep,
2357 .sleep = dib7090_tuner_sleep,
2358
2359 .freq_offset_khz_uhf = -50,
2360 .freq_offset_khz_vhf = -70,
2361
2362 .get_adc_power = dib7090_get_adc_power,
2363
2364 .clkouttobamse = 1,
2365 .analog_output = 0,
2366
2367 .wbd_vhf_offset = 0,
2368 .wbd_cband_offset = 0,
2369 .use_pwm_agc = 1,
2370 .clkoutdrive = 0,
2371
2372 .fref_clock_ratio = 0,
2373
2374 .wbd = dib7090_wbd_table,
2375
2376 .ls_cfg_pad_drv = 0,
2377 .data_tx_drv = 0,
2378 .low_if = NULL,
2379 .in_soc = 1,
2380 }
2381 };
2382
2383 static int nim7090_frontend_attach(struct dvb_usb_adapter *adap)
2384 {
2385 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2386 msleep(20);
2387 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2388 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2389 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2390 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2391
2392 msleep(20);
2393 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2394 msleep(20);
2395 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2396
2397 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, &nim7090_dib7000p_config) != 0) {
2398 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
2399 return -ENODEV;
2400 }
2401 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
2402
2403 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2404 }
2405
2406 static int nim7090_tuner_attach(struct dvb_usb_adapter *adap)
2407 {
2408 struct dib0700_adapter_state *st = adap->priv;
2409 struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe_adap[0].fe);
2410
2411 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &nim7090_dib0090_config) == NULL)
2412 return -ENODEV;
2413
2414 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2415
2416 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
2417 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
2418 return 0;
2419 }
2420
2421 static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
2422 {
2423 struct dib0700_state *st = adap->dev->priv;
2424
2425 /* The TFE7090 requires the dib0700 to not be in master mode */
2426 st->disable_streaming_master_mode = 1;
2427
2428 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2429 msleep(20);
2430 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2431 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2432 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2433 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2434
2435 msleep(20);
2436 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2437 msleep(20);
2438 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2439
2440 /* initialize IC 0 */
2441 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, &tfe7090pvr_dib7000p_config[0]) != 0) {
2442 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
2443 return -ENODEV;
2444 }
2445
2446 dib0700_set_i2c_speed(adap->dev, 340);
2447 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
2448 if (adap->fe_adap[0].fe == NULL)
2449 return -ENODEV;
2450
2451 dib7090_slave_reset(adap->fe_adap[0].fe);
2452
2453 return 0;
2454 }
2455
2456 static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap)
2457 {
2458 struct i2c_adapter *i2c;
2459
2460 if (adap->dev->adapter[0].fe_adap[0].fe == NULL) {
2461 err("the master dib7090 has to be initialized first");
2462 return -ENODEV; /* the master device has not been initialized */
2463 }
2464
2465 i2c = dib7000p_get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
2466 if (dib7000p_i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) {
2467 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
2468 return -ENODEV;
2469 }
2470
2471 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, i2c, 0x92, &tfe7090pvr_dib7000p_config[1]);
2472 dib0700_set_i2c_speed(adap->dev, 200);
2473
2474 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2475 }
2476
2477 static int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap)
2478 {
2479 struct dib0700_adapter_state *st = adap->priv;
2480 struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe_adap[0].fe);
2481
2482 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL)
2483 return -ENODEV;
2484
2485 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2486
2487 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
2488 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
2489 return 0;
2490 }
2491
2492 static int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap)
2493 {
2494 struct dib0700_adapter_state *st = adap->priv;
2495 struct i2c_adapter *tun_i2c = dib7090_get_i2c_tuner(adap->fe_adap[0].fe);
2496
2497 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL)
2498 return -ENODEV;
2499
2500 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2501
2502 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
2503 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup;
2504 return 0;
2505 }
2506
2507 /* STK7070PD */
2508 static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
2509 {
2510 .output_mpeg2_in_188_bytes = 1,
2511
2512 .agc_config_count = 1,
2513 .agc = &dib7070_agc_config,
2514 .bw = &dib7070_bw_config_12_mhz,
2515 .tuner_is_baseband = 1,
2516 .spur_protect = 1,
2517
2518 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2519 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
2520 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
2521
2522 .hostbus_diversity = 1,
2523 }, {
2524 .output_mpeg2_in_188_bytes = 1,
2525
2526 .agc_config_count = 1,
2527 .agc = &dib7070_agc_config,
2528 .bw = &dib7070_bw_config_12_mhz,
2529 .tuner_is_baseband = 1,
2530 .spur_protect = 1,
2531
2532 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
2533 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
2534 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
2535
2536 .hostbus_diversity = 1,
2537 }
2538 };
2539
2540 static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
2541 {
2542 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2543 msleep(10);
2544 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2545 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2546 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2547 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2548
2549 dib0700_ctrl_clock(adap->dev, 72, 1);
2550
2551 msleep(10);
2552 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2553 msleep(10);
2554 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2555
2556 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
2557 stk7070pd_dib7000p_config) != 0) {
2558 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
2559 __func__);
2560 return -ENODEV;
2561 }
2562
2563 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
2564 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2565 }
2566
2567 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
2568 {
2569 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
2570 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2571 }
2572
2573 /* S5H1411 */
2574 static struct s5h1411_config pinnacle_801e_config = {
2575 .output_mode = S5H1411_PARALLEL_OUTPUT,
2576 .gpio = S5H1411_GPIO_OFF,
2577 .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
2578 .qam_if = S5H1411_IF_44000,
2579 .vsb_if = S5H1411_IF_44000,
2580 .inversion = S5H1411_INVERSION_OFF,
2581 .status_mode = S5H1411_DEMODLOCKING
2582 };
2583
2584 /* Pinnacle PCTV HD Pro 801e GPIOs map:
2585 GPIO0 - currently unknown
2586 GPIO1 - xc5000 tuner reset
2587 GPIO2 - CX25843 sleep
2588 GPIO3 - currently unknown
2589 GPIO4 - currently unknown
2590 GPIO6 - currently unknown
2591 GPIO7 - currently unknown
2592 GPIO9 - currently unknown
2593 GPIO10 - CX25843 reset
2594 */
2595 static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
2596 {
2597 struct dib0700_state *st = adap->dev->priv;
2598
2599 /* Make use of the new i2c functions from FW 1.20 */
2600 st->fw_use_new_i2c_api = 1;
2601
2602 /* The s5h1411 requires the dib0700 to not be in master mode */
2603 st->disable_streaming_master_mode = 1;
2604
2605 /* All msleep values taken from Windows USB trace */
2606 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
2607 dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
2608 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2609 msleep(400);
2610 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2611 msleep(60);
2612 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2613 msleep(30);
2614 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2615 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2616 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2617 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2618 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
2619 msleep(30);
2620
2621 /* Put the CX25843 to sleep for now since we're in digital mode */
2622 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
2623
2624 /* GPIOs are initialized, do the attach */
2625 adap->fe_adap[0].fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
2626 &adap->dev->i2c_adap);
2627 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2628 }
2629
2630 static int dib0700_xc5000_tuner_callback(void *priv, int component,
2631 int command, int arg)
2632 {
2633 struct dvb_usb_adapter *adap = priv;
2634
2635 if (command == XC5000_TUNER_RESET) {
2636 /* Reset the tuner */
2637 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
2638 msleep(10);
2639 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
2640 msleep(10);
2641 } else {
2642 err("xc5000: unknown tuner callback command: %d\n", command);
2643 return -EINVAL;
2644 }
2645
2646 return 0;
2647 }
2648
2649 static struct xc5000_config s5h1411_xc5000_tunerconfig = {
2650 .i2c_address = 0x64,
2651 .if_khz = 5380,
2652 };
2653
2654 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
2655 {
2656 /* FIXME: generalize & move to common area */
2657 adap->fe_adap[0].fe->callback = dib0700_xc5000_tuner_callback;
2658
2659 return dvb_attach(xc5000_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
2660 &s5h1411_xc5000_tunerconfig)
2661 == NULL ? -ENODEV : 0;
2662 }
2663
2664 static int dib0700_xc4000_tuner_callback(void *priv, int component,
2665 int command, int arg)
2666 {
2667 struct dvb_usb_adapter *adap = priv;
2668
2669 if (command == XC4000_TUNER_RESET) {
2670 /* Reset the tuner */
2671 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 0);
2672 msleep(10);
2673 dib7000p_set_gpio(adap->fe_adap[0].fe, 8, 0, 1);
2674 } else {
2675 err("xc4000: unknown tuner callback command: %d\n", command);
2676 return -EINVAL;
2677 }
2678
2679 return 0;
2680 }
2681
2682 static struct dibx000_agc_config stk7700p_7000p_xc4000_agc_config = {
2683 .band_caps = BAND_UHF | BAND_VHF,
2684 .setup = 0x64,
2685 .inv_gain = 0x02c8,
2686 .time_stabiliz = 0x15,
2687 .alpha_level = 0x00,
2688 .thlock = 0x76,
2689 .wbd_inv = 0x01,
2690 .wbd_ref = 0x0b33,
2691 .wbd_sel = 0x00,
2692 .wbd_alpha = 0x02,
2693 .agc1_max = 0x00,
2694 .agc1_min = 0x00,
2695 .agc2_max = 0x9b26,
2696 .agc2_min = 0x26ca,
2697 .agc1_pt1 = 0x00,
2698 .agc1_pt2 = 0x00,
2699 .agc1_pt3 = 0x00,
2700 .agc1_slope1 = 0x00,
2701 .agc1_slope2 = 0x00,
2702 .agc2_pt1 = 0x00,
2703 .agc2_pt2 = 0x80,
2704 .agc2_slope1 = 0x1d,
2705 .agc2_slope2 = 0x1d,
2706 .alpha_mant = 0x11,
2707 .alpha_exp = 0x1b,
2708 .beta_mant = 0x17,
2709 .beta_exp = 0x33,
2710 .perform_agc_softsplit = 0x00,
2711 };
2712
2713 static struct dibx000_bandwidth_config stk7700p_xc4000_pll_config = {
2714 60000, 30000, /* internal, sampling */
2715 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */
2716 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, */
2717 /* ADClkSrc, modulo */
2718 (3 << 14) | (1 << 12) | 524, /* sad_cfg: refsel, sel, freq_15k */
2719 39370534, /* ifreq */
2720 20452225, /* timf */
2721 30000000 /* xtal */
2722 };
2723
2724 /* FIXME: none of these inputs are validated yet */
2725 static struct dib7000p_config pctv_340e_config = {
2726 .output_mpeg2_in_188_bytes = 1,
2727
2728 .agc_config_count = 1,
2729 .agc = &stk7700p_7000p_xc4000_agc_config,
2730 .bw = &stk7700p_xc4000_pll_config,
2731
2732 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
2733 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
2734 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
2735 };
2736
2737 /* PCTV 340e GPIOs map:
2738 dib0700:
2739 GPIO2 - CX25843 sleep
2740 GPIO3 - CS5340 reset
2741 GPIO5 - IRD
2742 GPIO6 - Power Supply
2743 GPIO8 - LNA (1=off 0=on)
2744 GPIO10 - CX25843 reset
2745 dib7000:
2746 GPIO8 - xc4000 reset
2747 */
2748 static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap)
2749 {
2750 struct dib0700_state *st = adap->dev->priv;
2751
2752 /* Power Supply on */
2753 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
2754 msleep(50);
2755 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2756 msleep(100); /* Allow power supply to settle before probing */
2757
2758 /* cx25843 reset */
2759 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2760 msleep(1); /* cx25843 datasheet say 350us required */
2761 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2762
2763 /* LNA off for now */
2764 dib0700_set_gpio(adap->dev, GPIO8, GPIO_OUT, 1);
2765
2766 /* Put the CX25843 to sleep for now since we're in digital mode */
2767 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
2768
2769 /* FIXME: not verified yet */
2770 dib0700_ctrl_clock(adap->dev, 72, 1);
2771
2772 msleep(500);
2773
2774 if (dib7000pc_detection(&adap->dev->i2c_adap) == 0) {
2775 /* Demodulator not found for some reason? */
2776 return -ENODEV;
2777 }
2778
2779 adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x12,
2780 &pctv_340e_config);
2781 st->is_dib7000pc = 1;
2782
2783 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2784 }
2785
2786 static struct xc4000_config dib7000p_xc4000_tunerconfig = {
2787 .i2c_address = 0x61,
2788 .default_pm = 1,
2789 .dvb_amplitude = 0,
2790 .set_smoothedcvbs = 0,
2791 .if_khz = 5400
2792 };
2793
2794 static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
2795 {
2796 struct i2c_adapter *tun_i2c;
2797
2798 /* The xc4000 is not on the main i2c bus */
2799 tun_i2c = dib7000p_get_i2c_master(adap->fe_adap[0].fe,
2800 DIBX000_I2C_INTERFACE_TUNER, 1);
2801 if (tun_i2c == NULL) {
2802 printk(KERN_ERR "Could not reach tuner i2c bus\n");
2803 return 0;
2804 }
2805
2806 /* Setup the reset callback */
2807 adap->fe_adap[0].fe->callback = dib0700_xc4000_tuner_callback;
2808
2809 return dvb_attach(xc4000_attach, adap->fe_adap[0].fe, tun_i2c,
2810 &dib7000p_xc4000_tunerconfig)
2811 == NULL ? -ENODEV : 0;
2812 }
2813
2814 static struct lgdt3305_config hcw_lgdt3305_config = {
2815 .i2c_addr = 0x0e,
2816 .mpeg_mode = LGDT3305_MPEG_PARALLEL,
2817 .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
2818 .tpvalid_polarity = LGDT3305_TP_VALID_LOW,
2819 .deny_i2c_rptr = 0,
2820 .spectral_inversion = 1,
2821 .qam_if_khz = 6000,
2822 .vsb_if_khz = 6000,
2823 .usref_8vsb = 0x0500,
2824 };
2825
2826 static struct mxl5007t_config hcw_mxl5007t_config = {
2827 .xtal_freq_hz = MxL_XTAL_25_MHZ,
2828 .if_freq_hz = MxL_IF_6_MHZ,
2829 .invert_if = 1,
2830 };
2831
2832 /* TIGER-ATSC map:
2833 GPIO0 - LNA_CTR (H: LNA power enabled, L: LNA power disabled)
2834 GPIO1 - ANT_SEL (H: VPA, L: MCX)
2835 GPIO4 - SCL2
2836 GPIO6 - EN_TUNER
2837 GPIO7 - SDA2
2838 GPIO10 - DEM_RST
2839
2840 MXL is behind LG's i2c repeater. LG is on SCL2/SDA2 gpios on the DIB
2841 */
2842 static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
2843 {
2844 struct dib0700_state *st = adap->dev->priv;
2845
2846 /* Make use of the new i2c functions from FW 1.20 */
2847 st->fw_use_new_i2c_api = 1;
2848
2849 st->disable_streaming_master_mode = 1;
2850
2851 /* fe power enable */
2852 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
2853 msleep(30);
2854 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2855 msleep(30);
2856
2857 /* demod reset */
2858 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2859 msleep(30);
2860 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2861 msleep(30);
2862 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2863 msleep(30);
2864
2865 adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach,
2866 &hcw_lgdt3305_config,
2867 &adap->dev->i2c_adap);
2868
2869 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
2870 }
2871
2872 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
2873 {
2874 return dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
2875 &adap->dev->i2c_adap, 0x60,
2876 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
2877 }
2878
2879
2880 /* DVB-USB and USB stuff follows */
2881 struct usb_device_id dib0700_usb_id_table[] = {
2882 /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) },
2883 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
2884 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
2885 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
2886 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
2887 /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
2888 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
2889 { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
2890 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
2891 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
2892 /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
2893 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
2894 { USB_DEVICE(USB_VID_TERRATEC,
2895 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
2896 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
2897 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
2898 /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) },
2899 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
2900 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
2901 { USB_DEVICE(USB_VID_PINNACLE,
2902 USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
2903 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
2904 /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
2905 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
2906 { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
2907 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
2908 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
2909 /* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
2910 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
2911 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
2912 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) },
2913 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) },
2914 /* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) },
2915 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) },
2916 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
2917 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) },
2918 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
2919 /* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
2920 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
2921 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U8000) },
2922 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700PH) },
2923 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
2924 /* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
2925 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
2926 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
2927 { USB_DEVICE(USB_VID_TERRATEC,
2928 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
2929 { USB_DEVICE(USB_VID_SONY, USB_PID_SONY_PLAYTV) },
2930 /* 45 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_PD378S) },
2931 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
2932 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
2933 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) },
2934 { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) },
2935 /* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) },
2936 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) },
2937 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) },
2938 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) },
2939 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) },
2940 /* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) },
2941 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) },
2942 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV73ESE) },
2943 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV282E) },
2944 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) },
2945 /* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
2946 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
2947 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
2948 { USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x000, 0x3f00) },
2949 { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
2950 /* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
2951 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
2952 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK8096GP) },
2953 { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DIVERSITY) },
2954 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_NIM9090M) },
2955 /* 70 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_NIM8096MD) },
2956 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_NIM9090MD) },
2957 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_NIM7090) },
2958 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_TFE7090PVR) },
2959 { USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_AIRSTAR_TELESTICK_2) },
2960 /* 75 */{ USB_DEVICE(USB_VID_MEDION, USB_PID_CREATIX_CTX1921) },
2961 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV340E) },
2962 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV340E_SE) },
2963 { 0 } /* Terminating entry */
2964 };
2965 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
2966
2967 #define DIB0700_DEFAULT_DEVICE_PROPERTIES \
2968 .caps = DVB_USB_IS_AN_I2C_ADAPTER, \
2969 .usb_ctrl = DEVICE_SPECIFIC, \
2970 .firmware = "dvb-usb-dib0700-1.20.fw", \
2971 .download_firmware = dib0700_download_firmware, \
2972 .no_reconnect = 1, \
2973 .size_of_priv = sizeof(struct dib0700_state), \
2974 .i2c_algo = &dib0700_i2c_algo, \
2975 .identify_state = dib0700_identify_state
2976
2977 #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
2978 .streaming_ctrl = dib0700_streaming_ctrl, \
2979 .stream = { \
2980 .type = USB_BULK, \
2981 .count = 4, \
2982 .endpoint = ep, \
2983 .u = { \
2984 .bulk = { \
2985 .buffersize = 39480, \
2986 } \
2987 } \
2988 }
2989
2990 struct dvb_usb_device_properties dib0700_devices[] = {
2991 {
2992 DIB0700_DEFAULT_DEVICE_PROPERTIES,
2993
2994 .num_adapters = 1,
2995 .adapter = {
2996 {
2997 .num_frontends = 1,
2998 .fe = {{
2999 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3000 .pid_filter_count = 32,
3001 .pid_filter = stk7700p_pid_filter,
3002 .pid_filter_ctrl = stk7700p_pid_filter_ctrl,
3003 .frontend_attach = stk7700p_frontend_attach,
3004 .tuner_attach = stk7700p_tuner_attach,
3005
3006 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3007 }},
3008 },
3009 },
3010
3011 .num_device_descs = 8,
3012 .devices = {
3013 { "DiBcom STK7700P reference design",
3014 { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
3015 { NULL },
3016 },
3017 { "Hauppauge Nova-T Stick",
3018 { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
3019 { NULL },
3020 },
3021 { "AVerMedia AVerTV DVB-T Volar",
3022 { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
3023 { NULL },
3024 },
3025 { "Compro Videomate U500",
3026 { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
3027 { NULL },
3028 },
3029 { "Uniwill STK7700P based (Hama and others)",
3030 { &dib0700_usb_id_table[7], NULL },
3031 { NULL },
3032 },
3033 { "Leadtek Winfast DTV Dongle (STK7700P based)",
3034 { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
3035 { NULL },
3036 },
3037 { "AVerMedia AVerTV DVB-T Express",
3038 { &dib0700_usb_id_table[20] },
3039 { NULL },
3040 },
3041 { "Gigabyte U7000",
3042 { &dib0700_usb_id_table[21], NULL },
3043 { NULL },
3044 }
3045 },
3046
3047 .rc.core = {
3048 .rc_interval = DEFAULT_RC_INTERVAL,
3049 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3050 .rc_query = dib0700_rc_query_old_firmware,
3051 .allowed_protos = RC_TYPE_RC5 |
3052 RC_TYPE_RC6 |
3053 RC_TYPE_NEC,
3054 .change_protocol = dib0700_change_protocol,
3055 },
3056 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3057
3058 .num_adapters = 2,
3059 .adapter = {
3060 {
3061 .num_frontends = 1,
3062 .fe = {{
3063 .frontend_attach = bristol_frontend_attach,
3064 .tuner_attach = bristol_tuner_attach,
3065
3066 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3067 }},
3068 }, {
3069 .num_frontends = 1,
3070 .fe = {{
3071 .frontend_attach = bristol_frontend_attach,
3072 .tuner_attach = bristol_tuner_attach,
3073
3074 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3075 }},
3076 }
3077 },
3078
3079 .num_device_descs = 1,
3080 .devices = {
3081 { "Hauppauge Nova-T 500 Dual DVB-T",
3082 { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
3083 { NULL },
3084 },
3085 },
3086
3087 .rc.core = {
3088 .rc_interval = DEFAULT_RC_INTERVAL,
3089 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3090 .rc_query = dib0700_rc_query_old_firmware,
3091 .allowed_protos = RC_TYPE_RC5 |
3092 RC_TYPE_RC6 |
3093 RC_TYPE_NEC,
3094 .change_protocol = dib0700_change_protocol,
3095 },
3096 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3097
3098 .num_adapters = 2,
3099 .adapter = {
3100 {
3101 .num_frontends = 1,
3102 .fe = {{
3103 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3104 .pid_filter_count = 32,
3105 .pid_filter = stk70x0p_pid_filter,
3106 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3107 .frontend_attach = stk7700d_frontend_attach,
3108 .tuner_attach = stk7700d_tuner_attach,
3109
3110 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3111 }},
3112 }, {
3113 .num_frontends = 1,
3114 .fe = {{
3115 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3116 .pid_filter_count = 32,
3117 .pid_filter = stk70x0p_pid_filter,
3118 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3119 .frontend_attach = stk7700d_frontend_attach,
3120 .tuner_attach = stk7700d_tuner_attach,
3121
3122 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3123 }},
3124 }
3125 },
3126
3127 .num_device_descs = 5,
3128 .devices = {
3129 { "Pinnacle PCTV 2000e",
3130 { &dib0700_usb_id_table[11], NULL },
3131 { NULL },
3132 },
3133 { "Terratec Cinergy DT XS Diversity",
3134 { &dib0700_usb_id_table[12], NULL },
3135 { NULL },
3136 },
3137 { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
3138 { &dib0700_usb_id_table[13], NULL },
3139 { NULL },
3140 },
3141 { "DiBcom STK7700D reference design",
3142 { &dib0700_usb_id_table[14], NULL },
3143 { NULL },
3144 },
3145 { "YUAN High-Tech DiBcom STK7700D",
3146 { &dib0700_usb_id_table[55], NULL },
3147 { NULL },
3148 },
3149
3150 },
3151
3152 .rc.core = {
3153 .rc_interval = DEFAULT_RC_INTERVAL,
3154 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3155 .rc_query = dib0700_rc_query_old_firmware,
3156 .allowed_protos = RC_TYPE_RC5 |
3157 RC_TYPE_RC6 |
3158 RC_TYPE_NEC,
3159 .change_protocol = dib0700_change_protocol,
3160 },
3161 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3162
3163 .num_adapters = 1,
3164 .adapter = {
3165 {
3166 .num_frontends = 1,
3167 .fe = {{
3168 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3169 .pid_filter_count = 32,
3170 .pid_filter = stk70x0p_pid_filter,
3171 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3172 .frontend_attach = stk7700P2_frontend_attach,
3173 .tuner_attach = stk7700d_tuner_attach,
3174
3175 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3176 }},
3177 },
3178 },
3179
3180 .num_device_descs = 3,
3181 .devices = {
3182 { "ASUS My Cinema U3000 Mini DVBT Tuner",
3183 { &dib0700_usb_id_table[23], NULL },
3184 { NULL },
3185 },
3186 { "Yuan EC372S",
3187 { &dib0700_usb_id_table[31], NULL },
3188 { NULL },
3189 },
3190 { "Terratec Cinergy T Express",
3191 { &dib0700_usb_id_table[42], NULL },
3192 { NULL },
3193 }
3194 },
3195
3196 .rc.core = {
3197 .rc_interval = DEFAULT_RC_INTERVAL,
3198 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3199 .module_name = "dib0700",
3200 .rc_query = dib0700_rc_query_old_firmware,
3201 .allowed_protos = RC_TYPE_RC5 |
3202 RC_TYPE_RC6 |
3203 RC_TYPE_NEC,
3204 .change_protocol = dib0700_change_protocol,
3205 },
3206 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3207
3208 .num_adapters = 1,
3209 .adapter = {
3210 {
3211 .num_frontends = 1,
3212 .fe = {{
3213 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3214 .pid_filter_count = 32,
3215 .pid_filter = stk70x0p_pid_filter,
3216 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3217 .frontend_attach = stk7070p_frontend_attach,
3218 .tuner_attach = dib7070p_tuner_attach,
3219
3220 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3221 }},
3222 .size_of_priv = sizeof(struct dib0700_adapter_state),
3223 },
3224 },
3225
3226 .num_device_descs = 11,
3227 .devices = {
3228 { "DiBcom STK7070P reference design",
3229 { &dib0700_usb_id_table[15], NULL },
3230 { NULL },
3231 },
3232 { "Pinnacle PCTV DVB-T Flash Stick",
3233 { &dib0700_usb_id_table[16], NULL },
3234 { NULL },
3235 },
3236 { "Artec T14BR DVB-T",
3237 { &dib0700_usb_id_table[22], NULL },
3238 { NULL },
3239 },
3240 { "ASUS My Cinema U3100 Mini DVBT Tuner",
3241 { &dib0700_usb_id_table[24], NULL },
3242 { NULL },
3243 },
3244 { "Hauppauge Nova-T Stick",
3245 { &dib0700_usb_id_table[25], NULL },
3246 { NULL },
3247 },
3248 { "Hauppauge Nova-T MyTV.t",
3249 { &dib0700_usb_id_table[26], NULL },
3250 { NULL },
3251 },
3252 { "Pinnacle PCTV 72e",
3253 { &dib0700_usb_id_table[29], NULL },
3254 { NULL },
3255 },
3256 { "Pinnacle PCTV 73e",
3257 { &dib0700_usb_id_table[30], NULL },
3258 { NULL },
3259 },
3260 { "Elgato EyeTV DTT",
3261 { &dib0700_usb_id_table[49], NULL },
3262 { NULL },
3263 },
3264 { "Yuan PD378S",
3265 { &dib0700_usb_id_table[45], NULL },
3266 { NULL },
3267 },
3268 { "Elgato EyeTV Dtt Dlx PD378S",
3269 { &dib0700_usb_id_table[50], NULL },
3270 { NULL },
3271 },
3272 },
3273
3274 .rc.core = {
3275 .rc_interval = DEFAULT_RC_INTERVAL,
3276 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3277 .module_name = "dib0700",
3278 .rc_query = dib0700_rc_query_old_firmware,
3279 .allowed_protos = RC_TYPE_RC5 |
3280 RC_TYPE_RC6 |
3281 RC_TYPE_NEC,
3282 .change_protocol = dib0700_change_protocol,
3283 },
3284 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3285
3286 .num_adapters = 1,
3287 .adapter = {
3288 {
3289 .num_frontends = 1,
3290 .fe = {{
3291 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3292 .pid_filter_count = 32,
3293 .pid_filter = stk70x0p_pid_filter,
3294 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3295 .frontend_attach = stk7070p_frontend_attach,
3296 .tuner_attach = dib7070p_tuner_attach,
3297
3298 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3299 }},
3300 .size_of_priv = sizeof(struct dib0700_adapter_state),
3301 },
3302 },
3303
3304 .num_device_descs = 3,
3305 .devices = {
3306 { "Pinnacle PCTV 73A",
3307 { &dib0700_usb_id_table[56], NULL },
3308 { NULL },
3309 },
3310 { "Pinnacle PCTV 73e SE",
3311 { &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL },
3312 { NULL },
3313 },
3314 { "Pinnacle PCTV 282e",
3315 { &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL },
3316 { NULL },
3317 },
3318 },
3319
3320 .rc.core = {
3321 .rc_interval = DEFAULT_RC_INTERVAL,
3322 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3323 .module_name = "dib0700",
3324 .rc_query = dib0700_rc_query_old_firmware,
3325 .allowed_protos = RC_TYPE_RC5 |
3326 RC_TYPE_RC6 |
3327 RC_TYPE_NEC,
3328 .change_protocol = dib0700_change_protocol,
3329 },
3330 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3331
3332 .num_adapters = 2,
3333 .adapter = {
3334 {
3335 .num_frontends = 1,
3336 .fe = {{
3337 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3338 .pid_filter_count = 32,
3339 .pid_filter = stk70x0p_pid_filter,
3340 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3341 .frontend_attach = stk7070pd_frontend_attach0,
3342 .tuner_attach = dib7070p_tuner_attach,
3343
3344 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3345 }},
3346 .size_of_priv = sizeof(struct dib0700_adapter_state),
3347 }, {
3348 .num_frontends = 1,
3349 .fe = {{
3350 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3351 .pid_filter_count = 32,
3352 .pid_filter = stk70x0p_pid_filter,
3353 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3354 .frontend_attach = stk7070pd_frontend_attach1,
3355 .tuner_attach = dib7070p_tuner_attach,
3356
3357 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3358 }},
3359 .size_of_priv = sizeof(struct dib0700_adapter_state),
3360 }
3361 },
3362
3363 .num_device_descs = 6,
3364 .devices = {
3365 { "DiBcom STK7070PD reference design",
3366 { &dib0700_usb_id_table[17], NULL },
3367 { NULL },
3368 },
3369 { "Pinnacle PCTV Dual DVB-T Diversity Stick",
3370 { &dib0700_usb_id_table[18], NULL },
3371 { NULL },
3372 },
3373 { "Hauppauge Nova-TD Stick (52009)",
3374 { &dib0700_usb_id_table[35], NULL },
3375 { NULL },
3376 },
3377 { "Hauppauge Nova-TD-500 (84xxx)",
3378 { &dib0700_usb_id_table[36], NULL },
3379 { NULL },
3380 },
3381 { "Terratec Cinergy DT USB XS Diversity/ T5",
3382 { &dib0700_usb_id_table[43],
3383 &dib0700_usb_id_table[53], NULL},
3384 { NULL },
3385 },
3386 { "Sony PlayTV",
3387 { &dib0700_usb_id_table[44], NULL },
3388 { NULL },
3389 },
3390 },
3391
3392 .rc.core = {
3393 .rc_interval = DEFAULT_RC_INTERVAL,
3394 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3395 .module_name = "dib0700",
3396 .rc_query = dib0700_rc_query_old_firmware,
3397 .allowed_protos = RC_TYPE_RC5 |
3398 RC_TYPE_RC6 |
3399 RC_TYPE_NEC,
3400 .change_protocol = dib0700_change_protocol,
3401 },
3402 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3403
3404 .num_adapters = 2,
3405 .adapter = {
3406 {
3407 .num_frontends = 1,
3408 .fe = {{
3409 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3410 .pid_filter_count = 32,
3411 .pid_filter = stk70x0p_pid_filter,
3412 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3413 .frontend_attach = stk7070pd_frontend_attach0,
3414 .tuner_attach = dib7070p_tuner_attach,
3415
3416 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3417 }},
3418 .size_of_priv = sizeof(struct dib0700_adapter_state),
3419 }, {
3420 .num_frontends = 1,
3421 .fe = {{
3422 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3423 .pid_filter_count = 32,
3424 .pid_filter = stk70x0p_pid_filter,
3425 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3426 .frontend_attach = stk7070pd_frontend_attach1,
3427 .tuner_attach = dib7070p_tuner_attach,
3428
3429 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3430 }},
3431 .size_of_priv = sizeof(struct dib0700_adapter_state),
3432 }
3433 },
3434
3435 .num_device_descs = 1,
3436 .devices = {
3437 { "Elgato EyeTV Diversity",
3438 { &dib0700_usb_id_table[68], NULL },
3439 { NULL },
3440 },
3441 },
3442
3443 .rc.core = {
3444 .rc_interval = DEFAULT_RC_INTERVAL,
3445 .rc_codes = RC_MAP_DIB0700_NEC_TABLE,
3446 .module_name = "dib0700",
3447 .rc_query = dib0700_rc_query_old_firmware,
3448 .allowed_protos = RC_TYPE_RC5 |
3449 RC_TYPE_RC6 |
3450 RC_TYPE_NEC,
3451 .change_protocol = dib0700_change_protocol,
3452 },
3453 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3454
3455 .num_adapters = 1,
3456 .adapter = {
3457 {
3458 .num_frontends = 1,
3459 .fe = {{
3460 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3461 .pid_filter_count = 32,
3462 .pid_filter = stk70x0p_pid_filter,
3463 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3464 .frontend_attach = stk7700ph_frontend_attach,
3465 .tuner_attach = stk7700ph_tuner_attach,
3466
3467 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3468 }},
3469 .size_of_priv = sizeof(struct
3470 dib0700_adapter_state),
3471 },
3472 },
3473
3474 .num_device_descs = 9,
3475 .devices = {
3476 { "Terratec Cinergy HT USB XE",
3477 { &dib0700_usb_id_table[27], NULL },
3478 { NULL },
3479 },
3480 { "Pinnacle Expresscard 320cx",
3481 { &dib0700_usb_id_table[28], NULL },
3482 { NULL },
3483 },
3484 { "Terratec Cinergy HT Express",
3485 { &dib0700_usb_id_table[32], NULL },
3486 { NULL },
3487 },
3488 { "Gigabyte U8000-RH",
3489 { &dib0700_usb_id_table[37], NULL },
3490 { NULL },
3491 },
3492 { "YUAN High-Tech STK7700PH",
3493 { &dib0700_usb_id_table[38], NULL },
3494 { NULL },
3495 },
3496 { "Asus My Cinema-U3000Hybrid",
3497 { &dib0700_usb_id_table[39], NULL },
3498 { NULL },
3499 },
3500 { "YUAN High-Tech MC770",
3501 { &dib0700_usb_id_table[48], NULL },
3502 { NULL },
3503 },
3504 { "Leadtek WinFast DTV Dongle H",
3505 { &dib0700_usb_id_table[51], NULL },
3506 { NULL },
3507 },
3508 { "YUAN High-Tech STK7700D",
3509 { &dib0700_usb_id_table[54], NULL },
3510 { NULL },
3511 },
3512 },
3513
3514 .rc.core = {
3515 .rc_interval = DEFAULT_RC_INTERVAL,
3516 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3517 .module_name = "dib0700",
3518 .rc_query = dib0700_rc_query_old_firmware,
3519 .allowed_protos = RC_TYPE_RC5 |
3520 RC_TYPE_RC6 |
3521 RC_TYPE_NEC,
3522 .change_protocol = dib0700_change_protocol,
3523 },
3524 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3525 .num_adapters = 1,
3526 .adapter = {
3527 {
3528 .num_frontends = 1,
3529 .fe = {{
3530 .frontend_attach = s5h1411_frontend_attach,
3531 .tuner_attach = xc5000_tuner_attach,
3532
3533 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3534 }},
3535 .size_of_priv = sizeof(struct
3536 dib0700_adapter_state),
3537 },
3538 },
3539
3540 .num_device_descs = 2,
3541 .devices = {
3542 { "Pinnacle PCTV HD Pro USB Stick",
3543 { &dib0700_usb_id_table[40], NULL },
3544 { NULL },
3545 },
3546 { "Pinnacle PCTV HD USB Stick",
3547 { &dib0700_usb_id_table[41], NULL },
3548 { NULL },
3549 },
3550 },
3551
3552 .rc.core = {
3553 .rc_interval = DEFAULT_RC_INTERVAL,
3554 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3555 .module_name = "dib0700",
3556 .rc_query = dib0700_rc_query_old_firmware,
3557 .allowed_protos = RC_TYPE_RC5 |
3558 RC_TYPE_RC6 |
3559 RC_TYPE_NEC,
3560 .change_protocol = dib0700_change_protocol,
3561 },
3562 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3563 .num_adapters = 1,
3564 .adapter = {
3565 {
3566 .num_frontends = 1,
3567 .fe = {{
3568 .frontend_attach = lgdt3305_frontend_attach,
3569 .tuner_attach = mxl5007t_tuner_attach,
3570
3571 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3572 }},
3573 .size_of_priv = sizeof(struct
3574 dib0700_adapter_state),
3575 },
3576 },
3577
3578 .num_device_descs = 2,
3579 .devices = {
3580 { "Hauppauge ATSC MiniCard (B200)",
3581 { &dib0700_usb_id_table[46], NULL },
3582 { NULL },
3583 },
3584 { "Hauppauge ATSC MiniCard (B210)",
3585 { &dib0700_usb_id_table[47], NULL },
3586 { NULL },
3587 },
3588 },
3589 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3590
3591 .num_adapters = 1,
3592 .adapter = {
3593 {
3594 .num_frontends = 1,
3595 .fe = {{
3596 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3597 .pid_filter_count = 32,
3598 .pid_filter = stk70x0p_pid_filter,
3599 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3600 .frontend_attach = stk7770p_frontend_attach,
3601 .tuner_attach = dib7770p_tuner_attach,
3602
3603 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3604 }},
3605 .size_of_priv =
3606 sizeof(struct dib0700_adapter_state),
3607 },
3608 },
3609
3610 .num_device_descs = 4,
3611 .devices = {
3612 { "DiBcom STK7770P reference design",
3613 { &dib0700_usb_id_table[59], NULL },
3614 { NULL },
3615 },
3616 { "Terratec Cinergy T USB XXS (HD)/ T3",
3617 { &dib0700_usb_id_table[33],
3618 &dib0700_usb_id_table[52],
3619 &dib0700_usb_id_table[60], NULL},
3620 { NULL },
3621 },
3622 { "TechniSat AirStar TeleStick 2",
3623 { &dib0700_usb_id_table[74], NULL },
3624 { NULL },
3625 },
3626 { "Medion CTX1921 DVB-T USB",
3627 { &dib0700_usb_id_table[75], NULL },
3628 { NULL },
3629 },
3630 },
3631
3632 .rc.core = {
3633 .rc_interval = DEFAULT_RC_INTERVAL,
3634 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3635 .module_name = "dib0700",
3636 .rc_query = dib0700_rc_query_old_firmware,
3637 .allowed_protos = RC_TYPE_RC5 |
3638 RC_TYPE_RC6 |
3639 RC_TYPE_NEC,
3640 .change_protocol = dib0700_change_protocol,
3641 },
3642 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3643 .num_adapters = 1,
3644 .adapter = {
3645 {
3646 .num_frontends = 1,
3647 .fe = {{
3648 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3649 .pid_filter_count = 32,
3650 .pid_filter = stk80xx_pid_filter,
3651 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
3652 .frontend_attach = stk807x_frontend_attach,
3653 .tuner_attach = dib807x_tuner_attach,
3654
3655 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3656 }},
3657 .size_of_priv =
3658 sizeof(struct dib0700_adapter_state),
3659 },
3660 },
3661
3662 .num_device_descs = 3,
3663 .devices = {
3664 { "DiBcom STK807xP reference design",
3665 { &dib0700_usb_id_table[62], NULL },
3666 { NULL },
3667 },
3668 { "Prolink Pixelview SBTVD",
3669 { &dib0700_usb_id_table[63], NULL },
3670 { NULL },
3671 },
3672 { "EvolutePC TVWay+",
3673 { &dib0700_usb_id_table[64], NULL },
3674 { NULL },
3675 },
3676 },
3677
3678 .rc.core = {
3679 .rc_interval = DEFAULT_RC_INTERVAL,
3680 .rc_codes = RC_MAP_DIB0700_NEC_TABLE,
3681 .module_name = "dib0700",
3682 .rc_query = dib0700_rc_query_old_firmware,
3683 .allowed_protos = RC_TYPE_RC5 |
3684 RC_TYPE_RC6 |
3685 RC_TYPE_NEC,
3686 .change_protocol = dib0700_change_protocol,
3687 },
3688 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3689 .num_adapters = 2,
3690 .adapter = {
3691 {
3692 .num_frontends = 1,
3693 .fe = {{
3694 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3695 .pid_filter_count = 32,
3696 .pid_filter = stk80xx_pid_filter,
3697 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
3698 .frontend_attach = stk807xpvr_frontend_attach0,
3699 .tuner_attach = dib807x_tuner_attach,
3700
3701 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3702 }},
3703 .size_of_priv =
3704 sizeof(struct dib0700_adapter_state),
3705 },
3706 {
3707 .num_frontends = 1,
3708 .fe = {{
3709 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3710 .pid_filter_count = 32,
3711 .pid_filter = stk80xx_pid_filter,
3712 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
3713 .frontend_attach = stk807xpvr_frontend_attach1,
3714 .tuner_attach = dib807x_tuner_attach,
3715
3716 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3717 }},
3718 .size_of_priv =
3719 sizeof(struct dib0700_adapter_state),
3720 },
3721 },
3722
3723 .num_device_descs = 1,
3724 .devices = {
3725 { "DiBcom STK807xPVR reference design",
3726 { &dib0700_usb_id_table[61], NULL },
3727 { NULL },
3728 },
3729 },
3730
3731 .rc.core = {
3732 .rc_interval = DEFAULT_RC_INTERVAL,
3733 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3734 .module_name = "dib0700",
3735 .rc_query = dib0700_rc_query_old_firmware,
3736 .allowed_protos = RC_TYPE_RC5 |
3737 RC_TYPE_RC6 |
3738 RC_TYPE_NEC,
3739 .change_protocol = dib0700_change_protocol,
3740 },
3741 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3742 .num_adapters = 1,
3743 .adapter = {
3744 {
3745 .num_frontends = 1,
3746 .fe = {{
3747 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3748 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3749 .pid_filter_count = 32,
3750 .pid_filter = stk80xx_pid_filter,
3751 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
3752 .frontend_attach = stk809x_frontend_attach,
3753 .tuner_attach = dib809x_tuner_attach,
3754
3755 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3756 }},
3757 .size_of_priv =
3758 sizeof(struct dib0700_adapter_state),
3759 },
3760 },
3761
3762 .num_device_descs = 1,
3763 .devices = {
3764 { "DiBcom STK8096GP reference design",
3765 { &dib0700_usb_id_table[67], NULL },
3766 { NULL },
3767 },
3768 },
3769
3770 .rc.core = {
3771 .rc_interval = DEFAULT_RC_INTERVAL,
3772 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3773 .module_name = "dib0700",
3774 .rc_query = dib0700_rc_query_old_firmware,
3775 .allowed_protos = RC_TYPE_RC5 |
3776 RC_TYPE_RC6 |
3777 RC_TYPE_NEC,
3778 .change_protocol = dib0700_change_protocol,
3779 },
3780 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3781 .num_adapters = 1,
3782 .adapter = {
3783 {
3784 .num_frontends = 1,
3785 .fe = {{
3786 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3787 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3788 .pid_filter_count = 32,
3789 .pid_filter = dib90x0_pid_filter,
3790 .pid_filter_ctrl = dib90x0_pid_filter_ctrl,
3791 .frontend_attach = stk9090m_frontend_attach,
3792 .tuner_attach = dib9090_tuner_attach,
3793
3794 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3795 }},
3796 .size_of_priv =
3797 sizeof(struct dib0700_adapter_state),
3798 },
3799 },
3800
3801 .num_device_descs = 1,
3802 .devices = {
3803 { "DiBcom STK9090M reference design",
3804 { &dib0700_usb_id_table[69], NULL },
3805 { NULL },
3806 },
3807 },
3808
3809 .rc.core = {
3810 .rc_interval = DEFAULT_RC_INTERVAL,
3811 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3812 .module_name = "dib0700",
3813 .rc_query = dib0700_rc_query_old_firmware,
3814 .allowed_protos = RC_TYPE_RC5 |
3815 RC_TYPE_RC6 |
3816 RC_TYPE_NEC,
3817 .change_protocol = dib0700_change_protocol,
3818 },
3819 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3820 .num_adapters = 1,
3821 .adapter = {
3822 {
3823 .num_frontends = 1,
3824 .fe = {{
3825 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3826 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3827 .pid_filter_count = 32,
3828 .pid_filter = stk80xx_pid_filter,
3829 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
3830 .frontend_attach = nim8096md_frontend_attach,
3831 .tuner_attach = nim8096md_tuner_attach,
3832
3833 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3834 }},
3835 .size_of_priv =
3836 sizeof(struct dib0700_adapter_state),
3837 },
3838 },
3839
3840 .num_device_descs = 1,
3841 .devices = {
3842 { "DiBcom NIM8096MD reference design",
3843 { &dib0700_usb_id_table[70], NULL },
3844 { NULL },
3845 },
3846 },
3847
3848 .rc.core = {
3849 .rc_interval = DEFAULT_RC_INTERVAL,
3850 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3851 .module_name = "dib0700",
3852 .rc_query = dib0700_rc_query_old_firmware,
3853 .allowed_protos = RC_TYPE_RC5 |
3854 RC_TYPE_RC6 |
3855 RC_TYPE_NEC,
3856 .change_protocol = dib0700_change_protocol,
3857 },
3858 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3859 .num_adapters = 1,
3860 .adapter = {
3861 {
3862 .num_frontends = 1,
3863 .fe = {{
3864 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3865 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3866 .pid_filter_count = 32,
3867 .pid_filter = dib90x0_pid_filter,
3868 .pid_filter_ctrl = dib90x0_pid_filter_ctrl,
3869 .frontend_attach = nim9090md_frontend_attach,
3870 .tuner_attach = nim9090md_tuner_attach,
3871
3872 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3873 }},
3874 .size_of_priv =
3875 sizeof(struct dib0700_adapter_state),
3876 },
3877 },
3878
3879 .num_device_descs = 1,
3880 .devices = {
3881 { "DiBcom NIM9090MD reference design",
3882 { &dib0700_usb_id_table[71], NULL },
3883 { NULL },
3884 },
3885 },
3886
3887 .rc.core = {
3888 .rc_interval = DEFAULT_RC_INTERVAL,
3889 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3890 .module_name = "dib0700",
3891 .rc_query = dib0700_rc_query_old_firmware,
3892 .allowed_protos = RC_TYPE_RC5 |
3893 RC_TYPE_RC6 |
3894 RC_TYPE_NEC,
3895 .change_protocol = dib0700_change_protocol,
3896 },
3897 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3898 .num_adapters = 1,
3899 .adapter = {
3900 {
3901 .num_frontends = 1,
3902 .fe = {{
3903 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3904 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3905 .pid_filter_count = 32,
3906 .pid_filter = stk70x0p_pid_filter,
3907 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3908 .frontend_attach = nim7090_frontend_attach,
3909 .tuner_attach = nim7090_tuner_attach,
3910
3911 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3912 }},
3913 .size_of_priv =
3914 sizeof(struct dib0700_adapter_state),
3915 },
3916 },
3917
3918 .num_device_descs = 1,
3919 .devices = {
3920 { "DiBcom NIM7090 reference design",
3921 { &dib0700_usb_id_table[72], NULL },
3922 { NULL },
3923 },
3924 },
3925
3926 .rc.core = {
3927 .rc_interval = DEFAULT_RC_INTERVAL,
3928 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3929 .module_name = "dib0700",
3930 .rc_query = dib0700_rc_query_old_firmware,
3931 .allowed_protos = RC_TYPE_RC5 |
3932 RC_TYPE_RC6 |
3933 RC_TYPE_NEC,
3934 .change_protocol = dib0700_change_protocol,
3935 },
3936 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3937 .num_adapters = 2,
3938 .adapter = {
3939 {
3940 .num_frontends = 1,
3941 .fe = {{
3942 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3943 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3944 .pid_filter_count = 32,
3945 .pid_filter = stk70x0p_pid_filter,
3946 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3947 .frontend_attach = tfe7090pvr_frontend0_attach,
3948 .tuner_attach = tfe7090pvr_tuner0_attach,
3949
3950 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
3951 }},
3952 .size_of_priv =
3953 sizeof(struct dib0700_adapter_state),
3954 },
3955 {
3956 .num_frontends = 1,
3957 .fe = {{
3958 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
3959 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
3960 .pid_filter_count = 32,
3961 .pid_filter = stk70x0p_pid_filter,
3962 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
3963 .frontend_attach = tfe7090pvr_frontend1_attach,
3964 .tuner_attach = tfe7090pvr_tuner1_attach,
3965
3966 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
3967 }},
3968 .size_of_priv =
3969 sizeof(struct dib0700_adapter_state),
3970 },
3971 },
3972
3973 .num_device_descs = 1,
3974 .devices = {
3975 { "DiBcom TFE7090PVR reference design",
3976 { &dib0700_usb_id_table[73], NULL },
3977 { NULL },
3978 },
3979 },
3980
3981 .rc.core = {
3982 .rc_interval = DEFAULT_RC_INTERVAL,
3983 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
3984 .module_name = "dib0700",
3985 .rc_query = dib0700_rc_query_old_firmware,
3986 .allowed_protos = RC_TYPE_RC5 |
3987 RC_TYPE_RC6 |
3988 RC_TYPE_NEC,
3989 .change_protocol = dib0700_change_protocol,
3990 },
3991 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
3992 .num_adapters = 1,
3993 .adapter = {
3994 {
3995 .num_frontends = 1,
3996 .fe = {{
3997 .frontend_attach = pctv340e_frontend_attach,
3998 .tuner_attach = xc4000_tuner_attach,
3999
4000 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
4001 }},
4002 .size_of_priv = sizeof(struct
4003 dib0700_adapter_state),
4004 },
4005 },
4006
4007 .num_device_descs = 2,
4008 .devices = {
4009 { "Pinnacle PCTV 340e HD Pro USB Stick",
4010 { &dib0700_usb_id_table[76], NULL },
4011 { NULL },
4012 },
4013 { "Pinnacle PCTV Hybrid Stick Solo",
4014 { &dib0700_usb_id_table[77], NULL },
4015 { NULL },
4016 },
4017 },
4018 .rc.core = {
4019 .rc_interval = DEFAULT_RC_INTERVAL,
4020 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
4021 .module_name = "dib0700",
4022 .rc_query = dib0700_rc_query_old_firmware,
4023 .allowed_protos = RC_TYPE_RC5 |
4024 RC_TYPE_RC6 |
4025 RC_TYPE_NEC,
4026 .change_protocol = dib0700_change_protocol,
4027 },
4028 },
4029 };
4030
4031 int dib0700_device_count = ARRAY_SIZE(dib0700_devices);
This page took 0.131618 seconds and 5 git commands to generate.