Lines Matching +full:dcdc +full:- +full:freq

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 tda18271-fe.c - driver for the Philips / NXP TDA18271 silicon tuner
9 #include "tda18271-priv.h"
17 MODULE_PARM_DESC(debug, "set debug level (info=1, map=2, reg=4, adv=8, cal=16 (or-able))");
19 static int tda18271_cal_on_startup = -1;
26 /*---------------------------------------------------------------------*/
30 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_toggle_output()
33 priv->output_opt & TDA18271_OUTPUT_LT_OFF ? 1 : 0, in tda18271_toggle_output()
34 priv->output_opt & TDA18271_OUTPUT_XT_OFF ? 1 : 0); in tda18271_toggle_output()
41 priv->output_opt & TDA18271_OUTPUT_XT_OFF ? "off" : "on", in tda18271_toggle_output()
42 priv->output_opt & TDA18271_OUTPUT_LT_OFF ? "off" : "on"); in tda18271_toggle_output()
47 /*---------------------------------------------------------------------*/
51 struct tda18271_priv *priv = fe->tuner_priv; in charge_pump_source()
53 (priv->role == TDA18271_SLAVE) ? in charge_pump_source()
60 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_set_if_notch()
61 unsigned char *regs = priv->tda18271_regs; in tda18271_set_if_notch()
63 switch (priv->mode) { in tda18271_set_if_notch()
75 u32 freq, u32 bw) in tda18271_channel_configuration() argument
77 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_channel_configuration()
78 unsigned char *regs = priv->tda18271_regs; in tda18271_channel_configuration()
86 regs[R_EP3] |= (map->agc_mode << 3) | map->std; in tda18271_channel_configuration()
88 if (priv->id == TDA18271HDC2) { in tda18271_channel_configuration()
98 regs[R_EP4] |= (map->if_lvl << 2); in tda18271_channel_configuration()
102 regs[R_EP4] |= map->fm_rfn << 7; in tda18271_channel_configuration()
106 regs[R_EB22] |= map->rfagc_top; in tda18271_channel_configuration()
111 /* --------------------------------------------------------------- */ in tda18271_channel_configuration()
121 tda18271_calc_ir_measure(fe, &freq); in tda18271_channel_configuration()
123 tda18271_calc_bp_filter(fe, &freq); in tda18271_channel_configuration()
125 tda18271_calc_rf_band(fe, &freq); in tda18271_channel_configuration()
127 tda18271_calc_gain_taper(fe, &freq); in tda18271_channel_configuration()
129 /* --------------------------------------------------------------- */ in tda18271_channel_configuration()
133 switch (priv->role) { in tda18271_channel_configuration()
152 /* --------------------------------------------------------------- */ in tda18271_channel_configuration()
154 N = map->if_freq * 1000 + freq; in tda18271_channel_configuration()
156 switch (priv->role) { in tda18271_channel_configuration()
186 if (priv->id == TDA18271HDC2) { in tda18271_channel_configuration()
188 if (map->fm_rfn) in tda18271_channel_configuration()
200 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_read_thermometer()
201 unsigned char *regs = priv->tda18271_regs; in tda18271_read_thermometer()
240 /* ------------------------------------------------------------------ */
243 u32 freq) in tda18271c2_rf_tracking_filters_correction() argument
245 struct tda18271_priv *priv = fe->tuner_priv; in tda18271c2_rf_tracking_filters_correction()
246 struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state; in tda18271c2_rf_tracking_filters_correction()
247 unsigned char *regs = priv->tda18271_regs; in tda18271c2_rf_tracking_filters_correction()
262 tda18271_calc_rf_cal(fe, &freq); in tda18271c2_rf_tracking_filters_correction()
265 i = tda18271_lookup_rf_band(fe, &freq, NULL); in tda18271c2_rf_tracking_filters_correction()
269 if ((0 == map[i].rf3) || (freq / 1000 < map[i].rf2)) { in tda18271c2_rf_tracking_filters_correction()
270 approx = map[i].rf_a1 * (s32)(freq / 1000 - map[i].rf1) + in tda18271c2_rf_tracking_filters_correction()
273 approx = map[i].rf_a2 * (s32)(freq / 1000 - map[i].rf2) + in tda18271c2_rf_tracking_filters_correction()
282 ret = tda18271_lookup_map(fe, RF_CAL_DC_OVER_DT, &freq, &dc_over_dt); in tda18271c2_rf_tracking_filters_correction()
287 rfcal_comp = dc_over_dt * (s32)(tm_current - priv->tm_rfcal) / 1000; in tda18271c2_rf_tracking_filters_correction()
297 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_por()
298 unsigned char *regs = priv->tda18271_regs; in tda18271_por()
313 regs[R_EB21] |= 0x03; /* set agc2_gain to -6 dB */ in tda18271_por()
328 static int tda18271_calibrate_rf(struct dvb_frontend *fe, u32 freq) in tda18271_calibrate_rf() argument
330 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_calibrate_rf()
331 unsigned char *regs = priv->tda18271_regs; in tda18271_calibrate_rf()
346 tda18271_calc_bp_filter(fe, &freq); in tda18271_calibrate_rf()
347 tda18271_calc_gain_taper(fe, &freq); in tda18271_calibrate_rf()
348 tda18271_calc_rf_band(fe, &freq); in tda18271_calibrate_rf()
349 tda18271_calc_km(fe, &freq); in tda18271_calibrate_rf()
360 /* force dcdc converter to 0 V */ in tda18271_calibrate_rf()
372 /* --------------------------------------------------------------- */ in tda18271_calibrate_rf()
375 N = freq; in tda18271_calibrate_rf()
393 /* --------------------------------------------------------------- */ in tda18271_calibrate_rf()
409 /* --------------------------------------------------------------- */ in tda18271_calibrate_rf()
434 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_powerscan()
435 unsigned char *regs = priv->tda18271_regs; in tda18271_powerscan()
439 u32 freq; in tda18271_powerscan() local
441 freq = *freq_in; in tda18271_powerscan()
443 tda18271_calc_rf_band(fe, &freq); in tda18271_powerscan()
444 tda18271_calc_rf_cal(fe, &freq); in tda18271_powerscan()
445 tda18271_calc_gain_taper(fe, &freq); in tda18271_powerscan()
446 tda18271_lookup_cid_target(fe, &freq, &cid_target, &count_limit); in tda18271_powerscan()
452 freq += 1000000; in tda18271_powerscan()
454 tda18271_calc_main_pll(fe, freq); in tda18271_powerscan()
479 /* downconvert updated freq to 1 MHz */ in tda18271_powerscan()
480 freq = *freq_in + (sgn * count) + 1000000; in tda18271_powerscan()
482 tda18271_calc_main_pll(fe, freq); in tda18271_powerscan()
507 sgn = -1 * sgn; in tda18271_powerscan()
514 *freq_out = freq - 1000000; in tda18271_powerscan()
518 tda_cal("bcal = %d, freq_in = %d, freq_out = %d (freq = %d)\n", in tda18271_powerscan()
519 bcal, *freq_in, *freq_out, freq); in tda18271_powerscan()
526 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_powerscan_init()
527 unsigned char *regs = priv->tda18271_regs; in tda18271_powerscan_init()
549 regs[R_EB21] &= ~0x03; /* set agc2_gain to -15 dB */ in tda18271_powerscan_init()
560 static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) in tda18271_rf_tracking_filters_init() argument
562 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_rf_tracking_filters_init()
563 struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state; in tda18271_rf_tracking_filters_init()
564 unsigned char *regs = priv->tda18271_regs; in tda18271_rf_tracking_filters_init()
575 i = tda18271_lookup_rf_band(fe, &freq, NULL); in tda18271_rf_tracking_filters_init()
587 tda_cal("freq = %d, rf = %d\n", freq, rf); in tda18271_rf_tracking_filters_init()
606 map[i].rf_b1 = (prog_cal[RF1] - prog_tab[RF1]); in tda18271_rf_tracking_filters_init()
610 dividend = (prog_cal[RF2] - prog_tab[RF2] - in tda18271_rf_tracking_filters_init()
612 divisor = (s32)(rf_freq[RF2] - rf_freq[RF1]) / 1000; in tda18271_rf_tracking_filters_init()
617 dividend = (prog_cal[RF3] - prog_tab[RF3] - in tda18271_rf_tracking_filters_init()
619 divisor = (s32)(rf_freq[RF3] - rf_freq[RF2]) / 1000; in tda18271_rf_tracking_filters_init()
621 map[i].rf_b2 = (prog_cal[RF2] - prog_tab[RF2]); in tda18271_rf_tracking_filters_init()
634 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_calc_rf_filter_curve()
648 for (i = 0; priv->rf_cal_state[i].rfmax != 0; i++) { in tda18271_calc_rf_filter_curve()
651 priv->rf_cal_state[i].rfmax); in tda18271_calc_rf_filter_curve()
656 priv->tm_rfcal = tda18271_read_thermometer(fe); in tda18271_calc_rf_filter_curve()
661 /* ------------------------------------------------------------------ */
665 struct tda18271_priv *priv = fe->tuner_priv; in tda18271c2_rf_cal_init()
666 unsigned char *regs = priv->tda18271_regs; in tda18271c2_rf_cal_init()
671 priv->cal_initialized = false; in tda18271c2_rf_cal_init()
673 if (priv->cal_initialized) in tda18271c2_rf_cal_init()
686 priv->cal_initialized = true; in tda18271c2_rf_cal_init()
695 u32 freq, u32 bw) in tda18271c1_rf_tracking_filter_calibration() argument
697 struct tda18271_priv *priv = fe->tuner_priv; in tda18271c1_rf_tracking_filter_calibration()
698 unsigned char *regs = priv->tda18271_regs; in tda18271c1_rf_tracking_filter_calibration()
703 tda18271_calc_bp_filter(fe, &freq); in tda18271c1_rf_tracking_filter_calibration()
724 switch (priv->mode) { in tda18271c1_rf_tracking_filter_calibration()
726 N = freq - 1250000; in tda18271c1_rf_tracking_filter_calibration()
729 N = freq + bw / 2; in tda18271c1_rf_tracking_filter_calibration()
737 switch (priv->mode) { in tda18271c1_rf_tracking_filter_calibration()
739 N = freq - 250000; in tda18271c1_rf_tracking_filter_calibration()
742 N = freq + bw / 2 + 1000000; in tda18271c1_rf_tracking_filter_calibration()
755 tda18271_calc_km(fe, &freq); in tda18271c1_rf_tracking_filter_calibration()
759 tda18271_calc_rf_band(fe, &freq); in tda18271c1_rf_tracking_filter_calibration()
762 tda18271_calc_gain_taper(fe, &freq); in tda18271c1_rf_tracking_filter_calibration()
787 if (0 == tda18271_calc_rf_cal(fe, &freq)) in tda18271c1_rf_tracking_filter_calibration()
793 /* ------------------------------------------------------------------ */
797 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_ir_cal_init()
798 unsigned char *regs = priv->tda18271_regs; in tda18271_ir_cal_init()
814 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_init()
817 mutex_lock(&priv->lock); in tda18271_init()
829 if (priv->id == TDA18271HDC2) in tda18271_init()
832 mutex_unlock(&priv->lock); in tda18271_init()
839 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_sleep()
842 mutex_lock(&priv->lock); in tda18271_sleep()
847 mutex_unlock(&priv->lock); in tda18271_sleep()
852 /* ------------------------------------------------------------------ */
856 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_agc()
859 switch (priv->config) { in tda18271_agc()
868 if (fe->callback) in tda18271_agc()
869 ret = fe->callback(priv->i2c_props.adap->algo_data, in tda18271_agc()
872 priv->mode); in tda18271_agc()
877 /* n/a - currently not supported */ in tda18271_agc()
878 tda_err("unsupported configuration: %d\n", priv->config); in tda18271_agc()
879 ret = -EINVAL; in tda18271_agc()
886 struct tda18271_std_map_item *map, u32 freq, u32 bw) in tda18271_tune() argument
888 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_tune()
891 tda_dbg("freq = %d, ifc = %d, bw = %d, agc_mode = %d, std = %d\n", in tda18271_tune()
892 freq, map->if_freq, bw, map->agc_mode, map->std); in tda18271_tune()
902 mutex_lock(&priv->lock); in tda18271_tune()
904 switch (priv->id) { in tda18271_tune()
906 tda18271c1_rf_tracking_filter_calibration(fe, freq, bw); in tda18271_tune()
909 tda18271c2_rf_tracking_filters_correction(fe, freq); in tda18271_tune()
912 ret = tda18271_channel_configuration(fe, map, freq, bw); in tda18271_tune()
914 mutex_unlock(&priv->lock); in tda18271_tune()
919 /* ------------------------------------------------------------------ */
923 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in tda18271_set_params()
924 u32 delsys = c->delivery_system; in tda18271_set_params()
925 u32 bw = c->bandwidth_hz; in tda18271_set_params()
926 u32 freq = c->frequency; in tda18271_set_params() local
927 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_set_params()
928 struct tda18271_std_map *std_map = &priv->std; in tda18271_set_params()
932 priv->mode = TDA18271_DIGITAL; in tda18271_set_params()
936 map = &std_map->atsc_6; in tda18271_set_params()
943 map = &std_map->dvbt_6; in tda18271_set_params()
945 map = &std_map->dvbt_7; in tda18271_set_params()
947 map = &std_map->dvbt_8; in tda18271_set_params()
956 map = &std_map->qam_6; in tda18271_set_params()
958 map = &std_map->qam_7; in tda18271_set_params()
960 map = &std_map->qam_8; in tda18271_set_params()
965 return -EINVAL; in tda18271_set_params()
968 /* When tuning digital, the analog demod must be tri-stated */ in tda18271_set_params()
969 if (fe->ops.analog_ops.standby) in tda18271_set_params()
970 fe->ops.analog_ops.standby(fe); in tda18271_set_params()
972 ret = tda18271_tune(fe, map, freq, bw); in tda18271_set_params()
977 priv->if_freq = map->if_freq; in tda18271_set_params()
978 priv->frequency = freq; in tda18271_set_params()
979 priv->bandwidth = bw; in tda18271_set_params()
987 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_set_analog_params()
988 struct tda18271_std_map *std_map = &priv->std; in tda18271_set_analog_params()
992 u32 freq = params->frequency * 125 * in tda18271_set_analog_params() local
993 ((params->mode == V4L2_TUNER_RADIO) ? 1 : 1000) / 2; in tda18271_set_analog_params()
995 priv->mode = TDA18271_ANALOG; in tda18271_set_analog_params()
997 if (params->mode == V4L2_TUNER_RADIO) { in tda18271_set_analog_params()
998 map = &std_map->fm_radio; in tda18271_set_analog_params()
1000 } else if (params->std & V4L2_STD_MN) { in tda18271_set_analog_params()
1001 map = &std_map->atv_mn; in tda18271_set_analog_params()
1003 } else if (params->std & V4L2_STD_B) { in tda18271_set_analog_params()
1004 map = &std_map->atv_b; in tda18271_set_analog_params()
1006 } else if (params->std & V4L2_STD_GH) { in tda18271_set_analog_params()
1007 map = &std_map->atv_gh; in tda18271_set_analog_params()
1009 } else if (params->std & V4L2_STD_PAL_I) { in tda18271_set_analog_params()
1010 map = &std_map->atv_i; in tda18271_set_analog_params()
1012 } else if (params->std & V4L2_STD_DK) { in tda18271_set_analog_params()
1013 map = &std_map->atv_dk; in tda18271_set_analog_params()
1015 } else if (params->std & V4L2_STD_SECAM_L) { in tda18271_set_analog_params()
1016 map = &std_map->atv_l; in tda18271_set_analog_params()
1018 } else if (params->std & V4L2_STD_SECAM_LC) { in tda18271_set_analog_params()
1019 map = &std_map->atv_lc; in tda18271_set_analog_params()
1022 map = &std_map->atv_i; in tda18271_set_analog_params()
1028 ret = tda18271_tune(fe, map, freq, 0); in tda18271_set_analog_params()
1033 priv->if_freq = map->if_freq; in tda18271_set_analog_params()
1034 priv->frequency = freq; in tda18271_set_analog_params()
1035 priv->bandwidth = 0; in tda18271_set_analog_params()
1042 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_release()
1051 fe->tuner_priv = NULL; in tda18271_release()
1056 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_get_frequency()
1057 *frequency = priv->frequency; in tda18271_get_frequency()
1063 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_get_bandwidth()
1064 *bandwidth = priv->bandwidth; in tda18271_get_bandwidth()
1070 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_get_if_frequency()
1071 *frequency = (u32)priv->if_freq * 1000; in tda18271_get_if_frequency()
1075 /* ------------------------------------------------------------------ */
1078 if (map->std_cfg.if_freq + \
1079 map->std_cfg.agc_mode + map->std_cfg.std + \
1080 map->std_cfg.if_lvl + map->std_cfg.rfagc_top > 0) { \
1082 memcpy(&std->std_cfg, &map->std_cfg, \
1089 name, std->std_cfg.if_freq, \
1090 std->std_cfg.agc_mode, std->std_cfg.std, \
1091 std->std_cfg.if_lvl, std->std_cfg.rfagc_top); \
1096 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_dump_std_map()
1097 struct tda18271_std_map *std = &priv->std; in tda18271_dump_std_map()
1122 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_update_std_map()
1123 struct tda18271_std_map *std = &priv->std; in tda18271_update_std_map()
1126 return -EINVAL; in tda18271_update_std_map()
1149 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_get_id()
1150 unsigned char *regs = priv->tda18271_regs; in tda18271_get_id()
1154 mutex_lock(&priv->lock); in tda18271_get_id()
1156 mutex_unlock(&priv->lock); in tda18271_get_id()
1159 tda_info("Error reading device ID @ %d-%04x, bailing out.\n", in tda18271_get_id()
1160 i2c_adapter_id(priv->i2c_props.adap), in tda18271_get_id()
1161 priv->i2c_props.addr); in tda18271_get_id()
1162 return -EIO; in tda18271_get_id()
1168 priv->id = TDA18271HDC1; in tda18271_get_id()
1172 priv->id = TDA18271HDC2; in tda18271_get_id()
1175 tda_info("Unknown device (%i) detected @ %d-%04x, device not supported.\n", in tda18271_get_id()
1176 regs[R_ID], i2c_adapter_id(priv->i2c_props.adap), in tda18271_get_id()
1177 priv->i2c_props.addr); in tda18271_get_id()
1178 return -EINVAL; in tda18271_get_id()
1181 tda_info("%s detected @ %d-%04x\n", name, in tda18271_get_id()
1182 i2c_adapter_id(priv->i2c_props.adap), priv->i2c_props.addr); in tda18271_get_id()
1190 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_setup_configuration()
1192 priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO; in tda18271_setup_configuration()
1193 priv->role = (cfg) ? cfg->role : TDA18271_MASTER; in tda18271_setup_configuration()
1194 priv->config = (cfg) ? cfg->config : 0; in tda18271_setup_configuration()
1195 priv->small_i2c = (cfg) ? in tda18271_setup_configuration()
1196 cfg->small_i2c : TDA18271_39_BYTE_CHUNK_INIT; in tda18271_setup_configuration()
1197 priv->output_opt = (cfg) ? in tda18271_setup_configuration()
1198 cfg->output_opt : TDA18271_OUTPUT_LT_XT_ON; in tda18271_setup_configuration()
1205 /* tda18271_cal_on_startup == -1 when cal module option is unset */ in tda18271_need_cal_on_startup()
1206 return ((tda18271_cal_on_startup == -1) ? in tda18271_need_cal_on_startup()
1208 ((cfg) && (cfg->rf_cal_on_startup)) : in tda18271_need_cal_on_startup()
1223 if ((cfg) && (cfg->std_map)) in tda18271_set_config()
1224 tda18271_update_std_map(fe, cfg->std_map); in tda18271_set_config()
1264 fe->tuner_priv = priv; in tda18271_attach()
1268 priv->cal_initialized = false; in tda18271_attach()
1269 mutex_init(&priv->lock); in tda18271_attach()
1281 if ((cfg->delay_cal) && (!tda18271_need_cal_on_startup(cfg))) in tda18271_attach()
1284 mutex_lock(&priv->lock); in tda18271_attach()
1288 (priv->id == TDA18271HDC2)) in tda18271_attach()
1295 mutex_unlock(&priv->lock); in tda18271_attach()
1299 fe->tuner_priv = priv; in tda18271_attach()
1303 if (cfg->gate != TDA18271_GATE_ANALOG) in tda18271_attach()
1304 priv->gate = cfg->gate; in tda18271_attach()
1305 if (cfg->role) in tda18271_attach()
1306 priv->role = cfg->role; in tda18271_attach()
1307 if (cfg->config) in tda18271_attach()
1308 priv->config = cfg->config; in tda18271_attach()
1309 if (cfg->small_i2c) in tda18271_attach()
1310 priv->small_i2c = cfg->small_i2c; in tda18271_attach()
1311 if (cfg->output_opt) in tda18271_attach()
1312 priv->output_opt = cfg->output_opt; in tda18271_attach()
1313 if (cfg->std_map) in tda18271_attach()
1314 tda18271_update_std_map(fe, cfg->std_map); in tda18271_attach()
1322 if ((cfg) && (cfg->std_map)) in tda18271_attach()
1323 tda18271_update_std_map(fe, cfg->std_map); in tda18271_attach()
1327 memcpy(&fe->ops.tuner_ops, &tda18271_tuner_ops, in tda18271_attach()