1 // SPDX-License-Identifier: GPL-2.0-only
3 * drxk_hard: DRX-K DVB-C/T demodulator driver
5 * Copyright (C) 2010-2011 Digital Devices GmbH
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>
22 #include "drxk_hard.h"
23 #include <linux/int_log.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;
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)
67 #ifndef DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
68 #define DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH (0x03)
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
77 #ifndef DRXK_KI_IAGC_ATV
78 #define DRXK_KI_IAGC_ATV 6
80 #ifndef DRXK_KI_DAGC_ATV
81 #define DRXK_KI_DAGC_ATV 7
84 #ifndef DRXK_KI_RAGC_QAM
85 #define DRXK_KI_RAGC_QAM 3
87 #ifndef DRXK_KI_IAGC_QAM
88 #define DRXK_KI_IAGC_QAM 4
90 #ifndef DRXK_KI_DAGC_QAM
91 #define DRXK_KI_DAGC_QAM 7
93 #ifndef DRXK_KI_RAGC_DVBT
94 #define DRXK_KI_RAGC_DVBT (IsA1WithPatchCode(state) ? 3 : 2)
96 #ifndef DRXK_KI_IAGC_DVBT
97 #define DRXK_KI_IAGC_DVBT (IsA1WithPatchCode(state) ? 4 : 2)
99 #ifndef DRXK_KI_DAGC_DVBT
100 #define DRXK_KI_DAGC_DVBT (IsA1WithPatchCode(state) ? 10 : 7)
103 #ifndef DRXK_AGC_DAC_OFFSET
104 #define DRXK_AGC_DAC_OFFSET (0x800)
107 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
108 #define DRXK_BANDWIDTH_8MHZ_IN_HZ (0x8B8249L)
111 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
112 #define DRXK_BANDWIDTH_7MHZ_IN_HZ (0x7A1200L)
115 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
116 #define DRXK_BANDWIDTH_6MHZ_IN_HZ (0x68A1B6L)
119 #ifndef DRXK_QAM_SYMBOLRATE_MAX
120 #define DRXK_QAM_SYMBOLRATE_MAX (7233000)
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)
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); \
158 static inline u32 Frac28a(u32 a, u32 c)
164 R0 = (a % c) << 4; /* 32-28 == 4 shifts possible at max */
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);
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;
199 static void drxk_i2c_unlock(struct drxk_state *state)
201 if (!state->drxk_i2c_exclusive_lock)
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,
211 if (state->drxk_i2c_exclusive_lock)
212 return __i2c_transfer(state->i2c, msgs, len);
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)
229 struct i2c_msg msg = {
230 .addr = adr, .flags = 0, .buf = data, .len = len };
232 dprintk(3, ": %*ph\n", len, data);
234 status = drxk_i2c_transfer(state, &msg, 1);
235 if (status >= 0 && status != 1)
239 pr_err("i2c write error at addr 0x%02x\n", adr);
244 static int i2c_read(struct drxk_state *state,
245 u8 adr, u8 *msg, int len, u8 *answ, int alen)
248 struct i2c_msg msgs[2] = {
249 {.addr = adr, .flags = 0,
250 .buf = msg, .len = len},
251 {.addr = adr, .flags = I2C_M_RD,
252 .buf = answ, .len = alen}
255 status = drxk_i2c_transfer(state, msgs, 2);
258 pr_cont(": ERROR!\n");
262 pr_err("i2c read error at addr 0x%02x\n", adr);
265 dprintk(3, ": read from %*ph, value = %*ph\n", len, msg, alen, answ);
269 static int read16_flags(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
272 u8 adr = state->demod_address, mm1[4], mm2[2], len;
274 if (state->single_master)
277 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
278 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
279 mm1[1] = ((reg >> 16) & 0xFF);
280 mm1[2] = ((reg >> 24) & 0xFF) | flags;
281 mm1[3] = ((reg >> 7) & 0xFF);
284 mm1[0] = ((reg << 1) & 0xFF);
285 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
288 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
289 status = i2c_read(state, adr, mm1, len, mm2, 2);
293 *data = mm2[0] | (mm2[1] << 8);
298 static int read16(struct drxk_state *state, u32 reg, u16 *data)
300 return read16_flags(state, reg, data, 0);
303 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
306 u8 adr = state->demod_address, mm1[4], mm2[4], len;
308 if (state->single_master)
311 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
312 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
313 mm1[1] = ((reg >> 16) & 0xFF);
314 mm1[2] = ((reg >> 24) & 0xFF) | flags;
315 mm1[3] = ((reg >> 7) & 0xFF);
318 mm1[0] = ((reg << 1) & 0xFF);
319 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
322 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
323 status = i2c_read(state, adr, mm1, len, mm2, 4);
327 *data = mm2[0] | (mm2[1] << 8) |
328 (mm2[2] << 16) | (mm2[3] << 24);
333 static int read32(struct drxk_state *state, u32 reg, u32 *data)
335 return read32_flags(state, reg, data, 0);
338 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
340 u8 adr = state->demod_address, mm[6], len;
342 if (state->single_master)
344 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
345 mm[0] = (((reg << 1) & 0xFF) | 0x01);
346 mm[1] = ((reg >> 16) & 0xFF);
347 mm[2] = ((reg >> 24) & 0xFF) | flags;
348 mm[3] = ((reg >> 7) & 0xFF);
351 mm[0] = ((reg << 1) & 0xFF);
352 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
355 mm[len] = data & 0xff;
356 mm[len + 1] = (data >> 8) & 0xff;
358 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
359 return i2c_write(state, adr, mm, len + 2);
362 static int write16(struct drxk_state *state, u32 reg, u16 data)
364 return write16_flags(state, reg, data, 0);
367 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
369 u8 adr = state->demod_address, mm[8], len;
371 if (state->single_master)
373 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
374 mm[0] = (((reg << 1) & 0xFF) | 0x01);
375 mm[1] = ((reg >> 16) & 0xFF);
376 mm[2] = ((reg >> 24) & 0xFF) | flags;
377 mm[3] = ((reg >> 7) & 0xFF);
380 mm[0] = ((reg << 1) & 0xFF);
381 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
384 mm[len] = data & 0xff;
385 mm[len + 1] = (data >> 8) & 0xff;
386 mm[len + 2] = (data >> 16) & 0xff;
387 mm[len + 3] = (data >> 24) & 0xff;
388 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
390 return i2c_write(state, adr, mm, len + 4);
393 static int write32(struct drxk_state *state, u32 reg, u32 data)
395 return write32_flags(state, reg, data, 0);
398 static int write_block(struct drxk_state *state, u32 address,
399 const int block_size, const u8 p_block[])
401 int status = 0, blk_size = block_size;
404 if (state->single_master)
407 while (blk_size > 0) {
408 int chunk = blk_size > state->m_chunk_size ?
409 state->m_chunk_size : blk_size;
410 u8 *adr_buf = &state->chunk[0];
413 if (DRXDAP_FASI_LONG_FORMAT(address) || (flags != 0)) {
414 adr_buf[0] = (((address << 1) & 0xFF) | 0x01);
415 adr_buf[1] = ((address >> 16) & 0xFF);
416 adr_buf[2] = ((address >> 24) & 0xFF);
417 adr_buf[3] = ((address >> 7) & 0xFF);
420 if (chunk == state->m_chunk_size)
423 adr_buf[0] = ((address << 1) & 0xFF);
424 adr_buf[1] = (((address >> 16) & 0x0F) |
425 ((address >> 18) & 0xF0));
428 memcpy(&state->chunk[adr_length], p_block, chunk);
429 dprintk(2, "(0x%08x, 0x%02x)\n", address, flags);
431 dprintk(2, "%*ph\n", chunk, p_block);
432 status = i2c_write(state, state->demod_address,
433 &state->chunk[0], chunk + adr_length);
435 pr_err("%s: i2c write error at addr 0x%02x\n",
440 address += (chunk >> 1);
446 #ifndef DRXK_MAX_RETRIES_POWERUP
447 #define DRXK_MAX_RETRIES_POWERUP 20
450 static int power_up_device(struct drxk_state *state)
458 status = i2c_read1(state, state->demod_address, &data);
462 status = i2c_write(state, state->demod_address,
464 usleep_range(10000, 11000);
468 status = i2c_read1(state, state->demod_address,
470 } while (status < 0 &&
471 (retry_count < DRXK_MAX_RETRIES_POWERUP));
472 if (status < 0 && retry_count >= DRXK_MAX_RETRIES_POWERUP)
476 /* Make sure all clk domains are active */
477 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
480 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
483 /* Enable pll lock tests */
484 status = write16(state, SIO_CC_PLL_LOCK__A, 1);
488 state->m_current_power_mode = DRX_POWER_UP;
492 pr_err("Error %d on %s\n", status, __func__);
498 static int init_state(struct drxk_state *state)
501 * FIXME: most (all?) of the values below should be moved into
502 * struct drxk_config, as they are probably board-specific
504 u32 ul_vsb_if_agc_mode = DRXK_AGC_CTRL_AUTO;
505 u32 ul_vsb_if_agc_output_level = 0;
506 u32 ul_vsb_if_agc_min_level = 0;
507 u32 ul_vsb_if_agc_max_level = 0x7FFF;
508 u32 ul_vsb_if_agc_speed = 3;
510 u32 ul_vsb_rf_agc_mode = DRXK_AGC_CTRL_AUTO;
511 u32 ul_vsb_rf_agc_output_level = 0;
512 u32 ul_vsb_rf_agc_min_level = 0;
513 u32 ul_vsb_rf_agc_max_level = 0x7FFF;
514 u32 ul_vsb_rf_agc_speed = 3;
515 u32 ul_vsb_rf_agc_top = 9500;
516 u32 ul_vsb_rf_agc_cut_off_current = 4000;
518 u32 ul_atv_if_agc_mode = DRXK_AGC_CTRL_AUTO;
519 u32 ul_atv_if_agc_output_level = 0;
520 u32 ul_atv_if_agc_min_level = 0;
521 u32 ul_atv_if_agc_max_level = 0;
522 u32 ul_atv_if_agc_speed = 3;
524 u32 ul_atv_rf_agc_mode = DRXK_AGC_CTRL_OFF;
525 u32 ul_atv_rf_agc_output_level = 0;
526 u32 ul_atv_rf_agc_min_level = 0;
527 u32 ul_atv_rf_agc_max_level = 0;
528 u32 ul_atv_rf_agc_top = 9500;
529 u32 ul_atv_rf_agc_cut_off_current = 4000;
530 u32 ul_atv_rf_agc_speed = 3;
532 u32 ulQual83 = DEFAULT_MER_83;
533 u32 ulQual93 = DEFAULT_MER_93;
535 u32 ul_mpeg_lock_time_out = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
536 u32 ul_demod_lock_time_out = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
538 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
539 /* io_pad_cfg_mode output mode is drive always */
540 /* io_pad_cfg_drive is set to power 2 (23 mA) */
541 u32 ul_gpio_cfg = 0x0113;
542 u32 ul_invert_ts_clock = 0;
543 u32 ul_ts_data_strength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
544 u32 ul_dvbt_bitrate = 50000000;
545 u32 ul_dvbc_bitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
547 u32 ul_insert_rs_byte = 0;
549 u32 ul_rf_mirror = 1;
550 u32 ul_power_down = 0;
554 state->m_has_lna = false;
555 state->m_has_dvbt = false;
556 state->m_has_dvbc = false;
557 state->m_has_atv = false;
558 state->m_has_oob = false;
559 state->m_has_audio = false;
561 if (!state->m_chunk_size)
562 state->m_chunk_size = 124;
564 state->m_osc_clock_freq = 0;
565 state->m_smart_ant_inverted = false;
566 state->m_b_p_down_open_bridge = false;
568 /* real system clock frequency in kHz */
569 state->m_sys_clock_freq = 151875;
570 /* Timing div, 250ns/Psys */
571 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
572 state->m_hi_cfg_timing_div = ((state->m_sys_clock_freq / 1000) *
573 HI_I2C_DELAY) / 1000;
575 if (state->m_hi_cfg_timing_div > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
576 state->m_hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
577 state->m_hi_cfg_wake_up_key = (state->demod_address << 1);
578 /* port/bridge/power down ctrl */
579 state->m_hi_cfg_ctrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
581 state->m_b_power_down = (ul_power_down != 0);
583 state->m_drxk_a3_patch_code = false;
585 /* Init AGC and PGA parameters */
587 state->m_vsb_if_agc_cfg.ctrl_mode = ul_vsb_if_agc_mode;
588 state->m_vsb_if_agc_cfg.output_level = ul_vsb_if_agc_output_level;
589 state->m_vsb_if_agc_cfg.min_output_level = ul_vsb_if_agc_min_level;
590 state->m_vsb_if_agc_cfg.max_output_level = ul_vsb_if_agc_max_level;
591 state->m_vsb_if_agc_cfg.speed = ul_vsb_if_agc_speed;
592 state->m_vsb_pga_cfg = 140;
595 state->m_vsb_rf_agc_cfg.ctrl_mode = ul_vsb_rf_agc_mode;
596 state->m_vsb_rf_agc_cfg.output_level = ul_vsb_rf_agc_output_level;
597 state->m_vsb_rf_agc_cfg.min_output_level = ul_vsb_rf_agc_min_level;
598 state->m_vsb_rf_agc_cfg.max_output_level = ul_vsb_rf_agc_max_level;
599 state->m_vsb_rf_agc_cfg.speed = ul_vsb_rf_agc_speed;
600 state->m_vsb_rf_agc_cfg.top = ul_vsb_rf_agc_top;
601 state->m_vsb_rf_agc_cfg.cut_off_current = ul_vsb_rf_agc_cut_off_current;
602 state->m_vsb_pre_saw_cfg.reference = 0x07;
603 state->m_vsb_pre_saw_cfg.use_pre_saw = true;
605 state->m_Quality83percent = DEFAULT_MER_83;
606 state->m_Quality93percent = DEFAULT_MER_93;
607 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
608 state->m_Quality83percent = ulQual83;
609 state->m_Quality93percent = ulQual93;
613 state->m_atv_if_agc_cfg.ctrl_mode = ul_atv_if_agc_mode;
614 state->m_atv_if_agc_cfg.output_level = ul_atv_if_agc_output_level;
615 state->m_atv_if_agc_cfg.min_output_level = ul_atv_if_agc_min_level;
616 state->m_atv_if_agc_cfg.max_output_level = ul_atv_if_agc_max_level;
617 state->m_atv_if_agc_cfg.speed = ul_atv_if_agc_speed;
620 state->m_atv_rf_agc_cfg.ctrl_mode = ul_atv_rf_agc_mode;
621 state->m_atv_rf_agc_cfg.output_level = ul_atv_rf_agc_output_level;
622 state->m_atv_rf_agc_cfg.min_output_level = ul_atv_rf_agc_min_level;
623 state->m_atv_rf_agc_cfg.max_output_level = ul_atv_rf_agc_max_level;
624 state->m_atv_rf_agc_cfg.speed = ul_atv_rf_agc_speed;
625 state->m_atv_rf_agc_cfg.top = ul_atv_rf_agc_top;
626 state->m_atv_rf_agc_cfg.cut_off_current = ul_atv_rf_agc_cut_off_current;
627 state->m_atv_pre_saw_cfg.reference = 0x04;
628 state->m_atv_pre_saw_cfg.use_pre_saw = true;
632 state->m_dvbt_rf_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_OFF;
633 state->m_dvbt_rf_agc_cfg.output_level = 0;
634 state->m_dvbt_rf_agc_cfg.min_output_level = 0;
635 state->m_dvbt_rf_agc_cfg.max_output_level = 0xFFFF;
636 state->m_dvbt_rf_agc_cfg.top = 0x2100;
637 state->m_dvbt_rf_agc_cfg.cut_off_current = 4000;
638 state->m_dvbt_rf_agc_cfg.speed = 1;
642 state->m_dvbt_if_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_AUTO;
643 state->m_dvbt_if_agc_cfg.output_level = 0;
644 state->m_dvbt_if_agc_cfg.min_output_level = 0;
645 state->m_dvbt_if_agc_cfg.max_output_level = 9000;
646 state->m_dvbt_if_agc_cfg.top = 13424;
647 state->m_dvbt_if_agc_cfg.cut_off_current = 0;
648 state->m_dvbt_if_agc_cfg.speed = 3;
649 state->m_dvbt_if_agc_cfg.fast_clip_ctrl_delay = 30;
650 state->m_dvbt_if_agc_cfg.ingain_tgt_max = 30000;
651 /* state->m_dvbtPgaCfg = 140; */
653 state->m_dvbt_pre_saw_cfg.reference = 4;
654 state->m_dvbt_pre_saw_cfg.use_pre_saw = false;
657 state->m_qam_rf_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_OFF;
658 state->m_qam_rf_agc_cfg.output_level = 0;
659 state->m_qam_rf_agc_cfg.min_output_level = 6023;
660 state->m_qam_rf_agc_cfg.max_output_level = 27000;
661 state->m_qam_rf_agc_cfg.top = 0x2380;
662 state->m_qam_rf_agc_cfg.cut_off_current = 4000;
663 state->m_qam_rf_agc_cfg.speed = 3;
666 state->m_qam_if_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_AUTO;
667 state->m_qam_if_agc_cfg.output_level = 0;
668 state->m_qam_if_agc_cfg.min_output_level = 0;
669 state->m_qam_if_agc_cfg.max_output_level = 9000;
670 state->m_qam_if_agc_cfg.top = 0x0511;
671 state->m_qam_if_agc_cfg.cut_off_current = 0;
672 state->m_qam_if_agc_cfg.speed = 3;
673 state->m_qam_if_agc_cfg.ingain_tgt_max = 5119;
674 state->m_qam_if_agc_cfg.fast_clip_ctrl_delay = 50;
676 state->m_qam_pga_cfg = 140;
677 state->m_qam_pre_saw_cfg.reference = 4;
678 state->m_qam_pre_saw_cfg.use_pre_saw = false;
680 state->m_operation_mode = OM_NONE;
681 state->m_drxk_state = DRXK_UNINITIALIZED;
683 /* MPEG output configuration */
684 state->m_enable_mpeg_output = true; /* If TRUE; enable MPEG output */
685 state->m_insert_rs_byte = false; /* If TRUE; insert RS byte */
686 state->m_invert_data = false; /* If TRUE; invert DATA signals */
687 state->m_invert_err = false; /* If TRUE; invert ERR signal */
688 state->m_invert_str = false; /* If TRUE; invert STR signals */
689 state->m_invert_val = false; /* If TRUE; invert VAL signals */
690 state->m_invert_clk = (ul_invert_ts_clock != 0); /* If TRUE; invert CLK signals */
692 /* If TRUE; static MPEG clockrate will be used;
693 otherwise clockrate will adapt to the bitrate of the TS */
695 state->m_dvbt_bitrate = ul_dvbt_bitrate;
696 state->m_dvbc_bitrate = ul_dvbc_bitrate;
698 state->m_ts_data_strength = (ul_ts_data_strength & 0x07);
700 /* Maximum bitrate in b/s in case static clockrate is selected */
701 state->m_mpeg_ts_static_bitrate = 19392658;
702 state->m_disable_te_ihandling = false;
704 if (ul_insert_rs_byte)
705 state->m_insert_rs_byte = true;
707 state->m_mpeg_lock_time_out = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
708 if (ul_mpeg_lock_time_out < 10000)
709 state->m_mpeg_lock_time_out = ul_mpeg_lock_time_out;
710 state->m_demod_lock_time_out = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
711 if (ul_demod_lock_time_out < 10000)
712 state->m_demod_lock_time_out = ul_demod_lock_time_out;
715 state->m_constellation = DRX_CONSTELLATION_AUTO;
716 state->m_qam_interleave_mode = DRXK_QAM_I12_J17;
717 state->m_fec_rs_plen = 204 * 8; /* fecRsPlen annex A */
718 state->m_fec_rs_prescale = 1;
720 state->m_sqi_speed = DRXK_DVBT_SQI_SPEED_MEDIUM;
721 state->m_agcfast_clip_ctrl_delay = 0;
723 state->m_gpio_cfg = ul_gpio_cfg;
725 state->m_b_power_down = false;
726 state->m_current_power_mode = DRX_POWER_DOWN;
728 state->m_rfmirror = (ul_rf_mirror == 0);
729 state->m_if_agc_pol = false;
733 static int drxx_open(struct drxk_state *state)
741 /* stop lock indicator process */
742 status = write16(state, SCU_RAM_GPIO__A,
743 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
746 /* Check device id */
747 status = read16(state, SIO_TOP_COMM_KEY__A, &key);
750 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
753 status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
756 status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
759 status = write16(state, SIO_TOP_COMM_KEY__A, key);
762 pr_err("Error %d on %s\n", status, __func__);
766 static int get_device_capabilities(struct drxk_state *state)
768 u16 sio_pdr_ohw_cfg = 0;
769 u32 sio_top_jtagid_lo = 0;
771 const char *spin = "";
776 /* stop lock indicator process */
777 status = write16(state, SCU_RAM_GPIO__A,
778 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
781 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
784 status = read16(state, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg);
787 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
791 switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
793 /* ignore (bypass ?) */
797 state->m_osc_clock_freq = 27000;
801 state->m_osc_clock_freq = 20250;
805 state->m_osc_clock_freq = 20250;
808 pr_err("Clock Frequency is unknown\n");
812 Determine device capabilities
815 status = read32(state, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo);
819 pr_info("status = 0x%08x\n", sio_top_jtagid_lo);
822 switch ((sio_top_jtagid_lo >> 29) & 0xF) {
824 state->m_device_spin = DRXK_SPIN_A1;
828 state->m_device_spin = DRXK_SPIN_A2;
832 state->m_device_spin = DRXK_SPIN_A3;
836 state->m_device_spin = DRXK_SPIN_UNKNOWN;
838 pr_err("Spin %d unknown\n", (sio_top_jtagid_lo >> 29) & 0xF);
841 switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
843 /* typeId = DRX3913K_TYPE_ID */
844 state->m_has_lna = false;
845 state->m_has_oob = false;
846 state->m_has_atv = false;
847 state->m_has_audio = false;
848 state->m_has_dvbt = true;
849 state->m_has_dvbc = true;
850 state->m_has_sawsw = true;
851 state->m_has_gpio2 = false;
852 state->m_has_gpio1 = false;
853 state->m_has_irqn = false;
856 /* typeId = DRX3915K_TYPE_ID */
857 state->m_has_lna = false;
858 state->m_has_oob = false;
859 state->m_has_atv = true;
860 state->m_has_audio = false;
861 state->m_has_dvbt = true;
862 state->m_has_dvbc = false;
863 state->m_has_sawsw = true;
864 state->m_has_gpio2 = true;
865 state->m_has_gpio1 = true;
866 state->m_has_irqn = false;
869 /* typeId = DRX3916K_TYPE_ID */
870 state->m_has_lna = false;
871 state->m_has_oob = false;
872 state->m_has_atv = true;
873 state->m_has_audio = false;
874 state->m_has_dvbt = true;
875 state->m_has_dvbc = false;
876 state->m_has_sawsw = true;
877 state->m_has_gpio2 = true;
878 state->m_has_gpio1 = true;
879 state->m_has_irqn = false;
882 /* typeId = DRX3918K_TYPE_ID */
883 state->m_has_lna = false;
884 state->m_has_oob = false;
885 state->m_has_atv = true;
886 state->m_has_audio = true;
887 state->m_has_dvbt = true;
888 state->m_has_dvbc = false;
889 state->m_has_sawsw = true;
890 state->m_has_gpio2 = true;
891 state->m_has_gpio1 = true;
892 state->m_has_irqn = false;
895 /* typeId = DRX3921K_TYPE_ID */
896 state->m_has_lna = false;
897 state->m_has_oob = false;
898 state->m_has_atv = true;
899 state->m_has_audio = true;
900 state->m_has_dvbt = true;
901 state->m_has_dvbc = true;
902 state->m_has_sawsw = true;
903 state->m_has_gpio2 = true;
904 state->m_has_gpio1 = true;
905 state->m_has_irqn = false;
908 /* typeId = DRX3923K_TYPE_ID */
909 state->m_has_lna = false;
910 state->m_has_oob = false;
911 state->m_has_atv = true;
912 state->m_has_audio = true;
913 state->m_has_dvbt = true;
914 state->m_has_dvbc = true;
915 state->m_has_sawsw = true;
916 state->m_has_gpio2 = true;
917 state->m_has_gpio1 = true;
918 state->m_has_irqn = false;
921 /* typeId = DRX3925K_TYPE_ID */
922 state->m_has_lna = false;
923 state->m_has_oob = false;
924 state->m_has_atv = true;
925 state->m_has_audio = true;
926 state->m_has_dvbt = true;
927 state->m_has_dvbc = true;
928 state->m_has_sawsw = true;
929 state->m_has_gpio2 = true;
930 state->m_has_gpio1 = true;
931 state->m_has_irqn = false;
934 /* typeId = DRX3926K_TYPE_ID */
935 state->m_has_lna = false;
936 state->m_has_oob = false;
937 state->m_has_atv = true;
938 state->m_has_audio = false;
939 state->m_has_dvbt = true;
940 state->m_has_dvbc = true;
941 state->m_has_sawsw = true;
942 state->m_has_gpio2 = true;
943 state->m_has_gpio1 = true;
944 state->m_has_irqn = false;
947 pr_err("DeviceID 0x%02x not supported\n",
948 ((sio_top_jtagid_lo >> 12) & 0xFF));
953 pr_info("detected a drx-39%02xk, spin %s, xtal %d.%03d MHz\n",
954 ((sio_top_jtagid_lo >> 12) & 0xFF), spin,
955 state->m_osc_clock_freq / 1000,
956 state->m_osc_clock_freq % 1000);
960 pr_err("Error %d on %s\n", status, __func__);
966 static int hi_command(struct drxk_state *state, u16 cmd, u16 *p_result)
974 status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
977 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
978 usleep_range(1000, 2000);
981 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
982 ((state->m_hi_cfg_ctrl) &
983 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
984 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
985 if (!powerdown_cmd) {
986 /* Wait until command rdy */
991 usleep_range(1000, 2000);
993 status = read16(state, SIO_HI_RA_RAM_CMD__A,
995 } while ((status < 0 || wait_cmd) && (retry_count < DRXK_MAX_RETRIES));
998 status = read16(state, SIO_HI_RA_RAM_RES__A, p_result);
1002 pr_err("Error %d on %s\n", status, __func__);
1007 static int hi_cfg_command(struct drxk_state *state)
1013 mutex_lock(&state->mutex);
1015 status = write16(state, SIO_HI_RA_RAM_PAR_6__A,
1016 state->m_hi_cfg_timeout);
1019 status = write16(state, SIO_HI_RA_RAM_PAR_5__A,
1020 state->m_hi_cfg_ctrl);
1023 status = write16(state, SIO_HI_RA_RAM_PAR_4__A,
1024 state->m_hi_cfg_wake_up_key);
1027 status = write16(state, SIO_HI_RA_RAM_PAR_3__A,
1028 state->m_hi_cfg_bridge_delay);
1031 status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
1032 state->m_hi_cfg_timing_div);
1035 status = write16(state, SIO_HI_RA_RAM_PAR_1__A,
1036 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1039 status = hi_command(state, SIO_HI_RA_RAM_CMD_CONFIG, NULL);
1043 state->m_hi_cfg_ctrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1045 mutex_unlock(&state->mutex);
1047 pr_err("Error %d on %s\n", status, __func__);
1051 static int init_hi(struct drxk_state *state)
1055 state->m_hi_cfg_wake_up_key = (state->demod_address << 1);
1056 state->m_hi_cfg_timeout = 0x96FF;
1057 /* port/bridge/power down ctrl */
1058 state->m_hi_cfg_ctrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1060 return hi_cfg_command(state);
1063 static int mpegts_configure_pins(struct drxk_state *state, bool mpeg_enable)
1066 u16 sio_pdr_mclk_cfg = 0;
1067 u16 sio_pdr_mdx_cfg = 0;
1070 dprintk(1, ": mpeg %s, %s mode\n",
1071 mpeg_enable ? "enable" : "disable",
1072 state->m_enable_parallel ? "parallel" : "serial");
1074 /* stop lock indicator process */
1075 status = write16(state, SCU_RAM_GPIO__A,
1076 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1080 /* MPEG TS pad configuration */
1081 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
1086 /* Set MPEG TS pads to inputmode */
1087 status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1090 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1093 status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1096 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1099 status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1102 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1105 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1108 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1111 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1114 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1117 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1120 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1124 /* Enable MPEG output */
1126 ((state->m_ts_data_strength <<
1127 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1128 sio_pdr_mclk_cfg = ((state->m_ts_clockk_strength <<
1129 SIO_PDR_MCLK_CFG_DRIVE__B) |
1132 status = write16(state, SIO_PDR_MSTRT_CFG__A, sio_pdr_mdx_cfg);
1136 if (state->enable_merr_cfg)
1137 err_cfg = sio_pdr_mdx_cfg;
1139 status = write16(state, SIO_PDR_MERR_CFG__A, err_cfg);
1142 status = write16(state, SIO_PDR_MVAL_CFG__A, err_cfg);
1146 if (state->m_enable_parallel) {
1147 /* parallel -> enable MD1 to MD7 */
1148 status = write16(state, SIO_PDR_MD1_CFG__A,
1152 status = write16(state, SIO_PDR_MD2_CFG__A,
1156 status = write16(state, SIO_PDR_MD3_CFG__A,
1160 status = write16(state, SIO_PDR_MD4_CFG__A,
1164 status = write16(state, SIO_PDR_MD5_CFG__A,
1168 status = write16(state, SIO_PDR_MD6_CFG__A,
1172 status = write16(state, SIO_PDR_MD7_CFG__A,
1177 sio_pdr_mdx_cfg = ((state->m_ts_data_strength <<
1178 SIO_PDR_MD0_CFG_DRIVE__B)
1180 /* serial -> disable MD1 to MD7 */
1181 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1184 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1187 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1190 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1193 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1196 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1199 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1203 status = write16(state, SIO_PDR_MCLK_CFG__A, sio_pdr_mclk_cfg);
1206 status = write16(state, SIO_PDR_MD0_CFG__A, sio_pdr_mdx_cfg);
1210 /* Enable MB output over MPEG pads and ctl input */
1211 status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1214 /* Write nomagic word to enable pdr reg write */
1215 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1218 pr_err("Error %d on %s\n", status, __func__);
1222 static int mpegts_disable(struct drxk_state *state)
1226 return mpegts_configure_pins(state, false);
1229 static int bl_chain_cmd(struct drxk_state *state,
1230 u16 rom_offset, u16 nr_of_elements, u32 time_out)
1237 mutex_lock(&state->mutex);
1238 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1241 status = write16(state, SIO_BL_CHAIN_ADDR__A, rom_offset);
1244 status = write16(state, SIO_BL_CHAIN_LEN__A, nr_of_elements);
1247 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1251 end = jiffies + msecs_to_jiffies(time_out);
1253 usleep_range(1000, 2000);
1254 status = read16(state, SIO_BL_STATUS__A, &bl_status);
1257 } while ((bl_status == 0x1) &&
1258 ((time_is_after_jiffies(end))));
1260 if (bl_status == 0x1) {
1261 pr_err("SIO not ready\n");
1267 pr_err("Error %d on %s\n", status, __func__);
1269 mutex_unlock(&state->mutex);
1274 static int download_microcode(struct drxk_state *state,
1275 const u8 p_mc_image[], u32 length)
1277 const u8 *p_src = p_mc_image;
1287 /* down the drain (we don't care about MAGIC_WORD) */
1289 /* For future reference */
1290 drain = (p_src[0] << 8) | p_src[1];
1292 p_src += sizeof(u16);
1293 offset += sizeof(u16);
1294 n_blocks = (p_src[0] << 8) | p_src[1];
1295 p_src += sizeof(u16);
1296 offset += sizeof(u16);
1298 for (i = 0; i < n_blocks; i += 1) {
1299 address = (p_src[0] << 24) | (p_src[1] << 16) |
1300 (p_src[2] << 8) | p_src[3];
1301 p_src += sizeof(u32);
1302 offset += sizeof(u32);
1304 block_size = ((p_src[0] << 8) | p_src[1]) * sizeof(u16);
1305 p_src += sizeof(u16);
1306 offset += sizeof(u16);
1309 /* For future reference */
1310 flags = (p_src[0] << 8) | p_src[1];
1312 p_src += sizeof(u16);
1313 offset += sizeof(u16);
1316 /* For future reference */
1317 block_crc = (p_src[0] << 8) | p_src[1];
1319 p_src += sizeof(u16);
1320 offset += sizeof(u16);
1322 if (offset + block_size > length) {
1323 pr_err("Firmware is corrupted.\n");
1327 status = write_block(state, address, block_size, p_src);
1329 pr_err("Error %d while loading firmware\n", status);
1332 p_src += block_size;
1333 offset += block_size;
1338 static int dvbt_enable_ofdm_token_ring(struct drxk_state *state, bool enable)
1342 u16 desired_ctrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1343 u16 desired_status = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1349 desired_ctrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1350 desired_status = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1353 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1354 if (status >= 0 && data == desired_status) {
1355 /* tokenring already has correct status */
1358 /* Disable/enable dvbt tokenring bridge */
1359 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desired_ctrl);
1361 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1363 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1364 if ((status >= 0 && data == desired_status)
1365 || time_is_after_jiffies(end))
1367 usleep_range(1000, 2000);
1369 if (data != desired_status) {
1370 pr_err("SIO not ready\n");
1376 static int mpegts_stop(struct drxk_state *state)
1379 u16 fec_oc_snc_mode = 0;
1380 u16 fec_oc_ipr_mode = 0;
1384 /* Graceful shutdown (byte boundaries) */
1385 status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
1388 fec_oc_snc_mode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1389 status = write16(state, FEC_OC_SNC_MODE__A, fec_oc_snc_mode);
1393 /* Suppress MCLK during absence of data */
1394 status = read16(state, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode);
1397 fec_oc_ipr_mode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1398 status = write16(state, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode);
1402 pr_err("Error %d on %s\n", status, __func__);
1407 static int scu_command(struct drxk_state *state,
1408 u16 cmd, u8 parameter_len,
1409 u16 *parameter, u8 result_len, u16 *result)
1411 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1412 #error DRXK register mapping no longer compatible with this routine!
1415 int status = -EINVAL;
1424 if ((cmd == 0) || ((parameter_len > 0) && (parameter == NULL)) ||
1425 ((result_len > 0) && (result == NULL))) {
1426 pr_err("Error %d on %s\n", status, __func__);
1430 mutex_lock(&state->mutex);
1432 /* assume that the command register is ready
1433 since it is checked afterwards */
1435 for (ii = parameter_len - 1; ii >= 0; ii -= 1) {
1436 buffer[cnt++] = (parameter[ii] & 0xFF);
1437 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1440 buffer[cnt++] = (cmd & 0xFF);
1441 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1443 write_block(state, SCU_RAM_PARAM_0__A -
1444 (parameter_len - 1), cnt, buffer);
1445 /* Wait until SCU has processed command */
1446 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1448 usleep_range(1000, 2000);
1449 status = read16(state, SCU_RAM_COMMAND__A, &cur_cmd);
1452 } while (!(cur_cmd == DRX_SCU_READY) && (time_is_after_jiffies(end)));
1453 if (cur_cmd != DRX_SCU_READY) {
1454 pr_err("SCU not ready\n");
1459 if ((result_len > 0) && (result != NULL)) {
1463 for (ii = result_len - 1; ii >= 0; ii -= 1) {
1464 status = read16(state, SCU_RAM_PARAM_0__A - ii,
1470 /* Check if an error was reported by SCU */
1471 err = (s16)result[0];
1475 /* check for the known error codes */
1477 case SCU_RESULT_UNKCMD:
1478 p = "SCU_RESULT_UNKCMD";
1480 case SCU_RESULT_UNKSTD:
1481 p = "SCU_RESULT_UNKSTD";
1483 case SCU_RESULT_SIZE:
1484 p = "SCU_RESULT_SIZE";
1486 case SCU_RESULT_INVPAR:
1487 p = "SCU_RESULT_INVPAR";
1489 default: /* Other negative values are errors */
1490 sprintf(errname, "ERROR: %d\n", err);
1493 pr_err("%s while sending cmd 0x%04x with params:", p, cmd);
1494 print_hex_dump_bytes("drxk: ", DUMP_PREFIX_NONE, buffer, cnt);
1501 pr_err("Error %d on %s\n", status, __func__);
1503 mutex_unlock(&state->mutex);
1507 static int set_iqm_af(struct drxk_state *state, bool active)
1515 status = read16(state, IQM_AF_STDBY__A, &data);
1520 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1521 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1522 | IQM_AF_STDBY_STDBY_PD_STANDBY
1523 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1524 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1526 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1527 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1528 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1529 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1530 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1533 status = write16(state, IQM_AF_STDBY__A, data);
1537 pr_err("Error %d on %s\n", status, __func__);
1541 static int ctrl_power_mode(struct drxk_state *state, enum drx_power_mode *mode)
1544 u16 sio_cc_pwd_mode = 0;
1548 /* Check arguments */
1554 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
1556 case DRXK_POWER_DOWN_OFDM:
1557 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1559 case DRXK_POWER_DOWN_CORE:
1560 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1562 case DRXK_POWER_DOWN_PLL:
1563 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
1565 case DRX_POWER_DOWN:
1566 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
1569 /* Unknown sleep mode */
1573 /* If already in requested power mode, do nothing */
1574 if (state->m_current_power_mode == *mode)
1577 /* For next steps make sure to start from DRX_POWER_UP mode */
1578 if (state->m_current_power_mode != DRX_POWER_UP) {
1579 status = power_up_device(state);
1582 status = dvbt_enable_ofdm_token_ring(state, true);
1587 if (*mode == DRX_POWER_UP) {
1588 /* Restore analog & pin configuration */
1590 /* Power down to requested mode */
1591 /* Backup some register settings */
1592 /* Set pins with possible pull-ups connected
1593 to them in input mode */
1594 /* Analog power down */
1595 /* ADC power down */
1596 /* Power down device */
1597 /* stop all comm_exec */
1598 /* Stop and power down previous standard */
1599 switch (state->m_operation_mode) {
1601 status = mpegts_stop(state);
1604 status = power_down_dvbt(state, false);
1610 status = mpegts_stop(state);
1613 status = power_down_qam(state);
1620 status = dvbt_enable_ofdm_token_ring(state, false);
1623 status = write16(state, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode);
1626 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1630 if (*mode != DRXK_POWER_DOWN_OFDM) {
1631 state->m_hi_cfg_ctrl |=
1632 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1633 status = hi_cfg_command(state);
1638 state->m_current_power_mode = *mode;
1642 pr_err("Error %d on %s\n", status, __func__);
1647 static int power_down_dvbt(struct drxk_state *state, bool set_power_mode)
1649 enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
1656 status = read16(state, SCU_COMM_EXEC__A, &data);
1659 if (data == SCU_COMM_EXEC_ACTIVE) {
1660 /* Send OFDM stop command */
1661 status = scu_command(state,
1662 SCU_RAM_COMMAND_STANDARD_OFDM
1663 | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
1664 0, NULL, 1, &cmd_result);
1667 /* Send OFDM reset command */
1668 status = scu_command(state,
1669 SCU_RAM_COMMAND_STANDARD_OFDM
1670 | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
1671 0, NULL, 1, &cmd_result);
1676 /* Reset datapath for OFDM, processors first */
1677 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1680 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1683 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1688 status = set_iqm_af(state, false);
1692 /* powerdown to OFDM mode */
1693 if (set_power_mode) {
1694 status = ctrl_power_mode(state, &power_mode);
1700 pr_err("Error %d on %s\n", status, __func__);
1704 static int setoperation_mode(struct drxk_state *state,
1705 enum operation_mode o_mode)
1711 Stop and power down previous standard
1712 TODO investigate total power down instead of partial
1713 power down depending on "previous" standard.
1716 /* disable HW lock indicator */
1717 status = write16(state, SCU_RAM_GPIO__A,
1718 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1722 /* Device is already at the required mode */
1723 if (state->m_operation_mode == o_mode)
1726 switch (state->m_operation_mode) {
1727 /* OM_NONE was added for start up */
1731 status = mpegts_stop(state);
1734 status = power_down_dvbt(state, true);
1737 state->m_operation_mode = OM_NONE;
1741 status = mpegts_stop(state);
1744 status = power_down_qam(state);
1747 state->m_operation_mode = OM_NONE;
1756 Power up new standard
1760 dprintk(1, ": DVB-T\n");
1761 state->m_operation_mode = o_mode;
1762 status = set_dvbt_standard(state, o_mode);
1768 dprintk(1, ": DVB-C Annex %c\n",
1769 (state->m_operation_mode == OM_QAM_ITU_A) ? 'A' : 'C');
1770 state->m_operation_mode = o_mode;
1771 status = set_qam_standard(state, o_mode);
1781 pr_err("Error %d on %s\n", status, __func__);
1785 static int start(struct drxk_state *state, s32 offset_freq,
1786 s32 intermediate_frequency)
1788 int status = -EINVAL;
1791 s32 offsetk_hz = offset_freq / 1000;
1794 if (state->m_drxk_state != DRXK_STOPPED &&
1795 state->m_drxk_state != DRXK_DTV_STARTED)
1798 state->m_b_mirror_freq_spect = (state->props.inversion == INVERSION_ON);
1800 if (intermediate_frequency < 0) {
1801 state->m_b_mirror_freq_spect = !state->m_b_mirror_freq_spect;
1802 intermediate_frequency = -intermediate_frequency;
1805 switch (state->m_operation_mode) {
1808 i_freqk_hz = (intermediate_frequency / 1000);
1809 status = set_qam(state, i_freqk_hz, offsetk_hz);
1812 state->m_drxk_state = DRXK_DTV_STARTED;
1815 i_freqk_hz = (intermediate_frequency / 1000);
1816 status = mpegts_stop(state);
1819 status = set_dvbt(state, i_freqk_hz, offsetk_hz);
1822 status = dvbt_start(state);
1825 state->m_drxk_state = DRXK_DTV_STARTED;
1832 pr_err("Error %d on %s\n", status, __func__);
1836 static int shut_down(struct drxk_state *state)
1844 static int get_lock_status(struct drxk_state *state, u32 *p_lock_status)
1846 int status = -EINVAL;
1850 if (p_lock_status == NULL)
1853 *p_lock_status = NOT_LOCKED;
1855 /* define the SCU command code */
1856 switch (state->m_operation_mode) {
1860 status = get_qam_lock_status(state, p_lock_status);
1863 status = get_dvbt_lock_status(state, p_lock_status);
1866 pr_debug("Unsupported operation mode %d in %s\n",
1867 state->m_operation_mode, __func__);
1872 pr_err("Error %d on %s\n", status, __func__);
1876 static int mpegts_start(struct drxk_state *state)
1880 u16 fec_oc_snc_mode = 0;
1882 /* Allow OC to sync again */
1883 status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
1886 fec_oc_snc_mode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1887 status = write16(state, FEC_OC_SNC_MODE__A, fec_oc_snc_mode);
1890 status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1893 pr_err("Error %d on %s\n", status, __func__);
1897 static int mpegts_dto_init(struct drxk_state *state)
1903 /* Rate integration settings */
1904 status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1907 status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1910 status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1913 status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
1916 status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
1919 status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
1922 status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
1925 status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
1929 /* Additional configuration */
1930 status = write16(state, FEC_OC_OCR_INVERT__A, 0);
1933 status = write16(state, FEC_OC_SNC_LWM__A, 2);
1936 status = write16(state, FEC_OC_SNC_HWM__A, 12);
1939 pr_err("Error %d on %s\n", status, __func__);
1944 static int mpegts_dto_setup(struct drxk_state *state,
1945 enum operation_mode o_mode)
1949 u16 fec_oc_reg_mode = 0; /* FEC_OC_MODE register value */
1950 u16 fec_oc_reg_ipr_mode = 0; /* FEC_OC_IPR_MODE register value */
1951 u16 fec_oc_dto_mode = 0; /* FEC_OC_IPR_INVERT register value */
1952 u16 fec_oc_fct_mode = 0; /* FEC_OC_IPR_INVERT register value */
1953 u16 fec_oc_dto_period = 2; /* FEC_OC_IPR_INVERT register value */
1954 u16 fec_oc_dto_burst_len = 188; /* FEC_OC_IPR_INVERT register value */
1955 u32 fec_oc_rcn_ctl_rate = 0; /* FEC_OC_IPR_INVERT register value */
1956 u16 fec_oc_tmd_mode = 0;
1957 u16 fec_oc_tmd_int_upd_rate = 0;
1958 u32 max_bit_rate = 0;
1959 bool static_clk = false;
1963 /* Check insertion of the Reed-Solomon parity bytes */
1964 status = read16(state, FEC_OC_MODE__A, &fec_oc_reg_mode);
1967 status = read16(state, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode);
1970 fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
1971 fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
1972 if (state->m_insert_rs_byte) {
1973 /* enable parity symbol forward */
1974 fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
1975 /* MVAL disable during parity bytes */
1976 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
1977 /* TS burst length to 204 */
1978 fec_oc_dto_burst_len = 204;
1981 /* Check serial or parallel output */
1982 fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
1983 if (!state->m_enable_parallel) {
1984 /* MPEG data output is serial -> set ipr_mode[0] */
1985 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
1990 max_bit_rate = state->m_dvbt_bitrate;
1991 fec_oc_tmd_mode = 3;
1992 fec_oc_rcn_ctl_rate = 0xC00000;
1993 static_clk = state->m_dvbt_static_clk;
1997 fec_oc_tmd_mode = 0x0004;
1998 fec_oc_rcn_ctl_rate = 0xD2B4EE; /* good for >63 Mb/s */
1999 max_bit_rate = state->m_dvbc_bitrate;
2000 static_clk = state->m_dvbc_static_clk;
2004 } /* switch (standard) */
2008 /* Configure DTO's */
2012 /* Rational DTO for MCLK source (static MCLK rate),
2013 Dynamic DTO for optimal grouping
2014 (avoid intra-packet gaps),
2015 DTO offset enable to sync TS burst with MSTRT */
2016 fec_oc_dto_mode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2017 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2018 fec_oc_fct_mode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2019 FEC_OC_FCT_MODE_VIRT_ENA__M);
2021 /* Check user defined bitrate */
2022 bit_rate = max_bit_rate;
2023 if (bit_rate > 75900000UL) { /* max is 75.9 Mb/s */
2024 bit_rate = 75900000UL;
2026 /* Rational DTO period:
2027 dto_period = (Fsys / bitrate) - 2
2029 result should be floored,
2030 to make sure >= requested bitrate
2032 fec_oc_dto_period = (u16) (((state->m_sys_clock_freq)
2033 * 1000) / bit_rate);
2034 if (fec_oc_dto_period <= 2)
2035 fec_oc_dto_period = 0;
2037 fec_oc_dto_period -= 2;
2038 fec_oc_tmd_int_upd_rate = 8;
2040 /* (commonAttr->static_clk == false) => dynamic mode */
2041 fec_oc_dto_mode = FEC_OC_DTO_MODE_DYNAMIC__M;
2042 fec_oc_fct_mode = FEC_OC_FCT_MODE__PRE;
2043 fec_oc_tmd_int_upd_rate = 5;
2046 /* Write appropriate registers with requested configuration */
2047 status = write16(state, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len);
2050 status = write16(state, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period);
2053 status = write16(state, FEC_OC_DTO_MODE__A, fec_oc_dto_mode);
2056 status = write16(state, FEC_OC_FCT_MODE__A, fec_oc_fct_mode);
2059 status = write16(state, FEC_OC_MODE__A, fec_oc_reg_mode);
2062 status = write16(state, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode);
2066 /* Rate integration settings */
2067 status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fec_oc_rcn_ctl_rate);
2070 status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A,
2071 fec_oc_tmd_int_upd_rate);
2074 status = write16(state, FEC_OC_TMD_MODE__A, fec_oc_tmd_mode);
2077 pr_err("Error %d on %s\n", status, __func__);
2081 static int mpegts_configure_polarity(struct drxk_state *state)
2083 u16 fec_oc_reg_ipr_invert = 0;
2085 /* Data mask for the output data byte */
2086 u16 invert_data_mask =
2087 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2088 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2089 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2090 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2094 /* Control selective inversion of output bits */
2095 fec_oc_reg_ipr_invert &= (~(invert_data_mask));
2096 if (state->m_invert_data)
2097 fec_oc_reg_ipr_invert |= invert_data_mask;
2098 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2099 if (state->m_invert_err)
2100 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
2101 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2102 if (state->m_invert_str)
2103 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
2104 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2105 if (state->m_invert_val)
2106 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
2107 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2108 if (state->m_invert_clk)
2109 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
2111 return write16(state, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert);
2114 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2116 static int set_agc_rf(struct drxk_state *state,
2117 struct s_cfg_agc *p_agc_cfg, bool is_dtv)
2119 int status = -EINVAL;
2121 struct s_cfg_agc *p_if_agc_settings;
2125 if (p_agc_cfg == NULL)
2128 switch (p_agc_cfg->ctrl_mode) {
2129 case DRXK_AGC_CTRL_AUTO:
2130 /* Enable RF AGC DAC */
2131 status = read16(state, IQM_AF_STDBY__A, &data);
2134 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2135 status = write16(state, IQM_AF_STDBY__A, data);
2138 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2142 /* Enable SCU RF AGC loop */
2143 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2146 if (state->m_rf_agc_pol)
2147 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2149 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2150 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2154 /* Set speed (using complementary reduction value) */
2155 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2159 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2160 data |= (~(p_agc_cfg->speed <<
2161 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2162 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2164 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2169 p_if_agc_settings = &state->m_dvbt_if_agc_cfg;
2170 else if (is_qam(state))
2171 p_if_agc_settings = &state->m_qam_if_agc_cfg;
2173 p_if_agc_settings = &state->m_atv_if_agc_cfg;
2174 if (p_if_agc_settings == NULL) {
2179 /* Set TOP, only if IF-AGC is in AUTO mode */
2180 if (p_if_agc_settings->ctrl_mode == DRXK_AGC_CTRL_AUTO) {
2181 status = write16(state,
2182 SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2188 /* Cut-Off current */
2189 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A,
2190 p_agc_cfg->cut_off_current);
2194 /* Max. output level */
2195 status = write16(state, SCU_RAM_AGC_RF_MAX__A,
2196 p_agc_cfg->max_output_level);
2202 case DRXK_AGC_CTRL_USER:
2203 /* Enable RF AGC DAC */
2204 status = read16(state, IQM_AF_STDBY__A, &data);
2207 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2208 status = write16(state, IQM_AF_STDBY__A, data);
2212 /* Disable SCU RF AGC loop */
2213 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2216 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2217 if (state->m_rf_agc_pol)
2218 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2220 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2221 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2225 /* SCU c.o.c. to 0, enabling full control range */
2226 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2230 /* Write value to output pin */
2231 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A,
2232 p_agc_cfg->output_level);
2237 case DRXK_AGC_CTRL_OFF:
2238 /* Disable RF AGC DAC */
2239 status = read16(state, IQM_AF_STDBY__A, &data);
2242 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2243 status = write16(state, IQM_AF_STDBY__A, data);
2247 /* Disable SCU RF AGC loop */
2248 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2251 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2252 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2263 pr_err("Error %d on %s\n", status, __func__);
2267 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2269 static int set_agc_if(struct drxk_state *state,
2270 struct s_cfg_agc *p_agc_cfg, bool is_dtv)
2274 struct s_cfg_agc *p_rf_agc_settings;
2278 switch (p_agc_cfg->ctrl_mode) {
2279 case DRXK_AGC_CTRL_AUTO:
2281 /* Enable IF AGC DAC */
2282 status = read16(state, IQM_AF_STDBY__A, &data);
2285 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2286 status = write16(state, IQM_AF_STDBY__A, data);
2290 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2294 /* Enable SCU IF AGC loop */
2295 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2298 if (state->m_if_agc_pol)
2299 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2301 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2302 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2306 /* Set speed (using complementary reduction value) */
2307 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2310 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2311 data |= (~(p_agc_cfg->speed <<
2312 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2313 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2315 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2320 p_rf_agc_settings = &state->m_qam_rf_agc_cfg;
2322 p_rf_agc_settings = &state->m_atv_rf_agc_cfg;
2323 if (p_rf_agc_settings == NULL)
2326 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2327 p_rf_agc_settings->top);
2332 case DRXK_AGC_CTRL_USER:
2334 /* Enable IF AGC DAC */
2335 status = read16(state, IQM_AF_STDBY__A, &data);
2338 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2339 status = write16(state, IQM_AF_STDBY__A, data);
2343 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2347 /* Disable SCU IF AGC loop */
2348 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2351 if (state->m_if_agc_pol)
2352 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2354 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2355 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2359 /* Write value to output pin */
2360 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2361 p_agc_cfg->output_level);
2366 case DRXK_AGC_CTRL_OFF:
2368 /* Disable If AGC DAC */
2369 status = read16(state, IQM_AF_STDBY__A, &data);
2372 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2373 status = write16(state, IQM_AF_STDBY__A, data);
2377 /* Disable SCU IF AGC loop */
2378 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2381 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2382 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2386 } /* switch (agcSettingsIf->ctrl_mode) */
2388 /* always set the top to support
2389 configurations without if-loop */
2390 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_cfg->top);
2393 pr_err("Error %d on %s\n", status, __func__);
2397 static int get_qam_signal_to_noise(struct drxk_state *state,
2398 s32 *p_signal_to_noise)
2401 u16 qam_sl_err_power = 0; /* accum. error between
2402 raw and sliced symbols */
2403 u32 qam_sl_sig_power = 0; /* used for MER, depends of
2405 u32 qam_sl_mer = 0; /* QAM MER */
2409 /* MER calculation */
2411 /* get the register value needed for MER */
2412 status = read16(state, QAM_SL_ERR_POWER__A, &qam_sl_err_power);
2414 pr_err("Error %d on %s\n", status, __func__);
2418 switch (state->props.modulation) {
2420 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2423 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2426 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2429 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2433 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2437 if (qam_sl_err_power > 0) {
2438 qam_sl_mer = log10times100(qam_sl_sig_power) -
2439 log10times100((u32) qam_sl_err_power);
2441 *p_signal_to_noise = qam_sl_mer;
2446 static int get_dvbt_signal_to_noise(struct drxk_state *state,
2447 s32 *p_signal_to_noise)
2451 u32 eq_reg_td_sqr_err_i = 0;
2452 u32 eq_reg_td_sqr_err_q = 0;
2453 u16 eq_reg_td_sqr_err_exp = 0;
2454 u16 eq_reg_td_tps_pwr_ofs = 0;
2455 u16 eq_reg_td_req_smb_cnt = 0;
2462 u16 transmission_params = 0;
2466 status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A,
2467 &eq_reg_td_tps_pwr_ofs);
2470 status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A,
2471 &eq_reg_td_req_smb_cnt);
2474 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A,
2475 &eq_reg_td_sqr_err_exp);
2478 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A,
2482 /* Extend SQR_ERR_I operational range */
2483 eq_reg_td_sqr_err_i = (u32) reg_data;
2484 if ((eq_reg_td_sqr_err_exp > 11) &&
2485 (eq_reg_td_sqr_err_i < 0x00000FFFUL)) {
2486 eq_reg_td_sqr_err_i += 0x00010000UL;
2488 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, ®_data);
2491 /* Extend SQR_ERR_Q operational range */
2492 eq_reg_td_sqr_err_q = (u32) reg_data;
2493 if ((eq_reg_td_sqr_err_exp > 11) &&
2494 (eq_reg_td_sqr_err_q < 0x00000FFFUL))
2495 eq_reg_td_sqr_err_q += 0x00010000UL;
2497 status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A,
2498 &transmission_params);
2502 /* Check input data for MER */
2504 /* MER calculation (in 0.1 dB) without math.h */
2505 if ((eq_reg_td_tps_pwr_ofs == 0) || (eq_reg_td_req_smb_cnt == 0))
2507 else if ((eq_reg_td_sqr_err_i + eq_reg_td_sqr_err_q) == 0) {
2508 /* No error at all, this must be the HW reset value
2509 * Apparently no first measurement yet
2513 sqr_err_iq = (eq_reg_td_sqr_err_i + eq_reg_td_sqr_err_q) <<
2514 eq_reg_td_sqr_err_exp;
2515 if ((transmission_params &
2516 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2517 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2522 /* IMER = 100 * log10 (x)
2523 where x = (eq_reg_td_tps_pwr_ofs^2 *
2524 eq_reg_td_req_smb_cnt * tps_cnt)/sqr_err_iq
2527 where a = 100 * log10 (eq_reg_td_tps_pwr_ofs^2)
2528 b = 100 * log10 (eq_reg_td_req_smb_cnt * tps_cnt)
2529 c = 100 * log10 (sqr_err_iq)
2532 /* log(x) x = 9bits * 9bits->18 bits */
2533 a = log10times100(eq_reg_td_tps_pwr_ofs *
2534 eq_reg_td_tps_pwr_ofs);
2535 /* log(x) x = 16bits * 7bits->23 bits */
2536 b = log10times100(eq_reg_td_req_smb_cnt * tps_cnt);
2537 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2538 c = log10times100(sqr_err_iq);
2542 *p_signal_to_noise = i_mer;
2546 pr_err("Error %d on %s\n", status, __func__);
2550 static int get_signal_to_noise(struct drxk_state *state, s32 *p_signal_to_noise)
2554 *p_signal_to_noise = 0;
2555 switch (state->m_operation_mode) {
2557 return get_dvbt_signal_to_noise(state, p_signal_to_noise);
2560 return get_qam_signal_to_noise(state, p_signal_to_noise);
2568 static int get_dvbt_quality(struct drxk_state *state, s32 *p_quality)
2570 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2575 static s32 QE_SN[] = {
2581 108, /* 16-QAM 1/2 */
2582 131, /* 16-QAM 2/3 */
2583 146, /* 16-QAM 3/4 */
2584 156, /* 16-QAM 5/6 */
2585 160, /* 16-QAM 7/8 */
2586 165, /* 64-QAM 1/2 */
2587 187, /* 64-QAM 2/3 */
2588 202, /* 64-QAM 3/4 */
2589 216, /* 64-QAM 5/6 */
2590 225, /* 64-QAM 7/8 */
2596 s32 signal_to_noise = 0;
2597 u16 constellation = 0;
2599 u32 signal_to_noise_rel;
2602 status = get_dvbt_signal_to_noise(state, &signal_to_noise);
2605 status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A,
2609 constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2611 status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A,
2615 code_rate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2617 if (constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2618 code_rate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2620 signal_to_noise_rel = signal_to_noise -
2621 QE_SN[constellation * 5 + code_rate];
2624 if (signal_to_noise_rel < -70)
2626 else if (signal_to_noise_rel < 30)
2627 *p_quality = ((signal_to_noise_rel + 70) *
2630 *p_quality = ber_quality;
2635 static int get_dvbc_quality(struct drxk_state *state, s32 *p_quality)
2643 u32 signal_to_noise = 0;
2644 u32 ber_quality = 100;
2645 u32 signal_to_noise_rel = 0;
2647 status = get_qam_signal_to_noise(state, &signal_to_noise);
2651 switch (state->props.modulation) {
2653 signal_to_noise_rel = signal_to_noise - 200;
2656 signal_to_noise_rel = signal_to_noise - 230;
2657 break; /* Not in NorDig */
2659 signal_to_noise_rel = signal_to_noise - 260;
2662 signal_to_noise_rel = signal_to_noise - 290;
2666 signal_to_noise_rel = signal_to_noise - 320;
2670 if (signal_to_noise_rel < -70)
2672 else if (signal_to_noise_rel < 30)
2673 *p_quality = ((signal_to_noise_rel + 70) *
2676 *p_quality = ber_quality;
2682 static int get_quality(struct drxk_state *state, s32 *p_quality)
2686 switch (state->m_operation_mode) {
2688 return get_dvbt_quality(state, p_quality);
2690 return get_dvbc_quality(state, p_quality);
2699 /* Free data ram in SIO HI */
2700 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2701 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2703 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2704 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2705 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2706 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2708 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2709 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2710 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2712 static int ConfigureI2CBridge(struct drxk_state *state, bool b_enable_bridge)
2714 int status = -EINVAL;
2718 if (state->m_drxk_state == DRXK_UNINITIALIZED)
2720 if (state->m_drxk_state == DRXK_POWERED_DOWN)
2723 if (state->no_i2c_bridge)
2726 status = write16(state, SIO_HI_RA_RAM_PAR_1__A,
2727 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2730 if (b_enable_bridge) {
2731 status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
2732 SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2736 status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
2737 SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2742 status = hi_command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, NULL);
2746 pr_err("Error %d on %s\n", status, __func__);
2750 static int set_pre_saw(struct drxk_state *state,
2751 struct s_cfg_pre_saw *p_pre_saw_cfg)
2753 int status = -EINVAL;
2757 if ((p_pre_saw_cfg == NULL)
2758 || (p_pre_saw_cfg->reference > IQM_AF_PDREF__M))
2761 status = write16(state, IQM_AF_PDREF__A, p_pre_saw_cfg->reference);
2764 pr_err("Error %d on %s\n", status, __func__);
2768 static int bl_direct_cmd(struct drxk_state *state, u32 target_addr,
2769 u16 rom_offset, u16 nr_of_elements, u32 time_out)
2772 u16 offset = (u16) ((target_addr >> 0) & 0x00FFFF);
2773 u16 blockbank = (u16) ((target_addr >> 16) & 0x000FFF);
2779 mutex_lock(&state->mutex);
2780 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2783 status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2786 status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2789 status = write16(state, SIO_BL_SRC_ADDR__A, rom_offset);
2792 status = write16(state, SIO_BL_SRC_LEN__A, nr_of_elements);
2795 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2799 end = jiffies + msecs_to_jiffies(time_out);
2801 status = read16(state, SIO_BL_STATUS__A, &bl_status);
2804 } while ((bl_status == 0x1) && time_is_after_jiffies(end));
2805 if (bl_status == 0x1) {
2806 pr_err("SIO not ready\n");
2812 pr_err("Error %d on %s\n", status, __func__);
2814 mutex_unlock(&state->mutex);
2819 static int adc_sync_measurement(struct drxk_state *state, u16 *count)
2826 /* start measurement */
2827 status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2830 status = write16(state, IQM_AF_START_LOCK__A, 1);
2835 status = read16(state, IQM_AF_PHASE0__A, &data);
2839 *count = *count + 1;
2840 status = read16(state, IQM_AF_PHASE1__A, &data);
2844 *count = *count + 1;
2845 status = read16(state, IQM_AF_PHASE2__A, &data);
2849 *count = *count + 1;
2853 pr_err("Error %d on %s\n", status, __func__);
2857 static int adc_synchronization(struct drxk_state *state)
2864 status = adc_sync_measurement(state, &count);
2869 /* Try sampling on a different edge */
2872 status = read16(state, IQM_AF_CLKNEG__A, &clk_neg);
2875 if ((clk_neg & IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2876 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2877 clk_neg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2879 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2881 clk_neg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2883 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2885 status = write16(state, IQM_AF_CLKNEG__A, clk_neg);
2888 status = adc_sync_measurement(state, &count);
2897 pr_err("Error %d on %s\n", status, __func__);
2901 static int set_frequency_shifter(struct drxk_state *state,
2902 u16 intermediate_freqk_hz,
2903 s32 tuner_freq_offset, bool is_dtv)
2905 bool select_pos_image = false;
2906 u32 rf_freq_residual = tuner_freq_offset;
2907 u32 fm_frequency_shift = 0;
2908 bool tuner_mirror = !state->m_b_mirror_freq_spect;
2913 u32 sampling_frequency = (u32) (state->m_sys_clock_freq / 3);
2914 u32 frequency_shift;
2915 bool image_to_select;
2920 Program frequency shifter
2921 No need to account for mirroring on RF
2924 if ((state->m_operation_mode == OM_QAM_ITU_A) ||
2925 (state->m_operation_mode == OM_QAM_ITU_C) ||
2926 (state->m_operation_mode == OM_DVBT))
2927 select_pos_image = true;
2929 select_pos_image = false;
2932 /* tuner doesn't mirror */
2933 if_freq_actual = intermediate_freqk_hz +
2934 rf_freq_residual + fm_frequency_shift;
2937 if_freq_actual = intermediate_freqk_hz -
2938 rf_freq_residual - fm_frequency_shift;
2939 if (if_freq_actual > sampling_frequency / 2) {
2941 adc_freq = sampling_frequency - if_freq_actual;
2944 /* adc doesn't mirror */
2945 adc_freq = if_freq_actual;
2949 frequency_shift = adc_freq;
2950 image_to_select = state->m_rfmirror ^ tuner_mirror ^
2951 adc_flip ^ select_pos_image;
2952 state->m_iqm_fs_rate_ofs =
2953 Frac28a((frequency_shift), sampling_frequency);
2955 if (image_to_select)
2956 state->m_iqm_fs_rate_ofs = ~state->m_iqm_fs_rate_ofs + 1;
2958 /* Program frequency shifter with tuner offset compensation */
2959 /* frequency_shift += tuner_freq_offset; TODO */
2960 status = write32(state, IQM_FS_RATE_OFS_LO__A,
2961 state->m_iqm_fs_rate_ofs);
2963 pr_err("Error %d on %s\n", status, __func__);
2967 static int init_agc(struct drxk_state *state, bool is_dtv)
2970 u16 ingain_tgt_min = 0;
2971 u16 ingain_tgt_max = 0;
2973 u16 clp_sum_min = 0;
2975 u16 sns_sum_min = 0;
2976 u16 sns_sum_max = 0;
2977 u16 clp_sum_max = 0;
2979 u16 ki_innergain_min = 0;
2980 u16 if_iaccu_hi_tgt = 0;
2981 u16 if_iaccu_hi_tgt_min = 0;
2982 u16 if_iaccu_hi_tgt_max = 0;
2984 u16 fast_clp_ctrl_delay = 0;
2985 u16 clp_ctrl_mode = 0;
2990 /* Common settings */
2992 if_iaccu_hi_tgt_min = 2047;
2996 /* AGCInit() not available for DVBT; init done in microcode */
2997 if (!is_qam(state)) {
2998 pr_err("%s: mode %d is not DVB-C\n",
2999 __func__, state->m_operation_mode);
3003 /* FIXME: Analog TV AGC require different settings */
3005 /* Standard specific settings */
3007 clp_dir_to = (u16) -9;
3010 sns_dir_to = (u16) -9;
3011 ki_innergain_min = (u16) -1030;
3012 if_iaccu_hi_tgt_max = 0x2380;
3013 if_iaccu_hi_tgt = 0x2380;
3014 ingain_tgt_min = 0x0511;
3015 ingain_tgt = 0x0511;
3016 ingain_tgt_max = 5119;
3017 fast_clp_ctrl_delay = state->m_qam_if_agc_cfg.fast_clip_ctrl_delay;
3019 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A,
3020 fast_clp_ctrl_delay);
3024 status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode);
3027 status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingain_tgt);
3030 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingain_tgt_min);
3033 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max);
3036 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A,
3037 if_iaccu_hi_tgt_min);
3040 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
3041 if_iaccu_hi_tgt_max);
3044 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3047 status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3050 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3053 status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3056 status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max);
3059 status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max);
3063 status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A,
3067 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A,
3071 status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clp_cyclen);
3075 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3078 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3081 status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3085 status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3088 status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clp_sum_min);
3091 status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, sns_sum_min);
3094 status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to);
3097 status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to);
3100 status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3103 status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3106 status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3109 status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3112 status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3115 status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3118 status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3121 status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3124 status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3127 status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3130 status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3133 status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3136 status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3139 status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3143 /* Initialize inner-loop KI gain factors */
3144 status = read16(state, SCU_RAM_AGC_KI__A, &data);
3149 data &= ~SCU_RAM_AGC_KI_RF__M;
3150 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3151 data &= ~SCU_RAM_AGC_KI_IF__M;
3152 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3154 status = write16(state, SCU_RAM_AGC_KI__A, data);
3157 pr_err("Error %d on %s\n", status, __func__);
3161 static int dvbtqam_get_acc_pkt_err(struct drxk_state *state, u16 *packet_err)
3166 if (packet_err == NULL)
3167 status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3169 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A,
3172 pr_err("Error %d on %s\n", status, __func__);
3176 static int dvbt_sc_command(struct drxk_state *state,
3177 u16 cmd, u16 subcmd,
3178 u16 param0, u16 param1, u16 param2,
3179 u16 param3, u16 param4)
3188 status = read16(state, OFDM_SC_COMM_EXEC__A, &sc_exec);
3190 /* SC is not running */
3196 /* Wait until sc is ready to receive command */
3199 usleep_range(1000, 2000);
3200 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &cur_cmd);
3202 } while ((cur_cmd != 0) && (retry_cnt < DRXK_MAX_RETRIES));
3203 if (retry_cnt >= DRXK_MAX_RETRIES && (status < 0))
3206 /* Write sub-command */
3208 /* All commands using sub-cmd */
3209 case OFDM_SC_RA_RAM_CMD_PROC_START:
3210 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3211 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3212 status = write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3221 /* Write needed parameters and the command */
3224 /* All commands using 5 parameters */
3225 /* All commands using 4 parameters */
3226 /* All commands using 3 parameters */
3227 /* All commands using 2 parameters */
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_PARAM1__A, param1);
3232 fallthrough; /* All commands using 1 parameters */
3233 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3234 case OFDM_SC_RA_RAM_CMD_USER_IO:
3235 status |= write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3236 fallthrough; /* All commands using 0 parameters */
3237 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3238 case OFDM_SC_RA_RAM_CMD_NULL:
3240 status |= write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3243 /* Unknown command */
3249 /* Wait until sc is ready processing command */
3252 usleep_range(1000, 2000);
3253 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &cur_cmd);
3255 } while ((cur_cmd != 0) && (retry_cnt < DRXK_MAX_RETRIES));
3256 if (retry_cnt >= DRXK_MAX_RETRIES && (status < 0))
3259 /* Check for illegal cmd */
3260 status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &err_code);
3261 if (err_code == 0xFFFF) {
3262 /* illegal command */
3268 /* Retrieve results parameters from SC */
3270 /* All commands yielding 5 results */
3271 /* All commands yielding 4 results */
3272 /* All commands yielding 3 results */
3273 /* All commands yielding 2 results */
3274 /* All commands yielding 1 result */
3275 case OFDM_SC_RA_RAM_CMD_USER_IO:
3276 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3277 status = read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3279 /* All commands yielding 0 results */
3280 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3281 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3282 case OFDM_SC_RA_RAM_CMD_PROC_START:
3283 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3284 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3285 case OFDM_SC_RA_RAM_CMD_NULL:
3288 /* Unknown command */
3291 } /* switch (cmd->cmd) */
3294 pr_err("Error %d on %s\n", status, __func__);
3298 static int power_up_dvbt(struct drxk_state *state)
3300 enum drx_power_mode power_mode = DRX_POWER_UP;
3304 status = ctrl_power_mode(state, &power_mode);
3306 pr_err("Error %d on %s\n", status, __func__);
3310 static int dvbt_ctrl_set_inc_enable(struct drxk_state *state, bool *enabled)
3316 status = write16(state, IQM_CF_BYPASSDET__A, 0);
3318 status = write16(state, IQM_CF_BYPASSDET__A, 1);
3320 pr_err("Error %d on %s\n", status, __func__);
3324 #define DEFAULT_FR_THRES_8K 4000
3325 static int dvbt_ctrl_set_fr_enable(struct drxk_state *state, bool *enabled)
3332 /* write mask to 1 */
3333 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3334 DEFAULT_FR_THRES_8K);
3336 /* write mask to 0 */
3337 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3340 pr_err("Error %d on %s\n", status, __func__);
3345 static int dvbt_ctrl_set_echo_threshold(struct drxk_state *state,
3346 struct drxk_cfg_dvbt_echo_thres_t *echo_thres)
3352 status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3356 switch (echo_thres->fft_mode) {
3357 case DRX_FFTMODE_2K:
3358 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3359 data |= ((echo_thres->threshold <<
3360 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3361 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3363 case DRX_FFTMODE_8K:
3364 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3365 data |= ((echo_thres->threshold <<
3366 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3367 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3373 status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3376 pr_err("Error %d on %s\n", status, __func__);
3380 static int dvbt_ctrl_set_sqi_speed(struct drxk_state *state,
3381 enum drxk_cfg_dvbt_sqi_speed *speed)
3383 int status = -EINVAL;
3388 case DRXK_DVBT_SQI_SPEED_FAST:
3389 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3390 case DRXK_DVBT_SQI_SPEED_SLOW:
3395 status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3399 pr_err("Error %d on %s\n", status, __func__);
3403 /*============================================================================*/
3406 * \brief Activate DVBT specific presets
3407 * \param demod instance of demodulator.
3408 * \return DRXStatus_t.
3410 * Called in DVBTSetStandard
3413 static int dvbt_activate_presets(struct drxk_state *state)
3416 bool setincenable = false;
3417 bool setfrenable = true;
3419 struct drxk_cfg_dvbt_echo_thres_t echo_thres2k = { 0, DRX_FFTMODE_2K };
3420 struct drxk_cfg_dvbt_echo_thres_t echo_thres8k = { 0, DRX_FFTMODE_8K };
3423 status = dvbt_ctrl_set_inc_enable(state, &setincenable);
3426 status = dvbt_ctrl_set_fr_enable(state, &setfrenable);
3429 status = dvbt_ctrl_set_echo_threshold(state, &echo_thres2k);
3432 status = dvbt_ctrl_set_echo_threshold(state, &echo_thres8k);
3435 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A,
3436 state->m_dvbt_if_agc_cfg.ingain_tgt_max);
3439 pr_err("Error %d on %s\n", status, __func__);
3443 /*============================================================================*/
3446 * \brief Initialize channelswitch-independent settings for DVBT.
3447 * \param demod instance of demodulator.
3448 * \return DRXStatus_t.
3450 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3451 * the DVB-T taps from the drxk_filters.h are used.
3453 static int set_dvbt_standard(struct drxk_state *state,
3454 enum operation_mode o_mode)
3462 power_up_dvbt(state);
3463 /* added antenna switch */
3464 switch_antenna_to_dvbt(state);
3465 /* send OFDM reset command */
3466 status = scu_command(state,
3467 SCU_RAM_COMMAND_STANDARD_OFDM
3468 | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
3469 0, NULL, 1, &cmd_result);
3473 /* send OFDM setenv command */
3474 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
3475 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV,
3476 0, NULL, 1, &cmd_result);
3480 /* reset datapath for OFDM, processors first */
3481 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3484 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3487 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3492 /* synchronize on ofdstate->m_festart */
3493 status = write16(state, IQM_AF_UPD_SEL__A, 1);
3496 /* window size for clipping ADC detection */
3497 status = write16(state, IQM_AF_CLP_LEN__A, 0);
3500 /* window size for sense pre-SAW detection */
3501 status = write16(state, IQM_AF_SNS_LEN__A, 0);
3504 /* sense threshold for sense pre-SAW detection */
3505 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3508 status = set_iqm_af(state, true);
3512 status = write16(state, IQM_AF_AGC_RF__A, 0);
3516 /* Impulse noise cruncher setup */
3517 status = write16(state, IQM_AF_INC_LCT__A, 0); /* crunch in IQM_CF */
3520 status = write16(state, IQM_CF_DET_LCT__A, 0); /* detect in IQM_CF */
3523 status = write16(state, IQM_CF_WND_LEN__A, 3); /* peak detector window length */
3527 status = write16(state, IQM_RC_STRETCH__A, 16);
3530 status = write16(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3533 status = write16(state, IQM_CF_DS_ENA__A, 0x4); /* decimate output 2 */
3536 status = write16(state, IQM_CF_SCALE__A, 1600);
3539 status = write16(state, IQM_CF_SCALE_SH__A, 0);
3543 /* virtual clipping threshold for clipping ADC detection */
3544 status = write16(state, IQM_AF_CLP_TH__A, 448);
3547 status = write16(state, IQM_CF_DATATH__A, 495); /* crunching threshold */
3551 status = bl_chain_cmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT,
3552 DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3556 status = write16(state, IQM_CF_PKDTH__A, 2); /* peak detector threshold */
3559 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3562 /* enable power measurement interrupt */
3563 status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3566 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3570 /* IQM will not be reset from here, sync ADC and update/init AGC */
3571 status = adc_synchronization(state);
3574 status = set_pre_saw(state, &state->m_dvbt_pre_saw_cfg);
3578 /* Halt SCU to enable safe non-atomic accesses */
3579 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3583 status = set_agc_rf(state, &state->m_dvbt_rf_agc_cfg, true);
3586 status = set_agc_if(state, &state->m_dvbt_if_agc_cfg, true);
3590 /* Set Noise Estimation notch width and enable DC fix */
3591 status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3594 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3595 status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3599 /* Activate SCU to enable SCU commands */
3600 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3604 if (!state->m_drxk_a3_rom_code) {
3605 /* AGCInit() is not done for DVBT, so set agcfast_clip_ctrl_delay */
3606 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A,
3607 state->m_dvbt_if_agc_cfg.fast_clip_ctrl_delay);
3613 #ifdef COMPILE_FOR_NONRT
3614 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3617 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3623 status = write16(state, FEC_DI_INPUT_CTL__A, 1); /* OFDM input */
3628 #ifdef COMPILE_FOR_NONRT
3629 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3633 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3637 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3641 /* Setup MPEG bus */
3642 status = mpegts_dto_setup(state, OM_DVBT);
3645 /* Set DVBT Presets */
3646 status = dvbt_activate_presets(state);
3652 pr_err("Error %d on %s\n", status, __func__);
3656 /*============================================================================*/
3658 * \brief start dvbt demodulating for channel.
3659 * \param demod instance of demodulator.
3660 * \return DRXStatus_t.
3662 static int dvbt_start(struct drxk_state *state)
3666 /* drxk_ofdm_sc_cmd_t scCmd; */
3669 /* start correct processes to get in lock */
3670 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3671 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3672 status = dvbt_sc_command(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0,
3673 OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1,
3678 status = mpegts_start(state);
3681 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3686 pr_err("Error %d on %s\n", status, __func__);
3691 /*============================================================================*/
3694 * \brief Set up dvbt demodulator for channel.
3695 * \param demod instance of demodulator.
3696 * \return DRXStatus_t.
3697 * // original DVBTSetChannel()
3699 static int set_dvbt(struct drxk_state *state, u16 intermediate_freqk_hz,
3700 s32 tuner_freq_offset)
3703 u16 transmission_params = 0;
3704 u32 iqm_rc_rate_ofs = 0;
3709 dprintk(1, "IF =%d, TFO = %d\n",
3710 intermediate_freqk_hz, tuner_freq_offset);
3712 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
3713 | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
3714 0, NULL, 1, &cmd_result);
3718 /* Halt SCU to enable safe non-atomic accesses */
3719 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3723 /* Stop processors */
3724 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3727 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3731 /* Mandatory fix, always stop CP, required to set spl offset back to
3732 hardware default (is set to 0 by ucode during pilot detection */
3733 status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3737 /*== Write channel settings to device ================================*/
3740 switch (state->props.transmission_mode) {
3741 case TRANSMISSION_MODE_AUTO:
3742 case TRANSMISSION_MODE_8K:
3744 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3746 case TRANSMISSION_MODE_2K:
3747 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3752 switch (state->props.guard_interval) {
3754 case GUARD_INTERVAL_AUTO: /* try first guess DRX_GUARD_1DIV4 */
3755 case GUARD_INTERVAL_1_4:
3756 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3758 case GUARD_INTERVAL_1_32:
3759 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3761 case GUARD_INTERVAL_1_16:
3762 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3764 case GUARD_INTERVAL_1_8:
3765 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3770 switch (state->props.hierarchy) {
3771 case HIERARCHY_AUTO:
3772 case HIERARCHY_NONE:
3773 default: /* try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3775 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3778 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3781 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3787 switch (state->props.modulation) {
3789 default: /* try first guess DRX_CONSTELLATION_QAM64 */
3791 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3794 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3797 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3801 /* No hierarchical channels support in BDA */
3802 /* Priority (only for hierarchical channels) */
3803 switch (channel->priority) {
3804 case DRX_PRIORITY_LOW:
3805 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3806 WR16(dev_addr, OFDM_EC_SB_PRIOR__A,
3807 OFDM_EC_SB_PRIOR_LO);
3809 case DRX_PRIORITY_HIGH:
3810 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3811 WR16(dev_addr, OFDM_EC_SB_PRIOR__A,
3812 OFDM_EC_SB_PRIOR_HI));
3814 case DRX_PRIORITY_UNKNOWN:
3820 /* Set Priority high */
3821 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3822 status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3828 switch (state->props.code_rate_HP) {
3830 default: /* try first guess DRX_CODERATE_2DIV3 */
3832 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3835 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3838 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3841 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3844 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3849 * SAW filter selection: normally not necessary, but if wanted
3850 * the application can select a SAW filter via the driver by
3854 /* First determine real bandwidth (Hz) */
3855 /* Also set delay for impulse noise cruncher */
3857 * Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is
3858 * changed by SC for fix for some 8K,1/8 guard but is restored by
3859 * InitEC and ResetEC functions
3861 switch (state->props.bandwidth_hz) {
3863 state->props.bandwidth_hz = 8000000;
3866 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3867 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3871 /* cochannel protection for PAL 8 MHz */
3872 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3876 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3880 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3884 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3890 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3891 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3895 /* cochannel protection for PAL 7 MHz */
3896 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3900 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3904 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3908 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3914 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3915 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3919 /* cochannel protection for NTSC 6 MHz */
3920 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3924 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3928 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3932 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3942 if (iqm_rc_rate_ofs == 0) {
3943 /* Now compute IQM_RC_RATE_OFS
3944 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
3946 ((SysFreq / BandWidth) * (2^21)) - (2^23)
3948 /* (SysFreq / BandWidth) * (2^28) */
3950 * assert (MAX(sysClk)/MIN(bandwidth) < 16)
3951 * => assert(MAX(sysClk) < 16*MIN(bandwidth))
3952 * => assert(109714272 > 48000000) = true
3953 * so Frac 28 can be used
3955 iqm_rc_rate_ofs = Frac28a((u32)
3956 ((state->m_sys_clock_freq *
3957 1000) / 3), bandwidth);
3958 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
3959 if ((iqm_rc_rate_ofs & 0x7fL) >= 0x40)
3960 iqm_rc_rate_ofs += 0x80L;
3961 iqm_rc_rate_ofs = iqm_rc_rate_ofs >> 7;
3962 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
3963 iqm_rc_rate_ofs = iqm_rc_rate_ofs - (1 << 23);
3967 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
3968 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
3969 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate_ofs);
3973 /* Bandwidth setting done */
3976 status = dvbt_set_frequency_shift(demod, channel, tuner_offset);
3980 status = set_frequency_shifter(state, intermediate_freqk_hz,
3981 tuner_freq_offset, true);
3985 /*== start SC, write channel settings to SC ==========================*/
3987 /* Activate SCU to enable SCU commands */
3988 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3992 /* Enable SC after setting all other parameters */
3993 status = write16(state, OFDM_SC_COMM_STATE__A, 0);
3996 status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4001 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
4002 | SCU_RAM_COMMAND_CMD_DEMOD_START,
4003 0, NULL, 1, &cmd_result);
4007 /* Write SC parameter registers, set all AUTO flags in operation mode */
4008 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4009 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4010 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4011 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4012 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4013 status = dvbt_sc_command(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4014 0, transmission_params, param1, 0, 0, 0);
4018 if (!state->m_drxk_a3_rom_code)
4019 status = dvbt_ctrl_set_sqi_speed(state, &state->m_sqi_speed);
4022 pr_err("Error %d on %s\n", status, __func__);
4028 /*============================================================================*/
4031 * \brief Retrieve lock status .
4032 * \param demod Pointer to demodulator instance.
4033 * \param lockStat Pointer to lock status structure.
4034 * \return DRXStatus_t.
4037 static int get_dvbt_lock_status(struct drxk_state *state, u32 *p_lock_status)
4040 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4041 OFDM_SC_RA_RAM_LOCK_FEC__M);
4042 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4043 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4045 u16 sc_ra_ram_lock = 0;
4046 u16 sc_comm_exec = 0;
4050 *p_lock_status = NOT_LOCKED;
4052 /* Check if SC is running */
4053 status = read16(state, OFDM_SC_COMM_EXEC__A, &sc_comm_exec);
4056 if (sc_comm_exec == OFDM_SC_COMM_EXEC_STOP)
4059 status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &sc_ra_ram_lock);
4063 if ((sc_ra_ram_lock & mpeg_lock_mask) == mpeg_lock_mask)
4064 *p_lock_status = MPEG_LOCK;
4065 else if ((sc_ra_ram_lock & fec_lock_mask) == fec_lock_mask)
4066 *p_lock_status = FEC_LOCK;
4067 else if ((sc_ra_ram_lock & demod_lock_mask) == demod_lock_mask)
4068 *p_lock_status = DEMOD_LOCK;
4069 else if (sc_ra_ram_lock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4070 *p_lock_status = NEVER_LOCK;
4073 pr_err("Error %d on %s\n", status, __func__);
4078 static int power_up_qam(struct drxk_state *state)
4080 enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
4084 status = ctrl_power_mode(state, &power_mode);
4086 pr_err("Error %d on %s\n", status, __func__);
4092 /* Power Down QAM */
4093 static int power_down_qam(struct drxk_state *state)
4100 status = read16(state, SCU_COMM_EXEC__A, &data);
4103 if (data == SCU_COMM_EXEC_ACTIVE) {
4108 /* stop all comstate->m_exec */
4109 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4112 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
4113 | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
4114 0, NULL, 1, &cmd_result);
4119 status = set_iqm_af(state, false);
4123 pr_err("Error %d on %s\n", status, __func__);
4128 /*============================================================================*/
4131 * \brief Setup of the QAM Measurement intervals for signal quality
4132 * \param demod instance of demod.
4133 * \param modulation current modulation.
4134 * \return DRXStatus_t.
4137 * Take into account that for certain settings the errorcounters can overflow.
4138 * The implementation does not check this.
4141 static int set_qam_measurement(struct drxk_state *state,
4142 enum e_drxk_constellation modulation,
4145 u32 fec_bits_desired = 0; /* BER accounting period */
4146 u32 fec_rs_period_total = 0; /* Total period */
4147 u16 fec_rs_prescale = 0; /* ReedSolomon Measurement Prescale */
4148 u16 fec_rs_period = 0; /* Value for corresponding I2C register */
4153 fec_rs_prescale = 1;
4154 /* fec_bits_desired = symbol_rate [kHz] *
4160 switch (modulation) {
4161 case DRX_CONSTELLATION_QAM16:
4162 fec_bits_desired = 4 * symbol_rate;
4164 case DRX_CONSTELLATION_QAM32:
4165 fec_bits_desired = 5 * symbol_rate;
4167 case DRX_CONSTELLATION_QAM64:
4168 fec_bits_desired = 6 * symbol_rate;
4170 case DRX_CONSTELLATION_QAM128:
4171 fec_bits_desired = 7 * symbol_rate;
4173 case DRX_CONSTELLATION_QAM256:
4174 fec_bits_desired = 8 * symbol_rate;
4182 fec_bits_desired /= 1000; /* symbol_rate [Hz] -> symbol_rate [kHz] */
4183 fec_bits_desired *= 500; /* meas. period [ms] */
4185 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4186 /* fec_rs_period_total = fec_bits_desired / 1632 */
4187 fec_rs_period_total = (fec_bits_desired / 1632UL) + 1; /* roughly ceil */
4189 /* fec_rs_period_total = fec_rs_prescale * fec_rs_period */
4190 fec_rs_prescale = 1 + (u16) (fec_rs_period_total >> 16);
4191 if (fec_rs_prescale == 0) {
4192 /* Divide by zero (though impossible) */
4198 ((u16) fec_rs_period_total +
4199 (fec_rs_prescale >> 1)) / fec_rs_prescale;
4201 /* write corresponding registers */
4202 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fec_rs_period);
4205 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A,
4209 status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fec_rs_period);
4212 pr_err("Error %d on %s\n", status, __func__);
4216 static int set_qam16(struct drxk_state *state)
4221 /* QAM Equalizer Setup */
4223 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4226 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4229 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4232 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4235 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4238 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4241 /* Decision Feedback Equalizer */
4242 status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4245 status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4248 status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4251 status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4254 status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4257 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4261 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4264 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4267 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4271 /* QAM Slicer Settings */
4272 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4273 DRXK_QAM_SL_SIG_POWER_QAM16);
4277 /* QAM Loop Controller Coeficients */
4278 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4281 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4284 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4287 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4290 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4293 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4296 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4299 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4303 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4306 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4309 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4312 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4315 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4318 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4321 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4324 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4327 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4330 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4333 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4336 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4341 /* QAM State Machine (FSM) Thresholds */
4343 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4346 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4349 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4352 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4355 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4358 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4362 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4365 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4368 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4373 /* QAM FSM Tracking Parameters */
4375 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4378 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4381 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4384 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4387 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4390 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4393 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4399 pr_err("Error %d on %s\n", status, __func__);
4403 /*============================================================================*/
4406 * \brief QAM32 specific setup
4407 * \param demod instance of demod.
4408 * \return DRXStatus_t.
4410 static int set_qam32(struct drxk_state *state)
4416 /* QAM Equalizer Setup */
4418 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4421 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4424 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4427 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4430 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4433 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4437 /* Decision Feedback Equalizer */
4438 status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4441 status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4444 status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4447 status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4450 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4453 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4457 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4460 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4463 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4467 /* QAM Slicer Settings */
4469 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4470 DRXK_QAM_SL_SIG_POWER_QAM32);
4475 /* QAM Loop Controller Coeficients */
4477 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4480 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4483 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4486 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4489 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4492 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4495 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4498 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4502 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4505 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4508 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4511 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4514 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4517 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4520 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4523 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4526 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4529 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4532 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4535 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4540 /* QAM State Machine (FSM) Thresholds */
4542 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4545 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4548 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4551 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4554 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4557 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4561 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4564 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4567 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4572 /* QAM FSM Tracking Parameters */
4574 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4577 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4580 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4583 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4586 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4589 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4592 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4595 pr_err("Error %d on %s\n", status, __func__);
4599 /*============================================================================*/
4602 * \brief QAM64 specific setup
4603 * \param demod instance of demod.
4604 * \return DRXStatus_t.
4606 static int set_qam64(struct drxk_state *state)
4611 /* QAM Equalizer Setup */
4613 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4616 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4619 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4622 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4625 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4628 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4632 /* Decision Feedback Equalizer */
4633 status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4636 status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4639 status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4642 status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4645 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4648 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4652 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4655 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4658 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4662 /* QAM Slicer Settings */
4663 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4664 DRXK_QAM_SL_SIG_POWER_QAM64);
4669 /* QAM Loop Controller Coeficients */
4671 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4674 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4677 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4680 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4683 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4686 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4689 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4692 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4696 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4699 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4702 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4705 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4708 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4711 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4714 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4717 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4720 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4723 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4726 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4729 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4734 /* QAM State Machine (FSM) Thresholds */
4736 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4739 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4742 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4745 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4748 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4751 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4755 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4758 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4761 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4766 /* QAM FSM Tracking Parameters */
4768 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4771 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4774 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4777 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4780 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4783 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4786 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4789 pr_err("Error %d on %s\n", status, __func__);
4794 /*============================================================================*/
4797 * \brief QAM128 specific setup
4798 * \param demod: instance of demod.
4799 * \return DRXStatus_t.
4801 static int set_qam128(struct drxk_state *state)
4806 /* QAM Equalizer Setup */
4808 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4811 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4814 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4817 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4820 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4823 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4827 /* Decision Feedback Equalizer */
4828 status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4831 status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4834 status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4837 status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4840 status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4843 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4847 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4850 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4853 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4858 /* QAM Slicer Settings */
4860 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4861 DRXK_QAM_SL_SIG_POWER_QAM128);
4866 /* QAM Loop Controller Coeficients */
4868 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4871 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4874 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4877 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4880 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4883 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4886 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4889 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4893 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4896 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4899 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4902 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4905 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4908 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4911 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4914 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4917 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4920 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4923 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4926 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4931 /* QAM State Machine (FSM) Thresholds */
4933 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4936 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4939 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4942 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4945 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
4948 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4952 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4955 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
4959 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
4963 /* QAM FSM Tracking Parameters */
4965 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
4968 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
4971 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
4974 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
4977 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
4980 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
4983 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
4986 pr_err("Error %d on %s\n", status, __func__);
4991 /*============================================================================*/
4994 * \brief QAM256 specific setup
4995 * \param demod: instance of demod.
4996 * \return DRXStatus_t.
4998 static int set_qam256(struct drxk_state *state)
5003 /* QAM Equalizer Setup */
5005 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5008 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5011 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5014 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5017 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5020 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5024 /* Decision Feedback Equalizer */
5025 status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5028 status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5031 status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5034 status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5037 status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5040 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5044 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5047 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5050 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5054 /* QAM Slicer Settings */
5056 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
5057 DRXK_QAM_SL_SIG_POWER_QAM256);
5062 /* QAM Loop Controller Coeficients */
5064 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5067 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5070 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5073 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5076 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5079 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5082 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5085 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5089 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5092 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5095 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5098 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5101 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5104 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5107 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5110 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5113 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5116 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5119 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5122 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5127 /* QAM State Machine (FSM) Thresholds */
5129 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5132 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5135 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5138 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5141 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5144 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5148 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5151 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5154 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5159 /* QAM FSM Tracking Parameters */
5161 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5164 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5167 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5170 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5173 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5176 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5179 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5182 pr_err("Error %d on %s\n", status, __func__);
5187 /*============================================================================*/
5189 * \brief Reset QAM block.
5190 * \param demod: instance of demod.
5191 * \param channel: pointer to channel data.
5192 * \return DRXStatus_t.
5194 static int qam_reset_qam(struct drxk_state *state)
5200 /* Stop QAM comstate->m_exec */
5201 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5205 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
5206 | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
5207 0, NULL, 1, &cmd_result);
5210 pr_err("Error %d on %s\n", status, __func__);
5214 /*============================================================================*/
5217 * \brief Set QAM symbolrate.
5218 * \param demod: instance of demod.
5219 * \param channel: pointer to channel data.
5220 * \return DRXStatus_t.
5222 static int qam_set_symbolrate(struct drxk_state *state)
5224 u32 adc_frequency = 0;
5226 u32 iqm_rc_rate = 0;
5228 u32 lc_symb_rate = 0;
5232 /* Select & calculate correct IQM rate */
5233 adc_frequency = (state->m_sys_clock_freq * 1000) / 3;
5235 if (state->props.symbol_rate <= 1188750)
5237 else if (state->props.symbol_rate <= 2377500)
5239 else if (state->props.symbol_rate <= 4755000)
5241 status = write16(state, IQM_FD_RATESEL__A, ratesel);
5246 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5248 symb_freq = state->props.symbol_rate * (1 << ratesel);
5249 if (symb_freq == 0) {
5250 /* Divide by zero */
5254 iqm_rc_rate = (adc_frequency / symb_freq) * (1 << 21) +
5255 (Frac28a((adc_frequency % symb_freq), symb_freq) >> 7) -
5257 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate);
5260 state->m_iqm_rc_rate = iqm_rc_rate;
5262 LcSymbFreq = round (.125 * symbolrate / adc_freq * (1<<15))
5264 symb_freq = state->props.symbol_rate;
5265 if (adc_frequency == 0) {
5266 /* Divide by zero */
5270 lc_symb_rate = (symb_freq / adc_frequency) * (1 << 12) +
5271 (Frac28a((symb_freq % adc_frequency), adc_frequency) >>
5273 if (lc_symb_rate > 511)
5275 status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lc_symb_rate);
5279 pr_err("Error %d on %s\n", status, __func__);
5283 /*============================================================================*/
5286 * \brief Get QAM lock status.
5287 * \param demod: instance of demod.
5288 * \param channel: pointer to channel data.
5289 * \return DRXStatus_t.
5292 static int get_qam_lock_status(struct drxk_state *state, u32 *p_lock_status)
5295 u16 result[2] = { 0, 0 };
5298 *p_lock_status = NOT_LOCKED;
5299 status = scu_command(state,
5300 SCU_RAM_COMMAND_STANDARD_QAM |
5301 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5304 pr_err("Error %d on %s\n", status, __func__);
5306 if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5307 /* 0x0000 NOT LOCKED */
5308 } else if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5309 /* 0x4000 DEMOD LOCKED */
5310 *p_lock_status = DEMOD_LOCK;
5311 } else if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5312 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5313 *p_lock_status = MPEG_LOCK;
5315 /* 0xC000 NEVER LOCKED */
5316 /* (system will never be able to lock to the signal) */
5318 * TODO: check this, intermediate & standard specific lock
5319 * states are not taken into account here
5321 *p_lock_status = NEVER_LOCK;
5326 #define QAM_MIRROR__M 0x03
5327 #define QAM_MIRROR_NORMAL 0x00
5328 #define QAM_MIRRORED 0x01
5329 #define QAM_MIRROR_AUTO_ON 0x02
5330 #define QAM_LOCKRANGE__M 0x10
5331 #define QAM_LOCKRANGE_NORMAL 0x10
5333 static int qam_demodulator_command(struct drxk_state *state,
5334 int number_of_parameters)
5338 u16 set_param_parameters[4] = { 0, 0, 0, 0 };
5340 set_param_parameters[0] = state->m_constellation; /* modulation */
5341 set_param_parameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5343 if (number_of_parameters == 2) {
5344 u16 set_env_parameters[1] = { 0 };
5346 if (state->m_operation_mode == OM_QAM_ITU_C)
5347 set_env_parameters[0] = QAM_TOP_ANNEX_C;
5349 set_env_parameters[0] = QAM_TOP_ANNEX_A;
5351 status = scu_command(state,
5352 SCU_RAM_COMMAND_STANDARD_QAM
5353 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV,
5354 1, set_env_parameters, 1, &cmd_result);
5358 status = scu_command(state,
5359 SCU_RAM_COMMAND_STANDARD_QAM
5360 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
5361 number_of_parameters, set_param_parameters,
5363 } else if (number_of_parameters == 4) {
5364 if (state->m_operation_mode == OM_QAM_ITU_C)
5365 set_param_parameters[2] = QAM_TOP_ANNEX_C;
5367 set_param_parameters[2] = QAM_TOP_ANNEX_A;
5369 set_param_parameters[3] |= (QAM_MIRROR_AUTO_ON);
5370 /* Env parameters */
5371 /* check for LOCKRANGE Extended */
5372 /* set_param_parameters[3] |= QAM_LOCKRANGE_NORMAL; */
5374 status = scu_command(state,
5375 SCU_RAM_COMMAND_STANDARD_QAM
5376 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
5377 number_of_parameters, set_param_parameters,
5380 pr_warn("Unknown QAM demodulator parameter count %d\n",
5381 number_of_parameters);
5387 pr_warn("Warning %d on %s\n", status, __func__);
5391 static int set_qam(struct drxk_state *state, u16 intermediate_freqk_hz,
5392 s32 tuner_freq_offset)
5396 int qam_demod_param_count = state->qam_demod_parameter_count;
5400 * STEP 1: reset demodulator
5401 * resets FEC DI and FEC RS
5403 * resets SCU variables
5405 status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5408 status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5411 status = qam_reset_qam(state);
5416 * STEP 2: configure demodulator
5417 * -set params; resets IQM,QAM,FEC HW; initializes some
5420 status = qam_set_symbolrate(state);
5425 switch (state->props.modulation) {
5427 state->m_constellation = DRX_CONSTELLATION_QAM256;
5431 state->m_constellation = DRX_CONSTELLATION_QAM64;
5434 state->m_constellation = DRX_CONSTELLATION_QAM16;
5437 state->m_constellation = DRX_CONSTELLATION_QAM32;
5440 state->m_constellation = DRX_CONSTELLATION_QAM128;
5449 /* Use the 4-parameter if it's requested or we're probing for
5450 * the correct command. */
5451 if (state->qam_demod_parameter_count == 4
5452 || !state->qam_demod_parameter_count) {
5453 qam_demod_param_count = 4;
5454 status = qam_demodulator_command(state, qam_demod_param_count);
5457 /* Use the 2-parameter command if it was requested or if we're
5458 * probing for the correct command and the 4-parameter command
5460 if (state->qam_demod_parameter_count == 2
5461 || (!state->qam_demod_parameter_count && status < 0)) {
5462 qam_demod_param_count = 2;
5463 status = qam_demodulator_command(state, qam_demod_param_count);
5467 dprintk(1, "Could not set demodulator parameters.\n");
5469 "Make sure qam_demod_parameter_count (%d) is correct for your firmware (%s).\n",
5470 state->qam_demod_parameter_count,
5471 state->microcode_name);
5473 } else if (!state->qam_demod_parameter_count) {
5475 "Auto-probing the QAM command parameters was successful - using %d parameters.\n",
5476 qam_demod_param_count);
5479 * One of our commands was successful. We don't need to
5480 * auto-probe anymore, now that we got the correct command.
5482 state->qam_demod_parameter_count = qam_demod_param_count;
5486 * STEP 3: enable the system in a mode where the ADC provides valid
5487 * signal setup modulation independent registers
5490 status = set_frequency(channel, tuner_freq_offset));
5494 status = set_frequency_shifter(state, intermediate_freqk_hz,
5495 tuner_freq_offset, true);
5499 /* Setup BER measurement */
5500 status = set_qam_measurement(state, state->m_constellation,
5501 state->props.symbol_rate);
5505 /* Reset default values */
5506 status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5509 status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5513 /* Reset default LC values */
5514 status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5517 status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5520 status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5523 status = write16(state, QAM_LC_MODE__A, 7);
5527 status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5530 status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5533 status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5536 status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5539 status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5542 status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5545 status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5548 status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5551 status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5554 status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5557 status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5560 status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5563 status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5566 status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5569 status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5573 /* Mirroring, QAM-block starting point not inverted */
5574 status = write16(state, QAM_SY_SP_INV__A,
5575 QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5579 /* Halt SCU to enable safe non-atomic accesses */
5580 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5584 /* STEP 4: modulation specific setup */
5585 switch (state->props.modulation) {
5587 status = set_qam16(state);
5590 status = set_qam32(state);
5594 status = set_qam64(state);
5597 status = set_qam128(state);
5600 status = set_qam256(state);
5609 /* Activate SCU to enable SCU commands */
5610 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5614 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5615 /* extAttr->currentChannel.modulation = channel->modulation; */
5616 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5617 status = mpegts_dto_setup(state, state->m_operation_mode);
5621 /* start processes */
5622 status = mpegts_start(state);
5625 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5628 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5631 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5635 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5636 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
5637 | SCU_RAM_COMMAND_CMD_DEMOD_START,
5638 0, NULL, 1, &cmd_result);
5642 /* update global DRXK data container */
5643 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5647 pr_err("Error %d on %s\n", status, __func__);
5651 static int set_qam_standard(struct drxk_state *state,
5652 enum operation_mode o_mode)
5655 #ifdef DRXK_QAM_TAPS
5656 #define DRXK_QAMA_TAPS_SELECT
5657 #include "drxk_filters.h"
5658 #undef DRXK_QAMA_TAPS_SELECT
5663 /* added antenna switch */
5664 switch_antenna_to_qam(state);
5666 /* Ensure correct power-up mode */
5667 status = power_up_qam(state);
5670 /* Reset QAM block */
5671 status = qam_reset_qam(state);
5677 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5680 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5684 /* Upload IQM Channel Filter settings by
5685 boot loader from ROM table */
5688 status = bl_chain_cmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A,
5689 DRXK_BLCC_NR_ELEMENTS_TAPS,
5693 status = bl_direct_cmd(state, IQM_CF_TAP_RE0__A,
5694 DRXK_BL_ROM_OFFSET_TAPS_ITU_C,
5695 DRXK_BLDC_NR_ELEMENTS_TAPS,
5699 status = bl_direct_cmd(state,
5701 DRXK_BL_ROM_OFFSET_TAPS_ITU_C,
5702 DRXK_BLDC_NR_ELEMENTS_TAPS,
5711 status = write16(state, IQM_CF_OUT_ENA__A, 1 << IQM_CF_OUT_ENA_QAM__B);
5714 status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5717 status = write16(state, IQM_CF_MIDTAP__A,
5718 ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5722 status = write16(state, IQM_RC_STRETCH__A, 21);
5725 status = write16(state, IQM_AF_CLP_LEN__A, 0);
5728 status = write16(state, IQM_AF_CLP_TH__A, 448);
5731 status = write16(state, IQM_AF_SNS_LEN__A, 0);
5734 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5738 status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5741 status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5744 status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5747 status = write16(state, IQM_AF_UPD_SEL__A, 0);
5751 /* IQM Impulse Noise Processing Unit */
5752 status = write16(state, IQM_CF_CLP_VAL__A, 500);
5755 status = write16(state, IQM_CF_DATATH__A, 1000);
5758 status = write16(state, IQM_CF_BYPASSDET__A, 1);
5761 status = write16(state, IQM_CF_DET_LCT__A, 0);
5764 status = write16(state, IQM_CF_WND_LEN__A, 1);
5767 status = write16(state, IQM_CF_PKDTH__A, 1);
5770 status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5774 /* turn on IQMAF. Must be done before setAgc**() */
5775 status = set_iqm_af(state, true);
5778 status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5782 /* IQM will not be reset from here, sync ADC and update/init AGC */
5783 status = adc_synchronization(state);
5787 /* Set the FSM step period */
5788 status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5792 /* Halt SCU to enable safe non-atomic accesses */
5793 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5797 /* No more resets of the IQM, current standard correctly set =>
5798 now AGCs can be configured. */
5800 status = init_agc(state, true);
5803 status = set_pre_saw(state, &(state->m_qam_pre_saw_cfg));
5807 /* Configure AGC's */
5808 status = set_agc_rf(state, &(state->m_qam_rf_agc_cfg), true);
5811 status = set_agc_if(state, &(state->m_qam_if_agc_cfg), true);
5815 /* Activate SCU to enable SCU commands */
5816 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5819 pr_err("Error %d on %s\n", status, __func__);
5823 static int write_gpio(struct drxk_state *state)
5829 /* stop lock indicator process */
5830 status = write16(state, SCU_RAM_GPIO__A,
5831 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5835 /* Write magic word to enable pdr reg write */
5836 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5840 if (state->m_has_sawsw) {
5841 if (state->uio_mask & 0x0001) { /* UIO-1 */
5842 /* write to io pad configuration register - output mode */
5843 status = write16(state, SIO_PDR_SMA_TX_CFG__A,
5848 /* use corresponding bit in io data output registar */
5849 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5852 if ((state->m_gpio & 0x0001) == 0)
5853 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5855 value |= 0x8000; /* write one to 15th bit - 1st UIO */
5856 /* write back to io data output register */
5857 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5861 if (state->uio_mask & 0x0002) { /* UIO-2 */
5862 /* write to io pad configuration register - output mode */
5863 status = write16(state, SIO_PDR_SMA_RX_CFG__A,
5868 /* use corresponding bit in io data output registar */
5869 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5872 if ((state->m_gpio & 0x0002) == 0)
5873 value &= 0xBFFF; /* write zero to 14th bit - 2st UIO */
5875 value |= 0x4000; /* write one to 14th bit - 2st UIO */
5876 /* write back to io data output register */
5877 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5881 if (state->uio_mask & 0x0004) { /* UIO-3 */
5882 /* write to io pad configuration register - output mode */
5883 status = write16(state, SIO_PDR_GPIO_CFG__A,
5888 /* use corresponding bit in io data output registar */
5889 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5892 if ((state->m_gpio & 0x0004) == 0)
5893 value &= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
5895 value |= 0x0004; /* write one to 2nd bit - 3rd UIO */
5896 /* write back to io data output register */
5897 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5902 /* Write magic word to disable pdr reg write */
5903 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5906 pr_err("Error %d on %s\n", status, __func__);
5910 static int switch_antenna_to_qam(struct drxk_state *state)
5917 if (!state->antenna_gpio)
5920 gpio_state = state->m_gpio & state->antenna_gpio;
5922 if (state->antenna_dvbt ^ gpio_state) {
5923 /* Antenna is on DVB-T mode. Switch */
5924 if (state->antenna_dvbt)
5925 state->m_gpio &= ~state->antenna_gpio;
5927 state->m_gpio |= state->antenna_gpio;
5928 status = write_gpio(state);
5931 pr_err("Error %d on %s\n", status, __func__);
5935 static int switch_antenna_to_dvbt(struct drxk_state *state)
5942 if (!state->antenna_gpio)
5945 gpio_state = state->m_gpio & state->antenna_gpio;
5947 if (!(state->antenna_dvbt ^ gpio_state)) {
5948 /* Antenna is on DVB-C mode. Switch */
5949 if (state->antenna_dvbt)
5950 state->m_gpio |= state->antenna_gpio;
5952 state->m_gpio &= ~state->antenna_gpio;
5953 status = write_gpio(state);
5956 pr_err("Error %d on %s\n", status, __func__);
5961 static int power_down_device(struct drxk_state *state)
5963 /* Power down to requested mode */
5964 /* Backup some register settings */
5965 /* Set pins with possible pull-ups connected to them in input mode */
5966 /* Analog power down */
5967 /* ADC power down */
5968 /* Power down device */
5972 if (state->m_b_p_down_open_bridge) {
5973 /* Open I2C bridge before power down of DRXK */
5974 status = ConfigureI2CBridge(state, true);
5979 status = dvbt_enable_ofdm_token_ring(state, false);
5983 status = write16(state, SIO_CC_PWD_MODE__A,
5984 SIO_CC_PWD_MODE_LEVEL_CLOCK);
5987 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5990 state->m_hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
5991 status = hi_cfg_command(state);
5994 pr_err("Error %d on %s\n", status, __func__);
5999 static int init_drxk(struct drxk_state *state)
6001 int status = 0, n = 0;
6002 enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
6006 if (state->m_drxk_state == DRXK_UNINITIALIZED) {
6007 drxk_i2c_lock(state);
6008 status = power_up_device(state);
6011 status = drxx_open(state);
6014 /* Soft reset of OFDM-, sys- and osc-clockdomain */
6015 status = write16(state, SIO_CC_SOFT_RST__A,
6016 SIO_CC_SOFT_RST_OFDM__M
6017 | SIO_CC_SOFT_RST_SYS__M
6018 | SIO_CC_SOFT_RST_OSC__M);
6021 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
6025 * TODO is this needed? If yes, how much delay in
6026 * worst case scenario
6028 usleep_range(1000, 2000);
6029 state->m_drxk_a3_patch_code = true;
6030 status = get_device_capabilities(state);
6034 /* Bridge delay, uses oscilator clock */
6035 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
6036 /* SDA brdige delay */
6037 state->m_hi_cfg_bridge_delay =
6038 (u16) ((state->m_osc_clock_freq / 1000) *
6039 HI_I2C_BRIDGE_DELAY) / 1000;
6041 if (state->m_hi_cfg_bridge_delay >
6042 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
6043 state->m_hi_cfg_bridge_delay =
6044 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
6046 /* SCL bridge delay, same as SDA for now */
6047 state->m_hi_cfg_bridge_delay +=
6048 state->m_hi_cfg_bridge_delay <<
6049 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
6051 status = init_hi(state);
6054 /* disable various processes */
6056 if (!(state->m_DRXK_A1_ROM_CODE)
6057 && !(state->m_DRXK_A2_ROM_CODE))
6060 status = write16(state, SCU_RAM_GPIO__A,
6061 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
6066 /* disable MPEG port */
6067 status = mpegts_disable(state);
6071 /* Stop AUD and SCU */
6072 status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
6075 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
6079 /* enable token-ring bus through OFDM block for possible ucode upload */
6080 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A,
6081 SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
6085 /* include boot loader section */
6086 status = write16(state, SIO_BL_COMM_EXEC__A,
6087 SIO_BL_COMM_EXEC_ACTIVE);
6090 status = bl_chain_cmd(state, 0, 6, 100);
6095 status = download_microcode(state, state->fw->data,
6101 /* disable token-ring bus through OFDM block for possible ucode upload */
6102 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A,
6103 SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6107 /* Run SCU for a little while to initialize microcode version numbers */
6108 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6111 status = drxx_open(state);
6114 /* added for test */
6117 power_mode = DRXK_POWER_DOWN_OFDM;
6118 status = ctrl_power_mode(state, &power_mode);
6122 /* Stamp driver version number in SCU data RAM in BCD code
6123 Done to enable field application engineers to retrieve drxdriver version
6124 via I2C from SCU RAM.
6125 Not using SCU command interface for SCU register access since no
6126 microcode may be present.
6129 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6130 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6131 ((DRXK_VERSION_MAJOR % 10) << 4) +
6132 (DRXK_VERSION_MINOR % 10);
6133 status = write16(state, SCU_RAM_DRIVER_VER_HI__A,
6138 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6139 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6140 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6141 (DRXK_VERSION_PATCH % 10);
6142 status = write16(state, SCU_RAM_DRIVER_VER_LO__A,
6147 pr_info("DRXK driver version %d.%d.%d\n",
6148 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6149 DRXK_VERSION_PATCH);
6152 * Dirty fix of default values for ROM/PATCH microcode
6153 * Dirty because this fix makes it impossible to setup
6154 * suitable values before calling DRX_Open. This solution
6155 * requires changes to RF AGC speed to be done via the CTRL
6156 * function after calling DRX_Open
6159 /* m_dvbt_rf_agc_cfg.speed = 3; */
6161 /* Reset driver debug flags to 0 */
6162 status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6167 NOTE: No more full FEC resets allowed afterwards!! */
6168 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6171 /* MPEGTS functions are still the same */
6172 status = mpegts_dto_init(state);
6175 status = mpegts_stop(state);
6178 status = mpegts_configure_polarity(state);
6181 status = mpegts_configure_pins(state, state->m_enable_mpeg_output);
6184 /* added: configure GPIO */
6185 status = write_gpio(state);
6189 state->m_drxk_state = DRXK_STOPPED;
6191 if (state->m_b_power_down) {
6192 status = power_down_device(state);
6195 state->m_drxk_state = DRXK_POWERED_DOWN;
6197 state->m_drxk_state = DRXK_STOPPED;
6199 /* Initialize the supported delivery systems */
6201 if (state->m_has_dvbc) {
6202 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_A;
6203 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_C;
6204 strlcat(state->frontend.ops.info.name, " DVB-C",
6205 sizeof(state->frontend.ops.info.name));
6207 if (state->m_has_dvbt) {
6208 state->frontend.ops.delsys[n++] = SYS_DVBT;
6209 strlcat(state->frontend.ops.info.name, " DVB-T",
6210 sizeof(state->frontend.ops.info.name));
6212 drxk_i2c_unlock(state);
6216 state->m_drxk_state = DRXK_NO_DEV;
6217 drxk_i2c_unlock(state);
6218 pr_err("Error %d on %s\n", status, __func__);
6224 static void load_firmware_cb(const struct firmware *fw,
6227 struct drxk_state *state = context;
6229 dprintk(1, ": %s\n", fw ? "firmware loaded" : "firmware not loaded");
6231 pr_err("Could not load firmware file %s.\n",
6232 state->microcode_name);
6233 pr_info("Copy %s to your hotplug directory!\n",
6234 state->microcode_name);
6235 state->microcode_name = NULL;
6238 * As firmware is now load asynchronous, it is not possible
6239 * anymore to fail at frontend attach. We might silently
6240 * return here, and hope that the driver won't crash.
6241 * We might also change all DVB callbacks to return -ENODEV
6242 * if the device is not initialized.
6243 * As the DRX-K devices have their own internal firmware,
6244 * let's just hope that it will match a firmware revision
6245 * compatible with this driver and proceed.
6253 static void drxk_release(struct dvb_frontend *fe)
6255 struct drxk_state *state = fe->demodulator_priv;
6258 release_firmware(state->fw);
6263 static int drxk_sleep(struct dvb_frontend *fe)
6265 struct drxk_state *state = fe->demodulator_priv;
6269 if (state->m_drxk_state == DRXK_NO_DEV)
6271 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6278 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6280 struct drxk_state *state = fe->demodulator_priv;
6282 dprintk(1, ": %s\n", enable ? "enable" : "disable");
6284 if (state->m_drxk_state == DRXK_NO_DEV)
6287 return ConfigureI2CBridge(state, enable ? true : false);
6290 static int drxk_set_parameters(struct dvb_frontend *fe)
6292 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6293 u32 delsys = p->delivery_system, old_delsys;
6294 struct drxk_state *state = fe->demodulator_priv;
6299 if (state->m_drxk_state == DRXK_NO_DEV)
6302 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6305 if (!fe->ops.tuner_ops.get_if_frequency) {
6306 pr_err("Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
6310 if (fe->ops.i2c_gate_ctrl)
6311 fe->ops.i2c_gate_ctrl(fe, 1);
6312 if (fe->ops.tuner_ops.set_params)
6313 fe->ops.tuner_ops.set_params(fe);
6314 if (fe->ops.i2c_gate_ctrl)
6315 fe->ops.i2c_gate_ctrl(fe, 0);
6317 old_delsys = state->props.delivery_system;
6320 if (old_delsys != delsys) {
6323 case SYS_DVBC_ANNEX_A:
6324 case SYS_DVBC_ANNEX_C:
6325 if (!state->m_has_dvbc)
6327 state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ?
6329 if (state->m_itut_annex_c)
6330 setoperation_mode(state, OM_QAM_ITU_C);
6332 setoperation_mode(state, OM_QAM_ITU_A);
6335 if (!state->m_has_dvbt)
6337 setoperation_mode(state, OM_DVBT);
6344 fe->ops.tuner_ops.get_if_frequency(fe, &IF);
6345 start(state, 0, IF);
6347 /* After set_frontend, stats aren't available */
6348 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
6349 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6350 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6351 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6352 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6353 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6354 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6355 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6357 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6362 static int get_strength(struct drxk_state *state, u64 *strength)
6365 struct s_cfg_agc rf_agc, if_agc;
6371 /* FIXME: those are part of the tuner presets */
6372 u16 tuner_rf_gain = 50; /* Default value on az6007 driver */
6373 u16 tuner_if_gain = 40; /* Default value on az6007 driver */
6377 if (is_dvbt(state)) {
6378 rf_agc = state->m_dvbt_rf_agc_cfg;
6379 if_agc = state->m_dvbt_if_agc_cfg;
6380 } else if (is_qam(state)) {
6381 rf_agc = state->m_qam_rf_agc_cfg;
6382 if_agc = state->m_qam_if_agc_cfg;
6384 rf_agc = state->m_atv_rf_agc_cfg;
6385 if_agc = state->m_atv_if_agc_cfg;
6388 if (rf_agc.ctrl_mode == DRXK_AGC_CTRL_AUTO) {
6389 /* SCU output_level */
6390 status = read16(state, SCU_RAM_AGC_RF_IACCU_HI__A, &scu_lvl);
6395 status = read16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, &scu_coc);
6399 if (((u32) scu_lvl + (u32) scu_coc) < 0xffff)
6400 rf_agc.output_level = scu_lvl + scu_coc;
6402 rf_agc.output_level = 0xffff;
6404 /* Take RF gain into account */
6405 total_gain += tuner_rf_gain;
6407 /* clip output value */
6408 if (rf_agc.output_level < rf_agc.min_output_level)
6409 rf_agc.output_level = rf_agc.min_output_level;
6410 if (rf_agc.output_level > rf_agc.max_output_level)
6411 rf_agc.output_level = rf_agc.max_output_level;
6413 agc_range = (u32) (rf_agc.max_output_level - rf_agc.min_output_level);
6414 if (agc_range > 0) {
6416 ((u32)(tuner_rf_gain)) *
6417 ((u32)(rf_agc.output_level - rf_agc.min_output_level))
6422 if (if_agc.ctrl_mode == DRXK_AGC_CTRL_AUTO) {
6423 status = read16(state, SCU_RAM_AGC_IF_IACCU_HI__A,
6424 &if_agc.output_level);
6428 status = read16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A,
6433 /* Take IF gain into account */
6434 total_gain += (u32) tuner_if_gain;
6436 /* clip output value */
6437 if (if_agc.output_level < if_agc.min_output_level)
6438 if_agc.output_level = if_agc.min_output_level;
6439 if (if_agc.output_level > if_agc.max_output_level)
6440 if_agc.output_level = if_agc.max_output_level;
6442 agc_range = (u32)(if_agc.max_output_level - if_agc.min_output_level);
6443 if (agc_range > 0) {
6445 ((u32)(tuner_if_gain)) *
6446 ((u32)(if_agc.output_level - if_agc.min_output_level))
6452 * Convert to 0..65535 scale.
6453 * If it can't be measured (AGC is disabled), just show 100%.
6456 *strength = (65535UL * atten / total_gain / 100);
6463 static int drxk_get_stats(struct dvb_frontend *fe)
6465 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
6466 struct drxk_state *state = fe->demodulator_priv;
6471 u32 post_bit_err_count;
6472 u32 post_bit_error_scale;
6473 u32 pre_bit_err_count;
6476 u32 pkt_error_count;
6479 if (state->m_drxk_state == DRXK_NO_DEV)
6481 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6485 state->fe_status = 0;
6486 get_lock_status(state, &stat);
6487 if (stat == MPEG_LOCK)
6488 state->fe_status |= 0x1f;
6489 if (stat == FEC_LOCK)
6490 state->fe_status |= 0x0f;
6491 if (stat == DEMOD_LOCK)
6492 state->fe_status |= 0x07;
6495 * Estimate signal strength from AGC
6497 get_strength(state, &c->strength.stat[0].uvalue);
6498 c->strength.stat[0].scale = FE_SCALE_RELATIVE;
6501 if (stat >= DEMOD_LOCK) {
6502 get_signal_to_noise(state, &cnr);
6503 c->cnr.stat[0].svalue = cnr * 100;
6504 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
6506 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6509 if (stat < FEC_LOCK) {
6510 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6511 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6512 c->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6513 c->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6514 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6515 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6521 /* BER measurement is valid if at least FEC lock is achieved */
6524 * OFDM_EC_VD_REQ_SMB_CNT__A and/or OFDM_EC_VD_REQ_BIT_CNT can be
6525 * written to set nr of symbols or bits over which to measure
6526 * EC_VD_REG_ERR_BIT_CNT__A . See CtrlSetCfg().
6529 /* Read registers for post/preViterbi BER calculation */
6530 status = read16(state, OFDM_EC_VD_ERR_BIT_CNT__A, ®16);
6533 pre_bit_err_count = reg16;
6535 status = read16(state, OFDM_EC_VD_IN_BIT_CNT__A , ®16);
6538 pre_bit_count = reg16;
6540 /* Number of bit-errors */
6541 status = read16(state, FEC_RS_NR_BIT_ERRORS__A, ®16);
6544 post_bit_err_count = reg16;
6546 status = read16(state, FEC_RS_MEASUREMENT_PRESCALE__A, ®16);
6549 post_bit_error_scale = reg16;
6551 status = read16(state, FEC_RS_MEASUREMENT_PERIOD__A, ®16);
6556 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, ®16);
6559 pkt_error_count = reg16;
6560 write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
6562 post_bit_err_count *= post_bit_error_scale;
6564 post_bit_count = pkt_count * 204 * 8;
6566 /* Store the results */
6567 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
6568 c->block_error.stat[0].uvalue += pkt_error_count;
6569 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
6570 c->block_count.stat[0].uvalue += pkt_count;
6572 c->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
6573 c->pre_bit_error.stat[0].uvalue += pre_bit_err_count;
6574 c->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
6575 c->pre_bit_count.stat[0].uvalue += pre_bit_count;
6577 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
6578 c->post_bit_error.stat[0].uvalue += post_bit_err_count;
6579 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
6580 c->post_bit_count.stat[0].uvalue += post_bit_count;
6587 static int drxk_read_status(struct dvb_frontend *fe, enum fe_status *status)
6589 struct drxk_state *state = fe->demodulator_priv;
6594 rc = drxk_get_stats(fe);
6598 *status = state->fe_status;
6603 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6606 struct drxk_state *state = fe->demodulator_priv;
6607 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
6611 if (state->m_drxk_state == DRXK_NO_DEV)
6613 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6616 *strength = c->strength.stat[0].uvalue;
6620 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6622 struct drxk_state *state = fe->demodulator_priv;
6627 if (state->m_drxk_state == DRXK_NO_DEV)
6629 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6632 get_signal_to_noise(state, &snr2);
6634 /* No negative SNR, clip to zero */
6637 *snr = snr2 & 0xffff;
6641 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6643 struct drxk_state *state = fe->demodulator_priv;
6648 if (state->m_drxk_state == DRXK_NO_DEV)
6650 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6653 dvbtqam_get_acc_pkt_err(state, &err);
6654 *ucblocks = (u32) err;
6658 static int drxk_get_tune_settings(struct dvb_frontend *fe,
6659 struct dvb_frontend_tune_settings *sets)
6661 struct drxk_state *state = fe->demodulator_priv;
6662 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6666 if (state->m_drxk_state == DRXK_NO_DEV)
6668 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6671 switch (p->delivery_system) {
6672 case SYS_DVBC_ANNEX_A:
6673 case SYS_DVBC_ANNEX_C:
6675 sets->min_delay_ms = 3000;
6676 sets->max_drift = 0;
6677 sets->step_size = 0;
6684 static const struct dvb_frontend_ops drxk_ops = {
6685 /* .delsys will be filled dynamically */
6688 .frequency_min_hz = 47 * MHz,
6689 .frequency_max_hz = 865 * MHz,
6691 .symbol_rate_min = 870000,
6692 .symbol_rate_max = 11700000,
6694 .frequency_stepsize_hz = 166667,
6696 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6697 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO |
6698 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
6699 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_MUTE_TS |
6700 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
6701 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO
6704 .release = drxk_release,
6705 .sleep = drxk_sleep,
6706 .i2c_gate_ctrl = drxk_gate_ctrl,
6708 .set_frontend = drxk_set_parameters,
6709 .get_tune_settings = drxk_get_tune_settings,
6711 .read_status = drxk_read_status,
6712 .read_signal_strength = drxk_read_signal_strength,
6713 .read_snr = drxk_read_snr,
6714 .read_ucblocks = drxk_read_ucblocks,
6717 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6718 struct i2c_adapter *i2c)
6720 struct dtv_frontend_properties *p;
6721 struct drxk_state *state = NULL;
6722 u8 adr = config->adr;
6726 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6731 state->demod_address = adr;
6732 state->single_master = config->single_master;
6733 state->microcode_name = config->microcode_name;
6734 state->qam_demod_parameter_count = config->qam_demod_parameter_count;
6735 state->no_i2c_bridge = config->no_i2c_bridge;
6736 state->antenna_gpio = config->antenna_gpio;
6737 state->antenna_dvbt = config->antenna_dvbt;
6738 state->m_chunk_size = config->chunk_size;
6739 state->enable_merr_cfg = config->enable_merr_cfg;
6741 if (config->dynamic_clk) {
6742 state->m_dvbt_static_clk = false;
6743 state->m_dvbc_static_clk = false;
6745 state->m_dvbt_static_clk = true;
6746 state->m_dvbc_static_clk = true;
6750 if (config->mpeg_out_clk_strength)
6751 state->m_ts_clockk_strength = config->mpeg_out_clk_strength & 0x07;
6753 state->m_ts_clockk_strength = 0x06;
6755 if (config->parallel_ts)
6756 state->m_enable_parallel = true;
6758 state->m_enable_parallel = false;
6760 /* NOTE: as more UIO bits will be used, add them to the mask */
6761 state->uio_mask = config->antenna_gpio;
6763 /* Default gpio to DVB-C */
6764 if (!state->antenna_dvbt && state->antenna_gpio)
6765 state->m_gpio |= state->antenna_gpio;
6767 state->m_gpio &= ~state->antenna_gpio;
6769 mutex_init(&state->mutex);
6771 memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops));
6772 state->frontend.demodulator_priv = state;
6776 /* Load firmware and initialize DRX-K */
6777 if (state->microcode_name) {
6778 const struct firmware *fw = NULL;
6780 status = request_firmware(&fw, state->microcode_name,
6781 state->i2c->dev.parent);
6784 load_firmware_cb(fw, state);
6785 } else if (init_drxk(state) < 0)
6789 /* Initialize stats */
6790 p = &state->frontend.dtv_property_cache;
6791 p->strength.len = 1;
6793 p->block_error.len = 1;
6794 p->block_count.len = 1;
6795 p->pre_bit_error.len = 1;
6796 p->pre_bit_count.len = 1;
6797 p->post_bit_error.len = 1;
6798 p->post_bit_count.len = 1;
6800 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
6801 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6802 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6803 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6804 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6805 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6806 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6807 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6809 pr_info("frontend initialized.\n");
6810 return &state->frontend;
6813 pr_err("not found\n");
6817 EXPORT_SYMBOL_GPL(drxk_attach);
6819 MODULE_DESCRIPTION("DRX-K driver");
6820 MODULE_AUTHOR("Ralph Metzler");
6821 MODULE_LICENSE("GPL");