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