static inline int charge_pump_source(struct dvb_frontend *fe, int force) { struct tda18271_priv *priv = fe->tuner_priv; return tda18271_charge_pump_source(fe, (priv->role == TDA18271_SLAVE) ? TDA18271_CAL_PLL : TDA18271_MAIN_PLL, force); }
static int tda18271_calibrate_rf(struct dvb_frontend *fe, u32 freq) { struct tda18271_priv *priv = fe->tuner_priv; unsigned char *regs = priv->tda18271_regs; u32 N; /* set CAL mode to normal */ regs[R_EP4] &= ~0x03; tda18271_write_regs(fe, R_EP4, 1); /* switch off agc1 */ regs[R_EP3] |= 0x40; /* sm_lt = 1 */ regs[R_EB18] |= 0x03; /* set agc1_gain to 15 dB */ tda18271_write_regs(fe, R_EB18, 1); /* frequency dependent parameters */ tda18271_calc_bp_filter(fe, &freq); tda18271_calc_gain_taper(fe, &freq); tda18271_calc_rf_band(fe, &freq); tda18271_calc_km(fe, &freq); tda18271_write_regs(fe, R_EP1, 3); tda18271_write_regs(fe, R_EB13, 1); /* main pll charge pump source */ tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 1); /* cal pll charge pump source */ tda18271_charge_pump_source(fe, TDA18271_CAL_PLL, 1); /* force dcdc converter to 0 V */ regs[R_EB14] = 0x00; tda18271_write_regs(fe, R_EB14, 1); /* disable plls lock */ regs[R_EB20] &= ~0x20; tda18271_write_regs(fe, R_EB20, 1); /* set CAL mode to RF tracking filter calibration */ regs[R_EP4] |= 0x03; tda18271_write_regs(fe, R_EP4, 2); /* --------------------------------------------------------------- */ /* set the internal calibration signal */ N = freq; tda18271_calc_cal_pll(fe, N); tda18271_write_regs(fe, R_CPD, 4); /* downconvert internal calibration */ N += 1000000; tda18271_calc_main_pll(fe, N); tda18271_write_regs(fe, R_MPD, 4); msleep(5); tda18271_write_regs(fe, R_EP2, 1); tda18271_write_regs(fe, R_EP1, 1); tda18271_write_regs(fe, R_EP2, 1); tda18271_write_regs(fe, R_EP1, 1); /* --------------------------------------------------------------- */ /* normal operation for the main pll */ tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 0); /* normal operation for the cal pll */ tda18271_charge_pump_source(fe, TDA18271_CAL_PLL, 0); msleep(10); /* plls locking */ /* launch the rf tracking filters calibration */ regs[R_EB20] |= 0x20; tda18271_write_regs(fe, R_EB20, 1); msleep(60); /* calibration */ /* --------------------------------------------------------------- */ /* set CAL mode to normal */ regs[R_EP4] &= ~0x03; /* switch on agc1 */ regs[R_EP3] &= ~0x40; /* sm_lt = 0 */ regs[R_EB18] &= ~0x03; /* set agc1_gain to 6 dB */ tda18271_write_regs(fe, R_EB18, 1); tda18271_write_regs(fe, R_EP3, 2); /* synchronization */ tda18271_write_regs(fe, R_EP1, 1); /* get calibration result */ tda18271_read_extended(fe); return regs[R_EB14]; }
static int tda18271_calibrate_rf(struct dvb_frontend *fe, u32 freq) { struct tda18271_priv *priv = fe->tuner_priv; unsigned char *regs = priv->tda18271_regs; u32 N; regs[R_EP4] &= ~0x03; tda18271_write_regs(fe, R_EP4, 1); regs[R_EP3] |= 0x40; regs[R_EB18] |= 0x03; tda18271_write_regs(fe, R_EB18, 1); tda18271_calc_bp_filter(fe, &freq); tda18271_calc_gain_taper(fe, &freq); tda18271_calc_rf_band(fe, &freq); tda18271_calc_km(fe, &freq); tda18271_write_regs(fe, R_EP1, 3); tda18271_write_regs(fe, R_EB13, 1); tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 1); tda18271_charge_pump_source(fe, TDA18271_CAL_PLL, 1); regs[R_EB14] = 0x00; tda18271_write_regs(fe, R_EB14, 1); regs[R_EB20] &= ~0x20; tda18271_write_regs(fe, R_EB20, 1); regs[R_EP4] |= 0x03; tda18271_write_regs(fe, R_EP4, 2); N = freq; tda18271_calc_cal_pll(fe, N); tda18271_write_regs(fe, R_CPD, 4); N += 1000000; tda18271_calc_main_pll(fe, N); tda18271_write_regs(fe, R_MPD, 4); msleep(5); tda18271_write_regs(fe, R_EP2, 1); tda18271_write_regs(fe, R_EP1, 1); tda18271_write_regs(fe, R_EP2, 1); tda18271_write_regs(fe, R_EP1, 1); tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 0); tda18271_charge_pump_source(fe, TDA18271_CAL_PLL, 0); msleep(10); regs[R_EB20] |= 0x20; tda18271_write_regs(fe, R_EB20, 1); msleep(60); regs[R_EP4] &= ~0x03; regs[R_EP3] &= ~0x40; regs[R_EB18] &= ~0x03; tda18271_write_regs(fe, R_EB18, 1); tda18271_write_regs(fe, R_EP3, 2); tda18271_write_regs(fe, R_EP1, 1); tda18271_read_extended(fe); return regs[R_EB14]; }