blob: 25c5124bfc597987964e0ed457e03922710360c0 [file] [log] [blame]
Antti Palosaari825b9672008-09-15 15:01:52 -03001/*
Antti Palosaaric89f66f2010-06-17 21:19:13 -03002 * Afatech AF9013 demodulator driver
Antti Palosaari825b9672008-09-15 15:01:52 -03003 *
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
5 *
6 * Thanks to Afatech who kindly provided information.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 *
22 */
23
24#include <linux/kernel.h>
25#include <linux/module.h>
26#include <linux/moduleparam.h>
27#include <linux/init.h>
28#include <linux/delay.h>
29#include <linux/string.h>
30#include <linux/slab.h>
31#include <linux/firmware.h>
32
33#include "dvb_frontend.h"
34#include "af9013_priv.h"
35#include "af9013.h"
36
37int af9013_debug;
38
39struct af9013_state {
40 struct i2c_adapter *i2c;
41 struct dvb_frontend frontend;
42
43 struct af9013_config config;
44
45 u16 signal_strength;
46 u32 ber;
47 u32 ucblocks;
48 u16 snr;
49 u32 frequency;
50 unsigned long next_statistics_check;
51};
52
53static u8 regmask[8] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
54
55static int af9013_write_regs(struct af9013_state *state, u8 mbox, u16 reg,
56 u8 *val, u8 len)
57{
58 u8 buf[3+len];
59 struct i2c_msg msg = {
60 .addr = state->config.demod_address,
61 .flags = 0,
62 .len = sizeof(buf),
63 .buf = buf };
64
65 buf[0] = reg >> 8;
66 buf[1] = reg & 0xff;
67 buf[2] = mbox;
68 memcpy(&buf[3], val, len);
69
70 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
71 warn("I2C write failed reg:%04x len:%d", reg, len);
72 return -EREMOTEIO;
73 }
74 return 0;
75}
76
77static int af9013_write_ofdm_regs(struct af9013_state *state, u16 reg, u8 *val,
78 u8 len)
79{
80 u8 mbox = (1 << 0)|(1 << 1)|((len - 1) << 2)|(0 << 6)|(0 << 7);
81 return af9013_write_regs(state, mbox, reg, val, len);
82}
83
84static int af9013_write_ofsm_regs(struct af9013_state *state, u16 reg, u8 *val,
85 u8 len)
86{
87 u8 mbox = (1 << 0)|(1 << 1)|((len - 1) << 2)|(1 << 6)|(1 << 7);
88 return af9013_write_regs(state, mbox, reg, val, len);
89}
90
91/* write single register */
92static int af9013_write_reg(struct af9013_state *state, u16 reg, u8 val)
93{
94 return af9013_write_ofdm_regs(state, reg, &val, 1);
95}
96
97/* read single register */
98static int af9013_read_reg(struct af9013_state *state, u16 reg, u8 *val)
99{
100 u8 obuf[3] = { reg >> 8, reg & 0xff, 0 };
101 u8 ibuf[1];
102 struct i2c_msg msg[2] = {
103 {
104 .addr = state->config.demod_address,
105 .flags = 0,
106 .len = sizeof(obuf),
107 .buf = obuf
108 }, {
109 .addr = state->config.demod_address,
110 .flags = I2C_M_RD,
111 .len = sizeof(ibuf),
112 .buf = ibuf
113 }
114 };
115
116 if (i2c_transfer(state->i2c, msg, 2) != 2) {
117 warn("I2C read failed reg:%04x", reg);
118 return -EREMOTEIO;
119 }
120 *val = ibuf[0];
121 return 0;
122}
123
124static int af9013_write_reg_bits(struct af9013_state *state, u16 reg, u8 pos,
125 u8 len, u8 val)
126{
127 int ret;
128 u8 tmp, mask;
129
130 ret = af9013_read_reg(state, reg, &tmp);
131 if (ret)
132 return ret;
133
134 mask = regmask[len - 1] << pos;
135 tmp = (tmp & ~mask) | ((val << pos) & mask);
136
137 return af9013_write_reg(state, reg, tmp);
138}
139
140static int af9013_read_reg_bits(struct af9013_state *state, u16 reg, u8 pos,
141 u8 len, u8 *val)
142{
143 int ret;
144 u8 tmp;
145
146 ret = af9013_read_reg(state, reg, &tmp);
147 if (ret)
148 return ret;
149 *val = (tmp >> pos) & regmask[len - 1];
150 return 0;
151}
152
153static int af9013_set_gpio(struct af9013_state *state, u8 gpio, u8 gpioval)
154{
155 int ret;
156 u8 pos;
157 u16 addr;
158 deb_info("%s: gpio:%d gpioval:%02x\n", __func__, gpio, gpioval);
159
160/* GPIO0 & GPIO1 0xd735
161 GPIO2 & GPIO3 0xd736 */
162
163 switch (gpio) {
164 case 0:
165 case 1:
166 addr = 0xd735;
167 break;
168 case 2:
169 case 3:
170 addr = 0xd736;
171 break;
172
173 default:
174 err("invalid gpio:%d\n", gpio);
175 ret = -EINVAL;
176 goto error;
177 };
178
179 switch (gpio) {
180 case 0:
181 case 2:
182 pos = 0;
183 break;
184 case 1:
185 case 3:
186 default:
187 pos = 4;
188 break;
189 };
190
191 ret = af9013_write_reg_bits(state, addr, pos, 4, gpioval);
192
193error:
194 return ret;
195}
196
197static u32 af913_div(u32 a, u32 b, u32 x)
198{
199 u32 r = 0, c = 0, i;
200 deb_info("%s: a:%d b:%d x:%d\n", __func__, a, b, x);
201
202 if (a > b) {
203 c = a / b;
204 a = a - c * b;
205 }
206
207 for (i = 0; i < x; i++) {
208 if (a >= b) {
209 r += 1;
210 a -= b;
211 }
212 a <<= 1;
213 r <<= 1;
214 }
215 r = (c << (u32)x) + r;
216
217 deb_info("%s: a:%d b:%d x:%d r:%d r:%x\n", __func__, a, b, x, r, r);
218 return r;
219}
220
221static int af9013_set_coeff(struct af9013_state *state, fe_bandwidth_t bw)
222{
Antti Palosaari9b22edd2010-09-12 20:48:58 -0300223 int ret, i, found;
Antti Palosaari825b9672008-09-15 15:01:52 -0300224 u8 buf[24];
Antti Palosaari825b9672008-09-15 15:01:52 -0300225 deb_info("%s: adc_clock:%d bw:%d\n", __func__,
226 state->config.adc_clock, bw);
227
Antti Palosaari9b22edd2010-09-12 20:48:58 -0300228 /* lookup coeff from table */
229 for (i = 0, found = 0; i < ARRAY_SIZE(coeff_table); i++) {
230 if (coeff_table[i].adc_clock == state->config.adc_clock &&
231 coeff_table[i].bw == bw) {
232 found = 1;
Antti Palosaari825b9672008-09-15 15:01:52 -0300233 break;
Antti Palosaari825b9672008-09-15 15:01:52 -0300234 }
Antti Palosaari825b9672008-09-15 15:01:52 -0300235 }
236
Antti Palosaari9b22edd2010-09-12 20:48:58 -0300237 if (!found) {
238 err("invalid bw or clock");
239 ret = -EINVAL;
240 goto error;
241 }
242
243 buf[0] = (u8) ((coeff_table[i].ns_coeff1_2048nu & 0x03000000) >> 24);
244 buf[1] = (u8) ((coeff_table[i].ns_coeff1_2048nu & 0x00ff0000) >> 16);
245 buf[2] = (u8) ((coeff_table[i].ns_coeff1_2048nu & 0x0000ff00) >> 8);
246 buf[3] = (u8) ((coeff_table[i].ns_coeff1_2048nu & 0x000000ff));
247 buf[4] = (u8) ((coeff_table[i].ns_coeff2_2k & 0x01c00000) >> 22);
248 buf[5] = (u8) ((coeff_table[i].ns_coeff2_2k & 0x003fc000) >> 14);
249 buf[6] = (u8) ((coeff_table[i].ns_coeff2_2k & 0x00003fc0) >> 6);
250 buf[7] = (u8) ((coeff_table[i].ns_coeff2_2k & 0x0000003f));
251 buf[8] = (u8) ((coeff_table[i].ns_coeff1_8191nu & 0x03000000) >> 24);
252 buf[9] = (u8) ((coeff_table[i].ns_coeff1_8191nu & 0x00ffc000) >> 16);
253 buf[10] = (u8) ((coeff_table[i].ns_coeff1_8191nu & 0x0000ff00) >> 8);
254 buf[11] = (u8) ((coeff_table[i].ns_coeff1_8191nu & 0x000000ff));
255 buf[12] = (u8) ((coeff_table[i].ns_coeff1_8192nu & 0x03000000) >> 24);
256 buf[13] = (u8) ((coeff_table[i].ns_coeff1_8192nu & 0x00ffc000) >> 16);
257 buf[14] = (u8) ((coeff_table[i].ns_coeff1_8192nu & 0x0000ff00) >> 8);
258 buf[15] = (u8) ((coeff_table[i].ns_coeff1_8192nu & 0x000000ff));
259 buf[16] = (u8) ((coeff_table[i].ns_coeff1_8193nu & 0x03000000) >> 24);
260 buf[17] = (u8) ((coeff_table[i].ns_coeff1_8193nu & 0x00ffc000) >> 16);
261 buf[18] = (u8) ((coeff_table[i].ns_coeff1_8193nu & 0x0000ff00) >> 8);
262 buf[19] = (u8) ((coeff_table[i].ns_coeff1_8193nu & 0x000000ff));
263 buf[20] = (u8) ((coeff_table[i].ns_coeff2_8k & 0x01c00000) >> 22);
264 buf[21] = (u8) ((coeff_table[i].ns_coeff2_8k & 0x003fc000) >> 14);
265 buf[22] = (u8) ((coeff_table[i].ns_coeff2_8k & 0x00003fc0) >> 6);
266 buf[23] = (u8) ((coeff_table[i].ns_coeff2_8k & 0x0000003f));
Antti Palosaari825b9672008-09-15 15:01:52 -0300267
268 deb_info("%s: coeff:", __func__);
269 debug_dump(buf, sizeof(buf), deb_info);
270
271 /* program */
272 for (i = 0; i < sizeof(buf); i++) {
273 ret = af9013_write_reg(state, 0xae00 + i, buf[i]);
274 if (ret)
275 break;
276 }
277
Antti Palosaari9b22edd2010-09-12 20:48:58 -0300278error:
Antti Palosaari825b9672008-09-15 15:01:52 -0300279 return ret;
280}
281
282static int af9013_set_adc_ctrl(struct af9013_state *state)
283{
284 int ret;
285 u8 buf[3], tmp, i;
286 u32 adc_cw;
287
288 deb_info("%s: adc_clock:%d\n", __func__, state->config.adc_clock);
289
290 /* adc frequency type */
291 switch (state->config.adc_clock) {
292 case 28800: /* 28.800 MHz */
293 tmp = 0;
294 break;
295 case 20480: /* 20.480 MHz */
296 tmp = 1;
297 break;
298 case 28000: /* 28.000 MHz */
299 tmp = 2;
300 break;
301 case 25000: /* 25.000 MHz */
302 tmp = 3;
303 break;
304 default:
305 err("invalid xtal");
306 return -EINVAL;
307 }
308
309 adc_cw = af913_div(state->config.adc_clock*1000, 1000000ul, 19ul);
310
311 buf[0] = (u8) ((adc_cw & 0x000000ff));
312 buf[1] = (u8) ((adc_cw & 0x0000ff00) >> 8);
313 buf[2] = (u8) ((adc_cw & 0x00ff0000) >> 16);
314
315 deb_info("%s: adc_cw:", __func__);
316 debug_dump(buf, sizeof(buf), deb_info);
317
318 /* program */
319 for (i = 0; i < sizeof(buf); i++) {
320 ret = af9013_write_reg(state, 0xd180 + i, buf[i]);
321 if (ret)
322 goto error;
323 }
324 ret = af9013_write_reg_bits(state, 0x9bd2, 0, 4, tmp);
325error:
326 return ret;
327}
328
329static int af9013_set_freq_ctrl(struct af9013_state *state, fe_bandwidth_t bw)
330{
331 int ret;
332 u16 addr;
333 u8 buf[3], i, j;
334 u32 adc_freq, freq_cw;
335 s8 bfs_spec_inv;
336 int if_sample_freq;
337
338 for (j = 0; j < 3; j++) {
339 if (j == 0) {
340 addr = 0xd140; /* fcw normal */
341 bfs_spec_inv = state->config.rf_spec_inv ? -1 : 1;
342 } else if (j == 1) {
343 addr = 0x9be7; /* fcw dummy ram */
344 bfs_spec_inv = state->config.rf_spec_inv ? -1 : 1;
345 } else {
346 addr = 0x9bea; /* fcw inverted */
347 bfs_spec_inv = state->config.rf_spec_inv ? 1 : -1;
348 }
349
350 adc_freq = state->config.adc_clock * 1000;
351 if_sample_freq = state->config.tuner_if * 1000;
352
353 /* TDA18271 uses different sampling freq for every bw */
354 if (state->config.tuner == AF9013_TUNER_TDA18271) {
355 switch (bw) {
356 case BANDWIDTH_6_MHZ:
357 if_sample_freq = 3300000; /* 3.3 MHz */
358 break;
359 case BANDWIDTH_7_MHZ:
360 if_sample_freq = 3800000; /* 3.8 MHz */
361 break;
362 case BANDWIDTH_8_MHZ:
363 default:
364 if_sample_freq = 4300000; /* 4.3 MHz */
365 break;
366 }
Antti Palosaari2158e502010-08-13 03:49:24 -0300367 } else if (state->config.tuner == AF9013_TUNER_TDA18218) {
368 switch (bw) {
369 case BANDWIDTH_6_MHZ:
370 if_sample_freq = 3000000; /* 3 MHz */
371 break;
372 case BANDWIDTH_7_MHZ:
373 if_sample_freq = 3500000; /* 3.5 MHz */
374 break;
375 case BANDWIDTH_8_MHZ:
376 default:
377 if_sample_freq = 4000000; /* 4 MHz */
378 break;
379 }
Antti Palosaari825b9672008-09-15 15:01:52 -0300380 }
381
382 while (if_sample_freq > (adc_freq / 2))
383 if_sample_freq = if_sample_freq - adc_freq;
384
385 if (if_sample_freq >= 0)
386 bfs_spec_inv = bfs_spec_inv * (-1);
387 else
388 if_sample_freq = if_sample_freq * (-1);
389
390 freq_cw = af913_div(if_sample_freq, adc_freq, 23ul);
391
392 if (bfs_spec_inv == -1)
393 freq_cw = 0x00800000 - freq_cw;
394
395 buf[0] = (u8) ((freq_cw & 0x000000ff));
396 buf[1] = (u8) ((freq_cw & 0x0000ff00) >> 8);
397 buf[2] = (u8) ((freq_cw & 0x007f0000) >> 16);
398
399
400 deb_info("%s: freq_cw:", __func__);
401 debug_dump(buf, sizeof(buf), deb_info);
402
403 /* program */
404 for (i = 0; i < sizeof(buf); i++) {
405 ret = af9013_write_reg(state, addr++, buf[i]);
406 if (ret)
407 goto error;
408 }
409 }
410error:
411 return ret;
412}
413
414static int af9013_set_ofdm_params(struct af9013_state *state,
415 struct dvb_ofdm_parameters *params, u8 *auto_mode)
416{
417 int ret;
418 u8 i, buf[3] = {0, 0, 0};
419 *auto_mode = 0; /* set if parameters are requested to auto set */
420
Antti Palosaaria2f5a812009-07-10 20:03:43 -0300421 /* Try auto-detect transmission parameters in case of AUTO requested or
422 garbage parameters given by application for compatibility.
423 MPlayer seems to provide garbage parameters currently. */
424
Antti Palosaari825b9672008-09-15 15:01:52 -0300425 switch (params->transmission_mode) {
426 case TRANSMISSION_MODE_AUTO:
427 *auto_mode = 1;
428 case TRANSMISSION_MODE_2K:
429 break;
430 case TRANSMISSION_MODE_8K:
431 buf[0] |= (1 << 0);
432 break;
433 default:
Antti Palosaaria2f5a812009-07-10 20:03:43 -0300434 deb_info("%s: invalid transmission_mode\n", __func__);
435 *auto_mode = 1;
Antti Palosaari825b9672008-09-15 15:01:52 -0300436 }
437
438 switch (params->guard_interval) {
439 case GUARD_INTERVAL_AUTO:
440 *auto_mode = 1;
441 case GUARD_INTERVAL_1_32:
442 break;
443 case GUARD_INTERVAL_1_16:
444 buf[0] |= (1 << 2);
445 break;
446 case GUARD_INTERVAL_1_8:
447 buf[0] |= (2 << 2);
448 break;
449 case GUARD_INTERVAL_1_4:
450 buf[0] |= (3 << 2);
451 break;
452 default:
Antti Palosaaria2f5a812009-07-10 20:03:43 -0300453 deb_info("%s: invalid guard_interval\n", __func__);
454 *auto_mode = 1;
Antti Palosaari825b9672008-09-15 15:01:52 -0300455 }
456
457 switch (params->hierarchy_information) {
458 case HIERARCHY_AUTO:
459 *auto_mode = 1;
460 case HIERARCHY_NONE:
461 break;
462 case HIERARCHY_1:
463 buf[0] |= (1 << 4);
464 break;
465 case HIERARCHY_2:
466 buf[0] |= (2 << 4);
467 break;
468 case HIERARCHY_4:
469 buf[0] |= (3 << 4);
470 break;
471 default:
Antti Palosaaria2f5a812009-07-10 20:03:43 -0300472 deb_info("%s: invalid hierarchy_information\n", __func__);
473 *auto_mode = 1;
Antti Palosaari825b9672008-09-15 15:01:52 -0300474 };
475
476 switch (params->constellation) {
477 case QAM_AUTO:
478 *auto_mode = 1;
479 case QPSK:
480 break;
481 case QAM_16:
482 buf[1] |= (1 << 6);
483 break;
484 case QAM_64:
485 buf[1] |= (2 << 6);
486 break;
487 default:
Antti Palosaaria2f5a812009-07-10 20:03:43 -0300488 deb_info("%s: invalid constellation\n", __func__);
489 *auto_mode = 1;
Antti Palosaari825b9672008-09-15 15:01:52 -0300490 }
491
492 /* Use HP. How and which case we can switch to LP? */
493 buf[1] |= (1 << 4);
494
495 switch (params->code_rate_HP) {
496 case FEC_AUTO:
497 *auto_mode = 1;
498 case FEC_1_2:
499 break;
500 case FEC_2_3:
501 buf[2] |= (1 << 0);
502 break;
503 case FEC_3_4:
504 buf[2] |= (2 << 0);
505 break;
506 case FEC_5_6:
507 buf[2] |= (3 << 0);
508 break;
509 case FEC_7_8:
510 buf[2] |= (4 << 0);
511 break;
512 default:
Antti Palosaaria2f5a812009-07-10 20:03:43 -0300513 deb_info("%s: invalid code_rate_HP\n", __func__);
514 *auto_mode = 1;
Antti Palosaari825b9672008-09-15 15:01:52 -0300515 }
516
517 switch (params->code_rate_LP) {
518 case FEC_AUTO:
519 /* if HIERARCHY_NONE and FEC_NONE then LP FEC is set to FEC_AUTO
520 by dvb_frontend.c for compatibility */
521 if (params->hierarchy_information != HIERARCHY_NONE)
522 *auto_mode = 1;
523 case FEC_1_2:
524 break;
525 case FEC_2_3:
526 buf[2] |= (1 << 3);
527 break;
528 case FEC_3_4:
529 buf[2] |= (2 << 3);
530 break;
531 case FEC_5_6:
532 buf[2] |= (3 << 3);
533 break;
534 case FEC_7_8:
535 buf[2] |= (4 << 3);
536 break;
537 case FEC_NONE:
538 if (params->hierarchy_information == HIERARCHY_AUTO)
539 break;
540 default:
Antti Palosaaria2f5a812009-07-10 20:03:43 -0300541 deb_info("%s: invalid code_rate_LP\n", __func__);
542 *auto_mode = 1;
Antti Palosaari825b9672008-09-15 15:01:52 -0300543 }
544
545 switch (params->bandwidth) {
546 case BANDWIDTH_6_MHZ:
547 break;
548 case BANDWIDTH_7_MHZ:
549 buf[1] |= (1 << 2);
550 break;
551 case BANDWIDTH_8_MHZ:
552 buf[1] |= (2 << 2);
553 break;
554 default:
Antti Palosaaria2f5a812009-07-10 20:03:43 -0300555 deb_info("%s: invalid bandwidth\n", __func__);
556 buf[1] |= (2 << 2); /* cannot auto-detect BW, try 8 MHz */
Antti Palosaari825b9672008-09-15 15:01:52 -0300557 }
558
559 /* program */
560 for (i = 0; i < sizeof(buf); i++) {
561 ret = af9013_write_reg(state, 0xd3c0 + i, buf[i]);
562 if (ret)
563 break;
564 }
565
566 return ret;
567}
568
569static int af9013_reset(struct af9013_state *state, u8 sleep)
570{
571 int ret;
572 u8 tmp, i;
573 deb_info("%s\n", __func__);
574
575 /* enable OFDM reset */
576 ret = af9013_write_reg_bits(state, 0xd417, 4, 1, 1);
577 if (ret)
578 goto error;
579
580 /* start reset mechanism */
581 ret = af9013_write_reg(state, 0xaeff, 1);
582 if (ret)
583 goto error;
584
585 /* reset is done when bit 1 is set */
586 for (i = 0; i < 150; i++) {
587 ret = af9013_read_reg_bits(state, 0xd417, 1, 1, &tmp);
588 if (ret)
589 goto error;
590 if (tmp)
591 break; /* reset done */
592 msleep(10);
593 }
594 if (!tmp)
595 return -ETIMEDOUT;
596
597 /* don't clear reset when going to sleep */
598 if (!sleep) {
599 /* clear OFDM reset */
600 ret = af9013_write_reg_bits(state, 0xd417, 1, 1, 0);
601 if (ret)
602 goto error;
603
604 /* disable OFDM reset */
605 ret = af9013_write_reg_bits(state, 0xd417, 4, 1, 0);
606 }
607error:
608 return ret;
609}
610
611static int af9013_power_ctrl(struct af9013_state *state, u8 onoff)
612{
613 int ret;
614 deb_info("%s: onoff:%d\n", __func__, onoff);
615
616 if (onoff) {
617 /* power on */
618 ret = af9013_write_reg_bits(state, 0xd73a, 3, 1, 0);
619 if (ret)
620 goto error;
621 ret = af9013_write_reg_bits(state, 0xd417, 1, 1, 0);
622 if (ret)
623 goto error;
624 ret = af9013_write_reg_bits(state, 0xd417, 4, 1, 0);
625 } else {
626 /* power off */
627 ret = af9013_reset(state, 1);
628 if (ret)
629 goto error;
630 ret = af9013_write_reg_bits(state, 0xd73a, 3, 1, 1);
631 }
632error:
633 return ret;
634}
635
636static int af9013_lock_led(struct af9013_state *state, u8 onoff)
637{
638 deb_info("%s: onoff:%d\n", __func__, onoff);
639
640 return af9013_write_reg_bits(state, 0xd730, 0, 1, onoff);
641}
642
643static int af9013_set_frontend(struct dvb_frontend *fe,
644 struct dvb_frontend_parameters *params)
645{
646 struct af9013_state *state = fe->demodulator_priv;
647 int ret;
648 u8 auto_mode; /* auto set TPS */
649
650 deb_info("%s: freq:%d bw:%d\n", __func__, params->frequency,
651 params->u.ofdm.bandwidth);
652
653 state->frequency = params->frequency;
654
Antti Palosaari737fabf2010-06-16 16:43:40 -0300655 /* program tuner */
656 if (fe->ops.tuner_ops.set_params)
657 fe->ops.tuner_ops.set_params(fe, params);
658
Antti Palosaari825b9672008-09-15 15:01:52 -0300659 /* program CFOE coefficients */
660 ret = af9013_set_coeff(state, params->u.ofdm.bandwidth);
661 if (ret)
662 goto error;
663
664 /* program frequency control */
665 ret = af9013_set_freq_ctrl(state, params->u.ofdm.bandwidth);
666 if (ret)
667 goto error;
668
669 /* clear TPS lock flag (inverted flag) */
670 ret = af9013_write_reg_bits(state, 0xd330, 3, 1, 1);
671 if (ret)
672 goto error;
673
674 /* clear MPEG2 lock flag */
675 ret = af9013_write_reg_bits(state, 0xd507, 6, 1, 0);
676 if (ret)
677 goto error;
678
679 /* empty channel function */
680 ret = af9013_write_reg_bits(state, 0x9bfe, 0, 1, 0);
681 if (ret)
682 goto error;
683
684 /* empty DVB-T channel function */
685 ret = af9013_write_reg_bits(state, 0x9bc2, 0, 1, 0);
686 if (ret)
687 goto error;
688
Antti Palosaari825b9672008-09-15 15:01:52 -0300689 /* program TPS and bandwidth, check if auto mode needed */
690 ret = af9013_set_ofdm_params(state, &params->u.ofdm, &auto_mode);
691 if (ret)
692 goto error;
693
694 if (auto_mode) {
695 /* clear easy mode flag */
696 ret = af9013_write_reg(state, 0xaefd, 0);
697 deb_info("%s: auto TPS\n", __func__);
698 } else {
699 /* set easy mode flag */
700 ret = af9013_write_reg(state, 0xaefd, 1);
701 if (ret)
702 goto error;
703 ret = af9013_write_reg(state, 0xaefe, 0);
704 deb_info("%s: manual TPS\n", __func__);
705 }
706 if (ret)
707 goto error;
708
709 /* everything is set, lets try to receive channel - OFSM GO! */
710 ret = af9013_write_reg(state, 0xffff, 0);
711 if (ret)
712 goto error;
713
714error:
715 return ret;
716}
717
718static int af9013_get_frontend(struct dvb_frontend *fe,
719 struct dvb_frontend_parameters *p)
720{
721 struct af9013_state *state = fe->demodulator_priv;
722 int ret;
723 u8 i, buf[3];
724 deb_info("%s\n", __func__);
725
726 /* read TPS registers */
727 for (i = 0; i < 3; i++) {
728 ret = af9013_read_reg(state, 0xd3c0 + i, &buf[i]);
729 if (ret)
730 goto error;
731 }
732
733 switch ((buf[1] >> 6) & 3) {
734 case 0:
735 p->u.ofdm.constellation = QPSK;
736 break;
737 case 1:
738 p->u.ofdm.constellation = QAM_16;
739 break;
740 case 2:
741 p->u.ofdm.constellation = QAM_64;
742 break;
743 }
744
745 switch ((buf[0] >> 0) & 3) {
746 case 0:
747 p->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K;
748 break;
749 case 1:
750 p->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K;
751 }
752
753 switch ((buf[0] >> 2) & 3) {
754 case 0:
755 p->u.ofdm.guard_interval = GUARD_INTERVAL_1_32;
756 break;
757 case 1:
758 p->u.ofdm.guard_interval = GUARD_INTERVAL_1_16;
759 break;
760 case 2:
761 p->u.ofdm.guard_interval = GUARD_INTERVAL_1_8;
762 break;
763 case 3:
764 p->u.ofdm.guard_interval = GUARD_INTERVAL_1_4;
765 break;
766 }
767
768 switch ((buf[0] >> 4) & 7) {
769 case 0:
770 p->u.ofdm.hierarchy_information = HIERARCHY_NONE;
771 break;
772 case 1:
773 p->u.ofdm.hierarchy_information = HIERARCHY_1;
774 break;
775 case 2:
776 p->u.ofdm.hierarchy_information = HIERARCHY_2;
777 break;
778 case 3:
779 p->u.ofdm.hierarchy_information = HIERARCHY_4;
780 break;
781 }
782
783 switch ((buf[2] >> 0) & 7) {
784 case 0:
785 p->u.ofdm.code_rate_HP = FEC_1_2;
786 break;
787 case 1:
788 p->u.ofdm.code_rate_HP = FEC_2_3;
789 break;
790 case 2:
791 p->u.ofdm.code_rate_HP = FEC_3_4;
792 break;
793 case 3:
794 p->u.ofdm.code_rate_HP = FEC_5_6;
795 break;
796 case 4:
797 p->u.ofdm.code_rate_HP = FEC_7_8;
798 break;
799 }
800
801 switch ((buf[2] >> 3) & 7) {
802 case 0:
803 p->u.ofdm.code_rate_LP = FEC_1_2;
804 break;
805 case 1:
806 p->u.ofdm.code_rate_LP = FEC_2_3;
807 break;
808 case 2:
809 p->u.ofdm.code_rate_LP = FEC_3_4;
810 break;
811 case 3:
812 p->u.ofdm.code_rate_LP = FEC_5_6;
813 break;
814 case 4:
815 p->u.ofdm.code_rate_LP = FEC_7_8;
816 break;
817 }
818
819 switch ((buf[1] >> 2) & 3) {
820 case 0:
821 p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
822 break;
823 case 1:
824 p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
825 break;
826 case 2:
827 p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
828 break;
829 }
830
831 p->inversion = INVERSION_AUTO;
832 p->frequency = state->frequency;
833
834error:
835 return ret;
836}
837
838static int af9013_update_ber_unc(struct dvb_frontend *fe)
839{
840 struct af9013_state *state = fe->demodulator_priv;
841 int ret;
842 u8 buf[3], i;
843 u32 error_bit_count = 0;
844 u32 total_bit_count = 0;
845 u32 abort_packet_count = 0;
Antti Palosaari825b9672008-09-15 15:01:52 -0300846
847 state->ber = 0;
848
849 /* check if error bit count is ready */
850 ret = af9013_read_reg_bits(state, 0xd391, 4, 1, &buf[0]);
851 if (ret)
852 goto error;
853 if (!buf[0])
854 goto exit;
855
856 /* get RSD packet abort count */
857 for (i = 0; i < 2; i++) {
858 ret = af9013_read_reg(state, 0xd38a + i, &buf[i]);
859 if (ret)
860 goto error;
861 }
862 abort_packet_count = (buf[1] << 8) + buf[0];
863
864 /* get error bit count */
865 for (i = 0; i < 3; i++) {
866 ret = af9013_read_reg(state, 0xd387 + i, &buf[i]);
867 if (ret)
868 goto error;
869 }
870 error_bit_count = (buf[2] << 16) + (buf[1] << 8) + buf[0];
871 error_bit_count = error_bit_count - abort_packet_count * 8 * 8;
872
873 /* get used RSD counting period (10000 RSD packets used) */
874 for (i = 0; i < 2; i++) {
875 ret = af9013_read_reg(state, 0xd385 + i, &buf[i]);
876 if (ret)
877 goto error;
878 }
879 total_bit_count = (buf[1] << 8) + buf[0];
880 total_bit_count = total_bit_count - abort_packet_count;
881 total_bit_count = total_bit_count * 204 * 8;
882
Antti Palosaari28f947a2008-09-16 14:22:43 -0300883 if (total_bit_count)
884 state->ber = error_bit_count * 1000000000 / total_bit_count;
Antti Palosaari825b9672008-09-15 15:01:52 -0300885
886 state->ucblocks += abort_packet_count;
887
888 deb_info("%s: err bits:%d total bits:%d abort count:%d\n", __func__,
889 error_bit_count, total_bit_count, abort_packet_count);
890
891 /* set BER counting range */
892 ret = af9013_write_reg(state, 0xd385, 10000 & 0xff);
893 if (ret)
894 goto error;
895 ret = af9013_write_reg(state, 0xd386, 10000 >> 8);
896 if (ret)
897 goto error;
898 /* reset and start BER counter */
899 ret = af9013_write_reg_bits(state, 0xd391, 4, 1, 1);
900 if (ret)
901 goto error;
902
903exit:
904error:
905 return ret;
906}
907
908static int af9013_update_snr(struct dvb_frontend *fe)
909{
910 struct af9013_state *state = fe->demodulator_priv;
911 int ret;
912 u8 buf[3], i, len;
913 u32 quant = 0;
Mauro Carvalho Chehab4d543092008-12-29 23:18:31 -0300914 struct snr_table *uninitialized_var(snr_table);
Antti Palosaari825b9672008-09-15 15:01:52 -0300915
916 /* check if quantizer ready (for snr) */
917 ret = af9013_read_reg_bits(state, 0xd2e1, 3, 1, &buf[0]);
918 if (ret)
919 goto error;
920 if (buf[0]) {
921 /* quantizer ready - read it */
922 for (i = 0; i < 3; i++) {
923 ret = af9013_read_reg(state, 0xd2e3 + i, &buf[i]);
924 if (ret)
925 goto error;
926 }
927 quant = (buf[2] << 16) + (buf[1] << 8) + buf[0];
928
929 /* read current constellation */
930 ret = af9013_read_reg(state, 0xd3c1, &buf[0]);
931 if (ret)
932 goto error;
933
934 switch ((buf[0] >> 6) & 3) {
935 case 0:
936 len = ARRAY_SIZE(qpsk_snr_table);
937 snr_table = qpsk_snr_table;
938 break;
939 case 1:
940 len = ARRAY_SIZE(qam16_snr_table);
941 snr_table = qam16_snr_table;
942 break;
943 case 2:
944 len = ARRAY_SIZE(qam64_snr_table);
945 snr_table = qam64_snr_table;
946 break;
947 default:
948 len = 0;
949 break;
950 }
951
952 if (len) {
953 for (i = 0; i < len; i++) {
954 if (quant < snr_table[i].val) {
955 state->snr = snr_table[i].snr * 10;
956 break;
957 }
958 }
959 }
960
961 /* set quantizer super frame count */
962 ret = af9013_write_reg(state, 0xd2e2, 1);
963 if (ret)
964 goto error;
965
966 /* check quantizer availability */
967 for (i = 0; i < 10; i++) {
968 msleep(10);
969 ret = af9013_read_reg_bits(state, 0xd2e6, 0, 1,
970 &buf[0]);
971 if (ret)
972 goto error;
973 if (!buf[0])
974 break;
975 }
976
977 /* reset quantizer */
978 ret = af9013_write_reg_bits(state, 0xd2e1, 3, 1, 1);
979 if (ret)
980 goto error;
981 }
982
983error:
984 return ret;
985}
986
987static int af9013_update_signal_strength(struct dvb_frontend *fe)
988{
989 struct af9013_state *state = fe->demodulator_priv;
990 int ret;
991 u8 tmp0;
992 u8 rf_gain, rf_50, rf_80, if_gain, if_50, if_80;
993 int signal_strength;
994
995 deb_info("%s\n", __func__);
996
997 state->signal_strength = 0;
998
999 ret = af9013_read_reg_bits(state, 0x9bee, 0, 1, &tmp0);
1000 if (ret)
1001 goto error;
1002 if (tmp0) {
1003 ret = af9013_read_reg(state, 0x9bbd, &rf_50);
1004 if (ret)
1005 goto error;
1006 ret = af9013_read_reg(state, 0x9bd0, &rf_80);
1007 if (ret)
1008 goto error;
1009 ret = af9013_read_reg(state, 0x9be2, &if_50);
1010 if (ret)
1011 goto error;
1012 ret = af9013_read_reg(state, 0x9be4, &if_80);
1013 if (ret)
1014 goto error;
1015 ret = af9013_read_reg(state, 0xd07c, &rf_gain);
1016 if (ret)
1017 goto error;
1018 ret = af9013_read_reg(state, 0xd07d, &if_gain);
1019 if (ret)
1020 goto error;
1021 signal_strength = (0xffff / (9 * (rf_50 + if_50) - \
1022 11 * (rf_80 + if_80))) * (10 * (rf_gain + if_gain) - \
1023 11 * (rf_80 + if_80));
1024 if (signal_strength < 0)
1025 signal_strength = 0;
1026 else if (signal_strength > 0xffff)
1027 signal_strength = 0xffff;
1028
1029 state->signal_strength = signal_strength;
1030 }
1031
1032error:
1033 return ret;
1034}
1035
1036static int af9013_update_statistics(struct dvb_frontend *fe)
1037{
1038 struct af9013_state *state = fe->demodulator_priv;
1039 int ret;
1040
1041 if (time_before(jiffies, state->next_statistics_check))
1042 return 0;
1043
1044 /* set minimum statistic update interval */
1045 state->next_statistics_check = jiffies + msecs_to_jiffies(1200);
1046
1047 ret = af9013_update_signal_strength(fe);
1048 if (ret)
1049 goto error;
1050 ret = af9013_update_snr(fe);
1051 if (ret)
1052 goto error;
1053 ret = af9013_update_ber_unc(fe);
1054 if (ret)
1055 goto error;
1056
1057error:
1058 return ret;
1059}
1060
1061static int af9013_get_tune_settings(struct dvb_frontend *fe,
1062 struct dvb_frontend_tune_settings *fesettings)
1063{
1064 fesettings->min_delay_ms = 800;
1065 fesettings->step_size = 0;
1066 fesettings->max_drift = 0;
1067
1068 return 0;
1069}
1070
1071static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status)
1072{
1073 struct af9013_state *state = fe->demodulator_priv;
1074 int ret = 0;
1075 u8 tmp;
1076 *status = 0;
1077
Antti Palosaari825b9672008-09-15 15:01:52 -03001078 /* MPEG2 lock */
1079 ret = af9013_read_reg_bits(state, 0xd507, 6, 1, &tmp);
1080 if (ret)
1081 goto error;
1082 if (tmp)
Antti Palosaari8af5e382010-06-17 20:56:27 -03001083 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
1084 FE_HAS_SYNC | FE_HAS_LOCK;
Antti Palosaari825b9672008-09-15 15:01:52 -03001085
Antti Palosaari8af5e382010-06-17 20:56:27 -03001086 if (!*status) {
1087 /* TPS lock */
1088 ret = af9013_read_reg_bits(state, 0xd330, 3, 1, &tmp);
1089 if (ret)
1090 goto error;
1091 if (tmp)
1092 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
1093 FE_HAS_VITERBI;
1094 }
1095
1096 if (!*status) {
1097 /* CFO lock */
1098 ret = af9013_read_reg_bits(state, 0xd333, 7, 1, &tmp);
1099 if (ret)
1100 goto error;
1101 if (tmp)
1102 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;
1103 }
1104
1105 if (!*status) {
1106 /* SFOE lock */
1107 ret = af9013_read_reg_bits(state, 0xd334, 6, 1, &tmp);
1108 if (ret)
1109 goto error;
1110 if (tmp)
1111 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;
1112 }
1113
1114 if (!*status) {
Antti Palosaari825b9672008-09-15 15:01:52 -03001115 /* AGC lock */
1116 ret = af9013_read_reg_bits(state, 0xd1a0, 6, 1, &tmp);
1117 if (ret)
1118 goto error;
1119 if (tmp)
1120 *status |= FE_HAS_SIGNAL;
1121 }
1122
Antti Palosaari825b9672008-09-15 15:01:52 -03001123 ret = af9013_update_statistics(fe);
1124
1125error:
1126 return ret;
1127}
1128
1129
1130static int af9013_read_ber(struct dvb_frontend *fe, u32 *ber)
1131{
1132 struct af9013_state *state = fe->demodulator_priv;
1133 int ret;
1134 ret = af9013_update_statistics(fe);
1135 *ber = state->ber;
1136 return ret;
1137}
1138
1139static int af9013_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
1140{
1141 struct af9013_state *state = fe->demodulator_priv;
1142 int ret;
1143 ret = af9013_update_statistics(fe);
1144 *strength = state->signal_strength;
1145 return ret;
1146}
1147
1148static int af9013_read_snr(struct dvb_frontend *fe, u16 *snr)
1149{
1150 struct af9013_state *state = fe->demodulator_priv;
1151 int ret;
1152 ret = af9013_update_statistics(fe);
1153 *snr = state->snr;
1154 return ret;
1155}
1156
1157static int af9013_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
1158{
1159 struct af9013_state *state = fe->demodulator_priv;
1160 int ret;
1161 ret = af9013_update_statistics(fe);
1162 *ucblocks = state->ucblocks;
1163 return ret;
1164}
1165
1166static int af9013_sleep(struct dvb_frontend *fe)
1167{
1168 struct af9013_state *state = fe->demodulator_priv;
1169 int ret;
1170 deb_info("%s\n", __func__);
1171
1172 ret = af9013_lock_led(state, 0);
1173 if (ret)
1174 goto error;
1175
1176 ret = af9013_power_ctrl(state, 0);
1177error:
1178 return ret;
1179}
1180
1181static int af9013_init(struct dvb_frontend *fe)
1182{
1183 struct af9013_state *state = fe->demodulator_priv;
1184 int ret, i, len;
1185 u8 tmp0, tmp1;
1186 struct regdesc *init;
1187 deb_info("%s\n", __func__);
1188
1189 /* reset OFDM */
1190 ret = af9013_reset(state, 0);
1191 if (ret)
1192 goto error;
1193
1194 /* power on */
1195 ret = af9013_power_ctrl(state, 1);
1196 if (ret)
1197 goto error;
1198
1199 /* enable ADC */
1200 ret = af9013_write_reg(state, 0xd73a, 0xa4);
1201 if (ret)
1202 goto error;
1203
1204 /* write API version to firmware */
1205 for (i = 0; i < sizeof(state->config.api_version); i++) {
1206 ret = af9013_write_reg(state, 0x9bf2 + i,
1207 state->config.api_version[i]);
1208 if (ret)
1209 goto error;
1210 }
1211
1212 /* program ADC control */
1213 ret = af9013_set_adc_ctrl(state);
1214 if (ret)
1215 goto error;
1216
1217 /* set I2C master clock */
1218 ret = af9013_write_reg(state, 0xd416, 0x14);
1219 if (ret)
1220 goto error;
1221
1222 /* set 16 embx */
1223 ret = af9013_write_reg_bits(state, 0xd700, 1, 1, 1);
1224 if (ret)
1225 goto error;
1226
1227 /* set no trigger */
1228 ret = af9013_write_reg_bits(state, 0xd700, 2, 1, 0);
1229 if (ret)
1230 goto error;
1231
1232 /* set read-update bit for constellation */
1233 ret = af9013_write_reg_bits(state, 0xd371, 1, 1, 1);
1234 if (ret)
1235 goto error;
1236
1237 /* enable FEC monitor */
1238 ret = af9013_write_reg_bits(state, 0xd392, 1, 1, 1);
1239 if (ret)
1240 goto error;
1241
1242 /* load OFSM settings */
1243 deb_info("%s: load ofsm settings\n", __func__);
1244 len = ARRAY_SIZE(ofsm_init);
1245 init = ofsm_init;
1246 for (i = 0; i < len; i++) {
1247 ret = af9013_write_reg_bits(state, init[i].addr, init[i].pos,
1248 init[i].len, init[i].val);
1249 if (ret)
1250 goto error;
1251 }
1252
1253 /* load tuner specific settings */
1254 deb_info("%s: load tuner specific settings\n", __func__);
1255 switch (state->config.tuner) {
1256 case AF9013_TUNER_MXL5003D:
1257 len = ARRAY_SIZE(tuner_init_mxl5003d);
1258 init = tuner_init_mxl5003d;
1259 break;
1260 case AF9013_TUNER_MXL5005D:
1261 case AF9013_TUNER_MXL5005R:
Antti Palosaaria4f31d02010-09-09 14:53:59 -03001262 case AF9013_TUNER_MXL5007T:
Antti Palosaari825b9672008-09-15 15:01:52 -03001263 len = ARRAY_SIZE(tuner_init_mxl5005);
1264 init = tuner_init_mxl5005;
1265 break;
1266 case AF9013_TUNER_ENV77H11D5:
1267 len = ARRAY_SIZE(tuner_init_env77h11d5);
1268 init = tuner_init_env77h11d5;
1269 break;
1270 case AF9013_TUNER_MT2060:
1271 len = ARRAY_SIZE(tuner_init_mt2060);
1272 init = tuner_init_mt2060;
1273 break;
1274 case AF9013_TUNER_MC44S803:
1275 len = ARRAY_SIZE(tuner_init_mc44s803);
1276 init = tuner_init_mc44s803;
1277 break;
1278 case AF9013_TUNER_QT1010:
1279 case AF9013_TUNER_QT1010A:
1280 len = ARRAY_SIZE(tuner_init_qt1010);
1281 init = tuner_init_qt1010;
1282 break;
1283 case AF9013_TUNER_MT2060_2:
1284 len = ARRAY_SIZE(tuner_init_mt2060_2);
1285 init = tuner_init_mt2060_2;
1286 break;
1287 case AF9013_TUNER_TDA18271:
Antti Palosaari2158e502010-08-13 03:49:24 -03001288 case AF9013_TUNER_TDA18218:
Antti Palosaari825b9672008-09-15 15:01:52 -03001289 len = ARRAY_SIZE(tuner_init_tda18271);
1290 init = tuner_init_tda18271;
1291 break;
1292 case AF9013_TUNER_UNKNOWN:
1293 default:
1294 len = ARRAY_SIZE(tuner_init_unknown);
1295 init = tuner_init_unknown;
1296 break;
1297 }
1298
1299 for (i = 0; i < len; i++) {
1300 ret = af9013_write_reg_bits(state, init[i].addr, init[i].pos,
1301 init[i].len, init[i].val);
1302 if (ret)
1303 goto error;
1304 }
1305
1306 /* set TS mode */
1307 deb_info("%s: setting ts mode\n", __func__);
1308 tmp0 = 0; /* parallel mode */
1309 tmp1 = 0; /* serial mode */
1310 switch (state->config.output_mode) {
1311 case AF9013_OUTPUT_MODE_PARALLEL:
1312 tmp0 = 1;
1313 break;
1314 case AF9013_OUTPUT_MODE_SERIAL:
1315 tmp1 = 1;
1316 break;
1317 case AF9013_OUTPUT_MODE_USB:
1318 /* usb mode for AF9015 */
1319 default:
1320 break;
1321 }
1322 ret = af9013_write_reg_bits(state, 0xd500, 1, 1, tmp0); /* parallel */
1323 if (ret)
1324 goto error;
1325 ret = af9013_write_reg_bits(state, 0xd500, 2, 1, tmp1); /* serial */
1326 if (ret)
1327 goto error;
1328
1329 /* enable lock led */
1330 ret = af9013_lock_led(state, 1);
1331 if (ret)
1332 goto error;
1333
1334error:
1335 return ret;
1336}
1337
1338static struct dvb_frontend_ops af9013_ops;
1339
1340static int af9013_download_firmware(struct af9013_state *state)
1341{
1342 int i, len, packets, remainder, ret;
1343 const struct firmware *fw;
1344 u16 addr = 0x5100; /* firmware start address */
1345 u16 checksum = 0;
1346 u8 val;
1347 u8 fw_params[4];
1348 u8 *data;
1349 u8 *fw_file = AF9013_DEFAULT_FIRMWARE;
1350
1351 msleep(100);
1352 /* check whether firmware is already running */
1353 ret = af9013_read_reg(state, 0x98be, &val);
1354 if (ret)
1355 goto error;
1356 else
1357 deb_info("%s: firmware status:%02x\n", __func__, val);
1358
1359 if (val == 0x0c) /* fw is running, no need for download */
1360 goto exit;
1361
1362 info("found a '%s' in cold state, will try to load a firmware",
1363 af9013_ops.info.name);
1364
1365 /* request the firmware, this will block and timeout */
Jean Delvaree9785252009-04-26 05:43:59 -03001366 ret = request_firmware(&fw, fw_file, state->i2c->dev.parent);
Antti Palosaari825b9672008-09-15 15:01:52 -03001367 if (ret) {
1368 err("did not find the firmware file. (%s) "
1369 "Please see linux/Documentation/dvb/ for more details" \
1370 " on firmware-problems. (%d)",
1371 fw_file, ret);
1372 goto error;
1373 }
1374
1375 info("downloading firmware from file '%s'", fw_file);
1376
1377 /* calc checksum */
1378 for (i = 0; i < fw->size; i++)
1379 checksum += fw->data[i];
1380
1381 fw_params[0] = checksum >> 8;
1382 fw_params[1] = checksum & 0xff;
1383 fw_params[2] = fw->size >> 8;
1384 fw_params[3] = fw->size & 0xff;
1385
1386 /* write fw checksum & size */
1387 ret = af9013_write_ofsm_regs(state, 0x50fc,
1388 fw_params, sizeof(fw_params));
1389 if (ret)
1390 goto error_release;
1391
1392 #define FW_PACKET_MAX_DATA 16
1393
1394 packets = fw->size / FW_PACKET_MAX_DATA;
1395 remainder = fw->size % FW_PACKET_MAX_DATA;
1396 len = FW_PACKET_MAX_DATA;
1397 for (i = 0; i <= packets; i++) {
1398 if (i == packets) /* set size of the last packet */
1399 len = remainder;
1400
Antti Palosaari541dfa82008-10-06 13:57:45 -03001401 data = (u8 *)(fw->data + i * FW_PACKET_MAX_DATA);
Antti Palosaari825b9672008-09-15 15:01:52 -03001402 ret = af9013_write_ofsm_regs(state, addr, data, len);
1403 addr += FW_PACKET_MAX_DATA;
1404
1405 if (ret) {
1406 err("firmware download failed at %d with %d", i, ret);
1407 goto error_release;
1408 }
1409 }
1410
Antti Palosaari825b9672008-09-15 15:01:52 -03001411 /* request boot firmware */
1412 ret = af9013_write_reg(state, 0xe205, 1);
1413 if (ret)
1414 goto error_release;
1415
1416 for (i = 0; i < 15; i++) {
1417 msleep(100);
1418
1419 /* check firmware status */
1420 ret = af9013_read_reg(state, 0x98be, &val);
1421 if (ret)
1422 goto error_release;
1423
1424 deb_info("%s: firmware status:%02x\n", __func__, val);
1425
1426 if (val == 0x0c || val == 0x04) /* success or fail */
1427 break;
1428 }
1429
1430 if (val == 0x04) {
1431 err("firmware did not run");
1432 ret = -1;
1433 } else if (val != 0x0c) {
1434 err("firmware boot timeout");
1435 ret = -1;
1436 }
1437
1438error_release:
1439 release_firmware(fw);
1440error:
1441exit:
1442 if (!ret)
1443 info("found a '%s' in warm state.", af9013_ops.info.name);
1444 return ret;
1445}
1446
1447static int af9013_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
1448{
1449 int ret;
1450 struct af9013_state *state = fe->demodulator_priv;
1451 deb_info("%s: enable:%d\n", __func__, enable);
1452
1453 if (state->config.output_mode == AF9013_OUTPUT_MODE_USB)
1454 ret = af9013_write_reg_bits(state, 0xd417, 3, 1, enable);
1455 else
1456 ret = af9013_write_reg_bits(state, 0xd607, 2, 1, enable);
1457
1458 return ret;
1459}
1460
1461static void af9013_release(struct dvb_frontend *fe)
1462{
1463 struct af9013_state *state = fe->demodulator_priv;
1464 kfree(state);
1465}
1466
1467static struct dvb_frontend_ops af9013_ops;
1468
1469struct dvb_frontend *af9013_attach(const struct af9013_config *config,
1470 struct i2c_adapter *i2c)
1471{
1472 int ret;
1473 struct af9013_state *state = NULL;
Antti Palosaarice99efa2010-06-17 21:16:12 -03001474 u8 buf[4], i;
Antti Palosaari825b9672008-09-15 15:01:52 -03001475
1476 /* allocate memory for the internal state */
1477 state = kzalloc(sizeof(struct af9013_state), GFP_KERNEL);
1478 if (state == NULL)
1479 goto error;
1480
1481 /* setup the state */
1482 state->i2c = i2c;
1483 memcpy(&state->config, config, sizeof(struct af9013_config));
1484
1485 /* chip version */
1486 ret = af9013_read_reg_bits(state, 0xd733, 4, 4, &buf[2]);
1487 if (ret)
1488 goto error;
1489
1490 /* ROM version */
1491 for (i = 0; i < 2; i++) {
1492 ret = af9013_read_reg(state, 0x116b + i, &buf[i]);
1493 if (ret)
1494 goto error;
1495 }
1496 deb_info("%s: chip version:%d ROM version:%d.%d\n", __func__,
1497 buf[2], buf[0], buf[1]);
1498
1499 /* download firmware */
1500 if (state->config.output_mode != AF9013_OUTPUT_MODE_USB) {
1501 ret = af9013_download_firmware(state);
1502 if (ret)
1503 goto error;
1504 }
1505
1506 /* firmware version */
Antti Palosaarice99efa2010-06-17 21:16:12 -03001507 for (i = 0; i < 4; i++) {
Antti Palosaari825b9672008-09-15 15:01:52 -03001508 ret = af9013_read_reg(state, 0x5103 + i, &buf[i]);
1509 if (ret)
1510 goto error;
1511 }
Antti Palosaarice99efa2010-06-17 21:16:12 -03001512 info("firmware version:%d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3]);
Antti Palosaari825b9672008-09-15 15:01:52 -03001513
1514 /* settings for mp2if */
1515 if (state->config.output_mode == AF9013_OUTPUT_MODE_USB) {
1516 /* AF9015 split PSB to 1.5k + 0.5k */
1517 ret = af9013_write_reg_bits(state, 0xd50b, 2, 1, 1);
1518 } else {
1519 /* AF9013 change the output bit to data7 */
1520 ret = af9013_write_reg_bits(state, 0xd500, 3, 1, 1);
1521 if (ret)
1522 goto error;
1523 /* AF9013 set mpeg to full speed */
1524 ret = af9013_write_reg_bits(state, 0xd502, 4, 1, 1);
1525 }
1526 if (ret)
1527 goto error;
1528 ret = af9013_write_reg_bits(state, 0xd520, 4, 1, 1);
1529 if (ret)
1530 goto error;
1531
1532 /* set GPIOs */
1533 for (i = 0; i < sizeof(state->config.gpio); i++) {
1534 ret = af9013_set_gpio(state, i, state->config.gpio[i]);
1535 if (ret)
1536 goto error;
1537 }
1538
1539 /* create dvb_frontend */
1540 memcpy(&state->frontend.ops, &af9013_ops,
1541 sizeof(struct dvb_frontend_ops));
1542 state->frontend.demodulator_priv = state;
1543
1544 return &state->frontend;
1545error:
1546 kfree(state);
1547 return NULL;
1548}
1549EXPORT_SYMBOL(af9013_attach);
1550
1551static struct dvb_frontend_ops af9013_ops = {
1552 .info = {
1553 .name = "Afatech AF9013 DVB-T",
1554 .type = FE_OFDM,
1555 .frequency_min = 174000000,
1556 .frequency_max = 862000000,
1557 .frequency_stepsize = 250000,
1558 .frequency_tolerance = 0,
1559 .caps =
1560 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1561 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1562 FE_CAN_QPSK | FE_CAN_QAM_16 |
1563 FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
1564 FE_CAN_TRANSMISSION_MODE_AUTO |
1565 FE_CAN_GUARD_INTERVAL_AUTO |
1566 FE_CAN_HIERARCHY_AUTO |
1567 FE_CAN_RECOVER |
1568 FE_CAN_MUTE_TS
1569 },
1570
1571 .release = af9013_release,
1572 .init = af9013_init,
1573 .sleep = af9013_sleep,
1574 .i2c_gate_ctrl = af9013_i2c_gate_ctrl,
1575
1576 .set_frontend = af9013_set_frontend,
1577 .get_frontend = af9013_get_frontend,
1578
1579 .get_tune_settings = af9013_get_tune_settings,
1580
1581 .read_status = af9013_read_status,
1582 .read_ber = af9013_read_ber,
1583 .read_signal_strength = af9013_read_signal_strength,
1584 .read_snr = af9013_read_snr,
1585 .read_ucblocks = af9013_read_ucblocks,
1586};
1587
1588module_param_named(debug, af9013_debug, int, 0644);
1589MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
1590
1591MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1592MODULE_DESCRIPTION("Afatech AF9013 DVB-T demodulator driver");
1593MODULE_LICENSE("GPL");