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