Lines Matching +full:p +full:- +full:state
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 Copyright (C) 2001-2002 Convergence Integrated Media GmbH
58 static int cx22700_writereg (struct cx22700_state* state, u8 reg, u8 data) in cx22700_writereg() argument
62 struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 }; in cx22700_writereg()
66 ret = i2c_transfer (state->i2c, &msg, 1); in cx22700_writereg()
72 return (ret != 1) ? -1 : 0; in cx22700_writereg()
75 static int cx22700_readreg (struct cx22700_state* state, u8 reg) in cx22700_readreg() argument
80 …struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 1 … in cx22700_readreg()
81 { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } }; in cx22700_readreg()
85 ret = i2c_transfer (state->i2c, msg, 2); in cx22700_readreg()
87 if (ret != 2) return -EIO; in cx22700_readreg()
92 static int cx22700_set_inversion (struct cx22700_state* state, int inversion) in cx22700_set_inversion() argument
100 return -EOPNOTSUPP; in cx22700_set_inversion()
102 val = cx22700_readreg (state, 0x09); in cx22700_set_inversion()
103 return cx22700_writereg (state, 0x09, val | 0x01); in cx22700_set_inversion()
105 val = cx22700_readreg (state, 0x09); in cx22700_set_inversion()
106 return cx22700_writereg (state, 0x09, val & 0xfe); in cx22700_set_inversion()
108 return -EINVAL; in cx22700_set_inversion()
112 static int cx22700_set_tps(struct cx22700_state *state, in cx22700_set_tps() argument
113 struct dtv_frontend_properties *p) in cx22700_set_tps() argument
121 if (p->code_rate_HP < FEC_1_2 || p->code_rate_HP > FEC_7_8) in cx22700_set_tps()
122 return -EINVAL; in cx22700_set_tps()
124 if (p->code_rate_LP < FEC_1_2 || p->code_rate_LP > FEC_7_8) in cx22700_set_tps()
125 return -EINVAL; in cx22700_set_tps()
127 if (p->code_rate_HP == FEC_4_5 || p->code_rate_LP == FEC_4_5) in cx22700_set_tps()
128 return -EINVAL; in cx22700_set_tps()
130 if ((int)p->guard_interval < GUARD_INTERVAL_1_32 || in cx22700_set_tps()
131 p->guard_interval > GUARD_INTERVAL_1_4) in cx22700_set_tps()
132 return -EINVAL; in cx22700_set_tps()
134 if (p->transmission_mode != TRANSMISSION_MODE_2K && in cx22700_set_tps()
135 p->transmission_mode != TRANSMISSION_MODE_8K) in cx22700_set_tps()
136 return -EINVAL; in cx22700_set_tps()
138 if (p->modulation != QPSK && in cx22700_set_tps()
139 p->modulation != QAM_16 && in cx22700_set_tps()
140 p->modulation != QAM_64) in cx22700_set_tps()
141 return -EINVAL; in cx22700_set_tps()
143 if ((int)p->hierarchy < HIERARCHY_NONE || in cx22700_set_tps()
144 p->hierarchy > HIERARCHY_4) in cx22700_set_tps()
145 return -EINVAL; in cx22700_set_tps()
147 if (p->bandwidth_hz > 8000000 || p->bandwidth_hz < 6000000) in cx22700_set_tps()
148 return -EINVAL; in cx22700_set_tps()
150 if (p->bandwidth_hz == 7000000) in cx22700_set_tps()
151 cx22700_writereg (state, 0x09, cx22700_readreg (state, 0x09 | 0x10)); in cx22700_set_tps()
153 cx22700_writereg (state, 0x09, cx22700_readreg (state, 0x09 & ~0x10)); in cx22700_set_tps()
155 val = qam_tab[p->modulation - QPSK]; in cx22700_set_tps()
156 val |= p->hierarchy - HIERARCHY_NONE; in cx22700_set_tps()
158 cx22700_writereg (state, 0x04, val); in cx22700_set_tps()
160 if (p->code_rate_HP - FEC_1_2 >= sizeof(fec_tab) || in cx22700_set_tps()
161 p->code_rate_LP - FEC_1_2 >= sizeof(fec_tab)) in cx22700_set_tps()
162 return -EINVAL; in cx22700_set_tps()
163 val = fec_tab[p->code_rate_HP - FEC_1_2] << 3; in cx22700_set_tps()
164 val |= fec_tab[p->code_rate_LP - FEC_1_2]; in cx22700_set_tps()
166 cx22700_writereg (state, 0x05, val); in cx22700_set_tps()
168 val = (p->guard_interval - GUARD_INTERVAL_1_32) << 2; in cx22700_set_tps()
169 val |= p->transmission_mode - TRANSMISSION_MODE_2K; in cx22700_set_tps()
171 cx22700_writereg (state, 0x06, val); in cx22700_set_tps()
173 cx22700_writereg (state, 0x08, 0x04 | 0x02); /* use user tps parameters */ in cx22700_set_tps()
174 cx22700_writereg (state, 0x08, 0x04); /* restart acquisition */ in cx22700_set_tps()
179 static int cx22700_get_tps(struct cx22700_state *state, in cx22700_get_tps() argument
180 struct dtv_frontend_properties *p) in cx22700_get_tps() argument
190 if (!(cx22700_readreg(state, 0x07) & 0x20)) /* tps valid? */ in cx22700_get_tps()
191 return -EAGAIN; in cx22700_get_tps()
193 val = cx22700_readreg (state, 0x01); in cx22700_get_tps()
196 p->hierarchy = HIERARCHY_AUTO; in cx22700_get_tps()
198 p->hierarchy = HIERARCHY_NONE + (val & 0x7); in cx22700_get_tps()
201 p->modulation = QAM_AUTO; in cx22700_get_tps()
203 p->modulation = qam_tab[(val >> 3) & 0x3]; in cx22700_get_tps()
205 val = cx22700_readreg (state, 0x02); in cx22700_get_tps()
208 p->code_rate_HP = FEC_AUTO; in cx22700_get_tps()
210 p->code_rate_HP = fec_tab[(val >> 3) & 0x07]; in cx22700_get_tps()
213 p->code_rate_LP = FEC_AUTO; in cx22700_get_tps()
215 p->code_rate_LP = fec_tab[val & 0x07]; in cx22700_get_tps()
217 val = cx22700_readreg (state, 0x03); in cx22700_get_tps()
219 p->guard_interval = GUARD_INTERVAL_1_32 + ((val >> 6) & 0x3); in cx22700_get_tps()
220 p->transmission_mode = TRANSMISSION_MODE_2K + ((val >> 5) & 0x1); in cx22700_get_tps()
227 { struct cx22700_state* state = fe->demodulator_priv; in cx22700_init() local
232 cx22700_writereg (state, 0x00, 0x02); /* soft reset */ in cx22700_init()
233 cx22700_writereg (state, 0x00, 0x00); in cx22700_init()
238 cx22700_writereg (state, init_tab[i], init_tab[i+1]); in cx22700_init()
240 cx22700_writereg (state, 0x00, 0x01); in cx22700_init()
247 struct cx22700_state* state = fe->demodulator_priv; in cx22700_read_status() local
249 u16 rs_ber = (cx22700_readreg (state, 0x0d) << 9) in cx22700_read_status()
250 | (cx22700_readreg (state, 0x0e) << 1); in cx22700_read_status()
251 u8 sync = cx22700_readreg (state, 0x07); in cx22700_read_status()
275 struct cx22700_state* state = fe->demodulator_priv; in cx22700_read_ber() local
277 *ber = cx22700_readreg (state, 0x0c) & 0x7f; in cx22700_read_ber()
278 cx22700_writereg (state, 0x0c, 0x00); in cx22700_read_ber()
285 struct cx22700_state* state = fe->demodulator_priv; in cx22700_read_signal_strength() local
287 u16 rs_ber = (cx22700_readreg (state, 0x0d) << 9) in cx22700_read_signal_strength()
288 | (cx22700_readreg (state, 0x0e) << 1); in cx22700_read_signal_strength()
296 struct cx22700_state* state = fe->demodulator_priv; in cx22700_read_snr() local
298 u16 rs_ber = (cx22700_readreg (state, 0x0d) << 9) in cx22700_read_snr()
299 | (cx22700_readreg (state, 0x0e) << 1); in cx22700_read_snr()
307 struct cx22700_state* state = fe->demodulator_priv; in cx22700_read_ucblocks() local
309 *ucblocks = cx22700_readreg (state, 0x0f); in cx22700_read_ucblocks()
310 cx22700_writereg (state, 0x0f, 0x00); in cx22700_read_ucblocks()
317 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in cx22700_set_frontend()
318 struct cx22700_state* state = fe->demodulator_priv; in cx22700_set_frontend() local
320 cx22700_writereg (state, 0x00, 0x02); /* XXX CHECKME: soft reset*/ in cx22700_set_frontend()
321 cx22700_writereg (state, 0x00, 0x00); in cx22700_set_frontend()
323 if (fe->ops.tuner_ops.set_params) { in cx22700_set_frontend()
324 fe->ops.tuner_ops.set_params(fe); in cx22700_set_frontend()
325 if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); in cx22700_set_frontend()
328 cx22700_set_inversion(state, c->inversion); in cx22700_set_frontend()
329 cx22700_set_tps(state, c); in cx22700_set_frontend()
330 cx22700_writereg (state, 0x37, 0x01); /* PAL loop filter off */ in cx22700_set_frontend()
331 cx22700_writereg (state, 0x00, 0x01); /* restart acquire */ in cx22700_set_frontend()
339 struct cx22700_state* state = fe->demodulator_priv; in cx22700_get_frontend() local
340 u8 reg09 = cx22700_readreg (state, 0x09); in cx22700_get_frontend()
342 c->inversion = reg09 & 0x1 ? INVERSION_ON : INVERSION_OFF; in cx22700_get_frontend()
343 return cx22700_get_tps(state, c); in cx22700_get_frontend()
348 struct cx22700_state* state = fe->demodulator_priv; in cx22700_i2c_gate_ctrl() local
351 return cx22700_writereg(state, 0x0a, 0x00); in cx22700_i2c_gate_ctrl()
353 return cx22700_writereg(state, 0x0a, 0x01); in cx22700_i2c_gate_ctrl()
359 fesettings->min_delay_ms = 150; in cx22700_get_tune_settings()
360 fesettings->step_size = 166667; in cx22700_get_tune_settings()
361 fesettings->max_drift = 166667*2; in cx22700_get_tune_settings()
367 struct cx22700_state* state = fe->demodulator_priv; in cx22700_release() local
368 kfree(state); in cx22700_release()
376 struct cx22700_state* state = NULL; in cx22700_attach() local
378 /* allocate memory for the internal state */ in cx22700_attach()
379 state = kzalloc(sizeof(struct cx22700_state), GFP_KERNEL); in cx22700_attach()
380 if (state == NULL) goto error; in cx22700_attach()
382 /* setup the state */ in cx22700_attach()
383 state->config = config; in cx22700_attach()
384 state->i2c = i2c; in cx22700_attach()
387 if (cx22700_readreg(state, 0x07) < 0) goto error; in cx22700_attach()
390 memcpy(&state->frontend.ops, &cx22700_ops, sizeof(struct dvb_frontend_ops)); in cx22700_attach()
391 state->frontend.demodulator_priv = state; in cx22700_attach()
392 return &state->frontend; in cx22700_attach()
395 kfree(state); in cx22700_attach()
402 .name = "Conexant CX22700 DVB-T",
431 MODULE_DESCRIPTION("Conexant CX22700 DVB-T Demodulator driver");