]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/media/dvb-frontends/drxk_hard.c
Merge tag 'stable/for-linus-4.1-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel...
[mirror_ubuntu-artful-kernel.git] / drivers / media / dvb-frontends / drxk_hard.c
1 /*
2 * drxk_hard: DRX-K DVB-C/T demodulator driver
3 *
4 * Copyright (C) 2010-2011 Digital Devices GmbH
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 only, as published by the Free Software Foundation.
9 *
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 * 02110-1301, USA
21 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
22 */
23
24 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
25
26 #include <linux/kernel.h>
27 #include <linux/module.h>
28 #include <linux/moduleparam.h>
29 #include <linux/init.h>
30 #include <linux/delay.h>
31 #include <linux/firmware.h>
32 #include <linux/i2c.h>
33 #include <linux/hardirq.h>
34 #include <asm/div64.h>
35
36 #include "dvb_frontend.h"
37 #include "drxk.h"
38 #include "drxk_hard.h"
39 #include "dvb_math.h"
40
41 static int power_down_dvbt(struct drxk_state *state, bool set_power_mode);
42 static int power_down_qam(struct drxk_state *state);
43 static int set_dvbt_standard(struct drxk_state *state,
44 enum operation_mode o_mode);
45 static int set_qam_standard(struct drxk_state *state,
46 enum operation_mode o_mode);
47 static int set_qam(struct drxk_state *state, u16 intermediate_freqk_hz,
48 s32 tuner_freq_offset);
49 static int set_dvbt_standard(struct drxk_state *state,
50 enum operation_mode o_mode);
51 static int dvbt_start(struct drxk_state *state);
52 static int set_dvbt(struct drxk_state *state, u16 intermediate_freqk_hz,
53 s32 tuner_freq_offset);
54 static int get_qam_lock_status(struct drxk_state *state, u32 *p_lock_status);
55 static int get_dvbt_lock_status(struct drxk_state *state, u32 *p_lock_status);
56 static int switch_antenna_to_qam(struct drxk_state *state);
57 static int switch_antenna_to_dvbt(struct drxk_state *state);
58
59 static bool is_dvbt(struct drxk_state *state)
60 {
61 return state->m_operation_mode == OM_DVBT;
62 }
63
64 static bool is_qam(struct drxk_state *state)
65 {
66 return state->m_operation_mode == OM_QAM_ITU_A ||
67 state->m_operation_mode == OM_QAM_ITU_B ||
68 state->m_operation_mode == OM_QAM_ITU_C;
69 }
70
71 #define NOA1ROM 0
72
73 #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0)
74 #define DRXDAP_FASI_LONG_FORMAT(addr) (((addr) & 0xFC30FF80) != 0)
75
76 #define DEFAULT_MER_83 165
77 #define DEFAULT_MER_93 250
78
79 #ifndef DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
80 #define DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH (0x02)
81 #endif
82
83 #ifndef DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
84 #define DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH (0x03)
85 #endif
86
87 #define DEFAULT_DRXK_MPEG_LOCK_TIMEOUT 700
88 #define DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT 500
89
90 #ifndef DRXK_KI_RAGC_ATV
91 #define DRXK_KI_RAGC_ATV 4
92 #endif
93 #ifndef DRXK_KI_IAGC_ATV
94 #define DRXK_KI_IAGC_ATV 6
95 #endif
96 #ifndef DRXK_KI_DAGC_ATV
97 #define DRXK_KI_DAGC_ATV 7
98 #endif
99
100 #ifndef DRXK_KI_RAGC_QAM
101 #define DRXK_KI_RAGC_QAM 3
102 #endif
103 #ifndef DRXK_KI_IAGC_QAM
104 #define DRXK_KI_IAGC_QAM 4
105 #endif
106 #ifndef DRXK_KI_DAGC_QAM
107 #define DRXK_KI_DAGC_QAM 7
108 #endif
109 #ifndef DRXK_KI_RAGC_DVBT
110 #define DRXK_KI_RAGC_DVBT (IsA1WithPatchCode(state) ? 3 : 2)
111 #endif
112 #ifndef DRXK_KI_IAGC_DVBT
113 #define DRXK_KI_IAGC_DVBT (IsA1WithPatchCode(state) ? 4 : 2)
114 #endif
115 #ifndef DRXK_KI_DAGC_DVBT
116 #define DRXK_KI_DAGC_DVBT (IsA1WithPatchCode(state) ? 10 : 7)
117 #endif
118
119 #ifndef DRXK_AGC_DAC_OFFSET
120 #define DRXK_AGC_DAC_OFFSET (0x800)
121 #endif
122
123 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
124 #define DRXK_BANDWIDTH_8MHZ_IN_HZ (0x8B8249L)
125 #endif
126
127 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
128 #define DRXK_BANDWIDTH_7MHZ_IN_HZ (0x7A1200L)
129 #endif
130
131 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
132 #define DRXK_BANDWIDTH_6MHZ_IN_HZ (0x68A1B6L)
133 #endif
134
135 #ifndef DRXK_QAM_SYMBOLRATE_MAX
136 #define DRXK_QAM_SYMBOLRATE_MAX (7233000)
137 #endif
138
139 #define DRXK_BL_ROM_OFFSET_TAPS_DVBT 56
140 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_A 64
141 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_C 0x5FE0
142 #define DRXK_BL_ROM_OFFSET_TAPS_BG 24
143 #define DRXK_BL_ROM_OFFSET_TAPS_DKILLP 32
144 #define DRXK_BL_ROM_OFFSET_TAPS_NTSC 40
145 #define DRXK_BL_ROM_OFFSET_TAPS_FM 48
146 #define DRXK_BL_ROM_OFFSET_UCODE 0
147
148 #define DRXK_BLC_TIMEOUT 100
149
150 #define DRXK_BLCC_NR_ELEMENTS_TAPS 2
151 #define DRXK_BLCC_NR_ELEMENTS_UCODE 6
152
153 #define DRXK_BLDC_NR_ELEMENTS_TAPS 28
154
155 #ifndef DRXK_OFDM_NE_NOTCH_WIDTH
156 #define DRXK_OFDM_NE_NOTCH_WIDTH (4)
157 #endif
158
159 #define DRXK_QAM_SL_SIG_POWER_QAM16 (40960)
160 #define DRXK_QAM_SL_SIG_POWER_QAM32 (20480)
161 #define DRXK_QAM_SL_SIG_POWER_QAM64 (43008)
162 #define DRXK_QAM_SL_SIG_POWER_QAM128 (20992)
163 #define DRXK_QAM_SL_SIG_POWER_QAM256 (43520)
164
165 static unsigned int debug;
166 module_param(debug, int, 0644);
167 MODULE_PARM_DESC(debug, "enable debug messages");
168
169 #define dprintk(level, fmt, arg...) do { \
170 if (debug >= level) \
171 printk(KERN_DEBUG KBUILD_MODNAME ": %s " fmt, __func__, ##arg); \
172 } while (0)
173
174
175 static inline u32 MulDiv32(u32 a, u32 b, u32 c)
176 {
177 u64 tmp64;
178
179 tmp64 = (u64) a * (u64) b;
180 do_div(tmp64, c);
181
182 return (u32) tmp64;
183 }
184
185 static inline u32 Frac28a(u32 a, u32 c)
186 {
187 int i = 0;
188 u32 Q1 = 0;
189 u32 R0 = 0;
190
191 R0 = (a % c) << 4; /* 32-28 == 4 shifts possible at max */
192 Q1 = a / c; /*
193 * integer part, only the 4 least significant
194 * bits will be visible in the result
195 */
196
197 /* division using radix 16, 7 nibbles in the result */
198 for (i = 0; i < 7; i++) {
199 Q1 = (Q1 << 4) | (R0 / c);
200 R0 = (R0 % c) << 4;
201 }
202 /* rounding */
203 if ((R0 >> 3) >= c)
204 Q1++;
205
206 return Q1;
207 }
208
209 static inline u32 log10times100(u32 value)
210 {
211 return (100L * intlog10(value)) >> 24;
212 }
213
214 /****************************************************************************/
215 /* I2C **********************************************************************/
216 /****************************************************************************/
217
218 static int drxk_i2c_lock(struct drxk_state *state)
219 {
220 i2c_lock_adapter(state->i2c);
221 state->drxk_i2c_exclusive_lock = true;
222
223 return 0;
224 }
225
226 static void drxk_i2c_unlock(struct drxk_state *state)
227 {
228 if (!state->drxk_i2c_exclusive_lock)
229 return;
230
231 i2c_unlock_adapter(state->i2c);
232 state->drxk_i2c_exclusive_lock = false;
233 }
234
235 static int drxk_i2c_transfer(struct drxk_state *state, struct i2c_msg *msgs,
236 unsigned len)
237 {
238 if (state->drxk_i2c_exclusive_lock)
239 return __i2c_transfer(state->i2c, msgs, len);
240 else
241 return i2c_transfer(state->i2c, msgs, len);
242 }
243
244 static int i2c_read1(struct drxk_state *state, u8 adr, u8 *val)
245 {
246 struct i2c_msg msgs[1] = { {.addr = adr, .flags = I2C_M_RD,
247 .buf = val, .len = 1}
248 };
249
250 return drxk_i2c_transfer(state, msgs, 1);
251 }
252
253 static int i2c_write(struct drxk_state *state, u8 adr, u8 *data, int len)
254 {
255 int status;
256 struct i2c_msg msg = {
257 .addr = adr, .flags = 0, .buf = data, .len = len };
258
259 dprintk(3, ":");
260 if (debug > 2) {
261 int i;
262 for (i = 0; i < len; i++)
263 pr_cont(" %02x", data[i]);
264 pr_cont("\n");
265 }
266 status = drxk_i2c_transfer(state, &msg, 1);
267 if (status >= 0 && status != 1)
268 status = -EIO;
269
270 if (status < 0)
271 pr_err("i2c write error at addr 0x%02x\n", adr);
272
273 return status;
274 }
275
276 static int i2c_read(struct drxk_state *state,
277 u8 adr, u8 *msg, int len, u8 *answ, int alen)
278 {
279 int status;
280 struct i2c_msg msgs[2] = {
281 {.addr = adr, .flags = 0,
282 .buf = msg, .len = len},
283 {.addr = adr, .flags = I2C_M_RD,
284 .buf = answ, .len = alen}
285 };
286
287 status = drxk_i2c_transfer(state, msgs, 2);
288 if (status != 2) {
289 if (debug > 2)
290 pr_cont(": ERROR!\n");
291 if (status >= 0)
292 status = -EIO;
293
294 pr_err("i2c read error at addr 0x%02x\n", adr);
295 return status;
296 }
297 if (debug > 2) {
298 int i;
299 dprintk(2, ": read from");
300 for (i = 0; i < len; i++)
301 pr_cont(" %02x", msg[i]);
302 pr_cont(", value = ");
303 for (i = 0; i < alen; i++)
304 pr_cont(" %02x", answ[i]);
305 pr_cont("\n");
306 }
307 return 0;
308 }
309
310 static int read16_flags(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
311 {
312 int status;
313 u8 adr = state->demod_address, mm1[4], mm2[2], len;
314
315 if (state->single_master)
316 flags |= 0xC0;
317
318 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
319 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
320 mm1[1] = ((reg >> 16) & 0xFF);
321 mm1[2] = ((reg >> 24) & 0xFF) | flags;
322 mm1[3] = ((reg >> 7) & 0xFF);
323 len = 4;
324 } else {
325 mm1[0] = ((reg << 1) & 0xFF);
326 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
327 len = 2;
328 }
329 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
330 status = i2c_read(state, adr, mm1, len, mm2, 2);
331 if (status < 0)
332 return status;
333 if (data)
334 *data = mm2[0] | (mm2[1] << 8);
335
336 return 0;
337 }
338
339 static int read16(struct drxk_state *state, u32 reg, u16 *data)
340 {
341 return read16_flags(state, reg, data, 0);
342 }
343
344 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
345 {
346 int status;
347 u8 adr = state->demod_address, mm1[4], mm2[4], len;
348
349 if (state->single_master)
350 flags |= 0xC0;
351
352 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
353 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
354 mm1[1] = ((reg >> 16) & 0xFF);
355 mm1[2] = ((reg >> 24) & 0xFF) | flags;
356 mm1[3] = ((reg >> 7) & 0xFF);
357 len = 4;
358 } else {
359 mm1[0] = ((reg << 1) & 0xFF);
360 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
361 len = 2;
362 }
363 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
364 status = i2c_read(state, adr, mm1, len, mm2, 4);
365 if (status < 0)
366 return status;
367 if (data)
368 *data = mm2[0] | (mm2[1] << 8) |
369 (mm2[2] << 16) | (mm2[3] << 24);
370
371 return 0;
372 }
373
374 static int read32(struct drxk_state *state, u32 reg, u32 *data)
375 {
376 return read32_flags(state, reg, data, 0);
377 }
378
379 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
380 {
381 u8 adr = state->demod_address, mm[6], len;
382
383 if (state->single_master)
384 flags |= 0xC0;
385 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
386 mm[0] = (((reg << 1) & 0xFF) | 0x01);
387 mm[1] = ((reg >> 16) & 0xFF);
388 mm[2] = ((reg >> 24) & 0xFF) | flags;
389 mm[3] = ((reg >> 7) & 0xFF);
390 len = 4;
391 } else {
392 mm[0] = ((reg << 1) & 0xFF);
393 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
394 len = 2;
395 }
396 mm[len] = data & 0xff;
397 mm[len + 1] = (data >> 8) & 0xff;
398
399 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
400 return i2c_write(state, adr, mm, len + 2);
401 }
402
403 static int write16(struct drxk_state *state, u32 reg, u16 data)
404 {
405 return write16_flags(state, reg, data, 0);
406 }
407
408 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
409 {
410 u8 adr = state->demod_address, mm[8], len;
411
412 if (state->single_master)
413 flags |= 0xC0;
414 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
415 mm[0] = (((reg << 1) & 0xFF) | 0x01);
416 mm[1] = ((reg >> 16) & 0xFF);
417 mm[2] = ((reg >> 24) & 0xFF) | flags;
418 mm[3] = ((reg >> 7) & 0xFF);
419 len = 4;
420 } else {
421 mm[0] = ((reg << 1) & 0xFF);
422 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
423 len = 2;
424 }
425 mm[len] = data & 0xff;
426 mm[len + 1] = (data >> 8) & 0xff;
427 mm[len + 2] = (data >> 16) & 0xff;
428 mm[len + 3] = (data >> 24) & 0xff;
429 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
430
431 return i2c_write(state, adr, mm, len + 4);
432 }
433
434 static int write32(struct drxk_state *state, u32 reg, u32 data)
435 {
436 return write32_flags(state, reg, data, 0);
437 }
438
439 static int write_block(struct drxk_state *state, u32 address,
440 const int block_size, const u8 p_block[])
441 {
442 int status = 0, blk_size = block_size;
443 u8 flags = 0;
444
445 if (state->single_master)
446 flags |= 0xC0;
447
448 while (blk_size > 0) {
449 int chunk = blk_size > state->m_chunk_size ?
450 state->m_chunk_size : blk_size;
451 u8 *adr_buf = &state->chunk[0];
452 u32 adr_length = 0;
453
454 if (DRXDAP_FASI_LONG_FORMAT(address) || (flags != 0)) {
455 adr_buf[0] = (((address << 1) & 0xFF) | 0x01);
456 adr_buf[1] = ((address >> 16) & 0xFF);
457 adr_buf[2] = ((address >> 24) & 0xFF);
458 adr_buf[3] = ((address >> 7) & 0xFF);
459 adr_buf[2] |= flags;
460 adr_length = 4;
461 if (chunk == state->m_chunk_size)
462 chunk -= 2;
463 } else {
464 adr_buf[0] = ((address << 1) & 0xFF);
465 adr_buf[1] = (((address >> 16) & 0x0F) |
466 ((address >> 18) & 0xF0));
467 adr_length = 2;
468 }
469 memcpy(&state->chunk[adr_length], p_block, chunk);
470 dprintk(2, "(0x%08x, 0x%02x)\n", address, flags);
471 if (debug > 1) {
472 int i;
473 if (p_block)
474 for (i = 0; i < chunk; i++)
475 pr_cont(" %02x", p_block[i]);
476 pr_cont("\n");
477 }
478 status = i2c_write(state, state->demod_address,
479 &state->chunk[0], chunk + adr_length);
480 if (status < 0) {
481 pr_err("%s: i2c write error at addr 0x%02x\n",
482 __func__, address);
483 break;
484 }
485 p_block += chunk;
486 address += (chunk >> 1);
487 blk_size -= chunk;
488 }
489 return status;
490 }
491
492 #ifndef DRXK_MAX_RETRIES_POWERUP
493 #define DRXK_MAX_RETRIES_POWERUP 20
494 #endif
495
496 static int power_up_device(struct drxk_state *state)
497 {
498 int status;
499 u8 data = 0;
500 u16 retry_count = 0;
501
502 dprintk(1, "\n");
503
504 status = i2c_read1(state, state->demod_address, &data);
505 if (status < 0) {
506 do {
507 data = 0;
508 status = i2c_write(state, state->demod_address,
509 &data, 1);
510 usleep_range(10000, 11000);
511 retry_count++;
512 if (status < 0)
513 continue;
514 status = i2c_read1(state, state->demod_address,
515 &data);
516 } while (status < 0 &&
517 (retry_count < DRXK_MAX_RETRIES_POWERUP));
518 if (status < 0 && retry_count >= DRXK_MAX_RETRIES_POWERUP)
519 goto error;
520 }
521
522 /* Make sure all clk domains are active */
523 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
524 if (status < 0)
525 goto error;
526 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
527 if (status < 0)
528 goto error;
529 /* Enable pll lock tests */
530 status = write16(state, SIO_CC_PLL_LOCK__A, 1);
531 if (status < 0)
532 goto error;
533
534 state->m_current_power_mode = DRX_POWER_UP;
535
536 error:
537 if (status < 0)
538 pr_err("Error %d on %s\n", status, __func__);
539
540 return status;
541 }
542
543
544 static int init_state(struct drxk_state *state)
545 {
546 /*
547 * FIXME: most (all?) of the values bellow should be moved into
548 * struct drxk_config, as they are probably board-specific
549 */
550 u32 ul_vsb_if_agc_mode = DRXK_AGC_CTRL_AUTO;
551 u32 ul_vsb_if_agc_output_level = 0;
552 u32 ul_vsb_if_agc_min_level = 0;
553 u32 ul_vsb_if_agc_max_level = 0x7FFF;
554 u32 ul_vsb_if_agc_speed = 3;
555
556 u32 ul_vsb_rf_agc_mode = DRXK_AGC_CTRL_AUTO;
557 u32 ul_vsb_rf_agc_output_level = 0;
558 u32 ul_vsb_rf_agc_min_level = 0;
559 u32 ul_vsb_rf_agc_max_level = 0x7FFF;
560 u32 ul_vsb_rf_agc_speed = 3;
561 u32 ul_vsb_rf_agc_top = 9500;
562 u32 ul_vsb_rf_agc_cut_off_current = 4000;
563
564 u32 ul_atv_if_agc_mode = DRXK_AGC_CTRL_AUTO;
565 u32 ul_atv_if_agc_output_level = 0;
566 u32 ul_atv_if_agc_min_level = 0;
567 u32 ul_atv_if_agc_max_level = 0;
568 u32 ul_atv_if_agc_speed = 3;
569
570 u32 ul_atv_rf_agc_mode = DRXK_AGC_CTRL_OFF;
571 u32 ul_atv_rf_agc_output_level = 0;
572 u32 ul_atv_rf_agc_min_level = 0;
573 u32 ul_atv_rf_agc_max_level = 0;
574 u32 ul_atv_rf_agc_top = 9500;
575 u32 ul_atv_rf_agc_cut_off_current = 4000;
576 u32 ul_atv_rf_agc_speed = 3;
577
578 u32 ulQual83 = DEFAULT_MER_83;
579 u32 ulQual93 = DEFAULT_MER_93;
580
581 u32 ul_mpeg_lock_time_out = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
582 u32 ul_demod_lock_time_out = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
583
584 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
585 /* io_pad_cfg_mode output mode is drive always */
586 /* io_pad_cfg_drive is set to power 2 (23 mA) */
587 u32 ul_gpio_cfg = 0x0113;
588 u32 ul_invert_ts_clock = 0;
589 u32 ul_ts_data_strength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
590 u32 ul_dvbt_bitrate = 50000000;
591 u32 ul_dvbc_bitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
592
593 u32 ul_insert_rs_byte = 0;
594
595 u32 ul_rf_mirror = 1;
596 u32 ul_power_down = 0;
597
598 dprintk(1, "\n");
599
600 state->m_has_lna = false;
601 state->m_has_dvbt = false;
602 state->m_has_dvbc = false;
603 state->m_has_atv = false;
604 state->m_has_oob = false;
605 state->m_has_audio = false;
606
607 if (!state->m_chunk_size)
608 state->m_chunk_size = 124;
609
610 state->m_osc_clock_freq = 0;
611 state->m_smart_ant_inverted = false;
612 state->m_b_p_down_open_bridge = false;
613
614 /* real system clock frequency in kHz */
615 state->m_sys_clock_freq = 151875;
616 /* Timing div, 250ns/Psys */
617 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
618 state->m_hi_cfg_timing_div = ((state->m_sys_clock_freq / 1000) *
619 HI_I2C_DELAY) / 1000;
620 /* Clipping */
621 if (state->m_hi_cfg_timing_div > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
622 state->m_hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
623 state->m_hi_cfg_wake_up_key = (state->demod_address << 1);
624 /* port/bridge/power down ctrl */
625 state->m_hi_cfg_ctrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
626
627 state->m_b_power_down = (ul_power_down != 0);
628
629 state->m_drxk_a3_patch_code = false;
630
631 /* Init AGC and PGA parameters */
632 /* VSB IF */
633 state->m_vsb_if_agc_cfg.ctrl_mode = ul_vsb_if_agc_mode;
634 state->m_vsb_if_agc_cfg.output_level = ul_vsb_if_agc_output_level;
635 state->m_vsb_if_agc_cfg.min_output_level = ul_vsb_if_agc_min_level;
636 state->m_vsb_if_agc_cfg.max_output_level = ul_vsb_if_agc_max_level;
637 state->m_vsb_if_agc_cfg.speed = ul_vsb_if_agc_speed;
638 state->m_vsb_pga_cfg = 140;
639
640 /* VSB RF */
641 state->m_vsb_rf_agc_cfg.ctrl_mode = ul_vsb_rf_agc_mode;
642 state->m_vsb_rf_agc_cfg.output_level = ul_vsb_rf_agc_output_level;
643 state->m_vsb_rf_agc_cfg.min_output_level = ul_vsb_rf_agc_min_level;
644 state->m_vsb_rf_agc_cfg.max_output_level = ul_vsb_rf_agc_max_level;
645 state->m_vsb_rf_agc_cfg.speed = ul_vsb_rf_agc_speed;
646 state->m_vsb_rf_agc_cfg.top = ul_vsb_rf_agc_top;
647 state->m_vsb_rf_agc_cfg.cut_off_current = ul_vsb_rf_agc_cut_off_current;
648 state->m_vsb_pre_saw_cfg.reference = 0x07;
649 state->m_vsb_pre_saw_cfg.use_pre_saw = true;
650
651 state->m_Quality83percent = DEFAULT_MER_83;
652 state->m_Quality93percent = DEFAULT_MER_93;
653 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
654 state->m_Quality83percent = ulQual83;
655 state->m_Quality93percent = ulQual93;
656 }
657
658 /* ATV IF */
659 state->m_atv_if_agc_cfg.ctrl_mode = ul_atv_if_agc_mode;
660 state->m_atv_if_agc_cfg.output_level = ul_atv_if_agc_output_level;
661 state->m_atv_if_agc_cfg.min_output_level = ul_atv_if_agc_min_level;
662 state->m_atv_if_agc_cfg.max_output_level = ul_atv_if_agc_max_level;
663 state->m_atv_if_agc_cfg.speed = ul_atv_if_agc_speed;
664
665 /* ATV RF */
666 state->m_atv_rf_agc_cfg.ctrl_mode = ul_atv_rf_agc_mode;
667 state->m_atv_rf_agc_cfg.output_level = ul_atv_rf_agc_output_level;
668 state->m_atv_rf_agc_cfg.min_output_level = ul_atv_rf_agc_min_level;
669 state->m_atv_rf_agc_cfg.max_output_level = ul_atv_rf_agc_max_level;
670 state->m_atv_rf_agc_cfg.speed = ul_atv_rf_agc_speed;
671 state->m_atv_rf_agc_cfg.top = ul_atv_rf_agc_top;
672 state->m_atv_rf_agc_cfg.cut_off_current = ul_atv_rf_agc_cut_off_current;
673 state->m_atv_pre_saw_cfg.reference = 0x04;
674 state->m_atv_pre_saw_cfg.use_pre_saw = true;
675
676
677 /* DVBT RF */
678 state->m_dvbt_rf_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_OFF;
679 state->m_dvbt_rf_agc_cfg.output_level = 0;
680 state->m_dvbt_rf_agc_cfg.min_output_level = 0;
681 state->m_dvbt_rf_agc_cfg.max_output_level = 0xFFFF;
682 state->m_dvbt_rf_agc_cfg.top = 0x2100;
683 state->m_dvbt_rf_agc_cfg.cut_off_current = 4000;
684 state->m_dvbt_rf_agc_cfg.speed = 1;
685
686
687 /* DVBT IF */
688 state->m_dvbt_if_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_AUTO;
689 state->m_dvbt_if_agc_cfg.output_level = 0;
690 state->m_dvbt_if_agc_cfg.min_output_level = 0;
691 state->m_dvbt_if_agc_cfg.max_output_level = 9000;
692 state->m_dvbt_if_agc_cfg.top = 13424;
693 state->m_dvbt_if_agc_cfg.cut_off_current = 0;
694 state->m_dvbt_if_agc_cfg.speed = 3;
695 state->m_dvbt_if_agc_cfg.fast_clip_ctrl_delay = 30;
696 state->m_dvbt_if_agc_cfg.ingain_tgt_max = 30000;
697 /* state->m_dvbtPgaCfg = 140; */
698
699 state->m_dvbt_pre_saw_cfg.reference = 4;
700 state->m_dvbt_pre_saw_cfg.use_pre_saw = false;
701
702 /* QAM RF */
703 state->m_qam_rf_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_OFF;
704 state->m_qam_rf_agc_cfg.output_level = 0;
705 state->m_qam_rf_agc_cfg.min_output_level = 6023;
706 state->m_qam_rf_agc_cfg.max_output_level = 27000;
707 state->m_qam_rf_agc_cfg.top = 0x2380;
708 state->m_qam_rf_agc_cfg.cut_off_current = 4000;
709 state->m_qam_rf_agc_cfg.speed = 3;
710
711 /* QAM IF */
712 state->m_qam_if_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_AUTO;
713 state->m_qam_if_agc_cfg.output_level = 0;
714 state->m_qam_if_agc_cfg.min_output_level = 0;
715 state->m_qam_if_agc_cfg.max_output_level = 9000;
716 state->m_qam_if_agc_cfg.top = 0x0511;
717 state->m_qam_if_agc_cfg.cut_off_current = 0;
718 state->m_qam_if_agc_cfg.speed = 3;
719 state->m_qam_if_agc_cfg.ingain_tgt_max = 5119;
720 state->m_qam_if_agc_cfg.fast_clip_ctrl_delay = 50;
721
722 state->m_qam_pga_cfg = 140;
723 state->m_qam_pre_saw_cfg.reference = 4;
724 state->m_qam_pre_saw_cfg.use_pre_saw = false;
725
726 state->m_operation_mode = OM_NONE;
727 state->m_drxk_state = DRXK_UNINITIALIZED;
728
729 /* MPEG output configuration */
730 state->m_enable_mpeg_output = true; /* If TRUE; enable MPEG ouput */
731 state->m_insert_rs_byte = false; /* If TRUE; insert RS byte */
732 state->m_invert_data = false; /* If TRUE; invert DATA signals */
733 state->m_invert_err = false; /* If TRUE; invert ERR signal */
734 state->m_invert_str = false; /* If TRUE; invert STR signals */
735 state->m_invert_val = false; /* If TRUE; invert VAL signals */
736 state->m_invert_clk = (ul_invert_ts_clock != 0); /* If TRUE; invert CLK signals */
737
738 /* If TRUE; static MPEG clockrate will be used;
739 otherwise clockrate will adapt to the bitrate of the TS */
740
741 state->m_dvbt_bitrate = ul_dvbt_bitrate;
742 state->m_dvbc_bitrate = ul_dvbc_bitrate;
743
744 state->m_ts_data_strength = (ul_ts_data_strength & 0x07);
745
746 /* Maximum bitrate in b/s in case static clockrate is selected */
747 state->m_mpeg_ts_static_bitrate = 19392658;
748 state->m_disable_te_ihandling = false;
749
750 if (ul_insert_rs_byte)
751 state->m_insert_rs_byte = true;
752
753 state->m_mpeg_lock_time_out = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
754 if (ul_mpeg_lock_time_out < 10000)
755 state->m_mpeg_lock_time_out = ul_mpeg_lock_time_out;
756 state->m_demod_lock_time_out = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
757 if (ul_demod_lock_time_out < 10000)
758 state->m_demod_lock_time_out = ul_demod_lock_time_out;
759
760 /* QAM defaults */
761 state->m_constellation = DRX_CONSTELLATION_AUTO;
762 state->m_qam_interleave_mode = DRXK_QAM_I12_J17;
763 state->m_fec_rs_plen = 204 * 8; /* fecRsPlen annex A */
764 state->m_fec_rs_prescale = 1;
765
766 state->m_sqi_speed = DRXK_DVBT_SQI_SPEED_MEDIUM;
767 state->m_agcfast_clip_ctrl_delay = 0;
768
769 state->m_gpio_cfg = ul_gpio_cfg;
770
771 state->m_b_power_down = false;
772 state->m_current_power_mode = DRX_POWER_DOWN;
773
774 state->m_rfmirror = (ul_rf_mirror == 0);
775 state->m_if_agc_pol = false;
776 return 0;
777 }
778
779 static int drxx_open(struct drxk_state *state)
780 {
781 int status = 0;
782 u32 jtag = 0;
783 u16 bid = 0;
784 u16 key = 0;
785
786 dprintk(1, "\n");
787 /* stop lock indicator process */
788 status = write16(state, SCU_RAM_GPIO__A,
789 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
790 if (status < 0)
791 goto error;
792 /* Check device id */
793 status = read16(state, SIO_TOP_COMM_KEY__A, &key);
794 if (status < 0)
795 goto error;
796 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
797 if (status < 0)
798 goto error;
799 status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
800 if (status < 0)
801 goto error;
802 status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
803 if (status < 0)
804 goto error;
805 status = write16(state, SIO_TOP_COMM_KEY__A, key);
806 error:
807 if (status < 0)
808 pr_err("Error %d on %s\n", status, __func__);
809 return status;
810 }
811
812 static int get_device_capabilities(struct drxk_state *state)
813 {
814 u16 sio_pdr_ohw_cfg = 0;
815 u32 sio_top_jtagid_lo = 0;
816 int status;
817 const char *spin = "";
818
819 dprintk(1, "\n");
820
821 /* driver 0.9.0 */
822 /* stop lock indicator process */
823 status = write16(state, SCU_RAM_GPIO__A,
824 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
825 if (status < 0)
826 goto error;
827 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
828 if (status < 0)
829 goto error;
830 status = read16(state, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg);
831 if (status < 0)
832 goto error;
833 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
834 if (status < 0)
835 goto error;
836
837 switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
838 case 0:
839 /* ignore (bypass ?) */
840 break;
841 case 1:
842 /* 27 MHz */
843 state->m_osc_clock_freq = 27000;
844 break;
845 case 2:
846 /* 20.25 MHz */
847 state->m_osc_clock_freq = 20250;
848 break;
849 case 3:
850 /* 4 MHz */
851 state->m_osc_clock_freq = 20250;
852 break;
853 default:
854 pr_err("Clock Frequency is unknown\n");
855 return -EINVAL;
856 }
857 /*
858 Determine device capabilities
859 Based on pinning v14
860 */
861 status = read32(state, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo);
862 if (status < 0)
863 goto error;
864
865 pr_info("status = 0x%08x\n", sio_top_jtagid_lo);
866
867 /* driver 0.9.0 */
868 switch ((sio_top_jtagid_lo >> 29) & 0xF) {
869 case 0:
870 state->m_device_spin = DRXK_SPIN_A1;
871 spin = "A1";
872 break;
873 case 2:
874 state->m_device_spin = DRXK_SPIN_A2;
875 spin = "A2";
876 break;
877 case 3:
878 state->m_device_spin = DRXK_SPIN_A3;
879 spin = "A3";
880 break;
881 default:
882 state->m_device_spin = DRXK_SPIN_UNKNOWN;
883 status = -EINVAL;
884 pr_err("Spin %d unknown\n", (sio_top_jtagid_lo >> 29) & 0xF);
885 goto error2;
886 }
887 switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
888 case 0x13:
889 /* typeId = DRX3913K_TYPE_ID */
890 state->m_has_lna = false;
891 state->m_has_oob = false;
892 state->m_has_atv = false;
893 state->m_has_audio = false;
894 state->m_has_dvbt = true;
895 state->m_has_dvbc = true;
896 state->m_has_sawsw = true;
897 state->m_has_gpio2 = false;
898 state->m_has_gpio1 = false;
899 state->m_has_irqn = false;
900 break;
901 case 0x15:
902 /* typeId = DRX3915K_TYPE_ID */
903 state->m_has_lna = false;
904 state->m_has_oob = false;
905 state->m_has_atv = true;
906 state->m_has_audio = false;
907 state->m_has_dvbt = true;
908 state->m_has_dvbc = false;
909 state->m_has_sawsw = true;
910 state->m_has_gpio2 = true;
911 state->m_has_gpio1 = true;
912 state->m_has_irqn = false;
913 break;
914 case 0x16:
915 /* typeId = DRX3916K_TYPE_ID */
916 state->m_has_lna = false;
917 state->m_has_oob = false;
918 state->m_has_atv = true;
919 state->m_has_audio = false;
920 state->m_has_dvbt = true;
921 state->m_has_dvbc = false;
922 state->m_has_sawsw = true;
923 state->m_has_gpio2 = true;
924 state->m_has_gpio1 = true;
925 state->m_has_irqn = false;
926 break;
927 case 0x18:
928 /* typeId = DRX3918K_TYPE_ID */
929 state->m_has_lna = false;
930 state->m_has_oob = false;
931 state->m_has_atv = true;
932 state->m_has_audio = true;
933 state->m_has_dvbt = true;
934 state->m_has_dvbc = false;
935 state->m_has_sawsw = true;
936 state->m_has_gpio2 = true;
937 state->m_has_gpio1 = true;
938 state->m_has_irqn = false;
939 break;
940 case 0x21:
941 /* typeId = DRX3921K_TYPE_ID */
942 state->m_has_lna = false;
943 state->m_has_oob = false;
944 state->m_has_atv = true;
945 state->m_has_audio = true;
946 state->m_has_dvbt = true;
947 state->m_has_dvbc = true;
948 state->m_has_sawsw = true;
949 state->m_has_gpio2 = true;
950 state->m_has_gpio1 = true;
951 state->m_has_irqn = false;
952 break;
953 case 0x23:
954 /* typeId = DRX3923K_TYPE_ID */
955 state->m_has_lna = false;
956 state->m_has_oob = false;
957 state->m_has_atv = true;
958 state->m_has_audio = true;
959 state->m_has_dvbt = true;
960 state->m_has_dvbc = true;
961 state->m_has_sawsw = true;
962 state->m_has_gpio2 = true;
963 state->m_has_gpio1 = true;
964 state->m_has_irqn = false;
965 break;
966 case 0x25:
967 /* typeId = DRX3925K_TYPE_ID */
968 state->m_has_lna = false;
969 state->m_has_oob = false;
970 state->m_has_atv = true;
971 state->m_has_audio = true;
972 state->m_has_dvbt = true;
973 state->m_has_dvbc = true;
974 state->m_has_sawsw = true;
975 state->m_has_gpio2 = true;
976 state->m_has_gpio1 = true;
977 state->m_has_irqn = false;
978 break;
979 case 0x26:
980 /* typeId = DRX3926K_TYPE_ID */
981 state->m_has_lna = false;
982 state->m_has_oob = false;
983 state->m_has_atv = true;
984 state->m_has_audio = false;
985 state->m_has_dvbt = true;
986 state->m_has_dvbc = true;
987 state->m_has_sawsw = true;
988 state->m_has_gpio2 = true;
989 state->m_has_gpio1 = true;
990 state->m_has_irqn = false;
991 break;
992 default:
993 pr_err("DeviceID 0x%02x not supported\n",
994 ((sio_top_jtagid_lo >> 12) & 0xFF));
995 status = -EINVAL;
996 goto error2;
997 }
998
999 pr_info("detected a drx-39%02xk, spin %s, xtal %d.%03d MHz\n",
1000 ((sio_top_jtagid_lo >> 12) & 0xFF), spin,
1001 state->m_osc_clock_freq / 1000,
1002 state->m_osc_clock_freq % 1000);
1003
1004 error:
1005 if (status < 0)
1006 pr_err("Error %d on %s\n", status, __func__);
1007
1008 error2:
1009 return status;
1010 }
1011
1012 static int hi_command(struct drxk_state *state, u16 cmd, u16 *p_result)
1013 {
1014 int status;
1015 bool powerdown_cmd;
1016
1017 dprintk(1, "\n");
1018
1019 /* Write command */
1020 status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
1021 if (status < 0)
1022 goto error;
1023 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
1024 usleep_range(1000, 2000);
1025
1026 powerdown_cmd =
1027 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1028 ((state->m_hi_cfg_ctrl) &
1029 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1030 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1031 if (!powerdown_cmd) {
1032 /* Wait until command rdy */
1033 u32 retry_count = 0;
1034 u16 wait_cmd;
1035
1036 do {
1037 usleep_range(1000, 2000);
1038 retry_count += 1;
1039 status = read16(state, SIO_HI_RA_RAM_CMD__A,
1040 &wait_cmd);
1041 } while ((status < 0) && (retry_count < DRXK_MAX_RETRIES)
1042 && (wait_cmd != 0));
1043 if (status < 0)
1044 goto error;
1045 status = read16(state, SIO_HI_RA_RAM_RES__A, p_result);
1046 }
1047 error:
1048 if (status < 0)
1049 pr_err("Error %d on %s\n", status, __func__);
1050
1051 return status;
1052 }
1053
1054 static int hi_cfg_command(struct drxk_state *state)
1055 {
1056 int status;
1057
1058 dprintk(1, "\n");
1059
1060 mutex_lock(&state->mutex);
1061
1062 status = write16(state, SIO_HI_RA_RAM_PAR_6__A,
1063 state->m_hi_cfg_timeout);
1064 if (status < 0)
1065 goto error;
1066 status = write16(state, SIO_HI_RA_RAM_PAR_5__A,
1067 state->m_hi_cfg_ctrl);
1068 if (status < 0)
1069 goto error;
1070 status = write16(state, SIO_HI_RA_RAM_PAR_4__A,
1071 state->m_hi_cfg_wake_up_key);
1072 if (status < 0)
1073 goto error;
1074 status = write16(state, SIO_HI_RA_RAM_PAR_3__A,
1075 state->m_hi_cfg_bridge_delay);
1076 if (status < 0)
1077 goto error;
1078 status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
1079 state->m_hi_cfg_timing_div);
1080 if (status < 0)
1081 goto error;
1082 status = write16(state, SIO_HI_RA_RAM_PAR_1__A,
1083 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1084 if (status < 0)
1085 goto error;
1086 status = hi_command(state, SIO_HI_RA_RAM_CMD_CONFIG, NULL);
1087 if (status < 0)
1088 goto error;
1089
1090 state->m_hi_cfg_ctrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1091 error:
1092 mutex_unlock(&state->mutex);
1093 if (status < 0)
1094 pr_err("Error %d on %s\n", status, __func__);
1095 return status;
1096 }
1097
1098 static int init_hi(struct drxk_state *state)
1099 {
1100 dprintk(1, "\n");
1101
1102 state->m_hi_cfg_wake_up_key = (state->demod_address << 1);
1103 state->m_hi_cfg_timeout = 0x96FF;
1104 /* port/bridge/power down ctrl */
1105 state->m_hi_cfg_ctrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1106
1107 return hi_cfg_command(state);
1108 }
1109
1110 static int mpegts_configure_pins(struct drxk_state *state, bool mpeg_enable)
1111 {
1112 int status = -1;
1113 u16 sio_pdr_mclk_cfg = 0;
1114 u16 sio_pdr_mdx_cfg = 0;
1115 u16 err_cfg = 0;
1116
1117 dprintk(1, ": mpeg %s, %s mode\n",
1118 mpeg_enable ? "enable" : "disable",
1119 state->m_enable_parallel ? "parallel" : "serial");
1120
1121 /* stop lock indicator process */
1122 status = write16(state, SCU_RAM_GPIO__A,
1123 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1124 if (status < 0)
1125 goto error;
1126
1127 /* MPEG TS pad configuration */
1128 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
1129 if (status < 0)
1130 goto error;
1131
1132 if (!mpeg_enable) {
1133 /* Set MPEG TS pads to inputmode */
1134 status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1135 if (status < 0)
1136 goto error;
1137 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1138 if (status < 0)
1139 goto error;
1140 status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1141 if (status < 0)
1142 goto error;
1143 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1144 if (status < 0)
1145 goto error;
1146 status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1147 if (status < 0)
1148 goto error;
1149 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1150 if (status < 0)
1151 goto error;
1152 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1153 if (status < 0)
1154 goto error;
1155 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1156 if (status < 0)
1157 goto error;
1158 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1159 if (status < 0)
1160 goto error;
1161 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1162 if (status < 0)
1163 goto error;
1164 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1165 if (status < 0)
1166 goto error;
1167 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1168 if (status < 0)
1169 goto error;
1170 } else {
1171 /* Enable MPEG output */
1172 sio_pdr_mdx_cfg =
1173 ((state->m_ts_data_strength <<
1174 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1175 sio_pdr_mclk_cfg = ((state->m_ts_clockk_strength <<
1176 SIO_PDR_MCLK_CFG_DRIVE__B) |
1177 0x0003);
1178
1179 status = write16(state, SIO_PDR_MSTRT_CFG__A, sio_pdr_mdx_cfg);
1180 if (status < 0)
1181 goto error;
1182
1183 if (state->enable_merr_cfg)
1184 err_cfg = sio_pdr_mdx_cfg;
1185
1186 status = write16(state, SIO_PDR_MERR_CFG__A, err_cfg);
1187 if (status < 0)
1188 goto error;
1189 status = write16(state, SIO_PDR_MVAL_CFG__A, err_cfg);
1190 if (status < 0)
1191 goto error;
1192
1193 if (state->m_enable_parallel) {
1194 /* parallel -> enable MD1 to MD7 */
1195 status = write16(state, SIO_PDR_MD1_CFG__A,
1196 sio_pdr_mdx_cfg);
1197 if (status < 0)
1198 goto error;
1199 status = write16(state, SIO_PDR_MD2_CFG__A,
1200 sio_pdr_mdx_cfg);
1201 if (status < 0)
1202 goto error;
1203 status = write16(state, SIO_PDR_MD3_CFG__A,
1204 sio_pdr_mdx_cfg);
1205 if (status < 0)
1206 goto error;
1207 status = write16(state, SIO_PDR_MD4_CFG__A,
1208 sio_pdr_mdx_cfg);
1209 if (status < 0)
1210 goto error;
1211 status = write16(state, SIO_PDR_MD5_CFG__A,
1212 sio_pdr_mdx_cfg);
1213 if (status < 0)
1214 goto error;
1215 status = write16(state, SIO_PDR_MD6_CFG__A,
1216 sio_pdr_mdx_cfg);
1217 if (status < 0)
1218 goto error;
1219 status = write16(state, SIO_PDR_MD7_CFG__A,
1220 sio_pdr_mdx_cfg);
1221 if (status < 0)
1222 goto error;
1223 } else {
1224 sio_pdr_mdx_cfg = ((state->m_ts_data_strength <<
1225 SIO_PDR_MD0_CFG_DRIVE__B)
1226 | 0x0003);
1227 /* serial -> disable MD1 to MD7 */
1228 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1229 if (status < 0)
1230 goto error;
1231 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1232 if (status < 0)
1233 goto error;
1234 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1235 if (status < 0)
1236 goto error;
1237 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1238 if (status < 0)
1239 goto error;
1240 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1241 if (status < 0)
1242 goto error;
1243 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1244 if (status < 0)
1245 goto error;
1246 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1247 if (status < 0)
1248 goto error;
1249 }
1250 status = write16(state, SIO_PDR_MCLK_CFG__A, sio_pdr_mclk_cfg);
1251 if (status < 0)
1252 goto error;
1253 status = write16(state, SIO_PDR_MD0_CFG__A, sio_pdr_mdx_cfg);
1254 if (status < 0)
1255 goto error;
1256 }
1257 /* Enable MB output over MPEG pads and ctl input */
1258 status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1259 if (status < 0)
1260 goto error;
1261 /* Write nomagic word to enable pdr reg write */
1262 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1263 error:
1264 if (status < 0)
1265 pr_err("Error %d on %s\n", status, __func__);
1266 return status;
1267 }
1268
1269 static int mpegts_disable(struct drxk_state *state)
1270 {
1271 dprintk(1, "\n");
1272
1273 return mpegts_configure_pins(state, false);
1274 }
1275
1276 static int bl_chain_cmd(struct drxk_state *state,
1277 u16 rom_offset, u16 nr_of_elements, u32 time_out)
1278 {
1279 u16 bl_status = 0;
1280 int status;
1281 unsigned long end;
1282
1283 dprintk(1, "\n");
1284 mutex_lock(&state->mutex);
1285 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1286 if (status < 0)
1287 goto error;
1288 status = write16(state, SIO_BL_CHAIN_ADDR__A, rom_offset);
1289 if (status < 0)
1290 goto error;
1291 status = write16(state, SIO_BL_CHAIN_LEN__A, nr_of_elements);
1292 if (status < 0)
1293 goto error;
1294 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1295 if (status < 0)
1296 goto error;
1297
1298 end = jiffies + msecs_to_jiffies(time_out);
1299 do {
1300 usleep_range(1000, 2000);
1301 status = read16(state, SIO_BL_STATUS__A, &bl_status);
1302 if (status < 0)
1303 goto error;
1304 } while ((bl_status == 0x1) &&
1305 ((time_is_after_jiffies(end))));
1306
1307 if (bl_status == 0x1) {
1308 pr_err("SIO not ready\n");
1309 status = -EINVAL;
1310 goto error2;
1311 }
1312 error:
1313 if (status < 0)
1314 pr_err("Error %d on %s\n", status, __func__);
1315 error2:
1316 mutex_unlock(&state->mutex);
1317 return status;
1318 }
1319
1320
1321 static int download_microcode(struct drxk_state *state,
1322 const u8 p_mc_image[], u32 length)
1323 {
1324 const u8 *p_src = p_mc_image;
1325 u32 address;
1326 u16 n_blocks;
1327 u16 block_size;
1328 u32 offset = 0;
1329 u32 i;
1330 int status = 0;
1331
1332 dprintk(1, "\n");
1333
1334 /* down the drain (we don't care about MAGIC_WORD) */
1335 #if 0
1336 /* For future reference */
1337 drain = (p_src[0] << 8) | p_src[1];
1338 #endif
1339 p_src += sizeof(u16);
1340 offset += sizeof(u16);
1341 n_blocks = (p_src[0] << 8) | p_src[1];
1342 p_src += sizeof(u16);
1343 offset += sizeof(u16);
1344
1345 for (i = 0; i < n_blocks; i += 1) {
1346 address = (p_src[0] << 24) | (p_src[1] << 16) |
1347 (p_src[2] << 8) | p_src[3];
1348 p_src += sizeof(u32);
1349 offset += sizeof(u32);
1350
1351 block_size = ((p_src[0] << 8) | p_src[1]) * sizeof(u16);
1352 p_src += sizeof(u16);
1353 offset += sizeof(u16);
1354
1355 #if 0
1356 /* For future reference */
1357 flags = (p_src[0] << 8) | p_src[1];
1358 #endif
1359 p_src += sizeof(u16);
1360 offset += sizeof(u16);
1361
1362 #if 0
1363 /* For future reference */
1364 block_crc = (p_src[0] << 8) | p_src[1];
1365 #endif
1366 p_src += sizeof(u16);
1367 offset += sizeof(u16);
1368
1369 if (offset + block_size > length) {
1370 pr_err("Firmware is corrupted.\n");
1371 return -EINVAL;
1372 }
1373
1374 status = write_block(state, address, block_size, p_src);
1375 if (status < 0) {
1376 pr_err("Error %d while loading firmware\n", status);
1377 break;
1378 }
1379 p_src += block_size;
1380 offset += block_size;
1381 }
1382 return status;
1383 }
1384
1385 static int dvbt_enable_ofdm_token_ring(struct drxk_state *state, bool enable)
1386 {
1387 int status;
1388 u16 data = 0;
1389 u16 desired_ctrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1390 u16 desired_status = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1391 unsigned long end;
1392
1393 dprintk(1, "\n");
1394
1395 if (!enable) {
1396 desired_ctrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1397 desired_status = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1398 }
1399
1400 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1401 if (status >= 0 && data == desired_status) {
1402 /* tokenring already has correct status */
1403 return status;
1404 }
1405 /* Disable/enable dvbt tokenring bridge */
1406 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desired_ctrl);
1407
1408 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1409 do {
1410 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1411 if ((status >= 0 && data == desired_status)
1412 || time_is_after_jiffies(end))
1413 break;
1414 usleep_range(1000, 2000);
1415 } while (1);
1416 if (data != desired_status) {
1417 pr_err("SIO not ready\n");
1418 return -EINVAL;
1419 }
1420 return status;
1421 }
1422
1423 static int mpegts_stop(struct drxk_state *state)
1424 {
1425 int status = 0;
1426 u16 fec_oc_snc_mode = 0;
1427 u16 fec_oc_ipr_mode = 0;
1428
1429 dprintk(1, "\n");
1430
1431 /* Graceful shutdown (byte boundaries) */
1432 status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
1433 if (status < 0)
1434 goto error;
1435 fec_oc_snc_mode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1436 status = write16(state, FEC_OC_SNC_MODE__A, fec_oc_snc_mode);
1437 if (status < 0)
1438 goto error;
1439
1440 /* Suppress MCLK during absence of data */
1441 status = read16(state, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode);
1442 if (status < 0)
1443 goto error;
1444 fec_oc_ipr_mode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1445 status = write16(state, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode);
1446
1447 error:
1448 if (status < 0)
1449 pr_err("Error %d on %s\n", status, __func__);
1450
1451 return status;
1452 }
1453
1454 static int scu_command(struct drxk_state *state,
1455 u16 cmd, u8 parameter_len,
1456 u16 *parameter, u8 result_len, u16 *result)
1457 {
1458 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1459 #error DRXK register mapping no longer compatible with this routine!
1460 #endif
1461 u16 cur_cmd = 0;
1462 int status = -EINVAL;
1463 unsigned long end;
1464 u8 buffer[34];
1465 int cnt = 0, ii;
1466 const char *p;
1467 char errname[30];
1468
1469 dprintk(1, "\n");
1470
1471 if ((cmd == 0) || ((parameter_len > 0) && (parameter == NULL)) ||
1472 ((result_len > 0) && (result == NULL))) {
1473 pr_err("Error %d on %s\n", status, __func__);
1474 return status;
1475 }
1476
1477 mutex_lock(&state->mutex);
1478
1479 /* assume that the command register is ready
1480 since it is checked afterwards */
1481 for (ii = parameter_len - 1; ii >= 0; ii -= 1) {
1482 buffer[cnt++] = (parameter[ii] & 0xFF);
1483 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1484 }
1485 buffer[cnt++] = (cmd & 0xFF);
1486 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1487
1488 write_block(state, SCU_RAM_PARAM_0__A -
1489 (parameter_len - 1), cnt, buffer);
1490 /* Wait until SCU has processed command */
1491 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1492 do {
1493 usleep_range(1000, 2000);
1494 status = read16(state, SCU_RAM_COMMAND__A, &cur_cmd);
1495 if (status < 0)
1496 goto error;
1497 } while (!(cur_cmd == DRX_SCU_READY) && (time_is_after_jiffies(end)));
1498 if (cur_cmd != DRX_SCU_READY) {
1499 pr_err("SCU not ready\n");
1500 status = -EIO;
1501 goto error2;
1502 }
1503 /* read results */
1504 if ((result_len > 0) && (result != NULL)) {
1505 s16 err;
1506 int ii;
1507
1508 for (ii = result_len - 1; ii >= 0; ii -= 1) {
1509 status = read16(state, SCU_RAM_PARAM_0__A - ii,
1510 &result[ii]);
1511 if (status < 0)
1512 goto error;
1513 }
1514
1515 /* Check if an error was reported by SCU */
1516 err = (s16)result[0];
1517 if (err >= 0)
1518 goto error;
1519
1520 /* check for the known error codes */
1521 switch (err) {
1522 case SCU_RESULT_UNKCMD:
1523 p = "SCU_RESULT_UNKCMD";
1524 break;
1525 case SCU_RESULT_UNKSTD:
1526 p = "SCU_RESULT_UNKSTD";
1527 break;
1528 case SCU_RESULT_SIZE:
1529 p = "SCU_RESULT_SIZE";
1530 break;
1531 case SCU_RESULT_INVPAR:
1532 p = "SCU_RESULT_INVPAR";
1533 break;
1534 default: /* Other negative values are errors */
1535 sprintf(errname, "ERROR: %d\n", err);
1536 p = errname;
1537 }
1538 pr_err("%s while sending cmd 0x%04x with params:", p, cmd);
1539 print_hex_dump_bytes("drxk: ", DUMP_PREFIX_NONE, buffer, cnt);
1540 status = -EINVAL;
1541 goto error2;
1542 }
1543
1544 error:
1545 if (status < 0)
1546 pr_err("Error %d on %s\n", status, __func__);
1547 error2:
1548 mutex_unlock(&state->mutex);
1549 return status;
1550 }
1551
1552 static int set_iqm_af(struct drxk_state *state, bool active)
1553 {
1554 u16 data = 0;
1555 int status;
1556
1557 dprintk(1, "\n");
1558
1559 /* Configure IQM */
1560 status = read16(state, IQM_AF_STDBY__A, &data);
1561 if (status < 0)
1562 goto error;
1563
1564 if (!active) {
1565 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1566 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1567 | IQM_AF_STDBY_STDBY_PD_STANDBY
1568 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1569 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1570 } else {
1571 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1572 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1573 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1574 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1575 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1576 );
1577 }
1578 status = write16(state, IQM_AF_STDBY__A, data);
1579
1580 error:
1581 if (status < 0)
1582 pr_err("Error %d on %s\n", status, __func__);
1583 return status;
1584 }
1585
1586 static int ctrl_power_mode(struct drxk_state *state, enum drx_power_mode *mode)
1587 {
1588 int status = 0;
1589 u16 sio_cc_pwd_mode = 0;
1590
1591 dprintk(1, "\n");
1592
1593 /* Check arguments */
1594 if (mode == NULL)
1595 return -EINVAL;
1596
1597 switch (*mode) {
1598 case DRX_POWER_UP:
1599 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
1600 break;
1601 case DRXK_POWER_DOWN_OFDM:
1602 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1603 break;
1604 case DRXK_POWER_DOWN_CORE:
1605 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1606 break;
1607 case DRXK_POWER_DOWN_PLL:
1608 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
1609 break;
1610 case DRX_POWER_DOWN:
1611 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
1612 break;
1613 default:
1614 /* Unknow sleep mode */
1615 return -EINVAL;
1616 }
1617
1618 /* If already in requested power mode, do nothing */
1619 if (state->m_current_power_mode == *mode)
1620 return 0;
1621
1622 /* For next steps make sure to start from DRX_POWER_UP mode */
1623 if (state->m_current_power_mode != DRX_POWER_UP) {
1624 status = power_up_device(state);
1625 if (status < 0)
1626 goto error;
1627 status = dvbt_enable_ofdm_token_ring(state, true);
1628 if (status < 0)
1629 goto error;
1630 }
1631
1632 if (*mode == DRX_POWER_UP) {
1633 /* Restore analog & pin configuartion */
1634 } else {
1635 /* Power down to requested mode */
1636 /* Backup some register settings */
1637 /* Set pins with possible pull-ups connected
1638 to them in input mode */
1639 /* Analog power down */
1640 /* ADC power down */
1641 /* Power down device */
1642 /* stop all comm_exec */
1643 /* Stop and power down previous standard */
1644 switch (state->m_operation_mode) {
1645 case OM_DVBT:
1646 status = mpegts_stop(state);
1647 if (status < 0)
1648 goto error;
1649 status = power_down_dvbt(state, false);
1650 if (status < 0)
1651 goto error;
1652 break;
1653 case OM_QAM_ITU_A:
1654 case OM_QAM_ITU_C:
1655 status = mpegts_stop(state);
1656 if (status < 0)
1657 goto error;
1658 status = power_down_qam(state);
1659 if (status < 0)
1660 goto error;
1661 break;
1662 default:
1663 break;
1664 }
1665 status = dvbt_enable_ofdm_token_ring(state, false);
1666 if (status < 0)
1667 goto error;
1668 status = write16(state, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode);
1669 if (status < 0)
1670 goto error;
1671 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1672 if (status < 0)
1673 goto error;
1674
1675 if (*mode != DRXK_POWER_DOWN_OFDM) {
1676 state->m_hi_cfg_ctrl |=
1677 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1678 status = hi_cfg_command(state);
1679 if (status < 0)
1680 goto error;
1681 }
1682 }
1683 state->m_current_power_mode = *mode;
1684
1685 error:
1686 if (status < 0)
1687 pr_err("Error %d on %s\n", status, __func__);
1688
1689 return status;
1690 }
1691
1692 static int power_down_dvbt(struct drxk_state *state, bool set_power_mode)
1693 {
1694 enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
1695 u16 cmd_result = 0;
1696 u16 data = 0;
1697 int status;
1698
1699 dprintk(1, "\n");
1700
1701 status = read16(state, SCU_COMM_EXEC__A, &data);
1702 if (status < 0)
1703 goto error;
1704 if (data == SCU_COMM_EXEC_ACTIVE) {
1705 /* Send OFDM stop command */
1706 status = scu_command(state,
1707 SCU_RAM_COMMAND_STANDARD_OFDM
1708 | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
1709 0, NULL, 1, &cmd_result);
1710 if (status < 0)
1711 goto error;
1712 /* Send OFDM reset command */
1713 status = scu_command(state,
1714 SCU_RAM_COMMAND_STANDARD_OFDM
1715 | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
1716 0, NULL, 1, &cmd_result);
1717 if (status < 0)
1718 goto error;
1719 }
1720
1721 /* Reset datapath for OFDM, processors first */
1722 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1723 if (status < 0)
1724 goto error;
1725 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1726 if (status < 0)
1727 goto error;
1728 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1729 if (status < 0)
1730 goto error;
1731
1732 /* powerdown AFE */
1733 status = set_iqm_af(state, false);
1734 if (status < 0)
1735 goto error;
1736
1737 /* powerdown to OFDM mode */
1738 if (set_power_mode) {
1739 status = ctrl_power_mode(state, &power_mode);
1740 if (status < 0)
1741 goto error;
1742 }
1743 error:
1744 if (status < 0)
1745 pr_err("Error %d on %s\n", status, __func__);
1746 return status;
1747 }
1748
1749 static int setoperation_mode(struct drxk_state *state,
1750 enum operation_mode o_mode)
1751 {
1752 int status = 0;
1753
1754 dprintk(1, "\n");
1755 /*
1756 Stop and power down previous standard
1757 TODO investigate total power down instead of partial
1758 power down depending on "previous" standard.
1759 */
1760
1761 /* disable HW lock indicator */
1762 status = write16(state, SCU_RAM_GPIO__A,
1763 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1764 if (status < 0)
1765 goto error;
1766
1767 /* Device is already at the required mode */
1768 if (state->m_operation_mode == o_mode)
1769 return 0;
1770
1771 switch (state->m_operation_mode) {
1772 /* OM_NONE was added for start up */
1773 case OM_NONE:
1774 break;
1775 case OM_DVBT:
1776 status = mpegts_stop(state);
1777 if (status < 0)
1778 goto error;
1779 status = power_down_dvbt(state, true);
1780 if (status < 0)
1781 goto error;
1782 state->m_operation_mode = OM_NONE;
1783 break;
1784 case OM_QAM_ITU_A: /* fallthrough */
1785 case OM_QAM_ITU_C:
1786 status = mpegts_stop(state);
1787 if (status < 0)
1788 goto error;
1789 status = power_down_qam(state);
1790 if (status < 0)
1791 goto error;
1792 state->m_operation_mode = OM_NONE;
1793 break;
1794 case OM_QAM_ITU_B:
1795 default:
1796 status = -EINVAL;
1797 goto error;
1798 }
1799
1800 /*
1801 Power up new standard
1802 */
1803 switch (o_mode) {
1804 case OM_DVBT:
1805 dprintk(1, ": DVB-T\n");
1806 state->m_operation_mode = o_mode;
1807 status = set_dvbt_standard(state, o_mode);
1808 if (status < 0)
1809 goto error;
1810 break;
1811 case OM_QAM_ITU_A: /* fallthrough */
1812 case OM_QAM_ITU_C:
1813 dprintk(1, ": DVB-C Annex %c\n",
1814 (state->m_operation_mode == OM_QAM_ITU_A) ? 'A' : 'C');
1815 state->m_operation_mode = o_mode;
1816 status = set_qam_standard(state, o_mode);
1817 if (status < 0)
1818 goto error;
1819 break;
1820 case OM_QAM_ITU_B:
1821 default:
1822 status = -EINVAL;
1823 }
1824 error:
1825 if (status < 0)
1826 pr_err("Error %d on %s\n", status, __func__);
1827 return status;
1828 }
1829
1830 static int start(struct drxk_state *state, s32 offset_freq,
1831 s32 intermediate_frequency)
1832 {
1833 int status = -EINVAL;
1834
1835 u16 i_freqk_hz;
1836 s32 offsetk_hz = offset_freq / 1000;
1837
1838 dprintk(1, "\n");
1839 if (state->m_drxk_state != DRXK_STOPPED &&
1840 state->m_drxk_state != DRXK_DTV_STARTED)
1841 goto error;
1842
1843 state->m_b_mirror_freq_spect = (state->props.inversion == INVERSION_ON);
1844
1845 if (intermediate_frequency < 0) {
1846 state->m_b_mirror_freq_spect = !state->m_b_mirror_freq_spect;
1847 intermediate_frequency = -intermediate_frequency;
1848 }
1849
1850 switch (state->m_operation_mode) {
1851 case OM_QAM_ITU_A:
1852 case OM_QAM_ITU_C:
1853 i_freqk_hz = (intermediate_frequency / 1000);
1854 status = set_qam(state, i_freqk_hz, offsetk_hz);
1855 if (status < 0)
1856 goto error;
1857 state->m_drxk_state = DRXK_DTV_STARTED;
1858 break;
1859 case OM_DVBT:
1860 i_freqk_hz = (intermediate_frequency / 1000);
1861 status = mpegts_stop(state);
1862 if (status < 0)
1863 goto error;
1864 status = set_dvbt(state, i_freqk_hz, offsetk_hz);
1865 if (status < 0)
1866 goto error;
1867 status = dvbt_start(state);
1868 if (status < 0)
1869 goto error;
1870 state->m_drxk_state = DRXK_DTV_STARTED;
1871 break;
1872 default:
1873 break;
1874 }
1875 error:
1876 if (status < 0)
1877 pr_err("Error %d on %s\n", status, __func__);
1878 return status;
1879 }
1880
1881 static int shut_down(struct drxk_state *state)
1882 {
1883 dprintk(1, "\n");
1884
1885 mpegts_stop(state);
1886 return 0;
1887 }
1888
1889 static int get_lock_status(struct drxk_state *state, u32 *p_lock_status)
1890 {
1891 int status = -EINVAL;
1892
1893 dprintk(1, "\n");
1894
1895 if (p_lock_status == NULL)
1896 goto error;
1897
1898 *p_lock_status = NOT_LOCKED;
1899
1900 /* define the SCU command code */
1901 switch (state->m_operation_mode) {
1902 case OM_QAM_ITU_A:
1903 case OM_QAM_ITU_B:
1904 case OM_QAM_ITU_C:
1905 status = get_qam_lock_status(state, p_lock_status);
1906 break;
1907 case OM_DVBT:
1908 status = get_dvbt_lock_status(state, p_lock_status);
1909 break;
1910 default:
1911 break;
1912 }
1913 error:
1914 if (status < 0)
1915 pr_err("Error %d on %s\n", status, __func__);
1916 return status;
1917 }
1918
1919 static int mpegts_start(struct drxk_state *state)
1920 {
1921 int status;
1922
1923 u16 fec_oc_snc_mode = 0;
1924
1925 /* Allow OC to sync again */
1926 status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
1927 if (status < 0)
1928 goto error;
1929 fec_oc_snc_mode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1930 status = write16(state, FEC_OC_SNC_MODE__A, fec_oc_snc_mode);
1931 if (status < 0)
1932 goto error;
1933 status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1934 error:
1935 if (status < 0)
1936 pr_err("Error %d on %s\n", status, __func__);
1937 return status;
1938 }
1939
1940 static int mpegts_dto_init(struct drxk_state *state)
1941 {
1942 int status;
1943
1944 dprintk(1, "\n");
1945
1946 /* Rate integration settings */
1947 status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1948 if (status < 0)
1949 goto error;
1950 status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1951 if (status < 0)
1952 goto error;
1953 status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1954 if (status < 0)
1955 goto error;
1956 status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
1957 if (status < 0)
1958 goto error;
1959 status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
1960 if (status < 0)
1961 goto error;
1962 status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
1963 if (status < 0)
1964 goto error;
1965 status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
1966 if (status < 0)
1967 goto error;
1968 status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
1969 if (status < 0)
1970 goto error;
1971
1972 /* Additional configuration */
1973 status = write16(state, FEC_OC_OCR_INVERT__A, 0);
1974 if (status < 0)
1975 goto error;
1976 status = write16(state, FEC_OC_SNC_LWM__A, 2);
1977 if (status < 0)
1978 goto error;
1979 status = write16(state, FEC_OC_SNC_HWM__A, 12);
1980 error:
1981 if (status < 0)
1982 pr_err("Error %d on %s\n", status, __func__);
1983
1984 return status;
1985 }
1986
1987 static int mpegts_dto_setup(struct drxk_state *state,
1988 enum operation_mode o_mode)
1989 {
1990 int status;
1991
1992 u16 fec_oc_reg_mode = 0; /* FEC_OC_MODE register value */
1993 u16 fec_oc_reg_ipr_mode = 0; /* FEC_OC_IPR_MODE register value */
1994 u16 fec_oc_dto_mode = 0; /* FEC_OC_IPR_INVERT register value */
1995 u16 fec_oc_fct_mode = 0; /* FEC_OC_IPR_INVERT register value */
1996 u16 fec_oc_dto_period = 2; /* FEC_OC_IPR_INVERT register value */
1997 u16 fec_oc_dto_burst_len = 188; /* FEC_OC_IPR_INVERT register value */
1998 u32 fec_oc_rcn_ctl_rate = 0; /* FEC_OC_IPR_INVERT register value */
1999 u16 fec_oc_tmd_mode = 0;
2000 u16 fec_oc_tmd_int_upd_rate = 0;
2001 u32 max_bit_rate = 0;
2002 bool static_clk = false;
2003
2004 dprintk(1, "\n");
2005
2006 /* Check insertion of the Reed-Solomon parity bytes */
2007 status = read16(state, FEC_OC_MODE__A, &fec_oc_reg_mode);
2008 if (status < 0)
2009 goto error;
2010 status = read16(state, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode);
2011 if (status < 0)
2012 goto error;
2013 fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
2014 fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2015 if (state->m_insert_rs_byte) {
2016 /* enable parity symbol forward */
2017 fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
2018 /* MVAL disable during parity bytes */
2019 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2020 /* TS burst length to 204 */
2021 fec_oc_dto_burst_len = 204;
2022 }
2023
2024 /* Check serial or parallel output */
2025 fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2026 if (!state->m_enable_parallel) {
2027 /* MPEG data output is serial -> set ipr_mode[0] */
2028 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
2029 }
2030
2031 switch (o_mode) {
2032 case OM_DVBT:
2033 max_bit_rate = state->m_dvbt_bitrate;
2034 fec_oc_tmd_mode = 3;
2035 fec_oc_rcn_ctl_rate = 0xC00000;
2036 static_clk = state->m_dvbt_static_clk;
2037 break;
2038 case OM_QAM_ITU_A: /* fallthrough */
2039 case OM_QAM_ITU_C:
2040 fec_oc_tmd_mode = 0x0004;
2041 fec_oc_rcn_ctl_rate = 0xD2B4EE; /* good for >63 Mb/s */
2042 max_bit_rate = state->m_dvbc_bitrate;
2043 static_clk = state->m_dvbc_static_clk;
2044 break;
2045 default:
2046 status = -EINVAL;
2047 } /* switch (standard) */
2048 if (status < 0)
2049 goto error;
2050
2051 /* Configure DTO's */
2052 if (static_clk) {
2053 u32 bit_rate = 0;
2054
2055 /* Rational DTO for MCLK source (static MCLK rate),
2056 Dynamic DTO for optimal grouping
2057 (avoid intra-packet gaps),
2058 DTO offset enable to sync TS burst with MSTRT */
2059 fec_oc_dto_mode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2060 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2061 fec_oc_fct_mode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2062 FEC_OC_FCT_MODE_VIRT_ENA__M);
2063
2064 /* Check user defined bitrate */
2065 bit_rate = max_bit_rate;
2066 if (bit_rate > 75900000UL) { /* max is 75.9 Mb/s */
2067 bit_rate = 75900000UL;
2068 }
2069 /* Rational DTO period:
2070 dto_period = (Fsys / bitrate) - 2
2071
2072 result should be floored,
2073 to make sure >= requested bitrate
2074 */
2075 fec_oc_dto_period = (u16) (((state->m_sys_clock_freq)
2076 * 1000) / bit_rate);
2077 if (fec_oc_dto_period <= 2)
2078 fec_oc_dto_period = 0;
2079 else
2080 fec_oc_dto_period -= 2;
2081 fec_oc_tmd_int_upd_rate = 8;
2082 } else {
2083 /* (commonAttr->static_clk == false) => dynamic mode */
2084 fec_oc_dto_mode = FEC_OC_DTO_MODE_DYNAMIC__M;
2085 fec_oc_fct_mode = FEC_OC_FCT_MODE__PRE;
2086 fec_oc_tmd_int_upd_rate = 5;
2087 }
2088
2089 /* Write appropriate registers with requested configuration */
2090 status = write16(state, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len);
2091 if (status < 0)
2092 goto error;
2093 status = write16(state, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period);
2094 if (status < 0)
2095 goto error;
2096 status = write16(state, FEC_OC_DTO_MODE__A, fec_oc_dto_mode);
2097 if (status < 0)
2098 goto error;
2099 status = write16(state, FEC_OC_FCT_MODE__A, fec_oc_fct_mode);
2100 if (status < 0)
2101 goto error;
2102 status = write16(state, FEC_OC_MODE__A, fec_oc_reg_mode);
2103 if (status < 0)
2104 goto error;
2105 status = write16(state, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode);
2106 if (status < 0)
2107 goto error;
2108
2109 /* Rate integration settings */
2110 status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fec_oc_rcn_ctl_rate);
2111 if (status < 0)
2112 goto error;
2113 status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A,
2114 fec_oc_tmd_int_upd_rate);
2115 if (status < 0)
2116 goto error;
2117 status = write16(state, FEC_OC_TMD_MODE__A, fec_oc_tmd_mode);
2118 error:
2119 if (status < 0)
2120 pr_err("Error %d on %s\n", status, __func__);
2121 return status;
2122 }
2123
2124 static int mpegts_configure_polarity(struct drxk_state *state)
2125 {
2126 u16 fec_oc_reg_ipr_invert = 0;
2127
2128 /* Data mask for the output data byte */
2129 u16 invert_data_mask =
2130 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2131 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2132 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2133 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2134
2135 dprintk(1, "\n");
2136
2137 /* Control selective inversion of output bits */
2138 fec_oc_reg_ipr_invert &= (~(invert_data_mask));
2139 if (state->m_invert_data)
2140 fec_oc_reg_ipr_invert |= invert_data_mask;
2141 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2142 if (state->m_invert_err)
2143 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
2144 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2145 if (state->m_invert_str)
2146 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
2147 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2148 if (state->m_invert_val)
2149 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
2150 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2151 if (state->m_invert_clk)
2152 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
2153
2154 return write16(state, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert);
2155 }
2156
2157 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2158
2159 static int set_agc_rf(struct drxk_state *state,
2160 struct s_cfg_agc *p_agc_cfg, bool is_dtv)
2161 {
2162 int status = -EINVAL;
2163 u16 data = 0;
2164 struct s_cfg_agc *p_if_agc_settings;
2165
2166 dprintk(1, "\n");
2167
2168 if (p_agc_cfg == NULL)
2169 goto error;
2170
2171 switch (p_agc_cfg->ctrl_mode) {
2172 case DRXK_AGC_CTRL_AUTO:
2173 /* Enable RF AGC DAC */
2174 status = read16(state, IQM_AF_STDBY__A, &data);
2175 if (status < 0)
2176 goto error;
2177 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2178 status = write16(state, IQM_AF_STDBY__A, data);
2179 if (status < 0)
2180 goto error;
2181 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2182 if (status < 0)
2183 goto error;
2184
2185 /* Enable SCU RF AGC loop */
2186 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2187
2188 /* Polarity */
2189 if (state->m_rf_agc_pol)
2190 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2191 else
2192 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2193 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2194 if (status < 0)
2195 goto error;
2196
2197 /* Set speed (using complementary reduction value) */
2198 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2199 if (status < 0)
2200 goto error;
2201
2202 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2203 data |= (~(p_agc_cfg->speed <<
2204 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2205 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2206
2207 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2208 if (status < 0)
2209 goto error;
2210
2211 if (is_dvbt(state))
2212 p_if_agc_settings = &state->m_dvbt_if_agc_cfg;
2213 else if (is_qam(state))
2214 p_if_agc_settings = &state->m_qam_if_agc_cfg;
2215 else
2216 p_if_agc_settings = &state->m_atv_if_agc_cfg;
2217 if (p_if_agc_settings == NULL) {
2218 status = -EINVAL;
2219 goto error;
2220 }
2221
2222 /* Set TOP, only if IF-AGC is in AUTO mode */
2223 if (p_if_agc_settings->ctrl_mode == DRXK_AGC_CTRL_AUTO) {
2224 status = write16(state,
2225 SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2226 p_agc_cfg->top);
2227 if (status < 0)
2228 goto error;
2229 }
2230
2231 /* Cut-Off current */
2232 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A,
2233 p_agc_cfg->cut_off_current);
2234 if (status < 0)
2235 goto error;
2236
2237 /* Max. output level */
2238 status = write16(state, SCU_RAM_AGC_RF_MAX__A,
2239 p_agc_cfg->max_output_level);
2240 if (status < 0)
2241 goto error;
2242
2243 break;
2244
2245 case DRXK_AGC_CTRL_USER:
2246 /* Enable RF AGC DAC */
2247 status = read16(state, IQM_AF_STDBY__A, &data);
2248 if (status < 0)
2249 goto error;
2250 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2251 status = write16(state, IQM_AF_STDBY__A, data);
2252 if (status < 0)
2253 goto error;
2254
2255 /* Disable SCU RF AGC loop */
2256 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2257 if (status < 0)
2258 goto error;
2259 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2260 if (state->m_rf_agc_pol)
2261 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2262 else
2263 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2264 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2265 if (status < 0)
2266 goto error;
2267
2268 /* SCU c.o.c. to 0, enabling full control range */
2269 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2270 if (status < 0)
2271 goto error;
2272
2273 /* Write value to output pin */
2274 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A,
2275 p_agc_cfg->output_level);
2276 if (status < 0)
2277 goto error;
2278 break;
2279
2280 case DRXK_AGC_CTRL_OFF:
2281 /* Disable RF AGC DAC */
2282 status = read16(state, IQM_AF_STDBY__A, &data);
2283 if (status < 0)
2284 goto error;
2285 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2286 status = write16(state, IQM_AF_STDBY__A, data);
2287 if (status < 0)
2288 goto error;
2289
2290 /* Disable SCU RF AGC loop */
2291 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2292 if (status < 0)
2293 goto error;
2294 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2295 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2296 if (status < 0)
2297 goto error;
2298 break;
2299
2300 default:
2301 status = -EINVAL;
2302
2303 }
2304 error:
2305 if (status < 0)
2306 pr_err("Error %d on %s\n", status, __func__);
2307 return status;
2308 }
2309
2310 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2311
2312 static int set_agc_if(struct drxk_state *state,
2313 struct s_cfg_agc *p_agc_cfg, bool is_dtv)
2314 {
2315 u16 data = 0;
2316 int status = 0;
2317 struct s_cfg_agc *p_rf_agc_settings;
2318
2319 dprintk(1, "\n");
2320
2321 switch (p_agc_cfg->ctrl_mode) {
2322 case DRXK_AGC_CTRL_AUTO:
2323
2324 /* Enable IF AGC DAC */
2325 status = read16(state, IQM_AF_STDBY__A, &data);
2326 if (status < 0)
2327 goto error;
2328 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2329 status = write16(state, IQM_AF_STDBY__A, data);
2330 if (status < 0)
2331 goto error;
2332
2333 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2334 if (status < 0)
2335 goto error;
2336
2337 /* Enable SCU IF AGC loop */
2338 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2339
2340 /* Polarity */
2341 if (state->m_if_agc_pol)
2342 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2343 else
2344 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2345 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2346 if (status < 0)
2347 goto error;
2348
2349 /* Set speed (using complementary reduction value) */
2350 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2351 if (status < 0)
2352 goto error;
2353 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2354 data |= (~(p_agc_cfg->speed <<
2355 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2356 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2357
2358 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2359 if (status < 0)
2360 goto error;
2361
2362 if (is_qam(state))
2363 p_rf_agc_settings = &state->m_qam_rf_agc_cfg;
2364 else
2365 p_rf_agc_settings = &state->m_atv_rf_agc_cfg;
2366 if (p_rf_agc_settings == NULL)
2367 return -1;
2368 /* Restore TOP */
2369 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2370 p_rf_agc_settings->top);
2371 if (status < 0)
2372 goto error;
2373 break;
2374
2375 case DRXK_AGC_CTRL_USER:
2376
2377 /* Enable IF AGC DAC */
2378 status = read16(state, IQM_AF_STDBY__A, &data);
2379 if (status < 0)
2380 goto error;
2381 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2382 status = write16(state, IQM_AF_STDBY__A, data);
2383 if (status < 0)
2384 goto error;
2385
2386 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2387 if (status < 0)
2388 goto error;
2389
2390 /* Disable SCU IF AGC loop */
2391 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2392
2393 /* Polarity */
2394 if (state->m_if_agc_pol)
2395 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2396 else
2397 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2398 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2399 if (status < 0)
2400 goto error;
2401
2402 /* Write value to output pin */
2403 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2404 p_agc_cfg->output_level);
2405 if (status < 0)
2406 goto error;
2407 break;
2408
2409 case DRXK_AGC_CTRL_OFF:
2410
2411 /* Disable If AGC DAC */
2412 status = read16(state, IQM_AF_STDBY__A, &data);
2413 if (status < 0)
2414 goto error;
2415 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2416 status = write16(state, IQM_AF_STDBY__A, data);
2417 if (status < 0)
2418 goto error;
2419
2420 /* Disable SCU IF AGC loop */
2421 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2422 if (status < 0)
2423 goto error;
2424 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2425 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2426 if (status < 0)
2427 goto error;
2428 break;
2429 } /* switch (agcSettingsIf->ctrl_mode) */
2430
2431 /* always set the top to support
2432 configurations without if-loop */
2433 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_cfg->top);
2434 error:
2435 if (status < 0)
2436 pr_err("Error %d on %s\n", status, __func__);
2437 return status;
2438 }
2439
2440 static int get_qam_signal_to_noise(struct drxk_state *state,
2441 s32 *p_signal_to_noise)
2442 {
2443 int status = 0;
2444 u16 qam_sl_err_power = 0; /* accum. error between
2445 raw and sliced symbols */
2446 u32 qam_sl_sig_power = 0; /* used for MER, depends of
2447 QAM modulation */
2448 u32 qam_sl_mer = 0; /* QAM MER */
2449
2450 dprintk(1, "\n");
2451
2452 /* MER calculation */
2453
2454 /* get the register value needed for MER */
2455 status = read16(state, QAM_SL_ERR_POWER__A, &qam_sl_err_power);
2456 if (status < 0) {
2457 pr_err("Error %d on %s\n", status, __func__);
2458 return -EINVAL;
2459 }
2460
2461 switch (state->props.modulation) {
2462 case QAM_16:
2463 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2464 break;
2465 case QAM_32:
2466 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2467 break;
2468 case QAM_64:
2469 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2470 break;
2471 case QAM_128:
2472 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2473 break;
2474 default:
2475 case QAM_256:
2476 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2477 break;
2478 }
2479
2480 if (qam_sl_err_power > 0) {
2481 qam_sl_mer = log10times100(qam_sl_sig_power) -
2482 log10times100((u32) qam_sl_err_power);
2483 }
2484 *p_signal_to_noise = qam_sl_mer;
2485
2486 return status;
2487 }
2488
2489 static int get_dvbt_signal_to_noise(struct drxk_state *state,
2490 s32 *p_signal_to_noise)
2491 {
2492 int status;
2493 u16 reg_data = 0;
2494 u32 eq_reg_td_sqr_err_i = 0;
2495 u32 eq_reg_td_sqr_err_q = 0;
2496 u16 eq_reg_td_sqr_err_exp = 0;
2497 u16 eq_reg_td_tps_pwr_ofs = 0;
2498 u16 eq_reg_td_req_smb_cnt = 0;
2499 u32 tps_cnt = 0;
2500 u32 sqr_err_iq = 0;
2501 u32 a = 0;
2502 u32 b = 0;
2503 u32 c = 0;
2504 u32 i_mer = 0;
2505 u16 transmission_params = 0;
2506
2507 dprintk(1, "\n");
2508
2509 status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A,
2510 &eq_reg_td_tps_pwr_ofs);
2511 if (status < 0)
2512 goto error;
2513 status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A,
2514 &eq_reg_td_req_smb_cnt);
2515 if (status < 0)
2516 goto error;
2517 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A,
2518 &eq_reg_td_sqr_err_exp);
2519 if (status < 0)
2520 goto error;
2521 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A,
2522 &reg_data);
2523 if (status < 0)
2524 goto error;
2525 /* Extend SQR_ERR_I operational range */
2526 eq_reg_td_sqr_err_i = (u32) reg_data;
2527 if ((eq_reg_td_sqr_err_exp > 11) &&
2528 (eq_reg_td_sqr_err_i < 0x00000FFFUL)) {
2529 eq_reg_td_sqr_err_i += 0x00010000UL;
2530 }
2531 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, &reg_data);
2532 if (status < 0)
2533 goto error;
2534 /* Extend SQR_ERR_Q operational range */
2535 eq_reg_td_sqr_err_q = (u32) reg_data;
2536 if ((eq_reg_td_sqr_err_exp > 11) &&
2537 (eq_reg_td_sqr_err_q < 0x00000FFFUL))
2538 eq_reg_td_sqr_err_q += 0x00010000UL;
2539
2540 status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A,
2541 &transmission_params);
2542 if (status < 0)
2543 goto error;
2544
2545 /* Check input data for MER */
2546
2547 /* MER calculation (in 0.1 dB) without math.h */
2548 if ((eq_reg_td_tps_pwr_ofs == 0) || (eq_reg_td_req_smb_cnt == 0))
2549 i_mer = 0;
2550 else if ((eq_reg_td_sqr_err_i + eq_reg_td_sqr_err_q) == 0) {
2551 /* No error at all, this must be the HW reset value
2552 * Apparently no first measurement yet
2553 * Set MER to 0.0 */
2554 i_mer = 0;
2555 } else {
2556 sqr_err_iq = (eq_reg_td_sqr_err_i + eq_reg_td_sqr_err_q) <<
2557 eq_reg_td_sqr_err_exp;
2558 if ((transmission_params &
2559 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2560 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2561 tps_cnt = 17;
2562 else
2563 tps_cnt = 68;
2564
2565 /* IMER = 100 * log10 (x)
2566 where x = (eq_reg_td_tps_pwr_ofs^2 *
2567 eq_reg_td_req_smb_cnt * tps_cnt)/sqr_err_iq
2568
2569 => IMER = a + b -c
2570 where a = 100 * log10 (eq_reg_td_tps_pwr_ofs^2)
2571 b = 100 * log10 (eq_reg_td_req_smb_cnt * tps_cnt)
2572 c = 100 * log10 (sqr_err_iq)
2573 */
2574
2575 /* log(x) x = 9bits * 9bits->18 bits */
2576 a = log10times100(eq_reg_td_tps_pwr_ofs *
2577 eq_reg_td_tps_pwr_ofs);
2578 /* log(x) x = 16bits * 7bits->23 bits */
2579 b = log10times100(eq_reg_td_req_smb_cnt * tps_cnt);
2580 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2581 c = log10times100(sqr_err_iq);
2582
2583 i_mer = a + b - c;
2584 }
2585 *p_signal_to_noise = i_mer;
2586
2587 error:
2588 if (status < 0)
2589 pr_err("Error %d on %s\n", status, __func__);
2590 return status;
2591 }
2592
2593 static int get_signal_to_noise(struct drxk_state *state, s32 *p_signal_to_noise)
2594 {
2595 dprintk(1, "\n");
2596
2597 *p_signal_to_noise = 0;
2598 switch (state->m_operation_mode) {
2599 case OM_DVBT:
2600 return get_dvbt_signal_to_noise(state, p_signal_to_noise);
2601 case OM_QAM_ITU_A:
2602 case OM_QAM_ITU_C:
2603 return get_qam_signal_to_noise(state, p_signal_to_noise);
2604 default:
2605 break;
2606 }
2607 return 0;
2608 }
2609
2610 #if 0
2611 static int get_dvbt_quality(struct drxk_state *state, s32 *p_quality)
2612 {
2613 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2614 int status = 0;
2615
2616 dprintk(1, "\n");
2617
2618 static s32 QE_SN[] = {
2619 51, /* QPSK 1/2 */
2620 69, /* QPSK 2/3 */
2621 79, /* QPSK 3/4 */
2622 89, /* QPSK 5/6 */
2623 97, /* QPSK 7/8 */
2624 108, /* 16-QAM 1/2 */
2625 131, /* 16-QAM 2/3 */
2626 146, /* 16-QAM 3/4 */
2627 156, /* 16-QAM 5/6 */
2628 160, /* 16-QAM 7/8 */
2629 165, /* 64-QAM 1/2 */
2630 187, /* 64-QAM 2/3 */
2631 202, /* 64-QAM 3/4 */
2632 216, /* 64-QAM 5/6 */
2633 225, /* 64-QAM 7/8 */
2634 };
2635
2636 *p_quality = 0;
2637
2638 do {
2639 s32 signal_to_noise = 0;
2640 u16 constellation = 0;
2641 u16 code_rate = 0;
2642 u32 signal_to_noise_rel;
2643 u32 ber_quality;
2644
2645 status = get_dvbt_signal_to_noise(state, &signal_to_noise);
2646 if (status < 0)
2647 break;
2648 status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A,
2649 &constellation);
2650 if (status < 0)
2651 break;
2652 constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2653
2654 status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A,
2655 &code_rate);
2656 if (status < 0)
2657 break;
2658 code_rate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2659
2660 if (constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2661 code_rate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2662 break;
2663 signal_to_noise_rel = signal_to_noise -
2664 QE_SN[constellation * 5 + code_rate];
2665 ber_quality = 100;
2666
2667 if (signal_to_noise_rel < -70)
2668 *p_quality = 0;
2669 else if (signal_to_noise_rel < 30)
2670 *p_quality = ((signal_to_noise_rel + 70) *
2671 ber_quality) / 100;
2672 else
2673 *p_quality = ber_quality;
2674 } while (0);
2675 return 0;
2676 };
2677
2678 static int get_dvbc_quality(struct drxk_state *state, s32 *p_quality)
2679 {
2680 int status = 0;
2681 *p_quality = 0;
2682
2683 dprintk(1, "\n");
2684
2685 do {
2686 u32 signal_to_noise = 0;
2687 u32 ber_quality = 100;
2688 u32 signal_to_noise_rel = 0;
2689
2690 status = get_qam_signal_to_noise(state, &signal_to_noise);
2691 if (status < 0)
2692 break;
2693
2694 switch (state->props.modulation) {
2695 case QAM_16:
2696 signal_to_noise_rel = signal_to_noise - 200;
2697 break;
2698 case QAM_32:
2699 signal_to_noise_rel = signal_to_noise - 230;
2700 break; /* Not in NorDig */
2701 case QAM_64:
2702 signal_to_noise_rel = signal_to_noise - 260;
2703 break;
2704 case QAM_128:
2705 signal_to_noise_rel = signal_to_noise - 290;
2706 break;
2707 default:
2708 case QAM_256:
2709 signal_to_noise_rel = signal_to_noise - 320;
2710 break;
2711 }
2712
2713 if (signal_to_noise_rel < -70)
2714 *p_quality = 0;
2715 else if (signal_to_noise_rel < 30)
2716 *p_quality = ((signal_to_noise_rel + 70) *
2717 ber_quality) / 100;
2718 else
2719 *p_quality = ber_quality;
2720 } while (0);
2721
2722 return status;
2723 }
2724
2725 static int get_quality(struct drxk_state *state, s32 *p_quality)
2726 {
2727 dprintk(1, "\n");
2728
2729 switch (state->m_operation_mode) {
2730 case OM_DVBT:
2731 return get_dvbt_quality(state, p_quality);
2732 case OM_QAM_ITU_A:
2733 return get_dvbc_quality(state, p_quality);
2734 default:
2735 break;
2736 }
2737
2738 return 0;
2739 }
2740 #endif
2741
2742 /* Free data ram in SIO HI */
2743 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2744 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2745
2746 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2747 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2748 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2749 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2750
2751 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2752 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2753 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2754
2755 static int ConfigureI2CBridge(struct drxk_state *state, bool b_enable_bridge)
2756 {
2757 int status = -EINVAL;
2758
2759 dprintk(1, "\n");
2760
2761 if (state->m_drxk_state == DRXK_UNINITIALIZED)
2762 return 0;
2763 if (state->m_drxk_state == DRXK_POWERED_DOWN)
2764 goto error;
2765
2766 if (state->no_i2c_bridge)
2767 return 0;
2768
2769 status = write16(state, SIO_HI_RA_RAM_PAR_1__A,
2770 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2771 if (status < 0)
2772 goto error;
2773 if (b_enable_bridge) {
2774 status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
2775 SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2776 if (status < 0)
2777 goto error;
2778 } else {
2779 status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
2780 SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2781 if (status < 0)
2782 goto error;
2783 }
2784
2785 status = hi_command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, NULL);
2786
2787 error:
2788 if (status < 0)
2789 pr_err("Error %d on %s\n", status, __func__);
2790 return status;
2791 }
2792
2793 static int set_pre_saw(struct drxk_state *state,
2794 struct s_cfg_pre_saw *p_pre_saw_cfg)
2795 {
2796 int status = -EINVAL;
2797
2798 dprintk(1, "\n");
2799
2800 if ((p_pre_saw_cfg == NULL)
2801 || (p_pre_saw_cfg->reference > IQM_AF_PDREF__M))
2802 goto error;
2803
2804 status = write16(state, IQM_AF_PDREF__A, p_pre_saw_cfg->reference);
2805 error:
2806 if (status < 0)
2807 pr_err("Error %d on %s\n", status, __func__);
2808 return status;
2809 }
2810
2811 static int bl_direct_cmd(struct drxk_state *state, u32 target_addr,
2812 u16 rom_offset, u16 nr_of_elements, u32 time_out)
2813 {
2814 u16 bl_status = 0;
2815 u16 offset = (u16) ((target_addr >> 0) & 0x00FFFF);
2816 u16 blockbank = (u16) ((target_addr >> 16) & 0x000FFF);
2817 int status;
2818 unsigned long end;
2819
2820 dprintk(1, "\n");
2821
2822 mutex_lock(&state->mutex);
2823 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2824 if (status < 0)
2825 goto error;
2826 status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2827 if (status < 0)
2828 goto error;
2829 status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2830 if (status < 0)
2831 goto error;
2832 status = write16(state, SIO_BL_SRC_ADDR__A, rom_offset);
2833 if (status < 0)
2834 goto error;
2835 status = write16(state, SIO_BL_SRC_LEN__A, nr_of_elements);
2836 if (status < 0)
2837 goto error;
2838 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2839 if (status < 0)
2840 goto error;
2841
2842 end = jiffies + msecs_to_jiffies(time_out);
2843 do {
2844 status = read16(state, SIO_BL_STATUS__A, &bl_status);
2845 if (status < 0)
2846 goto error;
2847 } while ((bl_status == 0x1) && time_is_after_jiffies(end));
2848 if (bl_status == 0x1) {
2849 pr_err("SIO not ready\n");
2850 status = -EINVAL;
2851 goto error2;
2852 }
2853 error:
2854 if (status < 0)
2855 pr_err("Error %d on %s\n", status, __func__);
2856 error2:
2857 mutex_unlock(&state->mutex);
2858 return status;
2859
2860 }
2861
2862 static int adc_sync_measurement(struct drxk_state *state, u16 *count)
2863 {
2864 u16 data = 0;
2865 int status;
2866
2867 dprintk(1, "\n");
2868
2869 /* start measurement */
2870 status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2871 if (status < 0)
2872 goto error;
2873 status = write16(state, IQM_AF_START_LOCK__A, 1);
2874 if (status < 0)
2875 goto error;
2876
2877 *count = 0;
2878 status = read16(state, IQM_AF_PHASE0__A, &data);
2879 if (status < 0)
2880 goto error;
2881 if (data == 127)
2882 *count = *count + 1;
2883 status = read16(state, IQM_AF_PHASE1__A, &data);
2884 if (status < 0)
2885 goto error;
2886 if (data == 127)
2887 *count = *count + 1;
2888 status = read16(state, IQM_AF_PHASE2__A, &data);
2889 if (status < 0)
2890 goto error;
2891 if (data == 127)
2892 *count = *count + 1;
2893
2894 error:
2895 if (status < 0)
2896 pr_err("Error %d on %s\n", status, __func__);
2897 return status;
2898 }
2899
2900 static int adc_synchronization(struct drxk_state *state)
2901 {
2902 u16 count = 0;
2903 int status;
2904
2905 dprintk(1, "\n");
2906
2907 status = adc_sync_measurement(state, &count);
2908 if (status < 0)
2909 goto error;
2910
2911 if (count == 1) {
2912 /* Try sampling on a different edge */
2913 u16 clk_neg = 0;
2914
2915 status = read16(state, IQM_AF_CLKNEG__A, &clk_neg);
2916 if (status < 0)
2917 goto error;
2918 if ((clk_neg & IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2919 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2920 clk_neg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2921 clk_neg |=
2922 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2923 } else {
2924 clk_neg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2925 clk_neg |=
2926 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2927 }
2928 status = write16(state, IQM_AF_CLKNEG__A, clk_neg);
2929 if (status < 0)
2930 goto error;
2931 status = adc_sync_measurement(state, &count);
2932 if (status < 0)
2933 goto error;
2934 }
2935
2936 if (count < 2)
2937 status = -EINVAL;
2938 error:
2939 if (status < 0)
2940 pr_err("Error %d on %s\n", status, __func__);
2941 return status;
2942 }
2943
2944 static int set_frequency_shifter(struct drxk_state *state,
2945 u16 intermediate_freqk_hz,
2946 s32 tuner_freq_offset, bool is_dtv)
2947 {
2948 bool select_pos_image = false;
2949 u32 rf_freq_residual = tuner_freq_offset;
2950 u32 fm_frequency_shift = 0;
2951 bool tuner_mirror = !state->m_b_mirror_freq_spect;
2952 u32 adc_freq;
2953 bool adc_flip;
2954 int status;
2955 u32 if_freq_actual;
2956 u32 sampling_frequency = (u32) (state->m_sys_clock_freq / 3);
2957 u32 frequency_shift;
2958 bool image_to_select;
2959
2960 dprintk(1, "\n");
2961
2962 /*
2963 Program frequency shifter
2964 No need to account for mirroring on RF
2965 */
2966 if (is_dtv) {
2967 if ((state->m_operation_mode == OM_QAM_ITU_A) ||
2968 (state->m_operation_mode == OM_QAM_ITU_C) ||
2969 (state->m_operation_mode == OM_DVBT))
2970 select_pos_image = true;
2971 else
2972 select_pos_image = false;
2973 }
2974 if (tuner_mirror)
2975 /* tuner doesn't mirror */
2976 if_freq_actual = intermediate_freqk_hz +
2977 rf_freq_residual + fm_frequency_shift;
2978 else
2979 /* tuner mirrors */
2980 if_freq_actual = intermediate_freqk_hz -
2981 rf_freq_residual - fm_frequency_shift;
2982 if (if_freq_actual > sampling_frequency / 2) {
2983 /* adc mirrors */
2984 adc_freq = sampling_frequency - if_freq_actual;
2985 adc_flip = true;
2986 } else {
2987 /* adc doesn't mirror */
2988 adc_freq = if_freq_actual;
2989 adc_flip = false;
2990 }
2991
2992 frequency_shift = adc_freq;
2993 image_to_select = state->m_rfmirror ^ tuner_mirror ^
2994 adc_flip ^ select_pos_image;
2995 state->m_iqm_fs_rate_ofs =
2996 Frac28a((frequency_shift), sampling_frequency);
2997
2998 if (image_to_select)
2999 state->m_iqm_fs_rate_ofs = ~state->m_iqm_fs_rate_ofs + 1;
3000
3001 /* Program frequency shifter with tuner offset compensation */
3002 /* frequency_shift += tuner_freq_offset; TODO */
3003 status = write32(state, IQM_FS_RATE_OFS_LO__A,
3004 state->m_iqm_fs_rate_ofs);
3005 if (status < 0)
3006 pr_err("Error %d on %s\n", status, __func__);
3007 return status;
3008 }
3009
3010 static int init_agc(struct drxk_state *state, bool is_dtv)
3011 {
3012 u16 ingain_tgt = 0;
3013 u16 ingain_tgt_min = 0;
3014 u16 ingain_tgt_max = 0;
3015 u16 clp_cyclen = 0;
3016 u16 clp_sum_min = 0;
3017 u16 clp_dir_to = 0;
3018 u16 sns_sum_min = 0;
3019 u16 sns_sum_max = 0;
3020 u16 clp_sum_max = 0;
3021 u16 sns_dir_to = 0;
3022 u16 ki_innergain_min = 0;
3023 u16 if_iaccu_hi_tgt = 0;
3024 u16 if_iaccu_hi_tgt_min = 0;
3025 u16 if_iaccu_hi_tgt_max = 0;
3026 u16 data = 0;
3027 u16 fast_clp_ctrl_delay = 0;
3028 u16 clp_ctrl_mode = 0;
3029 int status = 0;
3030
3031 dprintk(1, "\n");
3032
3033 /* Common settings */
3034 sns_sum_max = 1023;
3035 if_iaccu_hi_tgt_min = 2047;
3036 clp_cyclen = 500;
3037 clp_sum_max = 1023;
3038
3039 /* AGCInit() not available for DVBT; init done in microcode */
3040 if (!is_qam(state)) {
3041 pr_err("%s: mode %d is not DVB-C\n",
3042 __func__, state->m_operation_mode);
3043 return -EINVAL;
3044 }
3045
3046 /* FIXME: Analog TV AGC require different settings */
3047
3048 /* Standard specific settings */
3049 clp_sum_min = 8;
3050 clp_dir_to = (u16) -9;
3051 clp_ctrl_mode = 0;
3052 sns_sum_min = 8;
3053 sns_dir_to = (u16) -9;
3054 ki_innergain_min = (u16) -1030;
3055 if_iaccu_hi_tgt_max = 0x2380;
3056 if_iaccu_hi_tgt = 0x2380;
3057 ingain_tgt_min = 0x0511;
3058 ingain_tgt = 0x0511;
3059 ingain_tgt_max = 5119;
3060 fast_clp_ctrl_delay = state->m_qam_if_agc_cfg.fast_clip_ctrl_delay;
3061
3062 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A,
3063 fast_clp_ctrl_delay);
3064 if (status < 0)
3065 goto error;
3066
3067 status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode);
3068 if (status < 0)
3069 goto error;
3070 status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingain_tgt);
3071 if (status < 0)
3072 goto error;
3073 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingain_tgt_min);
3074 if (status < 0)
3075 goto error;
3076 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max);
3077 if (status < 0)
3078 goto error;
3079 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A,
3080 if_iaccu_hi_tgt_min);
3081 if (status < 0)
3082 goto error;
3083 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
3084 if_iaccu_hi_tgt_max);
3085 if (status < 0)
3086 goto error;
3087 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3088 if (status < 0)
3089 goto error;
3090 status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3091 if (status < 0)
3092 goto error;
3093 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3094 if (status < 0)
3095 goto error;
3096 status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3097 if (status < 0)
3098 goto error;
3099 status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max);
3100 if (status < 0)
3101 goto error;
3102 status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max);
3103 if (status < 0)
3104 goto error;
3105
3106 status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A,
3107 ki_innergain_min);
3108 if (status < 0)
3109 goto error;
3110 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A,
3111 if_iaccu_hi_tgt);
3112 if (status < 0)
3113 goto error;
3114 status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clp_cyclen);
3115 if (status < 0)
3116 goto error;
3117
3118 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3119 if (status < 0)
3120 goto error;
3121 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3122 if (status < 0)
3123 goto error;
3124 status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3125 if (status < 0)
3126 goto error;
3127
3128 status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3129 if (status < 0)
3130 goto error;
3131 status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clp_sum_min);
3132 if (status < 0)
3133 goto error;
3134 status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, sns_sum_min);
3135 if (status < 0)
3136 goto error;
3137 status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to);
3138 if (status < 0)
3139 goto error;
3140 status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to);
3141 if (status < 0)
3142 goto error;
3143 status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3144 if (status < 0)
3145 goto error;
3146 status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3147 if (status < 0)
3148 goto error;
3149 status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3150 if (status < 0)
3151 goto error;
3152 status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3153 if (status < 0)
3154 goto error;
3155 status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3156 if (status < 0)
3157 goto error;
3158 status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3159 if (status < 0)
3160 goto error;
3161 status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3162 if (status < 0)
3163 goto error;
3164 status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3165 if (status < 0)
3166 goto error;
3167 status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3168 if (status < 0)
3169 goto error;
3170 status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3171 if (status < 0)
3172 goto error;
3173 status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3174 if (status < 0)
3175 goto error;
3176 status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3177 if (status < 0)
3178 goto error;
3179 status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3180 if (status < 0)
3181 goto error;
3182 status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3183 if (status < 0)
3184 goto error;
3185
3186 /* Initialize inner-loop KI gain factors */
3187 status = read16(state, SCU_RAM_AGC_KI__A, &data);
3188 if (status < 0)
3189 goto error;
3190
3191 data = 0x0657;
3192 data &= ~SCU_RAM_AGC_KI_RF__M;
3193 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3194 data &= ~SCU_RAM_AGC_KI_IF__M;
3195 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3196
3197 status = write16(state, SCU_RAM_AGC_KI__A, data);
3198 error:
3199 if (status < 0)
3200 pr_err("Error %d on %s\n", status, __func__);
3201 return status;
3202 }
3203
3204 static int dvbtqam_get_acc_pkt_err(struct drxk_state *state, u16 *packet_err)
3205 {
3206 int status;
3207
3208 dprintk(1, "\n");
3209 if (packet_err == NULL)
3210 status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3211 else
3212 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A,
3213 packet_err);
3214 if (status < 0)
3215 pr_err("Error %d on %s\n", status, __func__);
3216 return status;
3217 }
3218
3219 static int dvbt_sc_command(struct drxk_state *state,
3220 u16 cmd, u16 subcmd,
3221 u16 param0, u16 param1, u16 param2,
3222 u16 param3, u16 param4)
3223 {
3224 u16 cur_cmd = 0;
3225 u16 err_code = 0;
3226 u16 retry_cnt = 0;
3227 u16 sc_exec = 0;
3228 int status;
3229
3230 dprintk(1, "\n");
3231 status = read16(state, OFDM_SC_COMM_EXEC__A, &sc_exec);
3232 if (sc_exec != 1) {
3233 /* SC is not running */
3234 status = -EINVAL;
3235 }
3236 if (status < 0)
3237 goto error;
3238
3239 /* Wait until sc is ready to receive command */
3240 retry_cnt = 0;
3241 do {
3242 usleep_range(1000, 2000);
3243 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &cur_cmd);
3244 retry_cnt++;
3245 } while ((cur_cmd != 0) && (retry_cnt < DRXK_MAX_RETRIES));
3246 if (retry_cnt >= DRXK_MAX_RETRIES && (status < 0))
3247 goto error;
3248
3249 /* Write sub-command */
3250 switch (cmd) {
3251 /* All commands using sub-cmd */
3252 case OFDM_SC_RA_RAM_CMD_PROC_START:
3253 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3254 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3255 status = write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3256 if (status < 0)
3257 goto error;
3258 break;
3259 default:
3260 /* Do nothing */
3261 break;
3262 }
3263
3264 /* Write needed parameters and the command */
3265 switch (cmd) {
3266 /* All commands using 5 parameters */
3267 /* All commands using 4 parameters */
3268 /* All commands using 3 parameters */
3269 /* All commands using 2 parameters */
3270 case OFDM_SC_RA_RAM_CMD_PROC_START:
3271 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3272 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3273 status = write16(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3274 /* All commands using 1 parameters */
3275 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3276 case OFDM_SC_RA_RAM_CMD_USER_IO:
3277 status = write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3278 /* All commands using 0 parameters */
3279 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3280 case OFDM_SC_RA_RAM_CMD_NULL:
3281 /* Write command */
3282 status = write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3283 break;
3284 default:
3285 /* Unknown command */
3286 status = -EINVAL;
3287 }
3288 if (status < 0)
3289 goto error;
3290
3291 /* Wait until sc is ready processing command */
3292 retry_cnt = 0;
3293 do {
3294 usleep_range(1000, 2000);
3295 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &cur_cmd);
3296 retry_cnt++;
3297 } while ((cur_cmd != 0) && (retry_cnt < DRXK_MAX_RETRIES));
3298 if (retry_cnt >= DRXK_MAX_RETRIES && (status < 0))
3299 goto error;
3300
3301 /* Check for illegal cmd */
3302 status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &err_code);
3303 if (err_code == 0xFFFF) {
3304 /* illegal command */
3305 status = -EINVAL;
3306 }
3307 if (status < 0)
3308 goto error;
3309
3310 /* Retrieve results parameters from SC */
3311 switch (cmd) {
3312 /* All commands yielding 5 results */
3313 /* All commands yielding 4 results */
3314 /* All commands yielding 3 results */
3315 /* All commands yielding 2 results */
3316 /* All commands yielding 1 result */
3317 case OFDM_SC_RA_RAM_CMD_USER_IO:
3318 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3319 status = read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3320 /* All commands yielding 0 results */
3321 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3322 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3323 case OFDM_SC_RA_RAM_CMD_PROC_START:
3324 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3325 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3326 case OFDM_SC_RA_RAM_CMD_NULL:
3327 break;
3328 default:
3329 /* Unknown command */
3330 status = -EINVAL;
3331 break;
3332 } /* switch (cmd->cmd) */
3333 error:
3334 if (status < 0)
3335 pr_err("Error %d on %s\n", status, __func__);
3336 return status;
3337 }
3338
3339 static int power_up_dvbt(struct drxk_state *state)
3340 {
3341 enum drx_power_mode power_mode = DRX_POWER_UP;
3342 int status;
3343
3344 dprintk(1, "\n");
3345 status = ctrl_power_mode(state, &power_mode);
3346 if (status < 0)
3347 pr_err("Error %d on %s\n", status, __func__);
3348 return status;
3349 }
3350
3351 static int dvbt_ctrl_set_inc_enable(struct drxk_state *state, bool *enabled)
3352 {
3353 int status;
3354
3355 dprintk(1, "\n");
3356 if (*enabled)
3357 status = write16(state, IQM_CF_BYPASSDET__A, 0);
3358 else
3359 status = write16(state, IQM_CF_BYPASSDET__A, 1);
3360 if (status < 0)
3361 pr_err("Error %d on %s\n", status, __func__);
3362 return status;
3363 }
3364
3365 #define DEFAULT_FR_THRES_8K 4000
3366 static int dvbt_ctrl_set_fr_enable(struct drxk_state *state, bool *enabled)
3367 {
3368
3369 int status;
3370
3371 dprintk(1, "\n");
3372 if (*enabled) {
3373 /* write mask to 1 */
3374 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3375 DEFAULT_FR_THRES_8K);
3376 } else {
3377 /* write mask to 0 */
3378 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3379 }
3380 if (status < 0)
3381 pr_err("Error %d on %s\n", status, __func__);
3382
3383 return status;
3384 }
3385
3386 static int dvbt_ctrl_set_echo_threshold(struct drxk_state *state,
3387 struct drxk_cfg_dvbt_echo_thres_t *echo_thres)
3388 {
3389 u16 data = 0;
3390 int status;
3391
3392 dprintk(1, "\n");
3393 status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3394 if (status < 0)
3395 goto error;
3396
3397 switch (echo_thres->fft_mode) {
3398 case DRX_FFTMODE_2K:
3399 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3400 data |= ((echo_thres->threshold <<
3401 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3402 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3403 break;
3404 case DRX_FFTMODE_8K:
3405 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3406 data |= ((echo_thres->threshold <<
3407 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3408 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3409 break;
3410 default:
3411 return -EINVAL;
3412 }
3413
3414 status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3415 error:
3416 if (status < 0)
3417 pr_err("Error %d on %s\n", status, __func__);
3418 return status;
3419 }
3420
3421 static int dvbt_ctrl_set_sqi_speed(struct drxk_state *state,
3422 enum drxk_cfg_dvbt_sqi_speed *speed)
3423 {
3424 int status = -EINVAL;
3425
3426 dprintk(1, "\n");
3427
3428 switch (*speed) {
3429 case DRXK_DVBT_SQI_SPEED_FAST:
3430 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3431 case DRXK_DVBT_SQI_SPEED_SLOW:
3432 break;
3433 default:
3434 goto error;
3435 }
3436 status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3437 (u16) *speed);
3438 error:
3439 if (status < 0)
3440 pr_err("Error %d on %s\n", status, __func__);
3441 return status;
3442 }
3443
3444 /*============================================================================*/
3445
3446 /**
3447 * \brief Activate DVBT specific presets
3448 * \param demod instance of demodulator.
3449 * \return DRXStatus_t.
3450 *
3451 * Called in DVBTSetStandard
3452 *
3453 */
3454 static int dvbt_activate_presets(struct drxk_state *state)
3455 {
3456 int status;
3457 bool setincenable = false;
3458 bool setfrenable = true;
3459
3460 struct drxk_cfg_dvbt_echo_thres_t echo_thres2k = { 0, DRX_FFTMODE_2K };
3461 struct drxk_cfg_dvbt_echo_thres_t echo_thres8k = { 0, DRX_FFTMODE_8K };
3462
3463 dprintk(1, "\n");
3464 status = dvbt_ctrl_set_inc_enable(state, &setincenable);
3465 if (status < 0)
3466 goto error;
3467 status = dvbt_ctrl_set_fr_enable(state, &setfrenable);
3468 if (status < 0)
3469 goto error;
3470 status = dvbt_ctrl_set_echo_threshold(state, &echo_thres2k);
3471 if (status < 0)
3472 goto error;
3473 status = dvbt_ctrl_set_echo_threshold(state, &echo_thres8k);
3474 if (status < 0)
3475 goto error;
3476 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A,
3477 state->m_dvbt_if_agc_cfg.ingain_tgt_max);
3478 error:
3479 if (status < 0)
3480 pr_err("Error %d on %s\n", status, __func__);
3481 return status;
3482 }
3483
3484 /*============================================================================*/
3485
3486 /**
3487 * \brief Initialize channelswitch-independent settings for DVBT.
3488 * \param demod instance of demodulator.
3489 * \return DRXStatus_t.
3490 *
3491 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3492 * the DVB-T taps from the drxk_filters.h are used.
3493 */
3494 static int set_dvbt_standard(struct drxk_state *state,
3495 enum operation_mode o_mode)
3496 {
3497 u16 cmd_result = 0;
3498 u16 data = 0;
3499 int status;
3500
3501 dprintk(1, "\n");
3502
3503 power_up_dvbt(state);
3504 /* added antenna switch */
3505 switch_antenna_to_dvbt(state);
3506 /* send OFDM reset command */
3507 status = scu_command(state,
3508 SCU_RAM_COMMAND_STANDARD_OFDM
3509 | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
3510 0, NULL, 1, &cmd_result);
3511 if (status < 0)
3512 goto error;
3513
3514 /* send OFDM setenv command */
3515 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
3516 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV,
3517 0, NULL, 1, &cmd_result);
3518 if (status < 0)
3519 goto error;
3520
3521 /* reset datapath for OFDM, processors first */
3522 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3523 if (status < 0)
3524 goto error;
3525 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3526 if (status < 0)
3527 goto error;
3528 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3529 if (status < 0)
3530 goto error;
3531
3532 /* IQM setup */
3533 /* synchronize on ofdstate->m_festart */
3534 status = write16(state, IQM_AF_UPD_SEL__A, 1);
3535 if (status < 0)
3536 goto error;
3537 /* window size for clipping ADC detection */
3538 status = write16(state, IQM_AF_CLP_LEN__A, 0);
3539 if (status < 0)
3540 goto error;
3541 /* window size for for sense pre-SAW detection */
3542 status = write16(state, IQM_AF_SNS_LEN__A, 0);
3543 if (status < 0)
3544 goto error;
3545 /* sense threshold for sense pre-SAW detection */
3546 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3547 if (status < 0)
3548 goto error;
3549 status = set_iqm_af(state, true);
3550 if (status < 0)
3551 goto error;
3552
3553 status = write16(state, IQM_AF_AGC_RF__A, 0);
3554 if (status < 0)
3555 goto error;
3556
3557 /* Impulse noise cruncher setup */
3558 status = write16(state, IQM_AF_INC_LCT__A, 0); /* crunch in IQM_CF */
3559 if (status < 0)
3560 goto error;
3561 status = write16(state, IQM_CF_DET_LCT__A, 0); /* detect in IQM_CF */
3562 if (status < 0)
3563 goto error;
3564 status = write16(state, IQM_CF_WND_LEN__A, 3); /* peak detector window length */
3565 if (status < 0)
3566 goto error;
3567
3568 status = write16(state, IQM_RC_STRETCH__A, 16);
3569 if (status < 0)
3570 goto error;
3571 status = write16(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3572 if (status < 0)
3573 goto error;
3574 status = write16(state, IQM_CF_DS_ENA__A, 0x4); /* decimate output 2 */
3575 if (status < 0)
3576 goto error;
3577 status = write16(state, IQM_CF_SCALE__A, 1600);
3578 if (status < 0)
3579 goto error;
3580 status = write16(state, IQM_CF_SCALE_SH__A, 0);
3581 if (status < 0)
3582 goto error;
3583
3584 /* virtual clipping threshold for clipping ADC detection */
3585 status = write16(state, IQM_AF_CLP_TH__A, 448);
3586 if (status < 0)
3587 goto error;
3588 status = write16(state, IQM_CF_DATATH__A, 495); /* crunching threshold */
3589 if (status < 0)
3590 goto error;
3591
3592 status = bl_chain_cmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT,
3593 DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3594 if (status < 0)
3595 goto error;
3596
3597 status = write16(state, IQM_CF_PKDTH__A, 2); /* peak detector threshold */
3598 if (status < 0)
3599 goto error;
3600 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3601 if (status < 0)
3602 goto error;
3603 /* enable power measurement interrupt */
3604 status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3605 if (status < 0)
3606 goto error;
3607 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3608 if (status < 0)
3609 goto error;
3610
3611 /* IQM will not be reset from here, sync ADC and update/init AGC */
3612 status = adc_synchronization(state);
3613 if (status < 0)
3614 goto error;
3615 status = set_pre_saw(state, &state->m_dvbt_pre_saw_cfg);
3616 if (status < 0)
3617 goto error;
3618
3619 /* Halt SCU to enable safe non-atomic accesses */
3620 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3621 if (status < 0)
3622 goto error;
3623
3624 status = set_agc_rf(state, &state->m_dvbt_rf_agc_cfg, true);
3625 if (status < 0)
3626 goto error;
3627 status = set_agc_if(state, &state->m_dvbt_if_agc_cfg, true);
3628 if (status < 0)
3629 goto error;
3630
3631 /* Set Noise Estimation notch width and enable DC fix */
3632 status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3633 if (status < 0)
3634 goto error;
3635 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3636 status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3637 if (status < 0)
3638 goto error;
3639
3640 /* Activate SCU to enable SCU commands */
3641 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3642 if (status < 0)
3643 goto error;
3644
3645 if (!state->m_drxk_a3_rom_code) {
3646 /* AGCInit() is not done for DVBT, so set agcfast_clip_ctrl_delay */
3647 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A,
3648 state->m_dvbt_if_agc_cfg.fast_clip_ctrl_delay);
3649 if (status < 0)
3650 goto error;
3651 }
3652
3653 /* OFDM_SC setup */
3654 #ifdef COMPILE_FOR_NONRT
3655 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3656 if (status < 0)
3657 goto error;
3658 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3659 if (status < 0)
3660 goto error;
3661 #endif
3662
3663 /* FEC setup */
3664 status = write16(state, FEC_DI_INPUT_CTL__A, 1); /* OFDM input */
3665 if (status < 0)
3666 goto error;
3667
3668
3669 #ifdef COMPILE_FOR_NONRT
3670 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3671 if (status < 0)
3672 goto error;
3673 #else
3674 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3675 if (status < 0)
3676 goto error;
3677 #endif
3678 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3679 if (status < 0)
3680 goto error;
3681
3682 /* Setup MPEG bus */
3683 status = mpegts_dto_setup(state, OM_DVBT);
3684 if (status < 0)
3685 goto error;
3686 /* Set DVBT Presets */
3687 status = dvbt_activate_presets(state);
3688 if (status < 0)
3689 goto error;
3690
3691 error:
3692 if (status < 0)
3693 pr_err("Error %d on %s\n", status, __func__);
3694 return status;
3695 }
3696
3697 /*============================================================================*/
3698 /**
3699 * \brief start dvbt demodulating for channel.
3700 * \param demod instance of demodulator.
3701 * \return DRXStatus_t.
3702 */
3703 static int dvbt_start(struct drxk_state *state)
3704 {
3705 u16 param1;
3706 int status;
3707 /* drxk_ofdm_sc_cmd_t scCmd; */
3708
3709 dprintk(1, "\n");
3710 /* start correct processes to get in lock */
3711 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3712 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3713 status = dvbt_sc_command(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0,
3714 OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1,
3715 0, 0, 0);
3716 if (status < 0)
3717 goto error;
3718 /* start FEC OC */
3719 status = mpegts_start(state);
3720 if (status < 0)
3721 goto error;
3722 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3723 if (status < 0)
3724 goto error;
3725 error:
3726 if (status < 0)
3727 pr_err("Error %d on %s\n", status, __func__);
3728 return status;
3729 }
3730
3731
3732 /*============================================================================*/
3733
3734 /**
3735 * \brief Set up dvbt demodulator for channel.
3736 * \param demod instance of demodulator.
3737 * \return DRXStatus_t.
3738 * // original DVBTSetChannel()
3739 */
3740 static int set_dvbt(struct drxk_state *state, u16 intermediate_freqk_hz,
3741 s32 tuner_freq_offset)
3742 {
3743 u16 cmd_result = 0;
3744 u16 transmission_params = 0;
3745 u16 operation_mode = 0;
3746 u32 iqm_rc_rate_ofs = 0;
3747 u32 bandwidth = 0;
3748 u16 param1;
3749 int status;
3750
3751 dprintk(1, "IF =%d, TFO = %d\n",
3752 intermediate_freqk_hz, tuner_freq_offset);
3753
3754 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
3755 | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
3756 0, NULL, 1, &cmd_result);
3757 if (status < 0)
3758 goto error;
3759
3760 /* Halt SCU to enable safe non-atomic accesses */
3761 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3762 if (status < 0)
3763 goto error;
3764
3765 /* Stop processors */
3766 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3767 if (status < 0)
3768 goto error;
3769 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3770 if (status < 0)
3771 goto error;
3772
3773 /* Mandatory fix, always stop CP, required to set spl offset back to
3774 hardware default (is set to 0 by ucode during pilot detection */
3775 status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3776 if (status < 0)
3777 goto error;
3778
3779 /*== Write channel settings to device ================================*/
3780
3781 /* mode */
3782 switch (state->props.transmission_mode) {
3783 case TRANSMISSION_MODE_AUTO:
3784 default:
3785 operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_MODE__M;
3786 /* fall through , try first guess DRX_FFTMODE_8K */
3787 case TRANSMISSION_MODE_8K:
3788 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3789 break;
3790 case TRANSMISSION_MODE_2K:
3791 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3792 break;
3793 }
3794
3795 /* guard */
3796 switch (state->props.guard_interval) {
3797 default:
3798 case GUARD_INTERVAL_AUTO:
3799 operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M;
3800 /* fall through , try first guess DRX_GUARD_1DIV4 */
3801 case GUARD_INTERVAL_1_4:
3802 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3803 break;
3804 case GUARD_INTERVAL_1_32:
3805 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3806 break;
3807 case GUARD_INTERVAL_1_16:
3808 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3809 break;
3810 case GUARD_INTERVAL_1_8:
3811 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3812 break;
3813 }
3814
3815 /* hierarchy */
3816 switch (state->props.hierarchy) {
3817 case HIERARCHY_AUTO:
3818 case HIERARCHY_NONE:
3819 default:
3820 operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_HIER__M;
3821 /* fall through , try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3822 /* transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3823 /* break; */
3824 case HIERARCHY_1:
3825 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3826 break;
3827 case HIERARCHY_2:
3828 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3829 break;
3830 case HIERARCHY_4:
3831 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3832 break;
3833 }
3834
3835
3836 /* modulation */
3837 switch (state->props.modulation) {
3838 case QAM_AUTO:
3839 default:
3840 operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_CONST__M;
3841 /* fall through , try first guess DRX_CONSTELLATION_QAM64 */
3842 case QAM_64:
3843 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3844 break;
3845 case QPSK:
3846 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3847 break;
3848 case QAM_16:
3849 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3850 break;
3851 }
3852 #if 0
3853 /* No hierarchical channels support in BDA */
3854 /* Priority (only for hierarchical channels) */
3855 switch (channel->priority) {
3856 case DRX_PRIORITY_LOW:
3857 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3858 WR16(dev_addr, OFDM_EC_SB_PRIOR__A,
3859 OFDM_EC_SB_PRIOR_LO);
3860 break;
3861 case DRX_PRIORITY_HIGH:
3862 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3863 WR16(dev_addr, OFDM_EC_SB_PRIOR__A,
3864 OFDM_EC_SB_PRIOR_HI));
3865 break;
3866 case DRX_PRIORITY_UNKNOWN: /* fall through */
3867 default:
3868 status = -EINVAL;
3869 goto error;
3870 }
3871 #else
3872 /* Set Priorty high */
3873 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3874 status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3875 if (status < 0)
3876 goto error;
3877 #endif
3878
3879 /* coderate */
3880 switch (state->props.code_rate_HP) {
3881 case FEC_AUTO:
3882 default:
3883 operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_RATE__M;
3884 /* fall through , try first guess DRX_CODERATE_2DIV3 */
3885 case FEC_2_3:
3886 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3887 break;
3888 case FEC_1_2:
3889 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3890 break;
3891 case FEC_3_4:
3892 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3893 break;
3894 case FEC_5_6:
3895 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3896 break;
3897 case FEC_7_8:
3898 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3899 break;
3900 }
3901
3902 /*
3903 * SAW filter selection: normaly not necesarry, but if wanted
3904 * the application can select a SAW filter via the driver by
3905 * using UIOs
3906 */
3907
3908 /* First determine real bandwidth (Hz) */
3909 /* Also set delay for impulse noise cruncher */
3910 /*
3911 * Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is
3912 * changed by SC for fix for some 8K,1/8 guard but is restored by
3913 * InitEC and ResetEC functions
3914 */
3915 switch (state->props.bandwidth_hz) {
3916 case 0:
3917 state->props.bandwidth_hz = 8000000;
3918 /* fall though */
3919 case 8000000:
3920 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3921 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3922 3052);
3923 if (status < 0)
3924 goto error;
3925 /* cochannel protection for PAL 8 MHz */
3926 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3927 7);
3928 if (status < 0)
3929 goto error;
3930 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3931 7);
3932 if (status < 0)
3933 goto error;
3934 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3935 7);
3936 if (status < 0)
3937 goto error;
3938 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3939 1);
3940 if (status < 0)
3941 goto error;
3942 break;
3943 case 7000000:
3944 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3945 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3946 3491);
3947 if (status < 0)
3948 goto error;
3949 /* cochannel protection for PAL 7 MHz */
3950 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3951 8);
3952 if (status < 0)
3953 goto error;
3954 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3955 8);
3956 if (status < 0)
3957 goto error;
3958 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3959 4);
3960 if (status < 0)
3961 goto error;
3962 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3963 1);
3964 if (status < 0)
3965 goto error;
3966 break;
3967 case 6000000:
3968 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3969 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3970 4073);
3971 if (status < 0)
3972 goto error;
3973 /* cochannel protection for NTSC 6 MHz */
3974 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3975 19);
3976 if (status < 0)
3977 goto error;
3978 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3979 19);
3980 if (status < 0)
3981 goto error;
3982 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3983 14);
3984 if (status < 0)
3985 goto error;
3986 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3987 1);
3988 if (status < 0)
3989 goto error;
3990 break;
3991 default:
3992 status = -EINVAL;
3993 goto error;
3994 }
3995
3996 if (iqm_rc_rate_ofs == 0) {
3997 /* Now compute IQM_RC_RATE_OFS
3998 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
3999 =>
4000 ((SysFreq / BandWidth) * (2^21)) - (2^23)
4001 */
4002 /* (SysFreq / BandWidth) * (2^28) */
4003 /*
4004 * assert (MAX(sysClk)/MIN(bandwidth) < 16)
4005 * => assert(MAX(sysClk) < 16*MIN(bandwidth))
4006 * => assert(109714272 > 48000000) = true
4007 * so Frac 28 can be used
4008 */
4009 iqm_rc_rate_ofs = Frac28a((u32)
4010 ((state->m_sys_clock_freq *
4011 1000) / 3), bandwidth);
4012 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
4013 if ((iqm_rc_rate_ofs & 0x7fL) >= 0x40)
4014 iqm_rc_rate_ofs += 0x80L;
4015 iqm_rc_rate_ofs = iqm_rc_rate_ofs >> 7;
4016 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
4017 iqm_rc_rate_ofs = iqm_rc_rate_ofs - (1 << 23);
4018 }
4019
4020 iqm_rc_rate_ofs &=
4021 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
4022 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
4023 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate_ofs);
4024 if (status < 0)
4025 goto error;
4026
4027 /* Bandwidth setting done */
4028
4029 #if 0
4030 status = dvbt_set_frequency_shift(demod, channel, tuner_offset);
4031 if (status < 0)
4032 goto error;
4033 #endif
4034 status = set_frequency_shifter(state, intermediate_freqk_hz,
4035 tuner_freq_offset, true);
4036 if (status < 0)
4037 goto error;
4038
4039 /*== start SC, write channel settings to SC ==========================*/
4040
4041 /* Activate SCU to enable SCU commands */
4042 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
4043 if (status < 0)
4044 goto error;
4045
4046 /* Enable SC after setting all other parameters */
4047 status = write16(state, OFDM_SC_COMM_STATE__A, 0);
4048 if (status < 0)
4049 goto error;
4050 status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4051 if (status < 0)
4052 goto error;
4053
4054
4055 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
4056 | SCU_RAM_COMMAND_CMD_DEMOD_START,
4057 0, NULL, 1, &cmd_result);
4058 if (status < 0)
4059 goto error;
4060
4061 /* Write SC parameter registers, set all AUTO flags in operation mode */
4062 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4063 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4064 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4065 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4066 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4067 status = dvbt_sc_command(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4068 0, transmission_params, param1, 0, 0, 0);
4069 if (status < 0)
4070 goto error;
4071
4072 if (!state->m_drxk_a3_rom_code)
4073 status = dvbt_ctrl_set_sqi_speed(state, &state->m_sqi_speed);
4074 error:
4075 if (status < 0)
4076 pr_err("Error %d on %s\n", status, __func__);
4077
4078 return status;
4079 }
4080
4081
4082 /*============================================================================*/
4083
4084 /**
4085 * \brief Retrieve lock status .
4086 * \param demod Pointer to demodulator instance.
4087 * \param lockStat Pointer to lock status structure.
4088 * \return DRXStatus_t.
4089 *
4090 */
4091 static int get_dvbt_lock_status(struct drxk_state *state, u32 *p_lock_status)
4092 {
4093 int status;
4094 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4095 OFDM_SC_RA_RAM_LOCK_FEC__M);
4096 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4097 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4098
4099 u16 sc_ra_ram_lock = 0;
4100 u16 sc_comm_exec = 0;
4101
4102 dprintk(1, "\n");
4103
4104 *p_lock_status = NOT_LOCKED;
4105 /* driver 0.9.0 */
4106 /* Check if SC is running */
4107 status = read16(state, OFDM_SC_COMM_EXEC__A, &sc_comm_exec);
4108 if (status < 0)
4109 goto end;
4110 if (sc_comm_exec == OFDM_SC_COMM_EXEC_STOP)
4111 goto end;
4112
4113 status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &sc_ra_ram_lock);
4114 if (status < 0)
4115 goto end;
4116
4117 if ((sc_ra_ram_lock & mpeg_lock_mask) == mpeg_lock_mask)
4118 *p_lock_status = MPEG_LOCK;
4119 else if ((sc_ra_ram_lock & fec_lock_mask) == fec_lock_mask)
4120 *p_lock_status = FEC_LOCK;
4121 else if ((sc_ra_ram_lock & demod_lock_mask) == demod_lock_mask)
4122 *p_lock_status = DEMOD_LOCK;
4123 else if (sc_ra_ram_lock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4124 *p_lock_status = NEVER_LOCK;
4125 end:
4126 if (status < 0)
4127 pr_err("Error %d on %s\n", status, __func__);
4128
4129 return status;
4130 }
4131
4132 static int power_up_qam(struct drxk_state *state)
4133 {
4134 enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
4135 int status;
4136
4137 dprintk(1, "\n");
4138 status = ctrl_power_mode(state, &power_mode);
4139 if (status < 0)
4140 pr_err("Error %d on %s\n", status, __func__);
4141
4142 return status;
4143 }
4144
4145
4146 /** Power Down QAM */
4147 static int power_down_qam(struct drxk_state *state)
4148 {
4149 u16 data = 0;
4150 u16 cmd_result;
4151 int status = 0;
4152
4153 dprintk(1, "\n");
4154 status = read16(state, SCU_COMM_EXEC__A, &data);
4155 if (status < 0)
4156 goto error;
4157 if (data == SCU_COMM_EXEC_ACTIVE) {
4158 /*
4159 STOP demodulator
4160 QAM and HW blocks
4161 */
4162 /* stop all comstate->m_exec */
4163 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4164 if (status < 0)
4165 goto error;
4166 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
4167 | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
4168 0, NULL, 1, &cmd_result);
4169 if (status < 0)
4170 goto error;
4171 }
4172 /* powerdown AFE */
4173 status = set_iqm_af(state, false);
4174
4175 error:
4176 if (status < 0)
4177 pr_err("Error %d on %s\n", status, __func__);
4178
4179 return status;
4180 }
4181
4182 /*============================================================================*/
4183
4184 /**
4185 * \brief Setup of the QAM Measurement intervals for signal quality
4186 * \param demod instance of demod.
4187 * \param modulation current modulation.
4188 * \return DRXStatus_t.
4189 *
4190 * NOTE:
4191 * Take into account that for certain settings the errorcounters can overflow.
4192 * The implementation does not check this.
4193 *
4194 */
4195 static int set_qam_measurement(struct drxk_state *state,
4196 enum e_drxk_constellation modulation,
4197 u32 symbol_rate)
4198 {
4199 u32 fec_bits_desired = 0; /* BER accounting period */
4200 u32 fec_rs_period_total = 0; /* Total period */
4201 u16 fec_rs_prescale = 0; /* ReedSolomon Measurement Prescale */
4202 u16 fec_rs_period = 0; /* Value for corresponding I2C register */
4203 int status = 0;
4204
4205 dprintk(1, "\n");
4206
4207 fec_rs_prescale = 1;
4208 /* fec_bits_desired = symbol_rate [kHz] *
4209 FrameLenght [ms] *
4210 (modulation + 1) *
4211 SyncLoss (== 1) *
4212 ViterbiLoss (==1)
4213 */
4214 switch (modulation) {
4215 case DRX_CONSTELLATION_QAM16:
4216 fec_bits_desired = 4 * symbol_rate;
4217 break;
4218 case DRX_CONSTELLATION_QAM32:
4219 fec_bits_desired = 5 * symbol_rate;
4220 break;
4221 case DRX_CONSTELLATION_QAM64:
4222 fec_bits_desired = 6 * symbol_rate;
4223 break;
4224 case DRX_CONSTELLATION_QAM128:
4225 fec_bits_desired = 7 * symbol_rate;
4226 break;
4227 case DRX_CONSTELLATION_QAM256:
4228 fec_bits_desired = 8 * symbol_rate;
4229 break;
4230 default:
4231 status = -EINVAL;
4232 }
4233 if (status < 0)
4234 goto error;
4235
4236 fec_bits_desired /= 1000; /* symbol_rate [Hz] -> symbol_rate [kHz] */
4237 fec_bits_desired *= 500; /* meas. period [ms] */
4238
4239 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4240 /* fec_rs_period_total = fec_bits_desired / 1632 */
4241 fec_rs_period_total = (fec_bits_desired / 1632UL) + 1; /* roughly ceil */
4242
4243 /* fec_rs_period_total = fec_rs_prescale * fec_rs_period */
4244 fec_rs_prescale = 1 + (u16) (fec_rs_period_total >> 16);
4245 if (fec_rs_prescale == 0) {
4246 /* Divide by zero (though impossible) */
4247 status = -EINVAL;
4248 if (status < 0)
4249 goto error;
4250 }
4251 fec_rs_period =
4252 ((u16) fec_rs_period_total +
4253 (fec_rs_prescale >> 1)) / fec_rs_prescale;
4254
4255 /* write corresponding registers */
4256 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fec_rs_period);
4257 if (status < 0)
4258 goto error;
4259 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A,
4260 fec_rs_prescale);
4261 if (status < 0)
4262 goto error;
4263 status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fec_rs_period);
4264 error:
4265 if (status < 0)
4266 pr_err("Error %d on %s\n", status, __func__);
4267 return status;
4268 }
4269
4270 static int set_qam16(struct drxk_state *state)
4271 {
4272 int status = 0;
4273
4274 dprintk(1, "\n");
4275 /* QAM Equalizer Setup */
4276 /* Equalizer */
4277 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4278 if (status < 0)
4279 goto error;
4280 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4281 if (status < 0)
4282 goto error;
4283 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4284 if (status < 0)
4285 goto error;
4286 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4287 if (status < 0)
4288 goto error;
4289 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4290 if (status < 0)
4291 goto error;
4292 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4293 if (status < 0)
4294 goto error;
4295 /* Decision Feedback Equalizer */
4296 status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4297 if (status < 0)
4298 goto error;
4299 status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4300 if (status < 0)
4301 goto error;
4302 status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4303 if (status < 0)
4304 goto error;
4305 status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4306 if (status < 0)
4307 goto error;
4308 status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4309 if (status < 0)
4310 goto error;
4311 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4312 if (status < 0)
4313 goto error;
4314
4315 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4316 if (status < 0)
4317 goto error;
4318 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4319 if (status < 0)
4320 goto error;
4321 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4322 if (status < 0)
4323 goto error;
4324
4325 /* QAM Slicer Settings */
4326 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4327 DRXK_QAM_SL_SIG_POWER_QAM16);
4328 if (status < 0)
4329 goto error;
4330
4331 /* QAM Loop Controller Coeficients */
4332 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4333 if (status < 0)
4334 goto error;
4335 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4336 if (status < 0)
4337 goto error;
4338 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4339 if (status < 0)
4340 goto error;
4341 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4342 if (status < 0)
4343 goto error;
4344 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4345 if (status < 0)
4346 goto error;
4347 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4348 if (status < 0)
4349 goto error;
4350 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4351 if (status < 0)
4352 goto error;
4353 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4354 if (status < 0)
4355 goto error;
4356
4357 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4358 if (status < 0)
4359 goto error;
4360 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4361 if (status < 0)
4362 goto error;
4363 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4364 if (status < 0)
4365 goto error;
4366 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4367 if (status < 0)
4368 goto error;
4369 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4370 if (status < 0)
4371 goto error;
4372 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4373 if (status < 0)
4374 goto error;
4375 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4376 if (status < 0)
4377 goto error;
4378 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4379 if (status < 0)
4380 goto error;
4381 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4382 if (status < 0)
4383 goto error;
4384 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4385 if (status < 0)
4386 goto error;
4387 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4388 if (status < 0)
4389 goto error;
4390 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4391 if (status < 0)
4392 goto error;
4393
4394
4395 /* QAM State Machine (FSM) Thresholds */
4396
4397 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4398 if (status < 0)
4399 goto error;
4400 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4401 if (status < 0)
4402 goto error;
4403 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4404 if (status < 0)
4405 goto error;
4406 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4407 if (status < 0)
4408 goto error;
4409 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4410 if (status < 0)
4411 goto error;
4412 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4413 if (status < 0)
4414 goto error;
4415
4416 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4417 if (status < 0)
4418 goto error;
4419 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4420 if (status < 0)
4421 goto error;
4422 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4423 if (status < 0)
4424 goto error;
4425
4426
4427 /* QAM FSM Tracking Parameters */
4428
4429 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4430 if (status < 0)
4431 goto error;
4432 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4433 if (status < 0)
4434 goto error;
4435 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4436 if (status < 0)
4437 goto error;
4438 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4439 if (status < 0)
4440 goto error;
4441 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4442 if (status < 0)
4443 goto error;
4444 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4445 if (status < 0)
4446 goto error;
4447 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4448 if (status < 0)
4449 goto error;
4450
4451 error:
4452 if (status < 0)
4453 pr_err("Error %d on %s\n", status, __func__);
4454 return status;
4455 }
4456
4457 /*============================================================================*/
4458
4459 /**
4460 * \brief QAM32 specific setup
4461 * \param demod instance of demod.
4462 * \return DRXStatus_t.
4463 */
4464 static int set_qam32(struct drxk_state *state)
4465 {
4466 int status = 0;
4467
4468 dprintk(1, "\n");
4469
4470 /* QAM Equalizer Setup */
4471 /* Equalizer */
4472 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4473 if (status < 0)
4474 goto error;
4475 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4476 if (status < 0)
4477 goto error;
4478 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4479 if (status < 0)
4480 goto error;
4481 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4482 if (status < 0)
4483 goto error;
4484 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4485 if (status < 0)
4486 goto error;
4487 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4488 if (status < 0)
4489 goto error;
4490
4491 /* Decision Feedback Equalizer */
4492 status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4493 if (status < 0)
4494 goto error;
4495 status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4496 if (status < 0)
4497 goto error;
4498 status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4499 if (status < 0)
4500 goto error;
4501 status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4502 if (status < 0)
4503 goto error;
4504 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4505 if (status < 0)
4506 goto error;
4507 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4508 if (status < 0)
4509 goto error;
4510
4511 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4512 if (status < 0)
4513 goto error;
4514 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4515 if (status < 0)
4516 goto error;
4517 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4518 if (status < 0)
4519 goto error;
4520
4521 /* QAM Slicer Settings */
4522
4523 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4524 DRXK_QAM_SL_SIG_POWER_QAM32);
4525 if (status < 0)
4526 goto error;
4527
4528
4529 /* QAM Loop Controller Coeficients */
4530
4531 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4532 if (status < 0)
4533 goto error;
4534 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4535 if (status < 0)
4536 goto error;
4537 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4538 if (status < 0)
4539 goto error;
4540 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4541 if (status < 0)
4542 goto error;
4543 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4544 if (status < 0)
4545 goto error;
4546 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4547 if (status < 0)
4548 goto error;
4549 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4550 if (status < 0)
4551 goto error;
4552 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4553 if (status < 0)
4554 goto error;
4555
4556 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4557 if (status < 0)
4558 goto error;
4559 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4560 if (status < 0)
4561 goto error;
4562 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4563 if (status < 0)
4564 goto error;
4565 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4566 if (status < 0)
4567 goto error;
4568 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4569 if (status < 0)
4570 goto error;
4571 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4572 if (status < 0)
4573 goto error;
4574 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4575 if (status < 0)
4576 goto error;
4577 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4578 if (status < 0)
4579 goto error;
4580 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4581 if (status < 0)
4582 goto error;
4583 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4584 if (status < 0)
4585 goto error;
4586 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4587 if (status < 0)
4588 goto error;
4589 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4590 if (status < 0)
4591 goto error;
4592
4593
4594 /* QAM State Machine (FSM) Thresholds */
4595
4596 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4597 if (status < 0)
4598 goto error;
4599 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4600 if (status < 0)
4601 goto error;
4602 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4603 if (status < 0)
4604 goto error;
4605 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4606 if (status < 0)
4607 goto error;
4608 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4609 if (status < 0)
4610 goto error;
4611 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4612 if (status < 0)
4613 goto error;
4614
4615 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4616 if (status < 0)
4617 goto error;
4618 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4619 if (status < 0)
4620 goto error;
4621 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4622 if (status < 0)
4623 goto error;
4624
4625
4626 /* QAM FSM Tracking Parameters */
4627
4628 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4629 if (status < 0)
4630 goto error;
4631 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4632 if (status < 0)
4633 goto error;
4634 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4635 if (status < 0)
4636 goto error;
4637 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4638 if (status < 0)
4639 goto error;
4640 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4641 if (status < 0)
4642 goto error;
4643 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4644 if (status < 0)
4645 goto error;
4646 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4647 error:
4648 if (status < 0)
4649 pr_err("Error %d on %s\n", status, __func__);
4650 return status;
4651 }
4652
4653 /*============================================================================*/
4654
4655 /**
4656 * \brief QAM64 specific setup
4657 * \param demod instance of demod.
4658 * \return DRXStatus_t.
4659 */
4660 static int set_qam64(struct drxk_state *state)
4661 {
4662 int status = 0;
4663
4664 dprintk(1, "\n");
4665 /* QAM Equalizer Setup */
4666 /* Equalizer */
4667 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4668 if (status < 0)
4669 goto error;
4670 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4671 if (status < 0)
4672 goto error;
4673 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4674 if (status < 0)
4675 goto error;
4676 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4677 if (status < 0)
4678 goto error;
4679 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4680 if (status < 0)
4681 goto error;
4682 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4683 if (status < 0)
4684 goto error;
4685
4686 /* Decision Feedback Equalizer */
4687 status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4688 if (status < 0)
4689 goto error;
4690 status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4691 if (status < 0)
4692 goto error;
4693 status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4694 if (status < 0)
4695 goto error;
4696 status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4697 if (status < 0)
4698 goto error;
4699 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4700 if (status < 0)
4701 goto error;
4702 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4703 if (status < 0)
4704 goto error;
4705
4706 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4707 if (status < 0)
4708 goto error;
4709 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4710 if (status < 0)
4711 goto error;
4712 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4713 if (status < 0)
4714 goto error;
4715
4716 /* QAM Slicer Settings */
4717 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4718 DRXK_QAM_SL_SIG_POWER_QAM64);
4719 if (status < 0)
4720 goto error;
4721
4722
4723 /* QAM Loop Controller Coeficients */
4724
4725 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4726 if (status < 0)
4727 goto error;
4728 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4729 if (status < 0)
4730 goto error;
4731 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4732 if (status < 0)
4733 goto error;
4734 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4735 if (status < 0)
4736 goto error;
4737 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4738 if (status < 0)
4739 goto error;
4740 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4741 if (status < 0)
4742 goto error;
4743 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4744 if (status < 0)
4745 goto error;
4746 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4747 if (status < 0)
4748 goto error;
4749
4750 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4751 if (status < 0)
4752 goto error;
4753 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4754 if (status < 0)
4755 goto error;
4756 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4757 if (status < 0)
4758 goto error;
4759 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4760 if (status < 0)
4761 goto error;
4762 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4763 if (status < 0)
4764 goto error;
4765 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4766 if (status < 0)
4767 goto error;
4768 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4769 if (status < 0)
4770 goto error;
4771 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4772 if (status < 0)
4773 goto error;
4774 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4775 if (status < 0)
4776 goto error;
4777 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4778 if (status < 0)
4779 goto error;
4780 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4781 if (status < 0)
4782 goto error;
4783 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4784 if (status < 0)
4785 goto error;
4786
4787
4788 /* QAM State Machine (FSM) Thresholds */
4789
4790 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4791 if (status < 0)
4792 goto error;
4793 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4794 if (status < 0)
4795 goto error;
4796 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4797 if (status < 0)
4798 goto error;
4799 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4800 if (status < 0)
4801 goto error;
4802 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4803 if (status < 0)
4804 goto error;
4805 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4806 if (status < 0)
4807 goto error;
4808
4809 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4810 if (status < 0)
4811 goto error;
4812 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4813 if (status < 0)
4814 goto error;
4815 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4816 if (status < 0)
4817 goto error;
4818
4819
4820 /* QAM FSM Tracking Parameters */
4821
4822 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4823 if (status < 0)
4824 goto error;
4825 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4826 if (status < 0)
4827 goto error;
4828 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4829 if (status < 0)
4830 goto error;
4831 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4832 if (status < 0)
4833 goto error;
4834 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4835 if (status < 0)
4836 goto error;
4837 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4838 if (status < 0)
4839 goto error;
4840 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4841 error:
4842 if (status < 0)
4843 pr_err("Error %d on %s\n", status, __func__);
4844
4845 return status;
4846 }
4847
4848 /*============================================================================*/
4849
4850 /**
4851 * \brief QAM128 specific setup
4852 * \param demod: instance of demod.
4853 * \return DRXStatus_t.
4854 */
4855 static int set_qam128(struct drxk_state *state)
4856 {
4857 int status = 0;
4858
4859 dprintk(1, "\n");
4860 /* QAM Equalizer Setup */
4861 /* Equalizer */
4862 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4863 if (status < 0)
4864 goto error;
4865 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4866 if (status < 0)
4867 goto error;
4868 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4869 if (status < 0)
4870 goto error;
4871 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4872 if (status < 0)
4873 goto error;
4874 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4875 if (status < 0)
4876 goto error;
4877 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4878 if (status < 0)
4879 goto error;
4880
4881 /* Decision Feedback Equalizer */
4882 status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4883 if (status < 0)
4884 goto error;
4885 status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4886 if (status < 0)
4887 goto error;
4888 status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4889 if (status < 0)
4890 goto error;
4891 status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4892 if (status < 0)
4893 goto error;
4894 status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4895 if (status < 0)
4896 goto error;
4897 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4898 if (status < 0)
4899 goto error;
4900
4901 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4902 if (status < 0)
4903 goto error;
4904 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4905 if (status < 0)
4906 goto error;
4907 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4908 if (status < 0)
4909 goto error;
4910
4911
4912 /* QAM Slicer Settings */
4913
4914 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4915 DRXK_QAM_SL_SIG_POWER_QAM128);
4916 if (status < 0)
4917 goto error;
4918
4919
4920 /* QAM Loop Controller Coeficients */
4921
4922 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4923 if (status < 0)
4924 goto error;
4925 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4926 if (status < 0)
4927 goto error;
4928 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4929 if (status < 0)
4930 goto error;
4931 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4932 if (status < 0)
4933 goto error;
4934 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4935 if (status < 0)
4936 goto error;
4937 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4938 if (status < 0)
4939 goto error;
4940 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4941 if (status < 0)
4942 goto error;
4943 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4944 if (status < 0)
4945 goto error;
4946
4947 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4948 if (status < 0)
4949 goto error;
4950 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4951 if (status < 0)
4952 goto error;
4953 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4954 if (status < 0)
4955 goto error;
4956 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4957 if (status < 0)
4958 goto error;
4959 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4960 if (status < 0)
4961 goto error;
4962 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4963 if (status < 0)
4964 goto error;
4965 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4966 if (status < 0)
4967 goto error;
4968 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4969 if (status < 0)
4970 goto error;
4971 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4972 if (status < 0)
4973 goto error;
4974 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4975 if (status < 0)
4976 goto error;
4977 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4978 if (status < 0)
4979 goto error;
4980 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4981 if (status < 0)
4982 goto error;
4983
4984
4985 /* QAM State Machine (FSM) Thresholds */
4986
4987 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4988 if (status < 0)
4989 goto error;
4990 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4991 if (status < 0)
4992 goto error;
4993 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4994 if (status < 0)
4995 goto error;
4996 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4997 if (status < 0)
4998 goto error;
4999 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
5000 if (status < 0)
5001 goto error;
5002 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
5003 if (status < 0)
5004 goto error;
5005
5006 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5007 if (status < 0)
5008 goto error;
5009 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
5010 if (status < 0)
5011 goto error;
5012
5013 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5014 if (status < 0)
5015 goto error;
5016
5017 /* QAM FSM Tracking Parameters */
5018
5019 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5020 if (status < 0)
5021 goto error;
5022 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
5023 if (status < 0)
5024 goto error;
5025 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
5026 if (status < 0)
5027 goto error;
5028 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
5029 if (status < 0)
5030 goto error;
5031 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
5032 if (status < 0)
5033 goto error;
5034 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
5035 if (status < 0)
5036 goto error;
5037 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
5038 error:
5039 if (status < 0)
5040 pr_err("Error %d on %s\n", status, __func__);
5041
5042 return status;
5043 }
5044
5045 /*============================================================================*/
5046
5047 /**
5048 * \brief QAM256 specific setup
5049 * \param demod: instance of demod.
5050 * \return DRXStatus_t.
5051 */
5052 static int set_qam256(struct drxk_state *state)
5053 {
5054 int status = 0;
5055
5056 dprintk(1, "\n");
5057 /* QAM Equalizer Setup */
5058 /* Equalizer */
5059 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5060 if (status < 0)
5061 goto error;
5062 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5063 if (status < 0)
5064 goto error;
5065 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5066 if (status < 0)
5067 goto error;
5068 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5069 if (status < 0)
5070 goto error;
5071 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5072 if (status < 0)
5073 goto error;
5074 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5075 if (status < 0)
5076 goto error;
5077
5078 /* Decision Feedback Equalizer */
5079 status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5080 if (status < 0)
5081 goto error;
5082 status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5083 if (status < 0)
5084 goto error;
5085 status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5086 if (status < 0)
5087 goto error;
5088 status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5089 if (status < 0)
5090 goto error;
5091 status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5092 if (status < 0)
5093 goto error;
5094 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5095 if (status < 0)
5096 goto error;
5097
5098 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5099 if (status < 0)
5100 goto error;
5101 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5102 if (status < 0)
5103 goto error;
5104 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5105 if (status < 0)
5106 goto error;
5107
5108 /* QAM Slicer Settings */
5109
5110 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
5111 DRXK_QAM_SL_SIG_POWER_QAM256);
5112 if (status < 0)
5113 goto error;
5114
5115
5116 /* QAM Loop Controller Coeficients */
5117
5118 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5119 if (status < 0)
5120 goto error;
5121 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5122 if (status < 0)
5123 goto error;
5124 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5125 if (status < 0)
5126 goto error;
5127 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5128 if (status < 0)
5129 goto error;
5130 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5131 if (status < 0)
5132 goto error;
5133 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5134 if (status < 0)
5135 goto error;
5136 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5137 if (status < 0)
5138 goto error;
5139 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5140 if (status < 0)
5141 goto error;
5142
5143 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5144 if (status < 0)
5145 goto error;
5146 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5147 if (status < 0)
5148 goto error;
5149 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5150 if (status < 0)
5151 goto error;
5152 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5153 if (status < 0)
5154 goto error;
5155 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5156 if (status < 0)
5157 goto error;
5158 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5159 if (status < 0)
5160 goto error;
5161 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5162 if (status < 0)
5163 goto error;
5164 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5165 if (status < 0)
5166 goto error;
5167 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5168 if (status < 0)
5169 goto error;
5170 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5171 if (status < 0)
5172 goto error;
5173 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5174 if (status < 0)
5175 goto error;
5176 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5177 if (status < 0)
5178 goto error;
5179
5180
5181 /* QAM State Machine (FSM) Thresholds */
5182
5183 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5184 if (status < 0)
5185 goto error;
5186 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5187 if (status < 0)
5188 goto error;
5189 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5190 if (status < 0)
5191 goto error;
5192 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5193 if (status < 0)
5194 goto error;
5195 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5196 if (status < 0)
5197 goto error;
5198 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5199 if (status < 0)
5200 goto error;
5201
5202 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5203 if (status < 0)
5204 goto error;
5205 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5206 if (status < 0)
5207 goto error;
5208 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5209 if (status < 0)
5210 goto error;
5211
5212
5213 /* QAM FSM Tracking Parameters */
5214
5215 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5216 if (status < 0)
5217 goto error;
5218 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5219 if (status < 0)
5220 goto error;
5221 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5222 if (status < 0)
5223 goto error;
5224 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5225 if (status < 0)
5226 goto error;
5227 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5228 if (status < 0)
5229 goto error;
5230 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5231 if (status < 0)
5232 goto error;
5233 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5234 error:
5235 if (status < 0)
5236 pr_err("Error %d on %s\n", status, __func__);
5237 return status;
5238 }
5239
5240
5241 /*============================================================================*/
5242 /**
5243 * \brief Reset QAM block.
5244 * \param demod: instance of demod.
5245 * \param channel: pointer to channel data.
5246 * \return DRXStatus_t.
5247 */
5248 static int qam_reset_qam(struct drxk_state *state)
5249 {
5250 int status;
5251 u16 cmd_result;
5252
5253 dprintk(1, "\n");
5254 /* Stop QAM comstate->m_exec */
5255 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5256 if (status < 0)
5257 goto error;
5258
5259 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
5260 | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
5261 0, NULL, 1, &cmd_result);
5262 error:
5263 if (status < 0)
5264 pr_err("Error %d on %s\n", status, __func__);
5265 return status;
5266 }
5267
5268 /*============================================================================*/
5269
5270 /**
5271 * \brief Set QAM symbolrate.
5272 * \param demod: instance of demod.
5273 * \param channel: pointer to channel data.
5274 * \return DRXStatus_t.
5275 */
5276 static int qam_set_symbolrate(struct drxk_state *state)
5277 {
5278 u32 adc_frequency = 0;
5279 u32 symb_freq = 0;
5280 u32 iqm_rc_rate = 0;
5281 u16 ratesel = 0;
5282 u32 lc_symb_rate = 0;
5283 int status;
5284
5285 dprintk(1, "\n");
5286 /* Select & calculate correct IQM rate */
5287 adc_frequency = (state->m_sys_clock_freq * 1000) / 3;
5288 ratesel = 0;
5289 /* printk(KERN_DEBUG "drxk: SR %d\n", state->props.symbol_rate); */
5290 if (state->props.symbol_rate <= 1188750)
5291 ratesel = 3;
5292 else if (state->props.symbol_rate <= 2377500)
5293 ratesel = 2;
5294 else if (state->props.symbol_rate <= 4755000)
5295 ratesel = 1;
5296 status = write16(state, IQM_FD_RATESEL__A, ratesel);
5297 if (status < 0)
5298 goto error;
5299
5300 /*
5301 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5302 */
5303 symb_freq = state->props.symbol_rate * (1 << ratesel);
5304 if (symb_freq == 0) {
5305 /* Divide by zero */
5306 status = -EINVAL;
5307 goto error;
5308 }
5309 iqm_rc_rate = (adc_frequency / symb_freq) * (1 << 21) +
5310 (Frac28a((adc_frequency % symb_freq), symb_freq) >> 7) -
5311 (1 << 23);
5312 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate);
5313 if (status < 0)
5314 goto error;
5315 state->m_iqm_rc_rate = iqm_rc_rate;
5316 /*
5317 LcSymbFreq = round (.125 * symbolrate / adc_freq * (1<<15))
5318 */
5319 symb_freq = state->props.symbol_rate;
5320 if (adc_frequency == 0) {
5321 /* Divide by zero */
5322 status = -EINVAL;
5323 goto error;
5324 }
5325 lc_symb_rate = (symb_freq / adc_frequency) * (1 << 12) +
5326 (Frac28a((symb_freq % adc_frequency), adc_frequency) >>
5327 16);
5328 if (lc_symb_rate > 511)
5329 lc_symb_rate = 511;
5330 status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lc_symb_rate);
5331
5332 error:
5333 if (status < 0)
5334 pr_err("Error %d on %s\n", status, __func__);
5335 return status;
5336 }
5337
5338 /*============================================================================*/
5339
5340 /**
5341 * \brief Get QAM lock status.
5342 * \param demod: instance of demod.
5343 * \param channel: pointer to channel data.
5344 * \return DRXStatus_t.
5345 */
5346
5347 static int get_qam_lock_status(struct drxk_state *state, u32 *p_lock_status)
5348 {
5349 int status;
5350 u16 result[2] = { 0, 0 };
5351
5352 dprintk(1, "\n");
5353 *p_lock_status = NOT_LOCKED;
5354 status = scu_command(state,
5355 SCU_RAM_COMMAND_STANDARD_QAM |
5356 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5357 result);
5358 if (status < 0)
5359 pr_err("Error %d on %s\n", status, __func__);
5360
5361 if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5362 /* 0x0000 NOT LOCKED */
5363 } else if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5364 /* 0x4000 DEMOD LOCKED */
5365 *p_lock_status = DEMOD_LOCK;
5366 } else if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5367 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5368 *p_lock_status = MPEG_LOCK;
5369 } else {
5370 /* 0xC000 NEVER LOCKED */
5371 /* (system will never be able to lock to the signal) */
5372 /*
5373 * TODO: check this, intermediate & standard specific lock
5374 * states are not taken into account here
5375 */
5376 *p_lock_status = NEVER_LOCK;
5377 }
5378 return status;
5379 }
5380
5381 #define QAM_MIRROR__M 0x03
5382 #define QAM_MIRROR_NORMAL 0x00
5383 #define QAM_MIRRORED 0x01
5384 #define QAM_MIRROR_AUTO_ON 0x02
5385 #define QAM_LOCKRANGE__M 0x10
5386 #define QAM_LOCKRANGE_NORMAL 0x10
5387
5388 static int qam_demodulator_command(struct drxk_state *state,
5389 int number_of_parameters)
5390 {
5391 int status;
5392 u16 cmd_result;
5393 u16 set_param_parameters[4] = { 0, 0, 0, 0 };
5394
5395 set_param_parameters[0] = state->m_constellation; /* modulation */
5396 set_param_parameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5397
5398 if (number_of_parameters == 2) {
5399 u16 set_env_parameters[1] = { 0 };
5400
5401 if (state->m_operation_mode == OM_QAM_ITU_C)
5402 set_env_parameters[0] = QAM_TOP_ANNEX_C;
5403 else
5404 set_env_parameters[0] = QAM_TOP_ANNEX_A;
5405
5406 status = scu_command(state,
5407 SCU_RAM_COMMAND_STANDARD_QAM
5408 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV,
5409 1, set_env_parameters, 1, &cmd_result);
5410 if (status < 0)
5411 goto error;
5412
5413 status = scu_command(state,
5414 SCU_RAM_COMMAND_STANDARD_QAM
5415 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
5416 number_of_parameters, set_param_parameters,
5417 1, &cmd_result);
5418 } else if (number_of_parameters == 4) {
5419 if (state->m_operation_mode == OM_QAM_ITU_C)
5420 set_param_parameters[2] = QAM_TOP_ANNEX_C;
5421 else
5422 set_param_parameters[2] = QAM_TOP_ANNEX_A;
5423
5424 set_param_parameters[3] |= (QAM_MIRROR_AUTO_ON);
5425 /* Env parameters */
5426 /* check for LOCKRANGE Extented */
5427 /* set_param_parameters[3] |= QAM_LOCKRANGE_NORMAL; */
5428
5429 status = scu_command(state,
5430 SCU_RAM_COMMAND_STANDARD_QAM
5431 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
5432 number_of_parameters, set_param_parameters,
5433 1, &cmd_result);
5434 } else {
5435 pr_warn("Unknown QAM demodulator parameter count %d\n",
5436 number_of_parameters);
5437 status = -EINVAL;
5438 }
5439
5440 error:
5441 if (status < 0)
5442 pr_warn("Warning %d on %s\n", status, __func__);
5443 return status;
5444 }
5445
5446 static int set_qam(struct drxk_state *state, u16 intermediate_freqk_hz,
5447 s32 tuner_freq_offset)
5448 {
5449 int status;
5450 u16 cmd_result;
5451 int qam_demod_param_count = state->qam_demod_parameter_count;
5452
5453 dprintk(1, "\n");
5454 /*
5455 * STEP 1: reset demodulator
5456 * resets FEC DI and FEC RS
5457 * resets QAM block
5458 * resets SCU variables
5459 */
5460 status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5461 if (status < 0)
5462 goto error;
5463 status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5464 if (status < 0)
5465 goto error;
5466 status = qam_reset_qam(state);
5467 if (status < 0)
5468 goto error;
5469
5470 /*
5471 * STEP 2: configure demodulator
5472 * -set params; resets IQM,QAM,FEC HW; initializes some
5473 * SCU variables
5474 */
5475 status = qam_set_symbolrate(state);
5476 if (status < 0)
5477 goto error;
5478
5479 /* Set params */
5480 switch (state->props.modulation) {
5481 case QAM_256:
5482 state->m_constellation = DRX_CONSTELLATION_QAM256;
5483 break;
5484 case QAM_AUTO:
5485 case QAM_64:
5486 state->m_constellation = DRX_CONSTELLATION_QAM64;
5487 break;
5488 case QAM_16:
5489 state->m_constellation = DRX_CONSTELLATION_QAM16;
5490 break;
5491 case QAM_32:
5492 state->m_constellation = DRX_CONSTELLATION_QAM32;
5493 break;
5494 case QAM_128:
5495 state->m_constellation = DRX_CONSTELLATION_QAM128;
5496 break;
5497 default:
5498 status = -EINVAL;
5499 break;
5500 }
5501 if (status < 0)
5502 goto error;
5503
5504 /* Use the 4-parameter if it's requested or we're probing for
5505 * the correct command. */
5506 if (state->qam_demod_parameter_count == 4
5507 || !state->qam_demod_parameter_count) {
5508 qam_demod_param_count = 4;
5509 status = qam_demodulator_command(state, qam_demod_param_count);
5510 }
5511
5512 /* Use the 2-parameter command if it was requested or if we're
5513 * probing for the correct command and the 4-parameter command
5514 * failed. */
5515 if (state->qam_demod_parameter_count == 2
5516 || (!state->qam_demod_parameter_count && status < 0)) {
5517 qam_demod_param_count = 2;
5518 status = qam_demodulator_command(state, qam_demod_param_count);
5519 }
5520
5521 if (status < 0) {
5522 dprintk(1, "Could not set demodulator parameters.\n");
5523 dprintk(1,
5524 "Make sure qam_demod_parameter_count (%d) is correct for your firmware (%s).\n",
5525 state->qam_demod_parameter_count,
5526 state->microcode_name);
5527 goto error;
5528 } else if (!state->qam_demod_parameter_count) {
5529 dprintk(1,
5530 "Auto-probing the QAM command parameters was successful - using %d parameters.\n",
5531 qam_demod_param_count);
5532
5533 /*
5534 * One of our commands was successful. We don't need to
5535 * auto-probe anymore, now that we got the correct command.
5536 */
5537 state->qam_demod_parameter_count = qam_demod_param_count;
5538 }
5539
5540 /*
5541 * STEP 3: enable the system in a mode where the ADC provides valid
5542 * signal setup modulation independent registers
5543 */
5544 #if 0
5545 status = set_frequency(channel, tuner_freq_offset));
5546 if (status < 0)
5547 goto error;
5548 #endif
5549 status = set_frequency_shifter(state, intermediate_freqk_hz,
5550 tuner_freq_offset, true);
5551 if (status < 0)
5552 goto error;
5553
5554 /* Setup BER measurement */
5555 status = set_qam_measurement(state, state->m_constellation,
5556 state->props.symbol_rate);
5557 if (status < 0)
5558 goto error;
5559
5560 /* Reset default values */
5561 status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5562 if (status < 0)
5563 goto error;
5564 status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5565 if (status < 0)
5566 goto error;
5567
5568 /* Reset default LC values */
5569 status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5570 if (status < 0)
5571 goto error;
5572 status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5573 if (status < 0)
5574 goto error;
5575 status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5576 if (status < 0)
5577 goto error;
5578 status = write16(state, QAM_LC_MODE__A, 7);
5579 if (status < 0)
5580 goto error;
5581
5582 status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5583 if (status < 0)
5584 goto error;
5585 status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5586 if (status < 0)
5587 goto error;
5588 status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5589 if (status < 0)
5590 goto error;
5591 status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5592 if (status < 0)
5593 goto error;
5594 status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5595 if (status < 0)
5596 goto error;
5597 status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5598 if (status < 0)
5599 goto error;
5600 status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5601 if (status < 0)
5602 goto error;
5603 status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5604 if (status < 0)
5605 goto error;
5606 status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5607 if (status < 0)
5608 goto error;
5609 status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5610 if (status < 0)
5611 goto error;
5612 status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5613 if (status < 0)
5614 goto error;
5615 status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5616 if (status < 0)
5617 goto error;
5618 status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5619 if (status < 0)
5620 goto error;
5621 status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5622 if (status < 0)
5623 goto error;
5624 status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5625 if (status < 0)
5626 goto error;
5627
5628 /* Mirroring, QAM-block starting point not inverted */
5629 status = write16(state, QAM_SY_SP_INV__A,
5630 QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5631 if (status < 0)
5632 goto error;
5633
5634 /* Halt SCU to enable safe non-atomic accesses */
5635 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5636 if (status < 0)
5637 goto error;
5638
5639 /* STEP 4: modulation specific setup */
5640 switch (state->props.modulation) {
5641 case QAM_16:
5642 status = set_qam16(state);
5643 break;
5644 case QAM_32:
5645 status = set_qam32(state);
5646 break;
5647 case QAM_AUTO:
5648 case QAM_64:
5649 status = set_qam64(state);
5650 break;
5651 case QAM_128:
5652 status = set_qam128(state);
5653 break;
5654 case QAM_256:
5655 status = set_qam256(state);
5656 break;
5657 default:
5658 status = -EINVAL;
5659 break;
5660 }
5661 if (status < 0)
5662 goto error;
5663
5664 /* Activate SCU to enable SCU commands */
5665 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5666 if (status < 0)
5667 goto error;
5668
5669 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5670 /* extAttr->currentChannel.modulation = channel->modulation; */
5671 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5672 status = mpegts_dto_setup(state, state->m_operation_mode);
5673 if (status < 0)
5674 goto error;
5675
5676 /* start processes */
5677 status = mpegts_start(state);
5678 if (status < 0)
5679 goto error;
5680 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5681 if (status < 0)
5682 goto error;
5683 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5684 if (status < 0)
5685 goto error;
5686 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5687 if (status < 0)
5688 goto error;
5689
5690 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5691 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
5692 | SCU_RAM_COMMAND_CMD_DEMOD_START,
5693 0, NULL, 1, &cmd_result);
5694 if (status < 0)
5695 goto error;
5696
5697 /* update global DRXK data container */
5698 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5699
5700 error:
5701 if (status < 0)
5702 pr_err("Error %d on %s\n", status, __func__);
5703 return status;
5704 }
5705
5706 static int set_qam_standard(struct drxk_state *state,
5707 enum operation_mode o_mode)
5708 {
5709 int status;
5710 #ifdef DRXK_QAM_TAPS
5711 #define DRXK_QAMA_TAPS_SELECT
5712 #include "drxk_filters.h"
5713 #undef DRXK_QAMA_TAPS_SELECT
5714 #endif
5715
5716 dprintk(1, "\n");
5717
5718 /* added antenna switch */
5719 switch_antenna_to_qam(state);
5720
5721 /* Ensure correct power-up mode */
5722 status = power_up_qam(state);
5723 if (status < 0)
5724 goto error;
5725 /* Reset QAM block */
5726 status = qam_reset_qam(state);
5727 if (status < 0)
5728 goto error;
5729
5730 /* Setup IQM */
5731
5732 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5733 if (status < 0)
5734 goto error;
5735 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5736 if (status < 0)
5737 goto error;
5738
5739 /* Upload IQM Channel Filter settings by
5740 boot loader from ROM table */
5741 switch (o_mode) {
5742 case OM_QAM_ITU_A:
5743 status = bl_chain_cmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A,
5744 DRXK_BLCC_NR_ELEMENTS_TAPS,
5745 DRXK_BLC_TIMEOUT);
5746 break;
5747 case OM_QAM_ITU_C:
5748 status = bl_direct_cmd(state, IQM_CF_TAP_RE0__A,
5749 DRXK_BL_ROM_OFFSET_TAPS_ITU_C,
5750 DRXK_BLDC_NR_ELEMENTS_TAPS,
5751 DRXK_BLC_TIMEOUT);
5752 if (status < 0)
5753 goto error;
5754 status = bl_direct_cmd(state,
5755 IQM_CF_TAP_IM0__A,
5756 DRXK_BL_ROM_OFFSET_TAPS_ITU_C,
5757 DRXK_BLDC_NR_ELEMENTS_TAPS,
5758 DRXK_BLC_TIMEOUT);
5759 break;
5760 default:
5761 status = -EINVAL;
5762 }
5763 if (status < 0)
5764 goto error;
5765
5766 status = write16(state, IQM_CF_OUT_ENA__A, 1 << IQM_CF_OUT_ENA_QAM__B);
5767 if (status < 0)
5768 goto error;
5769 status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5770 if (status < 0)
5771 goto error;
5772 status = write16(state, IQM_CF_MIDTAP__A,
5773 ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5774 if (status < 0)
5775 goto error;
5776
5777 status = write16(state, IQM_RC_STRETCH__A, 21);
5778 if (status < 0)
5779 goto error;
5780 status = write16(state, IQM_AF_CLP_LEN__A, 0);
5781 if (status < 0)
5782 goto error;
5783 status = write16(state, IQM_AF_CLP_TH__A, 448);
5784 if (status < 0)
5785 goto error;
5786 status = write16(state, IQM_AF_SNS_LEN__A, 0);
5787 if (status < 0)
5788 goto error;
5789 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5790 if (status < 0)
5791 goto error;
5792
5793 status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5794 if (status < 0)
5795 goto error;
5796 status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5797 if (status < 0)
5798 goto error;
5799 status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5800 if (status < 0)
5801 goto error;
5802 status = write16(state, IQM_AF_UPD_SEL__A, 0);
5803 if (status < 0)
5804 goto error;
5805
5806 /* IQM Impulse Noise Processing Unit */
5807 status = write16(state, IQM_CF_CLP_VAL__A, 500);
5808 if (status < 0)
5809 goto error;
5810 status = write16(state, IQM_CF_DATATH__A, 1000);
5811 if (status < 0)
5812 goto error;
5813 status = write16(state, IQM_CF_BYPASSDET__A, 1);
5814 if (status < 0)
5815 goto error;
5816 status = write16(state, IQM_CF_DET_LCT__A, 0);
5817 if (status < 0)
5818 goto error;
5819 status = write16(state, IQM_CF_WND_LEN__A, 1);
5820 if (status < 0)
5821 goto error;
5822 status = write16(state, IQM_CF_PKDTH__A, 1);
5823 if (status < 0)
5824 goto error;
5825 status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5826 if (status < 0)
5827 goto error;
5828
5829 /* turn on IQMAF. Must be done before setAgc**() */
5830 status = set_iqm_af(state, true);
5831 if (status < 0)
5832 goto error;
5833 status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5834 if (status < 0)
5835 goto error;
5836
5837 /* IQM will not be reset from here, sync ADC and update/init AGC */
5838 status = adc_synchronization(state);
5839 if (status < 0)
5840 goto error;
5841
5842 /* Set the FSM step period */
5843 status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5844 if (status < 0)
5845 goto error;
5846
5847 /* Halt SCU to enable safe non-atomic accesses */
5848 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5849 if (status < 0)
5850 goto error;
5851
5852 /* No more resets of the IQM, current standard correctly set =>
5853 now AGCs can be configured. */
5854
5855 status = init_agc(state, true);
5856 if (status < 0)
5857 goto error;
5858 status = set_pre_saw(state, &(state->m_qam_pre_saw_cfg));
5859 if (status < 0)
5860 goto error;
5861
5862 /* Configure AGC's */
5863 status = set_agc_rf(state, &(state->m_qam_rf_agc_cfg), true);
5864 if (status < 0)
5865 goto error;
5866 status = set_agc_if(state, &(state->m_qam_if_agc_cfg), true);
5867 if (status < 0)
5868 goto error;
5869
5870 /* Activate SCU to enable SCU commands */
5871 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5872 error:
5873 if (status < 0)
5874 pr_err("Error %d on %s\n", status, __func__);
5875 return status;
5876 }
5877
5878 static int write_gpio(struct drxk_state *state)
5879 {
5880 int status;
5881 u16 value = 0;
5882
5883 dprintk(1, "\n");
5884 /* stop lock indicator process */
5885 status = write16(state, SCU_RAM_GPIO__A,
5886 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5887 if (status < 0)
5888 goto error;
5889
5890 /* Write magic word to enable pdr reg write */
5891 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5892 if (status < 0)
5893 goto error;
5894
5895 if (state->m_has_sawsw) {
5896 if (state->uio_mask & 0x0001) { /* UIO-1 */
5897 /* write to io pad configuration register - output mode */
5898 status = write16(state, SIO_PDR_SMA_TX_CFG__A,
5899 state->m_gpio_cfg);
5900 if (status < 0)
5901 goto error;
5902
5903 /* use corresponding bit in io data output registar */
5904 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5905 if (status < 0)
5906 goto error;
5907 if ((state->m_gpio & 0x0001) == 0)
5908 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5909 else
5910 value |= 0x8000; /* write one to 15th bit - 1st UIO */
5911 /* write back to io data output register */
5912 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5913 if (status < 0)
5914 goto error;
5915 }
5916 if (state->uio_mask & 0x0002) { /* UIO-2 */
5917 /* write to io pad configuration register - output mode */
5918 status = write16(state, SIO_PDR_SMA_RX_CFG__A,
5919 state->m_gpio_cfg);
5920 if (status < 0)
5921 goto error;
5922
5923 /* use corresponding bit in io data output registar */
5924 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5925 if (status < 0)
5926 goto error;
5927 if ((state->m_gpio & 0x0002) == 0)
5928 value &= 0xBFFF; /* write zero to 14th bit - 2st UIO */
5929 else
5930 value |= 0x4000; /* write one to 14th bit - 2st UIO */
5931 /* write back to io data output register */
5932 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5933 if (status < 0)
5934 goto error;
5935 }
5936 if (state->uio_mask & 0x0004) { /* UIO-3 */
5937 /* write to io pad configuration register - output mode */
5938 status = write16(state, SIO_PDR_GPIO_CFG__A,
5939 state->m_gpio_cfg);
5940 if (status < 0)
5941 goto error;
5942
5943 /* use corresponding bit in io data output registar */
5944 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5945 if (status < 0)
5946 goto error;
5947 if ((state->m_gpio & 0x0004) == 0)
5948 value &= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
5949 else
5950 value |= 0x0004; /* write one to 2nd bit - 3rd UIO */
5951 /* write back to io data output register */
5952 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5953 if (status < 0)
5954 goto error;
5955 }
5956 }
5957 /* Write magic word to disable pdr reg write */
5958 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5959 error:
5960 if (status < 0)
5961 pr_err("Error %d on %s\n", status, __func__);
5962 return status;
5963 }
5964
5965 static int switch_antenna_to_qam(struct drxk_state *state)
5966 {
5967 int status = 0;
5968 bool gpio_state;
5969
5970 dprintk(1, "\n");
5971
5972 if (!state->antenna_gpio)
5973 return 0;
5974
5975 gpio_state = state->m_gpio & state->antenna_gpio;
5976
5977 if (state->antenna_dvbt ^ gpio_state) {
5978 /* Antenna is on DVB-T mode. Switch */
5979 if (state->antenna_dvbt)
5980 state->m_gpio &= ~state->antenna_gpio;
5981 else
5982 state->m_gpio |= state->antenna_gpio;
5983 status = write_gpio(state);
5984 }
5985 if (status < 0)
5986 pr_err("Error %d on %s\n", status, __func__);
5987 return status;
5988 }
5989
5990 static int switch_antenna_to_dvbt(struct drxk_state *state)
5991 {
5992 int status = 0;
5993 bool gpio_state;
5994
5995 dprintk(1, "\n");
5996
5997 if (!state->antenna_gpio)
5998 return 0;
5999
6000 gpio_state = state->m_gpio & state->antenna_gpio;
6001
6002 if (!(state->antenna_dvbt ^ gpio_state)) {
6003 /* Antenna is on DVB-C mode. Switch */
6004 if (state->antenna_dvbt)
6005 state->m_gpio |= state->antenna_gpio;
6006 else
6007 state->m_gpio &= ~state->antenna_gpio;
6008 status = write_gpio(state);
6009 }
6010 if (status < 0)
6011 pr_err("Error %d on %s\n", status, __func__);
6012 return status;
6013 }
6014
6015
6016 static int power_down_device(struct drxk_state *state)
6017 {
6018 /* Power down to requested mode */
6019 /* Backup some register settings */
6020 /* Set pins with possible pull-ups connected to them in input mode */
6021 /* Analog power down */
6022 /* ADC power down */
6023 /* Power down device */
6024 int status;
6025
6026 dprintk(1, "\n");
6027 if (state->m_b_p_down_open_bridge) {
6028 /* Open I2C bridge before power down of DRXK */
6029 status = ConfigureI2CBridge(state, true);
6030 if (status < 0)
6031 goto error;
6032 }
6033 /* driver 0.9.0 */
6034 status = dvbt_enable_ofdm_token_ring(state, false);
6035 if (status < 0)
6036 goto error;
6037
6038 status = write16(state, SIO_CC_PWD_MODE__A,
6039 SIO_CC_PWD_MODE_LEVEL_CLOCK);
6040 if (status < 0)
6041 goto error;
6042 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
6043 if (status < 0)
6044 goto error;
6045 state->m_hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
6046 status = hi_cfg_command(state);
6047 error:
6048 if (status < 0)
6049 pr_err("Error %d on %s\n", status, __func__);
6050
6051 return status;
6052 }
6053
6054 static int init_drxk(struct drxk_state *state)
6055 {
6056 int status = 0, n = 0;
6057 enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
6058 u16 driver_version;
6059
6060 dprintk(1, "\n");
6061 if ((state->m_drxk_state == DRXK_UNINITIALIZED)) {
6062 drxk_i2c_lock(state);
6063 status = power_up_device(state);
6064 if (status < 0)
6065 goto error;
6066 status = drxx_open(state);
6067 if (status < 0)
6068 goto error;
6069 /* Soft reset of OFDM-, sys- and osc-clockdomain */
6070 status = write16(state, SIO_CC_SOFT_RST__A,
6071 SIO_CC_SOFT_RST_OFDM__M
6072 | SIO_CC_SOFT_RST_SYS__M
6073 | SIO_CC_SOFT_RST_OSC__M);
6074 if (status < 0)
6075 goto error;
6076 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
6077 if (status < 0)
6078 goto error;
6079 /*
6080 * TODO is this needed? If yes, how much delay in
6081 * worst case scenario
6082 */
6083 usleep_range(1000, 2000);
6084 state->m_drxk_a3_patch_code = true;
6085 status = get_device_capabilities(state);
6086 if (status < 0)
6087 goto error;
6088
6089 /* Bridge delay, uses oscilator clock */
6090 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
6091 /* SDA brdige delay */
6092 state->m_hi_cfg_bridge_delay =
6093 (u16) ((state->m_osc_clock_freq / 1000) *
6094 HI_I2C_BRIDGE_DELAY) / 1000;
6095 /* Clipping */
6096 if (state->m_hi_cfg_bridge_delay >
6097 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
6098 state->m_hi_cfg_bridge_delay =
6099 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
6100 }
6101 /* SCL bridge delay, same as SDA for now */
6102 state->m_hi_cfg_bridge_delay +=
6103 state->m_hi_cfg_bridge_delay <<
6104 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
6105
6106 status = init_hi(state);
6107 if (status < 0)
6108 goto error;
6109 /* disable various processes */
6110 #if NOA1ROM
6111 if (!(state->m_DRXK_A1_ROM_CODE)
6112 && !(state->m_DRXK_A2_ROM_CODE))
6113 #endif
6114 {
6115 status = write16(state, SCU_RAM_GPIO__A,
6116 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
6117 if (status < 0)
6118 goto error;
6119 }
6120
6121 /* disable MPEG port */
6122 status = mpegts_disable(state);
6123 if (status < 0)
6124 goto error;
6125
6126 /* Stop AUD and SCU */
6127 status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
6128 if (status < 0)
6129 goto error;
6130 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
6131 if (status < 0)
6132 goto error;
6133
6134 /* enable token-ring bus through OFDM block for possible ucode upload */
6135 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A,
6136 SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
6137 if (status < 0)
6138 goto error;
6139
6140 /* include boot loader section */
6141 status = write16(state, SIO_BL_COMM_EXEC__A,
6142 SIO_BL_COMM_EXEC_ACTIVE);
6143 if (status < 0)
6144 goto error;
6145 status = bl_chain_cmd(state, 0, 6, 100);
6146 if (status < 0)
6147 goto error;
6148
6149 if (state->fw) {
6150 status = download_microcode(state, state->fw->data,
6151 state->fw->size);
6152 if (status < 0)
6153 goto error;
6154 }
6155
6156 /* disable token-ring bus through OFDM block for possible ucode upload */
6157 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A,
6158 SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6159 if (status < 0)
6160 goto error;
6161
6162 /* Run SCU for a little while to initialize microcode version numbers */
6163 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6164 if (status < 0)
6165 goto error;
6166 status = drxx_open(state);
6167 if (status < 0)
6168 goto error;
6169 /* added for test */
6170 msleep(30);
6171
6172 power_mode = DRXK_POWER_DOWN_OFDM;
6173 status = ctrl_power_mode(state, &power_mode);
6174 if (status < 0)
6175 goto error;
6176
6177 /* Stamp driver version number in SCU data RAM in BCD code
6178 Done to enable field application engineers to retrieve drxdriver version
6179 via I2C from SCU RAM.
6180 Not using SCU command interface for SCU register access since no
6181 microcode may be present.
6182 */
6183 driver_version =
6184 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6185 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6186 ((DRXK_VERSION_MAJOR % 10) << 4) +
6187 (DRXK_VERSION_MINOR % 10);
6188 status = write16(state, SCU_RAM_DRIVER_VER_HI__A,
6189 driver_version);
6190 if (status < 0)
6191 goto error;
6192 driver_version =
6193 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6194 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6195 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6196 (DRXK_VERSION_PATCH % 10);
6197 status = write16(state, SCU_RAM_DRIVER_VER_LO__A,
6198 driver_version);
6199 if (status < 0)
6200 goto error;
6201
6202 pr_info("DRXK driver version %d.%d.%d\n",
6203 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6204 DRXK_VERSION_PATCH);
6205
6206 /*
6207 * Dirty fix of default values for ROM/PATCH microcode
6208 * Dirty because this fix makes it impossible to setup
6209 * suitable values before calling DRX_Open. This solution
6210 * requires changes to RF AGC speed to be done via the CTRL
6211 * function after calling DRX_Open
6212 */
6213
6214 /* m_dvbt_rf_agc_cfg.speed = 3; */
6215
6216 /* Reset driver debug flags to 0 */
6217 status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6218 if (status < 0)
6219 goto error;
6220 /* driver 0.9.0 */
6221 /* Setup FEC OC:
6222 NOTE: No more full FEC resets allowed afterwards!! */
6223 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6224 if (status < 0)
6225 goto error;
6226 /* MPEGTS functions are still the same */
6227 status = mpegts_dto_init(state);
6228 if (status < 0)
6229 goto error;
6230 status = mpegts_stop(state);
6231 if (status < 0)
6232 goto error;
6233 status = mpegts_configure_polarity(state);
6234 if (status < 0)
6235 goto error;
6236 status = mpegts_configure_pins(state, state->m_enable_mpeg_output);
6237 if (status < 0)
6238 goto error;
6239 /* added: configure GPIO */
6240 status = write_gpio(state);
6241 if (status < 0)
6242 goto error;
6243
6244 state->m_drxk_state = DRXK_STOPPED;
6245
6246 if (state->m_b_power_down) {
6247 status = power_down_device(state);
6248 if (status < 0)
6249 goto error;
6250 state->m_drxk_state = DRXK_POWERED_DOWN;
6251 } else
6252 state->m_drxk_state = DRXK_STOPPED;
6253
6254 /* Initialize the supported delivery systems */
6255 n = 0;
6256 if (state->m_has_dvbc) {
6257 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_A;
6258 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_C;
6259 strlcat(state->frontend.ops.info.name, " DVB-C",
6260 sizeof(state->frontend.ops.info.name));
6261 }
6262 if (state->m_has_dvbt) {
6263 state->frontend.ops.delsys[n++] = SYS_DVBT;
6264 strlcat(state->frontend.ops.info.name, " DVB-T",
6265 sizeof(state->frontend.ops.info.name));
6266 }
6267 drxk_i2c_unlock(state);
6268 }
6269 error:
6270 if (status < 0) {
6271 state->m_drxk_state = DRXK_NO_DEV;
6272 drxk_i2c_unlock(state);
6273 pr_err("Error %d on %s\n", status, __func__);
6274 }
6275
6276 return status;
6277 }
6278
6279 static void load_firmware_cb(const struct firmware *fw,
6280 void *context)
6281 {
6282 struct drxk_state *state = context;
6283
6284 dprintk(1, ": %s\n", fw ? "firmware loaded" : "firmware not loaded");
6285 if (!fw) {
6286 pr_err("Could not load firmware file %s.\n",
6287 state->microcode_name);
6288 pr_info("Copy %s to your hotplug directory!\n",
6289 state->microcode_name);
6290 state->microcode_name = NULL;
6291
6292 /*
6293 * As firmware is now load asynchronous, it is not possible
6294 * anymore to fail at frontend attach. We might silently
6295 * return here, and hope that the driver won't crash.
6296 * We might also change all DVB callbacks to return -ENODEV
6297 * if the device is not initialized.
6298 * As the DRX-K devices have their own internal firmware,
6299 * let's just hope that it will match a firmware revision
6300 * compatible with this driver and proceed.
6301 */
6302 }
6303 state->fw = fw;
6304
6305 init_drxk(state);
6306 }
6307
6308 static void drxk_release(struct dvb_frontend *fe)
6309 {
6310 struct drxk_state *state = fe->demodulator_priv;
6311
6312 dprintk(1, "\n");
6313 release_firmware(state->fw);
6314
6315 kfree(state);
6316 }
6317
6318 static int drxk_sleep(struct dvb_frontend *fe)
6319 {
6320 struct drxk_state *state = fe->demodulator_priv;
6321
6322 dprintk(1, "\n");
6323
6324 if (state->m_drxk_state == DRXK_NO_DEV)
6325 return -ENODEV;
6326 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6327 return 0;
6328
6329 shut_down(state);
6330 return 0;
6331 }
6332
6333 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6334 {
6335 struct drxk_state *state = fe->demodulator_priv;
6336
6337 dprintk(1, ": %s\n", enable ? "enable" : "disable");
6338
6339 if (state->m_drxk_state == DRXK_NO_DEV)
6340 return -ENODEV;
6341
6342 return ConfigureI2CBridge(state, enable ? true : false);
6343 }
6344
6345 static int drxk_set_parameters(struct dvb_frontend *fe)
6346 {
6347 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6348 u32 delsys = p->delivery_system, old_delsys;
6349 struct drxk_state *state = fe->demodulator_priv;
6350 u32 IF;
6351
6352 dprintk(1, "\n");
6353
6354 if (state->m_drxk_state == DRXK_NO_DEV)
6355 return -ENODEV;
6356
6357 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6358 return -EAGAIN;
6359
6360 if (!fe->ops.tuner_ops.get_if_frequency) {
6361 pr_err("Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
6362 return -EINVAL;
6363 }
6364
6365 if (fe->ops.i2c_gate_ctrl)
6366 fe->ops.i2c_gate_ctrl(fe, 1);
6367 if (fe->ops.tuner_ops.set_params)
6368 fe->ops.tuner_ops.set_params(fe);
6369 if (fe->ops.i2c_gate_ctrl)
6370 fe->ops.i2c_gate_ctrl(fe, 0);
6371
6372 old_delsys = state->props.delivery_system;
6373 state->props = *p;
6374
6375 if (old_delsys != delsys) {
6376 shut_down(state);
6377 switch (delsys) {
6378 case SYS_DVBC_ANNEX_A:
6379 case SYS_DVBC_ANNEX_C:
6380 if (!state->m_has_dvbc)
6381 return -EINVAL;
6382 state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ?
6383 true : false;
6384 if (state->m_itut_annex_c)
6385 setoperation_mode(state, OM_QAM_ITU_C);
6386 else
6387 setoperation_mode(state, OM_QAM_ITU_A);
6388 break;
6389 case SYS_DVBT:
6390 if (!state->m_has_dvbt)
6391 return -EINVAL;
6392 setoperation_mode(state, OM_DVBT);
6393 break;
6394 default:
6395 return -EINVAL;
6396 }
6397 }
6398
6399 fe->ops.tuner_ops.get_if_frequency(fe, &IF);
6400 start(state, 0, IF);
6401
6402 /* After set_frontend, stats aren't available */
6403 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
6404 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6405 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6406 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6407 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6408 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6409 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6410 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6411
6412 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6413
6414 return 0;
6415 }
6416
6417 static int get_strength(struct drxk_state *state, u64 *strength)
6418 {
6419 int status;
6420 struct s_cfg_agc rf_agc, if_agc;
6421 u32 total_gain = 0;
6422 u32 atten = 0;
6423 u32 agc_range = 0;
6424 u16 scu_lvl = 0;
6425 u16 scu_coc = 0;
6426 /* FIXME: those are part of the tuner presets */
6427 u16 tuner_rf_gain = 50; /* Default value on az6007 driver */
6428 u16 tuner_if_gain = 40; /* Default value on az6007 driver */
6429
6430 *strength = 0;
6431
6432 if (is_dvbt(state)) {
6433 rf_agc = state->m_dvbt_rf_agc_cfg;
6434 if_agc = state->m_dvbt_if_agc_cfg;
6435 } else if (is_qam(state)) {
6436 rf_agc = state->m_qam_rf_agc_cfg;
6437 if_agc = state->m_qam_if_agc_cfg;
6438 } else {
6439 rf_agc = state->m_atv_rf_agc_cfg;
6440 if_agc = state->m_atv_if_agc_cfg;
6441 }
6442
6443 if (rf_agc.ctrl_mode == DRXK_AGC_CTRL_AUTO) {
6444 /* SCU output_level */
6445 status = read16(state, SCU_RAM_AGC_RF_IACCU_HI__A, &scu_lvl);
6446 if (status < 0)
6447 return status;
6448
6449 /* SCU c.o.c. */
6450 read16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, &scu_coc);
6451 if (status < 0)
6452 return status;
6453
6454 if (((u32) scu_lvl + (u32) scu_coc) < 0xffff)
6455 rf_agc.output_level = scu_lvl + scu_coc;
6456 else
6457 rf_agc.output_level = 0xffff;
6458
6459 /* Take RF gain into account */
6460 total_gain += tuner_rf_gain;
6461
6462 /* clip output value */
6463 if (rf_agc.output_level < rf_agc.min_output_level)
6464 rf_agc.output_level = rf_agc.min_output_level;
6465 if (rf_agc.output_level > rf_agc.max_output_level)
6466 rf_agc.output_level = rf_agc.max_output_level;
6467
6468 agc_range = (u32) (rf_agc.max_output_level - rf_agc.min_output_level);
6469 if (agc_range > 0) {
6470 atten += 100UL *
6471 ((u32)(tuner_rf_gain)) *
6472 ((u32)(rf_agc.output_level - rf_agc.min_output_level))
6473 / agc_range;
6474 }
6475 }
6476
6477 if (if_agc.ctrl_mode == DRXK_AGC_CTRL_AUTO) {
6478 status = read16(state, SCU_RAM_AGC_IF_IACCU_HI__A,
6479 &if_agc.output_level);
6480 if (status < 0)
6481 return status;
6482
6483 status = read16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A,
6484 &if_agc.top);
6485 if (status < 0)
6486 return status;
6487
6488 /* Take IF gain into account */
6489 total_gain += (u32) tuner_if_gain;
6490
6491 /* clip output value */
6492 if (if_agc.output_level < if_agc.min_output_level)
6493 if_agc.output_level = if_agc.min_output_level;
6494 if (if_agc.output_level > if_agc.max_output_level)
6495 if_agc.output_level = if_agc.max_output_level;
6496
6497 agc_range = (u32)(if_agc.max_output_level - if_agc.min_output_level);
6498 if (agc_range > 0) {
6499 atten += 100UL *
6500 ((u32)(tuner_if_gain)) *
6501 ((u32)(if_agc.output_level - if_agc.min_output_level))
6502 / agc_range;
6503 }
6504 }
6505
6506 /*
6507 * Convert to 0..65535 scale.
6508 * If it can't be measured (AGC is disabled), just show 100%.
6509 */
6510 if (total_gain > 0)
6511 *strength = (65535UL * atten / total_gain / 100);
6512 else
6513 *strength = 65535;
6514
6515 return 0;
6516 }
6517
6518 static int drxk_get_stats(struct dvb_frontend *fe)
6519 {
6520 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
6521 struct drxk_state *state = fe->demodulator_priv;
6522 int status;
6523 u32 stat;
6524 u16 reg16;
6525 u32 post_bit_count;
6526 u32 post_bit_err_count;
6527 u32 post_bit_error_scale;
6528 u32 pre_bit_err_count;
6529 u32 pre_bit_count;
6530 u32 pkt_count;
6531 u32 pkt_error_count;
6532 s32 cnr;
6533
6534 if (state->m_drxk_state == DRXK_NO_DEV)
6535 return -ENODEV;
6536 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6537 return -EAGAIN;
6538
6539 /* get status */
6540 state->fe_status = 0;
6541 get_lock_status(state, &stat);
6542 if (stat == MPEG_LOCK)
6543 state->fe_status |= 0x1f;
6544 if (stat == FEC_LOCK)
6545 state->fe_status |= 0x0f;
6546 if (stat == DEMOD_LOCK)
6547 state->fe_status |= 0x07;
6548
6549 /*
6550 * Estimate signal strength from AGC
6551 */
6552 get_strength(state, &c->strength.stat[0].uvalue);
6553 c->strength.stat[0].scale = FE_SCALE_RELATIVE;
6554
6555
6556 if (stat >= DEMOD_LOCK) {
6557 get_signal_to_noise(state, &cnr);
6558 c->cnr.stat[0].svalue = cnr * 100;
6559 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
6560 } else {
6561 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6562 }
6563
6564 if (stat < FEC_LOCK) {
6565 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6566 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6567 c->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6568 c->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6569 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6570 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6571 return 0;
6572 }
6573
6574 /* Get post BER */
6575
6576 /* BER measurement is valid if at least FEC lock is achieved */
6577
6578 /*
6579 * OFDM_EC_VD_REQ_SMB_CNT__A and/or OFDM_EC_VD_REQ_BIT_CNT can be
6580 * written to set nr of symbols or bits over which to measure
6581 * EC_VD_REG_ERR_BIT_CNT__A . See CtrlSetCfg().
6582 */
6583
6584 /* Read registers for post/preViterbi BER calculation */
6585 status = read16(state, OFDM_EC_VD_ERR_BIT_CNT__A, &reg16);
6586 if (status < 0)
6587 goto error;
6588 pre_bit_err_count = reg16;
6589
6590 status = read16(state, OFDM_EC_VD_IN_BIT_CNT__A , &reg16);
6591 if (status < 0)
6592 goto error;
6593 pre_bit_count = reg16;
6594
6595 /* Number of bit-errors */
6596 status = read16(state, FEC_RS_NR_BIT_ERRORS__A, &reg16);
6597 if (status < 0)
6598 goto error;
6599 post_bit_err_count = reg16;
6600
6601 status = read16(state, FEC_RS_MEASUREMENT_PRESCALE__A, &reg16);
6602 if (status < 0)
6603 goto error;
6604 post_bit_error_scale = reg16;
6605
6606 status = read16(state, FEC_RS_MEASUREMENT_PERIOD__A, &reg16);
6607 if (status < 0)
6608 goto error;
6609 pkt_count = reg16;
6610
6611 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, &reg16);
6612 if (status < 0)
6613 goto error;
6614 pkt_error_count = reg16;
6615 write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
6616
6617 post_bit_err_count *= post_bit_error_scale;
6618
6619 post_bit_count = pkt_count * 204 * 8;
6620
6621 /* Store the results */
6622 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
6623 c->block_error.stat[0].uvalue += pkt_error_count;
6624 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
6625 c->block_count.stat[0].uvalue += pkt_count;
6626
6627 c->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
6628 c->pre_bit_error.stat[0].uvalue += pre_bit_err_count;
6629 c->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
6630 c->pre_bit_count.stat[0].uvalue += pre_bit_count;
6631
6632 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
6633 c->post_bit_error.stat[0].uvalue += post_bit_err_count;
6634 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
6635 c->post_bit_count.stat[0].uvalue += post_bit_count;
6636
6637 error:
6638 return status;
6639 }
6640
6641
6642 static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6643 {
6644 struct drxk_state *state = fe->demodulator_priv;
6645 int rc;
6646
6647 dprintk(1, "\n");
6648
6649 rc = drxk_get_stats(fe);
6650 if (rc < 0)
6651 return rc;
6652
6653 *status = state->fe_status;
6654
6655 return 0;
6656 }
6657
6658 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6659 u16 *strength)
6660 {
6661 struct drxk_state *state = fe->demodulator_priv;
6662 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
6663
6664 dprintk(1, "\n");
6665
6666 if (state->m_drxk_state == DRXK_NO_DEV)
6667 return -ENODEV;
6668 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6669 return -EAGAIN;
6670
6671 *strength = c->strength.stat[0].uvalue;
6672 return 0;
6673 }
6674
6675 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6676 {
6677 struct drxk_state *state = fe->demodulator_priv;
6678 s32 snr2;
6679
6680 dprintk(1, "\n");
6681
6682 if (state->m_drxk_state == DRXK_NO_DEV)
6683 return -ENODEV;
6684 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6685 return -EAGAIN;
6686
6687 get_signal_to_noise(state, &snr2);
6688
6689 /* No negative SNR, clip to zero */
6690 if (snr2 < 0)
6691 snr2 = 0;
6692 *snr = snr2 & 0xffff;
6693 return 0;
6694 }
6695
6696 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6697 {
6698 struct drxk_state *state = fe->demodulator_priv;
6699 u16 err;
6700
6701 dprintk(1, "\n");
6702
6703 if (state->m_drxk_state == DRXK_NO_DEV)
6704 return -ENODEV;
6705 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6706 return -EAGAIN;
6707
6708 dvbtqam_get_acc_pkt_err(state, &err);
6709 *ucblocks = (u32) err;
6710 return 0;
6711 }
6712
6713 static int drxk_get_tune_settings(struct dvb_frontend *fe,
6714 struct dvb_frontend_tune_settings *sets)
6715 {
6716 struct drxk_state *state = fe->demodulator_priv;
6717 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6718
6719 dprintk(1, "\n");
6720
6721 if (state->m_drxk_state == DRXK_NO_DEV)
6722 return -ENODEV;
6723 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6724 return -EAGAIN;
6725
6726 switch (p->delivery_system) {
6727 case SYS_DVBC_ANNEX_A:
6728 case SYS_DVBC_ANNEX_C:
6729 case SYS_DVBT:
6730 sets->min_delay_ms = 3000;
6731 sets->max_drift = 0;
6732 sets->step_size = 0;
6733 return 0;
6734 default:
6735 return -EINVAL;
6736 }
6737 }
6738
6739 static struct dvb_frontend_ops drxk_ops = {
6740 /* .delsys will be filled dynamically */
6741 .info = {
6742 .name = "DRXK",
6743 .frequency_min = 47000000,
6744 .frequency_max = 865000000,
6745 /* For DVB-C */
6746 .symbol_rate_min = 870000,
6747 .symbol_rate_max = 11700000,
6748 /* For DVB-T */
6749 .frequency_stepsize = 166667,
6750
6751 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6752 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO |
6753 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
6754 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_MUTE_TS |
6755 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
6756 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO
6757 },
6758
6759 .release = drxk_release,
6760 .sleep = drxk_sleep,
6761 .i2c_gate_ctrl = drxk_gate_ctrl,
6762
6763 .set_frontend = drxk_set_parameters,
6764 .get_tune_settings = drxk_get_tune_settings,
6765
6766 .read_status = drxk_read_status,
6767 .read_signal_strength = drxk_read_signal_strength,
6768 .read_snr = drxk_read_snr,
6769 .read_ucblocks = drxk_read_ucblocks,
6770 };
6771
6772 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6773 struct i2c_adapter *i2c)
6774 {
6775 struct dtv_frontend_properties *p;
6776 struct drxk_state *state = NULL;
6777 u8 adr = config->adr;
6778 int status;
6779
6780 dprintk(1, "\n");
6781 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6782 if (!state)
6783 return NULL;
6784
6785 state->i2c = i2c;
6786 state->demod_address = adr;
6787 state->single_master = config->single_master;
6788 state->microcode_name = config->microcode_name;
6789 state->qam_demod_parameter_count = config->qam_demod_parameter_count;
6790 state->no_i2c_bridge = config->no_i2c_bridge;
6791 state->antenna_gpio = config->antenna_gpio;
6792 state->antenna_dvbt = config->antenna_dvbt;
6793 state->m_chunk_size = config->chunk_size;
6794 state->enable_merr_cfg = config->enable_merr_cfg;
6795
6796 if (config->dynamic_clk) {
6797 state->m_dvbt_static_clk = false;
6798 state->m_dvbc_static_clk = false;
6799 } else {
6800 state->m_dvbt_static_clk = true;
6801 state->m_dvbc_static_clk = true;
6802 }
6803
6804
6805 if (config->mpeg_out_clk_strength)
6806 state->m_ts_clockk_strength = config->mpeg_out_clk_strength & 0x07;
6807 else
6808 state->m_ts_clockk_strength = 0x06;
6809
6810 if (config->parallel_ts)
6811 state->m_enable_parallel = true;
6812 else
6813 state->m_enable_parallel = false;
6814
6815 /* NOTE: as more UIO bits will be used, add them to the mask */
6816 state->uio_mask = config->antenna_gpio;
6817
6818 /* Default gpio to DVB-C */
6819 if (!state->antenna_dvbt && state->antenna_gpio)
6820 state->m_gpio |= state->antenna_gpio;
6821 else
6822 state->m_gpio &= ~state->antenna_gpio;
6823
6824 mutex_init(&state->mutex);
6825
6826 memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops));
6827 state->frontend.demodulator_priv = state;
6828
6829 init_state(state);
6830
6831 /* Load firmware and initialize DRX-K */
6832 if (state->microcode_name) {
6833 const struct firmware *fw = NULL;
6834
6835 status = request_firmware(&fw, state->microcode_name,
6836 state->i2c->dev.parent);
6837 if (status < 0)
6838 fw = NULL;
6839 load_firmware_cb(fw, state);
6840 } else if (init_drxk(state) < 0)
6841 goto error;
6842
6843
6844 /* Initialize stats */
6845 p = &state->frontend.dtv_property_cache;
6846 p->strength.len = 1;
6847 p->cnr.len = 1;
6848 p->block_error.len = 1;
6849 p->block_count.len = 1;
6850 p->pre_bit_error.len = 1;
6851 p->pre_bit_count.len = 1;
6852 p->post_bit_error.len = 1;
6853 p->post_bit_count.len = 1;
6854
6855 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
6856 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6857 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6858 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6859 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6860 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6861 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6862 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6863
6864 pr_info("frontend initialized.\n");
6865 return &state->frontend;
6866
6867 error:
6868 pr_err("not found\n");
6869 kfree(state);
6870 return NULL;
6871 }
6872 EXPORT_SYMBOL(drxk_attach);
6873
6874 MODULE_DESCRIPTION("DRX-K driver");
6875 MODULE_AUTHOR("Ralph Metzler");
6876 MODULE_LICENSE("GPL");