zl10353.c revision 1.3.30.1 1 1.3.30.1 skrll /* $NetBSD: zl10353.c,v 1.3.30.1 2015/04/06 15:18:09 skrll Exp $ */
2 1.1 jruoho
3 1.1 jruoho /*-
4 1.1 jruoho * Copyright (c) 2011 The NetBSD Foundation, Inc.
5 1.1 jruoho * All rights reserved.
6 1.1 jruoho *
7 1.1 jruoho * This code is derived from software contributed to The NetBSD Foundation
8 1.1 jruoho * by Jukka Ruohonen.
9 1.1 jruoho *
10 1.1 jruoho * Redistribution and use in source and binary forms, with or without
11 1.1 jruoho * modification, are permitted provided that the following conditions
12 1.1 jruoho * are met:
13 1.1 jruoho *
14 1.1 jruoho * 1. Redistributions of source code must retain the above copyright
15 1.1 jruoho * notice, this list of conditions and the following disclaimer.
16 1.1 jruoho * 2. Redistributions in binary form must reproduce the above copyright
17 1.1 jruoho * notice, this list of conditions and the following disclaimer in the
18 1.1 jruoho * documentation and/or other materials provided with the distribution.
19 1.1 jruoho *
20 1.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21 1.1 jruoho * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 1.1 jruoho * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 1.1 jruoho * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24 1.1 jruoho * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 1.1 jruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 1.1 jruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 1.1 jruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 1.1 jruoho * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 1.1 jruoho * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 1.1 jruoho * SUCH DAMAGE.
31 1.1 jruoho */
32 1.1 jruoho #include <sys/cdefs.h>
33 1.3.30.1 skrll __KERNEL_RCSID(0, "$NetBSD: zl10353.c,v 1.3.30.1 2015/04/06 15:18:09 skrll Exp $");
34 1.1 jruoho
35 1.1 jruoho #include <sys/param.h>
36 1.1 jruoho #include <sys/kmem.h>
37 1.1 jruoho #include <sys/module.h>
38 1.1 jruoho
39 1.1 jruoho #include <dev/dtv/dtvif.h>
40 1.1 jruoho
41 1.1 jruoho #include <dev/i2c/i2cvar.h>
42 1.1 jruoho #include <dev/i2c/zl10353reg.h>
43 1.1 jruoho #include <dev/i2c/zl10353var.h>
44 1.1 jruoho
45 1.1 jruoho /*
46 1.1 jruoho * Zarlink ZL10353 demodulator (now known as Intel CE623x).
47 1.1 jruoho *
48 1.1 jruoho * An incomplete datasheet:
49 1.1 jruoho *
50 1.1 jruoho * Intel Corporation: CE6230 - COFDM demodulator with
51 1.1 jruoho * USB interface for PC-TV. Data Sheet, Revision 1.1.
52 1.1 jruoho * March 29, 2007.
53 1.1 jruoho */
54 1.1 jruoho
55 1.1 jruoho static int zl10353_probe(struct zl10353 *);
56 1.1 jruoho static int zl10353_read(struct zl10353 *, uint8_t, uint8_t *);
57 1.1 jruoho static int zl10353_write(struct zl10353 *, uint8_t, uint8_t);
58 1.1 jruoho static int zl10353_reset(struct zl10353 *, bool);
59 1.1 jruoho static int zl10353_set_agc(struct zl10353 *,
60 1.1 jruoho const struct dvb_frontend_parameters *);
61 1.1 jruoho static int zl10353_set_bw(struct zl10353 *, fe_bandwidth_t);
62 1.1 jruoho static int zl10353_set_rate(struct zl10353 *);
63 1.1 jruoho static int zl10353_set_freq(struct zl10353 *);
64 1.1 jruoho static int zl10353_set_tps(struct zl10353 *,
65 1.1 jruoho const struct dvb_frontend_parameters *);
66 1.1 jruoho static int zl10353_get_guard(fe_guard_interval_t, uint16_t *);
67 1.1 jruoho static int zl10353_get_mode(fe_transmit_mode_t, uint16_t *);
68 1.1 jruoho static int zl10353_get_fec(fe_code_rate_t, bool, uint16_t *);
69 1.1 jruoho static int zl10353_get_modulation(fe_modulation_t, uint16_t *);
70 1.1 jruoho static int zl10353_get_hier(fe_hierarchy_t, uint16_t *);
71 1.1 jruoho
72 1.1 jruoho struct zl10353 *
73 1.1 jruoho zl10353_open(device_t parent, i2c_tag_t i2c, i2c_addr_t addr)
74 1.1 jruoho {
75 1.1 jruoho struct zl10353 *zl;
76 1.1 jruoho
77 1.1 jruoho zl = kmem_zalloc(sizeof(*zl), KM_SLEEP);
78 1.1 jruoho
79 1.1 jruoho if (zl == NULL)
80 1.1 jruoho return NULL;
81 1.1 jruoho
82 1.1 jruoho zl->zl_i2c = i2c;
83 1.1 jruoho zl->zl_i2c_addr = addr;
84 1.1 jruoho zl->zl_parent = parent;
85 1.1 jruoho
86 1.1 jruoho zl->zl_freq = ZL10353_DEFAULT_INPUT_FREQ;
87 1.1 jruoho zl->zl_clock = ZL10353_DEFAULT_CLOCK_MHZ;
88 1.1 jruoho
89 1.1 jruoho if (zl10353_reset(zl, true) != 0) {
90 1.1 jruoho zl10353_close(zl);
91 1.1 jruoho return NULL;
92 1.1 jruoho }
93 1.1 jruoho
94 1.1 jruoho if (zl10353_probe(zl) != 0) {
95 1.1 jruoho zl10353_close(zl);
96 1.1 jruoho return NULL;
97 1.1 jruoho }
98 1.1 jruoho
99 1.1 jruoho return zl;
100 1.1 jruoho }
101 1.1 jruoho
102 1.1 jruoho void
103 1.1 jruoho zl10353_close(struct zl10353 *zl)
104 1.1 jruoho {
105 1.1 jruoho kmem_free(zl, sizeof(*zl));
106 1.1 jruoho }
107 1.1 jruoho
108 1.1 jruoho static int
109 1.1 jruoho zl10353_probe(struct zl10353 *zl)
110 1.1 jruoho {
111 1.1 jruoho uint8_t val;
112 1.1 jruoho int rv;
113 1.1 jruoho
114 1.1 jruoho if ((rv = zl10353_read(zl, ZL10353_REG_ID, &val)) != 0)
115 1.1 jruoho return rv;
116 1.1 jruoho
117 1.1 jruoho switch (val) {
118 1.1 jruoho
119 1.1 jruoho case ZL10353_ID_CE6230:
120 1.1 jruoho zl->zl_name = "Intel CE6230";
121 1.1 jruoho break;
122 1.1 jruoho
123 1.1 jruoho case ZL10353_ID_CE6231:
124 1.1 jruoho zl->zl_name = "Intel CE6231";
125 1.1 jruoho break;
126 1.1 jruoho
127 1.1 jruoho case ZL10353_ID_ZL10353:
128 1.1 jruoho zl->zl_name = "Zarlink ZL10353";
129 1.1 jruoho break;
130 1.1 jruoho
131 1.1 jruoho default:
132 1.1 jruoho aprint_error_dev(zl->zl_parent, "unknown chip 0x%02x\n", val);
133 1.1 jruoho return ENOTSUP;
134 1.1 jruoho }
135 1.1 jruoho
136 1.1 jruoho aprint_verbose_dev(zl->zl_parent, "found %s at i2c "
137 1.1 jruoho "addr 0x%02x\n", zl->zl_name, zl->zl_i2c_addr);
138 1.1 jruoho
139 1.1 jruoho return 0;
140 1.1 jruoho }
141 1.1 jruoho
142 1.1 jruoho static int
143 1.1 jruoho zl10353_read(struct zl10353 *zl, uint8_t reg, uint8_t *valp)
144 1.1 jruoho {
145 1.1 jruoho static const i2c_op_t op = I2C_OP_READ;
146 1.1 jruoho int rv;
147 1.1 jruoho
148 1.1 jruoho if ((rv = iic_acquire_bus(zl->zl_i2c, 0)) != 0)
149 1.1 jruoho return rv;
150 1.1 jruoho
151 1.1 jruoho rv = iic_exec(zl->zl_i2c, op, zl->zl_i2c_addr, ®, 1, valp, 1, 0);
152 1.1 jruoho iic_release_bus(zl->zl_i2c, 0);
153 1.1 jruoho
154 1.1 jruoho return rv;
155 1.1 jruoho }
156 1.1 jruoho
157 1.1 jruoho static int
158 1.1 jruoho zl10353_write(struct zl10353 *zl, uint8_t reg, uint8_t val)
159 1.1 jruoho {
160 1.1 jruoho static const i2c_op_t op = I2C_OP_WRITE;
161 1.1 jruoho const uint8_t cmd[2] = { reg, val };
162 1.1 jruoho int rv;
163 1.1 jruoho
164 1.1 jruoho if ((rv = iic_acquire_bus(zl->zl_i2c, 0)) != 0)
165 1.1 jruoho return rv;
166 1.1 jruoho
167 1.1 jruoho rv = iic_exec(zl->zl_i2c, op, zl->zl_i2c_addr, cmd, 2, NULL, 0, 0);
168 1.1 jruoho iic_release_bus(zl->zl_i2c, 0);
169 1.1 jruoho
170 1.1 jruoho return rv;
171 1.1 jruoho }
172 1.1 jruoho
173 1.1 jruoho static int
174 1.1 jruoho zl10353_reset(struct zl10353 *zl, bool hard)
175 1.1 jruoho {
176 1.1 jruoho size_t i = 0, len = 5;
177 1.1 jruoho int rv;
178 1.1 jruoho
179 1.1 jruoho static const struct {
180 1.1 jruoho uint8_t reg;
181 1.1 jruoho uint8_t val;
182 1.1 jruoho } reset[] = {
183 1.1 jruoho { 0x50, 0x03 }, /* Hard */
184 1.1 jruoho { 0x03, 0x44 },
185 1.1 jruoho { 0x44, 0x46 },
186 1.1 jruoho { 0x46, 0x15 },
187 1.1 jruoho { 0x15, 0x0f },
188 1.1 jruoho { 0x55, 0x80 }, /* Soft */
189 1.1 jruoho { 0xea, 0x01 },
190 1.1 jruoho { 0xea, 0x00 },
191 1.1 jruoho };
192 1.1 jruoho
193 1.1 jruoho if (hard != true) {
194 1.1 jruoho len = __arraycount(reset);
195 1.1 jruoho i = 5;
196 1.1 jruoho }
197 1.1 jruoho
198 1.1 jruoho while (i < len) {
199 1.1 jruoho
200 1.1 jruoho if ((rv = zl10353_write(zl, reset[i].reg, reset[i].val)) != 0)
201 1.1 jruoho return rv;
202 1.1 jruoho else {
203 1.1 jruoho delay(100);
204 1.1 jruoho }
205 1.1 jruoho
206 1.1 jruoho i++;
207 1.1 jruoho
208 1.1 jruoho }
209 1.1 jruoho
210 1.1 jruoho return 0;
211 1.1 jruoho }
212 1.1 jruoho
213 1.1 jruoho void
214 1.1 jruoho zl10353_get_devinfo(struct dvb_frontend_info *fi)
215 1.1 jruoho {
216 1.1 jruoho
217 1.1 jruoho fi->type = FE_OFDM;
218 1.1 jruoho
219 1.1 jruoho fi->frequency_min = 174000000;
220 1.1 jruoho fi->frequency_max = 862000000;
221 1.1 jruoho
222 1.1 jruoho fi->frequency_tolerance = 0;
223 1.1 jruoho fi->frequency_stepsize = 166667;
224 1.1 jruoho
225 1.1 jruoho fi->caps |= FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
226 1.1 jruoho FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_QPSK |
227 1.1 jruoho FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_RECOVER |
228 1.1 jruoho FE_CAN_MUTE_TS;
229 1.1 jruoho
230 1.1 jruoho fi->caps |= FE_CAN_FEC_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO |
231 1.1 jruoho FE_CAN_QAM_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
232 1.1 jruoho FE_CAN_HIERARCHY_AUTO;
233 1.1 jruoho }
234 1.1 jruoho
235 1.1 jruoho int
236 1.1 jruoho zl10353_set_params(struct zl10353 *zl,const struct dvb_frontend_parameters *fp)
237 1.1 jruoho {
238 1.1 jruoho int rv;
239 1.1 jruoho
240 1.1 jruoho /* 1. Soft reset. */
241 1.1 jruoho if ((rv = zl10353_reset(zl, false)) != 0)
242 1.1 jruoho return rv;
243 1.1 jruoho
244 1.1 jruoho /* 2. Set AGC. */
245 1.1 jruoho if ((rv = zl10353_set_agc(zl, fp)) != 0)
246 1.1 jruoho return rv;
247 1.1 jruoho
248 1.1 jruoho /* 3. Set bandwidth. */
249 1.1 jruoho if ((rv = zl10353_set_bw(zl, fp->u.ofdm.bandwidth)) != 0)
250 1.1 jruoho return rv;
251 1.1 jruoho
252 1.1 jruoho /* 4. Set nominal rate. */
253 1.1 jruoho if ((rv = zl10353_set_rate(zl)) != 0)
254 1.1 jruoho return rv;
255 1.1 jruoho
256 1.1 jruoho /* 5. Set input frequency. */
257 1.1 jruoho if ((rv = zl10353_set_freq(zl)) != 0)
258 1.1 jruoho return rv;
259 1.1 jruoho
260 1.1 jruoho /* 6. Set TPS parameters. */
261 1.1 jruoho if ((rv = zl10353_set_tps(zl, fp)) != 0)
262 1.1 jruoho return rv;
263 1.1 jruoho
264 1.1 jruoho return 0;
265 1.1 jruoho }
266 1.1 jruoho
267 1.1 jruoho int
268 1.1 jruoho zl10353_set_fsm(struct zl10353 *zl)
269 1.1 jruoho {
270 1.1 jruoho return zl10353_write(zl, ZL10353_REG_FSM, ZL10353_FSM_START);
271 1.1 jruoho }
272 1.1 jruoho
273 1.1 jruoho int
274 1.1 jruoho zl10353_set_gate(void *aux, bool enable)
275 1.1 jruoho {
276 1.1 jruoho uint8_t val = ZL10353_GATE_DISABLE;
277 1.1 jruoho
278 1.1 jruoho if (enable != false)
279 1.1 jruoho val = ZL10353_GATE_ENABLE;
280 1.1 jruoho
281 1.1 jruoho return zl10353_write(aux, ZL10353_REG_GATE, val);
282 1.1 jruoho }
283 1.1 jruoho
284 1.1 jruoho static int
285 1.1 jruoho zl10353_set_agc(struct zl10353 *zl, const struct dvb_frontend_parameters *fp)
286 1.1 jruoho {
287 1.1 jruoho const struct dvb_ofdm_parameters *ofdm = &fp->u.ofdm;
288 1.1 jruoho uint8_t val = ZL10353_AGC_TARGET_DEFAULT;
289 1.1 jruoho int rv;
290 1.1 jruoho
291 1.1 jruoho if ((rv = zl10353_write(zl, ZL10353_REG_AGC_TARGET, val)) != 0)
292 1.1 jruoho return rv;
293 1.1 jruoho else {
294 1.1 jruoho val = 0;
295 1.1 jruoho }
296 1.1 jruoho
297 1.1 jruoho if (ofdm->guard_interval != GUARD_INTERVAL_AUTO)
298 1.1 jruoho val |= ZL10353_AGC_CTRL_GUARD_NONAUTO;
299 1.1 jruoho
300 1.1 jruoho if (ofdm->transmission_mode != TRANSMISSION_MODE_AUTO)
301 1.1 jruoho val |= ZL10353_AGC_CTRL_MODE_NONAUTO;
302 1.1 jruoho
303 1.1 jruoho return zl10353_write(zl, ZL10353_REG_AGC_CTRL, val);
304 1.1 jruoho }
305 1.1 jruoho
306 1.1 jruoho static int
307 1.1 jruoho zl10353_set_bw(struct zl10353 *zl, fe_bandwidth_t bw)
308 1.1 jruoho {
309 1.1 jruoho uint8_t val[3];
310 1.1 jruoho int rv;
311 1.1 jruoho
312 1.1 jruoho switch (bw) {
313 1.1 jruoho
314 1.1 jruoho case BANDWIDTH_6_MHZ:
315 1.1 jruoho val[0] = ZL10353_BW_1_6_MHZ;
316 1.1 jruoho val[1] = ZL10353_BW_2_6_MHZ;
317 1.1 jruoho val[2] = ZL10353_BW_3_6_MHZ;
318 1.1 jruoho zl->zl_bw = 6;
319 1.1 jruoho break;
320 1.1 jruoho
321 1.1 jruoho case BANDWIDTH_7_MHZ:
322 1.1 jruoho val[0] = ZL10353_BW_1_7_MHZ;
323 1.1 jruoho val[1] = ZL10353_BW_2_7_MHZ;
324 1.1 jruoho val[2] = ZL10353_BW_3_7_MHZ;
325 1.1 jruoho zl->zl_bw = 7;
326 1.1 jruoho break;
327 1.1 jruoho
328 1.1 jruoho case BANDWIDTH_8_MHZ:
329 1.1 jruoho val[0] = ZL10353_BW_1_8_MHZ;
330 1.1 jruoho val[1] = ZL10353_BW_2_8_MHZ;
331 1.1 jruoho val[2] = ZL10353_BW_3_8_MHZ;
332 1.1 jruoho zl->zl_bw = 8;
333 1.1 jruoho break;
334 1.1 jruoho
335 1.1 jruoho default:
336 1.1 jruoho zl->zl_bw = 0;
337 1.1 jruoho return EINVAL;
338 1.1 jruoho }
339 1.1 jruoho
340 1.1 jruoho if ((rv = zl10353_write(zl, ZL10353_REG_BW_1, val[0])) != 0)
341 1.1 jruoho return rv;
342 1.1 jruoho
343 1.1 jruoho if ((rv = zl10353_write(zl, ZL10353_REG_BW_2, val[1])) != 0)
344 1.1 jruoho return rv;
345 1.1 jruoho
346 1.1 jruoho if ((rv = zl10353_write(zl, ZL10353_REG_BW_3, val[2])) != 0)
347 1.1 jruoho return rv;
348 1.1 jruoho
349 1.1 jruoho return 0;
350 1.1 jruoho }
351 1.1 jruoho
352 1.1 jruoho static int
353 1.1 jruoho zl10353_set_rate(struct zl10353 *zl)
354 1.1 jruoho {
355 1.1 jruoho static const uint64_t c = 1497965625;
356 1.1 jruoho uint64_t val;
357 1.1 jruoho int rv;
358 1.1 jruoho
359 1.1 jruoho KASSERT(zl->zl_bw >= 6 && zl->zl_bw <= 8);
360 1.1 jruoho KASSERT(zl->zl_clock > 0 && zl->zl_freq > 0);
361 1.1 jruoho
362 1.1 jruoho val = zl->zl_bw * c;
363 1.1 jruoho val += zl->zl_clock >> 1;
364 1.1 jruoho val /= zl->zl_clock;
365 1.1 jruoho val = val & 0xffff;
366 1.1 jruoho
367 1.1 jruoho if ((rv = zl10353_write(zl, ZL10353_REG_RATE_1, val >> 8)) != 0)
368 1.1 jruoho return rv;
369 1.1 jruoho
370 1.1 jruoho return zl10353_write(zl, ZL10353_REG_RATE_2, val & 0xff);
371 1.1 jruoho }
372 1.1 jruoho
373 1.1 jruoho static int
374 1.1 jruoho zl10353_set_freq(struct zl10353 *zl)
375 1.1 jruoho {
376 1.1 jruoho const uint16_t val = zl->zl_freq;
377 1.1 jruoho int rv;
378 1.1 jruoho
379 1.1 jruoho if ((rv = zl10353_write(zl, ZL10353_REG_FREQ_1, val >> 8)) != 0)
380 1.1 jruoho return rv;
381 1.1 jruoho
382 1.1 jruoho return zl10353_write(zl, ZL10353_REG_FREQ_2, val & 0xff);
383 1.1 jruoho }
384 1.1 jruoho
385 1.1 jruoho static int
386 1.1 jruoho zl10353_set_tps(struct zl10353 *zl, const struct dvb_frontend_parameters *fp)
387 1.1 jruoho {
388 1.1 jruoho const struct dvb_ofdm_parameters *ofdm = &fp->u.ofdm;
389 1.1 jruoho uint16_t val = 0;
390 1.1 jruoho int rv;
391 1.1 jruoho
392 1.1 jruoho if ((rv = zl10353_get_guard(ofdm->guard_interval, &val)) != 0)
393 1.1 jruoho goto fail;
394 1.1 jruoho
395 1.1 jruoho if ((rv = zl10353_get_mode(ofdm->transmission_mode, &val)) != 0)
396 1.1 jruoho goto fail;
397 1.1 jruoho
398 1.1 jruoho if ((rv = zl10353_get_fec(ofdm->code_rate_HP, true, &val)) != 0)
399 1.1 jruoho goto fail;
400 1.1 jruoho
401 1.1 jruoho if ((rv = zl10353_get_fec(ofdm->code_rate_LP, false, &val)) != 0)
402 1.1 jruoho goto fail;
403 1.1 jruoho
404 1.1 jruoho if ((rv = zl10353_get_modulation(ofdm->constellation, &val)) != 0)
405 1.1 jruoho goto fail;
406 1.1 jruoho
407 1.1 jruoho if ((rv = zl10353_get_hier(ofdm->hierarchy_information, &val)) != 0)
408 1.1 jruoho goto fail;
409 1.1 jruoho
410 1.1 jruoho if ((rv = zl10353_write(zl, ZL10353_REG_TPS_1, val >> 8)) != 0)
411 1.1 jruoho goto fail;
412 1.1 jruoho
413 1.1 jruoho if ((rv = zl10353_write(zl, ZL10353_REG_TPS_2, val & 0xff)) != 0)
414 1.1 jruoho goto fail;
415 1.1 jruoho
416 1.1 jruoho return 0;
417 1.1 jruoho
418 1.1 jruoho fail:
419 1.1 jruoho aprint_error_dev(zl->zl_parent, "failed to set "
420 1.1 jruoho "tps for %s (err %d)\n", zl->zl_name, rv);
421 1.1 jruoho
422 1.1 jruoho return rv;
423 1.1 jruoho }
424 1.1 jruoho
425 1.1 jruoho static int
426 1.1 jruoho zl10353_get_guard(fe_guard_interval_t fg, uint16_t *valp)
427 1.1 jruoho {
428 1.1 jruoho
429 1.1 jruoho switch (fg) {
430 1.1 jruoho
431 1.1 jruoho case GUARD_INTERVAL_1_4:
432 1.1 jruoho *valp |= ZL10353_TPS_GUARD_1_4;
433 1.1 jruoho break;
434 1.1 jruoho
435 1.1 jruoho case GUARD_INTERVAL_1_8:
436 1.1 jruoho *valp |= ZL10353_TPS_GUARD_1_8;
437 1.1 jruoho break;
438 1.1 jruoho
439 1.1 jruoho case GUARD_INTERVAL_1_16:
440 1.1 jruoho *valp |= ZL10353_TPS_GUARD_1_16;
441 1.1 jruoho break;
442 1.1 jruoho
443 1.1 jruoho case GUARD_INTERVAL_1_32:
444 1.1 jruoho *valp |= ZL10353_TPS_GUARD_1_32;
445 1.1 jruoho break;
446 1.1 jruoho
447 1.1 jruoho case GUARD_INTERVAL_AUTO:
448 1.1 jruoho *valp |= ZL10353_TPS_GUARD_AUTO;
449 1.1 jruoho break;
450 1.1 jruoho
451 1.1 jruoho default:
452 1.1 jruoho return EINVAL;
453 1.1 jruoho }
454 1.1 jruoho
455 1.1 jruoho return 0;
456 1.1 jruoho }
457 1.1 jruoho
458 1.1 jruoho static int
459 1.1 jruoho zl10353_get_mode(fe_transmit_mode_t fm, uint16_t *valp)
460 1.1 jruoho {
461 1.1 jruoho
462 1.1 jruoho switch (fm) {
463 1.1 jruoho
464 1.1 jruoho case TRANSMISSION_MODE_2K:
465 1.1 jruoho *valp |= ZL10353_TPS_MODE_2K;
466 1.1 jruoho break;
467 1.1 jruoho
468 1.1 jruoho case TRANSMISSION_MODE_8K:
469 1.1 jruoho *valp |= ZL10353_TPS_MODE_8K;
470 1.1 jruoho break;
471 1.1 jruoho
472 1.1 jruoho case TRANSMISSION_MODE_AUTO:
473 1.1 jruoho *valp |= ZL10353_TPS_MODE_AUTO;
474 1.1 jruoho break;
475 1.1 jruoho
476 1.1 jruoho default:
477 1.1 jruoho return EINVAL;
478 1.1 jruoho }
479 1.1 jruoho
480 1.1 jruoho return 0;
481 1.1 jruoho }
482 1.1 jruoho
483 1.1 jruoho static int
484 1.1 jruoho zl10353_get_fec(fe_code_rate_t fc, bool hp, uint16_t *valp)
485 1.1 jruoho {
486 1.1 jruoho uint16_t hpval = 0, lpval = 0;
487 1.1 jruoho
488 1.1 jruoho switch (fc) {
489 1.1 jruoho
490 1.1 jruoho case FEC_1_2:
491 1.1 jruoho hpval = ZL10353_TPS_HP_FEC_1_2;
492 1.1 jruoho lpval = ZL10353_TPS_LP_FEC_1_2;
493 1.1 jruoho break;
494 1.1 jruoho
495 1.1 jruoho case FEC_2_3:
496 1.1 jruoho hpval = ZL10353_TPS_HP_FEC_2_3;
497 1.1 jruoho lpval = ZL10353_TPS_LP_FEC_2_3;
498 1.1 jruoho break;
499 1.1 jruoho
500 1.1 jruoho case FEC_3_4:
501 1.1 jruoho hpval = ZL10353_TPS_HP_FEC_3_4;
502 1.1 jruoho lpval = ZL10353_TPS_LP_FEC_3_4;
503 1.1 jruoho break;
504 1.1 jruoho
505 1.1 jruoho case FEC_5_6:
506 1.1 jruoho hpval = ZL10353_TPS_HP_FEC_5_6;
507 1.1 jruoho lpval = ZL10353_TPS_LP_FEC_5_6;
508 1.1 jruoho break;
509 1.1 jruoho
510 1.1 jruoho case FEC_7_8:
511 1.1 jruoho hpval = ZL10353_TPS_HP_FEC_7_8;
512 1.1 jruoho lpval = ZL10353_TPS_LP_FEC_7_8;
513 1.1 jruoho break;
514 1.1 jruoho
515 1.1 jruoho case FEC_AUTO:
516 1.1 jruoho hpval = ZL10353_TPS_HP_FEC_AUTO;
517 1.1 jruoho lpval = ZL10353_TPS_LP_FEC_AUTO;
518 1.1 jruoho break;
519 1.1 jruoho
520 1.1 jruoho case FEC_NONE:
521 1.1 jruoho return EOPNOTSUPP;
522 1.1 jruoho
523 1.1 jruoho default:
524 1.1 jruoho return EINVAL;
525 1.1 jruoho }
526 1.1 jruoho
527 1.1 jruoho *valp |= (hp != false) ? hpval : lpval;
528 1.1 jruoho
529 1.1 jruoho return 0;
530 1.1 jruoho }
531 1.1 jruoho
532 1.1 jruoho static int
533 1.1 jruoho zl10353_get_modulation(fe_modulation_t fm, uint16_t *valp)
534 1.1 jruoho {
535 1.1 jruoho
536 1.1 jruoho switch (fm) {
537 1.1 jruoho
538 1.1 jruoho case QPSK:
539 1.1 jruoho *valp |= ZL10353_TPS_MODULATION_QPSK;
540 1.1 jruoho break;
541 1.1 jruoho
542 1.1 jruoho case QAM_16:
543 1.1 jruoho *valp |= ZL10353_TPS_MODULATION_QAM_16;
544 1.1 jruoho break;
545 1.1 jruoho
546 1.1 jruoho case QAM_64:
547 1.1 jruoho *valp |= ZL10353_TPS_MODULATION_QAM_64;
548 1.1 jruoho break;
549 1.1 jruoho
550 1.1 jruoho case QAM_AUTO:
551 1.1 jruoho *valp |= ZL10353_TPS_MODULATION_QAM_AUTO;
552 1.1 jruoho break;
553 1.1 jruoho
554 1.1 jruoho default:
555 1.1 jruoho return EINVAL;
556 1.1 jruoho }
557 1.1 jruoho
558 1.1 jruoho return 0;
559 1.1 jruoho }
560 1.1 jruoho
561 1.1 jruoho static int
562 1.1 jruoho zl10353_get_hier(fe_hierarchy_t fh, uint16_t *valp)
563 1.1 jruoho {
564 1.1 jruoho
565 1.1 jruoho switch (fh) {
566 1.1 jruoho
567 1.1 jruoho case HIERARCHY_1:
568 1.1 jruoho *valp |= ZL10353_TPS_HIERARCHY_1;
569 1.1 jruoho break;
570 1.1 jruoho
571 1.1 jruoho case HIERARCHY_2:
572 1.1 jruoho *valp |= ZL10353_TPS_HIERARCHY_2;
573 1.1 jruoho break;
574 1.1 jruoho
575 1.1 jruoho case HIERARCHY_4:
576 1.1 jruoho *valp |= ZL10353_TPS_HIERARCHY_4;
577 1.1 jruoho break;
578 1.1 jruoho
579 1.1 jruoho case HIERARCHY_NONE:
580 1.1 jruoho *valp |= ZL10353_TPS_HIERARCHY_NONE;
581 1.1 jruoho break;
582 1.1 jruoho
583 1.1 jruoho case HIERARCHY_AUTO:
584 1.1 jruoho *valp |= ZL10353_TPS_HIERARCHY_AUTO;
585 1.1 jruoho break;
586 1.1 jruoho
587 1.1 jruoho default:
588 1.1 jruoho return EINVAL;
589 1.1 jruoho }
590 1.1 jruoho
591 1.1 jruoho return 0;
592 1.1 jruoho }
593 1.1 jruoho
594 1.1 jruoho fe_status_t
595 1.1 jruoho zl10353_get_status(struct zl10353 *zl)
596 1.1 jruoho {
597 1.1 jruoho const uint8_t lock = FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC;
598 1.1 jruoho fe_status_t fs = 0;
599 1.1 jruoho uint8_t val;
600 1.1 jruoho
601 1.1 jruoho if (zl10353_read(zl, ZL10353_REG_STATUS_LOCK, &val) == 0) {
602 1.1 jruoho
603 1.1 jruoho if ((val & ZL10353_STATUS_LOCK_ON) != 0)
604 1.1 jruoho fs |= FE_HAS_LOCK;
605 1.1 jruoho
606 1.1 jruoho if ((val & ZL10353_STATUS_LOCK_CARRIER) != 0)
607 1.1 jruoho fs |= FE_HAS_CARRIER;
608 1.1 jruoho
609 1.1 jruoho if ((val & ZL10353_STATUS_LOCK_VITERBI) != 0)
610 1.1 jruoho fs |= FE_HAS_VITERBI;
611 1.1 jruoho }
612 1.1 jruoho
613 1.1 jruoho if (zl10353_read(zl, ZL10353_REG_STATUS_SYNC, &val) == 0) {
614 1.1 jruoho
615 1.1 jruoho if ((val & ZL10353_STATUS_SYNC_ON) != 0)
616 1.1 jruoho fs |= FE_HAS_SYNC;
617 1.1 jruoho }
618 1.1 jruoho
619 1.1 jruoho if (zl10353_read(zl, ZL10353_REG_STATUS_SIGNAL, &val) == 0) {
620 1.1 jruoho
621 1.1 jruoho if ((val & ZL10353_STATUS_SIGNAL_ON) != 0)
622 1.1 jruoho fs |= FE_HAS_SIGNAL;
623 1.1 jruoho }
624 1.1 jruoho
625 1.1 jruoho return ((fs & lock) != lock) ? fs & ~FE_HAS_LOCK : fs;
626 1.1 jruoho };
627 1.1 jruoho
628 1.1 jruoho uint16_t
629 1.1 jruoho zl10353_get_signal_strength(struct zl10353 *zl)
630 1.1 jruoho {
631 1.1 jruoho uint8_t val1, val2;
632 1.1 jruoho
633 1.1 jruoho if (zl10353_read(zl, ZL10353_REG_SIGSTR_1, &val1) != 0)
634 1.1 jruoho return 0;
635 1.1 jruoho
636 1.1 jruoho if (zl10353_read(zl, ZL10353_REG_SIGSTR_2, &val2) != 0)
637 1.1 jruoho return 0;
638 1.1 jruoho
639 1.1 jruoho return val1 << 10 | val2 << 2 | 0x03;
640 1.1 jruoho }
641 1.1 jruoho
642 1.1 jruoho uint16_t
643 1.1 jruoho zl10353_get_snr(struct zl10353 *zl)
644 1.1 jruoho {
645 1.1 jruoho uint8_t val;
646 1.1 jruoho
647 1.1 jruoho if (zl10353_read(zl, ZL10353_REG_SNR, &val) != 0)
648 1.1 jruoho return 0;
649 1.1 jruoho
650 1.1 jruoho return (val << 8) | val;
651 1.1 jruoho }
652 1.1 jruoho
653 1.3.30.1 skrll MODULE(MODULE_CLASS_DRIVER, zl10353, "i2cexec");
654 1.1 jruoho
655 1.1 jruoho static int
656 1.1 jruoho zl10353_modcmd(modcmd_t cmd, void *aux)
657 1.1 jruoho {
658 1.1 jruoho
659 1.1 jruoho if (cmd != MODULE_CMD_INIT && cmd != MODULE_CMD_FINI)
660 1.1 jruoho return ENOTTY;
661 1.1 jruoho
662 1.1 jruoho return 0;
663 1.1 jruoho }
664