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