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