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