Lines Matching +full:p +full:- +full:state
1 // SPDX-License-Identifier: GPL-2.0-or-later
8 Copyright (C) 2001-2002 Convergence Integrated Media GmbH
73 static int cx22702_writereg(struct cx22702_state *state, u8 reg, u8 data) in cx22702_writereg() argument
78 .addr = state->config->demod_address, .flags = 0, in cx22702_writereg()
81 ret = i2c_transfer(state->i2c, &msg, 1); in cx22702_writereg()
87 return -1; in cx22702_writereg()
93 static u8 cx22702_readreg(struct cx22702_state *state, u8 reg) in cx22702_readreg() argument
99 { .addr = state->config->demod_address, .flags = 0, in cx22702_readreg()
101 { .addr = state->config->demod_address, .flags = I2C_M_RD, in cx22702_readreg()
104 ret = i2c_transfer(state->i2c, msg, 2); in cx22702_readreg()
115 static int cx22702_set_inversion(struct cx22702_state *state, int inversion) in cx22702_set_inversion() argument
119 val = cx22702_readreg(state, 0x0C); in cx22702_set_inversion()
122 return -EOPNOTSUPP; in cx22702_set_inversion()
130 return -EINVAL; in cx22702_set_inversion()
132 return cx22702_writereg(state, 0x0C, val); in cx22702_set_inversion()
136 static int cx22702_get_tps(struct cx22702_state *state, in cx22702_get_tps() argument
137 struct dtv_frontend_properties *p) in cx22702_get_tps() argument
142 if (!(cx22702_readreg(state, 0x0A) & 0x20)) in cx22702_get_tps()
143 return -EAGAIN; in cx22702_get_tps()
145 val = cx22702_readreg(state, 0x01); in cx22702_get_tps()
148 p->modulation = QPSK; in cx22702_get_tps()
151 p->modulation = QAM_16; in cx22702_get_tps()
154 p->modulation = QAM_64; in cx22702_get_tps()
159 p->hierarchy = HIERARCHY_NONE; in cx22702_get_tps()
162 p->hierarchy = HIERARCHY_1; in cx22702_get_tps()
165 p->hierarchy = HIERARCHY_2; in cx22702_get_tps()
168 p->hierarchy = HIERARCHY_4; in cx22702_get_tps()
173 val = cx22702_readreg(state, 0x02); in cx22702_get_tps()
176 p->code_rate_HP = FEC_1_2; in cx22702_get_tps()
179 p->code_rate_HP = FEC_2_3; in cx22702_get_tps()
182 p->code_rate_HP = FEC_3_4; in cx22702_get_tps()
185 p->code_rate_HP = FEC_5_6; in cx22702_get_tps()
188 p->code_rate_HP = FEC_7_8; in cx22702_get_tps()
193 p->code_rate_LP = FEC_1_2; in cx22702_get_tps()
196 p->code_rate_LP = FEC_2_3; in cx22702_get_tps()
199 p->code_rate_LP = FEC_3_4; in cx22702_get_tps()
202 p->code_rate_LP = FEC_5_6; in cx22702_get_tps()
205 p->code_rate_LP = FEC_7_8; in cx22702_get_tps()
209 val = cx22702_readreg(state, 0x03); in cx22702_get_tps()
212 p->guard_interval = GUARD_INTERVAL_1_32; in cx22702_get_tps()
215 p->guard_interval = GUARD_INTERVAL_1_16; in cx22702_get_tps()
218 p->guard_interval = GUARD_INTERVAL_1_8; in cx22702_get_tps()
221 p->guard_interval = GUARD_INTERVAL_1_4; in cx22702_get_tps()
226 p->transmission_mode = TRANSMISSION_MODE_2K; in cx22702_get_tps()
229 p->transmission_mode = TRANSMISSION_MODE_8K; in cx22702_get_tps()
238 struct cx22702_state *state = fe->demodulator_priv; in cx22702_i2c_gate_ctrl() local
242 val = cx22702_readreg(state, 0x0D); in cx22702_i2c_gate_ctrl()
247 return cx22702_writereg(state, 0x0D, val); in cx22702_i2c_gate_ctrl()
253 struct dtv_frontend_properties *p = &fe->dtv_property_cache; in cx22702_set_tps() local
255 struct cx22702_state *state = fe->demodulator_priv; in cx22702_set_tps() local
257 if (fe->ops.tuner_ops.set_params) { in cx22702_set_tps()
258 fe->ops.tuner_ops.set_params(fe); in cx22702_set_tps()
259 if (fe->ops.i2c_gate_ctrl) in cx22702_set_tps()
260 fe->ops.i2c_gate_ctrl(fe, 0); in cx22702_set_tps()
264 cx22702_set_inversion(state, p->inversion); in cx22702_set_tps()
267 val = cx22702_readreg(state, 0x0C) & 0xcf; in cx22702_set_tps()
268 switch (p->bandwidth_hz) { in cx22702_set_tps()
279 return -EINVAL; in cx22702_set_tps()
281 cx22702_writereg(state, 0x0C, val); in cx22702_set_tps()
283 p->code_rate_LP = FEC_AUTO; /* temp hack as manual not working */ in cx22702_set_tps()
286 if ((p->hierarchy == HIERARCHY_AUTO) || in cx22702_set_tps()
287 (p->modulation == QAM_AUTO) || in cx22702_set_tps()
288 (p->code_rate_HP == FEC_AUTO) || in cx22702_set_tps()
289 (p->code_rate_LP == FEC_AUTO) || in cx22702_set_tps()
290 (p->guard_interval == GUARD_INTERVAL_AUTO) || in cx22702_set_tps()
291 (p->transmission_mode == TRANSMISSION_MODE_AUTO)) { in cx22702_set_tps()
293 /* TPS Source - use hardware driven values */ in cx22702_set_tps()
294 cx22702_writereg(state, 0x06, 0x10); in cx22702_set_tps()
295 cx22702_writereg(state, 0x07, 0x9); in cx22702_set_tps()
296 cx22702_writereg(state, 0x08, 0xC1); in cx22702_set_tps()
297 cx22702_writereg(state, 0x0B, cx22702_readreg(state, 0x0B) in cx22702_set_tps()
299 cx22702_writereg(state, 0x0C, in cx22702_set_tps()
300 (cx22702_readreg(state, 0x0C) & 0xBF) | 0x40); in cx22702_set_tps()
301 cx22702_writereg(state, 0x00, 0x01); /* Begin acquisition */ in cx22702_set_tps()
307 switch (p->modulation) { /* mask 0x18 */ in cx22702_set_tps()
319 return -EINVAL; in cx22702_set_tps()
321 switch (p->hierarchy) { /* mask 0x07 */ in cx22702_set_tps()
335 return -EINVAL; in cx22702_set_tps()
337 cx22702_writereg(state, 0x06, val); in cx22702_set_tps()
339 switch (p->code_rate_HP) { /* mask 0x38 */ in cx22702_set_tps()
358 return -EINVAL; in cx22702_set_tps()
360 switch (p->code_rate_LP) { /* mask 0x07 */ in cx22702_set_tps()
378 return -EINVAL; in cx22702_set_tps()
380 cx22702_writereg(state, 0x07, val); in cx22702_set_tps()
382 switch (p->guard_interval) { /* mask 0x0c */ in cx22702_set_tps()
397 return -EINVAL; in cx22702_set_tps()
399 switch (p->transmission_mode) { /* mask 0x03 */ in cx22702_set_tps()
407 return -EINVAL; in cx22702_set_tps()
409 cx22702_writereg(state, 0x08, val); in cx22702_set_tps()
410 cx22702_writereg(state, 0x0B, in cx22702_set_tps()
411 (cx22702_readreg(state, 0x0B) & 0xfc) | 0x02); in cx22702_set_tps()
412 cx22702_writereg(state, 0x0C, in cx22702_set_tps()
413 (cx22702_readreg(state, 0x0C) & 0xBF) | 0x40); in cx22702_set_tps()
416 cx22702_writereg(state, 0x00, 0x01); in cx22702_set_tps()
422 to a default state. */
426 struct cx22702_state *state = fe->demodulator_priv; in cx22702_init() local
428 cx22702_writereg(state, 0x00, 0x02); in cx22702_init()
433 cx22702_writereg(state, init_tab[i], init_tab[i + 1]); in cx22702_init()
435 cx22702_writereg(state, 0xf8, (state->config->output_mode << 1) in cx22702_init()
445 struct cx22702_state *state = fe->demodulator_priv; in cx22702_read_status() local
451 reg0A = cx22702_readreg(state, 0x0A); in cx22702_read_status()
452 reg23 = cx22702_readreg(state, 0x23); in cx22702_read_status()
474 struct cx22702_state *state = fe->demodulator_priv; in cx22702_read_ber() local
476 if (cx22702_readreg(state, 0xE4) & 0x02) { in cx22702_read_ber()
478 *ber = (cx22702_readreg(state, 0xDE) & 0x7F) << 7 in cx22702_read_ber()
479 | (cx22702_readreg(state, 0xDF) & 0x7F); in cx22702_read_ber()
482 *ber = (cx22702_readreg(state, 0xDE) & 0x7F) << 7 in cx22702_read_ber()
483 | cx22702_readreg(state, 0xDF); in cx22702_read_ber()
492 struct cx22702_state *state = fe->demodulator_priv; in cx22702_read_signal_strength() local
498 * - In the absence of signal, value is 0xff. in cx22702_read_signal_strength()
499 * - In the presence of a weak signal, bit 7 is set, not sure what in cx22702_read_signal_strength()
501 * - In the presence of a strong signal, the register holds a 7-bit in cx22702_read_signal_strength()
505 reg23 = cx22702_readreg(state, 0x23); in cx22702_read_signal_strength()
519 struct cx22702_state *state = fe->demodulator_priv; in cx22702_read_snr() local
522 if (cx22702_readreg(state, 0xE4) & 0x02) { in cx22702_read_snr()
524 rs_ber = (cx22702_readreg(state, 0xDE) & 0x7F) << 7 in cx22702_read_snr()
525 | (cx22702_readreg(state, 0xDF) & 0x7F); in cx22702_read_snr()
528 rs_ber = (cx22702_readreg(state, 0xDE) & 0x7F) << 8 in cx22702_read_snr()
529 | cx22702_readreg(state, 0xDF); in cx22702_read_snr()
538 struct cx22702_state *state = fe->demodulator_priv; in cx22702_read_ucblocks() local
543 _ucblocks = cx22702_readreg(state, 0xE3); in cx22702_read_ucblocks()
544 if (state->prevUCBlocks < _ucblocks) in cx22702_read_ucblocks()
545 *ucblocks = (_ucblocks - state->prevUCBlocks); in cx22702_read_ucblocks()
547 *ucblocks = state->prevUCBlocks - _ucblocks; in cx22702_read_ucblocks()
548 state->prevUCBlocks = _ucblocks; in cx22702_read_ucblocks()
556 struct cx22702_state *state = fe->demodulator_priv; in cx22702_get_frontend() local
558 u8 reg0C = cx22702_readreg(state, 0x0C); in cx22702_get_frontend()
560 c->inversion = reg0C & 0x1 ? INVERSION_ON : INVERSION_OFF; in cx22702_get_frontend()
561 return cx22702_get_tps(state, c); in cx22702_get_frontend()
567 tune->min_delay_ms = 1000; in cx22702_get_tune_settings()
573 struct cx22702_state *state = fe->demodulator_priv; in cx22702_release() local
574 kfree(state); in cx22702_release()
582 struct cx22702_state *state = NULL; in cx22702_attach() local
584 /* allocate memory for the internal state */ in cx22702_attach()
585 state = kzalloc(sizeof(struct cx22702_state), GFP_KERNEL); in cx22702_attach()
586 if (state == NULL) in cx22702_attach()
589 /* setup the state */ in cx22702_attach()
590 state->config = config; in cx22702_attach()
591 state->i2c = i2c; in cx22702_attach()
594 if (cx22702_readreg(state, 0x1f) != 0x3) in cx22702_attach()
598 memcpy(&state->frontend.ops, &cx22702_ops, in cx22702_attach()
600 state->frontend.demodulator_priv = state; in cx22702_attach()
601 return &state->frontend; in cx22702_attach()
604 kfree(state); in cx22702_attach()
612 .name = "Conexant CX22702 DVB-T",
639 MODULE_DESCRIPTION("Conexant CX22702 DVB-T Demodulator driver");