static int tda18271c1_rf_tracking_filter_calibration(struct dvb_frontend *fe, u32 freq, u32 bw) { struct tda18271_priv *priv = fe->tuner_priv; unsigned char *regs = priv->tda18271_regs; int ret; u32 N = 0; /* calculate bp filter */ tda18271_calc_bp_filter(fe, &freq); tda18271_write_regs(fe, R_EP1, 1); regs[R_EB4] &= 0x07; regs[R_EB4] |= 0x60; tda18271_write_regs(fe, R_EB4, 1); regs[R_EB7] = 0x60; tda18271_write_regs(fe, R_EB7, 1); regs[R_EB14] = 0x00; tda18271_write_regs(fe, R_EB14, 1); regs[R_EB20] = 0xcc; tda18271_write_regs(fe, R_EB20, 1); /* set cal mode to RF tracking filter calibration */ regs[R_EP4] |= 0x03; /* calculate cal pll */ switch (priv->mode) { case TDA18271_ANALOG: N = freq - 1250000; break; case TDA18271_DIGITAL: N = freq + bw / 2; break; } tda18271_calc_cal_pll(fe, N); /* calculate main pll */ switch (priv->mode) { case TDA18271_ANALOG: N = freq - 250000; break; case TDA18271_DIGITAL: N = freq + bw / 2 + 1000000; break; } tda18271_calc_main_pll(fe, N); ret = tda18271_write_regs(fe, R_EP3, 11); if (tda_fail(ret)) return ret; msleep(5); /* RF tracking filter calibration initialization */ /* search for K,M,CO for RF calibration */ tda18271_calc_km(fe, &freq); tda18271_write_regs(fe, R_EB13, 1); /* search for rf band */ tda18271_calc_rf_band(fe, &freq); /* search for gain taper */ tda18271_calc_gain_taper(fe, &freq); 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); regs[R_EB4] &= 0x07; regs[R_EB4] |= 0x40; tda18271_write_regs(fe, R_EB4, 1); regs[R_EB7] = 0x40; tda18271_write_regs(fe, R_EB7, 1); msleep(10); /* pll locking */ regs[R_EB20] = 0xec; tda18271_write_regs(fe, R_EB20, 1); msleep(60); /* RF tracking filter calibration completion */ regs[R_EP4] &= ~0x03; /* set cal mode to normal */ tda18271_write_regs(fe, R_EP4, 1); tda18271_write_regs(fe, R_EP1, 1); /* RF tracking filter correction for VHF_Low band */ if (0 == tda18271_calc_rf_cal(fe, &freq)) tda18271_write_regs(fe, R_EB14, 1); return 0; }
static int tda18271c1_rf_tracking_filter_calibration(struct dvb_frontend *fe, u32 freq, u32 bw) { struct tda18271_priv *priv = fe->tuner_priv; unsigned char *regs = priv->tda18271_regs; int ret; u32 N = 0; tda18271_calc_bp_filter(fe, &freq); tda18271_write_regs(fe, R_EP1, 1); regs[R_EB4] &= 0x07; regs[R_EB4] |= 0x60; tda18271_write_regs(fe, R_EB4, 1); regs[R_EB7] = 0x60; tda18271_write_regs(fe, R_EB7, 1); regs[R_EB14] = 0x00; tda18271_write_regs(fe, R_EB14, 1); regs[R_EB20] = 0xcc; tda18271_write_regs(fe, R_EB20, 1); regs[R_EP4] |= 0x03; switch (priv->mode) { case TDA18271_ANALOG: N = freq - 1250000; break; case TDA18271_DIGITAL: N = freq + bw / 2; break; } tda18271_calc_cal_pll(fe, N); switch (priv->mode) { case TDA18271_ANALOG: N = freq - 250000; break; case TDA18271_DIGITAL: N = freq + bw / 2 + 1000000; break; } tda18271_calc_main_pll(fe, N); ret = tda18271_write_regs(fe, R_EP3, 11); if (tda_fail(ret)) return ret; msleep(5); tda18271_calc_km(fe, &freq); tda18271_write_regs(fe, R_EB13, 1); tda18271_calc_rf_band(fe, &freq); tda18271_calc_gain_taper(fe, &freq); 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); regs[R_EB4] &= 0x07; regs[R_EB4] |= 0x40; tda18271_write_regs(fe, R_EB4, 1); regs[R_EB7] = 0x40; tda18271_write_regs(fe, R_EB7, 1); msleep(10); regs[R_EB20] = 0xec; tda18271_write_regs(fe, R_EB20, 1); msleep(60); regs[R_EP4] &= ~0x03; tda18271_write_regs(fe, R_EP4, 1); tda18271_write_regs(fe, R_EP1, 1); if (0 == tda18271_calc_rf_cal(fe, &freq)) tda18271_write_regs(fe, R_EB14, 1); return 0; }
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]; }