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 "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 fallthrough; 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 /* FIXME: if adap->id != 0, check if it is fe_adap[1] */ 1742 if (!dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config)) 1743 return -ENODEV; 1744 1745 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 1746 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override; 1747 return 0; 1748 } 1749 1750 static int stk809x_frontend_attach(struct dvb_usb_adapter *adap) 1751 { 1752 struct dib0700_adapter_state *state = adap->priv; 1753 1754 if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 1755 return -ENODEV; 1756 1757 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 1758 msleep(10); 1759 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 1760 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 1761 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 1762 1763 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 1764 1765 dib0700_ctrl_clock(adap->dev, 72, 1); 1766 1767 msleep(10); 1768 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 1769 msleep(10); 1770 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 1771 1772 state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80, 0); 1773 1774 adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]); 1775 1776 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 1777 } 1778 1779 static int stk809x_frontend1_attach(struct dvb_usb_adapter *adap) 1780 { 1781 struct dib0700_adapter_state *state = adap->priv; 1782 1783 if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 1784 return -ENODEV; 1785 1786 state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x82, 0); 1787 1788 adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]); 1789 1790 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 1791 } 1792 1793 static int nim8096md_tuner_attach(struct dvb_usb_adapter *adap) 1794 { 1795 struct dib0700_adapter_state *st = adap->priv; 1796 struct i2c_adapter *tun_i2c; 1797 struct dvb_frontend *fe_slave = st->dib8000_ops.get_slave_frontend(adap->fe_adap[0].fe, 1); 1798 1799 if (fe_slave) { 1800 tun_i2c = st->dib8000_ops.get_i2c_master(fe_slave, DIBX000_I2C_INTERFACE_TUNER, 1); 1801 if (dvb_attach(dib0090_register, fe_slave, tun_i2c, &dib809x_dib0090_config) == NULL) 1802 return -ENODEV; 1803 fe_slave->dvb = adap->fe_adap[0].fe->dvb; 1804 fe_slave->ops.tuner_ops.set_params = dib8096_set_param_override; 1805 } 1806 tun_i2c = st->dib8000_ops.get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_TUNER, 1); 1807 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &dib809x_dib0090_config) == NULL) 1808 return -ENODEV; 1809 1810 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 1811 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096_set_param_override; 1812 1813 return 0; 1814 } 1815 1816 static int nim8096md_frontend_attach(struct dvb_usb_adapter *adap) 1817 { 1818 struct dvb_frontend *fe_slave; 1819 struct dib0700_adapter_state *state = adap->priv; 1820 1821 if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 1822 return -ENODEV; 1823 1824 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 1825 msleep(20); 1826 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 1827 msleep(1000); 1828 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 1829 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 1830 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 1831 1832 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 1833 1834 dib0700_ctrl_clock(adap->dev, 72, 1); 1835 1836 msleep(20); 1837 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 1838 msleep(20); 1839 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 1840 1841 state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 0x80, 0); 1842 1843 adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config[0]); 1844 if (adap->fe_adap[0].fe == NULL) 1845 return -ENODEV; 1846 1847 /* Needed to increment refcount */ 1848 if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 1849 return -ENODEV; 1850 1851 fe_slave = state->dib8000_ops.init(&adap->dev->i2c_adap, 0x82, &dib809x_dib8000_config[1]); 1852 state->dib8000_ops.set_slave_frontend(adap->fe_adap[0].fe, fe_slave); 1853 1854 return fe_slave == NULL ? -ENODEV : 0; 1855 } 1856 1857 /* TFE8096P */ 1858 static struct dibx000_agc_config dib8096p_agc_config[2] = { 1859 { 1860 .band_caps = BAND_UHF, 1861 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, 1862 P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, 1863 P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, 1864 P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, 1865 P_agc_write=0 */ 1866 .setup = (0 << 15) | (0 << 14) | (5 << 11) 1867 | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) 1868 | (0 << 4) | (5 << 1) | (0 << 0), 1869 1870 .inv_gain = 684, 1871 .time_stabiliz = 10, 1872 1873 .alpha_level = 0, 1874 .thlock = 118, 1875 1876 .wbd_inv = 0, 1877 .wbd_ref = 1200, 1878 .wbd_sel = 3, 1879 .wbd_alpha = 5, 1880 1881 .agc1_max = 65535, 1882 .agc1_min = 0, 1883 1884 .agc2_max = 32767, 1885 .agc2_min = 0, 1886 1887 .agc1_pt1 = 0, 1888 .agc1_pt2 = 0, 1889 .agc1_pt3 = 105, 1890 .agc1_slope1 = 0, 1891 .agc1_slope2 = 156, 1892 .agc2_pt1 = 105, 1893 .agc2_pt2 = 255, 1894 .agc2_slope1 = 54, 1895 .agc2_slope2 = 0, 1896 1897 .alpha_mant = 28, 1898 .alpha_exp = 26, 1899 .beta_mant = 31, 1900 .beta_exp = 51, 1901 1902 .perform_agc_softsplit = 0, 1903 } , { 1904 .band_caps = BAND_FM | BAND_VHF | BAND_CBAND, 1905 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, 1906 P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, 1907 P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, 1908 P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, 1909 P_agc_write=0 */ 1910 .setup = (0 << 15) | (0 << 14) | (5 << 11) 1911 | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) 1912 | (0 << 4) | (5 << 1) | (0 << 0), 1913 1914 .inv_gain = 732, 1915 .time_stabiliz = 10, 1916 1917 .alpha_level = 0, 1918 .thlock = 118, 1919 1920 .wbd_inv = 0, 1921 .wbd_ref = 1200, 1922 .wbd_sel = 3, 1923 .wbd_alpha = 5, 1924 1925 .agc1_max = 65535, 1926 .agc1_min = 0, 1927 1928 .agc2_max = 32767, 1929 .agc2_min = 0, 1930 1931 .agc1_pt1 = 0, 1932 .agc1_pt2 = 0, 1933 .agc1_pt3 = 98, 1934 .agc1_slope1 = 0, 1935 .agc1_slope2 = 167, 1936 .agc2_pt1 = 98, 1937 .agc2_pt2 = 255, 1938 .agc2_slope1 = 52, 1939 .agc2_slope2 = 0, 1940 1941 .alpha_mant = 28, 1942 .alpha_exp = 26, 1943 .beta_mant = 31, 1944 .beta_exp = 51, 1945 1946 .perform_agc_softsplit = 0, 1947 } 1948 }; 1949 1950 static struct dibx000_bandwidth_config dib8096p_clock_config_12_mhz = { 1951 .internal = 108000, 1952 .sampling = 13500, 1953 .pll_prediv = 1, 1954 .pll_ratio = 9, 1955 .pll_range = 1, 1956 .pll_reset = 0, 1957 .pll_bypass = 0, 1958 .enable_refdiv = 0, 1959 .bypclk_div = 0, 1960 .IO_CLK_en_core = 0, 1961 .ADClkSrc = 0, 1962 .modulo = 2, 1963 .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), 1964 .ifreq = (0 << 25) | 0, 1965 .timf = 20199729, 1966 .xtal_hz = 12000000, 1967 }; 1968 1969 static struct dib8000_config tfe8096p_dib8000_config = { 1970 .output_mpeg2_in_188_bytes = 1, 1971 .hostbus_diversity = 1, 1972 .update_lna = NULL, 1973 1974 .agc_config_count = 2, 1975 .agc = dib8096p_agc_config, 1976 .pll = &dib8096p_clock_config_12_mhz, 1977 1978 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS, 1979 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES, 1980 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS, 1981 1982 .agc_control = NULL, 1983 .diversity_delay = 48, 1984 .output_mode = OUTMODE_MPEG2_FIFO, 1985 .enMpegOutput = 1, 1986 }; 1987 1988 static struct dib0090_wbd_slope dib8096p_wbd_table[] = { 1989 { 380, 81, 850, 64, 540, 4}, 1990 { 860, 51, 866, 21, 375, 4}, 1991 {1700, 0, 250, 0, 100, 6}, 1992 {2600, 0, 250, 0, 100, 6}, 1993 { 0xFFFF, 0, 0, 0, 0, 0}, 1994 }; 1995 1996 static struct dib0090_config tfe8096p_dib0090_config = { 1997 .io.clock_khz = 12000, 1998 .io.pll_bypass = 0, 1999 .io.pll_range = 0, 2000 .io.pll_prediv = 3, 2001 .io.pll_loopdiv = 6, 2002 .io.adc_clock_ratio = 0, 2003 .io.pll_int_loop_filt = 0, 2004 2005 .freq_offset_khz_uhf = -143, 2006 .freq_offset_khz_vhf = -143, 2007 2008 .get_adc_power = dib8090_get_adc_power, 2009 2010 .clkouttobamse = 1, 2011 .analog_output = 0, 2012 2013 .wbd_vhf_offset = 0, 2014 .wbd_cband_offset = 0, 2015 .use_pwm_agc = 1, 2016 .clkoutdrive = 0, 2017 2018 .fref_clock_ratio = 1, 2019 2020 .ls_cfg_pad_drv = 0, 2021 .data_tx_drv = 0, 2022 .low_if = NULL, 2023 .in_soc = 1, 2024 .force_cband_input = 0, 2025 }; 2026 2027 struct dibx090p_best_adc { 2028 u32 timf; 2029 u32 pll_loopdiv; 2030 u32 pll_prediv; 2031 }; 2032 2033 static int dib8096p_get_best_sampling(struct dvb_frontend *fe, struct dibx090p_best_adc *adc) 2034 { 2035 u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1; 2036 u16 xtal = 12000; 2037 u16 fcp_min = 1900; /* PLL, Minimum Frequency of phase comparator (KHz) */ 2038 u16 fcp_max = 20000; /* PLL, Maximum Frequency of phase comparator (KHz) */ 2039 u32 fmem_max = 140000; /* 140MHz max SDRAM freq */ 2040 u32 fdem_min = 66000; 2041 u32 fcp = 0, fs = 0, fdem = 0, fmem = 0; 2042 u32 harmonic_id = 0; 2043 2044 adc->timf = 0; 2045 adc->pll_loopdiv = loopdiv; 2046 adc->pll_prediv = prediv; 2047 2048 deb_info("bandwidth = %d", fe->dtv_property_cache.bandwidth_hz); 2049 2050 /* Find Min and Max prediv */ 2051 while ((xtal / max_prediv) >= fcp_min) 2052 max_prediv++; 2053 2054 max_prediv--; 2055 min_prediv = max_prediv; 2056 while ((xtal / min_prediv) <= fcp_max) { 2057 min_prediv--; 2058 if (min_prediv == 1) 2059 break; 2060 } 2061 deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv); 2062 2063 min_prediv = 1; 2064 2065 for (prediv = min_prediv; prediv < max_prediv; prediv++) { 2066 fcp = xtal / prediv; 2067 if (fcp > fcp_min && fcp < fcp_max) { 2068 for (loopdiv = 1; loopdiv < 64; loopdiv++) { 2069 fmem = ((xtal/prediv) * loopdiv); 2070 fdem = fmem / 2; 2071 fs = fdem / 4; 2072 2073 /* test min/max system restrictions */ 2074 if ((fdem >= fdem_min) && (fmem <= fmem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz / 1000)) { 2075 spur = 0; 2076 /* test fs harmonics positions */ 2077 for (harmonic_id = (fe->dtv_property_cache.frequency / (1000 * fs)); harmonic_id <= ((fe->dtv_property_cache.frequency / (1000 * fs)) + 1); harmonic_id++) { 2078 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)))) { 2079 spur = 1; 2080 break; 2081 } 2082 } 2083 2084 if (!spur) { 2085 adc->pll_loopdiv = loopdiv; 2086 adc->pll_prediv = prediv; 2087 adc->timf = (4260880253U / fdem) * (1 << 8); 2088 adc->timf += ((4260880253U % fdem) << 8) / fdem; 2089 2090 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); 2091 break; 2092 } 2093 } 2094 } 2095 } 2096 if (!spur) 2097 break; 2098 } 2099 2100 if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0) 2101 return -EINVAL; 2102 return 0; 2103 } 2104 2105 static int dib8096p_agc_startup(struct dvb_frontend *fe) 2106 { 2107 struct dvb_usb_adapter *adap = fe->dvb->priv; 2108 struct dib0700_adapter_state *state = adap->priv; 2109 struct dibx000_bandwidth_config pll; 2110 struct dibx090p_best_adc adc; 2111 u16 target; 2112 int ret; 2113 2114 ret = state->set_param_save(fe); 2115 if (ret < 0) 2116 return ret; 2117 memset(&pll, 0, sizeof(struct dibx000_bandwidth_config)); 2118 2119 dib0090_pwm_gain_reset(fe); 2120 /* dib0090_get_wbd_target is returning any possible 2121 temperature compensated wbd-target */ 2122 target = (dib0090_get_wbd_target(fe) * 8 + 1) / 2; 2123 state->dib8000_ops.set_wbd_ref(fe, target); 2124 2125 if (dib8096p_get_best_sampling(fe, &adc) == 0) { 2126 pll.pll_ratio = adc.pll_loopdiv; 2127 pll.pll_prediv = adc.pll_prediv; 2128 2129 dib0700_set_i2c_speed(adap->dev, 200); 2130 state->dib8000_ops.update_pll(fe, &pll, fe->dtv_property_cache.bandwidth_hz / 1000, 0); 2131 state->dib8000_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf); 2132 dib0700_set_i2c_speed(adap->dev, 1000); 2133 } 2134 return 0; 2135 } 2136 2137 static int tfe8096p_frontend_attach(struct dvb_usb_adapter *adap) 2138 { 2139 struct dib0700_state *st = adap->dev->priv; 2140 u32 fw_version; 2141 struct dib0700_adapter_state *state = adap->priv; 2142 2143 if (!dvb_attach(dib8000_attach, &state->dib8000_ops)) 2144 return -ENODEV; 2145 2146 dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL); 2147 if (fw_version >= 0x10200) 2148 st->fw_use_new_i2c_api = 1; 2149 2150 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 2151 msleep(20); 2152 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 2153 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 2154 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 2155 2156 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 2157 2158 dib0700_ctrl_clock(adap->dev, 72, 1); 2159 2160 msleep(20); 2161 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 2162 msleep(20); 2163 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 2164 2165 state->dib8000_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80, 1); 2166 2167 adap->fe_adap[0].fe = state->dib8000_ops.init(&adap->dev->i2c_adap, 2168 0x80, &tfe8096p_dib8000_config); 2169 2170 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 2171 } 2172 2173 static int tfe8096p_tuner_attach(struct dvb_usb_adapter *adap) 2174 { 2175 struct dib0700_adapter_state *st = adap->priv; 2176 struct i2c_adapter *tun_i2c = st->dib8000_ops.get_i2c_tuner(adap->fe_adap[0].fe); 2177 2178 tfe8096p_dib0090_config.reset = st->dib8000_ops.tuner_sleep; 2179 tfe8096p_dib0090_config.sleep = st->dib8000_ops.tuner_sleep; 2180 tfe8096p_dib0090_config.wbd = dib8096p_wbd_table; 2181 2182 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, 2183 &tfe8096p_dib0090_config) == NULL) 2184 return -ENODEV; 2185 2186 st->dib8000_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 2187 2188 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 2189 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib8096p_agc_startup; 2190 return 0; 2191 } 2192 2193 /* STK9090M */ 2194 static int dib90x0_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff) 2195 { 2196 return dib9000_fw_pid_filter(adapter->fe_adap[0].fe, index, pid, onoff); 2197 } 2198 2199 static int dib90x0_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) 2200 { 2201 return dib9000_fw_pid_filter_ctrl(adapter->fe_adap[0].fe, onoff); 2202 } 2203 2204 static int dib90x0_tuner_reset(struct dvb_frontend *fe, int onoff) 2205 { 2206 return dib9000_set_gpio(fe, 5, 0, !onoff); 2207 } 2208 2209 static int dib90x0_tuner_sleep(struct dvb_frontend *fe, int onoff) 2210 { 2211 return dib9000_set_gpio(fe, 0, 0, onoff); 2212 } 2213 2214 static int dib01x0_pmu_update(struct i2c_adapter *i2c, u16 *data, u8 len) 2215 { 2216 u8 wb[4] = { 0xc >> 8, 0xc & 0xff, 0, 0 }; 2217 u8 rb[2]; 2218 struct i2c_msg msg[2] = { 2219 {.addr = 0x1e >> 1, .flags = 0, .buf = wb, .len = 2}, 2220 {.addr = 0x1e >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2}, 2221 }; 2222 u8 index_data; 2223 2224 dibx000_i2c_set_speed(i2c, 250); 2225 2226 if (i2c_transfer(i2c, msg, 2) != 2) 2227 return -EIO; 2228 2229 switch (rb[0] << 8 | rb[1]) { 2230 case 0: 2231 deb_info("Found DiB0170 rev1: This version of DiB0170 is not supported any longer.\n"); 2232 return -EIO; 2233 case 1: 2234 deb_info("Found DiB0170 rev2"); 2235 break; 2236 case 2: 2237 deb_info("Found DiB0190 rev2"); 2238 break; 2239 default: 2240 deb_info("DiB01x0 not found"); 2241 return -EIO; 2242 } 2243 2244 for (index_data = 0; index_data < len; index_data += 2) { 2245 wb[2] = (data[index_data + 1] >> 8) & 0xff; 2246 wb[3] = (data[index_data + 1]) & 0xff; 2247 2248 if (data[index_data] == 0) { 2249 wb[0] = (data[index_data] >> 8) & 0xff; 2250 wb[1] = (data[index_data]) & 0xff; 2251 msg[0].len = 2; 2252 if (i2c_transfer(i2c, msg, 2) != 2) 2253 return -EIO; 2254 wb[2] |= rb[0]; 2255 wb[3] |= rb[1] & ~(3 << 4); 2256 } 2257 2258 wb[0] = (data[index_data] >> 8)&0xff; 2259 wb[1] = (data[index_data])&0xff; 2260 msg[0].len = 4; 2261 if (i2c_transfer(i2c, &msg[0], 1) != 1) 2262 return -EIO; 2263 } 2264 return 0; 2265 } 2266 2267 static struct dib9000_config stk9090m_config = { 2268 .output_mpeg2_in_188_bytes = 1, 2269 .output_mode = OUTMODE_MPEG2_FIFO, 2270 .vcxo_timer = 279620, 2271 .timing_frequency = 20452225, 2272 .demod_clock_khz = 60000, 2273 .xtal_clock_khz = 30000, 2274 .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0), 2275 .subband = { 2276 2, 2277 { 2278 { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0008 } }, /* GPIO 3 to 1 for VHF */ 2279 { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0008, 0x0000, 0x0000 } }, /* GPIO 3 to 0 for UHF */ 2280 { 0 }, 2281 }, 2282 }, 2283 .gpio_function = { 2284 { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 }, 2285 { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 }, 2286 }, 2287 }; 2288 2289 static struct dib9000_config nim9090md_config[2] = { 2290 { 2291 .output_mpeg2_in_188_bytes = 1, 2292 .output_mode = OUTMODE_MPEG2_FIFO, 2293 .vcxo_timer = 279620, 2294 .timing_frequency = 20452225, 2295 .demod_clock_khz = 60000, 2296 .xtal_clock_khz = 30000, 2297 .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0), 2298 }, { 2299 .output_mpeg2_in_188_bytes = 1, 2300 .output_mode = OUTMODE_DIVERSITY, 2301 .vcxo_timer = 279620, 2302 .timing_frequency = 20452225, 2303 .demod_clock_khz = 60000, 2304 .xtal_clock_khz = 30000, 2305 .if_drives = (0 << 15) | (1 << 13) | (0 << 12) | (3 << 10) | (0 << 9) | (1 << 7) | (0 << 6) | (0 << 4) | (1 << 3) | (1 << 1) | (0), 2306 .subband = { 2307 2, 2308 { 2309 { 240, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0006 } }, /* GPIO 1 and 2 to 1 for VHF */ 2310 { 890, { BOARD_GPIO_COMPONENT_DEMOD, BOARD_GPIO_FUNCTION_SUBBAND_GPIO, 0x0006, 0x0000, 0x0000 } }, /* GPIO 1 and 2 to 0 for UHF */ 2311 { 0 }, 2312 }, 2313 }, 2314 .gpio_function = { 2315 { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_ON, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = (0x10 & ~0x1) | 0x20 }, 2316 { .component = BOARD_GPIO_COMPONENT_DEMOD, .function = BOARD_GPIO_FUNCTION_COMPONENT_OFF, .mask = 0x10 | 0x21, .direction = 0 & ~0x21, .value = 0 | 0x21 }, 2317 }, 2318 } 2319 }; 2320 2321 static struct dib0090_config dib9090_dib0090_config = { 2322 .io.pll_bypass = 0, 2323 .io.pll_range = 1, 2324 .io.pll_prediv = 1, 2325 .io.pll_loopdiv = 8, 2326 .io.adc_clock_ratio = 8, 2327 .io.pll_int_loop_filt = 0, 2328 .io.clock_khz = 30000, 2329 .reset = dib90x0_tuner_reset, 2330 .sleep = dib90x0_tuner_sleep, 2331 .clkouttobamse = 0, 2332 .analog_output = 0, 2333 .use_pwm_agc = 0, 2334 .clkoutdrive = 0, 2335 .freq_offset_khz_uhf = 0, 2336 .freq_offset_khz_vhf = 0, 2337 }; 2338 2339 static struct dib0090_config nim9090md_dib0090_config[2] = { 2340 { 2341 .io.pll_bypass = 0, 2342 .io.pll_range = 1, 2343 .io.pll_prediv = 1, 2344 .io.pll_loopdiv = 8, 2345 .io.adc_clock_ratio = 8, 2346 .io.pll_int_loop_filt = 0, 2347 .io.clock_khz = 30000, 2348 .reset = dib90x0_tuner_reset, 2349 .sleep = dib90x0_tuner_sleep, 2350 .clkouttobamse = 1, 2351 .analog_output = 0, 2352 .use_pwm_agc = 0, 2353 .clkoutdrive = 0, 2354 .freq_offset_khz_uhf = 0, 2355 .freq_offset_khz_vhf = 0, 2356 }, { 2357 .io.pll_bypass = 0, 2358 .io.pll_range = 1, 2359 .io.pll_prediv = 1, 2360 .io.pll_loopdiv = 8, 2361 .io.adc_clock_ratio = 8, 2362 .io.pll_int_loop_filt = 0, 2363 .io.clock_khz = 30000, 2364 .reset = dib90x0_tuner_reset, 2365 .sleep = dib90x0_tuner_sleep, 2366 .clkouttobamse = 0, 2367 .analog_output = 0, 2368 .use_pwm_agc = 0, 2369 .clkoutdrive = 0, 2370 .freq_offset_khz_uhf = 0, 2371 .freq_offset_khz_vhf = 0, 2372 } 2373 }; 2374 2375 2376 static int stk9090m_frontend_attach(struct dvb_usb_adapter *adap) 2377 { 2378 struct dib0700_adapter_state *state = adap->priv; 2379 struct dib0700_state *st = adap->dev->priv; 2380 u32 fw_version; 2381 2382 /* Make use of the new i2c functions from FW 1.20 */ 2383 dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL); 2384 if (fw_version >= 0x10200) 2385 st->fw_use_new_i2c_api = 1; 2386 dib0700_set_i2c_speed(adap->dev, 340); 2387 2388 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 2389 msleep(20); 2390 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 2391 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 2392 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 2393 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 2394 2395 dib0700_ctrl_clock(adap->dev, 72, 1); 2396 2397 msleep(20); 2398 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 2399 msleep(20); 2400 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 2401 2402 dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80); 2403 2404 if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) { 2405 deb_info("%s: Upload failed. (file not found?)\n", __func__); 2406 return -ENODEV; 2407 } else { 2408 deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size); 2409 } 2410 stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size; 2411 stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data; 2412 2413 adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &stk9090m_config); 2414 2415 if (!adap->fe_adap[0].fe) { 2416 release_firmware(state->frontend_firmware); 2417 return -ENODEV; 2418 } 2419 2420 return 0; 2421 } 2422 2423 static int dib9090_tuner_attach(struct dvb_usb_adapter *adap) 2424 { 2425 struct dib0700_adapter_state *state = adap->priv; 2426 struct i2c_adapter *i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe); 2427 u16 data_dib190[10] = { 2428 1, 0x1374, 2429 2, 0x01a2, 2430 7, 0x0020, 2431 0, 0x00ef, 2432 8, 0x0486, 2433 }; 2434 2435 if (!IS_ENABLED(CONFIG_DVB_DIB9000)) 2436 return -ENODEV; 2437 if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL) 2438 return -ENODEV; 2439 i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0); 2440 if (!i2c) 2441 return -ENODEV; 2442 if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0) 2443 return -ENODEV; 2444 dib0700_set_i2c_speed(adap->dev, 1500); 2445 if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0) 2446 return -ENODEV; 2447 release_firmware(state->frontend_firmware); 2448 return 0; 2449 } 2450 2451 static int nim9090md_frontend_attach(struct dvb_usb_adapter *adap) 2452 { 2453 struct dib0700_adapter_state *state = adap->priv; 2454 struct dib0700_state *st = adap->dev->priv; 2455 struct i2c_adapter *i2c; 2456 struct dvb_frontend *fe_slave; 2457 u32 fw_version; 2458 2459 /* Make use of the new i2c functions from FW 1.20 */ 2460 dib0700_get_version(adap->dev, NULL, NULL, &fw_version, NULL); 2461 if (fw_version >= 0x10200) 2462 st->fw_use_new_i2c_api = 1; 2463 dib0700_set_i2c_speed(adap->dev, 340); 2464 2465 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 2466 msleep(20); 2467 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 2468 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 2469 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 2470 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 2471 2472 dib0700_ctrl_clock(adap->dev, 72, 1); 2473 2474 msleep(20); 2475 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 2476 msleep(20); 2477 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 2478 2479 if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) { 2480 deb_info("%s: Upload failed. (file not found?)\n", __func__); 2481 return -EIO; 2482 } else { 2483 deb_info("%s: firmware read %zu bytes.\n", __func__, state->frontend_firmware->size); 2484 } 2485 nim9090md_config[0].microcode_B_fe_size = state->frontend_firmware->size; 2486 nim9090md_config[0].microcode_B_fe_buffer = state->frontend_firmware->data; 2487 nim9090md_config[1].microcode_B_fe_size = state->frontend_firmware->size; 2488 nim9090md_config[1].microcode_B_fe_buffer = state->frontend_firmware->data; 2489 2490 dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, 0x80); 2491 adap->fe_adap[0].fe = dvb_attach(dib9000_attach, &adap->dev->i2c_adap, 0x80, &nim9090md_config[0]); 2492 2493 if (!adap->fe_adap[0].fe) { 2494 release_firmware(state->frontend_firmware); 2495 return -ENODEV; 2496 } 2497 2498 i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_3_4, 0); 2499 dib9000_i2c_enumeration(i2c, 1, 0x12, 0x82); 2500 2501 fe_slave = dvb_attach(dib9000_attach, i2c, 0x82, &nim9090md_config[1]); 2502 dib9000_set_slave_frontend(adap->fe_adap[0].fe, fe_slave); 2503 2504 if (!fe_slave) { 2505 release_firmware(state->frontend_firmware); 2506 return -ENODEV; 2507 } 2508 2509 return 0; 2510 } 2511 2512 static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap) 2513 { 2514 struct dib0700_adapter_state *state = adap->priv; 2515 struct i2c_adapter *i2c; 2516 struct dvb_frontend *fe_slave; 2517 u16 data_dib190[10] = { 2518 1, 0x5374, 2519 2, 0x01ae, 2520 7, 0x0020, 2521 0, 0x00ef, 2522 8, 0x0406, 2523 }; 2524 if (!IS_ENABLED(CONFIG_DVB_DIB9000)) 2525 return -ENODEV; 2526 i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe); 2527 if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL) 2528 return -ENODEV; 2529 i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0); 2530 if (!i2c) 2531 return -ENODEV; 2532 if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0) 2533 return -ENODEV; 2534 2535 dib0700_set_i2c_speed(adap->dev, 1500); 2536 if (dib9000_firmware_post_pll_init(adap->fe_adap[0].fe) < 0) 2537 return -ENODEV; 2538 2539 fe_slave = dib9000_get_slave_frontend(adap->fe_adap[0].fe, 1); 2540 if (fe_slave != NULL) { 2541 i2c = dib9000_get_component_bus_interface(adap->fe_adap[0].fe); 2542 dib9000_set_i2c_adapter(fe_slave, i2c); 2543 2544 i2c = dib9000_get_tuner_interface(fe_slave); 2545 if (dvb_attach(dib0090_fw_register, fe_slave, i2c, &nim9090md_dib0090_config[1]) == NULL) 2546 return -ENODEV; 2547 fe_slave->dvb = adap->fe_adap[0].fe->dvb; 2548 dib9000_fw_set_component_bus_speed(adap->fe_adap[0].fe, 1500); 2549 if (dib9000_firmware_post_pll_init(fe_slave) < 0) 2550 return -ENODEV; 2551 } 2552 release_firmware(state->frontend_firmware); 2553 2554 return 0; 2555 } 2556 2557 /* NIM7090 */ 2558 static int dib7090p_get_best_sampling(struct dvb_frontend *fe , struct dibx090p_best_adc *adc) 2559 { 2560 u8 spur = 0, prediv = 0, loopdiv = 0, min_prediv = 1, max_prediv = 1; 2561 2562 u16 xtal = 12000; 2563 u32 fcp_min = 1900; /* PLL Minimum Frequency comparator KHz */ 2564 u32 fcp_max = 20000; /* PLL Maximum Frequency comparator KHz */ 2565 u32 fdem_max = 76000; 2566 u32 fdem_min = 69500; 2567 u32 fcp = 0, fs = 0, fdem = 0; 2568 u32 harmonic_id = 0; 2569 2570 adc->pll_loopdiv = loopdiv; 2571 adc->pll_prediv = prediv; 2572 adc->timf = 0; 2573 2574 deb_info("bandwidth = %d fdem_min =%d", fe->dtv_property_cache.bandwidth_hz, fdem_min); 2575 2576 /* Find Min and Max prediv */ 2577 while ((xtal/max_prediv) >= fcp_min) 2578 max_prediv++; 2579 2580 max_prediv--; 2581 min_prediv = max_prediv; 2582 while ((xtal/min_prediv) <= fcp_max) { 2583 min_prediv--; 2584 if (min_prediv == 1) 2585 break; 2586 } 2587 deb_info("MIN prediv = %d : MAX prediv = %d", min_prediv, max_prediv); 2588 2589 min_prediv = 2; 2590 2591 for (prediv = min_prediv ; prediv < max_prediv; prediv++) { 2592 fcp = xtal / prediv; 2593 if (fcp > fcp_min && fcp < fcp_max) { 2594 for (loopdiv = 1 ; loopdiv < 64 ; loopdiv++) { 2595 fdem = ((xtal/prediv) * loopdiv); 2596 fs = fdem / 4; 2597 /* test min/max system restrictions */ 2598 2599 if ((fdem >= fdem_min) && (fdem <= fdem_max) && (fs >= fe->dtv_property_cache.bandwidth_hz/1000)) { 2600 spur = 0; 2601 /* test fs harmonics positions */ 2602 for (harmonic_id = (fe->dtv_property_cache.frequency / (1000*fs)) ; harmonic_id <= ((fe->dtv_property_cache.frequency / (1000*fs))+1) ; harmonic_id++) { 2603 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)))) { 2604 spur = 1; 2605 break; 2606 } 2607 } 2608 2609 if (!spur) { 2610 adc->pll_loopdiv = loopdiv; 2611 adc->pll_prediv = prediv; 2612 adc->timf = 2396745143UL/fdem*(1 << 9); 2613 adc->timf += ((2396745143UL%fdem) << 9)/fdem; 2614 deb_info("loopdiv=%i prediv=%i timf=%i", loopdiv, prediv, adc->timf); 2615 break; 2616 } 2617 } 2618 } 2619 } 2620 if (!spur) 2621 break; 2622 } 2623 2624 2625 if (adc->pll_loopdiv == 0 && adc->pll_prediv == 0) 2626 return -EINVAL; 2627 else 2628 return 0; 2629 } 2630 2631 static int dib7090_agc_startup(struct dvb_frontend *fe) 2632 { 2633 struct dvb_usb_adapter *adap = fe->dvb->priv; 2634 struct dib0700_adapter_state *state = adap->priv; 2635 struct dibx000_bandwidth_config pll; 2636 u16 target; 2637 struct dibx090p_best_adc adc; 2638 int ret; 2639 2640 ret = state->set_param_save(fe); 2641 if (ret < 0) 2642 return ret; 2643 2644 memset(&pll, 0, sizeof(struct dibx000_bandwidth_config)); 2645 dib0090_pwm_gain_reset(fe); 2646 target = (dib0090_get_wbd_target(fe) * 8 + 1) / 2; 2647 state->dib7000p_ops.set_wbd_ref(fe, target); 2648 2649 if (dib7090p_get_best_sampling(fe, &adc) == 0) { 2650 pll.pll_ratio = adc.pll_loopdiv; 2651 pll.pll_prediv = adc.pll_prediv; 2652 2653 state->dib7000p_ops.update_pll(fe, &pll); 2654 state->dib7000p_ops.ctrl_timf(fe, DEMOD_TIMF_SET, adc.timf); 2655 } 2656 return 0; 2657 } 2658 2659 static int dib7090_agc_restart(struct dvb_frontend *fe, u8 restart) 2660 { 2661 deb_info("AGC restart callback: %d", restart); 2662 if (restart == 0) /* before AGC startup */ 2663 dib0090_set_dc_servo(fe, 1); 2664 return 0; 2665 } 2666 2667 static int tfe7790p_update_lna(struct dvb_frontend *fe, u16 agc_global) 2668 { 2669 struct dvb_usb_adapter *adap = fe->dvb->priv; 2670 struct dib0700_adapter_state *state = adap->priv; 2671 2672 deb_info("update LNA: agc global=%i", agc_global); 2673 2674 if (agc_global < 25000) { 2675 state->dib7000p_ops.set_gpio(fe, 8, 0, 0); 2676 state->dib7000p_ops.set_agc1_min(fe, 0); 2677 } else { 2678 state->dib7000p_ops.set_gpio(fe, 8, 0, 1); 2679 state->dib7000p_ops.set_agc1_min(fe, 32768); 2680 } 2681 2682 return 0; 2683 } 2684 2685 static struct dib0090_wbd_slope dib7090_wbd_table[] = { 2686 { 380, 81, 850, 64, 540, 4}, 2687 { 860, 51, 866, 21, 375, 4}, 2688 {1700, 0, 250, 0, 100, 6}, 2689 {2600, 0, 250, 0, 100, 6}, 2690 { 0xFFFF, 0, 0, 0, 0, 0}, 2691 }; 2692 2693 static struct dibx000_agc_config dib7090_agc_config[2] = { 2694 { 2695 .band_caps = BAND_UHF, 2696 /* 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, 2697 * 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 */ 2698 .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), 2699 2700 .inv_gain = 687, 2701 .time_stabiliz = 10, 2702 2703 .alpha_level = 0, 2704 .thlock = 118, 2705 2706 .wbd_inv = 0, 2707 .wbd_ref = 1200, 2708 .wbd_sel = 3, 2709 .wbd_alpha = 5, 2710 2711 .agc1_max = 65535, 2712 .agc1_min = 32768, 2713 2714 .agc2_max = 65535, 2715 .agc2_min = 0, 2716 2717 .agc1_pt1 = 0, 2718 .agc1_pt2 = 32, 2719 .agc1_pt3 = 114, 2720 .agc1_slope1 = 143, 2721 .agc1_slope2 = 144, 2722 .agc2_pt1 = 114, 2723 .agc2_pt2 = 227, 2724 .agc2_slope1 = 116, 2725 .agc2_slope2 = 117, 2726 2727 .alpha_mant = 18, 2728 .alpha_exp = 0, 2729 .beta_mant = 20, 2730 .beta_exp = 59, 2731 2732 .perform_agc_softsplit = 0, 2733 } , { 2734 .band_caps = BAND_FM | BAND_VHF | BAND_CBAND, 2735 /* 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, 2736 * 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 */ 2737 .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), 2738 2739 .inv_gain = 732, 2740 .time_stabiliz = 10, 2741 2742 .alpha_level = 0, 2743 .thlock = 118, 2744 2745 .wbd_inv = 0, 2746 .wbd_ref = 1200, 2747 .wbd_sel = 3, 2748 .wbd_alpha = 5, 2749 2750 .agc1_max = 65535, 2751 .agc1_min = 0, 2752 2753 .agc2_max = 65535, 2754 .agc2_min = 0, 2755 2756 .agc1_pt1 = 0, 2757 .agc1_pt2 = 0, 2758 .agc1_pt3 = 98, 2759 .agc1_slope1 = 0, 2760 .agc1_slope2 = 167, 2761 .agc2_pt1 = 98, 2762 .agc2_pt2 = 255, 2763 .agc2_slope1 = 104, 2764 .agc2_slope2 = 0, 2765 2766 .alpha_mant = 18, 2767 .alpha_exp = 0, 2768 .beta_mant = 20, 2769 .beta_exp = 59, 2770 2771 .perform_agc_softsplit = 0, 2772 } 2773 }; 2774 2775 static struct dibx000_bandwidth_config dib7090_clock_config_12_mhz = { 2776 .internal = 60000, 2777 .sampling = 15000, 2778 .pll_prediv = 1, 2779 .pll_ratio = 5, 2780 .pll_range = 0, 2781 .pll_reset = 0, 2782 .pll_bypass = 0, 2783 .enable_refdiv = 0, 2784 .bypclk_div = 0, 2785 .IO_CLK_en_core = 1, 2786 .ADClkSrc = 1, 2787 .modulo = 2, 2788 .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0), 2789 .ifreq = (0 << 25) | 0, 2790 .timf = 20452225, 2791 .xtal_hz = 15000000, 2792 }; 2793 2794 static struct dib7000p_config nim7090_dib7000p_config = { 2795 .output_mpeg2_in_188_bytes = 1, 2796 .hostbus_diversity = 1, 2797 .tuner_is_baseband = 1, 2798 .update_lna = tfe7790p_update_lna, /* GPIO used is the same as TFE7790 */ 2799 2800 .agc_config_count = 2, 2801 .agc = dib7090_agc_config, 2802 2803 .bw = &dib7090_clock_config_12_mhz, 2804 2805 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 2806 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 2807 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 2808 2809 .pwm_freq_div = 0, 2810 2811 .agc_control = dib7090_agc_restart, 2812 2813 .spur_protect = 0, 2814 .disable_sample_and_hold = 0, 2815 .enable_current_mirror = 0, 2816 .diversity_delay = 0, 2817 2818 .output_mode = OUTMODE_MPEG2_FIFO, 2819 .enMpegOutput = 1, 2820 }; 2821 2822 static int tfe7090p_pvr_update_lna(struct dvb_frontend *fe, u16 agc_global) 2823 { 2824 struct dvb_usb_adapter *adap = fe->dvb->priv; 2825 struct dib0700_adapter_state *state = adap->priv; 2826 2827 deb_info("TFE7090P-PVR update LNA: agc global=%i", agc_global); 2828 if (agc_global < 25000) { 2829 state->dib7000p_ops.set_gpio(fe, 5, 0, 0); 2830 state->dib7000p_ops.set_agc1_min(fe, 0); 2831 } else { 2832 state->dib7000p_ops.set_gpio(fe, 5, 0, 1); 2833 state->dib7000p_ops.set_agc1_min(fe, 32768); 2834 } 2835 2836 return 0; 2837 } 2838 2839 static struct dib7000p_config tfe7090pvr_dib7000p_config[2] = { 2840 { 2841 .output_mpeg2_in_188_bytes = 1, 2842 .hostbus_diversity = 1, 2843 .tuner_is_baseband = 1, 2844 .update_lna = tfe7090p_pvr_update_lna, 2845 2846 .agc_config_count = 2, 2847 .agc = dib7090_agc_config, 2848 2849 .bw = &dib7090_clock_config_12_mhz, 2850 2851 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 2852 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 2853 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 2854 2855 .pwm_freq_div = 0, 2856 2857 .agc_control = dib7090_agc_restart, 2858 2859 .spur_protect = 0, 2860 .disable_sample_and_hold = 0, 2861 .enable_current_mirror = 0, 2862 .diversity_delay = 0, 2863 2864 .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK, 2865 .default_i2c_addr = 0x90, 2866 .enMpegOutput = 1, 2867 }, { 2868 .output_mpeg2_in_188_bytes = 1, 2869 .hostbus_diversity = 1, 2870 .tuner_is_baseband = 1, 2871 .update_lna = tfe7090p_pvr_update_lna, 2872 2873 .agc_config_count = 2, 2874 .agc = dib7090_agc_config, 2875 2876 .bw = &dib7090_clock_config_12_mhz, 2877 2878 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 2879 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 2880 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 2881 2882 .pwm_freq_div = 0, 2883 2884 .agc_control = dib7090_agc_restart, 2885 2886 .spur_protect = 0, 2887 .disable_sample_and_hold = 0, 2888 .enable_current_mirror = 0, 2889 .diversity_delay = 0, 2890 2891 .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK, 2892 .default_i2c_addr = 0x92, 2893 .enMpegOutput = 0, 2894 } 2895 }; 2896 2897 static struct dib0090_config nim7090_dib0090_config = { 2898 .io.clock_khz = 12000, 2899 .io.pll_bypass = 0, 2900 .io.pll_range = 0, 2901 .io.pll_prediv = 3, 2902 .io.pll_loopdiv = 6, 2903 .io.adc_clock_ratio = 0, 2904 .io.pll_int_loop_filt = 0, 2905 2906 .freq_offset_khz_uhf = 0, 2907 .freq_offset_khz_vhf = 0, 2908 2909 .clkouttobamse = 1, 2910 .analog_output = 0, 2911 2912 .wbd_vhf_offset = 0, 2913 .wbd_cband_offset = 0, 2914 .use_pwm_agc = 1, 2915 .clkoutdrive = 0, 2916 2917 .fref_clock_ratio = 0, 2918 2919 .wbd = dib7090_wbd_table, 2920 2921 .ls_cfg_pad_drv = 0, 2922 .data_tx_drv = 0, 2923 .low_if = NULL, 2924 .in_soc = 1, 2925 }; 2926 2927 static struct dib7000p_config tfe7790p_dib7000p_config = { 2928 .output_mpeg2_in_188_bytes = 1, 2929 .hostbus_diversity = 1, 2930 .tuner_is_baseband = 1, 2931 .update_lna = tfe7790p_update_lna, 2932 2933 .agc_config_count = 2, 2934 .agc = dib7090_agc_config, 2935 2936 .bw = &dib7090_clock_config_12_mhz, 2937 2938 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 2939 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 2940 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 2941 2942 .pwm_freq_div = 0, 2943 2944 .agc_control = dib7090_agc_restart, 2945 2946 .spur_protect = 0, 2947 .disable_sample_and_hold = 0, 2948 .enable_current_mirror = 0, 2949 .diversity_delay = 0, 2950 2951 .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK, 2952 .enMpegOutput = 1, 2953 }; 2954 2955 static struct dib0090_config tfe7790p_dib0090_config = { 2956 .io.clock_khz = 12000, 2957 .io.pll_bypass = 0, 2958 .io.pll_range = 0, 2959 .io.pll_prediv = 3, 2960 .io.pll_loopdiv = 6, 2961 .io.adc_clock_ratio = 0, 2962 .io.pll_int_loop_filt = 0, 2963 2964 .freq_offset_khz_uhf = 0, 2965 .freq_offset_khz_vhf = 0, 2966 2967 .clkouttobamse = 1, 2968 .analog_output = 0, 2969 2970 .wbd_vhf_offset = 0, 2971 .wbd_cband_offset = 0, 2972 .use_pwm_agc = 1, 2973 .clkoutdrive = 0, 2974 2975 .fref_clock_ratio = 0, 2976 2977 .wbd = dib7090_wbd_table, 2978 2979 .ls_cfg_pad_drv = 0, 2980 .data_tx_drv = 0, 2981 .low_if = NULL, 2982 .in_soc = 1, 2983 .force_cband_input = 0, 2984 .is_dib7090e = 0, 2985 .force_crystal_mode = 1, 2986 }; 2987 2988 static struct dib0090_config tfe7090pvr_dib0090_config[2] = { 2989 { 2990 .io.clock_khz = 12000, 2991 .io.pll_bypass = 0, 2992 .io.pll_range = 0, 2993 .io.pll_prediv = 3, 2994 .io.pll_loopdiv = 6, 2995 .io.adc_clock_ratio = 0, 2996 .io.pll_int_loop_filt = 0, 2997 2998 .freq_offset_khz_uhf = 50, 2999 .freq_offset_khz_vhf = 70, 3000 3001 .clkouttobamse = 1, 3002 .analog_output = 0, 3003 3004 .wbd_vhf_offset = 0, 3005 .wbd_cband_offset = 0, 3006 .use_pwm_agc = 1, 3007 .clkoutdrive = 0, 3008 3009 .fref_clock_ratio = 0, 3010 3011 .wbd = dib7090_wbd_table, 3012 3013 .ls_cfg_pad_drv = 0, 3014 .data_tx_drv = 0, 3015 .low_if = NULL, 3016 .in_soc = 1, 3017 }, { 3018 .io.clock_khz = 12000, 3019 .io.pll_bypass = 0, 3020 .io.pll_range = 0, 3021 .io.pll_prediv = 3, 3022 .io.pll_loopdiv = 6, 3023 .io.adc_clock_ratio = 0, 3024 .io.pll_int_loop_filt = 0, 3025 3026 .freq_offset_khz_uhf = -50, 3027 .freq_offset_khz_vhf = -70, 3028 3029 .clkouttobamse = 1, 3030 .analog_output = 0, 3031 3032 .wbd_vhf_offset = 0, 3033 .wbd_cband_offset = 0, 3034 .use_pwm_agc = 1, 3035 .clkoutdrive = 0, 3036 3037 .fref_clock_ratio = 0, 3038 3039 .wbd = dib7090_wbd_table, 3040 3041 .ls_cfg_pad_drv = 0, 3042 .data_tx_drv = 0, 3043 .low_if = NULL, 3044 .in_soc = 1, 3045 } 3046 }; 3047 3048 static int nim7090_frontend_attach(struct dvb_usb_adapter *adap) 3049 { 3050 struct dib0700_adapter_state *state = adap->priv; 3051 3052 if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 3053 return -ENODEV; 3054 3055 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 3056 msleep(20); 3057 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 3058 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 3059 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 3060 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 3061 3062 msleep(20); 3063 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3064 msleep(20); 3065 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 3066 3067 if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, &nim7090_dib7000p_config) != 0) { 3068 err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); 3069 dvb_detach(state->dib7000p_ops.set_wbd_ref); 3070 return -ENODEV; 3071 } 3072 adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config); 3073 3074 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3075 } 3076 3077 static int nim7090_tuner_attach(struct dvb_usb_adapter *adap) 3078 { 3079 struct dib0700_adapter_state *st = adap->priv; 3080 struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe); 3081 3082 nim7090_dib0090_config.reset = st->dib7000p_ops.tuner_sleep; 3083 nim7090_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep; 3084 nim7090_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power; 3085 3086 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &nim7090_dib0090_config) == NULL) 3087 return -ENODEV; 3088 3089 st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 3090 3091 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 3092 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 3093 return 0; 3094 } 3095 3096 static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap) 3097 { 3098 struct dib0700_state *st = adap->dev->priv; 3099 struct dib0700_adapter_state *state = adap->priv; 3100 3101 if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 3102 return -ENODEV; 3103 3104 /* The TFE7090 requires the dib0700 to not be in master mode */ 3105 st->disable_streaming_master_mode = 1; 3106 3107 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 3108 msleep(20); 3109 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 3110 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 3111 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 3112 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 3113 3114 msleep(20); 3115 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3116 msleep(20); 3117 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 3118 3119 /* initialize IC 0 */ 3120 if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, &tfe7090pvr_dib7000p_config[0]) != 0) { 3121 err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); 3122 dvb_detach(state->dib7000p_ops.set_wbd_ref); 3123 return -ENODEV; 3124 } 3125 3126 dib0700_set_i2c_speed(adap->dev, 340); 3127 adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]); 3128 if (adap->fe_adap[0].fe == NULL) 3129 return -ENODEV; 3130 3131 state->dib7000p_ops.slave_reset(adap->fe_adap[0].fe); 3132 3133 return 0; 3134 } 3135 3136 static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap) 3137 { 3138 struct i2c_adapter *i2c; 3139 struct dib0700_adapter_state *state = adap->priv; 3140 3141 if (adap->dev->adapter[0].fe_adap[0].fe == NULL) { 3142 err("the master dib7090 has to be initialized first"); 3143 return -ENODEV; /* the master device has not been initialized */ 3144 } 3145 3146 if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 3147 return -ENODEV; 3148 3149 i2c = state->dib7000p_ops.get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1); 3150 if (state->dib7000p_ops.i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) { 3151 err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); 3152 dvb_detach(state->dib7000p_ops.set_wbd_ref); 3153 return -ENODEV; 3154 } 3155 3156 adap->fe_adap[0].fe = state->dib7000p_ops.init(i2c, 0x92, &tfe7090pvr_dib7000p_config[1]); 3157 dib0700_set_i2c_speed(adap->dev, 200); 3158 3159 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3160 } 3161 3162 static int tfe7090pvr_tuner0_attach(struct dvb_usb_adapter *adap) 3163 { 3164 struct dib0700_adapter_state *st = adap->priv; 3165 struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe); 3166 3167 tfe7090pvr_dib0090_config[0].reset = st->dib7000p_ops.tuner_sleep; 3168 tfe7090pvr_dib0090_config[0].sleep = st->dib7000p_ops.tuner_sleep; 3169 tfe7090pvr_dib0090_config[0].get_adc_power = st->dib7000p_ops.get_adc_power; 3170 3171 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[0]) == NULL) 3172 return -ENODEV; 3173 3174 st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 3175 3176 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 3177 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 3178 return 0; 3179 } 3180 3181 static int tfe7090pvr_tuner1_attach(struct dvb_usb_adapter *adap) 3182 { 3183 struct dib0700_adapter_state *st = adap->priv; 3184 struct i2c_adapter *tun_i2c = st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe); 3185 3186 tfe7090pvr_dib0090_config[1].reset = st->dib7000p_ops.tuner_sleep; 3187 tfe7090pvr_dib0090_config[1].sleep = st->dib7000p_ops.tuner_sleep; 3188 tfe7090pvr_dib0090_config[1].get_adc_power = st->dib7000p_ops.get_adc_power; 3189 3190 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, &tfe7090pvr_dib0090_config[1]) == NULL) 3191 return -ENODEV; 3192 3193 st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 3194 3195 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 3196 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 3197 return 0; 3198 } 3199 3200 static int tfe7790p_frontend_attach(struct dvb_usb_adapter *adap) 3201 { 3202 struct dib0700_state *st = adap->dev->priv; 3203 struct dib0700_adapter_state *state = adap->priv; 3204 3205 if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 3206 return -ENODEV; 3207 3208 /* The TFE7790P requires the dib0700 to not be in master mode */ 3209 st->disable_streaming_master_mode = 1; 3210 3211 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 3212 msleep(20); 3213 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 3214 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 3215 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 3216 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 3217 msleep(20); 3218 dib0700_ctrl_clock(adap->dev, 72, 1); 3219 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3220 msleep(20); 3221 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 3222 3223 if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 3224 1, 0x10, &tfe7790p_dib7000p_config) != 0) { 3225 err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", 3226 __func__); 3227 dvb_detach(state->dib7000p_ops.set_wbd_ref); 3228 return -ENODEV; 3229 } 3230 adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 3231 0x80, &tfe7790p_dib7000p_config); 3232 3233 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3234 } 3235 3236 static int tfe7790p_tuner_attach(struct dvb_usb_adapter *adap) 3237 { 3238 struct dib0700_adapter_state *st = adap->priv; 3239 struct i2c_adapter *tun_i2c = 3240 st->dib7000p_ops.get_i2c_tuner(adap->fe_adap[0].fe); 3241 3242 3243 tfe7790p_dib0090_config.reset = st->dib7000p_ops.tuner_sleep; 3244 tfe7790p_dib0090_config.sleep = st->dib7000p_ops.tuner_sleep; 3245 tfe7790p_dib0090_config.get_adc_power = st->dib7000p_ops.get_adc_power; 3246 3247 if (dvb_attach(dib0090_register, adap->fe_adap[0].fe, tun_i2c, 3248 &tfe7790p_dib0090_config) == NULL) 3249 return -ENODEV; 3250 3251 st->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 3252 3253 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params; 3254 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7090_agc_startup; 3255 return 0; 3256 } 3257 3258 /* STK7070PD */ 3259 static struct dib7000p_config stk7070pd_dib7000p_config[2] = { 3260 { 3261 .output_mpeg2_in_188_bytes = 1, 3262 3263 .agc_config_count = 1, 3264 .agc = &dib7070_agc_config, 3265 .bw = &dib7070_bw_config_12_mhz, 3266 .tuner_is_baseband = 1, 3267 .spur_protect = 1, 3268 3269 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 3270 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 3271 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 3272 3273 .hostbus_diversity = 1, 3274 }, { 3275 .output_mpeg2_in_188_bytes = 1, 3276 3277 .agc_config_count = 1, 3278 .agc = &dib7070_agc_config, 3279 .bw = &dib7070_bw_config_12_mhz, 3280 .tuner_is_baseband = 1, 3281 .spur_protect = 1, 3282 3283 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 3284 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 3285 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 3286 3287 .hostbus_diversity = 1, 3288 } 3289 }; 3290 3291 static void stk7070pd_init(struct dvb_usb_device *dev) 3292 { 3293 dib0700_set_gpio(dev, GPIO6, GPIO_OUT, 1); 3294 msleep(10); 3295 dib0700_set_gpio(dev, GPIO9, GPIO_OUT, 1); 3296 dib0700_set_gpio(dev, GPIO4, GPIO_OUT, 1); 3297 dib0700_set_gpio(dev, GPIO7, GPIO_OUT, 1); 3298 dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 0); 3299 3300 dib0700_ctrl_clock(dev, 72, 1); 3301 3302 msleep(10); 3303 dib0700_set_gpio(dev, GPIO10, GPIO_OUT, 1); 3304 } 3305 3306 static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap) 3307 { 3308 struct dib0700_adapter_state *state = adap->priv; 3309 3310 if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 3311 return -ENODEV; 3312 3313 stk7070pd_init(adap->dev); 3314 3315 msleep(10); 3316 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 3317 3318 if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 2, 18, 3319 stk7070pd_dib7000p_config) != 0) { 3320 err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", 3321 __func__); 3322 dvb_detach(state->dib7000p_ops.set_wbd_ref); 3323 return -ENODEV; 3324 } 3325 3326 adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]); 3327 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3328 } 3329 3330 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap) 3331 { 3332 struct dib0700_adapter_state *state = adap->priv; 3333 3334 if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 3335 return -ENODEV; 3336 3337 adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]); 3338 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3339 } 3340 3341 static int novatd_read_status_override(struct dvb_frontend *fe, 3342 enum fe_status *stat) 3343 { 3344 struct dvb_usb_adapter *adap = fe->dvb->priv; 3345 struct dvb_usb_device *dev = adap->dev; 3346 struct dib0700_state *state = dev->priv; 3347 int ret; 3348 3349 ret = state->read_status(fe, stat); 3350 3351 if (!ret) 3352 dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, 3353 !!(*stat & FE_HAS_LOCK)); 3354 3355 return ret; 3356 } 3357 3358 static int novatd_sleep_override(struct dvb_frontend* fe) 3359 { 3360 struct dvb_usb_adapter *adap = fe->dvb->priv; 3361 struct dvb_usb_device *dev = adap->dev; 3362 struct dib0700_state *state = dev->priv; 3363 3364 /* turn off LED */ 3365 dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, 0); 3366 3367 return state->sleep(fe); 3368 } 3369 3370 /* 3371 * novatd_frontend_attach - Nova-TD specific attach 3372 * 3373 * Nova-TD has GPIO0, 1 and 2 for LEDs. So do not fiddle with them except for 3374 * information purposes. 3375 */ 3376 static int novatd_frontend_attach(struct dvb_usb_adapter *adap) 3377 { 3378 struct dvb_usb_device *dev = adap->dev; 3379 struct dib0700_state *st = dev->priv; 3380 struct dib0700_adapter_state *state = adap->priv; 3381 3382 if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 3383 return -ENODEV; 3384 3385 if (adap->id == 0) { 3386 stk7070pd_init(dev); 3387 3388 /* turn the power LED on, the other two off (just in case) */ 3389 dib0700_set_gpio(dev, GPIO0, GPIO_OUT, 0); 3390 dib0700_set_gpio(dev, GPIO1, GPIO_OUT, 0); 3391 dib0700_set_gpio(dev, GPIO2, GPIO_OUT, 1); 3392 3393 if (state->dib7000p_ops.i2c_enumeration(&dev->i2c_adap, 2, 18, 3394 stk7070pd_dib7000p_config) != 0) { 3395 err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", 3396 __func__); 3397 dvb_detach(state->dib7000p_ops.set_wbd_ref); 3398 return -ENODEV; 3399 } 3400 } 3401 3402 adap->fe_adap[0].fe = state->dib7000p_ops.init(&dev->i2c_adap, 3403 adap->id == 0 ? 0x80 : 0x82, 3404 &stk7070pd_dib7000p_config[adap->id]); 3405 3406 if (adap->fe_adap[0].fe == NULL) 3407 return -ENODEV; 3408 3409 st->read_status = adap->fe_adap[0].fe->ops.read_status; 3410 adap->fe_adap[0].fe->ops.read_status = novatd_read_status_override; 3411 st->sleep = adap->fe_adap[0].fe->ops.sleep; 3412 adap->fe_adap[0].fe->ops.sleep = novatd_sleep_override; 3413 3414 return 0; 3415 } 3416 3417 /* S5H1411 */ 3418 static struct s5h1411_config pinnacle_801e_config = { 3419 .output_mode = S5H1411_PARALLEL_OUTPUT, 3420 .gpio = S5H1411_GPIO_OFF, 3421 .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINUOUS_NONINVERTING_CLOCK, 3422 .qam_if = S5H1411_IF_44000, 3423 .vsb_if = S5H1411_IF_44000, 3424 .inversion = S5H1411_INVERSION_OFF, 3425 .status_mode = S5H1411_DEMODLOCKING 3426 }; 3427 3428 /* Pinnacle PCTV HD Pro 801e GPIOs map: 3429 GPIO0 - currently unknown 3430 GPIO1 - xc5000 tuner reset 3431 GPIO2 - CX25843 sleep 3432 GPIO3 - currently unknown 3433 GPIO4 - currently unknown 3434 GPIO6 - currently unknown 3435 GPIO7 - currently unknown 3436 GPIO9 - currently unknown 3437 GPIO10 - CX25843 reset 3438 */ 3439 static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap) 3440 { 3441 struct dib0700_state *st = adap->dev->priv; 3442 3443 /* Make use of the new i2c functions from FW 1.20 */ 3444 st->fw_use_new_i2c_api = 1; 3445 3446 /* The s5h1411 requires the dib0700 to not be in master mode */ 3447 st->disable_streaming_master_mode = 1; 3448 3449 /* All msleep values taken from Windows USB trace */ 3450 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0); 3451 dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0); 3452 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 3453 msleep(400); 3454 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 3455 msleep(60); 3456 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3457 msleep(30); 3458 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 3459 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 3460 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 3461 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 3462 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0); 3463 msleep(30); 3464 3465 /* Put the CX25843 to sleep for now since we're in digital mode */ 3466 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1); 3467 3468 /* GPIOs are initialized, do the attach */ 3469 adap->fe_adap[0].fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config, 3470 &adap->dev->i2c_adap); 3471 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3472 } 3473 3474 static int dib0700_xc5000_tuner_callback(void *priv, int component, 3475 int command, int arg) 3476 { 3477 struct dvb_usb_adapter *adap = priv; 3478 3479 if (command == XC5000_TUNER_RESET) { 3480 /* Reset the tuner */ 3481 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0); 3482 msleep(10); 3483 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1); 3484 msleep(10); 3485 } else { 3486 err("xc5000: unknown tuner callback command: %d\n", command); 3487 return -EINVAL; 3488 } 3489 3490 return 0; 3491 } 3492 3493 static struct xc5000_config s5h1411_xc5000_tunerconfig = { 3494 .i2c_address = 0x64, 3495 .if_khz = 5380, 3496 }; 3497 3498 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap) 3499 { 3500 /* FIXME: generalize & move to common area */ 3501 adap->fe_adap[0].fe->callback = dib0700_xc5000_tuner_callback; 3502 3503 return dvb_attach(xc5000_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap, 3504 &s5h1411_xc5000_tunerconfig) 3505 == NULL ? -ENODEV : 0; 3506 } 3507 3508 static int dib0700_xc4000_tuner_callback(void *priv, int component, 3509 int command, int arg) 3510 { 3511 struct dvb_usb_adapter *adap = priv; 3512 struct dib0700_adapter_state *state = adap->priv; 3513 3514 if (command == XC4000_TUNER_RESET) { 3515 /* Reset the tuner */ 3516 state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 0); 3517 msleep(10); 3518 state->dib7000p_ops.set_gpio(adap->fe_adap[0].fe, 8, 0, 1); 3519 } else { 3520 err("xc4000: unknown tuner callback command: %d\n", command); 3521 return -EINVAL; 3522 } 3523 3524 return 0; 3525 } 3526 3527 static struct dibx000_agc_config stk7700p_7000p_xc4000_agc_config = { 3528 .band_caps = BAND_UHF | BAND_VHF, 3529 .setup = 0x64, 3530 .inv_gain = 0x02c8, 3531 .time_stabiliz = 0x15, 3532 .alpha_level = 0x00, 3533 .thlock = 0x76, 3534 .wbd_inv = 0x01, 3535 .wbd_ref = 0x0b33, 3536 .wbd_sel = 0x00, 3537 .wbd_alpha = 0x02, 3538 .agc1_max = 0x00, 3539 .agc1_min = 0x00, 3540 .agc2_max = 0x9b26, 3541 .agc2_min = 0x26ca, 3542 .agc1_pt1 = 0x00, 3543 .agc1_pt2 = 0x00, 3544 .agc1_pt3 = 0x00, 3545 .agc1_slope1 = 0x00, 3546 .agc1_slope2 = 0x00, 3547 .agc2_pt1 = 0x00, 3548 .agc2_pt2 = 0x80, 3549 .agc2_slope1 = 0x1d, 3550 .agc2_slope2 = 0x1d, 3551 .alpha_mant = 0x11, 3552 .alpha_exp = 0x1b, 3553 .beta_mant = 0x17, 3554 .beta_exp = 0x33, 3555 .perform_agc_softsplit = 0x00, 3556 }; 3557 3558 static struct dibx000_bandwidth_config stk7700p_xc4000_pll_config = { 3559 .internal = 60000, 3560 .sampling = 30000, 3561 .pll_prediv = 1, 3562 .pll_ratio = 8, 3563 .pll_range = 3, 3564 .pll_reset = 1, 3565 .pll_bypass = 0, 3566 .enable_refdiv = 0, 3567 .bypclk_div = 0, 3568 .IO_CLK_en_core = 1, 3569 .ADClkSrc = 1, 3570 .modulo = 0, 3571 .sad_cfg = (3 << 14) | (1 << 12) | 524, /* sad_cfg: refsel, sel, freq_15k */ 3572 .ifreq = 39370534, 3573 .timf = 20452225, 3574 .xtal_hz = 30000000 3575 }; 3576 3577 /* FIXME: none of these inputs are validated yet */ 3578 static struct dib7000p_config pctv_340e_config = { 3579 .output_mpeg2_in_188_bytes = 1, 3580 3581 .agc_config_count = 1, 3582 .agc = &stk7700p_7000p_xc4000_agc_config, 3583 .bw = &stk7700p_xc4000_pll_config, 3584 3585 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS, 3586 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES, 3587 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS, 3588 }; 3589 3590 /* PCTV 340e GPIOs map: 3591 dib0700: 3592 GPIO2 - CX25843 sleep 3593 GPIO3 - CS5340 reset 3594 GPIO5 - IRD 3595 GPIO6 - Power Supply 3596 GPIO8 - LNA (1=off 0=on) 3597 GPIO10 - CX25843 reset 3598 dib7000: 3599 GPIO8 - xc4000 reset 3600 */ 3601 static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap) 3602 { 3603 struct dib0700_state *st = adap->dev->priv; 3604 struct dib0700_adapter_state *state = adap->priv; 3605 3606 if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops)) 3607 return -ENODEV; 3608 3609 /* Power Supply on */ 3610 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 3611 msleep(50); 3612 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 3613 msleep(100); /* Allow power supply to settle before probing */ 3614 3615 /* cx25843 reset */ 3616 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 3617 msleep(1); /* cx25843 datasheet say 350us required */ 3618 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3619 3620 /* LNA off for now */ 3621 dib0700_set_gpio(adap->dev, GPIO8, GPIO_OUT, 1); 3622 3623 /* Put the CX25843 to sleep for now since we're in digital mode */ 3624 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1); 3625 3626 /* FIXME: not verified yet */ 3627 dib0700_ctrl_clock(adap->dev, 72, 1); 3628 3629 msleep(500); 3630 3631 if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap) == 0) { 3632 /* Demodulator not found for some reason? */ 3633 dvb_detach(state->dib7000p_ops.set_wbd_ref); 3634 return -ENODEV; 3635 } 3636 3637 adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x12, 3638 &pctv_340e_config); 3639 st->is_dib7000pc = 1; 3640 3641 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3642 } 3643 3644 static struct xc4000_config dib7000p_xc4000_tunerconfig = { 3645 .i2c_address = 0x61, 3646 .default_pm = 1, 3647 .dvb_amplitude = 0, 3648 .set_smoothedcvbs = 0, 3649 .if_khz = 5400 3650 }; 3651 3652 static int xc4000_tuner_attach(struct dvb_usb_adapter *adap) 3653 { 3654 struct i2c_adapter *tun_i2c; 3655 struct dib0700_adapter_state *state = adap->priv; 3656 3657 /* The xc4000 is not on the main i2c bus */ 3658 tun_i2c = state->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe, 3659 DIBX000_I2C_INTERFACE_TUNER, 1); 3660 if (tun_i2c == NULL) { 3661 printk(KERN_ERR "Could not reach tuner i2c bus\n"); 3662 return 0; 3663 } 3664 3665 /* Setup the reset callback */ 3666 adap->fe_adap[0].fe->callback = dib0700_xc4000_tuner_callback; 3667 3668 return dvb_attach(xc4000_attach, adap->fe_adap[0].fe, tun_i2c, 3669 &dib7000p_xc4000_tunerconfig) 3670 == NULL ? -ENODEV : 0; 3671 } 3672 3673 static struct lgdt3305_config hcw_lgdt3305_config = { 3674 .i2c_addr = 0x0e, 3675 .mpeg_mode = LGDT3305_MPEG_PARALLEL, 3676 .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE, 3677 .tpvalid_polarity = LGDT3305_TP_VALID_LOW, 3678 .deny_i2c_rptr = 0, 3679 .spectral_inversion = 1, 3680 .qam_if_khz = 6000, 3681 .vsb_if_khz = 6000, 3682 .usref_8vsb = 0x0500, 3683 }; 3684 3685 static struct mxl5007t_config hcw_mxl5007t_config = { 3686 .xtal_freq_hz = MxL_XTAL_25_MHZ, 3687 .if_freq_hz = MxL_IF_6_MHZ, 3688 .invert_if = 1, 3689 }; 3690 3691 /* TIGER-ATSC map: 3692 GPIO0 - LNA_CTR (H: LNA power enabled, L: LNA power disabled) 3693 GPIO1 - ANT_SEL (H: VPA, L: MCX) 3694 GPIO4 - SCL2 3695 GPIO6 - EN_TUNER 3696 GPIO7 - SDA2 3697 GPIO10 - DEM_RST 3698 3699 MXL is behind LG's i2c repeater. LG is on SCL2/SDA2 gpios on the DIB 3700 */ 3701 static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap) 3702 { 3703 struct dib0700_state *st = adap->dev->priv; 3704 3705 /* Make use of the new i2c functions from FW 1.20 */ 3706 st->fw_use_new_i2c_api = 1; 3707 3708 st->disable_streaming_master_mode = 1; 3709 3710 /* fe power enable */ 3711 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 3712 msleep(30); 3713 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 3714 msleep(30); 3715 3716 /* demod reset */ 3717 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3718 msleep(30); 3719 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 3720 msleep(30); 3721 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3722 msleep(30); 3723 3724 adap->fe_adap[0].fe = dvb_attach(lgdt3305_attach, 3725 &hcw_lgdt3305_config, 3726 &adap->dev->i2c_adap); 3727 3728 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; 3729 } 3730 3731 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap) 3732 { 3733 return dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe, 3734 &adap->dev->i2c_adap, 0x60, 3735 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0; 3736 } 3737 3738 static int xbox_one_attach(struct dvb_usb_adapter *adap) 3739 { 3740 struct dib0700_state *st = adap->dev->priv; 3741 struct i2c_client *client_demod, *client_tuner; 3742 struct dvb_usb_device *d = adap->dev; 3743 struct mn88472_config mn88472_config = { }; 3744 struct tda18250_config tda18250_config; 3745 struct i2c_board_info info; 3746 3747 st->fw_use_new_i2c_api = 1; 3748 st->disable_streaming_master_mode = 1; 3749 3750 /* fe power enable */ 3751 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 3752 msleep(30); 3753 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 3754 msleep(30); 3755 3756 /* demod reset */ 3757 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3758 msleep(30); 3759 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 3760 msleep(30); 3761 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 3762 msleep(30); 3763 3764 /* attach demod */ 3765 mn88472_config.fe = &adap->fe_adap[0].fe; 3766 mn88472_config.i2c_wr_max = 22; 3767 mn88472_config.xtal = 20500000; 3768 mn88472_config.ts_mode = PARALLEL_TS_MODE; 3769 mn88472_config.ts_clock = FIXED_TS_CLOCK; 3770 memset(&info, 0, sizeof(struct i2c_board_info)); 3771 strscpy(info.type, "mn88472", I2C_NAME_SIZE); 3772 info.addr = 0x18; 3773 info.platform_data = &mn88472_config; 3774 request_module(info.type); 3775 client_demod = i2c_new_client_device(&d->i2c_adap, &info); 3776 if (!i2c_client_has_driver(client_demod)) 3777 goto fail_demod_device; 3778 if (!try_module_get(client_demod->dev.driver->owner)) 3779 goto fail_demod_module; 3780 3781 st->i2c_client_demod = client_demod; 3782 3783 adap->fe_adap[0].fe = mn88472_config.get_dvb_frontend(client_demod); 3784 3785 /* attach tuner */ 3786 memset(&tda18250_config, 0, sizeof(tda18250_config)); 3787 tda18250_config.if_dvbt_6 = 3950; 3788 tda18250_config.if_dvbt_7 = 4450; 3789 tda18250_config.if_dvbt_8 = 4950; 3790 tda18250_config.if_dvbc_6 = 4950; 3791 tda18250_config.if_dvbc_8 = 4950; 3792 tda18250_config.if_atsc = 4079; 3793 tda18250_config.loopthrough = true; 3794 tda18250_config.xtal_freq = TDA18250_XTAL_FREQ_27MHZ; 3795 tda18250_config.fe = adap->fe_adap[0].fe; 3796 3797 memset(&info, 0, sizeof(struct i2c_board_info)); 3798 strscpy(info.type, "tda18250", I2C_NAME_SIZE); 3799 info.addr = 0x60; 3800 info.platform_data = &tda18250_config; 3801 3802 request_module(info.type); 3803 client_tuner = i2c_new_client_device(&adap->dev->i2c_adap, &info); 3804 if (!i2c_client_has_driver(client_tuner)) 3805 goto fail_tuner_device; 3806 if (!try_module_get(client_tuner->dev.driver->owner)) 3807 goto fail_tuner_module; 3808 3809 st->i2c_client_tuner = client_tuner; 3810 return 0; 3811 3812 fail_tuner_module: 3813 i2c_unregister_device(client_tuner); 3814 fail_tuner_device: 3815 module_put(client_demod->dev.driver->owner); 3816 fail_demod_module: 3817 i2c_unregister_device(client_demod); 3818 fail_demod_device: 3819 return -ENODEV; 3820 } 3821 3822 3823 /* DVB-USB and USB stuff follows */ 3824 enum { 3825 DIBCOM_STK7700P, 3826 DIBCOM_STK7700P_PC, 3827 HAUPPAUGE_NOVA_T_500, 3828 HAUPPAUGE_NOVA_T_500_2, 3829 HAUPPAUGE_NOVA_T_STICK, 3830 AVERMEDIA_VOLAR, 3831 COMPRO_VIDEOMATE_U500, 3832 UNIWILL_STK7700P, 3833 LEADTEK_WINFAST_DTV_DONGLE_STK7700P, 3834 HAUPPAUGE_NOVA_T_STICK_2, 3835 AVERMEDIA_VOLAR_2, 3836 PINNACLE_PCTV2000E, 3837 TERRATEC_CINERGY_DT_XS_DIVERSITY, 3838 HAUPPAUGE_NOVA_TD_STICK, 3839 DIBCOM_STK7700D, 3840 DIBCOM_STK7070P, 3841 PINNACLE_PCTV_DVB_T_FLASH, 3842 DIBCOM_STK7070PD, 3843 PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T, 3844 COMPRO_VIDEOMATE_U500_PC, 3845 AVERMEDIA_EXPRESS, 3846 GIGABYTE_U7000, 3847 ULTIMA_ARTEC_T14BR, 3848 ASUS_U3000, 3849 ASUS_U3100, 3850 HAUPPAUGE_NOVA_T_STICK_3, 3851 HAUPPAUGE_MYTV_T, 3852 TERRATEC_CINERGY_HT_USB_XE, 3853 PINNACLE_EXPRESSCARD_320CX, 3854 PINNACLE_PCTV72E, 3855 PINNACLE_PCTV73E, 3856 YUAN_EC372S, 3857 TERRATEC_CINERGY_HT_EXPRESS, 3858 TERRATEC_CINERGY_T_XXS, 3859 LEADTEK_WINFAST_DTV_DONGLE_STK7700P_2, 3860 HAUPPAUGE_NOVA_TD_STICK_52009, 3861 HAUPPAUGE_NOVA_T_500_3, 3862 GIGABYTE_U8000, 3863 YUAN_STK7700PH, 3864 ASUS_U3000H, 3865 PINNACLE_PCTV801E, 3866 PINNACLE_PCTV801E_SE, 3867 TERRATEC_CINERGY_T_EXPRESS, 3868 TERRATEC_CINERGY_DT_XS_DIVERSITY_2, 3869 SONY_PLAYTV, 3870 YUAN_PD378S, 3871 HAUPPAUGE_TIGER_ATSC, 3872 HAUPPAUGE_TIGER_ATSC_B210, 3873 YUAN_MC770, 3874 ELGATO_EYETV_DTT, 3875 ELGATO_EYETV_DTT_Dlx, 3876 LEADTEK_WINFAST_DTV_DONGLE_H, 3877 TERRATEC_T3, 3878 TERRATEC_T5, 3879 YUAN_STK7700D, 3880 YUAN_STK7700D_2, 3881 PINNACLE_PCTV73A, 3882 PCTV_PINNACLE_PCTV73ESE, 3883 PCTV_PINNACLE_PCTV282E, 3884 DIBCOM_STK7770P, 3885 TERRATEC_CINERGY_T_XXS_2, 3886 DIBCOM_STK807XPVR, 3887 DIBCOM_STK807XP, 3888 PIXELVIEW_SBTVD, 3889 EVOLUTEPC_TVWAY_PLUS, 3890 PINNACLE_PCTV73ESE, 3891 PINNACLE_PCTV282E, 3892 DIBCOM_STK8096GP, 3893 ELGATO_EYETV_DIVERSITY, 3894 DIBCOM_NIM9090M, 3895 DIBCOM_NIM8096MD, 3896 DIBCOM_NIM9090MD, 3897 DIBCOM_NIM7090, 3898 DIBCOM_TFE7090PVR, 3899 TECHNISAT_AIRSTAR_TELESTICK_2, 3900 MEDION_CREATIX_CTX1921, 3901 PINNACLE_PCTV340E, 3902 PINNACLE_PCTV340E_SE, 3903 DIBCOM_TFE7790P, 3904 DIBCOM_TFE8096P, 3905 ELGATO_EYETV_DTT_2, 3906 PCTV_2002E, 3907 PCTV_2002E_SE, 3908 PCTV_DIBCOM_STK8096PVR, 3909 DIBCOM_STK8096PVR, 3910 HAMA_DVBT_HYBRID, 3911 MICROSOFT_XBOX_ONE_TUNER, 3912 }; 3913 3914 struct usb_device_id dib0700_usb_id_table[] = { 3915 DVB_USB_DEV(DIBCOM, DIBCOM_STK7700P), 3916 DVB_USB_DEV(DIBCOM, DIBCOM_STK7700P_PC), 3917 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_NOVA_T_500), 3918 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_NOVA_T_500_2), 3919 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_NOVA_T_STICK), 3920 DVB_USB_DEV(AVERMEDIA, AVERMEDIA_VOLAR), 3921 DVB_USB_DEV(COMPRO, COMPRO_VIDEOMATE_U500), 3922 DVB_USB_DEV(UNIWILL, UNIWILL_STK7700P), 3923 DVB_USB_DEV(LEADTEK, LEADTEK_WINFAST_DTV_DONGLE_STK7700P), 3924 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_NOVA_T_STICK_2), 3925 DVB_USB_DEV(AVERMEDIA, AVERMEDIA_VOLAR_2), 3926 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV2000E), 3927 DVB_USB_DEV(TERRATEC, TERRATEC_CINERGY_DT_XS_DIVERSITY), 3928 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_NOVA_TD_STICK), 3929 DVB_USB_DEV(DIBCOM, DIBCOM_STK7700D), 3930 DVB_USB_DEV(DIBCOM, DIBCOM_STK7070P), 3931 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV_DVB_T_FLASH), 3932 DVB_USB_DEV(DIBCOM, DIBCOM_STK7070PD), 3933 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T), 3934 DVB_USB_DEV(COMPRO, COMPRO_VIDEOMATE_U500_PC), 3935 DVB_USB_DEV(AVERMEDIA, AVERMEDIA_EXPRESS), 3936 DVB_USB_DEV(GIGABYTE, GIGABYTE_U7000), 3937 DVB_USB_DEV(ULTIMA_ELECTRONIC, ULTIMA_ARTEC_T14BR), 3938 DVB_USB_DEV(ASUS, ASUS_U3000), 3939 DVB_USB_DEV(ASUS, ASUS_U3100), 3940 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_NOVA_T_STICK_3), 3941 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_MYTV_T), 3942 DVB_USB_DEV(TERRATEC, TERRATEC_CINERGY_HT_USB_XE), 3943 DVB_USB_DEV(PINNACLE, PINNACLE_EXPRESSCARD_320CX), 3944 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV72E), 3945 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV73E), 3946 DVB_USB_DEV(YUAN, YUAN_EC372S), 3947 DVB_USB_DEV(TERRATEC, TERRATEC_CINERGY_HT_EXPRESS), 3948 DVB_USB_DEV(TERRATEC, TERRATEC_CINERGY_T_XXS), 3949 DVB_USB_DEV(LEADTEK, LEADTEK_WINFAST_DTV_DONGLE_STK7700P_2), 3950 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_NOVA_TD_STICK_52009), 3951 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_NOVA_T_500_3), 3952 DVB_USB_DEV(GIGABYTE, GIGABYTE_U8000), 3953 DVB_USB_DEV(YUAN, YUAN_STK7700PH), 3954 DVB_USB_DEV(ASUS, ASUS_U3000H), 3955 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV801E), 3956 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV801E_SE), 3957 DVB_USB_DEV(TERRATEC, TERRATEC_CINERGY_T_EXPRESS), 3958 DVB_USB_DEV(TERRATEC, TERRATEC_CINERGY_DT_XS_DIVERSITY_2), 3959 DVB_USB_DEV(SONY, SONY_PLAYTV), 3960 DVB_USB_DEV(YUAN, YUAN_PD378S), 3961 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_TIGER_ATSC), 3962 DVB_USB_DEV(HAUPPAUGE, HAUPPAUGE_TIGER_ATSC_B210), 3963 DVB_USB_DEV(YUAN, YUAN_MC770), 3964 DVB_USB_DEV(ELGATO, ELGATO_EYETV_DTT), 3965 DVB_USB_DEV(ELGATO, ELGATO_EYETV_DTT_Dlx), 3966 DVB_USB_DEV(LEADTEK, LEADTEK_WINFAST_DTV_DONGLE_H), 3967 DVB_USB_DEV(TERRATEC, TERRATEC_T3), 3968 DVB_USB_DEV(TERRATEC, TERRATEC_T5), 3969 DVB_USB_DEV(YUAN, YUAN_STK7700D), 3970 DVB_USB_DEV(YUAN, YUAN_STK7700D_2), 3971 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV73A), 3972 DVB_USB_DEV(PCTV, PCTV_PINNACLE_PCTV73ESE), 3973 DVB_USB_DEV(PCTV, PCTV_PINNACLE_PCTV282E), 3974 DVB_USB_DEV(DIBCOM, DIBCOM_STK7770P), 3975 DVB_USB_DEV(TERRATEC, TERRATEC_CINERGY_T_XXS_2), 3976 DVB_USB_DEV(DIBCOM, DIBCOM_STK807XPVR), 3977 DVB_USB_DEV(DIBCOM, DIBCOM_STK807XP), 3978 DVB_USB_DEV_VER(PIXELVIEW, PIXELVIEW_SBTVD, 0x000, 0x3f00), 3979 DVB_USB_DEV(EVOLUTEPC, EVOLUTEPC_TVWAY_PLUS), 3980 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV73ESE), 3981 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV282E), 3982 DVB_USB_DEV(DIBCOM, DIBCOM_STK8096GP), 3983 DVB_USB_DEV(ELGATO, ELGATO_EYETV_DIVERSITY), 3984 DVB_USB_DEV(DIBCOM, DIBCOM_NIM9090M), 3985 DVB_USB_DEV(DIBCOM, DIBCOM_NIM8096MD), 3986 DVB_USB_DEV(DIBCOM, DIBCOM_NIM9090MD), 3987 DVB_USB_DEV(DIBCOM, DIBCOM_NIM7090), 3988 DVB_USB_DEV(DIBCOM, DIBCOM_TFE7090PVR), 3989 DVB_USB_DEV(TECHNISAT, TECHNISAT_AIRSTAR_TELESTICK_2), 3990 DVB_USB_DEV(MEDION, MEDION_CREATIX_CTX1921), 3991 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV340E), 3992 DVB_USB_DEV(PINNACLE, PINNACLE_PCTV340E_SE), 3993 DVB_USB_DEV(DIBCOM, DIBCOM_TFE7790P), 3994 DVB_USB_DEV(DIBCOM, DIBCOM_TFE8096P), 3995 DVB_USB_DEV(ELGATO, ELGATO_EYETV_DTT_2), 3996 DVB_USB_DEV(PCTV, PCTV_2002E), 3997 DVB_USB_DEV(PCTV, PCTV_2002E_SE), 3998 DVB_USB_DEV(PCTV, PCTV_DIBCOM_STK8096PVR), 3999 DVB_USB_DEV(DIBCOM, DIBCOM_STK8096PVR), 4000 DVB_USB_DEV(HAMA, HAMA_DVBT_HYBRID), 4001 DVB_USB_DEV(MICROSOFT, MICROSOFT_XBOX_ONE_TUNER), 4002 { } 4003 }; 4004 4005 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table); 4006 4007 #define DIB0700_DEFAULT_DEVICE_PROPERTIES \ 4008 .caps = DVB_USB_IS_AN_I2C_ADAPTER, \ 4009 .usb_ctrl = DEVICE_SPECIFIC, \ 4010 .firmware = "dvb-usb-dib0700-1.20.fw", \ 4011 .download_firmware = dib0700_download_firmware, \ 4012 .no_reconnect = 1, \ 4013 .size_of_priv = sizeof(struct dib0700_state), \ 4014 .i2c_algo = &dib0700_i2c_algo, \ 4015 .identify_state = dib0700_identify_state 4016 4017 #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \ 4018 .streaming_ctrl = dib0700_streaming_ctrl, \ 4019 .stream = { \ 4020 .type = USB_BULK, \ 4021 .count = 4, \ 4022 .endpoint = ep, \ 4023 .u = { \ 4024 .bulk = { \ 4025 .buffersize = 39480, \ 4026 } \ 4027 } \ 4028 } 4029 4030 #define DIB0700_NUM_FRONTENDS(n) \ 4031 .num_frontends = n, \ 4032 .size_of_priv = sizeof(struct dib0700_adapter_state) 4033 4034 struct dvb_usb_device_properties dib0700_devices[] = { 4035 { 4036 DIB0700_DEFAULT_DEVICE_PROPERTIES, 4037 4038 .num_adapters = 1, 4039 .adapter = { 4040 { 4041 DIB0700_NUM_FRONTENDS(1), 4042 .fe = {{ 4043 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4044 .pid_filter_count = 32, 4045 .pid_filter = stk7700p_pid_filter, 4046 .pid_filter_ctrl = stk7700p_pid_filter_ctrl, 4047 .frontend_attach = stk7700p_frontend_attach, 4048 .tuner_attach = stk7700p_tuner_attach, 4049 4050 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4051 }}, 4052 }, 4053 }, 4054 4055 .num_device_descs = 8, 4056 .devices = { 4057 { "DiBcom STK7700P reference design", 4058 { &dib0700_usb_id_table[DIBCOM_STK7700P], &dib0700_usb_id_table[DIBCOM_STK7700P_PC] }, 4059 { NULL }, 4060 }, 4061 { "Hauppauge Nova-T Stick", 4062 { &dib0700_usb_id_table[HAUPPAUGE_NOVA_T_STICK], &dib0700_usb_id_table[HAUPPAUGE_NOVA_T_STICK_2], NULL }, 4063 { NULL }, 4064 }, 4065 { "AVerMedia AVerTV DVB-T Volar", 4066 { &dib0700_usb_id_table[AVERMEDIA_VOLAR], &dib0700_usb_id_table[AVERMEDIA_VOLAR_2] }, 4067 { NULL }, 4068 }, 4069 { "Compro Videomate U500", 4070 { &dib0700_usb_id_table[COMPRO_VIDEOMATE_U500], &dib0700_usb_id_table[COMPRO_VIDEOMATE_U500_PC] }, 4071 { NULL }, 4072 }, 4073 { "Uniwill STK7700P based (Hama and others)", 4074 { &dib0700_usb_id_table[UNIWILL_STK7700P], NULL }, 4075 { NULL }, 4076 }, 4077 { "Leadtek Winfast DTV Dongle (STK7700P based)", 4078 { &dib0700_usb_id_table[LEADTEK_WINFAST_DTV_DONGLE_STK7700P], &dib0700_usb_id_table[LEADTEK_WINFAST_DTV_DONGLE_STK7700P_2] }, 4079 { NULL }, 4080 }, 4081 { "AVerMedia AVerTV DVB-T Express", 4082 { &dib0700_usb_id_table[AVERMEDIA_EXPRESS] }, 4083 { NULL }, 4084 }, 4085 { "Gigabyte U7000", 4086 { &dib0700_usb_id_table[GIGABYTE_U7000], NULL }, 4087 { NULL }, 4088 } 4089 }, 4090 4091 .rc.core = { 4092 .rc_interval = DEFAULT_RC_INTERVAL, 4093 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4094 .rc_query = dib0700_rc_query_old_firmware, 4095 .allowed_protos = RC_PROTO_BIT_RC5 | 4096 RC_PROTO_BIT_RC6_MCE | 4097 RC_PROTO_BIT_NEC, 4098 .change_protocol = dib0700_change_protocol, 4099 }, 4100 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4101 4102 .num_adapters = 2, 4103 .adapter = { 4104 { 4105 DIB0700_NUM_FRONTENDS(1), 4106 .fe = {{ 4107 .frontend_attach = bristol_frontend_attach, 4108 .tuner_attach = bristol_tuner_attach, 4109 4110 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4111 }}, 4112 }, { 4113 DIB0700_NUM_FRONTENDS(1), 4114 .fe = {{ 4115 .frontend_attach = bristol_frontend_attach, 4116 .tuner_attach = bristol_tuner_attach, 4117 4118 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 4119 }}, 4120 } 4121 }, 4122 4123 .num_device_descs = 1, 4124 .devices = { 4125 { "Hauppauge Nova-T 500 Dual DVB-T", 4126 { &dib0700_usb_id_table[HAUPPAUGE_NOVA_T_500], &dib0700_usb_id_table[HAUPPAUGE_NOVA_T_500_2], NULL }, 4127 { NULL }, 4128 }, 4129 }, 4130 4131 .rc.core = { 4132 .rc_interval = DEFAULT_RC_INTERVAL, 4133 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4134 .rc_query = dib0700_rc_query_old_firmware, 4135 .allowed_protos = RC_PROTO_BIT_RC5 | 4136 RC_PROTO_BIT_RC6_MCE | 4137 RC_PROTO_BIT_NEC, 4138 .change_protocol = dib0700_change_protocol, 4139 }, 4140 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4141 4142 .num_adapters = 2, 4143 .adapter = { 4144 { 4145 DIB0700_NUM_FRONTENDS(1), 4146 .fe = {{ 4147 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4148 .pid_filter_count = 32, 4149 .pid_filter = stk70x0p_pid_filter, 4150 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4151 .frontend_attach = stk7700d_frontend_attach, 4152 .tuner_attach = stk7700d_tuner_attach, 4153 4154 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4155 }}, 4156 }, { 4157 DIB0700_NUM_FRONTENDS(1), 4158 .fe = {{ 4159 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4160 .pid_filter_count = 32, 4161 .pid_filter = stk70x0p_pid_filter, 4162 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4163 .frontend_attach = stk7700d_frontend_attach, 4164 .tuner_attach = stk7700d_tuner_attach, 4165 4166 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 4167 }}, 4168 } 4169 }, 4170 4171 .num_device_descs = 5, 4172 .devices = { 4173 { "Pinnacle PCTV 2000e", 4174 { &dib0700_usb_id_table[PINNACLE_PCTV2000E], NULL }, 4175 { NULL }, 4176 }, 4177 { "Terratec Cinergy DT XS Diversity", 4178 { &dib0700_usb_id_table[TERRATEC_CINERGY_DT_XS_DIVERSITY], NULL }, 4179 { NULL }, 4180 }, 4181 { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity", 4182 { &dib0700_usb_id_table[HAUPPAUGE_NOVA_TD_STICK], NULL }, 4183 { NULL }, 4184 }, 4185 { "DiBcom STK7700D reference design", 4186 { &dib0700_usb_id_table[DIBCOM_STK7700D], NULL }, 4187 { NULL }, 4188 }, 4189 { "YUAN High-Tech DiBcom STK7700D", 4190 { &dib0700_usb_id_table[YUAN_STK7700D_2], NULL }, 4191 { NULL }, 4192 }, 4193 4194 }, 4195 4196 .rc.core = { 4197 .rc_interval = DEFAULT_RC_INTERVAL, 4198 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4199 .rc_query = dib0700_rc_query_old_firmware, 4200 .allowed_protos = RC_PROTO_BIT_RC5 | 4201 RC_PROTO_BIT_RC6_MCE | 4202 RC_PROTO_BIT_NEC, 4203 .change_protocol = dib0700_change_protocol, 4204 }, 4205 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4206 4207 .num_adapters = 1, 4208 .adapter = { 4209 { 4210 DIB0700_NUM_FRONTENDS(1), 4211 .fe = {{ 4212 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4213 .pid_filter_count = 32, 4214 .pid_filter = stk70x0p_pid_filter, 4215 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4216 .frontend_attach = stk7700P2_frontend_attach, 4217 .tuner_attach = stk7700d_tuner_attach, 4218 4219 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4220 }}, 4221 }, 4222 }, 4223 4224 .num_device_descs = 3, 4225 .devices = { 4226 { "ASUS My Cinema U3000 Mini DVBT Tuner", 4227 { &dib0700_usb_id_table[ASUS_U3000], NULL }, 4228 { NULL }, 4229 }, 4230 { "Yuan EC372S", 4231 { &dib0700_usb_id_table[YUAN_EC372S], NULL }, 4232 { NULL }, 4233 }, 4234 { "Terratec Cinergy T Express", 4235 { &dib0700_usb_id_table[TERRATEC_CINERGY_T_EXPRESS], NULL }, 4236 { NULL }, 4237 } 4238 }, 4239 4240 .rc.core = { 4241 .rc_interval = DEFAULT_RC_INTERVAL, 4242 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4243 .module_name = "dib0700", 4244 .rc_query = dib0700_rc_query_old_firmware, 4245 .allowed_protos = RC_PROTO_BIT_RC5 | 4246 RC_PROTO_BIT_RC6_MCE | 4247 RC_PROTO_BIT_NEC, 4248 .change_protocol = dib0700_change_protocol, 4249 }, 4250 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4251 4252 .num_adapters = 1, 4253 .adapter = { 4254 { 4255 DIB0700_NUM_FRONTENDS(1), 4256 .fe = {{ 4257 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4258 .pid_filter_count = 32, 4259 .pid_filter = stk70x0p_pid_filter, 4260 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4261 .frontend_attach = stk7070p_frontend_attach, 4262 .tuner_attach = dib7070p_tuner_attach, 4263 4264 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4265 }}, 4266 }, 4267 }, 4268 4269 .num_device_descs = 12, 4270 .devices = { 4271 { "DiBcom STK7070P reference design", 4272 { &dib0700_usb_id_table[DIBCOM_STK7070P], NULL }, 4273 { NULL }, 4274 }, 4275 { "Pinnacle PCTV DVB-T Flash Stick", 4276 { &dib0700_usb_id_table[PINNACLE_PCTV_DVB_T_FLASH], NULL }, 4277 { NULL }, 4278 }, 4279 { "Artec T14BR DVB-T", 4280 { &dib0700_usb_id_table[ULTIMA_ARTEC_T14BR], NULL }, 4281 { NULL }, 4282 }, 4283 { "ASUS My Cinema U3100 Mini DVBT Tuner", 4284 { &dib0700_usb_id_table[ASUS_U3100], NULL }, 4285 { NULL }, 4286 }, 4287 { "Hauppauge Nova-T Stick", 4288 { &dib0700_usb_id_table[HAUPPAUGE_NOVA_T_STICK_3], NULL }, 4289 { NULL }, 4290 }, 4291 { "Hauppauge Nova-T MyTV.t", 4292 { &dib0700_usb_id_table[HAUPPAUGE_MYTV_T], NULL }, 4293 { NULL }, 4294 }, 4295 { "Pinnacle PCTV 72e", 4296 { &dib0700_usb_id_table[PINNACLE_PCTV72E], NULL }, 4297 { NULL }, 4298 }, 4299 { "Pinnacle PCTV 73e", 4300 { &dib0700_usb_id_table[PINNACLE_PCTV73E], NULL }, 4301 { NULL }, 4302 }, 4303 { "Elgato EyeTV DTT", 4304 { &dib0700_usb_id_table[ELGATO_EYETV_DTT], NULL }, 4305 { NULL }, 4306 }, 4307 { "Yuan PD378S", 4308 { &dib0700_usb_id_table[YUAN_PD378S], NULL }, 4309 { NULL }, 4310 }, 4311 { "Elgato EyeTV Dtt Dlx PD378S", 4312 { &dib0700_usb_id_table[ELGATO_EYETV_DTT_Dlx], NULL }, 4313 { NULL }, 4314 }, 4315 { "Elgato EyeTV DTT rev. 2", 4316 { &dib0700_usb_id_table[ELGATO_EYETV_DTT_2], NULL }, 4317 { NULL }, 4318 }, 4319 }, 4320 4321 .rc.core = { 4322 .rc_interval = DEFAULT_RC_INTERVAL, 4323 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4324 .module_name = "dib0700", 4325 .rc_query = dib0700_rc_query_old_firmware, 4326 .allowed_protos = RC_PROTO_BIT_RC5 | 4327 RC_PROTO_BIT_RC6_MCE | 4328 RC_PROTO_BIT_NEC, 4329 .change_protocol = dib0700_change_protocol, 4330 }, 4331 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4332 4333 .num_adapters = 1, 4334 .adapter = { 4335 { 4336 DIB0700_NUM_FRONTENDS(1), 4337 .fe = {{ 4338 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4339 .pid_filter_count = 32, 4340 .pid_filter = stk70x0p_pid_filter, 4341 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4342 .frontend_attach = stk7070p_frontend_attach, 4343 .tuner_attach = dib7070p_tuner_attach, 4344 4345 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4346 }}, 4347 }, 4348 }, 4349 4350 .num_device_descs = 3, 4351 .devices = { 4352 { "Pinnacle PCTV 73A", 4353 { &dib0700_usb_id_table[PINNACLE_PCTV73A], NULL }, 4354 { NULL }, 4355 }, 4356 { "Pinnacle PCTV 73e SE", 4357 { &dib0700_usb_id_table[PCTV_PINNACLE_PCTV73ESE], &dib0700_usb_id_table[PINNACLE_PCTV73ESE], NULL }, 4358 { NULL }, 4359 }, 4360 { "Pinnacle PCTV 282e", 4361 { &dib0700_usb_id_table[PCTV_PINNACLE_PCTV282E], &dib0700_usb_id_table[PINNACLE_PCTV282E], NULL }, 4362 { NULL }, 4363 }, 4364 }, 4365 4366 .rc.core = { 4367 .rc_interval = DEFAULT_RC_INTERVAL, 4368 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4369 .module_name = "dib0700", 4370 .rc_query = dib0700_rc_query_old_firmware, 4371 .allowed_protos = RC_PROTO_BIT_RC5 | 4372 RC_PROTO_BIT_RC6_MCE | 4373 RC_PROTO_BIT_NEC, 4374 .change_protocol = dib0700_change_protocol, 4375 }, 4376 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4377 4378 .num_adapters = 2, 4379 .adapter = { 4380 { 4381 DIB0700_NUM_FRONTENDS(1), 4382 .fe = {{ 4383 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4384 .pid_filter_count = 32, 4385 .pid_filter = stk70x0p_pid_filter, 4386 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4387 .frontend_attach = novatd_frontend_attach, 4388 .tuner_attach = dib7070p_tuner_attach, 4389 4390 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4391 }}, 4392 }, { 4393 DIB0700_NUM_FRONTENDS(1), 4394 .fe = {{ 4395 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4396 .pid_filter_count = 32, 4397 .pid_filter = stk70x0p_pid_filter, 4398 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4399 .frontend_attach = novatd_frontend_attach, 4400 .tuner_attach = dib7070p_tuner_attach, 4401 4402 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 4403 }}, 4404 } 4405 }, 4406 4407 .num_device_descs = 3, 4408 .devices = { 4409 { "Hauppauge Nova-TD Stick (52009)", 4410 { &dib0700_usb_id_table[HAUPPAUGE_NOVA_TD_STICK_52009], NULL }, 4411 { NULL }, 4412 }, 4413 { "PCTV 2002e", 4414 { &dib0700_usb_id_table[PCTV_2002E], NULL }, 4415 { NULL }, 4416 }, 4417 { "PCTV 2002e SE", 4418 { &dib0700_usb_id_table[PCTV_2002E_SE], NULL }, 4419 { NULL }, 4420 }, 4421 }, 4422 4423 .rc.core = { 4424 .rc_interval = DEFAULT_RC_INTERVAL, 4425 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4426 .module_name = "dib0700", 4427 .rc_query = dib0700_rc_query_old_firmware, 4428 .allowed_protos = RC_PROTO_BIT_RC5 | 4429 RC_PROTO_BIT_RC6_MCE | 4430 RC_PROTO_BIT_NEC, 4431 .change_protocol = dib0700_change_protocol, 4432 }, 4433 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4434 4435 .num_adapters = 2, 4436 .adapter = { 4437 { 4438 DIB0700_NUM_FRONTENDS(1), 4439 .fe = {{ 4440 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4441 .pid_filter_count = 32, 4442 .pid_filter = stk70x0p_pid_filter, 4443 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4444 .frontend_attach = stk7070pd_frontend_attach0, 4445 .tuner_attach = dib7070p_tuner_attach, 4446 4447 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4448 }}, 4449 }, { 4450 DIB0700_NUM_FRONTENDS(1), 4451 .fe = {{ 4452 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4453 .pid_filter_count = 32, 4454 .pid_filter = stk70x0p_pid_filter, 4455 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4456 .frontend_attach = stk7070pd_frontend_attach1, 4457 .tuner_attach = dib7070p_tuner_attach, 4458 4459 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 4460 }}, 4461 } 4462 }, 4463 4464 .num_device_descs = 5, 4465 .devices = { 4466 { "DiBcom STK7070PD reference design", 4467 { &dib0700_usb_id_table[DIBCOM_STK7070PD], NULL }, 4468 { NULL }, 4469 }, 4470 { "Pinnacle PCTV Dual DVB-T Diversity Stick", 4471 { &dib0700_usb_id_table[PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T], NULL }, 4472 { NULL }, 4473 }, 4474 { "Hauppauge Nova-TD-500 (84xxx)", 4475 { &dib0700_usb_id_table[HAUPPAUGE_NOVA_T_500_3], NULL }, 4476 { NULL }, 4477 }, 4478 { "Terratec Cinergy DT USB XS Diversity/ T5", 4479 { &dib0700_usb_id_table[TERRATEC_CINERGY_DT_XS_DIVERSITY_2], 4480 &dib0700_usb_id_table[TERRATEC_T5], NULL}, 4481 { NULL }, 4482 }, 4483 { "Sony PlayTV", 4484 { &dib0700_usb_id_table[SONY_PLAYTV], NULL }, 4485 { NULL }, 4486 }, 4487 }, 4488 4489 .rc.core = { 4490 .rc_interval = DEFAULT_RC_INTERVAL, 4491 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4492 .module_name = "dib0700", 4493 .rc_query = dib0700_rc_query_old_firmware, 4494 .allowed_protos = RC_PROTO_BIT_RC5 | 4495 RC_PROTO_BIT_RC6_MCE | 4496 RC_PROTO_BIT_NEC, 4497 .change_protocol = dib0700_change_protocol, 4498 }, 4499 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4500 4501 .num_adapters = 2, 4502 .adapter = { 4503 { 4504 DIB0700_NUM_FRONTENDS(1), 4505 .fe = {{ 4506 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4507 .pid_filter_count = 32, 4508 .pid_filter = stk70x0p_pid_filter, 4509 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4510 .frontend_attach = stk7070pd_frontend_attach0, 4511 .tuner_attach = dib7070p_tuner_attach, 4512 4513 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4514 }}, 4515 }, { 4516 DIB0700_NUM_FRONTENDS(1), 4517 .fe = {{ 4518 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4519 .pid_filter_count = 32, 4520 .pid_filter = stk70x0p_pid_filter, 4521 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4522 .frontend_attach = stk7070pd_frontend_attach1, 4523 .tuner_attach = dib7070p_tuner_attach, 4524 4525 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 4526 }}, 4527 } 4528 }, 4529 4530 .num_device_descs = 1, 4531 .devices = { 4532 { "Elgato EyeTV Diversity", 4533 { &dib0700_usb_id_table[ELGATO_EYETV_DIVERSITY], NULL }, 4534 { NULL }, 4535 }, 4536 }, 4537 4538 .rc.core = { 4539 .rc_interval = DEFAULT_RC_INTERVAL, 4540 .rc_codes = RC_MAP_DIB0700_NEC_TABLE, 4541 .module_name = "dib0700", 4542 .rc_query = dib0700_rc_query_old_firmware, 4543 .allowed_protos = RC_PROTO_BIT_RC5 | 4544 RC_PROTO_BIT_RC6_MCE | 4545 RC_PROTO_BIT_NEC, 4546 .change_protocol = dib0700_change_protocol, 4547 }, 4548 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4549 4550 .num_adapters = 1, 4551 .adapter = { 4552 { 4553 DIB0700_NUM_FRONTENDS(1), 4554 .fe = {{ 4555 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4556 .pid_filter_count = 32, 4557 .pid_filter = stk70x0p_pid_filter, 4558 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4559 .frontend_attach = stk7700ph_frontend_attach, 4560 .tuner_attach = stk7700ph_tuner_attach, 4561 4562 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4563 }}, 4564 }, 4565 }, 4566 4567 .num_device_descs = 10, 4568 .devices = { 4569 { "Terratec Cinergy HT USB XE", 4570 { &dib0700_usb_id_table[TERRATEC_CINERGY_HT_USB_XE], NULL }, 4571 { NULL }, 4572 }, 4573 { "Pinnacle Expresscard 320cx", 4574 { &dib0700_usb_id_table[PINNACLE_EXPRESSCARD_320CX], NULL }, 4575 { NULL }, 4576 }, 4577 { "Terratec Cinergy HT Express", 4578 { &dib0700_usb_id_table[TERRATEC_CINERGY_HT_EXPRESS], NULL }, 4579 { NULL }, 4580 }, 4581 { "Gigabyte U8000-RH", 4582 { &dib0700_usb_id_table[GIGABYTE_U8000], NULL }, 4583 { NULL }, 4584 }, 4585 { "YUAN High-Tech STK7700PH", 4586 { &dib0700_usb_id_table[YUAN_STK7700PH], NULL }, 4587 { NULL }, 4588 }, 4589 { "Asus My Cinema-U3000Hybrid", 4590 { &dib0700_usb_id_table[ASUS_U3000H], NULL }, 4591 { NULL }, 4592 }, 4593 { "YUAN High-Tech MC770", 4594 { &dib0700_usb_id_table[YUAN_MC770], NULL }, 4595 { NULL }, 4596 }, 4597 { "Leadtek WinFast DTV Dongle H", 4598 { &dib0700_usb_id_table[LEADTEK_WINFAST_DTV_DONGLE_H], NULL }, 4599 { NULL }, 4600 }, 4601 { "YUAN High-Tech STK7700D", 4602 { &dib0700_usb_id_table[YUAN_STK7700D], NULL }, 4603 { NULL }, 4604 }, 4605 { "Hama DVB=T Hybrid USB Stick", 4606 { &dib0700_usb_id_table[HAMA_DVBT_HYBRID], NULL }, 4607 { NULL }, 4608 }, 4609 }, 4610 4611 .rc.core = { 4612 .rc_interval = DEFAULT_RC_INTERVAL, 4613 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4614 .module_name = "dib0700", 4615 .rc_query = dib0700_rc_query_old_firmware, 4616 .allowed_protos = RC_PROTO_BIT_RC5 | 4617 RC_PROTO_BIT_RC6_MCE | 4618 RC_PROTO_BIT_NEC, 4619 .change_protocol = dib0700_change_protocol, 4620 }, 4621 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4622 .num_adapters = 1, 4623 .adapter = { 4624 { 4625 DIB0700_NUM_FRONTENDS(1), 4626 .fe = {{ 4627 .frontend_attach = s5h1411_frontend_attach, 4628 .tuner_attach = xc5000_tuner_attach, 4629 4630 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4631 }}, 4632 }, 4633 }, 4634 4635 .num_device_descs = 2, 4636 .devices = { 4637 { "Pinnacle PCTV HD Pro USB Stick", 4638 { &dib0700_usb_id_table[PINNACLE_PCTV801E], NULL }, 4639 { NULL }, 4640 }, 4641 { "Pinnacle PCTV HD USB Stick", 4642 { &dib0700_usb_id_table[PINNACLE_PCTV801E_SE], NULL }, 4643 { NULL }, 4644 }, 4645 }, 4646 4647 .rc.core = { 4648 .rc_interval = DEFAULT_RC_INTERVAL, 4649 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4650 .module_name = "dib0700", 4651 .rc_query = dib0700_rc_query_old_firmware, 4652 .allowed_protos = RC_PROTO_BIT_RC5 | 4653 RC_PROTO_BIT_RC6_MCE | 4654 RC_PROTO_BIT_NEC, 4655 .change_protocol = dib0700_change_protocol, 4656 }, 4657 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4658 .num_adapters = 1, 4659 .adapter = { 4660 { 4661 DIB0700_NUM_FRONTENDS(1), 4662 .fe = {{ 4663 .frontend_attach = lgdt3305_frontend_attach, 4664 .tuner_attach = mxl5007t_tuner_attach, 4665 4666 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4667 }}, 4668 }, 4669 }, 4670 4671 .num_device_descs = 2, 4672 .devices = { 4673 { "Hauppauge ATSC MiniCard (B200)", 4674 { &dib0700_usb_id_table[HAUPPAUGE_TIGER_ATSC], NULL }, 4675 { NULL }, 4676 }, 4677 { "Hauppauge ATSC MiniCard (B210)", 4678 { &dib0700_usb_id_table[HAUPPAUGE_TIGER_ATSC_B210], NULL }, 4679 { NULL }, 4680 }, 4681 }, 4682 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4683 4684 .num_adapters = 1, 4685 .adapter = { 4686 { 4687 DIB0700_NUM_FRONTENDS(1), 4688 .fe = {{ 4689 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4690 .pid_filter_count = 32, 4691 .pid_filter = stk70x0p_pid_filter, 4692 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4693 .frontend_attach = stk7770p_frontend_attach, 4694 .tuner_attach = dib7770p_tuner_attach, 4695 4696 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4697 }}, 4698 }, 4699 }, 4700 4701 .num_device_descs = 4, 4702 .devices = { 4703 { "DiBcom STK7770P reference design", 4704 { &dib0700_usb_id_table[DIBCOM_STK7770P], NULL }, 4705 { NULL }, 4706 }, 4707 { "Terratec Cinergy T USB XXS (HD)/ T3", 4708 { &dib0700_usb_id_table[TERRATEC_CINERGY_T_XXS], 4709 &dib0700_usb_id_table[TERRATEC_T3], 4710 &dib0700_usb_id_table[TERRATEC_CINERGY_T_XXS_2], NULL}, 4711 { NULL }, 4712 }, 4713 { "TechniSat AirStar TeleStick 2", 4714 { &dib0700_usb_id_table[TECHNISAT_AIRSTAR_TELESTICK_2], NULL }, 4715 { NULL }, 4716 }, 4717 { "Medion CTX1921 DVB-T USB", 4718 { &dib0700_usb_id_table[MEDION_CREATIX_CTX1921], NULL }, 4719 { NULL }, 4720 }, 4721 }, 4722 4723 .rc.core = { 4724 .rc_interval = DEFAULT_RC_INTERVAL, 4725 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4726 .module_name = "dib0700", 4727 .rc_query = dib0700_rc_query_old_firmware, 4728 .allowed_protos = RC_PROTO_BIT_RC5 | 4729 RC_PROTO_BIT_RC6_MCE | 4730 RC_PROTO_BIT_NEC, 4731 .change_protocol = dib0700_change_protocol, 4732 }, 4733 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4734 .num_adapters = 1, 4735 .adapter = { 4736 { 4737 DIB0700_NUM_FRONTENDS(1), 4738 .fe = {{ 4739 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4740 .pid_filter_count = 32, 4741 .pid_filter = stk80xx_pid_filter, 4742 .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 4743 .frontend_attach = stk807x_frontend_attach, 4744 .tuner_attach = dib807x_tuner_attach, 4745 4746 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4747 }}, 4748 }, 4749 }, 4750 4751 .num_device_descs = 3, 4752 .devices = { 4753 { "DiBcom STK807xP reference design", 4754 { &dib0700_usb_id_table[DIBCOM_STK807XP], NULL }, 4755 { NULL }, 4756 }, 4757 { "Prolink Pixelview SBTVD", 4758 { &dib0700_usb_id_table[PIXELVIEW_SBTVD], NULL }, 4759 { NULL }, 4760 }, 4761 { "EvolutePC TVWay+", 4762 { &dib0700_usb_id_table[EVOLUTEPC_TVWAY_PLUS], NULL }, 4763 { NULL }, 4764 }, 4765 }, 4766 4767 .rc.core = { 4768 .rc_interval = DEFAULT_RC_INTERVAL, 4769 .rc_codes = RC_MAP_DIB0700_NEC_TABLE, 4770 .module_name = "dib0700", 4771 .rc_query = dib0700_rc_query_old_firmware, 4772 .allowed_protos = RC_PROTO_BIT_RC5 | 4773 RC_PROTO_BIT_RC6_MCE | 4774 RC_PROTO_BIT_NEC, 4775 .change_protocol = dib0700_change_protocol, 4776 }, 4777 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4778 .num_adapters = 2, 4779 .adapter = { 4780 { 4781 DIB0700_NUM_FRONTENDS(1), 4782 .fe = {{ 4783 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4784 .pid_filter_count = 32, 4785 .pid_filter = stk80xx_pid_filter, 4786 .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 4787 .frontend_attach = stk807xpvr_frontend_attach0, 4788 .tuner_attach = dib807x_tuner_attach, 4789 4790 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4791 }}, 4792 }, 4793 { 4794 DIB0700_NUM_FRONTENDS(1), 4795 .fe = {{ 4796 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4797 .pid_filter_count = 32, 4798 .pid_filter = stk80xx_pid_filter, 4799 .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 4800 .frontend_attach = stk807xpvr_frontend_attach1, 4801 .tuner_attach = dib807x_tuner_attach, 4802 4803 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 4804 }}, 4805 }, 4806 }, 4807 4808 .num_device_descs = 1, 4809 .devices = { 4810 { "DiBcom STK807xPVR reference design", 4811 { &dib0700_usb_id_table[DIBCOM_STK807XPVR], NULL }, 4812 { NULL }, 4813 }, 4814 }, 4815 4816 .rc.core = { 4817 .rc_interval = DEFAULT_RC_INTERVAL, 4818 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4819 .module_name = "dib0700", 4820 .rc_query = dib0700_rc_query_old_firmware, 4821 .allowed_protos = RC_PROTO_BIT_RC5 | 4822 RC_PROTO_BIT_RC6_MCE | 4823 RC_PROTO_BIT_NEC, 4824 .change_protocol = dib0700_change_protocol, 4825 }, 4826 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4827 .num_adapters = 1, 4828 .adapter = { 4829 { 4830 DIB0700_NUM_FRONTENDS(1), 4831 .fe = {{ 4832 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 4833 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4834 .pid_filter_count = 32, 4835 .pid_filter = stk80xx_pid_filter, 4836 .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 4837 .frontend_attach = stk809x_frontend_attach, 4838 .tuner_attach = dib809x_tuner_attach, 4839 4840 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4841 }}, 4842 }, 4843 }, 4844 4845 .num_device_descs = 1, 4846 .devices = { 4847 { "DiBcom STK8096GP reference design", 4848 { &dib0700_usb_id_table[DIBCOM_STK8096GP], NULL }, 4849 { NULL }, 4850 }, 4851 }, 4852 4853 .rc.core = { 4854 .rc_interval = DEFAULT_RC_INTERVAL, 4855 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4856 .module_name = "dib0700", 4857 .rc_query = dib0700_rc_query_old_firmware, 4858 .allowed_protos = RC_PROTO_BIT_RC5 | 4859 RC_PROTO_BIT_RC6_MCE | 4860 RC_PROTO_BIT_NEC, 4861 .change_protocol = dib0700_change_protocol, 4862 }, 4863 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4864 .num_adapters = 1, 4865 .adapter = { 4866 { 4867 DIB0700_NUM_FRONTENDS(1), 4868 .fe = {{ 4869 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 4870 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4871 .pid_filter_count = 32, 4872 .pid_filter = dib90x0_pid_filter, 4873 .pid_filter_ctrl = dib90x0_pid_filter_ctrl, 4874 .frontend_attach = stk9090m_frontend_attach, 4875 .tuner_attach = dib9090_tuner_attach, 4876 4877 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4878 }}, 4879 }, 4880 }, 4881 4882 .num_device_descs = 1, 4883 .devices = { 4884 { "DiBcom STK9090M reference design", 4885 { &dib0700_usb_id_table[DIBCOM_NIM9090M], NULL }, 4886 { NULL }, 4887 }, 4888 }, 4889 4890 .rc.core = { 4891 .rc_interval = DEFAULT_RC_INTERVAL, 4892 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4893 .module_name = "dib0700", 4894 .rc_query = dib0700_rc_query_old_firmware, 4895 .allowed_protos = RC_PROTO_BIT_RC5 | 4896 RC_PROTO_BIT_RC6_MCE | 4897 RC_PROTO_BIT_NEC, 4898 .change_protocol = dib0700_change_protocol, 4899 }, 4900 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4901 .num_adapters = 1, 4902 .adapter = { 4903 { 4904 DIB0700_NUM_FRONTENDS(1), 4905 .fe = {{ 4906 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 4907 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4908 .pid_filter_count = 32, 4909 .pid_filter = stk80xx_pid_filter, 4910 .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 4911 .frontend_attach = nim8096md_frontend_attach, 4912 .tuner_attach = nim8096md_tuner_attach, 4913 4914 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4915 }}, 4916 }, 4917 }, 4918 4919 .num_device_descs = 1, 4920 .devices = { 4921 { "DiBcom NIM8096MD reference design", 4922 { &dib0700_usb_id_table[DIBCOM_NIM8096MD], NULL }, 4923 { NULL }, 4924 }, 4925 }, 4926 4927 .rc.core = { 4928 .rc_interval = DEFAULT_RC_INTERVAL, 4929 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4930 .module_name = "dib0700", 4931 .rc_query = dib0700_rc_query_old_firmware, 4932 .allowed_protos = RC_PROTO_BIT_RC5 | 4933 RC_PROTO_BIT_RC6_MCE | 4934 RC_PROTO_BIT_NEC, 4935 .change_protocol = dib0700_change_protocol, 4936 }, 4937 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4938 .num_adapters = 1, 4939 .adapter = { 4940 { 4941 DIB0700_NUM_FRONTENDS(1), 4942 .fe = {{ 4943 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 4944 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4945 .pid_filter_count = 32, 4946 .pid_filter = dib90x0_pid_filter, 4947 .pid_filter_ctrl = dib90x0_pid_filter_ctrl, 4948 .frontend_attach = nim9090md_frontend_attach, 4949 .tuner_attach = nim9090md_tuner_attach, 4950 4951 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4952 }}, 4953 }, 4954 }, 4955 4956 .num_device_descs = 1, 4957 .devices = { 4958 { "DiBcom NIM9090MD reference design", 4959 { &dib0700_usb_id_table[DIBCOM_NIM9090MD], NULL }, 4960 { NULL }, 4961 }, 4962 }, 4963 4964 .rc.core = { 4965 .rc_interval = DEFAULT_RC_INTERVAL, 4966 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 4967 .module_name = "dib0700", 4968 .rc_query = dib0700_rc_query_old_firmware, 4969 .allowed_protos = RC_PROTO_BIT_RC5 | 4970 RC_PROTO_BIT_RC6_MCE | 4971 RC_PROTO_BIT_NEC, 4972 .change_protocol = dib0700_change_protocol, 4973 }, 4974 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 4975 .num_adapters = 1, 4976 .adapter = { 4977 { 4978 DIB0700_NUM_FRONTENDS(1), 4979 .fe = {{ 4980 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 4981 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 4982 .pid_filter_count = 32, 4983 .pid_filter = stk70x0p_pid_filter, 4984 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 4985 .frontend_attach = nim7090_frontend_attach, 4986 .tuner_attach = nim7090_tuner_attach, 4987 4988 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 4989 }}, 4990 }, 4991 }, 4992 4993 .num_device_descs = 1, 4994 .devices = { 4995 { "DiBcom NIM7090 reference design", 4996 { &dib0700_usb_id_table[DIBCOM_NIM7090], NULL }, 4997 { NULL }, 4998 }, 4999 }, 5000 5001 .rc.core = { 5002 .rc_interval = DEFAULT_RC_INTERVAL, 5003 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 5004 .module_name = "dib0700", 5005 .rc_query = dib0700_rc_query_old_firmware, 5006 .allowed_protos = RC_PROTO_BIT_RC5 | 5007 RC_PROTO_BIT_RC6_MCE | 5008 RC_PROTO_BIT_NEC, 5009 .change_protocol = dib0700_change_protocol, 5010 }, 5011 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 5012 .num_adapters = 2, 5013 .adapter = { 5014 { 5015 DIB0700_NUM_FRONTENDS(1), 5016 .fe = {{ 5017 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 5018 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 5019 .pid_filter_count = 32, 5020 .pid_filter = stk70x0p_pid_filter, 5021 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 5022 .frontend_attach = tfe7090pvr_frontend0_attach, 5023 .tuner_attach = tfe7090pvr_tuner0_attach, 5024 5025 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 5026 }}, 5027 }, 5028 { 5029 DIB0700_NUM_FRONTENDS(1), 5030 .fe = {{ 5031 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 5032 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 5033 .pid_filter_count = 32, 5034 .pid_filter = stk70x0p_pid_filter, 5035 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 5036 .frontend_attach = tfe7090pvr_frontend1_attach, 5037 .tuner_attach = tfe7090pvr_tuner1_attach, 5038 5039 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 5040 }}, 5041 }, 5042 }, 5043 5044 .num_device_descs = 1, 5045 .devices = { 5046 { "DiBcom TFE7090PVR reference design", 5047 { &dib0700_usb_id_table[DIBCOM_TFE7090PVR], NULL }, 5048 { NULL }, 5049 }, 5050 }, 5051 5052 .rc.core = { 5053 .rc_interval = DEFAULT_RC_INTERVAL, 5054 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 5055 .module_name = "dib0700", 5056 .rc_query = dib0700_rc_query_old_firmware, 5057 .allowed_protos = RC_PROTO_BIT_RC5 | 5058 RC_PROTO_BIT_RC6_MCE | 5059 RC_PROTO_BIT_NEC, 5060 .change_protocol = dib0700_change_protocol, 5061 }, 5062 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 5063 .num_adapters = 1, 5064 .adapter = { 5065 { 5066 DIB0700_NUM_FRONTENDS(1), 5067 .fe = {{ 5068 .frontend_attach = pctv340e_frontend_attach, 5069 .tuner_attach = xc4000_tuner_attach, 5070 5071 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 5072 }}, 5073 }, 5074 }, 5075 5076 .num_device_descs = 2, 5077 .devices = { 5078 { "Pinnacle PCTV 340e HD Pro USB Stick", 5079 { &dib0700_usb_id_table[PINNACLE_PCTV340E], NULL }, 5080 { NULL }, 5081 }, 5082 { "Pinnacle PCTV Hybrid Stick Solo", 5083 { &dib0700_usb_id_table[PINNACLE_PCTV340E_SE], NULL }, 5084 { NULL }, 5085 }, 5086 }, 5087 .rc.core = { 5088 .rc_interval = DEFAULT_RC_INTERVAL, 5089 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 5090 .module_name = "dib0700", 5091 .rc_query = dib0700_rc_query_old_firmware, 5092 .allowed_protos = RC_PROTO_BIT_RC5 | 5093 RC_PROTO_BIT_RC6_MCE | 5094 RC_PROTO_BIT_NEC, 5095 .change_protocol = dib0700_change_protocol, 5096 }, 5097 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 5098 .num_adapters = 1, 5099 .adapter = { 5100 { 5101 DIB0700_NUM_FRONTENDS(1), 5102 .fe = {{ 5103 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 5104 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 5105 .pid_filter_count = 32, 5106 .pid_filter = stk70x0p_pid_filter, 5107 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 5108 .frontend_attach = tfe7790p_frontend_attach, 5109 .tuner_attach = tfe7790p_tuner_attach, 5110 5111 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 5112 } }, 5113 }, 5114 }, 5115 5116 .num_device_descs = 1, 5117 .devices = { 5118 { "DiBcom TFE7790P reference design", 5119 { &dib0700_usb_id_table[DIBCOM_TFE7790P], NULL }, 5120 { NULL }, 5121 }, 5122 }, 5123 5124 .rc.core = { 5125 .rc_interval = DEFAULT_RC_INTERVAL, 5126 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 5127 .module_name = "dib0700", 5128 .rc_query = dib0700_rc_query_old_firmware, 5129 .allowed_protos = RC_PROTO_BIT_RC5 | 5130 RC_PROTO_BIT_RC6_MCE | 5131 RC_PROTO_BIT_NEC, 5132 .change_protocol = dib0700_change_protocol, 5133 }, 5134 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 5135 .num_adapters = 1, 5136 .adapter = { 5137 { 5138 DIB0700_NUM_FRONTENDS(1), 5139 .fe = {{ 5140 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 5141 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 5142 .pid_filter_count = 32, 5143 .pid_filter = stk80xx_pid_filter, 5144 .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 5145 .frontend_attach = tfe8096p_frontend_attach, 5146 .tuner_attach = tfe8096p_tuner_attach, 5147 5148 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 5149 5150 } }, 5151 }, 5152 }, 5153 5154 .num_device_descs = 1, 5155 .devices = { 5156 { "DiBcom TFE8096P reference design", 5157 { &dib0700_usb_id_table[DIBCOM_TFE8096P], NULL }, 5158 { NULL }, 5159 }, 5160 }, 5161 5162 .rc.core = { 5163 .rc_interval = DEFAULT_RC_INTERVAL, 5164 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 5165 .module_name = "dib0700", 5166 .rc_query = dib0700_rc_query_old_firmware, 5167 .allowed_protos = RC_PROTO_BIT_RC5 | 5168 RC_PROTO_BIT_RC6_MCE | 5169 RC_PROTO_BIT_NEC, 5170 .change_protocol = dib0700_change_protocol, 5171 }, 5172 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 5173 .num_adapters = 2, 5174 .adapter = { 5175 { 5176 .num_frontends = 1, 5177 .fe = {{ 5178 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 5179 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 5180 .pid_filter_count = 32, 5181 .pid_filter = stk80xx_pid_filter, 5182 .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 5183 .frontend_attach = stk809x_frontend_attach, 5184 .tuner_attach = dib809x_tuner_attach, 5185 5186 DIB0700_DEFAULT_STREAMING_CONFIG(0x02), 5187 } }, 5188 .size_of_priv = 5189 sizeof(struct dib0700_adapter_state), 5190 }, { 5191 .num_frontends = 1, 5192 .fe = { { 5193 .caps = DVB_USB_ADAP_HAS_PID_FILTER | 5194 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, 5195 .pid_filter_count = 32, 5196 .pid_filter = stk80xx_pid_filter, 5197 .pid_filter_ctrl = stk80xx_pid_filter_ctrl, 5198 .frontend_attach = stk809x_frontend1_attach, 5199 .tuner_attach = dib809x_tuner_attach, 5200 5201 DIB0700_DEFAULT_STREAMING_CONFIG(0x03), 5202 } }, 5203 .size_of_priv = 5204 sizeof(struct dib0700_adapter_state), 5205 }, 5206 }, 5207 .num_device_descs = 1, 5208 .devices = { 5209 { "DiBcom STK8096-PVR reference design", 5210 { &dib0700_usb_id_table[PCTV_DIBCOM_STK8096PVR], 5211 &dib0700_usb_id_table[DIBCOM_STK8096PVR], NULL}, 5212 { NULL }, 5213 }, 5214 }, 5215 5216 .rc.core = { 5217 .rc_interval = DEFAULT_RC_INTERVAL, 5218 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 5219 .module_name = "dib0700", 5220 .rc_query = dib0700_rc_query_old_firmware, 5221 .allowed_protos = RC_PROTO_BIT_RC5 | 5222 RC_PROTO_BIT_RC6_MCE | 5223 RC_PROTO_BIT_NEC, 5224 .change_protocol = dib0700_change_protocol, 5225 }, 5226 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 5227 .num_adapters = 1, 5228 .adapter = { 5229 { 5230 DIB0700_NUM_FRONTENDS(1), 5231 .fe = {{ 5232 .frontend_attach = xbox_one_attach, 5233 5234 DIB0700_DEFAULT_STREAMING_CONFIG(0x82), 5235 } }, 5236 }, 5237 }, 5238 .num_device_descs = 1, 5239 .devices = { 5240 { "Microsoft Xbox One Digital TV Tuner", 5241 { &dib0700_usb_id_table[MICROSOFT_XBOX_ONE_TUNER], NULL }, 5242 { NULL }, 5243 }, 5244 }, 5245 }, 5246 }; 5247 5248 int dib0700_device_count = ARRAY_SIZE(dib0700_devices); 5249