Lines Matching +full:tri +full:- +full:band

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()
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()
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 /* ------------------------------------------------------------------ */
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()
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()
285 rfcal_comp = dc_over_dt * (s32)(tm_current - priv->tm_rfcal) / 1000; in tda18271c2_rf_tracking_filters_correction()
295 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_por()
296 unsigned char *regs = priv->tda18271_regs; in tda18271_por()
311 regs[R_EB21] |= 0x03; /* set agc2_gain to -6 dB */ in tda18271_por()
328 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_calibrate_rf()
329 unsigned char *regs = priv->tda18271_regs; in tda18271_calibrate_rf()
370 /* --------------------------------------------------------------- */ in tda18271_calibrate_rf()
391 /* --------------------------------------------------------------- */ in tda18271_calibrate_rf()
407 /* --------------------------------------------------------------- */ in tda18271_calibrate_rf()
432 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_powerscan()
433 unsigned char *regs = priv->tda18271_regs; in tda18271_powerscan()
506 sgn = -1 * sgn; in tda18271_powerscan()
513 *freq_out = freq - 1000000; in tda18271_powerscan()
525 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_powerscan_init()
526 unsigned char *regs = priv->tda18271_regs; in tda18271_powerscan_init()
548 regs[R_EB21] &= ~0x03; /* set agc2_gain to -15 dB */ in tda18271_powerscan_init()
561 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_rf_tracking_filters_init()
562 struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state; in tda18271_rf_tracking_filters_init()
563 unsigned char *regs = priv->tda18271_regs; in tda18271_rf_tracking_filters_init()
605 map[i].rf_b1 = (prog_cal[RF1] - prog_tab[RF1]); in tda18271_rf_tracking_filters_init()
609 dividend = (prog_cal[RF2] - prog_tab[RF2] - in tda18271_rf_tracking_filters_init()
611 divisor = (s32)(rf_freq[RF2] - rf_freq[RF1]) / 1000; in tda18271_rf_tracking_filters_init()
616 dividend = (prog_cal[RF3] - prog_tab[RF3] - in tda18271_rf_tracking_filters_init()
618 divisor = (s32)(rf_freq[RF3] - rf_freq[RF2]) / 1000; in tda18271_rf_tracking_filters_init()
620 map[i].rf_b2 = (prog_cal[RF2] - prog_tab[RF2]); in tda18271_rf_tracking_filters_init()
633 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_calc_rf_filter_curve()
646 /* rf band calibration */ in tda18271_calc_rf_filter_curve()
647 for (i = 0; priv->rf_cal_state[i].rfmax != 0; i++) { in tda18271_calc_rf_filter_curve()
650 priv->rf_cal_state[i].rfmax); in tda18271_calc_rf_filter_curve()
655 priv->tm_rfcal = tda18271_read_thermometer(fe); in tda18271_calc_rf_filter_curve()
660 /* ------------------------------------------------------------------ */
664 struct tda18271_priv *priv = fe->tuner_priv; in tda18271c2_rf_cal_init()
665 unsigned char *regs = priv->tda18271_regs; in tda18271c2_rf_cal_init()
670 priv->cal_initialized = false; in tda18271c2_rf_cal_init()
672 if (priv->cal_initialized) in tda18271c2_rf_cal_init()
685 priv->cal_initialized = true; in tda18271c2_rf_cal_init()
696 struct tda18271_priv *priv = fe->tuner_priv; in tda18271c1_rf_tracking_filter_calibration()
697 unsigned char *regs = priv->tda18271_regs; in tda18271c1_rf_tracking_filter_calibration()
723 switch (priv->mode) { in tda18271c1_rf_tracking_filter_calibration()
725 N = freq - 1250000; in tda18271c1_rf_tracking_filter_calibration()
736 switch (priv->mode) { in tda18271c1_rf_tracking_filter_calibration()
738 N = freq - 250000; in tda18271c1_rf_tracking_filter_calibration()
757 /* search for rf band */ in tda18271c1_rf_tracking_filter_calibration()
785 /* RF tracking filter correction for VHF_Low band */ in tda18271c1_rf_tracking_filter_calibration()
792 /* ------------------------------------------------------------------ */
796 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_ir_cal_init()
797 unsigned char *regs = priv->tda18271_regs; in tda18271_ir_cal_init()
813 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_init()
816 mutex_lock(&priv->lock); in tda18271_init()
828 if (priv->id == TDA18271HDC2) in tda18271_init()
831 mutex_unlock(&priv->lock); in tda18271_init()
838 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_sleep()
841 mutex_lock(&priv->lock); in tda18271_sleep()
846 mutex_unlock(&priv->lock); in tda18271_sleep()
851 /* ------------------------------------------------------------------ */
855 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_agc()
858 switch (priv->config) { in tda18271_agc()
867 if (fe->callback) in tda18271_agc()
868 ret = fe->callback(priv->i2c_props.adap->algo_data, in tda18271_agc()
871 priv->mode); in tda18271_agc()
876 /* n/a - currently not supported */ in tda18271_agc()
877 tda_err("unsupported configuration: %d\n", priv->config); in tda18271_agc()
878 ret = -EINVAL; in tda18271_agc()
887 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_tune()
891 freq, map->if_freq, bw, map->agc_mode, map->std); in tda18271_tune()
901 mutex_lock(&priv->lock); in tda18271_tune()
903 switch (priv->id) { in tda18271_tune()
913 mutex_unlock(&priv->lock); in tda18271_tune()
918 /* ------------------------------------------------------------------ */
922 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in tda18271_set_params()
923 u32 delsys = c->delivery_system; in tda18271_set_params()
924 u32 bw = c->bandwidth_hz; in tda18271_set_params()
925 u32 freq = c->frequency; in tda18271_set_params()
926 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_set_params()
927 struct tda18271_std_map *std_map = &priv->std; in tda18271_set_params()
931 priv->mode = TDA18271_DIGITAL; in tda18271_set_params()
935 map = &std_map->atsc_6; in tda18271_set_params()
942 map = &std_map->dvbt_6; in tda18271_set_params()
944 map = &std_map->dvbt_7; in tda18271_set_params()
946 map = &std_map->dvbt_8; in tda18271_set_params()
955 map = &std_map->qam_6; in tda18271_set_params()
957 map = &std_map->qam_7; in tda18271_set_params()
959 map = &std_map->qam_8; in tda18271_set_params()
964 return -EINVAL; in tda18271_set_params()
967 /* When tuning digital, the analog demod must be tri-stated */ in tda18271_set_params()
968 if (fe->ops.analog_ops.standby) in tda18271_set_params()
969 fe->ops.analog_ops.standby(fe); in tda18271_set_params()
976 priv->if_freq = map->if_freq; in tda18271_set_params()
977 priv->frequency = freq; in tda18271_set_params()
978 priv->bandwidth = bw; in tda18271_set_params()
986 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_set_analog_params()
987 struct tda18271_std_map *std_map = &priv->std; in tda18271_set_analog_params()
991 u32 freq = params->frequency * 125 * in tda18271_set_analog_params()
992 ((params->mode == V4L2_TUNER_RADIO) ? 1 : 1000) / 2; in tda18271_set_analog_params()
994 priv->mode = TDA18271_ANALOG; in tda18271_set_analog_params()
996 if (params->mode == V4L2_TUNER_RADIO) { in tda18271_set_analog_params()
997 map = &std_map->fm_radio; in tda18271_set_analog_params()
999 } else if (params->std & V4L2_STD_MN) { in tda18271_set_analog_params()
1000 map = &std_map->atv_mn; in tda18271_set_analog_params()
1002 } else if (params->std & V4L2_STD_B) { in tda18271_set_analog_params()
1003 map = &std_map->atv_b; in tda18271_set_analog_params()
1005 } else if (params->std & V4L2_STD_GH) { in tda18271_set_analog_params()
1006 map = &std_map->atv_gh; in tda18271_set_analog_params()
1008 } else if (params->std & V4L2_STD_PAL_I) { in tda18271_set_analog_params()
1009 map = &std_map->atv_i; in tda18271_set_analog_params()
1011 } else if (params->std & V4L2_STD_DK) { in tda18271_set_analog_params()
1012 map = &std_map->atv_dk; in tda18271_set_analog_params()
1014 } else if (params->std & V4L2_STD_SECAM_L) { in tda18271_set_analog_params()
1015 map = &std_map->atv_l; in tda18271_set_analog_params()
1017 } else if (params->std & V4L2_STD_SECAM_LC) { in tda18271_set_analog_params()
1018 map = &std_map->atv_lc; in tda18271_set_analog_params()
1021 map = &std_map->atv_i; in tda18271_set_analog_params()
1032 priv->if_freq = map->if_freq; in tda18271_set_analog_params()
1033 priv->frequency = freq; in tda18271_set_analog_params()
1034 priv->bandwidth = 0; in tda18271_set_analog_params()
1041 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_release()
1050 fe->tuner_priv = NULL; in tda18271_release()
1055 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_get_frequency()
1056 *frequency = priv->frequency; in tda18271_get_frequency()
1062 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_get_bandwidth()
1063 *bandwidth = priv->bandwidth; in tda18271_get_bandwidth()
1069 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_get_if_frequency()
1070 *frequency = (u32)priv->if_freq * 1000; in tda18271_get_if_frequency()
1074 /* ------------------------------------------------------------------ */
1077 if (map->std_cfg.if_freq + \
1078 map->std_cfg.agc_mode + map->std_cfg.std + \
1079 map->std_cfg.if_lvl + map->std_cfg.rfagc_top > 0) { \
1081 memcpy(&std->std_cfg, &map->std_cfg, \
1088 name, std->std_cfg.if_freq, \
1089 std->std_cfg.agc_mode, std->std_cfg.std, \
1090 std->std_cfg.if_lvl, std->std_cfg.rfagc_top); \
1095 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_dump_std_map()
1096 struct tda18271_std_map *std = &priv->std; in tda18271_dump_std_map()
1121 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_update_std_map()
1122 struct tda18271_std_map *std = &priv->std; in tda18271_update_std_map()
1125 return -EINVAL; in tda18271_update_std_map()
1148 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_get_id()
1149 unsigned char *regs = priv->tda18271_regs; in tda18271_get_id()
1153 mutex_lock(&priv->lock); in tda18271_get_id()
1155 mutex_unlock(&priv->lock); in tda18271_get_id()
1158 tda_info("Error reading device ID @ %d-%04x, bailing out.\n", in tda18271_get_id()
1159 i2c_adapter_id(priv->i2c_props.adap), in tda18271_get_id()
1160 priv->i2c_props.addr); in tda18271_get_id()
1161 return -EIO; in tda18271_get_id()
1167 priv->id = TDA18271HDC1; in tda18271_get_id()
1171 priv->id = TDA18271HDC2; in tda18271_get_id()
1174 tda_info("Unknown device (%i) detected @ %d-%04x, device not supported.\n", in tda18271_get_id()
1175 regs[R_ID], i2c_adapter_id(priv->i2c_props.adap), in tda18271_get_id()
1176 priv->i2c_props.addr); in tda18271_get_id()
1177 return -EINVAL; in tda18271_get_id()
1180 tda_info("%s detected @ %d-%04x\n", name, in tda18271_get_id()
1181 i2c_adapter_id(priv->i2c_props.adap), priv->i2c_props.addr); in tda18271_get_id()
1189 struct tda18271_priv *priv = fe->tuner_priv; in tda18271_setup_configuration()
1191 priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO; in tda18271_setup_configuration()
1192 priv->role = (cfg) ? cfg->role : TDA18271_MASTER; in tda18271_setup_configuration()
1193 priv->config = (cfg) ? cfg->config : 0; in tda18271_setup_configuration()
1194 priv->small_i2c = (cfg) ? in tda18271_setup_configuration()
1195 cfg->small_i2c : TDA18271_39_BYTE_CHUNK_INIT; in tda18271_setup_configuration()
1196 priv->output_opt = (cfg) ? in tda18271_setup_configuration()
1197 cfg->output_opt : TDA18271_OUTPUT_LT_XT_ON; in tda18271_setup_configuration()
1204 /* tda18271_cal_on_startup == -1 when cal module option is unset */ in tda18271_need_cal_on_startup()
1205 return ((tda18271_cal_on_startup == -1) ? in tda18271_need_cal_on_startup()
1207 ((cfg) && (cfg->rf_cal_on_startup)) : in tda18271_need_cal_on_startup()
1222 if ((cfg) && (cfg->std_map)) in tda18271_set_config()
1223 tda18271_update_std_map(fe, cfg->std_map); in tda18271_set_config()
1263 fe->tuner_priv = priv; in tda18271_attach()
1267 priv->cal_initialized = false; in tda18271_attach()
1268 mutex_init(&priv->lock); in tda18271_attach()
1280 if ((cfg->delay_cal) && (!tda18271_need_cal_on_startup(cfg))) in tda18271_attach()
1283 mutex_lock(&priv->lock); in tda18271_attach()
1287 (priv->id == TDA18271HDC2)) in tda18271_attach()
1294 mutex_unlock(&priv->lock); in tda18271_attach()
1298 fe->tuner_priv = priv; in tda18271_attach()
1302 if (cfg->gate != TDA18271_GATE_ANALOG) in tda18271_attach()
1303 priv->gate = cfg->gate; in tda18271_attach()
1304 if (cfg->role) in tda18271_attach()
1305 priv->role = cfg->role; in tda18271_attach()
1306 if (cfg->config) in tda18271_attach()
1307 priv->config = cfg->config; in tda18271_attach()
1308 if (cfg->small_i2c) in tda18271_attach()
1309 priv->small_i2c = cfg->small_i2c; in tda18271_attach()
1310 if (cfg->output_opt) in tda18271_attach()
1311 priv->output_opt = cfg->output_opt; in tda18271_attach()
1312 if (cfg->std_map) in tda18271_attach()
1313 tda18271_update_std_map(fe, cfg->std_map); in tda18271_attach()
1321 if ((cfg) && (cfg->std_map)) in tda18271_attach()
1322 tda18271_update_std_map(fe, cfg->std_map); in tda18271_attach()
1326 memcpy(&fe->ops.tuner_ops, &tda18271_tuner_ops, in tda18271_attach()