Lines Matching +full:default +full:- +full:state
2 * Conexant cx24123/cx24109 - DVB QPSK Satellite demod/tuner driver
6 * Support for KWorld DVB-S 100 by Vadim Catana <skystar@moldova.cc>
8 * Support for CX24123/CX24113-NIM by Patrick Boettcher <pb@linuxtv.org>
35 "(1-9, default:off).");
39 MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
200 {0x03, 0x07}, /* QPSK, DVB, Auto Acquisition (default) */
203 {0x06, 0x31}, /* MPEG (default) */
204 {0x0b, 0x00}, /* Freq search start point (default) */
205 {0x0c, 0x00}, /* Demodulator sample gain (default) */
206 {0x0d, 0x7f}, /* Force driver to shift until the maximum (+-10 MHz) */
207 {0x0e, 0x03}, /* Default non-inverted, FEC 3/4 (default) */
209 {0x10, 0x01}, /* Default search inversion, no repeat (default) */
217 {0x2a, 0xb0}, /* DiSEqC Parameters (default) */
218 {0x2b, 0x73}, /* DiSEqC Tone Frequency (default) */
219 {0x2c, 0x00}, /* DiSEqC Message (0x2c - 0x31) */
225 {0x32, 0x8c}, /* DiSEqC Parameters (default) */
226 {0x33, 0x00}, /* Interrupts off (0x33 - 0x34) */
228 {0x35, 0x03}, /* DiSEqC Tone Amplitude (default) */
229 {0x36, 0x02}, /* DiSEqC Parameters (default) */
230 {0x37, 0x3a}, /* DiSEqC Parameters (default) */
232 {0x44, 0x00}, /* Constellation (default) */
233 {0x45, 0x00}, /* Symbol count (default) */
234 {0x46, 0x0d}, /* Symbol rate estimator on (default) */
236 {0x57, 0xff}, /* Error Counter Window (default) */
237 {0x5c, 0x20}, /* Acquisition AFC Expiration window (default is 0x10) */
238 {0x67, 0x83}, /* Non-DCII symbol clock */
241 static int cx24123_i2c_writereg(struct cx24123_state *state, in cx24123_i2c_writereg() argument
252 err = i2c_transfer(state->i2c, &msg, 1); in cx24123_i2c_writereg()
262 static int cx24123_i2c_readreg(struct cx24123_state *state, u8 i2c_addr, u8 reg) in cx24123_i2c_readreg() argument
271 ret = i2c_transfer(state->i2c, msg, 2); in cx24123_i2c_readreg()
283 #define cx24123_readreg(state, reg) \ argument
284 cx24123_i2c_readreg(state, state->config->demod_address, reg)
285 #define cx24123_writereg(state, reg, val) \ argument
286 cx24123_i2c_writereg(state, state->config->demod_address, reg, val)
288 static int cx24123_set_inversion(struct cx24123_state *state, in cx24123_set_inversion() argument
291 u8 nom_reg = cx24123_readreg(state, 0x0e); in cx24123_set_inversion()
292 u8 auto_reg = cx24123_readreg(state, 0x10); in cx24123_set_inversion()
297 cx24123_writereg(state, 0x0e, nom_reg & ~0x80); in cx24123_set_inversion()
298 cx24123_writereg(state, 0x10, auto_reg | 0x80); in cx24123_set_inversion()
302 cx24123_writereg(state, 0x0e, nom_reg | 0x80); in cx24123_set_inversion()
303 cx24123_writereg(state, 0x10, auto_reg | 0x80); in cx24123_set_inversion()
307 cx24123_writereg(state, 0x10, auto_reg & ~0x80); in cx24123_set_inversion()
309 default: in cx24123_set_inversion()
310 return -EINVAL; in cx24123_set_inversion()
316 static int cx24123_get_inversion(struct cx24123_state *state, in cx24123_get_inversion() argument
321 val = cx24123_readreg(state, 0x1b) >> 7; in cx24123_get_inversion()
334 static int cx24123_set_fec(struct cx24123_state *state, enum fe_code_rate fec) in cx24123_set_fec() argument
336 u8 nom_reg = cx24123_readreg(state, 0x0e) & ~0x07; in cx24123_set_fec()
343 cx24123_writereg(state, 0x43, in cx24123_set_fec()
344 cx24123_readreg(state, 0x43) | 0x01); in cx24123_set_fec()
346 cx24123_writereg(state, 0x43, in cx24123_set_fec()
347 cx24123_readreg(state, 0x43) & ~0x01); in cx24123_set_fec()
352 cx24123_writereg(state, 0x0e, nom_reg | 0x01); in cx24123_set_fec()
353 cx24123_writereg(state, 0x0f, 0x02); in cx24123_set_fec()
357 cx24123_writereg(state, 0x0e, nom_reg | 0x02); in cx24123_set_fec()
358 cx24123_writereg(state, 0x0f, 0x04); in cx24123_set_fec()
362 cx24123_writereg(state, 0x0e, nom_reg | 0x03); in cx24123_set_fec()
363 cx24123_writereg(state, 0x0f, 0x08); in cx24123_set_fec()
367 cx24123_writereg(state, 0x0e, nom_reg | 0x04); in cx24123_set_fec()
368 cx24123_writereg(state, 0x0f, 0x10); in cx24123_set_fec()
372 cx24123_writereg(state, 0x0e, nom_reg | 0x05); in cx24123_set_fec()
373 cx24123_writereg(state, 0x0f, 0x20); in cx24123_set_fec()
377 cx24123_writereg(state, 0x0e, nom_reg | 0x06); in cx24123_set_fec()
378 cx24123_writereg(state, 0x0f, 0x40); in cx24123_set_fec()
382 cx24123_writereg(state, 0x0e, nom_reg | 0x07); in cx24123_set_fec()
383 cx24123_writereg(state, 0x0f, 0x80); in cx24123_set_fec()
387 cx24123_writereg(state, 0x0f, 0xfe); in cx24123_set_fec()
389 default: in cx24123_set_fec()
390 return -EOPNOTSUPP; in cx24123_set_fec()
396 static int cx24123_get_fec(struct cx24123_state *state, enum fe_code_rate *fec) in cx24123_get_fec() argument
400 ret = cx24123_readreg(state, 0x1b); in cx24123_get_fec()
427 default: in cx24123_get_fec()
450 static int cx24123_set_symbolrate(struct cx24123_state *state, u32 srate) in cx24123_set_symbolrate() argument
457 if ((srate > state->frontend.ops.info.symbol_rate_max) || in cx24123_set_symbolrate()
458 (srate < state->frontend.ops.info.symbol_rate_min)) in cx24123_set_symbolrate()
459 return -EOPNOTSUPP; in cx24123_set_symbolrate()
489 cx24123_writereg(state, 0x01, pll_mult * 6); in cx24123_set_symbolrate()
491 cx24123_writereg(state, 0x08, (ratio >> 16) & 0x3f); in cx24123_set_symbolrate()
492 cx24123_writereg(state, 0x09, (ratio >> 8) & 0xff); in cx24123_set_symbolrate()
493 cx24123_writereg(state, 0x0a, ratio & 0xff); in cx24123_set_symbolrate()
497 tmp = cx24123_readreg(state, 0x0c) & ~0xe0; in cx24123_set_symbolrate()
498 cx24123_writereg(state, 0x0c, tmp | sample_gain << 5); in cx24123_set_symbolrate()
513 struct dtv_frontend_properties *p = &fe->dtv_property_cache; in cx24123_pll_calculate()
514 struct cx24123_state *state = fe->demodulator_priv; in cx24123_pll_calculate() local
524 state->VCAarg = cx24123_AGC_vals[0].VCAprogdata; in cx24123_pll_calculate()
525 state->VGAarg = cx24123_AGC_vals[0].VGAprogdata; in cx24123_pll_calculate()
526 state->bandselectarg = cx24123_bandselect_vals[0].progdata; in cx24123_pll_calculate()
533 if ((agcv->symbolrate_low <= p->symbol_rate) && in cx24123_pll_calculate()
534 (agcv->symbolrate_high >= p->symbol_rate)) { in cx24123_pll_calculate()
535 state->VCAarg = agcv->VCAprogdata; in cx24123_pll_calculate()
536 state->VGAarg = agcv->VGAprogdata; in cx24123_pll_calculate()
537 state->FILTune = agcv->FILTune; in cx24123_pll_calculate()
545 if ((bsv->freq_low <= p->frequency) && in cx24123_pll_calculate()
546 (bsv->freq_high >= p->frequency)) in cx24123_pll_calculate()
550 band = force_band - 1; in cx24123_pll_calculate()
552 state->bandselectarg = cx24123_bandselect_vals[band].progdata; in cx24123_pll_calculate()
556 if (p->frequency < (cx24123_bandselect_vals[band].freq_low + in cx24123_pll_calculate()
565 ndiv = (((p->frequency * vco_div * 10) / in cx24123_pll_calculate()
567 adiv = (((p->frequency * vco_div * 10) / in cx24123_pll_calculate()
571 ndiv--; in cx24123_pll_calculate()
575 state->pllarg = (3 << 19) | (3 << 17) | (1 << 16) | in cx24123_pll_calculate()
582 * Tuner data is 21 bits long, must be left-aligned in data.
588 struct cx24123_state *state = fe->demodulator_priv; in cx24123_pll_writereg() local
597 cx24123_writereg(state, 0x21, 0x15); in cx24123_pll_writereg()
601 cx24123_writereg(state, 0x22, (data >> 16) & 0xff); in cx24123_pll_writereg()
602 while ((cx24123_readreg(state, 0x20) & 0x40) == 0) { in cx24123_pll_writereg()
606 return -EREMOTEIO; in cx24123_pll_writereg()
613 cx24123_writereg(state, 0x22, (data >> 8) & 0xff); in cx24123_pll_writereg()
614 while ((cx24123_readreg(state, 0x20) & 0x40) == 0) { in cx24123_pll_writereg()
618 return -EREMOTEIO; in cx24123_pll_writereg()
626 cx24123_writereg(state, 0x22, (data) & 0xff); in cx24123_pll_writereg()
627 while ((cx24123_readreg(state, 0x20) & 0x80)) { in cx24123_pll_writereg()
631 return -EREMOTEIO; in cx24123_pll_writereg()
637 cx24123_writereg(state, 0x20, cx24123_readreg(state, 0x20) | 2); in cx24123_pll_writereg()
638 cx24123_writereg(state, 0x20, cx24123_readreg(state, 0x20) & 0xfd); in cx24123_pll_writereg()
645 struct dtv_frontend_properties *p = &fe->dtv_property_cache; in cx24123_pll_tune()
646 struct cx24123_state *state = fe->demodulator_priv; in cx24123_pll_tune() local
649 dprintk("frequency=%i\n", p->frequency); in cx24123_pll_tune()
653 return -EINVAL; in cx24123_pll_tune()
657 cx24123_pll_writereg(fe, state->VCAarg); in cx24123_pll_tune()
658 cx24123_pll_writereg(fe, state->VGAarg); in cx24123_pll_tune()
661 cx24123_pll_writereg(fe, state->bandselectarg); in cx24123_pll_tune()
662 cx24123_pll_writereg(fe, state->pllarg); in cx24123_pll_tune()
665 val = cx24123_readreg(state, 0x28) & ~0x3; in cx24123_pll_tune()
666 cx24123_writereg(state, 0x27, state->FILTune >> 2); in cx24123_pll_tune()
667 cx24123_writereg(state, 0x28, val | (state->FILTune & 0x3)); in cx24123_pll_tune()
669 dprintk("pll tune VCA=%d, band=%d, pll=%d\n", state->VCAarg, in cx24123_pll_tune()
670 state->bandselectarg, state->pllarg); in cx24123_pll_tune()
684 /* mode == 1 -> i2c-repeater, 0 -> bti */
685 static int cx24123_repeater_mode(struct cx24123_state *state, u8 mode, u8 start) in cx24123_repeater_mode() argument
687 u8 r = cx24123_readreg(state, 0x23) & 0x1e; in cx24123_repeater_mode()
692 return cx24123_writereg(state, 0x23, r); in cx24123_repeater_mode()
697 struct cx24123_state *state = fe->demodulator_priv; in cx24123_initfe() local
704 cx24123_writereg(state, cx24123_regdata[i].reg, in cx24123_initfe()
708 if (state->config->lnb_polarity) in cx24123_initfe()
709 cx24123_writereg(state, 0x32, in cx24123_initfe()
710 cx24123_readreg(state, 0x32) | 0x02); in cx24123_initfe()
712 if (state->config->dont_use_pll) in cx24123_initfe()
713 cx24123_repeater_mode(state, 1, 0); in cx24123_initfe()
721 struct cx24123_state *state = fe->demodulator_priv; in cx24123_set_voltage() local
724 val = cx24123_readreg(state, 0x29) & ~0x40; in cx24123_set_voltage()
729 return cx24123_writereg(state, 0x29, val & 0x7f); in cx24123_set_voltage()
732 return cx24123_writereg(state, 0x29, val | 0x80); in cx24123_set_voltage()
734 /* already handled in cx88-dvb */ in cx24123_set_voltage()
736 default: in cx24123_set_voltage()
737 return -EINVAL; in cx24123_set_voltage()
744 static void cx24123_wait_for_diseqc(struct cx24123_state *state) in cx24123_wait_for_diseqc() argument
747 while (!(cx24123_readreg(state, 0x29) & 0x40)) { in cx24123_wait_for_diseqc()
760 struct cx24123_state *state = fe->demodulator_priv; in cx24123_send_diseqc_msg() local
766 tone = cx24123_readreg(state, 0x29); in cx24123_send_diseqc_msg()
768 cx24123_writereg(state, 0x29, tone & ~0x50); in cx24123_send_diseqc_msg()
771 cx24123_wait_for_diseqc(state); in cx24123_send_diseqc_msg()
774 cx24123_writereg(state, 0x2a, cx24123_readreg(state, 0x2a) & 0xfb); in cx24123_send_diseqc_msg()
776 for (i = 0; i < cmd->msg_len; i++) in cx24123_send_diseqc_msg()
777 cx24123_writereg(state, 0x2C + i, cmd->msg[i]); in cx24123_send_diseqc_msg()
779 val = cx24123_readreg(state, 0x29); in cx24123_send_diseqc_msg()
780 cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40) | in cx24123_send_diseqc_msg()
781 ((cmd->msg_len-3) & 3)); in cx24123_send_diseqc_msg()
784 cx24123_wait_for_diseqc(state); in cx24123_send_diseqc_msg()
788 cx24123_writereg(state, 0x29, tone & ~0x40); in cx24123_send_diseqc_msg()
796 struct cx24123_state *state = fe->demodulator_priv; in cx24123_diseqc_send_burst() local
802 tone = cx24123_readreg(state, 0x29); in cx24123_diseqc_send_burst()
804 cx24123_writereg(state, 0x29, tone & ~0x50); in cx24123_diseqc_send_burst()
807 cx24123_wait_for_diseqc(state); in cx24123_diseqc_send_burst()
810 cx24123_writereg(state, 0x2a, cx24123_readreg(state, 0x2a) | 0x4); in cx24123_diseqc_send_burst()
812 val = cx24123_readreg(state, 0x29); in cx24123_diseqc_send_burst()
814 cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40 | 0x00)); in cx24123_diseqc_send_burst()
816 cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40 | 0x08)); in cx24123_diseqc_send_burst()
818 return -EINVAL; in cx24123_diseqc_send_burst()
820 cx24123_wait_for_diseqc(state); in cx24123_diseqc_send_burst()
821 cx24123_writereg(state, 0x2a, cx24123_readreg(state, 0x2a) & 0xfb); in cx24123_diseqc_send_burst()
825 cx24123_writereg(state, 0x29, tone & ~0x40); in cx24123_diseqc_send_burst()
832 struct cx24123_state *state = fe->demodulator_priv; in cx24123_read_status() local
833 int sync = cx24123_readreg(state, 0x14); in cx24123_read_status()
836 if (state->config->dont_use_pll) { in cx24123_read_status()
838 if (fe->ops.tuner_ops.get_status) in cx24123_read_status()
839 fe->ops.tuner_ops.get_status(fe, &tun_status); in cx24123_read_status()
843 int lock = cx24123_readreg(state, 0x20); in cx24123_read_status()
853 /* Reed-Solomon Status */ in cx24123_read_status()
869 struct cx24123_state *state = fe->demodulator_priv; in cx24123_read_ber() local
873 *ber = ((cx24123_readreg(state, 0x1c) & 0x3f) << 16) | in cx24123_read_ber()
874 (cx24123_readreg(state, 0x1d) << 8 | in cx24123_read_ber()
875 cx24123_readreg(state, 0x1e)); in cx24123_read_ber()
885 struct cx24123_state *state = fe->demodulator_priv; in cx24123_read_signal_strength() local
888 *signal_strength = cx24123_readreg(state, 0x3b) << 8; in cx24123_read_signal_strength()
897 struct cx24123_state *state = fe->demodulator_priv; in cx24123_read_snr() local
901 *snr = 65535 - (((u16)cx24123_readreg(state, 0x18) << 8) | in cx24123_read_snr()
902 (u16)cx24123_readreg(state, 0x19)); in cx24123_read_snr()
911 struct cx24123_state *state = fe->demodulator_priv; in cx24123_set_frontend() local
912 struct dtv_frontend_properties *p = &fe->dtv_property_cache; in cx24123_set_frontend()
916 if (state->config->set_ts_params) in cx24123_set_frontend()
917 state->config->set_ts_params(fe, 0); in cx24123_set_frontend()
919 state->currentfreq = p->frequency; in cx24123_set_frontend()
920 state->currentsymbolrate = p->symbol_rate; in cx24123_set_frontend()
922 cx24123_set_inversion(state, p->inversion); in cx24123_set_frontend()
923 cx24123_set_fec(state, p->fec_inner); in cx24123_set_frontend()
924 cx24123_set_symbolrate(state, p->symbol_rate); in cx24123_set_frontend()
926 if (!state->config->dont_use_pll) in cx24123_set_frontend()
928 else if (fe->ops.tuner_ops.set_params) in cx24123_set_frontend()
929 fe->ops.tuner_ops.set_params(fe); in cx24123_set_frontend()
934 cx24123_writereg(state, 0x03, (cx24123_readreg(state, 0x03) | 0x07)); in cx24123_set_frontend()
935 cx24123_writereg(state, 0x00, 0x10); in cx24123_set_frontend()
936 cx24123_writereg(state, 0x00, 0); in cx24123_set_frontend()
938 if (state->config->agc_callback) in cx24123_set_frontend()
939 state->config->agc_callback(fe); in cx24123_set_frontend()
947 struct cx24123_state *state = fe->demodulator_priv; in cx24123_get_frontend() local
951 if (cx24123_get_inversion(state, &p->inversion) != 0) { in cx24123_get_frontend()
953 return -EREMOTEIO; in cx24123_get_frontend()
955 if (cx24123_get_fec(state, &p->fec_inner) != 0) { in cx24123_get_frontend()
957 return -EREMOTEIO; in cx24123_get_frontend()
959 p->frequency = state->currentfreq; in cx24123_get_frontend()
960 p->symbol_rate = state->currentsymbolrate; in cx24123_get_frontend()
967 struct cx24123_state *state = fe->demodulator_priv; in cx24123_set_tone() local
971 cx24123_wait_for_diseqc(state); in cx24123_set_tone()
973 val = cx24123_readreg(state, 0x29) & ~0x40; in cx24123_set_tone()
978 return cx24123_writereg(state, 0x29, val | 0x10); in cx24123_set_tone()
981 return cx24123_writereg(state, 0x29, val & 0xef); in cx24123_set_tone()
982 default: in cx24123_set_tone()
983 err("CASE reached default with tone=%d\n", tone); in cx24123_set_tone()
984 return -EINVAL; in cx24123_set_tone()
1015 struct cx24123_state *state = fe->demodulator_priv; in cx24123_release() local
1017 i2c_del_adapter(&state->tuner_i2c_adapter); in cx24123_release()
1018 kfree(state); in cx24123_release()
1024 struct cx24123_state *state = i2c_get_adapdata(i2c_adap); in cx24123_tuner_i2c_tuner_xfer() local
1026 cx24123_repeater_mode(state, 1, 1); in cx24123_tuner_i2c_tuner_xfer()
1027 return i2c_transfer(state->i2c, msg, num); in cx24123_tuner_i2c_tuner_xfer()
1043 struct cx24123_state *state = fe->demodulator_priv; in cx24123_get_tuner_i2c_adapter() local
1044 return &state->tuner_i2c_adapter; in cx24123_get_tuner_i2c_adapter()
1053 /* allocate memory for the internal state */ in cx24123_attach()
1054 struct cx24123_state *state = in cx24123_attach() local
1058 if (state == NULL) { in cx24123_attach()
1063 /* setup the state */ in cx24123_attach()
1064 state->config = config; in cx24123_attach()
1065 state->i2c = i2c; in cx24123_attach()
1068 state->demod_rev = cx24123_readreg(state, 0x00); in cx24123_attach()
1069 switch (state->demod_rev) { in cx24123_attach()
1076 default: in cx24123_attach()
1077 err("wrong demod revision: %x\n", state->demod_rev); in cx24123_attach()
1082 memcpy(&state->frontend.ops, &cx24123_ops, in cx24123_attach()
1084 state->frontend.demodulator_priv = state; in cx24123_attach()
1087 if (config->dont_use_pll) in cx24123_attach()
1088 cx24123_repeater_mode(state, 1, 0); in cx24123_attach()
1090 strlcpy(state->tuner_i2c_adapter.name, "CX24123 tuner I2C bus", in cx24123_attach()
1091 sizeof(state->tuner_i2c_adapter.name)); in cx24123_attach()
1092 state->tuner_i2c_adapter.algo = &cx24123_tuner_i2c_algo; in cx24123_attach()
1093 state->tuner_i2c_adapter.algo_data = NULL; in cx24123_attach()
1094 state->tuner_i2c_adapter.dev.parent = i2c->dev.parent; in cx24123_attach()
1095 i2c_set_adapdata(&state->tuner_i2c_adapter, state); in cx24123_attach()
1096 if (i2c_add_adapter(&state->tuner_i2c_adapter) < 0) { in cx24123_attach()
1101 return &state->frontend; in cx24123_attach()
1104 kfree(state); in cx24123_attach()