Lines Matching +full:default +full:- +full:state

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Support for LG2160 - ATSC/MH
14 MODULE_PARM_DESC(debug, "set debug level (info=1, reg=2 (or-able))");
51 /* ------------------------------------------------------------------------ */
53 static int lg216x_write_reg(struct lg216x_state *state, u16 reg, u8 val) in lg216x_write_reg() argument
58 .addr = state->cfg->i2c_addr, .flags = 0, in lg216x_write_reg()
64 ret = i2c_transfer(state->i2c_adap, &msg, 1); in lg216x_write_reg()
67 lg_err("error (addr %02x %02x <- %02x, err = %i)\n", in lg216x_write_reg()
72 return -EREMOTEIO; in lg216x_write_reg()
77 static int lg216x_read_reg(struct lg216x_state *state, u16 reg, u8 *val) in lg216x_read_reg() argument
82 { .addr = state->cfg->i2c_addr, in lg216x_read_reg()
84 { .addr = state->cfg->i2c_addr, in lg216x_read_reg()
90 ret = i2c_transfer(state->i2c_adap, msg, 2); in lg216x_read_reg()
94 state->cfg->i2c_addr, reg, ret); in lg216x_read_reg()
98 return -EREMOTEIO; in lg216x_read_reg()
108 static int lg216x_write_regs(struct lg216x_state *state, in lg216x_write_regs() argument
116 ret = lg216x_write_reg(state, regs[i].reg, regs[i].val); in lg216x_write_regs()
123 static int lg216x_set_reg_bit(struct lg216x_state *state, in lg216x_set_reg_bit() argument
131 ret = lg216x_read_reg(state, reg, &val); in lg216x_set_reg_bit()
138 ret = lg216x_write_reg(state, reg, val); in lg216x_set_reg_bit()
144 /* ------------------------------------------------------------------------ */
148 struct lg216x_state *state = fe->demodulator_priv; in lg216x_i2c_gate_ctrl() local
151 if (state->cfg->deny_i2c_rptr) in lg216x_i2c_gate_ctrl()
156 ret = lg216x_set_reg_bit(state, 0x0000, 0, enable ? 0 : 1); in lg216x_i2c_gate_ctrl()
163 static int lg216x_soft_reset(struct lg216x_state *state) in lg216x_soft_reset() argument
169 ret = lg216x_write_reg(state, 0x0002, 0x00); in lg216x_soft_reset()
174 ret = lg216x_write_reg(state, 0x0002, 0x01); in lg216x_soft_reset()
178 state->last_reset = jiffies_to_msecs(jiffies); in lg216x_soft_reset()
183 static int lg216x_initialize(struct lg216x_state *state) in lg216x_initialize() argument
212 switch (state->cfg->lg_chip) { in lg216x_initialize()
214 ret = lg216x_write_regs(state, in lg216x_initialize()
218 ret = lg216x_write_regs(state, in lg216x_initialize()
221 default: in lg216x_initialize()
222 ret = -EINVAL; in lg216x_initialize()
228 ret = lg216x_soft_reset(state); in lg216x_initialize()
234 /* ------------------------------------------------------------------------ */
236 static int lg216x_set_if(struct lg216x_state *state) in lg216x_set_if() argument
241 lg_dbg("%d KHz\n", state->cfg->if_khz); in lg216x_set_if()
243 ret = lg216x_read_reg(state, 0x0132, &val); in lg216x_set_if()
248 val |= (0 == state->cfg->if_khz) ? 0x04 : 0x00; in lg216x_set_if()
250 ret = lg216x_write_reg(state, 0x0132, val); in lg216x_set_if()
253 /* if NOT zero IF, 6 MHz is the default */ in lg216x_set_if()
258 /* ------------------------------------------------------------------------ */
260 static int lg2160_agc_fix(struct lg216x_state *state, in lg2160_agc_fix() argument
266 ret = lg216x_read_reg(state, 0x0100, &val); in lg2160_agc_fix()
274 ret = lg216x_write_reg(state, 0x0100, val); in lg2160_agc_fix()
281 static int lg2160_agc_freeze(struct lg216x_state *state,
287 ret = lg216x_read_reg(state, 0x0100, &val);
295 ret = lg216x_write_reg(state, 0x0100, val);
302 static int lg2160_agc_polarity(struct lg216x_state *state, in lg2160_agc_polarity() argument
308 ret = lg216x_read_reg(state, 0x0100, &val); in lg2160_agc_polarity()
316 ret = lg216x_write_reg(state, 0x0100, val); in lg2160_agc_polarity()
322 static int lg2160_tuner_pwr_save_polarity(struct lg216x_state *state, in lg2160_tuner_pwr_save_polarity() argument
328 ret = lg216x_read_reg(state, 0x0008, &val); in lg2160_tuner_pwr_save_polarity()
335 ret = lg216x_write_reg(state, 0x0008, val); in lg2160_tuner_pwr_save_polarity()
341 static int lg2160_spectrum_polarity(struct lg216x_state *state, in lg2160_spectrum_polarity() argument
347 ret = lg216x_read_reg(state, 0x0132, &val); in lg2160_spectrum_polarity()
354 ret = lg216x_write_reg(state, 0x0132, val); in lg2160_spectrum_polarity()
357 return lg216x_soft_reset(state); in lg2160_spectrum_polarity()
360 static int lg2160_tuner_pwr_save(struct lg216x_state *state, int onoff) in lg2160_tuner_pwr_save() argument
365 ret = lg216x_read_reg(state, 0x0007, &val); in lg2160_tuner_pwr_save()
372 ret = lg216x_write_reg(state, 0x0007, val); in lg2160_tuner_pwr_save()
378 static int lg216x_set_parade(struct lg216x_state *state, int id) in lg216x_set_parade() argument
382 ret = lg216x_write_reg(state, 0x013e, id & 0x7f); in lg216x_set_parade()
386 state->parade_id = id & 0x7f; in lg216x_set_parade()
391 static int lg216x_set_ensemble(struct lg216x_state *state, int id) in lg216x_set_ensemble() argument
397 switch (state->cfg->lg_chip) { in lg216x_set_ensemble()
402 default: in lg216x_set_ensemble()
407 ret = lg216x_read_reg(state, reg, &val); in lg216x_set_ensemble()
414 ret = lg216x_write_reg(state, reg, val); in lg216x_set_ensemble()
420 static int lg2160_set_spi_clock(struct lg216x_state *state) in lg2160_set_spi_clock() argument
425 ret = lg216x_read_reg(state, 0x0014, &val); in lg2160_set_spi_clock()
430 val |= (state->cfg->spi_clock << 2); in lg2160_set_spi_clock()
432 ret = lg216x_write_reg(state, 0x0014, val); in lg2160_set_spi_clock()
438 static int lg2161_set_output_interface(struct lg216x_state *state) in lg2161_set_output_interface() argument
443 ret = lg216x_read_reg(state, 0x0014, &val); in lg2161_set_output_interface()
448 val |= state->cfg->output_if; /* FIXME: needs sanity check */ in lg2161_set_output_interface()
450 ret = lg216x_write_reg(state, 0x0014, val); in lg2161_set_output_interface()
456 static int lg216x_enable_fic(struct lg216x_state *state, int onoff) in lg216x_enable_fic() argument
460 ret = lg216x_write_reg(state, 0x0017, 0x23); in lg216x_enable_fic()
464 ret = lg216x_write_reg(state, 0x0016, 0xfc); in lg216x_enable_fic()
468 switch (state->cfg->lg_chip) { in lg216x_enable_fic()
470 ret = lg216x_write_reg(state, 0x0016, in lg216x_enable_fic()
474 ret = lg216x_write_reg(state, 0x0016, (onoff) ? 0x10 : 0x00); in lg216x_enable_fic()
480 ret = lg216x_initialize(state); in lg216x_enable_fic()
485 ret = lg216x_write_reg(state, 0x0017, 0x03); in lg216x_enable_fic()
492 /* ------------------------------------------------------------------------ */
494 static int lg216x_get_fic_version(struct lg216x_state *state, u8 *ficver) in lg216x_get_fic_version() argument
501 ret = lg216x_read_reg(state, 0x0128, &val); in lg216x_get_fic_version()
511 static int lg2160_get_parade_id(struct lg216x_state *state, u8 *id)
518 ret = lg216x_read_reg(state, 0x0123, &val);
528 static int lg216x_get_nog(struct lg216x_state *state, u8 *nog) in lg216x_get_nog() argument
535 ret = lg216x_read_reg(state, 0x0124, &val); in lg216x_get_nog()
544 static int lg216x_get_tnog(struct lg216x_state *state, u8 *tnog) in lg216x_get_tnog() argument
551 ret = lg216x_read_reg(state, 0x0125, &val); in lg216x_get_tnog()
560 static int lg216x_get_sgn(struct lg216x_state *state, u8 *sgn) in lg216x_get_sgn() argument
567 ret = lg216x_read_reg(state, 0x0124, &val); in lg216x_get_sgn()
576 static int lg216x_get_prc(struct lg216x_state *state, u8 *prc) in lg216x_get_prc() argument
583 ret = lg216x_read_reg(state, 0x0125, &val); in lg216x_get_prc()
592 /* ------------------------------------------------------------------------ */
594 static int lg216x_get_rs_frame_mode(struct lg216x_state *state, in lg216x_get_rs_frame_mode() argument
600 switch (state->cfg->lg_chip) { in lg216x_get_rs_frame_mode()
602 ret = lg216x_read_reg(state, 0x0410, &val); in lg216x_get_rs_frame_mode()
605 ret = lg216x_read_reg(state, 0x0513, &val); in lg216x_get_rs_frame_mode()
607 default: in lg216x_get_rs_frame_mode()
608 ret = -EINVAL; in lg216x_get_rs_frame_mode()
615 default: in lg216x_get_rs_frame_mode()
624 default: in lg216x_get_rs_frame_mode()
634 int lg216x_get_rs_frame_ensemble(struct lg216x_state *state, in lg216x_get_rs_frame_ensemble() argument
640 switch (state->cfg->lg_chip) { in lg216x_get_rs_frame_ensemble()
642 ret = lg216x_read_reg(state, 0x0400, &val); in lg216x_get_rs_frame_ensemble()
645 ret = lg216x_read_reg(state, 0x0500, &val); in lg216x_get_rs_frame_ensemble()
647 default: in lg216x_get_rs_frame_ensemble()
648 ret = -EINVAL; in lg216x_get_rs_frame_ensemble()
659 static int lg216x_get_rs_code_mode(struct lg216x_state *state, in lg216x_get_rs_code_mode() argument
666 switch (state->cfg->lg_chip) { in lg216x_get_rs_code_mode()
668 ret = lg216x_read_reg(state, 0x0410, &val); in lg216x_get_rs_code_mode()
671 ret = lg216x_read_reg(state, 0x0513, &val); in lg216x_get_rs_code_mode()
673 default: in lg216x_get_rs_code_mode()
674 ret = -EINVAL; in lg216x_get_rs_code_mode()
685 static int lg216x_get_sccc_block_mode(struct lg216x_state *state, in lg216x_get_sccc_block_mode() argument
691 switch (state->cfg->lg_chip) { in lg216x_get_sccc_block_mode()
693 ret = lg216x_read_reg(state, 0x0315, &val); in lg216x_get_sccc_block_mode()
696 ret = lg216x_read_reg(state, 0x0511, &val); in lg216x_get_sccc_block_mode()
698 default: in lg216x_get_sccc_block_mode()
699 ret = -EINVAL; in lg216x_get_sccc_block_mode()
711 default: in lg216x_get_sccc_block_mode()
719 static int lg216x_get_sccc_code_mode(struct lg216x_state *state, in lg216x_get_sccc_code_mode() argument
728 switch (state->cfg->lg_chip) { in lg216x_get_sccc_code_mode()
730 ret = lg216x_read_reg(state, 0x0316, &val); in lg216x_get_sccc_code_mode()
733 ret = lg216x_read_reg(state, 0x0512, &val); in lg216x_get_sccc_code_mode()
735 default: in lg216x_get_sccc_code_mode()
736 ret = -EINVAL; in lg216x_get_sccc_code_mode()
748 default: in lg216x_get_sccc_code_mode()
760 default: in lg216x_get_sccc_code_mode()
772 default: in lg216x_get_sccc_code_mode()
784 default: in lg216x_get_sccc_code_mode()
792 /* ------------------------------------------------------------------------ */
795 static int lg216x_read_fic_err_count(struct lg216x_state *state, u8 *err)
802 switch (state->cfg->lg_chip) {
804 ret = lg216x_read_reg(state, 0x0012, &fic_err);
807 ret = lg216x_read_reg(state, 0x001e, &fic_err);
818 static int lg2160_read_crc_err_count(struct lg216x_state *state, u16 *err)
825 ret = lg216x_read_reg(state, 0x0411, &crc_err1);
829 ret = lg216x_read_reg(state, 0x0412, &crc_err2);
838 static int lg2161_read_crc_err_count(struct lg216x_state *state, u16 *err)
845 ret = lg216x_read_reg(state, 0x0612, &crc_err);
854 static int lg216x_read_crc_err_count(struct lg216x_state *state, u16 *err)
857 switch (state->cfg->lg_chip) {
859 ret = lg2160_read_crc_err_count(state, err);
862 ret = lg2161_read_crc_err_count(state, err);
864 default:
865 ret = -EINVAL;
871 static int lg2160_read_rs_err_count(struct lg216x_state *state, u16 *err)
878 ret = lg216x_read_reg(state, 0x0413, &rs_err1);
882 ret = lg216x_read_reg(state, 0x0414, &rs_err2);
891 static int lg2161_read_rs_err_count(struct lg216x_state *state, u16 *err)
898 ret = lg216x_read_reg(state, 0x0613, &rs_err1);
902 ret = lg216x_read_reg(state, 0x0614, &rs_err2);
911 static int lg216x_read_rs_err_count(struct lg216x_state *state, u16 *err)
914 switch (state->cfg->lg_chip) {
916 ret = lg2160_read_rs_err_count(state, err);
919 ret = lg2161_read_rs_err_count(state, err);
921 default:
922 ret = -EINVAL;
929 /* ------------------------------------------------------------------------ */
934 struct lg216x_state *state = fe->demodulator_priv; in lg216x_get_frontend() local
939 c->modulation = VSB_8; in lg216x_get_frontend()
940 c->frequency = state->current_frequency; in lg216x_get_frontend()
941 c->delivery_system = SYS_ATSCMH; in lg216x_get_frontend()
943 ret = lg216x_get_fic_version(state, in lg216x_get_frontend()
944 &c->atscmh_fic_ver); in lg216x_get_frontend()
947 if (state->fic_ver != c->atscmh_fic_ver) { in lg216x_get_frontend()
948 state->fic_ver = c->atscmh_fic_ver; in lg216x_get_frontend()
951 ret = lg2160_get_parade_id(state, in lg216x_get_frontend()
952 &c->atscmh_parade_id); in lg216x_get_frontend()
956 c->atscmh_parade_id = state->parade_id; in lg216x_get_frontend()
958 ret = lg216x_get_nog(state, in lg216x_get_frontend()
959 &c->atscmh_nog); in lg216x_get_frontend()
962 ret = lg216x_get_tnog(state, in lg216x_get_frontend()
963 &c->atscmh_tnog); in lg216x_get_frontend()
966 ret = lg216x_get_sgn(state, in lg216x_get_frontend()
967 &c->atscmh_sgn); in lg216x_get_frontend()
970 ret = lg216x_get_prc(state, in lg216x_get_frontend()
971 &c->atscmh_prc); in lg216x_get_frontend()
975 ret = lg216x_get_rs_frame_mode(state, in lg216x_get_frontend()
977 &c->atscmh_rs_frame_mode); in lg216x_get_frontend()
980 ret = lg216x_get_rs_frame_ensemble(state, in lg216x_get_frontend()
982 &c->atscmh_rs_frame_ensemble); in lg216x_get_frontend()
985 ret = lg216x_get_rs_code_mode(state, in lg216x_get_frontend()
987 &c->atscmh_rs_code_mode_pri, in lg216x_get_frontend()
989 &c->atscmh_rs_code_mode_sec); in lg216x_get_frontend()
992 ret = lg216x_get_sccc_block_mode(state, in lg216x_get_frontend()
994 &c->atscmh_sccc_block_mode); in lg216x_get_frontend()
997 ret = lg216x_get_sccc_code_mode(state, in lg216x_get_frontend()
999 &c->atscmh_sccc_code_mode_a, in lg216x_get_frontend()
1001 &c->atscmh_sccc_code_mode_b, in lg216x_get_frontend()
1003 &c->atscmh_sccc_code_mode_c, in lg216x_get_frontend()
1005 &c->atscmh_sccc_code_mode_d); in lg216x_get_frontend()
1010 ret = lg216x_read_fic_err_count(state, in lg216x_get_frontend()
1011 (u8 *)&c->atscmh_fic_err); in lg216x_get_frontend()
1014 ret = lg216x_read_crc_err_count(state, in lg216x_get_frontend()
1015 &c->atscmh_crc_err); in lg216x_get_frontend()
1018 ret = lg216x_read_rs_err_count(state, in lg216x_get_frontend()
1019 &c->atscmh_rs_err); in lg216x_get_frontend()
1023 switch (state->cfg->lg_chip) { in lg216x_get_frontend()
1025 if (((c->atscmh_rs_err >= 240) && in lg216x_get_frontend()
1026 (c->atscmh_crc_err >= 240)) && in lg216x_get_frontend()
1027 ((jiffies_to_msecs(jiffies) - state->last_reset) > 6000)) in lg216x_get_frontend()
1028 ret = lg216x_soft_reset(state); in lg216x_get_frontend()
1043 struct lg216x_state *state = fe->demodulator_priv; in lg2160_set_frontend() local
1044 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in lg2160_set_frontend()
1047 lg_dbg("(%d)\n", fe->dtv_property_cache.frequency); in lg2160_set_frontend()
1049 if (fe->ops.tuner_ops.set_params) { in lg2160_set_frontend()
1050 ret = fe->ops.tuner_ops.set_params(fe); in lg2160_set_frontend()
1051 if (fe->ops.i2c_gate_ctrl) in lg2160_set_frontend()
1052 fe->ops.i2c_gate_ctrl(fe, 0); in lg2160_set_frontend()
1055 state->current_frequency = fe->dtv_property_cache.frequency; in lg2160_set_frontend()
1058 ret = lg2160_agc_fix(state, 0, 0); in lg2160_set_frontend()
1061 ret = lg2160_agc_polarity(state, 0, 0); in lg2160_set_frontend()
1064 ret = lg2160_tuner_pwr_save_polarity(state, 1); in lg2160_set_frontend()
1067 ret = lg216x_set_if(state); in lg2160_set_frontend()
1070 ret = lg2160_spectrum_polarity(state, state->cfg->spectral_inversion); in lg2160_set_frontend()
1075 ret = lg216x_soft_reset(state); in lg2160_set_frontend()
1079 ret = lg2160_tuner_pwr_save(state, 0); in lg2160_set_frontend()
1083 switch (state->cfg->lg_chip) { in lg2160_set_frontend()
1085 ret = lg2160_set_spi_clock(state); in lg2160_set_frontend()
1090 ret = lg2161_set_output_interface(state); in lg2160_set_frontend()
1096 ret = lg216x_set_parade(state, fe->dtv_property_cache.atscmh_parade_id); in lg2160_set_frontend()
1100 ret = lg216x_set_ensemble(state, in lg2160_set_frontend()
1101 fe->dtv_property_cache.atscmh_rs_frame_ensemble); in lg2160_set_frontend()
1105 ret = lg216x_initialize(state); in lg2160_set_frontend()
1109 ret = lg216x_enable_fic(state, 1); in lg2160_set_frontend()
1117 /* ------------------------------------------------------------------------ */
1119 static int lg2160_read_lock_status(struct lg216x_state *state, in lg2160_read_lock_status() argument
1128 ret = lg216x_read_reg(state, 0x011b, &val); in lg2160_read_lock_status()
1139 static int lg2161_read_lock_status(struct lg216x_state *state, in lg2161_read_lock_status() argument
1148 ret = lg216x_read_reg(state, 0x0304, &val); in lg2161_read_lock_status()
1154 ret = lg216x_read_reg(state, 0x011b, &val); in lg2161_read_lock_status()
1164 static int lg216x_read_lock_status(struct lg216x_state *state, in lg216x_read_lock_status() argument
1169 switch (state->cfg->lg_chip) { in lg216x_read_lock_status()
1171 ret = lg2160_read_lock_status(state, acq_lock, sync_lock); in lg216x_read_lock_status()
1174 ret = lg2161_read_lock_status(state, acq_lock, sync_lock); in lg216x_read_lock_status()
1176 default: in lg216x_read_lock_status()
1177 ret = -EINVAL; in lg216x_read_lock_status()
1182 return lg2160_read_lock_status(state, acq_lock, sync_lock); in lg216x_read_lock_status()
1188 struct lg216x_state *state = fe->demodulator_priv; in lg216x_read_status() local
1193 ret = lg216x_read_lock_status(state, &acq_lock, &sync_lock); in lg216x_read_status()
1213 /* ------------------------------------------------------------------------ */
1217 struct lg216x_state *state = fe->demodulator_priv; in lg2160_read_snr() local
1223 ret = lg216x_read_reg(state, 0x0202, &snr1); in lg2160_read_snr()
1227 ret = lg216x_read_reg(state, 0x0203, &snr2); in lg2160_read_snr()
1245 struct lg216x_state *state = fe->demodulator_priv; in lg2161_read_snr() local
1251 ret = lg216x_read_reg(state, 0x0302, &snr1); in lg2161_read_snr()
1255 ret = lg216x_read_reg(state, 0x0303, &snr2); in lg2161_read_snr()
1279 struct lg216x_state *state = fe->demodulator_priv; in lg216x_read_signal_strength()
1285 ret = fe->ops.read_snr(fe, &snr); in lg216x_read_signal_strength()
1288 /* Rather than use the 8.8 value snr, use state->snr which is 8.24 */ in lg216x_read_signal_strength()
1289 /* scale the range 0 - 35*2^24 into 0 - 65535 */ in lg216x_read_signal_strength()
1290 if (state->snr >= 8960 * 0x10000) in lg216x_read_signal_strength()
1293 *strength = state->snr / 8960; in lg216x_read_signal_strength()
1301 /* ------------------------------------------------------------------------ */
1306 struct lg216x_state *state = fe->demodulator_priv; in lg216x_read_ucblocks()
1309 ret = lg216x_read_rs_err_count(state, in lg216x_read_ucblocks()
1310 &fe->dtv_property_cache.atscmh_rs_err); in lg216x_read_ucblocks()
1314 *ucblocks = fe->dtv_property_cache.atscmh_rs_err; in lg216x_read_ucblocks()
1326 fe_tune_settings->min_delay_ms = 500; in lg216x_get_tune_settings()
1333 struct lg216x_state *state = fe->demodulator_priv; in lg216x_release() local
1335 kfree(state); in lg216x_release()
1393 struct lg216x_state *state = NULL; in lg2160_attach() local
1395 lg_dbg("(%d-%04x)\n", in lg2160_attach()
1397 config ? config->i2c_addr : 0); in lg2160_attach()
1399 state = kzalloc(sizeof(struct lg216x_state), GFP_KERNEL); in lg2160_attach()
1400 if (!state) in lg2160_attach()
1403 state->cfg = config; in lg2160_attach()
1404 state->i2c_adap = i2c_adap; in lg2160_attach()
1405 state->fic_ver = 0xff; in lg2160_attach()
1406 state->parade_id = 0xff; in lg2160_attach()
1408 switch (config->lg_chip) { in lg2160_attach()
1409 default: in lg2160_attach()
1413 memcpy(&state->frontend.ops, &lg2160_ops, in lg2160_attach()
1417 memcpy(&state->frontend.ops, &lg2161_ops, in lg2160_attach()
1422 state->frontend.demodulator_priv = state; in lg2160_attach()
1423 state->current_frequency = -1; in lg2160_attach()
1424 /* parade 1 by default */ in lg2160_attach()
1425 state->frontend.dtv_property_cache.atscmh_parade_id = 1; in lg2160_attach()
1427 return &state->frontend; in lg2160_attach()