Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] rtl2832: add code to bind r820t on it

There are some init stuff to be done for each new tuner at the
demod code. Add the code there for r820t.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Tested-by: Antti Palosaari <crope@iki.fi>

+88 -17
+59 -17
drivers/media/dvb-frontends/rtl2832.c
··· 432 432 {DVBT_TR_THD_SET2, 0x6}, 433 433 {DVBT_TRK_KC_I2, 0x5}, 434 434 {DVBT_CR_THD_SET2, 0x1}, 435 - {DVBT_SPEC_INV, 0x0}, 436 435 }; 437 436 438 437 dev_dbg(&priv->i2c->dev, "%s:\n", __func__); 439 438 440 439 en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0); 441 - 442 - /* 443 - * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22) 444 - * / CrystalFreqHz) 445 - */ 446 - pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal; 447 - pset_iffreq *= 0x400000; 448 - pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal); 449 - pset_iffreq = pset_iffreq & 0x3fffff; 450 440 451 441 for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) { 452 442 ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg, ··· 462 472 len = ARRAY_SIZE(rtl2832_tuner_init_e4000); 463 473 init = rtl2832_tuner_init_e4000; 464 474 break; 475 + case RTL2832_TUNER_R820T: 476 + len = ARRAY_SIZE(rtl2832_tuner_init_r820t); 477 + init = rtl2832_tuner_init_r820t; 478 + break; 465 479 default: 466 480 ret = -EINVAL; 467 481 goto err; ··· 477 483 goto err; 478 484 } 479 485 480 - /* if frequency settings */ 481 - ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin); 482 - if (ret) 483 - goto err; 486 + /* 487 + * if frequency settings 488 + * Some tuners (r820t) don't initialize IF here; instead; they do it 489 + * at set_params() 490 + */ 491 + if (!fe->ops.tuner_ops.get_if_frequency) { 492 + /* 493 + * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22) 494 + * / CrystalFreqHz) 495 + */ 496 + pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal; 497 + pset_iffreq *= 0x400000; 498 + pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal); 499 + pset_iffreq = pset_iffreq & 0x3fffff; 500 + ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin); 501 + if (ret) 502 + goto err; 484 503 485 - ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq); 486 - if (ret) 487 - goto err; 504 + ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq); 505 + if (ret) 506 + goto err; 507 + } 508 + 509 + /* 510 + * r820t NIM code does a software reset here at the demod - 511 + * may not be needed, as there's already a software reset at set_params() 512 + */ 513 + #if 1 514 + /* soft reset */ 515 + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1); 516 + if (ret) 517 + goto err; 518 + 519 + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0); 520 + if (ret) 521 + goto err; 522 + #endif 488 523 489 524 priv->sleeping = false; 490 525 ··· 586 563 /* program tuner */ 587 564 if (fe->ops.tuner_ops.set_params) 588 565 fe->ops.tuner_ops.set_params(fe); 566 + 567 + /* If the frontend has get_if_frequency(), use it */ 568 + if (fe->ops.tuner_ops.get_if_frequency) { 569 + u32 if_freq; 570 + u64 pset_iffreq; 571 + 572 + ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq); 573 + if (ret) 574 + goto err; 575 + 576 + pset_iffreq = if_freq % priv->cfg.xtal; 577 + pset_iffreq *= 0x400000; 578 + pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal); 579 + pset_iffreq = pset_iffreq & 0x3fffff; 580 + 581 + ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq); 582 + if (ret) 583 + goto err; 584 + } 589 585 590 586 switch (c->bandwidth_hz) { 591 587 case 6000000:
+1
drivers/media/dvb-frontends/rtl2832.h
··· 52 52 #define RTL2832_TUNER_FC0012 0x26 53 53 #define RTL2832_TUNER_E4000 0x27 54 54 #define RTL2832_TUNER_FC0013 0x29 55 + #define RTL2832_TUNER_R820T 0x2a 55 56 u8 tuner; 56 57 }; 57 58
+28
drivers/media/dvb-frontends/rtl2832_priv.h
··· 267 267 {DVBT_OPT_ADC_IQ, 0x1}, 268 268 {DVBT_AD_AVI, 0x0}, 269 269 {DVBT_AD_AVQ, 0x0}, 270 + {DVBT_SPEC_INV, 0x0}, 270 271 }; 271 272 272 273 static const struct rtl2832_reg_value rtl2832_tuner_init_fc0012[] = { ··· 301 300 {DVBT_GI_PGA_STATE, 0x0}, 302 301 {DVBT_EN_AGC_PGA, 0x1}, 303 302 {DVBT_IF_AGC_MAN, 0x0}, 303 + {DVBT_SPEC_INV, 0x0}, 304 304 }; 305 305 306 306 static const struct rtl2832_reg_value rtl2832_tuner_init_e4000[] = { ··· 339 337 {DVBT_REG_MONSEL, 0x1}, 340 338 {DVBT_REG_MON, 0x1}, 341 339 {DVBT_REG_4MSEL, 0x0}, 340 + {DVBT_SPEC_INV, 0x0}, 341 + }; 342 + 343 + static const struct rtl2832_reg_value rtl2832_tuner_init_r820t[] = { 344 + {DVBT_DAGC_TRG_VAL, 0x39}, 345 + {DVBT_AGC_TARG_VAL_0, 0x0}, 346 + {DVBT_AGC_TARG_VAL_8_1, 0x40}, 347 + {DVBT_AAGC_LOOP_GAIN, 0x16}, 348 + {DVBT_LOOP_GAIN2_3_0, 0x8}, 349 + {DVBT_LOOP_GAIN2_4, 0x1}, 350 + {DVBT_LOOP_GAIN3, 0x18}, 351 + {DVBT_VTOP1, 0x35}, 352 + {DVBT_VTOP2, 0x21}, 353 + {DVBT_VTOP3, 0x21}, 354 + {DVBT_KRF1, 0x0}, 355 + {DVBT_KRF2, 0x40}, 356 + {DVBT_KRF3, 0x10}, 357 + {DVBT_KRF4, 0x10}, 358 + {DVBT_IF_AGC_MIN, 0x80}, 359 + {DVBT_IF_AGC_MAX, 0x7f}, 360 + {DVBT_RF_AGC_MIN, 0x80}, 361 + {DVBT_RF_AGC_MAX, 0x7f}, 362 + {DVBT_POLAR_RF_AGC, 0x0}, 363 + {DVBT_POLAR_IF_AGC, 0x0}, 364 + {DVBT_AD7_SETTING, 0xe9f4}, 365 + {DVBT_SPEC_INV, 0x1}, 342 366 }; 343 367 344 368 #endif /* RTL2832_PRIV_H */