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