2 * drxk_hard: DRX-K DVB-C/T demodulator driver
4 * Copyright (C) 2010-2011 Digital Devices GmbH
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 only, as published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * To obtain the license, point your browser to
17 * http://www.gnu.org/copyleft/gpl.html
20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
22 #include <linux/kernel.h>
23 #include <linux/module.h>
24 #include <linux/moduleparam.h>
25 #include <linux/init.h>
26 #include <linux/delay.h>
27 #include <linux/firmware.h>
28 #include <linux/i2c.h>
29 #include <linux/hardirq.h>
30 #include <asm/div64.h>
32 #include <media/dvb_frontend.h>
34 #include "drxk_hard.h"
35 #include <media/dvb_math.h>
37 static int power_down_dvbt(struct drxk_state
*state
, bool set_power_mode
);
38 static int power_down_qam(struct drxk_state
*state
);
39 static int set_dvbt_standard(struct drxk_state
*state
,
40 enum operation_mode o_mode
);
41 static int set_qam_standard(struct drxk_state
*state
,
42 enum operation_mode o_mode
);
43 static int set_qam(struct drxk_state
*state
, u16 intermediate_freqk_hz
,
44 s32 tuner_freq_offset
);
45 static int set_dvbt_standard(struct drxk_state
*state
,
46 enum operation_mode o_mode
);
47 static int dvbt_start(struct drxk_state
*state
);
48 static int set_dvbt(struct drxk_state
*state
, u16 intermediate_freqk_hz
,
49 s32 tuner_freq_offset
);
50 static int get_qam_lock_status(struct drxk_state
*state
, u32
*p_lock_status
);
51 static int get_dvbt_lock_status(struct drxk_state
*state
, u32
*p_lock_status
);
52 static int switch_antenna_to_qam(struct drxk_state
*state
);
53 static int switch_antenna_to_dvbt(struct drxk_state
*state
);
55 static bool is_dvbt(struct drxk_state
*state
)
57 return state
->m_operation_mode
== OM_DVBT
;
60 static bool is_qam(struct drxk_state
*state
)
62 return state
->m_operation_mode
== OM_QAM_ITU_A
||
63 state
->m_operation_mode
== OM_QAM_ITU_B
||
64 state
->m_operation_mode
== OM_QAM_ITU_C
;
69 #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0)
70 #define DRXDAP_FASI_LONG_FORMAT(addr) (((addr) & 0xFC30FF80) != 0)
72 #define DEFAULT_MER_83 165
73 #define DEFAULT_MER_93 250
75 #ifndef DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
76 #define DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH (0x02)
79 #ifndef DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
80 #define DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH (0x03)
83 #define DEFAULT_DRXK_MPEG_LOCK_TIMEOUT 700
84 #define DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT 500
86 #ifndef DRXK_KI_RAGC_ATV
87 #define DRXK_KI_RAGC_ATV 4
89 #ifndef DRXK_KI_IAGC_ATV
90 #define DRXK_KI_IAGC_ATV 6
92 #ifndef DRXK_KI_DAGC_ATV
93 #define DRXK_KI_DAGC_ATV 7
96 #ifndef DRXK_KI_RAGC_QAM
97 #define DRXK_KI_RAGC_QAM 3
99 #ifndef DRXK_KI_IAGC_QAM
100 #define DRXK_KI_IAGC_QAM 4
102 #ifndef DRXK_KI_DAGC_QAM
103 #define DRXK_KI_DAGC_QAM 7
105 #ifndef DRXK_KI_RAGC_DVBT
106 #define DRXK_KI_RAGC_DVBT (IsA1WithPatchCode(state) ? 3 : 2)
108 #ifndef DRXK_KI_IAGC_DVBT
109 #define DRXK_KI_IAGC_DVBT (IsA1WithPatchCode(state) ? 4 : 2)
111 #ifndef DRXK_KI_DAGC_DVBT
112 #define DRXK_KI_DAGC_DVBT (IsA1WithPatchCode(state) ? 10 : 7)
115 #ifndef DRXK_AGC_DAC_OFFSET
116 #define DRXK_AGC_DAC_OFFSET (0x800)
119 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
120 #define DRXK_BANDWIDTH_8MHZ_IN_HZ (0x8B8249L)
123 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
124 #define DRXK_BANDWIDTH_7MHZ_IN_HZ (0x7A1200L)
127 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
128 #define DRXK_BANDWIDTH_6MHZ_IN_HZ (0x68A1B6L)
131 #ifndef DRXK_QAM_SYMBOLRATE_MAX
132 #define DRXK_QAM_SYMBOLRATE_MAX (7233000)
135 #define DRXK_BL_ROM_OFFSET_TAPS_DVBT 56
136 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_A 64
137 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_C 0x5FE0
138 #define DRXK_BL_ROM_OFFSET_TAPS_BG 24
139 #define DRXK_BL_ROM_OFFSET_TAPS_DKILLP 32
140 #define DRXK_BL_ROM_OFFSET_TAPS_NTSC 40
141 #define DRXK_BL_ROM_OFFSET_TAPS_FM 48
142 #define DRXK_BL_ROM_OFFSET_UCODE 0
144 #define DRXK_BLC_TIMEOUT 100
146 #define DRXK_BLCC_NR_ELEMENTS_TAPS 2
147 #define DRXK_BLCC_NR_ELEMENTS_UCODE 6
149 #define DRXK_BLDC_NR_ELEMENTS_TAPS 28
151 #ifndef DRXK_OFDM_NE_NOTCH_WIDTH
152 #define DRXK_OFDM_NE_NOTCH_WIDTH (4)
155 #define DRXK_QAM_SL_SIG_POWER_QAM16 (40960)
156 #define DRXK_QAM_SL_SIG_POWER_QAM32 (20480)
157 #define DRXK_QAM_SL_SIG_POWER_QAM64 (43008)
158 #define DRXK_QAM_SL_SIG_POWER_QAM128 (20992)
159 #define DRXK_QAM_SL_SIG_POWER_QAM256 (43520)
161 static unsigned int debug
;
162 module_param(debug
, int, 0644);
163 MODULE_PARM_DESC(debug
, "enable debug messages");
165 #define dprintk(level, fmt, arg...) do { \
166 if (debug >= level) \
167 printk(KERN_DEBUG KBUILD_MODNAME ": %s " fmt, __func__, ##arg); \
171 static inline u32
MulDiv32(u32 a
, u32 b
, u32 c
)
175 tmp64
= (u64
) a
* (u64
) b
;
181 static inline u32
Frac28a(u32 a
, u32 c
)
187 R0
= (a
% c
) << 4; /* 32-28 == 4 shifts possible at max */
189 * integer part, only the 4 least significant
190 * bits will be visible in the result
193 /* division using radix 16, 7 nibbles in the result */
194 for (i
= 0; i
< 7; i
++) {
195 Q1
= (Q1
<< 4) | (R0
/ c
);
205 static inline u32
log10times100(u32 value
)
207 return (100L * intlog10(value
)) >> 24;
210 /***************************************************************************/
211 /* I2C **********************************************************************/
212 /***************************************************************************/
214 static int drxk_i2c_lock(struct drxk_state
*state
)
216 i2c_lock_adapter(state
->i2c
);
217 state
->drxk_i2c_exclusive_lock
= true;
222 static void drxk_i2c_unlock(struct drxk_state
*state
)
224 if (!state
->drxk_i2c_exclusive_lock
)
227 i2c_unlock_adapter(state
->i2c
);
228 state
->drxk_i2c_exclusive_lock
= false;
231 static int drxk_i2c_transfer(struct drxk_state
*state
, struct i2c_msg
*msgs
,
234 if (state
->drxk_i2c_exclusive_lock
)
235 return __i2c_transfer(state
->i2c
, msgs
, len
);
237 return i2c_transfer(state
->i2c
, msgs
, len
);
240 static int i2c_read1(struct drxk_state
*state
, u8 adr
, u8
*val
)
242 struct i2c_msg msgs
[1] = { {.addr
= adr
, .flags
= I2C_M_RD
,
243 .buf
= val
, .len
= 1}
246 return drxk_i2c_transfer(state
, msgs
, 1);
249 static int i2c_write(struct drxk_state
*state
, u8 adr
, u8
*data
, int len
)
252 struct i2c_msg msg
= {
253 .addr
= adr
, .flags
= 0, .buf
= data
, .len
= len
};
258 for (i
= 0; i
< len
; i
++)
259 pr_cont(" %02x", data
[i
]);
262 status
= drxk_i2c_transfer(state
, &msg
, 1);
263 if (status
>= 0 && status
!= 1)
267 pr_err("i2c write error at addr 0x%02x\n", adr
);
272 static int i2c_read(struct drxk_state
*state
,
273 u8 adr
, u8
*msg
, int len
, u8
*answ
, int alen
)
276 struct i2c_msg msgs
[2] = {
277 {.addr
= adr
, .flags
= 0,
278 .buf
= msg
, .len
= len
},
279 {.addr
= adr
, .flags
= I2C_M_RD
,
280 .buf
= answ
, .len
= alen
}
283 status
= drxk_i2c_transfer(state
, msgs
, 2);
286 pr_cont(": ERROR!\n");
290 pr_err("i2c read error at addr 0x%02x\n", adr
);
295 dprintk(2, ": read from");
296 for (i
= 0; i
< len
; i
++)
297 pr_cont(" %02x", msg
[i
]);
298 pr_cont(", value = ");
299 for (i
= 0; i
< alen
; i
++)
300 pr_cont(" %02x", answ
[i
]);
306 static int read16_flags(struct drxk_state
*state
, u32 reg
, u16
*data
, u8 flags
)
309 u8 adr
= state
->demod_address
, mm1
[4], mm2
[2], len
;
311 if (state
->single_master
)
314 if (DRXDAP_FASI_LONG_FORMAT(reg
) || (flags
!= 0)) {
315 mm1
[0] = (((reg
<< 1) & 0xFF) | 0x01);
316 mm1
[1] = ((reg
>> 16) & 0xFF);
317 mm1
[2] = ((reg
>> 24) & 0xFF) | flags
;
318 mm1
[3] = ((reg
>> 7) & 0xFF);
321 mm1
[0] = ((reg
<< 1) & 0xFF);
322 mm1
[1] = (((reg
>> 16) & 0x0F) | ((reg
>> 18) & 0xF0));
325 dprintk(2, "(0x%08x, 0x%02x)\n", reg
, flags
);
326 status
= i2c_read(state
, adr
, mm1
, len
, mm2
, 2);
330 *data
= mm2
[0] | (mm2
[1] << 8);
335 static int read16(struct drxk_state
*state
, u32 reg
, u16
*data
)
337 return read16_flags(state
, reg
, data
, 0);
340 static int read32_flags(struct drxk_state
*state
, u32 reg
, u32
*data
, u8 flags
)
343 u8 adr
= state
->demod_address
, mm1
[4], mm2
[4], len
;
345 if (state
->single_master
)
348 if (DRXDAP_FASI_LONG_FORMAT(reg
) || (flags
!= 0)) {
349 mm1
[0] = (((reg
<< 1) & 0xFF) | 0x01);
350 mm1
[1] = ((reg
>> 16) & 0xFF);
351 mm1
[2] = ((reg
>> 24) & 0xFF) | flags
;
352 mm1
[3] = ((reg
>> 7) & 0xFF);
355 mm1
[0] = ((reg
<< 1) & 0xFF);
356 mm1
[1] = (((reg
>> 16) & 0x0F) | ((reg
>> 18) & 0xF0));
359 dprintk(2, "(0x%08x, 0x%02x)\n", reg
, flags
);
360 status
= i2c_read(state
, adr
, mm1
, len
, mm2
, 4);
364 *data
= mm2
[0] | (mm2
[1] << 8) |
365 (mm2
[2] << 16) | (mm2
[3] << 24);
370 static int read32(struct drxk_state
*state
, u32 reg
, u32
*data
)
372 return read32_flags(state
, reg
, data
, 0);
375 static int write16_flags(struct drxk_state
*state
, u32 reg
, u16 data
, u8 flags
)
377 u8 adr
= state
->demod_address
, mm
[6], len
;
379 if (state
->single_master
)
381 if (DRXDAP_FASI_LONG_FORMAT(reg
) || (flags
!= 0)) {
382 mm
[0] = (((reg
<< 1) & 0xFF) | 0x01);
383 mm
[1] = ((reg
>> 16) & 0xFF);
384 mm
[2] = ((reg
>> 24) & 0xFF) | flags
;
385 mm
[3] = ((reg
>> 7) & 0xFF);
388 mm
[0] = ((reg
<< 1) & 0xFF);
389 mm
[1] = (((reg
>> 16) & 0x0F) | ((reg
>> 18) & 0xF0));
392 mm
[len
] = data
& 0xff;
393 mm
[len
+ 1] = (data
>> 8) & 0xff;
395 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg
, data
, flags
);
396 return i2c_write(state
, adr
, mm
, len
+ 2);
399 static int write16(struct drxk_state
*state
, u32 reg
, u16 data
)
401 return write16_flags(state
, reg
, data
, 0);
404 static int write32_flags(struct drxk_state
*state
, u32 reg
, u32 data
, u8 flags
)
406 u8 adr
= state
->demod_address
, mm
[8], len
;
408 if (state
->single_master
)
410 if (DRXDAP_FASI_LONG_FORMAT(reg
) || (flags
!= 0)) {
411 mm
[0] = (((reg
<< 1) & 0xFF) | 0x01);
412 mm
[1] = ((reg
>> 16) & 0xFF);
413 mm
[2] = ((reg
>> 24) & 0xFF) | flags
;
414 mm
[3] = ((reg
>> 7) & 0xFF);
417 mm
[0] = ((reg
<< 1) & 0xFF);
418 mm
[1] = (((reg
>> 16) & 0x0F) | ((reg
>> 18) & 0xF0));
421 mm
[len
] = data
& 0xff;
422 mm
[len
+ 1] = (data
>> 8) & 0xff;
423 mm
[len
+ 2] = (data
>> 16) & 0xff;
424 mm
[len
+ 3] = (data
>> 24) & 0xff;
425 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg
, data
, flags
);
427 return i2c_write(state
, adr
, mm
, len
+ 4);
430 static int write32(struct drxk_state
*state
, u32 reg
, u32 data
)
432 return write32_flags(state
, reg
, data
, 0);
435 static int write_block(struct drxk_state
*state
, u32 address
,
436 const int block_size
, const u8 p_block
[])
438 int status
= 0, blk_size
= block_size
;
441 if (state
->single_master
)
444 while (blk_size
> 0) {
445 int chunk
= blk_size
> state
->m_chunk_size
?
446 state
->m_chunk_size
: blk_size
;
447 u8
*adr_buf
= &state
->chunk
[0];
450 if (DRXDAP_FASI_LONG_FORMAT(address
) || (flags
!= 0)) {
451 adr_buf
[0] = (((address
<< 1) & 0xFF) | 0x01);
452 adr_buf
[1] = ((address
>> 16) & 0xFF);
453 adr_buf
[2] = ((address
>> 24) & 0xFF);
454 adr_buf
[3] = ((address
>> 7) & 0xFF);
457 if (chunk
== state
->m_chunk_size
)
460 adr_buf
[0] = ((address
<< 1) & 0xFF);
461 adr_buf
[1] = (((address
>> 16) & 0x0F) |
462 ((address
>> 18) & 0xF0));
465 memcpy(&state
->chunk
[adr_length
], p_block
, chunk
);
466 dprintk(2, "(0x%08x, 0x%02x)\n", address
, flags
);
470 for (i
= 0; i
< chunk
; i
++)
471 pr_cont(" %02x", p_block
[i
]);
474 status
= i2c_write(state
, state
->demod_address
,
475 &state
->chunk
[0], chunk
+ adr_length
);
477 pr_err("%s: i2c write error at addr 0x%02x\n",
482 address
+= (chunk
>> 1);
488 #ifndef DRXK_MAX_RETRIES_POWERUP
489 #define DRXK_MAX_RETRIES_POWERUP 20
492 static int power_up_device(struct drxk_state
*state
)
500 status
= i2c_read1(state
, state
->demod_address
, &data
);
504 status
= i2c_write(state
, state
->demod_address
,
506 usleep_range(10000, 11000);
510 status
= i2c_read1(state
, state
->demod_address
,
512 } while (status
< 0 &&
513 (retry_count
< DRXK_MAX_RETRIES_POWERUP
));
514 if (status
< 0 && retry_count
>= DRXK_MAX_RETRIES_POWERUP
)
518 /* Make sure all clk domains are active */
519 status
= write16(state
, SIO_CC_PWD_MODE__A
, SIO_CC_PWD_MODE_LEVEL_NONE
);
522 status
= write16(state
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
);
525 /* Enable pll lock tests */
526 status
= write16(state
, SIO_CC_PLL_LOCK__A
, 1);
530 state
->m_current_power_mode
= DRX_POWER_UP
;
534 pr_err("Error %d on %s\n", status
, __func__
);
540 static int init_state(struct drxk_state
*state
)
543 * FIXME: most (all?) of the values below should be moved into
544 * struct drxk_config, as they are probably board-specific
546 u32 ul_vsb_if_agc_mode
= DRXK_AGC_CTRL_AUTO
;
547 u32 ul_vsb_if_agc_output_level
= 0;
548 u32 ul_vsb_if_agc_min_level
= 0;
549 u32 ul_vsb_if_agc_max_level
= 0x7FFF;
550 u32 ul_vsb_if_agc_speed
= 3;
552 u32 ul_vsb_rf_agc_mode
= DRXK_AGC_CTRL_AUTO
;
553 u32 ul_vsb_rf_agc_output_level
= 0;
554 u32 ul_vsb_rf_agc_min_level
= 0;
555 u32 ul_vsb_rf_agc_max_level
= 0x7FFF;
556 u32 ul_vsb_rf_agc_speed
= 3;
557 u32 ul_vsb_rf_agc_top
= 9500;
558 u32 ul_vsb_rf_agc_cut_off_current
= 4000;
560 u32 ul_atv_if_agc_mode
= DRXK_AGC_CTRL_AUTO
;
561 u32 ul_atv_if_agc_output_level
= 0;
562 u32 ul_atv_if_agc_min_level
= 0;
563 u32 ul_atv_if_agc_max_level
= 0;
564 u32 ul_atv_if_agc_speed
= 3;
566 u32 ul_atv_rf_agc_mode
= DRXK_AGC_CTRL_OFF
;
567 u32 ul_atv_rf_agc_output_level
= 0;
568 u32 ul_atv_rf_agc_min_level
= 0;
569 u32 ul_atv_rf_agc_max_level
= 0;
570 u32 ul_atv_rf_agc_top
= 9500;
571 u32 ul_atv_rf_agc_cut_off_current
= 4000;
572 u32 ul_atv_rf_agc_speed
= 3;
574 u32 ulQual83
= DEFAULT_MER_83
;
575 u32 ulQual93
= DEFAULT_MER_93
;
577 u32 ul_mpeg_lock_time_out
= DEFAULT_DRXK_MPEG_LOCK_TIMEOUT
;
578 u32 ul_demod_lock_time_out
= DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT
;
580 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
581 /* io_pad_cfg_mode output mode is drive always */
582 /* io_pad_cfg_drive is set to power 2 (23 mA) */
583 u32 ul_gpio_cfg
= 0x0113;
584 u32 ul_invert_ts_clock
= 0;
585 u32 ul_ts_data_strength
= DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
;
586 u32 ul_dvbt_bitrate
= 50000000;
587 u32 ul_dvbc_bitrate
= DRXK_QAM_SYMBOLRATE_MAX
* 8;
589 u32 ul_insert_rs_byte
= 0;
591 u32 ul_rf_mirror
= 1;
592 u32 ul_power_down
= 0;
596 state
->m_has_lna
= false;
597 state
->m_has_dvbt
= false;
598 state
->m_has_dvbc
= false;
599 state
->m_has_atv
= false;
600 state
->m_has_oob
= false;
601 state
->m_has_audio
= false;
603 if (!state
->m_chunk_size
)
604 state
->m_chunk_size
= 124;
606 state
->m_osc_clock_freq
= 0;
607 state
->m_smart_ant_inverted
= false;
608 state
->m_b_p_down_open_bridge
= false;
610 /* real system clock frequency in kHz */
611 state
->m_sys_clock_freq
= 151875;
612 /* Timing div, 250ns/Psys */
613 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
614 state
->m_hi_cfg_timing_div
= ((state
->m_sys_clock_freq
/ 1000) *
615 HI_I2C_DELAY
) / 1000;
617 if (state
->m_hi_cfg_timing_div
> SIO_HI_RA_RAM_PAR_2_CFG_DIV__M
)
618 state
->m_hi_cfg_timing_div
= SIO_HI_RA_RAM_PAR_2_CFG_DIV__M
;
619 state
->m_hi_cfg_wake_up_key
= (state
->demod_address
<< 1);
620 /* port/bridge/power down ctrl */
621 state
->m_hi_cfg_ctrl
= SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE
;
623 state
->m_b_power_down
= (ul_power_down
!= 0);
625 state
->m_drxk_a3_patch_code
= false;
627 /* Init AGC and PGA parameters */
629 state
->m_vsb_if_agc_cfg
.ctrl_mode
= ul_vsb_if_agc_mode
;
630 state
->m_vsb_if_agc_cfg
.output_level
= ul_vsb_if_agc_output_level
;
631 state
->m_vsb_if_agc_cfg
.min_output_level
= ul_vsb_if_agc_min_level
;
632 state
->m_vsb_if_agc_cfg
.max_output_level
= ul_vsb_if_agc_max_level
;
633 state
->m_vsb_if_agc_cfg
.speed
= ul_vsb_if_agc_speed
;
634 state
->m_vsb_pga_cfg
= 140;
637 state
->m_vsb_rf_agc_cfg
.ctrl_mode
= ul_vsb_rf_agc_mode
;
638 state
->m_vsb_rf_agc_cfg
.output_level
= ul_vsb_rf_agc_output_level
;
639 state
->m_vsb_rf_agc_cfg
.min_output_level
= ul_vsb_rf_agc_min_level
;
640 state
->m_vsb_rf_agc_cfg
.max_output_level
= ul_vsb_rf_agc_max_level
;
641 state
->m_vsb_rf_agc_cfg
.speed
= ul_vsb_rf_agc_speed
;
642 state
->m_vsb_rf_agc_cfg
.top
= ul_vsb_rf_agc_top
;
643 state
->m_vsb_rf_agc_cfg
.cut_off_current
= ul_vsb_rf_agc_cut_off_current
;
644 state
->m_vsb_pre_saw_cfg
.reference
= 0x07;
645 state
->m_vsb_pre_saw_cfg
.use_pre_saw
= true;
647 state
->m_Quality83percent
= DEFAULT_MER_83
;
648 state
->m_Quality93percent
= DEFAULT_MER_93
;
649 if (ulQual93
<= 500 && ulQual83
< ulQual93
) {
650 state
->m_Quality83percent
= ulQual83
;
651 state
->m_Quality93percent
= ulQual93
;
655 state
->m_atv_if_agc_cfg
.ctrl_mode
= ul_atv_if_agc_mode
;
656 state
->m_atv_if_agc_cfg
.output_level
= ul_atv_if_agc_output_level
;
657 state
->m_atv_if_agc_cfg
.min_output_level
= ul_atv_if_agc_min_level
;
658 state
->m_atv_if_agc_cfg
.max_output_level
= ul_atv_if_agc_max_level
;
659 state
->m_atv_if_agc_cfg
.speed
= ul_atv_if_agc_speed
;
662 state
->m_atv_rf_agc_cfg
.ctrl_mode
= ul_atv_rf_agc_mode
;
663 state
->m_atv_rf_agc_cfg
.output_level
= ul_atv_rf_agc_output_level
;
664 state
->m_atv_rf_agc_cfg
.min_output_level
= ul_atv_rf_agc_min_level
;
665 state
->m_atv_rf_agc_cfg
.max_output_level
= ul_atv_rf_agc_max_level
;
666 state
->m_atv_rf_agc_cfg
.speed
= ul_atv_rf_agc_speed
;
667 state
->m_atv_rf_agc_cfg
.top
= ul_atv_rf_agc_top
;
668 state
->m_atv_rf_agc_cfg
.cut_off_current
= ul_atv_rf_agc_cut_off_current
;
669 state
->m_atv_pre_saw_cfg
.reference
= 0x04;
670 state
->m_atv_pre_saw_cfg
.use_pre_saw
= true;
674 state
->m_dvbt_rf_agc_cfg
.ctrl_mode
= DRXK_AGC_CTRL_OFF
;
675 state
->m_dvbt_rf_agc_cfg
.output_level
= 0;
676 state
->m_dvbt_rf_agc_cfg
.min_output_level
= 0;
677 state
->m_dvbt_rf_agc_cfg
.max_output_level
= 0xFFFF;
678 state
->m_dvbt_rf_agc_cfg
.top
= 0x2100;
679 state
->m_dvbt_rf_agc_cfg
.cut_off_current
= 4000;
680 state
->m_dvbt_rf_agc_cfg
.speed
= 1;
684 state
->m_dvbt_if_agc_cfg
.ctrl_mode
= DRXK_AGC_CTRL_AUTO
;
685 state
->m_dvbt_if_agc_cfg
.output_level
= 0;
686 state
->m_dvbt_if_agc_cfg
.min_output_level
= 0;
687 state
->m_dvbt_if_agc_cfg
.max_output_level
= 9000;
688 state
->m_dvbt_if_agc_cfg
.top
= 13424;
689 state
->m_dvbt_if_agc_cfg
.cut_off_current
= 0;
690 state
->m_dvbt_if_agc_cfg
.speed
= 3;
691 state
->m_dvbt_if_agc_cfg
.fast_clip_ctrl_delay
= 30;
692 state
->m_dvbt_if_agc_cfg
.ingain_tgt_max
= 30000;
693 /* state->m_dvbtPgaCfg = 140; */
695 state
->m_dvbt_pre_saw_cfg
.reference
= 4;
696 state
->m_dvbt_pre_saw_cfg
.use_pre_saw
= false;
699 state
->m_qam_rf_agc_cfg
.ctrl_mode
= DRXK_AGC_CTRL_OFF
;
700 state
->m_qam_rf_agc_cfg
.output_level
= 0;
701 state
->m_qam_rf_agc_cfg
.min_output_level
= 6023;
702 state
->m_qam_rf_agc_cfg
.max_output_level
= 27000;
703 state
->m_qam_rf_agc_cfg
.top
= 0x2380;
704 state
->m_qam_rf_agc_cfg
.cut_off_current
= 4000;
705 state
->m_qam_rf_agc_cfg
.speed
= 3;
708 state
->m_qam_if_agc_cfg
.ctrl_mode
= DRXK_AGC_CTRL_AUTO
;
709 state
->m_qam_if_agc_cfg
.output_level
= 0;
710 state
->m_qam_if_agc_cfg
.min_output_level
= 0;
711 state
->m_qam_if_agc_cfg
.max_output_level
= 9000;
712 state
->m_qam_if_agc_cfg
.top
= 0x0511;
713 state
->m_qam_if_agc_cfg
.cut_off_current
= 0;
714 state
->m_qam_if_agc_cfg
.speed
= 3;
715 state
->m_qam_if_agc_cfg
.ingain_tgt_max
= 5119;
716 state
->m_qam_if_agc_cfg
.fast_clip_ctrl_delay
= 50;
718 state
->m_qam_pga_cfg
= 140;
719 state
->m_qam_pre_saw_cfg
.reference
= 4;
720 state
->m_qam_pre_saw_cfg
.use_pre_saw
= false;
722 state
->m_operation_mode
= OM_NONE
;
723 state
->m_drxk_state
= DRXK_UNINITIALIZED
;
725 /* MPEG output configuration */
726 state
->m_enable_mpeg_output
= true; /* If TRUE; enable MPEG ouput */
727 state
->m_insert_rs_byte
= false; /* If TRUE; insert RS byte */
728 state
->m_invert_data
= false; /* If TRUE; invert DATA signals */
729 state
->m_invert_err
= false; /* If TRUE; invert ERR signal */
730 state
->m_invert_str
= false; /* If TRUE; invert STR signals */
731 state
->m_invert_val
= false; /* If TRUE; invert VAL signals */
732 state
->m_invert_clk
= (ul_invert_ts_clock
!= 0); /* If TRUE; invert CLK signals */
734 /* If TRUE; static MPEG clockrate will be used;
735 otherwise clockrate will adapt to the bitrate of the TS */
737 state
->m_dvbt_bitrate
= ul_dvbt_bitrate
;
738 state
->m_dvbc_bitrate
= ul_dvbc_bitrate
;
740 state
->m_ts_data_strength
= (ul_ts_data_strength
& 0x07);
742 /* Maximum bitrate in b/s in case static clockrate is selected */
743 state
->m_mpeg_ts_static_bitrate
= 19392658;
744 state
->m_disable_te_ihandling
= false;
746 if (ul_insert_rs_byte
)
747 state
->m_insert_rs_byte
= true;
749 state
->m_mpeg_lock_time_out
= DEFAULT_DRXK_MPEG_LOCK_TIMEOUT
;
750 if (ul_mpeg_lock_time_out
< 10000)
751 state
->m_mpeg_lock_time_out
= ul_mpeg_lock_time_out
;
752 state
->m_demod_lock_time_out
= DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT
;
753 if (ul_demod_lock_time_out
< 10000)
754 state
->m_demod_lock_time_out
= ul_demod_lock_time_out
;
757 state
->m_constellation
= DRX_CONSTELLATION_AUTO
;
758 state
->m_qam_interleave_mode
= DRXK_QAM_I12_J17
;
759 state
->m_fec_rs_plen
= 204 * 8; /* fecRsPlen annex A */
760 state
->m_fec_rs_prescale
= 1;
762 state
->m_sqi_speed
= DRXK_DVBT_SQI_SPEED_MEDIUM
;
763 state
->m_agcfast_clip_ctrl_delay
= 0;
765 state
->m_gpio_cfg
= ul_gpio_cfg
;
767 state
->m_b_power_down
= false;
768 state
->m_current_power_mode
= DRX_POWER_DOWN
;
770 state
->m_rfmirror
= (ul_rf_mirror
== 0);
771 state
->m_if_agc_pol
= false;
775 static int drxx_open(struct drxk_state
*state
)
783 /* stop lock indicator process */
784 status
= write16(state
, SCU_RAM_GPIO__A
,
785 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
788 /* Check device id */
789 status
= read16(state
, SIO_TOP_COMM_KEY__A
, &key
);
792 status
= write16(state
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
);
795 status
= read32(state
, SIO_TOP_JTAGID_LO__A
, &jtag
);
798 status
= read16(state
, SIO_PDR_UIO_IN_HI__A
, &bid
);
801 status
= write16(state
, SIO_TOP_COMM_KEY__A
, key
);
804 pr_err("Error %d on %s\n", status
, __func__
);
808 static int get_device_capabilities(struct drxk_state
*state
)
810 u16 sio_pdr_ohw_cfg
= 0;
811 u32 sio_top_jtagid_lo
= 0;
813 const char *spin
= "";
818 /* stop lock indicator process */
819 status
= write16(state
, SCU_RAM_GPIO__A
,
820 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
823 status
= write16(state
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
);
826 status
= read16(state
, SIO_PDR_OHW_CFG__A
, &sio_pdr_ohw_cfg
);
829 status
= write16(state
, SIO_TOP_COMM_KEY__A
, 0x0000);
833 switch ((sio_pdr_ohw_cfg
& SIO_PDR_OHW_CFG_FREF_SEL__M
)) {
835 /* ignore (bypass ?) */
839 state
->m_osc_clock_freq
= 27000;
843 state
->m_osc_clock_freq
= 20250;
847 state
->m_osc_clock_freq
= 20250;
850 pr_err("Clock Frequency is unknown\n");
854 Determine device capabilities
857 status
= read32(state
, SIO_TOP_JTAGID_LO__A
, &sio_top_jtagid_lo
);
861 pr_info("status = 0x%08x\n", sio_top_jtagid_lo
);
864 switch ((sio_top_jtagid_lo
>> 29) & 0xF) {
866 state
->m_device_spin
= DRXK_SPIN_A1
;
870 state
->m_device_spin
= DRXK_SPIN_A2
;
874 state
->m_device_spin
= DRXK_SPIN_A3
;
878 state
->m_device_spin
= DRXK_SPIN_UNKNOWN
;
880 pr_err("Spin %d unknown\n", (sio_top_jtagid_lo
>> 29) & 0xF);
883 switch ((sio_top_jtagid_lo
>> 12) & 0xFF) {
885 /* typeId = DRX3913K_TYPE_ID */
886 state
->m_has_lna
= false;
887 state
->m_has_oob
= false;
888 state
->m_has_atv
= false;
889 state
->m_has_audio
= false;
890 state
->m_has_dvbt
= true;
891 state
->m_has_dvbc
= true;
892 state
->m_has_sawsw
= true;
893 state
->m_has_gpio2
= false;
894 state
->m_has_gpio1
= false;
895 state
->m_has_irqn
= false;
898 /* typeId = DRX3915K_TYPE_ID */
899 state
->m_has_lna
= false;
900 state
->m_has_oob
= false;
901 state
->m_has_atv
= true;
902 state
->m_has_audio
= false;
903 state
->m_has_dvbt
= true;
904 state
->m_has_dvbc
= false;
905 state
->m_has_sawsw
= true;
906 state
->m_has_gpio2
= true;
907 state
->m_has_gpio1
= true;
908 state
->m_has_irqn
= false;
911 /* typeId = DRX3916K_TYPE_ID */
912 state
->m_has_lna
= false;
913 state
->m_has_oob
= false;
914 state
->m_has_atv
= true;
915 state
->m_has_audio
= false;
916 state
->m_has_dvbt
= true;
917 state
->m_has_dvbc
= false;
918 state
->m_has_sawsw
= true;
919 state
->m_has_gpio2
= true;
920 state
->m_has_gpio1
= true;
921 state
->m_has_irqn
= false;
924 /* typeId = DRX3918K_TYPE_ID */
925 state
->m_has_lna
= false;
926 state
->m_has_oob
= false;
927 state
->m_has_atv
= true;
928 state
->m_has_audio
= true;
929 state
->m_has_dvbt
= true;
930 state
->m_has_dvbc
= false;
931 state
->m_has_sawsw
= true;
932 state
->m_has_gpio2
= true;
933 state
->m_has_gpio1
= true;
934 state
->m_has_irqn
= false;
937 /* typeId = DRX3921K_TYPE_ID */
938 state
->m_has_lna
= false;
939 state
->m_has_oob
= false;
940 state
->m_has_atv
= true;
941 state
->m_has_audio
= true;
942 state
->m_has_dvbt
= true;
943 state
->m_has_dvbc
= true;
944 state
->m_has_sawsw
= true;
945 state
->m_has_gpio2
= true;
946 state
->m_has_gpio1
= true;
947 state
->m_has_irqn
= false;
950 /* typeId = DRX3923K_TYPE_ID */
951 state
->m_has_lna
= false;
952 state
->m_has_oob
= false;
953 state
->m_has_atv
= true;
954 state
->m_has_audio
= true;
955 state
->m_has_dvbt
= true;
956 state
->m_has_dvbc
= true;
957 state
->m_has_sawsw
= true;
958 state
->m_has_gpio2
= true;
959 state
->m_has_gpio1
= true;
960 state
->m_has_irqn
= false;
963 /* typeId = DRX3925K_TYPE_ID */
964 state
->m_has_lna
= false;
965 state
->m_has_oob
= false;
966 state
->m_has_atv
= true;
967 state
->m_has_audio
= true;
968 state
->m_has_dvbt
= true;
969 state
->m_has_dvbc
= true;
970 state
->m_has_sawsw
= true;
971 state
->m_has_gpio2
= true;
972 state
->m_has_gpio1
= true;
973 state
->m_has_irqn
= false;
976 /* typeId = DRX3926K_TYPE_ID */
977 state
->m_has_lna
= false;
978 state
->m_has_oob
= false;
979 state
->m_has_atv
= true;
980 state
->m_has_audio
= false;
981 state
->m_has_dvbt
= true;
982 state
->m_has_dvbc
= true;
983 state
->m_has_sawsw
= true;
984 state
->m_has_gpio2
= true;
985 state
->m_has_gpio1
= true;
986 state
->m_has_irqn
= false;
989 pr_err("DeviceID 0x%02x not supported\n",
990 ((sio_top_jtagid_lo
>> 12) & 0xFF));
995 pr_info("detected a drx-39%02xk, spin %s, xtal %d.%03d MHz\n",
996 ((sio_top_jtagid_lo
>> 12) & 0xFF), spin
,
997 state
->m_osc_clock_freq
/ 1000,
998 state
->m_osc_clock_freq
% 1000);
1002 pr_err("Error %d on %s\n", status
, __func__
);
1008 static int hi_command(struct drxk_state
*state
, u16 cmd
, u16
*p_result
)
1016 status
= write16(state
, SIO_HI_RA_RAM_CMD__A
, cmd
);
1019 if (cmd
== SIO_HI_RA_RAM_CMD_RESET
)
1020 usleep_range(1000, 2000);
1023 (bool) ((cmd
== SIO_HI_RA_RAM_CMD_CONFIG
) &&
1024 ((state
->m_hi_cfg_ctrl
) &
1025 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M
) ==
1026 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
);
1027 if (!powerdown_cmd
) {
1028 /* Wait until command rdy */
1029 u32 retry_count
= 0;
1033 usleep_range(1000, 2000);
1035 status
= read16(state
, SIO_HI_RA_RAM_CMD__A
,
1037 } while ((status
< 0) && (retry_count
< DRXK_MAX_RETRIES
)
1038 && (wait_cmd
!= 0));
1041 status
= read16(state
, SIO_HI_RA_RAM_RES__A
, p_result
);
1045 pr_err("Error %d on %s\n", status
, __func__
);
1050 static int hi_cfg_command(struct drxk_state
*state
)
1056 mutex_lock(&state
->mutex
);
1058 status
= write16(state
, SIO_HI_RA_RAM_PAR_6__A
,
1059 state
->m_hi_cfg_timeout
);
1062 status
= write16(state
, SIO_HI_RA_RAM_PAR_5__A
,
1063 state
->m_hi_cfg_ctrl
);
1066 status
= write16(state
, SIO_HI_RA_RAM_PAR_4__A
,
1067 state
->m_hi_cfg_wake_up_key
);
1070 status
= write16(state
, SIO_HI_RA_RAM_PAR_3__A
,
1071 state
->m_hi_cfg_bridge_delay
);
1074 status
= write16(state
, SIO_HI_RA_RAM_PAR_2__A
,
1075 state
->m_hi_cfg_timing_div
);
1078 status
= write16(state
, SIO_HI_RA_RAM_PAR_1__A
,
1079 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY
);
1082 status
= hi_command(state
, SIO_HI_RA_RAM_CMD_CONFIG
, NULL
);
1086 state
->m_hi_cfg_ctrl
&= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
;
1088 mutex_unlock(&state
->mutex
);
1090 pr_err("Error %d on %s\n", status
, __func__
);
1094 static int init_hi(struct drxk_state
*state
)
1098 state
->m_hi_cfg_wake_up_key
= (state
->demod_address
<< 1);
1099 state
->m_hi_cfg_timeout
= 0x96FF;
1100 /* port/bridge/power down ctrl */
1101 state
->m_hi_cfg_ctrl
= SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE
;
1103 return hi_cfg_command(state
);
1106 static int mpegts_configure_pins(struct drxk_state
*state
, bool mpeg_enable
)
1109 u16 sio_pdr_mclk_cfg
= 0;
1110 u16 sio_pdr_mdx_cfg
= 0;
1113 dprintk(1, ": mpeg %s, %s mode\n",
1114 mpeg_enable
? "enable" : "disable",
1115 state
->m_enable_parallel
? "parallel" : "serial");
1117 /* stop lock indicator process */
1118 status
= write16(state
, SCU_RAM_GPIO__A
,
1119 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
1123 /* MPEG TS pad configuration */
1124 status
= write16(state
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
);
1129 /* Set MPEG TS pads to inputmode */
1130 status
= write16(state
, SIO_PDR_MSTRT_CFG__A
, 0x0000);
1133 status
= write16(state
, SIO_PDR_MERR_CFG__A
, 0x0000);
1136 status
= write16(state
, SIO_PDR_MCLK_CFG__A
, 0x0000);
1139 status
= write16(state
, SIO_PDR_MVAL_CFG__A
, 0x0000);
1142 status
= write16(state
, SIO_PDR_MD0_CFG__A
, 0x0000);
1145 status
= write16(state
, SIO_PDR_MD1_CFG__A
, 0x0000);
1148 status
= write16(state
, SIO_PDR_MD2_CFG__A
, 0x0000);
1151 status
= write16(state
, SIO_PDR_MD3_CFG__A
, 0x0000);
1154 status
= write16(state
, SIO_PDR_MD4_CFG__A
, 0x0000);
1157 status
= write16(state
, SIO_PDR_MD5_CFG__A
, 0x0000);
1160 status
= write16(state
, SIO_PDR_MD6_CFG__A
, 0x0000);
1163 status
= write16(state
, SIO_PDR_MD7_CFG__A
, 0x0000);
1167 /* Enable MPEG output */
1169 ((state
->m_ts_data_strength
<<
1170 SIO_PDR_MD0_CFG_DRIVE__B
) | 0x0003);
1171 sio_pdr_mclk_cfg
= ((state
->m_ts_clockk_strength
<<
1172 SIO_PDR_MCLK_CFG_DRIVE__B
) |
1175 status
= write16(state
, SIO_PDR_MSTRT_CFG__A
, sio_pdr_mdx_cfg
);
1179 if (state
->enable_merr_cfg
)
1180 err_cfg
= sio_pdr_mdx_cfg
;
1182 status
= write16(state
, SIO_PDR_MERR_CFG__A
, err_cfg
);
1185 status
= write16(state
, SIO_PDR_MVAL_CFG__A
, err_cfg
);
1189 if (state
->m_enable_parallel
) {
1190 /* parallel -> enable MD1 to MD7 */
1191 status
= write16(state
, SIO_PDR_MD1_CFG__A
,
1195 status
= write16(state
, SIO_PDR_MD2_CFG__A
,
1199 status
= write16(state
, SIO_PDR_MD3_CFG__A
,
1203 status
= write16(state
, SIO_PDR_MD4_CFG__A
,
1207 status
= write16(state
, SIO_PDR_MD5_CFG__A
,
1211 status
= write16(state
, SIO_PDR_MD6_CFG__A
,
1215 status
= write16(state
, SIO_PDR_MD7_CFG__A
,
1220 sio_pdr_mdx_cfg
= ((state
->m_ts_data_strength
<<
1221 SIO_PDR_MD0_CFG_DRIVE__B
)
1223 /* serial -> disable MD1 to MD7 */
1224 status
= write16(state
, SIO_PDR_MD1_CFG__A
, 0x0000);
1227 status
= write16(state
, SIO_PDR_MD2_CFG__A
, 0x0000);
1230 status
= write16(state
, SIO_PDR_MD3_CFG__A
, 0x0000);
1233 status
= write16(state
, SIO_PDR_MD4_CFG__A
, 0x0000);
1236 status
= write16(state
, SIO_PDR_MD5_CFG__A
, 0x0000);
1239 status
= write16(state
, SIO_PDR_MD6_CFG__A
, 0x0000);
1242 status
= write16(state
, SIO_PDR_MD7_CFG__A
, 0x0000);
1246 status
= write16(state
, SIO_PDR_MCLK_CFG__A
, sio_pdr_mclk_cfg
);
1249 status
= write16(state
, SIO_PDR_MD0_CFG__A
, sio_pdr_mdx_cfg
);
1253 /* Enable MB output over MPEG pads and ctl input */
1254 status
= write16(state
, SIO_PDR_MON_CFG__A
, 0x0000);
1257 /* Write nomagic word to enable pdr reg write */
1258 status
= write16(state
, SIO_TOP_COMM_KEY__A
, 0x0000);
1261 pr_err("Error %d on %s\n", status
, __func__
);
1265 static int mpegts_disable(struct drxk_state
*state
)
1269 return mpegts_configure_pins(state
, false);
1272 static int bl_chain_cmd(struct drxk_state
*state
,
1273 u16 rom_offset
, u16 nr_of_elements
, u32 time_out
)
1280 mutex_lock(&state
->mutex
);
1281 status
= write16(state
, SIO_BL_MODE__A
, SIO_BL_MODE_CHAIN
);
1284 status
= write16(state
, SIO_BL_CHAIN_ADDR__A
, rom_offset
);
1287 status
= write16(state
, SIO_BL_CHAIN_LEN__A
, nr_of_elements
);
1290 status
= write16(state
, SIO_BL_ENABLE__A
, SIO_BL_ENABLE_ON
);
1294 end
= jiffies
+ msecs_to_jiffies(time_out
);
1296 usleep_range(1000, 2000);
1297 status
= read16(state
, SIO_BL_STATUS__A
, &bl_status
);
1300 } while ((bl_status
== 0x1) &&
1301 ((time_is_after_jiffies(end
))));
1303 if (bl_status
== 0x1) {
1304 pr_err("SIO not ready\n");
1310 pr_err("Error %d on %s\n", status
, __func__
);
1312 mutex_unlock(&state
->mutex
);
1317 static int download_microcode(struct drxk_state
*state
,
1318 const u8 p_mc_image
[], u32 length
)
1320 const u8
*p_src
= p_mc_image
;
1330 /* down the drain (we don't care about MAGIC_WORD) */
1332 /* For future reference */
1333 drain
= (p_src
[0] << 8) | p_src
[1];
1335 p_src
+= sizeof(u16
);
1336 offset
+= sizeof(u16
);
1337 n_blocks
= (p_src
[0] << 8) | p_src
[1];
1338 p_src
+= sizeof(u16
);
1339 offset
+= sizeof(u16
);
1341 for (i
= 0; i
< n_blocks
; i
+= 1) {
1342 address
= (p_src
[0] << 24) | (p_src
[1] << 16) |
1343 (p_src
[2] << 8) | p_src
[3];
1344 p_src
+= sizeof(u32
);
1345 offset
+= sizeof(u32
);
1347 block_size
= ((p_src
[0] << 8) | p_src
[1]) * sizeof(u16
);
1348 p_src
+= sizeof(u16
);
1349 offset
+= sizeof(u16
);
1352 /* For future reference */
1353 flags
= (p_src
[0] << 8) | p_src
[1];
1355 p_src
+= sizeof(u16
);
1356 offset
+= sizeof(u16
);
1359 /* For future reference */
1360 block_crc
= (p_src
[0] << 8) | p_src
[1];
1362 p_src
+= sizeof(u16
);
1363 offset
+= sizeof(u16
);
1365 if (offset
+ block_size
> length
) {
1366 pr_err("Firmware is corrupted.\n");
1370 status
= write_block(state
, address
, block_size
, p_src
);
1372 pr_err("Error %d while loading firmware\n", status
);
1375 p_src
+= block_size
;
1376 offset
+= block_size
;
1381 static int dvbt_enable_ofdm_token_ring(struct drxk_state
*state
, bool enable
)
1385 u16 desired_ctrl
= SIO_OFDM_SH_OFDM_RING_ENABLE_ON
;
1386 u16 desired_status
= SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED
;
1392 desired_ctrl
= SIO_OFDM_SH_OFDM_RING_ENABLE_OFF
;
1393 desired_status
= SIO_OFDM_SH_OFDM_RING_STATUS_DOWN
;
1396 status
= read16(state
, SIO_OFDM_SH_OFDM_RING_STATUS__A
, &data
);
1397 if (status
>= 0 && data
== desired_status
) {
1398 /* tokenring already has correct status */
1401 /* Disable/enable dvbt tokenring bridge */
1402 status
= write16(state
, SIO_OFDM_SH_OFDM_RING_ENABLE__A
, desired_ctrl
);
1404 end
= jiffies
+ msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT
);
1406 status
= read16(state
, SIO_OFDM_SH_OFDM_RING_STATUS__A
, &data
);
1407 if ((status
>= 0 && data
== desired_status
)
1408 || time_is_after_jiffies(end
))
1410 usleep_range(1000, 2000);
1412 if (data
!= desired_status
) {
1413 pr_err("SIO not ready\n");
1419 static int mpegts_stop(struct drxk_state
*state
)
1422 u16 fec_oc_snc_mode
= 0;
1423 u16 fec_oc_ipr_mode
= 0;
1427 /* Graceful shutdown (byte boundaries) */
1428 status
= read16(state
, FEC_OC_SNC_MODE__A
, &fec_oc_snc_mode
);
1431 fec_oc_snc_mode
|= FEC_OC_SNC_MODE_SHUTDOWN__M
;
1432 status
= write16(state
, FEC_OC_SNC_MODE__A
, fec_oc_snc_mode
);
1436 /* Suppress MCLK during absence of data */
1437 status
= read16(state
, FEC_OC_IPR_MODE__A
, &fec_oc_ipr_mode
);
1440 fec_oc_ipr_mode
|= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M
;
1441 status
= write16(state
, FEC_OC_IPR_MODE__A
, fec_oc_ipr_mode
);
1445 pr_err("Error %d on %s\n", status
, __func__
);
1450 static int scu_command(struct drxk_state
*state
,
1451 u16 cmd
, u8 parameter_len
,
1452 u16
*parameter
, u8 result_len
, u16
*result
)
1454 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1455 #error DRXK register mapping no longer compatible with this routine!
1458 int status
= -EINVAL
;
1467 if ((cmd
== 0) || ((parameter_len
> 0) && (parameter
== NULL
)) ||
1468 ((result_len
> 0) && (result
== NULL
))) {
1469 pr_err("Error %d on %s\n", status
, __func__
);
1473 mutex_lock(&state
->mutex
);
1475 /* assume that the command register is ready
1476 since it is checked afterwards */
1477 for (ii
= parameter_len
- 1; ii
>= 0; ii
-= 1) {
1478 buffer
[cnt
++] = (parameter
[ii
] & 0xFF);
1479 buffer
[cnt
++] = ((parameter
[ii
] >> 8) & 0xFF);
1481 buffer
[cnt
++] = (cmd
& 0xFF);
1482 buffer
[cnt
++] = ((cmd
>> 8) & 0xFF);
1484 write_block(state
, SCU_RAM_PARAM_0__A
-
1485 (parameter_len
- 1), cnt
, buffer
);
1486 /* Wait until SCU has processed command */
1487 end
= jiffies
+ msecs_to_jiffies(DRXK_MAX_WAITTIME
);
1489 usleep_range(1000, 2000);
1490 status
= read16(state
, SCU_RAM_COMMAND__A
, &cur_cmd
);
1493 } while (!(cur_cmd
== DRX_SCU_READY
) && (time_is_after_jiffies(end
)));
1494 if (cur_cmd
!= DRX_SCU_READY
) {
1495 pr_err("SCU not ready\n");
1500 if ((result_len
> 0) && (result
!= NULL
)) {
1504 for (ii
= result_len
- 1; ii
>= 0; ii
-= 1) {
1505 status
= read16(state
, SCU_RAM_PARAM_0__A
- ii
,
1511 /* Check if an error was reported by SCU */
1512 err
= (s16
)result
[0];
1516 /* check for the known error codes */
1518 case SCU_RESULT_UNKCMD
:
1519 p
= "SCU_RESULT_UNKCMD";
1521 case SCU_RESULT_UNKSTD
:
1522 p
= "SCU_RESULT_UNKSTD";
1524 case SCU_RESULT_SIZE
:
1525 p
= "SCU_RESULT_SIZE";
1527 case SCU_RESULT_INVPAR
:
1528 p
= "SCU_RESULT_INVPAR";
1530 default: /* Other negative values are errors */
1531 sprintf(errname
, "ERROR: %d\n", err
);
1534 pr_err("%s while sending cmd 0x%04x with params:", p
, cmd
);
1535 print_hex_dump_bytes("drxk: ", DUMP_PREFIX_NONE
, buffer
, cnt
);
1542 pr_err("Error %d on %s\n", status
, __func__
);
1544 mutex_unlock(&state
->mutex
);
1548 static int set_iqm_af(struct drxk_state
*state
, bool active
)
1556 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
1561 data
|= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1562 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1563 | IQM_AF_STDBY_STDBY_PD_STANDBY
1564 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1565 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
);
1567 data
&= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY
)
1568 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY
)
1569 & (~IQM_AF_STDBY_STDBY_PD_STANDBY
)
1570 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
)
1571 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
)
1574 status
= write16(state
, IQM_AF_STDBY__A
, data
);
1578 pr_err("Error %d on %s\n", status
, __func__
);
1582 static int ctrl_power_mode(struct drxk_state
*state
, enum drx_power_mode
*mode
)
1585 u16 sio_cc_pwd_mode
= 0;
1589 /* Check arguments */
1595 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_NONE
;
1597 case DRXK_POWER_DOWN_OFDM
:
1598 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_OFDM
;
1600 case DRXK_POWER_DOWN_CORE
:
1601 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_CLOCK
;
1603 case DRXK_POWER_DOWN_PLL
:
1604 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_PLL
;
1606 case DRX_POWER_DOWN
:
1607 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_OSC
;
1610 /* Unknow sleep mode */
1614 /* If already in requested power mode, do nothing */
1615 if (state
->m_current_power_mode
== *mode
)
1618 /* For next steps make sure to start from DRX_POWER_UP mode */
1619 if (state
->m_current_power_mode
!= DRX_POWER_UP
) {
1620 status
= power_up_device(state
);
1623 status
= dvbt_enable_ofdm_token_ring(state
, true);
1628 if (*mode
== DRX_POWER_UP
) {
1629 /* Restore analog & pin configuration */
1631 /* Power down to requested mode */
1632 /* Backup some register settings */
1633 /* Set pins with possible pull-ups connected
1634 to them in input mode */
1635 /* Analog power down */
1636 /* ADC power down */
1637 /* Power down device */
1638 /* stop all comm_exec */
1639 /* Stop and power down previous standard */
1640 switch (state
->m_operation_mode
) {
1642 status
= mpegts_stop(state
);
1645 status
= power_down_dvbt(state
, false);
1651 status
= mpegts_stop(state
);
1654 status
= power_down_qam(state
);
1661 status
= dvbt_enable_ofdm_token_ring(state
, false);
1664 status
= write16(state
, SIO_CC_PWD_MODE__A
, sio_cc_pwd_mode
);
1667 status
= write16(state
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
);
1671 if (*mode
!= DRXK_POWER_DOWN_OFDM
) {
1672 state
->m_hi_cfg_ctrl
|=
1673 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
;
1674 status
= hi_cfg_command(state
);
1679 state
->m_current_power_mode
= *mode
;
1683 pr_err("Error %d on %s\n", status
, __func__
);
1688 static int power_down_dvbt(struct drxk_state
*state
, bool set_power_mode
)
1690 enum drx_power_mode power_mode
= DRXK_POWER_DOWN_OFDM
;
1697 status
= read16(state
, SCU_COMM_EXEC__A
, &data
);
1700 if (data
== SCU_COMM_EXEC_ACTIVE
) {
1701 /* Send OFDM stop command */
1702 status
= scu_command(state
,
1703 SCU_RAM_COMMAND_STANDARD_OFDM
1704 | SCU_RAM_COMMAND_CMD_DEMOD_STOP
,
1705 0, NULL
, 1, &cmd_result
);
1708 /* Send OFDM reset command */
1709 status
= scu_command(state
,
1710 SCU_RAM_COMMAND_STANDARD_OFDM
1711 | SCU_RAM_COMMAND_CMD_DEMOD_RESET
,
1712 0, NULL
, 1, &cmd_result
);
1717 /* Reset datapath for OFDM, processors first */
1718 status
= write16(state
, OFDM_SC_COMM_EXEC__A
, OFDM_SC_COMM_EXEC_STOP
);
1721 status
= write16(state
, OFDM_LC_COMM_EXEC__A
, OFDM_LC_COMM_EXEC_STOP
);
1724 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_STOP
);
1729 status
= set_iqm_af(state
, false);
1733 /* powerdown to OFDM mode */
1734 if (set_power_mode
) {
1735 status
= ctrl_power_mode(state
, &power_mode
);
1741 pr_err("Error %d on %s\n", status
, __func__
);
1745 static int setoperation_mode(struct drxk_state
*state
,
1746 enum operation_mode o_mode
)
1752 Stop and power down previous standard
1753 TODO investigate total power down instead of partial
1754 power down depending on "previous" standard.
1757 /* disable HW lock indicator */
1758 status
= write16(state
, SCU_RAM_GPIO__A
,
1759 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
1763 /* Device is already at the required mode */
1764 if (state
->m_operation_mode
== o_mode
)
1767 switch (state
->m_operation_mode
) {
1768 /* OM_NONE was added for start up */
1772 status
= mpegts_stop(state
);
1775 status
= power_down_dvbt(state
, true);
1778 state
->m_operation_mode
= OM_NONE
;
1780 case OM_QAM_ITU_A
: /* fallthrough */
1782 status
= mpegts_stop(state
);
1785 status
= power_down_qam(state
);
1788 state
->m_operation_mode
= OM_NONE
;
1797 Power up new standard
1801 dprintk(1, ": DVB-T\n");
1802 state
->m_operation_mode
= o_mode
;
1803 status
= set_dvbt_standard(state
, o_mode
);
1807 case OM_QAM_ITU_A
: /* fallthrough */
1809 dprintk(1, ": DVB-C Annex %c\n",
1810 (state
->m_operation_mode
== OM_QAM_ITU_A
) ? 'A' : 'C');
1811 state
->m_operation_mode
= o_mode
;
1812 status
= set_qam_standard(state
, o_mode
);
1822 pr_err("Error %d on %s\n", status
, __func__
);
1826 static int start(struct drxk_state
*state
, s32 offset_freq
,
1827 s32 intermediate_frequency
)
1829 int status
= -EINVAL
;
1832 s32 offsetk_hz
= offset_freq
/ 1000;
1835 if (state
->m_drxk_state
!= DRXK_STOPPED
&&
1836 state
->m_drxk_state
!= DRXK_DTV_STARTED
)
1839 state
->m_b_mirror_freq_spect
= (state
->props
.inversion
== INVERSION_ON
);
1841 if (intermediate_frequency
< 0) {
1842 state
->m_b_mirror_freq_spect
= !state
->m_b_mirror_freq_spect
;
1843 intermediate_frequency
= -intermediate_frequency
;
1846 switch (state
->m_operation_mode
) {
1849 i_freqk_hz
= (intermediate_frequency
/ 1000);
1850 status
= set_qam(state
, i_freqk_hz
, offsetk_hz
);
1853 state
->m_drxk_state
= DRXK_DTV_STARTED
;
1856 i_freqk_hz
= (intermediate_frequency
/ 1000);
1857 status
= mpegts_stop(state
);
1860 status
= set_dvbt(state
, i_freqk_hz
, offsetk_hz
);
1863 status
= dvbt_start(state
);
1866 state
->m_drxk_state
= DRXK_DTV_STARTED
;
1873 pr_err("Error %d on %s\n", status
, __func__
);
1877 static int shut_down(struct drxk_state
*state
)
1885 static int get_lock_status(struct drxk_state
*state
, u32
*p_lock_status
)
1887 int status
= -EINVAL
;
1891 if (p_lock_status
== NULL
)
1894 *p_lock_status
= NOT_LOCKED
;
1896 /* define the SCU command code */
1897 switch (state
->m_operation_mode
) {
1901 status
= get_qam_lock_status(state
, p_lock_status
);
1904 status
= get_dvbt_lock_status(state
, p_lock_status
);
1907 pr_debug("Unsupported operation mode %d in %s\n",
1908 state
->m_operation_mode
, __func__
);
1913 pr_err("Error %d on %s\n", status
, __func__
);
1917 static int mpegts_start(struct drxk_state
*state
)
1921 u16 fec_oc_snc_mode
= 0;
1923 /* Allow OC to sync again */
1924 status
= read16(state
, FEC_OC_SNC_MODE__A
, &fec_oc_snc_mode
);
1927 fec_oc_snc_mode
&= ~FEC_OC_SNC_MODE_SHUTDOWN__M
;
1928 status
= write16(state
, FEC_OC_SNC_MODE__A
, fec_oc_snc_mode
);
1931 status
= write16(state
, FEC_OC_SNC_UNLOCK__A
, 1);
1934 pr_err("Error %d on %s\n", status
, __func__
);
1938 static int mpegts_dto_init(struct drxk_state
*state
)
1944 /* Rate integration settings */
1945 status
= write16(state
, FEC_OC_RCN_CTL_STEP_LO__A
, 0x0000);
1948 status
= write16(state
, FEC_OC_RCN_CTL_STEP_HI__A
, 0x000C);
1951 status
= write16(state
, FEC_OC_RCN_GAIN__A
, 0x000A);
1954 status
= write16(state
, FEC_OC_AVR_PARM_A__A
, 0x0008);
1957 status
= write16(state
, FEC_OC_AVR_PARM_B__A
, 0x0006);
1960 status
= write16(state
, FEC_OC_TMD_HI_MARGIN__A
, 0x0680);
1963 status
= write16(state
, FEC_OC_TMD_LO_MARGIN__A
, 0x0080);
1966 status
= write16(state
, FEC_OC_TMD_COUNT__A
, 0x03F4);
1970 /* Additional configuration */
1971 status
= write16(state
, FEC_OC_OCR_INVERT__A
, 0);
1974 status
= write16(state
, FEC_OC_SNC_LWM__A
, 2);
1977 status
= write16(state
, FEC_OC_SNC_HWM__A
, 12);
1980 pr_err("Error %d on %s\n", status
, __func__
);
1985 static int mpegts_dto_setup(struct drxk_state
*state
,
1986 enum operation_mode o_mode
)
1990 u16 fec_oc_reg_mode
= 0; /* FEC_OC_MODE register value */
1991 u16 fec_oc_reg_ipr_mode
= 0; /* FEC_OC_IPR_MODE register value */
1992 u16 fec_oc_dto_mode
= 0; /* FEC_OC_IPR_INVERT register value */
1993 u16 fec_oc_fct_mode
= 0; /* FEC_OC_IPR_INVERT register value */
1994 u16 fec_oc_dto_period
= 2; /* FEC_OC_IPR_INVERT register value */
1995 u16 fec_oc_dto_burst_len
= 188; /* FEC_OC_IPR_INVERT register value */
1996 u32 fec_oc_rcn_ctl_rate
= 0; /* FEC_OC_IPR_INVERT register value */
1997 u16 fec_oc_tmd_mode
= 0;
1998 u16 fec_oc_tmd_int_upd_rate
= 0;
1999 u32 max_bit_rate
= 0;
2000 bool static_clk
= false;
2004 /* Check insertion of the Reed-Solomon parity bytes */
2005 status
= read16(state
, FEC_OC_MODE__A
, &fec_oc_reg_mode
);
2008 status
= read16(state
, FEC_OC_IPR_MODE__A
, &fec_oc_reg_ipr_mode
);
2011 fec_oc_reg_mode
&= (~FEC_OC_MODE_PARITY__M
);
2012 fec_oc_reg_ipr_mode
&= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M
);
2013 if (state
->m_insert_rs_byte
) {
2014 /* enable parity symbol forward */
2015 fec_oc_reg_mode
|= FEC_OC_MODE_PARITY__M
;
2016 /* MVAL disable during parity bytes */
2017 fec_oc_reg_ipr_mode
|= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M
;
2018 /* TS burst length to 204 */
2019 fec_oc_dto_burst_len
= 204;
2022 /* Check serial or parallel output */
2023 fec_oc_reg_ipr_mode
&= (~(FEC_OC_IPR_MODE_SERIAL__M
));
2024 if (!state
->m_enable_parallel
) {
2025 /* MPEG data output is serial -> set ipr_mode[0] */
2026 fec_oc_reg_ipr_mode
|= FEC_OC_IPR_MODE_SERIAL__M
;
2031 max_bit_rate
= state
->m_dvbt_bitrate
;
2032 fec_oc_tmd_mode
= 3;
2033 fec_oc_rcn_ctl_rate
= 0xC00000;
2034 static_clk
= state
->m_dvbt_static_clk
;
2036 case OM_QAM_ITU_A
: /* fallthrough */
2038 fec_oc_tmd_mode
= 0x0004;
2039 fec_oc_rcn_ctl_rate
= 0xD2B4EE; /* good for >63 Mb/s */
2040 max_bit_rate
= state
->m_dvbc_bitrate
;
2041 static_clk
= state
->m_dvbc_static_clk
;
2045 } /* switch (standard) */
2049 /* Configure DTO's */
2053 /* Rational DTO for MCLK source (static MCLK rate),
2054 Dynamic DTO for optimal grouping
2055 (avoid intra-packet gaps),
2056 DTO offset enable to sync TS burst with MSTRT */
2057 fec_oc_dto_mode
= (FEC_OC_DTO_MODE_DYNAMIC__M
|
2058 FEC_OC_DTO_MODE_OFFSET_ENABLE__M
);
2059 fec_oc_fct_mode
= (FEC_OC_FCT_MODE_RAT_ENA__M
|
2060 FEC_OC_FCT_MODE_VIRT_ENA__M
);
2062 /* Check user defined bitrate */
2063 bit_rate
= max_bit_rate
;
2064 if (bit_rate
> 75900000UL) { /* max is 75.9 Mb/s */
2065 bit_rate
= 75900000UL;
2067 /* Rational DTO period:
2068 dto_period = (Fsys / bitrate) - 2
2070 result should be floored,
2071 to make sure >= requested bitrate
2073 fec_oc_dto_period
= (u16
) (((state
->m_sys_clock_freq
)
2074 * 1000) / bit_rate
);
2075 if (fec_oc_dto_period
<= 2)
2076 fec_oc_dto_period
= 0;
2078 fec_oc_dto_period
-= 2;
2079 fec_oc_tmd_int_upd_rate
= 8;
2081 /* (commonAttr->static_clk == false) => dynamic mode */
2082 fec_oc_dto_mode
= FEC_OC_DTO_MODE_DYNAMIC__M
;
2083 fec_oc_fct_mode
= FEC_OC_FCT_MODE__PRE
;
2084 fec_oc_tmd_int_upd_rate
= 5;
2087 /* Write appropriate registers with requested configuration */
2088 status
= write16(state
, FEC_OC_DTO_BURST_LEN__A
, fec_oc_dto_burst_len
);
2091 status
= write16(state
, FEC_OC_DTO_PERIOD__A
, fec_oc_dto_period
);
2094 status
= write16(state
, FEC_OC_DTO_MODE__A
, fec_oc_dto_mode
);
2097 status
= write16(state
, FEC_OC_FCT_MODE__A
, fec_oc_fct_mode
);
2100 status
= write16(state
, FEC_OC_MODE__A
, fec_oc_reg_mode
);
2103 status
= write16(state
, FEC_OC_IPR_MODE__A
, fec_oc_reg_ipr_mode
);
2107 /* Rate integration settings */
2108 status
= write32(state
, FEC_OC_RCN_CTL_RATE_LO__A
, fec_oc_rcn_ctl_rate
);
2111 status
= write16(state
, FEC_OC_TMD_INT_UPD_RATE__A
,
2112 fec_oc_tmd_int_upd_rate
);
2115 status
= write16(state
, FEC_OC_TMD_MODE__A
, fec_oc_tmd_mode
);
2118 pr_err("Error %d on %s\n", status
, __func__
);
2122 static int mpegts_configure_polarity(struct drxk_state
*state
)
2124 u16 fec_oc_reg_ipr_invert
= 0;
2126 /* Data mask for the output data byte */
2127 u16 invert_data_mask
=
2128 FEC_OC_IPR_INVERT_MD7__M
| FEC_OC_IPR_INVERT_MD6__M
|
2129 FEC_OC_IPR_INVERT_MD5__M
| FEC_OC_IPR_INVERT_MD4__M
|
2130 FEC_OC_IPR_INVERT_MD3__M
| FEC_OC_IPR_INVERT_MD2__M
|
2131 FEC_OC_IPR_INVERT_MD1__M
| FEC_OC_IPR_INVERT_MD0__M
;
2135 /* Control selective inversion of output bits */
2136 fec_oc_reg_ipr_invert
&= (~(invert_data_mask
));
2137 if (state
->m_invert_data
)
2138 fec_oc_reg_ipr_invert
|= invert_data_mask
;
2139 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MERR__M
));
2140 if (state
->m_invert_err
)
2141 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MERR__M
;
2142 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MSTRT__M
));
2143 if (state
->m_invert_str
)
2144 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MSTRT__M
;
2145 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MVAL__M
));
2146 if (state
->m_invert_val
)
2147 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MVAL__M
;
2148 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MCLK__M
));
2149 if (state
->m_invert_clk
)
2150 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MCLK__M
;
2152 return write16(state
, FEC_OC_IPR_INVERT__A
, fec_oc_reg_ipr_invert
);
2155 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2157 static int set_agc_rf(struct drxk_state
*state
,
2158 struct s_cfg_agc
*p_agc_cfg
, bool is_dtv
)
2160 int status
= -EINVAL
;
2162 struct s_cfg_agc
*p_if_agc_settings
;
2166 if (p_agc_cfg
== NULL
)
2169 switch (p_agc_cfg
->ctrl_mode
) {
2170 case DRXK_AGC_CTRL_AUTO
:
2171 /* Enable RF AGC DAC */
2172 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2175 data
&= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
;
2176 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2179 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2183 /* Enable SCU RF AGC loop */
2184 data
&= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M
;
2187 if (state
->m_rf_agc_pol
)
2188 data
|= SCU_RAM_AGC_CONFIG_INV_RF_POL__M
;
2190 data
&= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M
;
2191 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2195 /* Set speed (using complementary reduction value) */
2196 status
= read16(state
, SCU_RAM_AGC_KI_RED__A
, &data
);
2200 data
&= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M
;
2201 data
|= (~(p_agc_cfg
->speed
<<
2202 SCU_RAM_AGC_KI_RED_RAGC_RED__B
)
2203 & SCU_RAM_AGC_KI_RED_RAGC_RED__M
);
2205 status
= write16(state
, SCU_RAM_AGC_KI_RED__A
, data
);
2210 p_if_agc_settings
= &state
->m_dvbt_if_agc_cfg
;
2211 else if (is_qam(state
))
2212 p_if_agc_settings
= &state
->m_qam_if_agc_cfg
;
2214 p_if_agc_settings
= &state
->m_atv_if_agc_cfg
;
2215 if (p_if_agc_settings
== NULL
) {
2220 /* Set TOP, only if IF-AGC is in AUTO mode */
2221 if (p_if_agc_settings
->ctrl_mode
== DRXK_AGC_CTRL_AUTO
) {
2222 status
= write16(state
,
2223 SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
,
2229 /* Cut-Off current */
2230 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_HI_CO__A
,
2231 p_agc_cfg
->cut_off_current
);
2235 /* Max. output level */
2236 status
= write16(state
, SCU_RAM_AGC_RF_MAX__A
,
2237 p_agc_cfg
->max_output_level
);
2243 case DRXK_AGC_CTRL_USER
:
2244 /* Enable RF AGC DAC */
2245 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2248 data
&= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
;
2249 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2253 /* Disable SCU RF AGC loop */
2254 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2257 data
|= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M
;
2258 if (state
->m_rf_agc_pol
)
2259 data
|= SCU_RAM_AGC_CONFIG_INV_RF_POL__M
;
2261 data
&= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M
;
2262 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2266 /* SCU c.o.c. to 0, enabling full control range */
2267 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_HI_CO__A
, 0);
2271 /* Write value to output pin */
2272 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_HI__A
,
2273 p_agc_cfg
->output_level
);
2278 case DRXK_AGC_CTRL_OFF
:
2279 /* Disable RF AGC DAC */
2280 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2283 data
|= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
;
2284 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2288 /* Disable SCU RF AGC loop */
2289 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2292 data
|= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M
;
2293 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2304 pr_err("Error %d on %s\n", status
, __func__
);
2308 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2310 static int set_agc_if(struct drxk_state
*state
,
2311 struct s_cfg_agc
*p_agc_cfg
, bool is_dtv
)
2315 struct s_cfg_agc
*p_rf_agc_settings
;
2319 switch (p_agc_cfg
->ctrl_mode
) {
2320 case DRXK_AGC_CTRL_AUTO
:
2322 /* Enable IF AGC DAC */
2323 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2326 data
&= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
;
2327 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2331 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2335 /* Enable SCU IF AGC loop */
2336 data
&= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M
;
2339 if (state
->m_if_agc_pol
)
2340 data
|= SCU_RAM_AGC_CONFIG_INV_IF_POL__M
;
2342 data
&= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M
;
2343 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2347 /* Set speed (using complementary reduction value) */
2348 status
= read16(state
, SCU_RAM_AGC_KI_RED__A
, &data
);
2351 data
&= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M
;
2352 data
|= (~(p_agc_cfg
->speed
<<
2353 SCU_RAM_AGC_KI_RED_IAGC_RED__B
)
2354 & SCU_RAM_AGC_KI_RED_IAGC_RED__M
);
2356 status
= write16(state
, SCU_RAM_AGC_KI_RED__A
, data
);
2361 p_rf_agc_settings
= &state
->m_qam_rf_agc_cfg
;
2363 p_rf_agc_settings
= &state
->m_atv_rf_agc_cfg
;
2364 if (p_rf_agc_settings
== NULL
)
2367 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
,
2368 p_rf_agc_settings
->top
);
2373 case DRXK_AGC_CTRL_USER
:
2375 /* Enable IF AGC DAC */
2376 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2379 data
&= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
;
2380 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2384 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2388 /* Disable SCU IF AGC loop */
2389 data
|= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M
;
2392 if (state
->m_if_agc_pol
)
2393 data
|= SCU_RAM_AGC_CONFIG_INV_IF_POL__M
;
2395 data
&= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M
;
2396 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2400 /* Write value to output pin */
2401 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
,
2402 p_agc_cfg
->output_level
);
2407 case DRXK_AGC_CTRL_OFF
:
2409 /* Disable If AGC DAC */
2410 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2413 data
|= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
;
2414 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2418 /* Disable SCU IF AGC loop */
2419 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2422 data
|= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M
;
2423 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2427 } /* switch (agcSettingsIf->ctrl_mode) */
2429 /* always set the top to support
2430 configurations without if-loop */
2431 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT_MIN__A
, p_agc_cfg
->top
);
2434 pr_err("Error %d on %s\n", status
, __func__
);
2438 static int get_qam_signal_to_noise(struct drxk_state
*state
,
2439 s32
*p_signal_to_noise
)
2442 u16 qam_sl_err_power
= 0; /* accum. error between
2443 raw and sliced symbols */
2444 u32 qam_sl_sig_power
= 0; /* used for MER, depends of
2446 u32 qam_sl_mer
= 0; /* QAM MER */
2450 /* MER calculation */
2452 /* get the register value needed for MER */
2453 status
= read16(state
, QAM_SL_ERR_POWER__A
, &qam_sl_err_power
);
2455 pr_err("Error %d on %s\n", status
, __func__
);
2459 switch (state
->props
.modulation
) {
2461 qam_sl_sig_power
= DRXK_QAM_SL_SIG_POWER_QAM16
<< 2;
2464 qam_sl_sig_power
= DRXK_QAM_SL_SIG_POWER_QAM32
<< 2;
2467 qam_sl_sig_power
= DRXK_QAM_SL_SIG_POWER_QAM64
<< 2;
2470 qam_sl_sig_power
= DRXK_QAM_SL_SIG_POWER_QAM128
<< 2;
2474 qam_sl_sig_power
= DRXK_QAM_SL_SIG_POWER_QAM256
<< 2;
2478 if (qam_sl_err_power
> 0) {
2479 qam_sl_mer
= log10times100(qam_sl_sig_power
) -
2480 log10times100((u32
) qam_sl_err_power
);
2482 *p_signal_to_noise
= qam_sl_mer
;
2487 static int get_dvbt_signal_to_noise(struct drxk_state
*state
,
2488 s32
*p_signal_to_noise
)
2492 u32 eq_reg_td_sqr_err_i
= 0;
2493 u32 eq_reg_td_sqr_err_q
= 0;
2494 u16 eq_reg_td_sqr_err_exp
= 0;
2495 u16 eq_reg_td_tps_pwr_ofs
= 0;
2496 u16 eq_reg_td_req_smb_cnt
= 0;
2503 u16 transmission_params
= 0;
2507 status
= read16(state
, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A
,
2508 &eq_reg_td_tps_pwr_ofs
);
2511 status
= read16(state
, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A
,
2512 &eq_reg_td_req_smb_cnt
);
2515 status
= read16(state
, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A
,
2516 &eq_reg_td_sqr_err_exp
);
2519 status
= read16(state
, OFDM_EQ_TOP_TD_SQR_ERR_I__A
,
2523 /* Extend SQR_ERR_I operational range */
2524 eq_reg_td_sqr_err_i
= (u32
) reg_data
;
2525 if ((eq_reg_td_sqr_err_exp
> 11) &&
2526 (eq_reg_td_sqr_err_i
< 0x00000FFFUL
)) {
2527 eq_reg_td_sqr_err_i
+= 0x00010000UL
;
2529 status
= read16(state
, OFDM_EQ_TOP_TD_SQR_ERR_Q__A
, ®_data
);
2532 /* Extend SQR_ERR_Q operational range */
2533 eq_reg_td_sqr_err_q
= (u32
) reg_data
;
2534 if ((eq_reg_td_sqr_err_exp
> 11) &&
2535 (eq_reg_td_sqr_err_q
< 0x00000FFFUL
))
2536 eq_reg_td_sqr_err_q
+= 0x00010000UL
;
2538 status
= read16(state
, OFDM_SC_RA_RAM_OP_PARAM__A
,
2539 &transmission_params
);
2543 /* Check input data for MER */
2545 /* MER calculation (in 0.1 dB) without math.h */
2546 if ((eq_reg_td_tps_pwr_ofs
== 0) || (eq_reg_td_req_smb_cnt
== 0))
2548 else if ((eq_reg_td_sqr_err_i
+ eq_reg_td_sqr_err_q
) == 0) {
2549 /* No error at all, this must be the HW reset value
2550 * Apparently no first measurement yet
2554 sqr_err_iq
= (eq_reg_td_sqr_err_i
+ eq_reg_td_sqr_err_q
) <<
2555 eq_reg_td_sqr_err_exp
;
2556 if ((transmission_params
&
2557 OFDM_SC_RA_RAM_OP_PARAM_MODE__M
)
2558 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K
)
2563 /* IMER = 100 * log10 (x)
2564 where x = (eq_reg_td_tps_pwr_ofs^2 *
2565 eq_reg_td_req_smb_cnt * tps_cnt)/sqr_err_iq
2568 where a = 100 * log10 (eq_reg_td_tps_pwr_ofs^2)
2569 b = 100 * log10 (eq_reg_td_req_smb_cnt * tps_cnt)
2570 c = 100 * log10 (sqr_err_iq)
2573 /* log(x) x = 9bits * 9bits->18 bits */
2574 a
= log10times100(eq_reg_td_tps_pwr_ofs
*
2575 eq_reg_td_tps_pwr_ofs
);
2576 /* log(x) x = 16bits * 7bits->23 bits */
2577 b
= log10times100(eq_reg_td_req_smb_cnt
* tps_cnt
);
2578 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2579 c
= log10times100(sqr_err_iq
);
2583 *p_signal_to_noise
= i_mer
;
2587 pr_err("Error %d on %s\n", status
, __func__
);
2591 static int get_signal_to_noise(struct drxk_state
*state
, s32
*p_signal_to_noise
)
2595 *p_signal_to_noise
= 0;
2596 switch (state
->m_operation_mode
) {
2598 return get_dvbt_signal_to_noise(state
, p_signal_to_noise
);
2601 return get_qam_signal_to_noise(state
, p_signal_to_noise
);
2609 static int get_dvbt_quality(struct drxk_state
*state
, s32
*p_quality
)
2611 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2616 static s32 QE_SN
[] = {
2622 108, /* 16-QAM 1/2 */
2623 131, /* 16-QAM 2/3 */
2624 146, /* 16-QAM 3/4 */
2625 156, /* 16-QAM 5/6 */
2626 160, /* 16-QAM 7/8 */
2627 165, /* 64-QAM 1/2 */
2628 187, /* 64-QAM 2/3 */
2629 202, /* 64-QAM 3/4 */
2630 216, /* 64-QAM 5/6 */
2631 225, /* 64-QAM 7/8 */
2637 s32 signal_to_noise
= 0;
2638 u16 constellation
= 0;
2640 u32 signal_to_noise_rel
;
2643 status
= get_dvbt_signal_to_noise(state
, &signal_to_noise
);
2646 status
= read16(state
, OFDM_EQ_TOP_TD_TPS_CONST__A
,
2650 constellation
&= OFDM_EQ_TOP_TD_TPS_CONST__M
;
2652 status
= read16(state
, OFDM_EQ_TOP_TD_TPS_CODE_HP__A
,
2656 code_rate
&= OFDM_EQ_TOP_TD_TPS_CODE_HP__M
;
2658 if (constellation
> OFDM_EQ_TOP_TD_TPS_CONST_64QAM
||
2659 code_rate
> OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8
)
2661 signal_to_noise_rel
= signal_to_noise
-
2662 QE_SN
[constellation
* 5 + code_rate
];
2665 if (signal_to_noise_rel
< -70)
2667 else if (signal_to_noise_rel
< 30)
2668 *p_quality
= ((signal_to_noise_rel
+ 70) *
2671 *p_quality
= ber_quality
;
2676 static int get_dvbc_quality(struct drxk_state
*state
, s32
*p_quality
)
2684 u32 signal_to_noise
= 0;
2685 u32 ber_quality
= 100;
2686 u32 signal_to_noise_rel
= 0;
2688 status
= get_qam_signal_to_noise(state
, &signal_to_noise
);
2692 switch (state
->props
.modulation
) {
2694 signal_to_noise_rel
= signal_to_noise
- 200;
2697 signal_to_noise_rel
= signal_to_noise
- 230;
2698 break; /* Not in NorDig */
2700 signal_to_noise_rel
= signal_to_noise
- 260;
2703 signal_to_noise_rel
= signal_to_noise
- 290;
2707 signal_to_noise_rel
= signal_to_noise
- 320;
2711 if (signal_to_noise_rel
< -70)
2713 else if (signal_to_noise_rel
< 30)
2714 *p_quality
= ((signal_to_noise_rel
+ 70) *
2717 *p_quality
= ber_quality
;
2723 static int get_quality(struct drxk_state
*state
, s32
*p_quality
)
2727 switch (state
->m_operation_mode
) {
2729 return get_dvbt_quality(state
, p_quality
);
2731 return get_dvbc_quality(state
, p_quality
);
2740 /* Free data ram in SIO HI */
2741 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2742 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2744 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2745 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2746 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2747 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2749 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2750 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2751 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2753 static int ConfigureI2CBridge(struct drxk_state
*state
, bool b_enable_bridge
)
2755 int status
= -EINVAL
;
2759 if (state
->m_drxk_state
== DRXK_UNINITIALIZED
)
2761 if (state
->m_drxk_state
== DRXK_POWERED_DOWN
)
2764 if (state
->no_i2c_bridge
)
2767 status
= write16(state
, SIO_HI_RA_RAM_PAR_1__A
,
2768 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY
);
2771 if (b_enable_bridge
) {
2772 status
= write16(state
, SIO_HI_RA_RAM_PAR_2__A
,
2773 SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED
);
2777 status
= write16(state
, SIO_HI_RA_RAM_PAR_2__A
,
2778 SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN
);
2783 status
= hi_command(state
, SIO_HI_RA_RAM_CMD_BRDCTRL
, NULL
);
2787 pr_err("Error %d on %s\n", status
, __func__
);
2791 static int set_pre_saw(struct drxk_state
*state
,
2792 struct s_cfg_pre_saw
*p_pre_saw_cfg
)
2794 int status
= -EINVAL
;
2798 if ((p_pre_saw_cfg
== NULL
)
2799 || (p_pre_saw_cfg
->reference
> IQM_AF_PDREF__M
))
2802 status
= write16(state
, IQM_AF_PDREF__A
, p_pre_saw_cfg
->reference
);
2805 pr_err("Error %d on %s\n", status
, __func__
);
2809 static int bl_direct_cmd(struct drxk_state
*state
, u32 target_addr
,
2810 u16 rom_offset
, u16 nr_of_elements
, u32 time_out
)
2813 u16 offset
= (u16
) ((target_addr
>> 0) & 0x00FFFF);
2814 u16 blockbank
= (u16
) ((target_addr
>> 16) & 0x000FFF);
2820 mutex_lock(&state
->mutex
);
2821 status
= write16(state
, SIO_BL_MODE__A
, SIO_BL_MODE_DIRECT
);
2824 status
= write16(state
, SIO_BL_TGT_HDR__A
, blockbank
);
2827 status
= write16(state
, SIO_BL_TGT_ADDR__A
, offset
);
2830 status
= write16(state
, SIO_BL_SRC_ADDR__A
, rom_offset
);
2833 status
= write16(state
, SIO_BL_SRC_LEN__A
, nr_of_elements
);
2836 status
= write16(state
, SIO_BL_ENABLE__A
, SIO_BL_ENABLE_ON
);
2840 end
= jiffies
+ msecs_to_jiffies(time_out
);
2842 status
= read16(state
, SIO_BL_STATUS__A
, &bl_status
);
2845 } while ((bl_status
== 0x1) && time_is_after_jiffies(end
));
2846 if (bl_status
== 0x1) {
2847 pr_err("SIO not ready\n");
2853 pr_err("Error %d on %s\n", status
, __func__
);
2855 mutex_unlock(&state
->mutex
);
2860 static int adc_sync_measurement(struct drxk_state
*state
, u16
*count
)
2867 /* start measurement */
2868 status
= write16(state
, IQM_AF_COMM_EXEC__A
, IQM_AF_COMM_EXEC_ACTIVE
);
2871 status
= write16(state
, IQM_AF_START_LOCK__A
, 1);
2876 status
= read16(state
, IQM_AF_PHASE0__A
, &data
);
2880 *count
= *count
+ 1;
2881 status
= read16(state
, IQM_AF_PHASE1__A
, &data
);
2885 *count
= *count
+ 1;
2886 status
= read16(state
, IQM_AF_PHASE2__A
, &data
);
2890 *count
= *count
+ 1;
2894 pr_err("Error %d on %s\n", status
, __func__
);
2898 static int adc_synchronization(struct drxk_state
*state
)
2905 status
= adc_sync_measurement(state
, &count
);
2910 /* Try sampling on a different edge */
2913 status
= read16(state
, IQM_AF_CLKNEG__A
, &clk_neg
);
2916 if ((clk_neg
& IQM_AF_CLKNEG_CLKNEGDATA__M
) ==
2917 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS
) {
2918 clk_neg
&= (~(IQM_AF_CLKNEG_CLKNEGDATA__M
));
2920 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG
;
2922 clk_neg
&= (~(IQM_AF_CLKNEG_CLKNEGDATA__M
));
2924 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS
;
2926 status
= write16(state
, IQM_AF_CLKNEG__A
, clk_neg
);
2929 status
= adc_sync_measurement(state
, &count
);
2938 pr_err("Error %d on %s\n", status
, __func__
);
2942 static int set_frequency_shifter(struct drxk_state
*state
,
2943 u16 intermediate_freqk_hz
,
2944 s32 tuner_freq_offset
, bool is_dtv
)
2946 bool select_pos_image
= false;
2947 u32 rf_freq_residual
= tuner_freq_offset
;
2948 u32 fm_frequency_shift
= 0;
2949 bool tuner_mirror
= !state
->m_b_mirror_freq_spect
;
2954 u32 sampling_frequency
= (u32
) (state
->m_sys_clock_freq
/ 3);
2955 u32 frequency_shift
;
2956 bool image_to_select
;
2961 Program frequency shifter
2962 No need to account for mirroring on RF
2965 if ((state
->m_operation_mode
== OM_QAM_ITU_A
) ||
2966 (state
->m_operation_mode
== OM_QAM_ITU_C
) ||
2967 (state
->m_operation_mode
== OM_DVBT
))
2968 select_pos_image
= true;
2970 select_pos_image
= false;
2973 /* tuner doesn't mirror */
2974 if_freq_actual
= intermediate_freqk_hz
+
2975 rf_freq_residual
+ fm_frequency_shift
;
2978 if_freq_actual
= intermediate_freqk_hz
-
2979 rf_freq_residual
- fm_frequency_shift
;
2980 if (if_freq_actual
> sampling_frequency
/ 2) {
2982 adc_freq
= sampling_frequency
- if_freq_actual
;
2985 /* adc doesn't mirror */
2986 adc_freq
= if_freq_actual
;
2990 frequency_shift
= adc_freq
;
2991 image_to_select
= state
->m_rfmirror
^ tuner_mirror
^
2992 adc_flip
^ select_pos_image
;
2993 state
->m_iqm_fs_rate_ofs
=
2994 Frac28a((frequency_shift
), sampling_frequency
);
2996 if (image_to_select
)
2997 state
->m_iqm_fs_rate_ofs
= ~state
->m_iqm_fs_rate_ofs
+ 1;
2999 /* Program frequency shifter with tuner offset compensation */
3000 /* frequency_shift += tuner_freq_offset; TODO */
3001 status
= write32(state
, IQM_FS_RATE_OFS_LO__A
,
3002 state
->m_iqm_fs_rate_ofs
);
3004 pr_err("Error %d on %s\n", status
, __func__
);
3008 static int init_agc(struct drxk_state
*state
, bool is_dtv
)
3011 u16 ingain_tgt_min
= 0;
3012 u16 ingain_tgt_max
= 0;
3014 u16 clp_sum_min
= 0;
3016 u16 sns_sum_min
= 0;
3017 u16 sns_sum_max
= 0;
3018 u16 clp_sum_max
= 0;
3020 u16 ki_innergain_min
= 0;
3021 u16 if_iaccu_hi_tgt
= 0;
3022 u16 if_iaccu_hi_tgt_min
= 0;
3023 u16 if_iaccu_hi_tgt_max
= 0;
3025 u16 fast_clp_ctrl_delay
= 0;
3026 u16 clp_ctrl_mode
= 0;
3031 /* Common settings */
3033 if_iaccu_hi_tgt_min
= 2047;
3037 /* AGCInit() not available for DVBT; init done in microcode */
3038 if (!is_qam(state
)) {
3039 pr_err("%s: mode %d is not DVB-C\n",
3040 __func__
, state
->m_operation_mode
);
3044 /* FIXME: Analog TV AGC require different settings */
3046 /* Standard specific settings */
3048 clp_dir_to
= (u16
) -9;
3051 sns_dir_to
= (u16
) -9;
3052 ki_innergain_min
= (u16
) -1030;
3053 if_iaccu_hi_tgt_max
= 0x2380;
3054 if_iaccu_hi_tgt
= 0x2380;
3055 ingain_tgt_min
= 0x0511;
3056 ingain_tgt
= 0x0511;
3057 ingain_tgt_max
= 5119;
3058 fast_clp_ctrl_delay
= state
->m_qam_if_agc_cfg
.fast_clip_ctrl_delay
;
3060 status
= write16(state
, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A
,
3061 fast_clp_ctrl_delay
);
3065 status
= write16(state
, SCU_RAM_AGC_CLP_CTRL_MODE__A
, clp_ctrl_mode
);
3068 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT__A
, ingain_tgt
);
3071 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT_MIN__A
, ingain_tgt_min
);
3074 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT_MAX__A
, ingain_tgt_max
);
3077 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A
,
3078 if_iaccu_hi_tgt_min
);
3081 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
,
3082 if_iaccu_hi_tgt_max
);
3085 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI__A
, 0);
3088 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_LO__A
, 0);
3091 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_HI__A
, 0);
3094 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_LO__A
, 0);
3097 status
= write16(state
, SCU_RAM_AGC_CLP_SUM_MAX__A
, clp_sum_max
);
3100 status
= write16(state
, SCU_RAM_AGC_SNS_SUM_MAX__A
, sns_sum_max
);
3104 status
= write16(state
, SCU_RAM_AGC_KI_INNERGAIN_MIN__A
,
3108 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT__A
,
3112 status
= write16(state
, SCU_RAM_AGC_CLP_CYCLEN__A
, clp_cyclen
);
3116 status
= write16(state
, SCU_RAM_AGC_RF_SNS_DEV_MAX__A
, 1023);
3119 status
= write16(state
, SCU_RAM_AGC_RF_SNS_DEV_MIN__A
, (u16
) -1023);
3122 status
= write16(state
, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A
, 50);
3126 status
= write16(state
, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A
, 20);
3129 status
= write16(state
, SCU_RAM_AGC_CLP_SUM_MIN__A
, clp_sum_min
);
3132 status
= write16(state
, SCU_RAM_AGC_SNS_SUM_MIN__A
, sns_sum_min
);
3135 status
= write16(state
, SCU_RAM_AGC_CLP_DIR_TO__A
, clp_dir_to
);
3138 status
= write16(state
, SCU_RAM_AGC_SNS_DIR_TO__A
, sns_dir_to
);
3141 status
= write16(state
, SCU_RAM_AGC_KI_MINGAIN__A
, 0x7fff);
3144 status
= write16(state
, SCU_RAM_AGC_KI_MAXGAIN__A
, 0x0);
3147 status
= write16(state
, SCU_RAM_AGC_KI_MIN__A
, 0x0117);
3150 status
= write16(state
, SCU_RAM_AGC_KI_MAX__A
, 0x0657);
3153 status
= write16(state
, SCU_RAM_AGC_CLP_SUM__A
, 0);
3156 status
= write16(state
, SCU_RAM_AGC_CLP_CYCCNT__A
, 0);
3159 status
= write16(state
, SCU_RAM_AGC_CLP_DIR_WD__A
, 0);
3162 status
= write16(state
, SCU_RAM_AGC_CLP_DIR_STP__A
, 1);
3165 status
= write16(state
, SCU_RAM_AGC_SNS_SUM__A
, 0);
3168 status
= write16(state
, SCU_RAM_AGC_SNS_CYCCNT__A
, 0);
3171 status
= write16(state
, SCU_RAM_AGC_SNS_DIR_WD__A
, 0);
3174 status
= write16(state
, SCU_RAM_AGC_SNS_DIR_STP__A
, 1);
3177 status
= write16(state
, SCU_RAM_AGC_SNS_CYCLEN__A
, 500);
3180 status
= write16(state
, SCU_RAM_AGC_KI_CYCLEN__A
, 500);
3184 /* Initialize inner-loop KI gain factors */
3185 status
= read16(state
, SCU_RAM_AGC_KI__A
, &data
);
3190 data
&= ~SCU_RAM_AGC_KI_RF__M
;
3191 data
|= (DRXK_KI_RAGC_QAM
<< SCU_RAM_AGC_KI_RF__B
);
3192 data
&= ~SCU_RAM_AGC_KI_IF__M
;
3193 data
|= (DRXK_KI_IAGC_QAM
<< SCU_RAM_AGC_KI_IF__B
);
3195 status
= write16(state
, SCU_RAM_AGC_KI__A
, data
);
3198 pr_err("Error %d on %s\n", status
, __func__
);
3202 static int dvbtqam_get_acc_pkt_err(struct drxk_state
*state
, u16
*packet_err
)
3207 if (packet_err
== NULL
)
3208 status
= write16(state
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, 0);
3210 status
= read16(state
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
,
3213 pr_err("Error %d on %s\n", status
, __func__
);
3217 static int dvbt_sc_command(struct drxk_state
*state
,
3218 u16 cmd
, u16 subcmd
,
3219 u16 param0
, u16 param1
, u16 param2
,
3220 u16 param3
, u16 param4
)
3229 status
= read16(state
, OFDM_SC_COMM_EXEC__A
, &sc_exec
);
3231 /* SC is not running */
3237 /* Wait until sc is ready to receive command */
3240 usleep_range(1000, 2000);
3241 status
= read16(state
, OFDM_SC_RA_RAM_CMD__A
, &cur_cmd
);
3243 } while ((cur_cmd
!= 0) && (retry_cnt
< DRXK_MAX_RETRIES
));
3244 if (retry_cnt
>= DRXK_MAX_RETRIES
&& (status
< 0))
3247 /* Write sub-command */
3249 /* All commands using sub-cmd */
3250 case OFDM_SC_RA_RAM_CMD_PROC_START
:
3251 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM
:
3252 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM
:
3253 status
= write16(state
, OFDM_SC_RA_RAM_CMD_ADDR__A
, subcmd
);
3262 /* Write needed parameters and the command */
3265 /* All commands using 5 parameters */
3266 /* All commands using 4 parameters */
3267 /* All commands using 3 parameters */
3268 /* All commands using 2 parameters */
3269 case OFDM_SC_RA_RAM_CMD_PROC_START
:
3270 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM
:
3271 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM
:
3272 status
|= write16(state
, OFDM_SC_RA_RAM_PARAM1__A
, param1
);
3273 /* All commands using 1 parameters */
3275 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING
:
3276 case OFDM_SC_RA_RAM_CMD_USER_IO
:
3277 status
|= write16(state
, OFDM_SC_RA_RAM_PARAM0__A
, param0
);
3278 /* All commands using 0 parameters */
3280 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM
:
3281 case OFDM_SC_RA_RAM_CMD_NULL
:
3283 status
|= write16(state
, OFDM_SC_RA_RAM_CMD__A
, cmd
);
3286 /* Unknown command */
3292 /* Wait until sc is ready processing command */
3295 usleep_range(1000, 2000);
3296 status
= read16(state
, OFDM_SC_RA_RAM_CMD__A
, &cur_cmd
);
3298 } while ((cur_cmd
!= 0) && (retry_cnt
< DRXK_MAX_RETRIES
));
3299 if (retry_cnt
>= DRXK_MAX_RETRIES
&& (status
< 0))
3302 /* Check for illegal cmd */
3303 status
= read16(state
, OFDM_SC_RA_RAM_CMD_ADDR__A
, &err_code
);
3304 if (err_code
== 0xFFFF) {
3305 /* illegal command */
3311 /* Retrieve results parameters from SC */
3313 /* All commands yielding 5 results */
3314 /* All commands yielding 4 results */
3315 /* All commands yielding 3 results */
3316 /* All commands yielding 2 results */
3317 /* All commands yielding 1 result */
3318 case OFDM_SC_RA_RAM_CMD_USER_IO
:
3319 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM
:
3320 status
= read16(state
, OFDM_SC_RA_RAM_PARAM0__A
, &(param0
));
3321 /* All commands yielding 0 results */
3322 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING
:
3323 case OFDM_SC_RA_RAM_CMD_SET_TIMER
:
3324 case OFDM_SC_RA_RAM_CMD_PROC_START
:
3325 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM
:
3326 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM
:
3327 case OFDM_SC_RA_RAM_CMD_NULL
:
3330 /* Unknown command */
3333 } /* switch (cmd->cmd) */
3336 pr_err("Error %d on %s\n", status
, __func__
);
3340 static int power_up_dvbt(struct drxk_state
*state
)
3342 enum drx_power_mode power_mode
= DRX_POWER_UP
;
3346 status
= ctrl_power_mode(state
, &power_mode
);
3348 pr_err("Error %d on %s\n", status
, __func__
);
3352 static int dvbt_ctrl_set_inc_enable(struct drxk_state
*state
, bool *enabled
)
3358 status
= write16(state
, IQM_CF_BYPASSDET__A
, 0);
3360 status
= write16(state
, IQM_CF_BYPASSDET__A
, 1);
3362 pr_err("Error %d on %s\n", status
, __func__
);
3366 #define DEFAULT_FR_THRES_8K 4000
3367 static int dvbt_ctrl_set_fr_enable(struct drxk_state
*state
, bool *enabled
)
3374 /* write mask to 1 */
3375 status
= write16(state
, OFDM_SC_RA_RAM_FR_THRES_8K__A
,
3376 DEFAULT_FR_THRES_8K
);
3378 /* write mask to 0 */
3379 status
= write16(state
, OFDM_SC_RA_RAM_FR_THRES_8K__A
, 0);
3382 pr_err("Error %d on %s\n", status
, __func__
);
3387 static int dvbt_ctrl_set_echo_threshold(struct drxk_state
*state
,
3388 struct drxk_cfg_dvbt_echo_thres_t
*echo_thres
)
3394 status
= read16(state
, OFDM_SC_RA_RAM_ECHO_THRES__A
, &data
);
3398 switch (echo_thres
->fft_mode
) {
3399 case DRX_FFTMODE_2K
:
3400 data
&= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M
;
3401 data
|= ((echo_thres
->threshold
<<
3402 OFDM_SC_RA_RAM_ECHO_THRES_2K__B
)
3403 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M
));
3405 case DRX_FFTMODE_8K
:
3406 data
&= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M
;
3407 data
|= ((echo_thres
->threshold
<<
3408 OFDM_SC_RA_RAM_ECHO_THRES_8K__B
)
3409 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M
));
3415 status
= write16(state
, OFDM_SC_RA_RAM_ECHO_THRES__A
, data
);
3418 pr_err("Error %d on %s\n", status
, __func__
);
3422 static int dvbt_ctrl_set_sqi_speed(struct drxk_state
*state
,
3423 enum drxk_cfg_dvbt_sqi_speed
*speed
)
3425 int status
= -EINVAL
;
3430 case DRXK_DVBT_SQI_SPEED_FAST
:
3431 case DRXK_DVBT_SQI_SPEED_MEDIUM
:
3432 case DRXK_DVBT_SQI_SPEED_SLOW
:
3437 status
= write16(state
, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A
,
3441 pr_err("Error %d on %s\n", status
, __func__
);
3445 /*============================================================================*/
3448 * \brief Activate DVBT specific presets
3449 * \param demod instance of demodulator.
3450 * \return DRXStatus_t.
3452 * Called in DVBTSetStandard
3455 static int dvbt_activate_presets(struct drxk_state
*state
)
3458 bool setincenable
= false;
3459 bool setfrenable
= true;
3461 struct drxk_cfg_dvbt_echo_thres_t echo_thres2k
= { 0, DRX_FFTMODE_2K
};
3462 struct drxk_cfg_dvbt_echo_thres_t echo_thres8k
= { 0, DRX_FFTMODE_8K
};
3465 status
= dvbt_ctrl_set_inc_enable(state
, &setincenable
);
3468 status
= dvbt_ctrl_set_fr_enable(state
, &setfrenable
);
3471 status
= dvbt_ctrl_set_echo_threshold(state
, &echo_thres2k
);
3474 status
= dvbt_ctrl_set_echo_threshold(state
, &echo_thres8k
);
3477 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT_MAX__A
,
3478 state
->m_dvbt_if_agc_cfg
.ingain_tgt_max
);
3481 pr_err("Error %d on %s\n", status
, __func__
);
3485 /*============================================================================*/
3488 * \brief Initialize channelswitch-independent settings for DVBT.
3489 * \param demod instance of demodulator.
3490 * \return DRXStatus_t.
3492 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3493 * the DVB-T taps from the drxk_filters.h are used.
3495 static int set_dvbt_standard(struct drxk_state
*state
,
3496 enum operation_mode o_mode
)
3504 power_up_dvbt(state
);
3505 /* added antenna switch */
3506 switch_antenna_to_dvbt(state
);
3507 /* send OFDM reset command */
3508 status
= scu_command(state
,
3509 SCU_RAM_COMMAND_STANDARD_OFDM
3510 | SCU_RAM_COMMAND_CMD_DEMOD_RESET
,
3511 0, NULL
, 1, &cmd_result
);
3515 /* send OFDM setenv command */
3516 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_OFDM
3517 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV
,
3518 0, NULL
, 1, &cmd_result
);
3522 /* reset datapath for OFDM, processors first */
3523 status
= write16(state
, OFDM_SC_COMM_EXEC__A
, OFDM_SC_COMM_EXEC_STOP
);
3526 status
= write16(state
, OFDM_LC_COMM_EXEC__A
, OFDM_LC_COMM_EXEC_STOP
);
3529 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_STOP
);
3534 /* synchronize on ofdstate->m_festart */
3535 status
= write16(state
, IQM_AF_UPD_SEL__A
, 1);
3538 /* window size for clipping ADC detection */
3539 status
= write16(state
, IQM_AF_CLP_LEN__A
, 0);
3542 /* window size for for sense pre-SAW detection */
3543 status
= write16(state
, IQM_AF_SNS_LEN__A
, 0);
3546 /* sense threshold for sense pre-SAW detection */
3547 status
= write16(state
, IQM_AF_AMUX__A
, IQM_AF_AMUX_SIGNAL2ADC
);
3550 status
= set_iqm_af(state
, true);
3554 status
= write16(state
, IQM_AF_AGC_RF__A
, 0);
3558 /* Impulse noise cruncher setup */
3559 status
= write16(state
, IQM_AF_INC_LCT__A
, 0); /* crunch in IQM_CF */
3562 status
= write16(state
, IQM_CF_DET_LCT__A
, 0); /* detect in IQM_CF */
3565 status
= write16(state
, IQM_CF_WND_LEN__A
, 3); /* peak detector window length */
3569 status
= write16(state
, IQM_RC_STRETCH__A
, 16);
3572 status
= write16(state
, IQM_CF_OUT_ENA__A
, 0x4); /* enable output 2 */
3575 status
= write16(state
, IQM_CF_DS_ENA__A
, 0x4); /* decimate output 2 */
3578 status
= write16(state
, IQM_CF_SCALE__A
, 1600);
3581 status
= write16(state
, IQM_CF_SCALE_SH__A
, 0);
3585 /* virtual clipping threshold for clipping ADC detection */
3586 status
= write16(state
, IQM_AF_CLP_TH__A
, 448);
3589 status
= write16(state
, IQM_CF_DATATH__A
, 495); /* crunching threshold */
3593 status
= bl_chain_cmd(state
, DRXK_BL_ROM_OFFSET_TAPS_DVBT
,
3594 DRXK_BLCC_NR_ELEMENTS_TAPS
, DRXK_BLC_TIMEOUT
);
3598 status
= write16(state
, IQM_CF_PKDTH__A
, 2); /* peak detector threshold */
3601 status
= write16(state
, IQM_CF_POW_MEAS_LEN__A
, 2);
3604 /* enable power measurement interrupt */
3605 status
= write16(state
, IQM_CF_COMM_INT_MSK__A
, 1);
3608 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_ACTIVE
);
3612 /* IQM will not be reset from here, sync ADC and update/init AGC */
3613 status
= adc_synchronization(state
);
3616 status
= set_pre_saw(state
, &state
->m_dvbt_pre_saw_cfg
);
3620 /* Halt SCU to enable safe non-atomic accesses */
3621 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_HOLD
);
3625 status
= set_agc_rf(state
, &state
->m_dvbt_rf_agc_cfg
, true);
3628 status
= set_agc_if(state
, &state
->m_dvbt_if_agc_cfg
, true);
3632 /* Set Noise Estimation notch width and enable DC fix */
3633 status
= read16(state
, OFDM_SC_RA_RAM_CONFIG__A
, &data
);
3636 data
|= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M
;
3637 status
= write16(state
, OFDM_SC_RA_RAM_CONFIG__A
, data
);
3641 /* Activate SCU to enable SCU commands */
3642 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
3646 if (!state
->m_drxk_a3_rom_code
) {
3647 /* AGCInit() is not done for DVBT, so set agcfast_clip_ctrl_delay */
3648 status
= write16(state
, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A
,
3649 state
->m_dvbt_if_agc_cfg
.fast_clip_ctrl_delay
);
3655 #ifdef COMPILE_FOR_NONRT
3656 status
= write16(state
, OFDM_SC_RA_RAM_BE_OPT_DELAY__A
, 1);
3659 status
= write16(state
, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A
, 2);
3665 status
= write16(state
, FEC_DI_INPUT_CTL__A
, 1); /* OFDM input */
3670 #ifdef COMPILE_FOR_NONRT
3671 status
= write16(state
, FEC_RS_MEASUREMENT_PERIOD__A
, 0x400);
3675 status
= write16(state
, FEC_RS_MEASUREMENT_PERIOD__A
, 0x1000);
3679 status
= write16(state
, FEC_RS_MEASUREMENT_PRESCALE__A
, 0x0001);
3683 /* Setup MPEG bus */
3684 status
= mpegts_dto_setup(state
, OM_DVBT
);
3687 /* Set DVBT Presets */
3688 status
= dvbt_activate_presets(state
);
3694 pr_err("Error %d on %s\n", status
, __func__
);
3698 /*============================================================================*/
3700 * \brief start dvbt demodulating for channel.
3701 * \param demod instance of demodulator.
3702 * \return DRXStatus_t.
3704 static int dvbt_start(struct drxk_state
*state
)
3708 /* drxk_ofdm_sc_cmd_t scCmd; */
3711 /* start correct processes to get in lock */
3712 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3713 param1
= OFDM_SC_RA_RAM_LOCKTRACK_MIN
;
3714 status
= dvbt_sc_command(state
, OFDM_SC_RA_RAM_CMD_PROC_START
, 0,
3715 OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M
, param1
,
3720 status
= mpegts_start(state
);
3723 status
= write16(state
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_ACTIVE
);
3728 pr_err("Error %d on %s\n", status
, __func__
);
3733 /*============================================================================*/
3736 * \brief Set up dvbt demodulator for channel.
3737 * \param demod instance of demodulator.
3738 * \return DRXStatus_t.
3739 * // original DVBTSetChannel()
3741 static int set_dvbt(struct drxk_state
*state
, u16 intermediate_freqk_hz
,
3742 s32 tuner_freq_offset
)
3745 u16 transmission_params
= 0;
3746 u16 operation_mode
= 0;
3747 u32 iqm_rc_rate_ofs
= 0;
3752 dprintk(1, "IF =%d, TFO = %d\n",
3753 intermediate_freqk_hz
, tuner_freq_offset
);
3755 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_OFDM
3756 | SCU_RAM_COMMAND_CMD_DEMOD_STOP
,
3757 0, NULL
, 1, &cmd_result
);
3761 /* Halt SCU to enable safe non-atomic accesses */
3762 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_HOLD
);
3766 /* Stop processors */
3767 status
= write16(state
, OFDM_SC_COMM_EXEC__A
, OFDM_SC_COMM_EXEC_STOP
);
3770 status
= write16(state
, OFDM_LC_COMM_EXEC__A
, OFDM_LC_COMM_EXEC_STOP
);
3774 /* Mandatory fix, always stop CP, required to set spl offset back to
3775 hardware default (is set to 0 by ucode during pilot detection */
3776 status
= write16(state
, OFDM_CP_COMM_EXEC__A
, OFDM_CP_COMM_EXEC_STOP
);
3780 /*== Write channel settings to device ================================*/
3783 switch (state
->props
.transmission_mode
) {
3784 case TRANSMISSION_MODE_AUTO
:
3786 operation_mode
|= OFDM_SC_RA_RAM_OP_AUTO_MODE__M
;
3787 /* try first guess DRX_FFTMODE_8K */
3789 case TRANSMISSION_MODE_8K
:
3790 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_MODE_8K
;
3792 case TRANSMISSION_MODE_2K
:
3793 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_MODE_2K
;
3798 switch (state
->props
.guard_interval
) {
3800 case GUARD_INTERVAL_AUTO
:
3801 operation_mode
|= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M
;
3802 /* try first guess DRX_GUARD_1DIV4 */
3804 case GUARD_INTERVAL_1_4
:
3805 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_GUARD_4
;
3807 case GUARD_INTERVAL_1_32
:
3808 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_GUARD_32
;
3810 case GUARD_INTERVAL_1_16
:
3811 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_GUARD_16
;
3813 case GUARD_INTERVAL_1_8
:
3814 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_GUARD_8
;
3819 switch (state
->props
.hierarchy
) {
3820 case HIERARCHY_AUTO
:
3821 case HIERARCHY_NONE
:
3823 operation_mode
|= OFDM_SC_RA_RAM_OP_AUTO_HIER__M
;
3824 /* try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3825 /* transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3828 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_HIER_A1
;
3831 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_HIER_A2
;
3834 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_HIER_A4
;
3840 switch (state
->props
.modulation
) {
3843 operation_mode
|= OFDM_SC_RA_RAM_OP_AUTO_CONST__M
;
3844 /* try first guess DRX_CONSTELLATION_QAM64 */
3847 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64
;
3850 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK
;
3853 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16
;
3857 /* No hierarchical channels support in BDA */
3858 /* Priority (only for hierarchical channels) */
3859 switch (channel
->priority
) {
3860 case DRX_PRIORITY_LOW
:
3861 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO
;
3862 WR16(dev_addr
, OFDM_EC_SB_PRIOR__A
,
3863 OFDM_EC_SB_PRIOR_LO
);
3865 case DRX_PRIORITY_HIGH
:
3866 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI
;
3867 WR16(dev_addr
, OFDM_EC_SB_PRIOR__A
,
3868 OFDM_EC_SB_PRIOR_HI
));
3870 case DRX_PRIORITY_UNKNOWN
: /* fall through */
3876 /* Set Priorty high */
3877 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI
;
3878 status
= write16(state
, OFDM_EC_SB_PRIOR__A
, OFDM_EC_SB_PRIOR_HI
);
3884 switch (state
->props
.code_rate_HP
) {
3887 operation_mode
|= OFDM_SC_RA_RAM_OP_AUTO_RATE__M
;
3888 /* try first guess DRX_CODERATE_2DIV3 */
3891 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3
;
3894 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2
;
3897 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4
;
3900 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6
;
3903 transmission_params
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8
;
3908 * SAW filter selection: normaly not necesarry, but if wanted
3909 * the application can select a SAW filter via the driver by
3913 /* First determine real bandwidth (Hz) */
3914 /* Also set delay for impulse noise cruncher */
3916 * Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is
3917 * changed by SC for fix for some 8K,1/8 guard but is restored by
3918 * InitEC and ResetEC functions
3920 switch (state
->props
.bandwidth_hz
) {
3922 state
->props
.bandwidth_hz
= 8000000;
3925 bandwidth
= DRXK_BANDWIDTH_8MHZ_IN_HZ
;
3926 status
= write16(state
, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A
,
3930 /* cochannel protection for PAL 8 MHz */
3931 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A
,
3935 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A
,
3939 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A
,
3943 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A
,
3949 bandwidth
= DRXK_BANDWIDTH_7MHZ_IN_HZ
;
3950 status
= write16(state
, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A
,
3954 /* cochannel protection for PAL 7 MHz */
3955 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A
,
3959 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A
,
3963 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A
,
3967 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A
,
3973 bandwidth
= DRXK_BANDWIDTH_6MHZ_IN_HZ
;
3974 status
= write16(state
, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A
,
3978 /* cochannel protection for NTSC 6 MHz */
3979 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A
,
3983 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A
,
3987 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A
,
3991 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A
,
4001 if (iqm_rc_rate_ofs
== 0) {
4002 /* Now compute IQM_RC_RATE_OFS
4003 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
4005 ((SysFreq / BandWidth) * (2^21)) - (2^23)
4007 /* (SysFreq / BandWidth) * (2^28) */
4009 * assert (MAX(sysClk)/MIN(bandwidth) < 16)
4010 * => assert(MAX(sysClk) < 16*MIN(bandwidth))
4011 * => assert(109714272 > 48000000) = true
4012 * so Frac 28 can be used
4014 iqm_rc_rate_ofs
= Frac28a((u32
)
4015 ((state
->m_sys_clock_freq
*
4016 1000) / 3), bandwidth
);
4017 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
4018 if ((iqm_rc_rate_ofs
& 0x7fL
) >= 0x40)
4019 iqm_rc_rate_ofs
+= 0x80L
;
4020 iqm_rc_rate_ofs
= iqm_rc_rate_ofs
>> 7;
4021 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
4022 iqm_rc_rate_ofs
= iqm_rc_rate_ofs
- (1 << 23);
4026 ((((u32
) IQM_RC_RATE_OFS_HI__M
) <<
4027 IQM_RC_RATE_OFS_LO__W
) | IQM_RC_RATE_OFS_LO__M
);
4028 status
= write32(state
, IQM_RC_RATE_OFS_LO__A
, iqm_rc_rate_ofs
);
4032 /* Bandwidth setting done */
4035 status
= dvbt_set_frequency_shift(demod
, channel
, tuner_offset
);
4039 status
= set_frequency_shifter(state
, intermediate_freqk_hz
,
4040 tuner_freq_offset
, true);
4044 /*== start SC, write channel settings to SC ==========================*/
4046 /* Activate SCU to enable SCU commands */
4047 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
4051 /* Enable SC after setting all other parameters */
4052 status
= write16(state
, OFDM_SC_COMM_STATE__A
, 0);
4055 status
= write16(state
, OFDM_SC_COMM_EXEC__A
, 1);
4060 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_OFDM
4061 | SCU_RAM_COMMAND_CMD_DEMOD_START
,
4062 0, NULL
, 1, &cmd_result
);
4066 /* Write SC parameter registers, set all AUTO flags in operation mode */
4067 param1
= (OFDM_SC_RA_RAM_OP_AUTO_MODE__M
|
4068 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M
|
4069 OFDM_SC_RA_RAM_OP_AUTO_CONST__M
|
4070 OFDM_SC_RA_RAM_OP_AUTO_HIER__M
|
4071 OFDM_SC_RA_RAM_OP_AUTO_RATE__M
);
4072 status
= dvbt_sc_command(state
, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM
,
4073 0, transmission_params
, param1
, 0, 0, 0);
4077 if (!state
->m_drxk_a3_rom_code
)
4078 status
= dvbt_ctrl_set_sqi_speed(state
, &state
->m_sqi_speed
);
4081 pr_err("Error %d on %s\n", status
, __func__
);
4087 /*============================================================================*/
4090 * \brief Retrieve lock status .
4091 * \param demod Pointer to demodulator instance.
4092 * \param lockStat Pointer to lock status structure.
4093 * \return DRXStatus_t.
4096 static int get_dvbt_lock_status(struct drxk_state
*state
, u32
*p_lock_status
)
4099 const u16 mpeg_lock_mask
= (OFDM_SC_RA_RAM_LOCK_MPEG__M
|
4100 OFDM_SC_RA_RAM_LOCK_FEC__M
);
4101 const u16 fec_lock_mask
= (OFDM_SC_RA_RAM_LOCK_FEC__M
);
4102 const u16 demod_lock_mask
= OFDM_SC_RA_RAM_LOCK_DEMOD__M
;
4104 u16 sc_ra_ram_lock
= 0;
4105 u16 sc_comm_exec
= 0;
4109 *p_lock_status
= NOT_LOCKED
;
4111 /* Check if SC is running */
4112 status
= read16(state
, OFDM_SC_COMM_EXEC__A
, &sc_comm_exec
);
4115 if (sc_comm_exec
== OFDM_SC_COMM_EXEC_STOP
)
4118 status
= read16(state
, OFDM_SC_RA_RAM_LOCK__A
, &sc_ra_ram_lock
);
4122 if ((sc_ra_ram_lock
& mpeg_lock_mask
) == mpeg_lock_mask
)
4123 *p_lock_status
= MPEG_LOCK
;
4124 else if ((sc_ra_ram_lock
& fec_lock_mask
) == fec_lock_mask
)
4125 *p_lock_status
= FEC_LOCK
;
4126 else if ((sc_ra_ram_lock
& demod_lock_mask
) == demod_lock_mask
)
4127 *p_lock_status
= DEMOD_LOCK
;
4128 else if (sc_ra_ram_lock
& OFDM_SC_RA_RAM_LOCK_NODVBT__M
)
4129 *p_lock_status
= NEVER_LOCK
;
4132 pr_err("Error %d on %s\n", status
, __func__
);
4137 static int power_up_qam(struct drxk_state
*state
)
4139 enum drx_power_mode power_mode
= DRXK_POWER_DOWN_OFDM
;
4143 status
= ctrl_power_mode(state
, &power_mode
);
4145 pr_err("Error %d on %s\n", status
, __func__
);
4151 /* Power Down QAM */
4152 static int power_down_qam(struct drxk_state
*state
)
4159 status
= read16(state
, SCU_COMM_EXEC__A
, &data
);
4162 if (data
== SCU_COMM_EXEC_ACTIVE
) {
4167 /* stop all comstate->m_exec */
4168 status
= write16(state
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_STOP
);
4171 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_QAM
4172 | SCU_RAM_COMMAND_CMD_DEMOD_STOP
,
4173 0, NULL
, 1, &cmd_result
);
4178 status
= set_iqm_af(state
, false);
4182 pr_err("Error %d on %s\n", status
, __func__
);
4187 /*============================================================================*/
4190 * \brief Setup of the QAM Measurement intervals for signal quality
4191 * \param demod instance of demod.
4192 * \param modulation current modulation.
4193 * \return DRXStatus_t.
4196 * Take into account that for certain settings the errorcounters can overflow.
4197 * The implementation does not check this.
4200 static int set_qam_measurement(struct drxk_state
*state
,
4201 enum e_drxk_constellation modulation
,
4204 u32 fec_bits_desired
= 0; /* BER accounting period */
4205 u32 fec_rs_period_total
= 0; /* Total period */
4206 u16 fec_rs_prescale
= 0; /* ReedSolomon Measurement Prescale */
4207 u16 fec_rs_period
= 0; /* Value for corresponding I2C register */
4212 fec_rs_prescale
= 1;
4213 /* fec_bits_desired = symbol_rate [kHz] *
4219 switch (modulation
) {
4220 case DRX_CONSTELLATION_QAM16
:
4221 fec_bits_desired
= 4 * symbol_rate
;
4223 case DRX_CONSTELLATION_QAM32
:
4224 fec_bits_desired
= 5 * symbol_rate
;
4226 case DRX_CONSTELLATION_QAM64
:
4227 fec_bits_desired
= 6 * symbol_rate
;
4229 case DRX_CONSTELLATION_QAM128
:
4230 fec_bits_desired
= 7 * symbol_rate
;
4232 case DRX_CONSTELLATION_QAM256
:
4233 fec_bits_desired
= 8 * symbol_rate
;
4241 fec_bits_desired
/= 1000; /* symbol_rate [Hz] -> symbol_rate [kHz] */
4242 fec_bits_desired
*= 500; /* meas. period [ms] */
4244 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4245 /* fec_rs_period_total = fec_bits_desired / 1632 */
4246 fec_rs_period_total
= (fec_bits_desired
/ 1632UL) + 1; /* roughly ceil */
4248 /* fec_rs_period_total = fec_rs_prescale * fec_rs_period */
4249 fec_rs_prescale
= 1 + (u16
) (fec_rs_period_total
>> 16);
4250 if (fec_rs_prescale
== 0) {
4251 /* Divide by zero (though impossible) */
4257 ((u16
) fec_rs_period_total
+
4258 (fec_rs_prescale
>> 1)) / fec_rs_prescale
;
4260 /* write corresponding registers */
4261 status
= write16(state
, FEC_RS_MEASUREMENT_PERIOD__A
, fec_rs_period
);
4264 status
= write16(state
, FEC_RS_MEASUREMENT_PRESCALE__A
,
4268 status
= write16(state
, FEC_OC_SNC_FAIL_PERIOD__A
, fec_rs_period
);
4271 pr_err("Error %d on %s\n", status
, __func__
);
4275 static int set_qam16(struct drxk_state
*state
)
4280 /* QAM Equalizer Setup */
4282 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 13517);
4285 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 13517);
4288 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 13517);
4291 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 13517);
4294 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 13517);
4297 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 13517);
4300 /* Decision Feedback Equalizer */
4301 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 2);
4304 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 2);
4307 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 2);
4310 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 2);
4313 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 2);
4316 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
4320 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 5);
4323 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 4);
4326 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
4330 /* QAM Slicer Settings */
4331 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
,
4332 DRXK_QAM_SL_SIG_POWER_QAM16
);
4336 /* QAM Loop Controller Coeficients */
4337 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
4340 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
4343 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
4346 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
4349 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
4352 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
4355 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
4358 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
4362 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
4365 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 20);
4368 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 80);
4371 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
4374 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 20);
4377 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50);
4380 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
4383 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 16);
4386 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 32);
4389 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
4392 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
4395 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 10);
4400 /* QAM State Machine (FSM) Thresholds */
4402 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 140);
4405 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 50);
4408 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 95);
4411 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 120);
4414 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 230);
4417 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 105);
4421 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
4424 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 4);
4427 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 24);
4432 /* QAM FSM Tracking Parameters */
4434 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 16);
4437 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 220);
4440 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) 25);
4443 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) 6);
4446 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) -24);
4449 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) -65);
4452 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -127);
4458 pr_err("Error %d on %s\n", status
, __func__
);
4462 /*============================================================================*/
4465 * \brief QAM32 specific setup
4466 * \param demod instance of demod.
4467 * \return DRXStatus_t.
4469 static int set_qam32(struct drxk_state
*state
)
4475 /* QAM Equalizer Setup */
4477 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 6707);
4480 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 6707);
4483 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 6707);
4486 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 6707);
4489 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 6707);
4492 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 6707);
4496 /* Decision Feedback Equalizer */
4497 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 3);
4500 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 3);
4503 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 3);
4506 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 3);
4509 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 3);
4512 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
4516 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 6);
4519 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 5);
4522 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
4526 /* QAM Slicer Settings */
4528 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
,
4529 DRXK_QAM_SL_SIG_POWER_QAM32
);
4534 /* QAM Loop Controller Coeficients */
4536 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
4539 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
4542 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
4545 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
4548 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
4551 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
4554 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
4557 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
4561 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
4564 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 20);
4567 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 80);
4570 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
4573 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 20);
4576 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50);
4579 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
4582 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 16);
4585 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 16);
4588 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
4591 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
4594 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 0);
4599 /* QAM State Machine (FSM) Thresholds */
4601 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 90);
4604 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 50);
4607 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 80);
4610 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 100);
4613 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 170);
4616 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 100);
4620 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
4623 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 4);
4626 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 10);
4631 /* QAM FSM Tracking Parameters */
4633 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 12);
4636 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 140);
4639 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) -8);
4642 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) -16);
4645 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) -26);
4648 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) -56);
4651 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -86);
4654 pr_err("Error %d on %s\n", status
, __func__
);
4658 /*============================================================================*/
4661 * \brief QAM64 specific setup
4662 * \param demod instance of demod.
4663 * \return DRXStatus_t.
4665 static int set_qam64(struct drxk_state
*state
)
4670 /* QAM Equalizer Setup */
4672 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 13336);
4675 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 12618);
4678 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 11988);
4681 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 13809);
4684 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 13809);
4687 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 15609);
4691 /* Decision Feedback Equalizer */
4692 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 4);
4695 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 4);
4698 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 4);
4701 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 4);
4704 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 3);
4707 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
4711 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 5);
4714 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 4);
4717 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
4721 /* QAM Slicer Settings */
4722 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
,
4723 DRXK_QAM_SL_SIG_POWER_QAM64
);
4728 /* QAM Loop Controller Coeficients */
4730 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
4733 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
4736 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
4739 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
4742 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
4745 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
4748 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
4751 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
4755 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
4758 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 30);
4761 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 100);
4764 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
4767 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 30);
4770 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50);
4773 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
4776 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 25);
4779 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 48);
4782 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
4785 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
4788 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 10);
4793 /* QAM State Machine (FSM) Thresholds */
4795 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 100);
4798 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 60);
4801 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 80);
4804 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 110);
4807 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 200);
4810 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 95);
4814 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
4817 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 4);
4820 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 15);
4825 /* QAM FSM Tracking Parameters */
4827 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 12);
4830 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 141);
4833 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) 7);
4836 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) 0);
4839 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) -15);
4842 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) -45);
4845 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -80);
4848 pr_err("Error %d on %s\n", status
, __func__
);
4853 /*============================================================================*/
4856 * \brief QAM128 specific setup
4857 * \param demod: instance of demod.
4858 * \return DRXStatus_t.
4860 static int set_qam128(struct drxk_state
*state
)
4865 /* QAM Equalizer Setup */
4867 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 6564);
4870 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 6598);
4873 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 6394);
4876 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 6409);
4879 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 6656);
4882 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 7238);
4886 /* Decision Feedback Equalizer */
4887 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 6);
4890 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 6);
4893 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 6);
4896 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 6);
4899 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 5);
4902 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
4906 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 6);
4909 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 5);
4912 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
4917 /* QAM Slicer Settings */
4919 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
,
4920 DRXK_QAM_SL_SIG_POWER_QAM128
);
4925 /* QAM Loop Controller Coeficients */
4927 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
4930 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
4933 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
4936 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
4939 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
4942 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
4945 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
4948 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
4952 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
4955 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 40);
4958 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 120);
4961 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
4964 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 40);
4967 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 60);
4970 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
4973 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 25);
4976 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 64);
4979 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
4982 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
4985 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 0);
4990 /* QAM State Machine (FSM) Thresholds */
4992 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 50);
4995 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 60);
4998 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 80);
5001 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 100);
5004 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 140);
5007 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 100);
5011 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
5014 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 5);
5018 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 12);
5022 /* QAM FSM Tracking Parameters */
5024 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 8);
5027 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 65);
5030 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) 5);
5033 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) 3);
5036 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) -1);
5039 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) -12);
5042 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -23);
5045 pr_err("Error %d on %s\n", status
, __func__
);
5050 /*============================================================================*/
5053 * \brief QAM256 specific setup
5054 * \param demod: instance of demod.
5055 * \return DRXStatus_t.
5057 static int set_qam256(struct drxk_state
*state
)
5062 /* QAM Equalizer Setup */
5064 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 11502);
5067 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 12084);
5070 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 12543);
5073 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 12931);
5076 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 13629);
5079 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 15385);
5083 /* Decision Feedback Equalizer */
5084 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 8);
5087 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 8);
5090 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 8);
5093 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 8);
5096 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 6);
5099 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
5103 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 5);
5106 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 4);
5109 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
5113 /* QAM Slicer Settings */
5115 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
,
5116 DRXK_QAM_SL_SIG_POWER_QAM256
);
5121 /* QAM Loop Controller Coeficients */
5123 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
5126 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
5129 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
5132 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
5135 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
5138 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
5141 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
5144 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
5148 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
5151 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 50);
5154 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 250);
5157 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
5160 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 50);
5163 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 125);
5166 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
5169 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 25);
5172 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 48);
5175 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
5178 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
5181 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 10);
5186 /* QAM State Machine (FSM) Thresholds */
5188 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 50);
5191 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 60);
5194 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 80);
5197 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 100);
5200 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 150);
5203 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 110);
5207 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
5210 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 4);
5213 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 12);
5218 /* QAM FSM Tracking Parameters */
5220 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 8);
5223 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 74);
5226 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) 18);
5229 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) 13);
5232 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) 7);
5235 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) 0);
5238 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -8);
5241 pr_err("Error %d on %s\n", status
, __func__
);
5246 /*============================================================================*/
5248 * \brief Reset QAM block.
5249 * \param demod: instance of demod.
5250 * \param channel: pointer to channel data.
5251 * \return DRXStatus_t.
5253 static int qam_reset_qam(struct drxk_state
*state
)
5259 /* Stop QAM comstate->m_exec */
5260 status
= write16(state
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_STOP
);
5264 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_QAM
5265 | SCU_RAM_COMMAND_CMD_DEMOD_RESET
,
5266 0, NULL
, 1, &cmd_result
);
5269 pr_err("Error %d on %s\n", status
, __func__
);
5273 /*============================================================================*/
5276 * \brief Set QAM symbolrate.
5277 * \param demod: instance of demod.
5278 * \param channel: pointer to channel data.
5279 * \return DRXStatus_t.
5281 static int qam_set_symbolrate(struct drxk_state
*state
)
5283 u32 adc_frequency
= 0;
5285 u32 iqm_rc_rate
= 0;
5287 u32 lc_symb_rate
= 0;
5291 /* Select & calculate correct IQM rate */
5292 adc_frequency
= (state
->m_sys_clock_freq
* 1000) / 3;
5294 if (state
->props
.symbol_rate
<= 1188750)
5296 else if (state
->props
.symbol_rate
<= 2377500)
5298 else if (state
->props
.symbol_rate
<= 4755000)
5300 status
= write16(state
, IQM_FD_RATESEL__A
, ratesel
);
5305 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5307 symb_freq
= state
->props
.symbol_rate
* (1 << ratesel
);
5308 if (symb_freq
== 0) {
5309 /* Divide by zero */
5313 iqm_rc_rate
= (adc_frequency
/ symb_freq
) * (1 << 21) +
5314 (Frac28a((adc_frequency
% symb_freq
), symb_freq
) >> 7) -
5316 status
= write32(state
, IQM_RC_RATE_OFS_LO__A
, iqm_rc_rate
);
5319 state
->m_iqm_rc_rate
= iqm_rc_rate
;
5321 LcSymbFreq = round (.125 * symbolrate / adc_freq * (1<<15))
5323 symb_freq
= state
->props
.symbol_rate
;
5324 if (adc_frequency
== 0) {
5325 /* Divide by zero */
5329 lc_symb_rate
= (symb_freq
/ adc_frequency
) * (1 << 12) +
5330 (Frac28a((symb_freq
% adc_frequency
), adc_frequency
) >>
5332 if (lc_symb_rate
> 511)
5334 status
= write16(state
, QAM_LC_SYMBOL_FREQ__A
, (u16
) lc_symb_rate
);
5338 pr_err("Error %d on %s\n", status
, __func__
);
5342 /*============================================================================*/
5345 * \brief Get QAM lock status.
5346 * \param demod: instance of demod.
5347 * \param channel: pointer to channel data.
5348 * \return DRXStatus_t.
5351 static int get_qam_lock_status(struct drxk_state
*state
, u32
*p_lock_status
)
5354 u16 result
[2] = { 0, 0 };
5357 *p_lock_status
= NOT_LOCKED
;
5358 status
= scu_command(state
,
5359 SCU_RAM_COMMAND_STANDARD_QAM
|
5360 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK
, 0, NULL
, 2,
5363 pr_err("Error %d on %s\n", status
, __func__
);
5365 if (result
[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED
) {
5366 /* 0x0000 NOT LOCKED */
5367 } else if (result
[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED
) {
5368 /* 0x4000 DEMOD LOCKED */
5369 *p_lock_status
= DEMOD_LOCK
;
5370 } else if (result
[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK
) {
5371 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5372 *p_lock_status
= MPEG_LOCK
;
5374 /* 0xC000 NEVER LOCKED */
5375 /* (system will never be able to lock to the signal) */
5377 * TODO: check this, intermediate & standard specific lock
5378 * states are not taken into account here
5380 *p_lock_status
= NEVER_LOCK
;
5385 #define QAM_MIRROR__M 0x03
5386 #define QAM_MIRROR_NORMAL 0x00
5387 #define QAM_MIRRORED 0x01
5388 #define QAM_MIRROR_AUTO_ON 0x02
5389 #define QAM_LOCKRANGE__M 0x10
5390 #define QAM_LOCKRANGE_NORMAL 0x10
5392 static int qam_demodulator_command(struct drxk_state
*state
,
5393 int number_of_parameters
)
5397 u16 set_param_parameters
[4] = { 0, 0, 0, 0 };
5399 set_param_parameters
[0] = state
->m_constellation
; /* modulation */
5400 set_param_parameters
[1] = DRXK_QAM_I12_J17
; /* interleave mode */
5402 if (number_of_parameters
== 2) {
5403 u16 set_env_parameters
[1] = { 0 };
5405 if (state
->m_operation_mode
== OM_QAM_ITU_C
)
5406 set_env_parameters
[0] = QAM_TOP_ANNEX_C
;
5408 set_env_parameters
[0] = QAM_TOP_ANNEX_A
;
5410 status
= scu_command(state
,
5411 SCU_RAM_COMMAND_STANDARD_QAM
5412 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV
,
5413 1, set_env_parameters
, 1, &cmd_result
);
5417 status
= scu_command(state
,
5418 SCU_RAM_COMMAND_STANDARD_QAM
5419 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM
,
5420 number_of_parameters
, set_param_parameters
,
5422 } else if (number_of_parameters
== 4) {
5423 if (state
->m_operation_mode
== OM_QAM_ITU_C
)
5424 set_param_parameters
[2] = QAM_TOP_ANNEX_C
;
5426 set_param_parameters
[2] = QAM_TOP_ANNEX_A
;
5428 set_param_parameters
[3] |= (QAM_MIRROR_AUTO_ON
);
5429 /* Env parameters */
5430 /* check for LOCKRANGE Extented */
5431 /* set_param_parameters[3] |= QAM_LOCKRANGE_NORMAL; */
5433 status
= scu_command(state
,
5434 SCU_RAM_COMMAND_STANDARD_QAM
5435 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM
,
5436 number_of_parameters
, set_param_parameters
,
5439 pr_warn("Unknown QAM demodulator parameter count %d\n",
5440 number_of_parameters
);
5446 pr_warn("Warning %d on %s\n", status
, __func__
);
5450 static int set_qam(struct drxk_state
*state
, u16 intermediate_freqk_hz
,
5451 s32 tuner_freq_offset
)
5455 int qam_demod_param_count
= state
->qam_demod_parameter_count
;
5459 * STEP 1: reset demodulator
5460 * resets FEC DI and FEC RS
5462 * resets SCU variables
5464 status
= write16(state
, FEC_DI_COMM_EXEC__A
, FEC_DI_COMM_EXEC_STOP
);
5467 status
= write16(state
, FEC_RS_COMM_EXEC__A
, FEC_RS_COMM_EXEC_STOP
);
5470 status
= qam_reset_qam(state
);
5475 * STEP 2: configure demodulator
5476 * -set params; resets IQM,QAM,FEC HW; initializes some
5479 status
= qam_set_symbolrate(state
);
5484 switch (state
->props
.modulation
) {
5486 state
->m_constellation
= DRX_CONSTELLATION_QAM256
;
5490 state
->m_constellation
= DRX_CONSTELLATION_QAM64
;
5493 state
->m_constellation
= DRX_CONSTELLATION_QAM16
;
5496 state
->m_constellation
= DRX_CONSTELLATION_QAM32
;
5499 state
->m_constellation
= DRX_CONSTELLATION_QAM128
;
5508 /* Use the 4-parameter if it's requested or we're probing for
5509 * the correct command. */
5510 if (state
->qam_demod_parameter_count
== 4
5511 || !state
->qam_demod_parameter_count
) {
5512 qam_demod_param_count
= 4;
5513 status
= qam_demodulator_command(state
, qam_demod_param_count
);
5516 /* Use the 2-parameter command if it was requested or if we're
5517 * probing for the correct command and the 4-parameter command
5519 if (state
->qam_demod_parameter_count
== 2
5520 || (!state
->qam_demod_parameter_count
&& status
< 0)) {
5521 qam_demod_param_count
= 2;
5522 status
= qam_demodulator_command(state
, qam_demod_param_count
);
5526 dprintk(1, "Could not set demodulator parameters.\n");
5528 "Make sure qam_demod_parameter_count (%d) is correct for your firmware (%s).\n",
5529 state
->qam_demod_parameter_count
,
5530 state
->microcode_name
);
5532 } else if (!state
->qam_demod_parameter_count
) {
5534 "Auto-probing the QAM command parameters was successful - using %d parameters.\n",
5535 qam_demod_param_count
);
5538 * One of our commands was successful. We don't need to
5539 * auto-probe anymore, now that we got the correct command.
5541 state
->qam_demod_parameter_count
= qam_demod_param_count
;
5545 * STEP 3: enable the system in a mode where the ADC provides valid
5546 * signal setup modulation independent registers
5549 status
= set_frequency(channel
, tuner_freq_offset
));
5553 status
= set_frequency_shifter(state
, intermediate_freqk_hz
,
5554 tuner_freq_offset
, true);
5558 /* Setup BER measurement */
5559 status
= set_qam_measurement(state
, state
->m_constellation
,
5560 state
->props
.symbol_rate
);
5564 /* Reset default values */
5565 status
= write16(state
, IQM_CF_SCALE_SH__A
, IQM_CF_SCALE_SH__PRE
);
5568 status
= write16(state
, QAM_SY_TIMEOUT__A
, QAM_SY_TIMEOUT__PRE
);
5572 /* Reset default LC values */
5573 status
= write16(state
, QAM_LC_RATE_LIMIT__A
, 3);
5576 status
= write16(state
, QAM_LC_LPF_FACTORP__A
, 4);
5579 status
= write16(state
, QAM_LC_LPF_FACTORI__A
, 4);
5582 status
= write16(state
, QAM_LC_MODE__A
, 7);
5586 status
= write16(state
, QAM_LC_QUAL_TAB0__A
, 1);
5589 status
= write16(state
, QAM_LC_QUAL_TAB1__A
, 1);
5592 status
= write16(state
, QAM_LC_QUAL_TAB2__A
, 1);
5595 status
= write16(state
, QAM_LC_QUAL_TAB3__A
, 1);
5598 status
= write16(state
, QAM_LC_QUAL_TAB4__A
, 2);
5601 status
= write16(state
, QAM_LC_QUAL_TAB5__A
, 2);
5604 status
= write16(state
, QAM_LC_QUAL_TAB6__A
, 2);
5607 status
= write16(state
, QAM_LC_QUAL_TAB8__A
, 2);
5610 status
= write16(state
, QAM_LC_QUAL_TAB9__A
, 2);
5613 status
= write16(state
, QAM_LC_QUAL_TAB10__A
, 2);
5616 status
= write16(state
, QAM_LC_QUAL_TAB12__A
, 2);
5619 status
= write16(state
, QAM_LC_QUAL_TAB15__A
, 3);
5622 status
= write16(state
, QAM_LC_QUAL_TAB16__A
, 3);
5625 status
= write16(state
, QAM_LC_QUAL_TAB20__A
, 4);
5628 status
= write16(state
, QAM_LC_QUAL_TAB25__A
, 4);
5632 /* Mirroring, QAM-block starting point not inverted */
5633 status
= write16(state
, QAM_SY_SP_INV__A
,
5634 QAM_SY_SP_INV_SPECTRUM_INV_DIS
);
5638 /* Halt SCU to enable safe non-atomic accesses */
5639 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_HOLD
);
5643 /* STEP 4: modulation specific setup */
5644 switch (state
->props
.modulation
) {
5646 status
= set_qam16(state
);
5649 status
= set_qam32(state
);
5653 status
= set_qam64(state
);
5656 status
= set_qam128(state
);
5659 status
= set_qam256(state
);
5668 /* Activate SCU to enable SCU commands */
5669 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
5673 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5674 /* extAttr->currentChannel.modulation = channel->modulation; */
5675 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5676 status
= mpegts_dto_setup(state
, state
->m_operation_mode
);
5680 /* start processes */
5681 status
= mpegts_start(state
);
5684 status
= write16(state
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_ACTIVE
);
5687 status
= write16(state
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_ACTIVE
);
5690 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_ACTIVE
);
5694 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5695 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_QAM
5696 | SCU_RAM_COMMAND_CMD_DEMOD_START
,
5697 0, NULL
, 1, &cmd_result
);
5701 /* update global DRXK data container */
5702 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5706 pr_err("Error %d on %s\n", status
, __func__
);
5710 static int set_qam_standard(struct drxk_state
*state
,
5711 enum operation_mode o_mode
)
5714 #ifdef DRXK_QAM_TAPS
5715 #define DRXK_QAMA_TAPS_SELECT
5716 #include "drxk_filters.h"
5717 #undef DRXK_QAMA_TAPS_SELECT
5722 /* added antenna switch */
5723 switch_antenna_to_qam(state
);
5725 /* Ensure correct power-up mode */
5726 status
= power_up_qam(state
);
5729 /* Reset QAM block */
5730 status
= qam_reset_qam(state
);
5736 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_STOP
);
5739 status
= write16(state
, IQM_AF_AMUX__A
, IQM_AF_AMUX_SIGNAL2ADC
);
5743 /* Upload IQM Channel Filter settings by
5744 boot loader from ROM table */
5747 status
= bl_chain_cmd(state
, DRXK_BL_ROM_OFFSET_TAPS_ITU_A
,
5748 DRXK_BLCC_NR_ELEMENTS_TAPS
,
5752 status
= bl_direct_cmd(state
, IQM_CF_TAP_RE0__A
,
5753 DRXK_BL_ROM_OFFSET_TAPS_ITU_C
,
5754 DRXK_BLDC_NR_ELEMENTS_TAPS
,
5758 status
= bl_direct_cmd(state
,
5760 DRXK_BL_ROM_OFFSET_TAPS_ITU_C
,
5761 DRXK_BLDC_NR_ELEMENTS_TAPS
,
5770 status
= write16(state
, IQM_CF_OUT_ENA__A
, 1 << IQM_CF_OUT_ENA_QAM__B
);
5773 status
= write16(state
, IQM_CF_SYMMETRIC__A
, 0);
5776 status
= write16(state
, IQM_CF_MIDTAP__A
,
5777 ((1 << IQM_CF_MIDTAP_RE__B
) | (1 << IQM_CF_MIDTAP_IM__B
)));
5781 status
= write16(state
, IQM_RC_STRETCH__A
, 21);
5784 status
= write16(state
, IQM_AF_CLP_LEN__A
, 0);
5787 status
= write16(state
, IQM_AF_CLP_TH__A
, 448);
5790 status
= write16(state
, IQM_AF_SNS_LEN__A
, 0);
5793 status
= write16(state
, IQM_CF_POW_MEAS_LEN__A
, 0);
5797 status
= write16(state
, IQM_FS_ADJ_SEL__A
, 1);
5800 status
= write16(state
, IQM_RC_ADJ_SEL__A
, 1);
5803 status
= write16(state
, IQM_CF_ADJ_SEL__A
, 1);
5806 status
= write16(state
, IQM_AF_UPD_SEL__A
, 0);
5810 /* IQM Impulse Noise Processing Unit */
5811 status
= write16(state
, IQM_CF_CLP_VAL__A
, 500);
5814 status
= write16(state
, IQM_CF_DATATH__A
, 1000);
5817 status
= write16(state
, IQM_CF_BYPASSDET__A
, 1);
5820 status
= write16(state
, IQM_CF_DET_LCT__A
, 0);
5823 status
= write16(state
, IQM_CF_WND_LEN__A
, 1);
5826 status
= write16(state
, IQM_CF_PKDTH__A
, 1);
5829 status
= write16(state
, IQM_AF_INC_BYPASS__A
, 1);
5833 /* turn on IQMAF. Must be done before setAgc**() */
5834 status
= set_iqm_af(state
, true);
5837 status
= write16(state
, IQM_AF_START_LOCK__A
, 0x01);
5841 /* IQM will not be reset from here, sync ADC and update/init AGC */
5842 status
= adc_synchronization(state
);
5846 /* Set the FSM step period */
5847 status
= write16(state
, SCU_RAM_QAM_FSM_STEP_PERIOD__A
, 2000);
5851 /* Halt SCU to enable safe non-atomic accesses */
5852 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_HOLD
);
5856 /* No more resets of the IQM, current standard correctly set =>
5857 now AGCs can be configured. */
5859 status
= init_agc(state
, true);
5862 status
= set_pre_saw(state
, &(state
->m_qam_pre_saw_cfg
));
5866 /* Configure AGC's */
5867 status
= set_agc_rf(state
, &(state
->m_qam_rf_agc_cfg
), true);
5870 status
= set_agc_if(state
, &(state
->m_qam_if_agc_cfg
), true);
5874 /* Activate SCU to enable SCU commands */
5875 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
5878 pr_err("Error %d on %s\n", status
, __func__
);
5882 static int write_gpio(struct drxk_state
*state
)
5888 /* stop lock indicator process */
5889 status
= write16(state
, SCU_RAM_GPIO__A
,
5890 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
5894 /* Write magic word to enable pdr reg write */
5895 status
= write16(state
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
);
5899 if (state
->m_has_sawsw
) {
5900 if (state
->uio_mask
& 0x0001) { /* UIO-1 */
5901 /* write to io pad configuration register - output mode */
5902 status
= write16(state
, SIO_PDR_SMA_TX_CFG__A
,
5907 /* use corresponding bit in io data output registar */
5908 status
= read16(state
, SIO_PDR_UIO_OUT_LO__A
, &value
);
5911 if ((state
->m_gpio
& 0x0001) == 0)
5912 value
&= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5914 value
|= 0x8000; /* write one to 15th bit - 1st UIO */
5915 /* write back to io data output register */
5916 status
= write16(state
, SIO_PDR_UIO_OUT_LO__A
, value
);
5920 if (state
->uio_mask
& 0x0002) { /* UIO-2 */
5921 /* write to io pad configuration register - output mode */
5922 status
= write16(state
, SIO_PDR_SMA_RX_CFG__A
,
5927 /* use corresponding bit in io data output registar */
5928 status
= read16(state
, SIO_PDR_UIO_OUT_LO__A
, &value
);
5931 if ((state
->m_gpio
& 0x0002) == 0)
5932 value
&= 0xBFFF; /* write zero to 14th bit - 2st UIO */
5934 value
|= 0x4000; /* write one to 14th bit - 2st UIO */
5935 /* write back to io data output register */
5936 status
= write16(state
, SIO_PDR_UIO_OUT_LO__A
, value
);
5940 if (state
->uio_mask
& 0x0004) { /* UIO-3 */
5941 /* write to io pad configuration register - output mode */
5942 status
= write16(state
, SIO_PDR_GPIO_CFG__A
,
5947 /* use corresponding bit in io data output registar */
5948 status
= read16(state
, SIO_PDR_UIO_OUT_LO__A
, &value
);
5951 if ((state
->m_gpio
& 0x0004) == 0)
5952 value
&= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
5954 value
|= 0x0004; /* write one to 2nd bit - 3rd UIO */
5955 /* write back to io data output register */
5956 status
= write16(state
, SIO_PDR_UIO_OUT_LO__A
, value
);
5961 /* Write magic word to disable pdr reg write */
5962 status
= write16(state
, SIO_TOP_COMM_KEY__A
, 0x0000);
5965 pr_err("Error %d on %s\n", status
, __func__
);
5969 static int switch_antenna_to_qam(struct drxk_state
*state
)
5976 if (!state
->antenna_gpio
)
5979 gpio_state
= state
->m_gpio
& state
->antenna_gpio
;
5981 if (state
->antenna_dvbt
^ gpio_state
) {
5982 /* Antenna is on DVB-T mode. Switch */
5983 if (state
->antenna_dvbt
)
5984 state
->m_gpio
&= ~state
->antenna_gpio
;
5986 state
->m_gpio
|= state
->antenna_gpio
;
5987 status
= write_gpio(state
);
5990 pr_err("Error %d on %s\n", status
, __func__
);
5994 static int switch_antenna_to_dvbt(struct drxk_state
*state
)
6001 if (!state
->antenna_gpio
)
6004 gpio_state
= state
->m_gpio
& state
->antenna_gpio
;
6006 if (!(state
->antenna_dvbt
^ gpio_state
)) {
6007 /* Antenna is on DVB-C mode. Switch */
6008 if (state
->antenna_dvbt
)
6009 state
->m_gpio
|= state
->antenna_gpio
;
6011 state
->m_gpio
&= ~state
->antenna_gpio
;
6012 status
= write_gpio(state
);
6015 pr_err("Error %d on %s\n", status
, __func__
);
6020 static int power_down_device(struct drxk_state
*state
)
6022 /* Power down to requested mode */
6023 /* Backup some register settings */
6024 /* Set pins with possible pull-ups connected to them in input mode */
6025 /* Analog power down */
6026 /* ADC power down */
6027 /* Power down device */
6031 if (state
->m_b_p_down_open_bridge
) {
6032 /* Open I2C bridge before power down of DRXK */
6033 status
= ConfigureI2CBridge(state
, true);
6038 status
= dvbt_enable_ofdm_token_ring(state
, false);
6042 status
= write16(state
, SIO_CC_PWD_MODE__A
,
6043 SIO_CC_PWD_MODE_LEVEL_CLOCK
);
6046 status
= write16(state
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
);
6049 state
->m_hi_cfg_ctrl
|= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
;
6050 status
= hi_cfg_command(state
);
6053 pr_err("Error %d on %s\n", status
, __func__
);
6058 static int init_drxk(struct drxk_state
*state
)
6060 int status
= 0, n
= 0;
6061 enum drx_power_mode power_mode
= DRXK_POWER_DOWN_OFDM
;
6065 if (state
->m_drxk_state
== DRXK_UNINITIALIZED
) {
6066 drxk_i2c_lock(state
);
6067 status
= power_up_device(state
);
6070 status
= drxx_open(state
);
6073 /* Soft reset of OFDM-, sys- and osc-clockdomain */
6074 status
= write16(state
, SIO_CC_SOFT_RST__A
,
6075 SIO_CC_SOFT_RST_OFDM__M
6076 | SIO_CC_SOFT_RST_SYS__M
6077 | SIO_CC_SOFT_RST_OSC__M
);
6080 status
= write16(state
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
);
6084 * TODO is this needed? If yes, how much delay in
6085 * worst case scenario
6087 usleep_range(1000, 2000);
6088 state
->m_drxk_a3_patch_code
= true;
6089 status
= get_device_capabilities(state
);
6093 /* Bridge delay, uses oscilator clock */
6094 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
6095 /* SDA brdige delay */
6096 state
->m_hi_cfg_bridge_delay
=
6097 (u16
) ((state
->m_osc_clock_freq
/ 1000) *
6098 HI_I2C_BRIDGE_DELAY
) / 1000;
6100 if (state
->m_hi_cfg_bridge_delay
>
6101 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M
) {
6102 state
->m_hi_cfg_bridge_delay
=
6103 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M
;
6105 /* SCL bridge delay, same as SDA for now */
6106 state
->m_hi_cfg_bridge_delay
+=
6107 state
->m_hi_cfg_bridge_delay
<<
6108 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B
;
6110 status
= init_hi(state
);
6113 /* disable various processes */
6115 if (!(state
->m_DRXK_A1_ROM_CODE
)
6116 && !(state
->m_DRXK_A2_ROM_CODE
))
6119 status
= write16(state
, SCU_RAM_GPIO__A
,
6120 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
6125 /* disable MPEG port */
6126 status
= mpegts_disable(state
);
6130 /* Stop AUD and SCU */
6131 status
= write16(state
, AUD_COMM_EXEC__A
, AUD_COMM_EXEC_STOP
);
6134 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_STOP
);
6138 /* enable token-ring bus through OFDM block for possible ucode upload */
6139 status
= write16(state
, SIO_OFDM_SH_OFDM_RING_ENABLE__A
,
6140 SIO_OFDM_SH_OFDM_RING_ENABLE_ON
);
6144 /* include boot loader section */
6145 status
= write16(state
, SIO_BL_COMM_EXEC__A
,
6146 SIO_BL_COMM_EXEC_ACTIVE
);
6149 status
= bl_chain_cmd(state
, 0, 6, 100);
6154 status
= download_microcode(state
, state
->fw
->data
,
6160 /* disable token-ring bus through OFDM block for possible ucode upload */
6161 status
= write16(state
, SIO_OFDM_SH_OFDM_RING_ENABLE__A
,
6162 SIO_OFDM_SH_OFDM_RING_ENABLE_OFF
);
6166 /* Run SCU for a little while to initialize microcode version numbers */
6167 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
6170 status
= drxx_open(state
);
6173 /* added for test */
6176 power_mode
= DRXK_POWER_DOWN_OFDM
;
6177 status
= ctrl_power_mode(state
, &power_mode
);
6181 /* Stamp driver version number in SCU data RAM in BCD code
6182 Done to enable field application engineers to retrieve drxdriver version
6183 via I2C from SCU RAM.
6184 Not using SCU command interface for SCU register access since no
6185 microcode may be present.
6188 (((DRXK_VERSION_MAJOR
/ 100) % 10) << 12) +
6189 (((DRXK_VERSION_MAJOR
/ 10) % 10) << 8) +
6190 ((DRXK_VERSION_MAJOR
% 10) << 4) +
6191 (DRXK_VERSION_MINOR
% 10);
6192 status
= write16(state
, SCU_RAM_DRIVER_VER_HI__A
,
6197 (((DRXK_VERSION_PATCH
/ 1000) % 10) << 12) +
6198 (((DRXK_VERSION_PATCH
/ 100) % 10) << 8) +
6199 (((DRXK_VERSION_PATCH
/ 10) % 10) << 4) +
6200 (DRXK_VERSION_PATCH
% 10);
6201 status
= write16(state
, SCU_RAM_DRIVER_VER_LO__A
,
6206 pr_info("DRXK driver version %d.%d.%d\n",
6207 DRXK_VERSION_MAJOR
, DRXK_VERSION_MINOR
,
6208 DRXK_VERSION_PATCH
);
6211 * Dirty fix of default values for ROM/PATCH microcode
6212 * Dirty because this fix makes it impossible to setup
6213 * suitable values before calling DRX_Open. This solution
6214 * requires changes to RF AGC speed to be done via the CTRL
6215 * function after calling DRX_Open
6218 /* m_dvbt_rf_agc_cfg.speed = 3; */
6220 /* Reset driver debug flags to 0 */
6221 status
= write16(state
, SCU_RAM_DRIVER_DEBUG__A
, 0);
6226 NOTE: No more full FEC resets allowed afterwards!! */
6227 status
= write16(state
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
);
6230 /* MPEGTS functions are still the same */
6231 status
= mpegts_dto_init(state
);
6234 status
= mpegts_stop(state
);
6237 status
= mpegts_configure_polarity(state
);
6240 status
= mpegts_configure_pins(state
, state
->m_enable_mpeg_output
);
6243 /* added: configure GPIO */
6244 status
= write_gpio(state
);
6248 state
->m_drxk_state
= DRXK_STOPPED
;
6250 if (state
->m_b_power_down
) {
6251 status
= power_down_device(state
);
6254 state
->m_drxk_state
= DRXK_POWERED_DOWN
;
6256 state
->m_drxk_state
= DRXK_STOPPED
;
6258 /* Initialize the supported delivery systems */
6260 if (state
->m_has_dvbc
) {
6261 state
->frontend
.ops
.delsys
[n
++] = SYS_DVBC_ANNEX_A
;
6262 state
->frontend
.ops
.delsys
[n
++] = SYS_DVBC_ANNEX_C
;
6263 strlcat(state
->frontend
.ops
.info
.name
, " DVB-C",
6264 sizeof(state
->frontend
.ops
.info
.name
));
6266 if (state
->m_has_dvbt
) {
6267 state
->frontend
.ops
.delsys
[n
++] = SYS_DVBT
;
6268 strlcat(state
->frontend
.ops
.info
.name
, " DVB-T",
6269 sizeof(state
->frontend
.ops
.info
.name
));
6271 drxk_i2c_unlock(state
);
6275 state
->m_drxk_state
= DRXK_NO_DEV
;
6276 drxk_i2c_unlock(state
);
6277 pr_err("Error %d on %s\n", status
, __func__
);
6283 static void load_firmware_cb(const struct firmware
*fw
,
6286 struct drxk_state
*state
= context
;
6288 dprintk(1, ": %s\n", fw
? "firmware loaded" : "firmware not loaded");
6290 pr_err("Could not load firmware file %s.\n",
6291 state
->microcode_name
);
6292 pr_info("Copy %s to your hotplug directory!\n",
6293 state
->microcode_name
);
6294 state
->microcode_name
= NULL
;
6297 * As firmware is now load asynchronous, it is not possible
6298 * anymore to fail at frontend attach. We might silently
6299 * return here, and hope that the driver won't crash.
6300 * We might also change all DVB callbacks to return -ENODEV
6301 * if the device is not initialized.
6302 * As the DRX-K devices have their own internal firmware,
6303 * let's just hope that it will match a firmware revision
6304 * compatible with this driver and proceed.
6312 static void drxk_release(struct dvb_frontend
*fe
)
6314 struct drxk_state
*state
= fe
->demodulator_priv
;
6317 release_firmware(state
->fw
);
6322 static int drxk_sleep(struct dvb_frontend
*fe
)
6324 struct drxk_state
*state
= fe
->demodulator_priv
;
6328 if (state
->m_drxk_state
== DRXK_NO_DEV
)
6330 if (state
->m_drxk_state
== DRXK_UNINITIALIZED
)
6337 static int drxk_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
6339 struct drxk_state
*state
= fe
->demodulator_priv
;
6341 dprintk(1, ": %s\n", enable
? "enable" : "disable");
6343 if (state
->m_drxk_state
== DRXK_NO_DEV
)
6346 return ConfigureI2CBridge(state
, enable
? true : false);
6349 static int drxk_set_parameters(struct dvb_frontend
*fe
)
6351 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
6352 u32 delsys
= p
->delivery_system
, old_delsys
;
6353 struct drxk_state
*state
= fe
->demodulator_priv
;
6358 if (state
->m_drxk_state
== DRXK_NO_DEV
)
6361 if (state
->m_drxk_state
== DRXK_UNINITIALIZED
)
6364 if (!fe
->ops
.tuner_ops
.get_if_frequency
) {
6365 pr_err("Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
6369 if (fe
->ops
.i2c_gate_ctrl
)
6370 fe
->ops
.i2c_gate_ctrl(fe
, 1);
6371 if (fe
->ops
.tuner_ops
.set_params
)
6372 fe
->ops
.tuner_ops
.set_params(fe
);
6373 if (fe
->ops
.i2c_gate_ctrl
)
6374 fe
->ops
.i2c_gate_ctrl(fe
, 0);
6376 old_delsys
= state
->props
.delivery_system
;
6379 if (old_delsys
!= delsys
) {
6382 case SYS_DVBC_ANNEX_A
:
6383 case SYS_DVBC_ANNEX_C
:
6384 if (!state
->m_has_dvbc
)
6386 state
->m_itut_annex_c
= (delsys
== SYS_DVBC_ANNEX_C
) ?
6388 if (state
->m_itut_annex_c
)
6389 setoperation_mode(state
, OM_QAM_ITU_C
);
6391 setoperation_mode(state
, OM_QAM_ITU_A
);
6394 if (!state
->m_has_dvbt
)
6396 setoperation_mode(state
, OM_DVBT
);
6403 fe
->ops
.tuner_ops
.get_if_frequency(fe
, &IF
);
6404 start(state
, 0, IF
);
6406 /* After set_frontend, stats aren't available */
6407 p
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
6408 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6409 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6410 p
->block_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6411 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6412 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6413 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6414 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6416 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6421 static int get_strength(struct drxk_state
*state
, u64
*strength
)
6424 struct s_cfg_agc rf_agc
, if_agc
;
6430 /* FIXME: those are part of the tuner presets */
6431 u16 tuner_rf_gain
= 50; /* Default value on az6007 driver */
6432 u16 tuner_if_gain
= 40; /* Default value on az6007 driver */
6436 if (is_dvbt(state
)) {
6437 rf_agc
= state
->m_dvbt_rf_agc_cfg
;
6438 if_agc
= state
->m_dvbt_if_agc_cfg
;
6439 } else if (is_qam(state
)) {
6440 rf_agc
= state
->m_qam_rf_agc_cfg
;
6441 if_agc
= state
->m_qam_if_agc_cfg
;
6443 rf_agc
= state
->m_atv_rf_agc_cfg
;
6444 if_agc
= state
->m_atv_if_agc_cfg
;
6447 if (rf_agc
.ctrl_mode
== DRXK_AGC_CTRL_AUTO
) {
6448 /* SCU output_level */
6449 status
= read16(state
, SCU_RAM_AGC_RF_IACCU_HI__A
, &scu_lvl
);
6454 status
= read16(state
, SCU_RAM_AGC_RF_IACCU_HI_CO__A
, &scu_coc
);
6458 if (((u32
) scu_lvl
+ (u32
) scu_coc
) < 0xffff)
6459 rf_agc
.output_level
= scu_lvl
+ scu_coc
;
6461 rf_agc
.output_level
= 0xffff;
6463 /* Take RF gain into account */
6464 total_gain
+= tuner_rf_gain
;
6466 /* clip output value */
6467 if (rf_agc
.output_level
< rf_agc
.min_output_level
)
6468 rf_agc
.output_level
= rf_agc
.min_output_level
;
6469 if (rf_agc
.output_level
> rf_agc
.max_output_level
)
6470 rf_agc
.output_level
= rf_agc
.max_output_level
;
6472 agc_range
= (u32
) (rf_agc
.max_output_level
- rf_agc
.min_output_level
);
6473 if (agc_range
> 0) {
6475 ((u32
)(tuner_rf_gain
)) *
6476 ((u32
)(rf_agc
.output_level
- rf_agc
.min_output_level
))
6481 if (if_agc
.ctrl_mode
== DRXK_AGC_CTRL_AUTO
) {
6482 status
= read16(state
, SCU_RAM_AGC_IF_IACCU_HI__A
,
6483 &if_agc
.output_level
);
6487 status
= read16(state
, SCU_RAM_AGC_INGAIN_TGT_MIN__A
,
6492 /* Take IF gain into account */
6493 total_gain
+= (u32
) tuner_if_gain
;
6495 /* clip output value */
6496 if (if_agc
.output_level
< if_agc
.min_output_level
)
6497 if_agc
.output_level
= if_agc
.min_output_level
;
6498 if (if_agc
.output_level
> if_agc
.max_output_level
)
6499 if_agc
.output_level
= if_agc
.max_output_level
;
6501 agc_range
= (u32
)(if_agc
.max_output_level
- if_agc
.min_output_level
);
6502 if (agc_range
> 0) {
6504 ((u32
)(tuner_if_gain
)) *
6505 ((u32
)(if_agc
.output_level
- if_agc
.min_output_level
))
6511 * Convert to 0..65535 scale.
6512 * If it can't be measured (AGC is disabled), just show 100%.
6515 *strength
= (65535UL * atten
/ total_gain
/ 100);
6522 static int drxk_get_stats(struct dvb_frontend
*fe
)
6524 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
6525 struct drxk_state
*state
= fe
->demodulator_priv
;
6530 u32 post_bit_err_count
;
6531 u32 post_bit_error_scale
;
6532 u32 pre_bit_err_count
;
6535 u32 pkt_error_count
;
6538 if (state
->m_drxk_state
== DRXK_NO_DEV
)
6540 if (state
->m_drxk_state
== DRXK_UNINITIALIZED
)
6544 state
->fe_status
= 0;
6545 get_lock_status(state
, &stat
);
6546 if (stat
== MPEG_LOCK
)
6547 state
->fe_status
|= 0x1f;
6548 if (stat
== FEC_LOCK
)
6549 state
->fe_status
|= 0x0f;
6550 if (stat
== DEMOD_LOCK
)
6551 state
->fe_status
|= 0x07;
6554 * Estimate signal strength from AGC
6556 get_strength(state
, &c
->strength
.stat
[0].uvalue
);
6557 c
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
6560 if (stat
>= DEMOD_LOCK
) {
6561 get_signal_to_noise(state
, &cnr
);
6562 c
->cnr
.stat
[0].svalue
= cnr
* 100;
6563 c
->cnr
.stat
[0].scale
= FE_SCALE_DECIBEL
;
6565 c
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6568 if (stat
< FEC_LOCK
) {
6569 c
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6570 c
->block_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6571 c
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6572 c
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6573 c
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6574 c
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6580 /* BER measurement is valid if at least FEC lock is achieved */
6583 * OFDM_EC_VD_REQ_SMB_CNT__A and/or OFDM_EC_VD_REQ_BIT_CNT can be
6584 * written to set nr of symbols or bits over which to measure
6585 * EC_VD_REG_ERR_BIT_CNT__A . See CtrlSetCfg().
6588 /* Read registers for post/preViterbi BER calculation */
6589 status
= read16(state
, OFDM_EC_VD_ERR_BIT_CNT__A
, ®16
);
6592 pre_bit_err_count
= reg16
;
6594 status
= read16(state
, OFDM_EC_VD_IN_BIT_CNT__A
, ®16
);
6597 pre_bit_count
= reg16
;
6599 /* Number of bit-errors */
6600 status
= read16(state
, FEC_RS_NR_BIT_ERRORS__A
, ®16
);
6603 post_bit_err_count
= reg16
;
6605 status
= read16(state
, FEC_RS_MEASUREMENT_PRESCALE__A
, ®16
);
6608 post_bit_error_scale
= reg16
;
6610 status
= read16(state
, FEC_RS_MEASUREMENT_PERIOD__A
, ®16
);
6615 status
= read16(state
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, ®16
);
6618 pkt_error_count
= reg16
;
6619 write16(state
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, 0);
6621 post_bit_err_count
*= post_bit_error_scale
;
6623 post_bit_count
= pkt_count
* 204 * 8;
6625 /* Store the results */
6626 c
->block_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
6627 c
->block_error
.stat
[0].uvalue
+= pkt_error_count
;
6628 c
->block_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
6629 c
->block_count
.stat
[0].uvalue
+= pkt_count
;
6631 c
->pre_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
6632 c
->pre_bit_error
.stat
[0].uvalue
+= pre_bit_err_count
;
6633 c
->pre_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
6634 c
->pre_bit_count
.stat
[0].uvalue
+= pre_bit_count
;
6636 c
->post_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
6637 c
->post_bit_error
.stat
[0].uvalue
+= post_bit_err_count
;
6638 c
->post_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
6639 c
->post_bit_count
.stat
[0].uvalue
+= post_bit_count
;
6646 static int drxk_read_status(struct dvb_frontend
*fe
, enum fe_status
*status
)
6648 struct drxk_state
*state
= fe
->demodulator_priv
;
6653 rc
= drxk_get_stats(fe
);
6657 *status
= state
->fe_status
;
6662 static int drxk_read_signal_strength(struct dvb_frontend
*fe
,
6665 struct drxk_state
*state
= fe
->demodulator_priv
;
6666 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
6670 if (state
->m_drxk_state
== DRXK_NO_DEV
)
6672 if (state
->m_drxk_state
== DRXK_UNINITIALIZED
)
6675 *strength
= c
->strength
.stat
[0].uvalue
;
6679 static int drxk_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
6681 struct drxk_state
*state
= fe
->demodulator_priv
;
6686 if (state
->m_drxk_state
== DRXK_NO_DEV
)
6688 if (state
->m_drxk_state
== DRXK_UNINITIALIZED
)
6691 get_signal_to_noise(state
, &snr2
);
6693 /* No negative SNR, clip to zero */
6696 *snr
= snr2
& 0xffff;
6700 static int drxk_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucblocks
)
6702 struct drxk_state
*state
= fe
->demodulator_priv
;
6707 if (state
->m_drxk_state
== DRXK_NO_DEV
)
6709 if (state
->m_drxk_state
== DRXK_UNINITIALIZED
)
6712 dvbtqam_get_acc_pkt_err(state
, &err
);
6713 *ucblocks
= (u32
) err
;
6717 static int drxk_get_tune_settings(struct dvb_frontend
*fe
,
6718 struct dvb_frontend_tune_settings
*sets
)
6720 struct drxk_state
*state
= fe
->demodulator_priv
;
6721 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
6725 if (state
->m_drxk_state
== DRXK_NO_DEV
)
6727 if (state
->m_drxk_state
== DRXK_UNINITIALIZED
)
6730 switch (p
->delivery_system
) {
6731 case SYS_DVBC_ANNEX_A
:
6732 case SYS_DVBC_ANNEX_C
:
6734 sets
->min_delay_ms
= 3000;
6735 sets
->max_drift
= 0;
6736 sets
->step_size
= 0;
6743 static const struct dvb_frontend_ops drxk_ops
= {
6744 /* .delsys will be filled dynamically */
6747 .frequency_min
= 47000000,
6748 .frequency_max
= 865000000,
6750 .symbol_rate_min
= 870000,
6751 .symbol_rate_max
= 11700000,
6753 .frequency_stepsize
= 166667,
6755 .caps
= FE_CAN_QAM_16
| FE_CAN_QAM_32
| FE_CAN_QAM_64
|
6756 FE_CAN_QAM_128
| FE_CAN_QAM_256
| FE_CAN_FEC_AUTO
|
6757 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
6758 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
| FE_CAN_MUTE_TS
|
6759 FE_CAN_TRANSMISSION_MODE_AUTO
| FE_CAN_RECOVER
|
6760 FE_CAN_GUARD_INTERVAL_AUTO
| FE_CAN_HIERARCHY_AUTO
6763 .release
= drxk_release
,
6764 .sleep
= drxk_sleep
,
6765 .i2c_gate_ctrl
= drxk_gate_ctrl
,
6767 .set_frontend
= drxk_set_parameters
,
6768 .get_tune_settings
= drxk_get_tune_settings
,
6770 .read_status
= drxk_read_status
,
6771 .read_signal_strength
= drxk_read_signal_strength
,
6772 .read_snr
= drxk_read_snr
,
6773 .read_ucblocks
= drxk_read_ucblocks
,
6776 struct dvb_frontend
*drxk_attach(const struct drxk_config
*config
,
6777 struct i2c_adapter
*i2c
)
6779 struct dtv_frontend_properties
*p
;
6780 struct drxk_state
*state
= NULL
;
6781 u8 adr
= config
->adr
;
6785 state
= kzalloc(sizeof(struct drxk_state
), GFP_KERNEL
);
6790 state
->demod_address
= adr
;
6791 state
->single_master
= config
->single_master
;
6792 state
->microcode_name
= config
->microcode_name
;
6793 state
->qam_demod_parameter_count
= config
->qam_demod_parameter_count
;
6794 state
->no_i2c_bridge
= config
->no_i2c_bridge
;
6795 state
->antenna_gpio
= config
->antenna_gpio
;
6796 state
->antenna_dvbt
= config
->antenna_dvbt
;
6797 state
->m_chunk_size
= config
->chunk_size
;
6798 state
->enable_merr_cfg
= config
->enable_merr_cfg
;
6800 if (config
->dynamic_clk
) {
6801 state
->m_dvbt_static_clk
= false;
6802 state
->m_dvbc_static_clk
= false;
6804 state
->m_dvbt_static_clk
= true;
6805 state
->m_dvbc_static_clk
= true;
6809 if (config
->mpeg_out_clk_strength
)
6810 state
->m_ts_clockk_strength
= config
->mpeg_out_clk_strength
& 0x07;
6812 state
->m_ts_clockk_strength
= 0x06;
6814 if (config
->parallel_ts
)
6815 state
->m_enable_parallel
= true;
6817 state
->m_enable_parallel
= false;
6819 /* NOTE: as more UIO bits will be used, add them to the mask */
6820 state
->uio_mask
= config
->antenna_gpio
;
6822 /* Default gpio to DVB-C */
6823 if (!state
->antenna_dvbt
&& state
->antenna_gpio
)
6824 state
->m_gpio
|= state
->antenna_gpio
;
6826 state
->m_gpio
&= ~state
->antenna_gpio
;
6828 mutex_init(&state
->mutex
);
6830 memcpy(&state
->frontend
.ops
, &drxk_ops
, sizeof(drxk_ops
));
6831 state
->frontend
.demodulator_priv
= state
;
6835 /* Load firmware and initialize DRX-K */
6836 if (state
->microcode_name
) {
6837 const struct firmware
*fw
= NULL
;
6839 status
= request_firmware(&fw
, state
->microcode_name
,
6840 state
->i2c
->dev
.parent
);
6843 load_firmware_cb(fw
, state
);
6844 } else if (init_drxk(state
) < 0)
6848 /* Initialize stats */
6849 p
= &state
->frontend
.dtv_property_cache
;
6850 p
->strength
.len
= 1;
6852 p
->block_error
.len
= 1;
6853 p
->block_count
.len
= 1;
6854 p
->pre_bit_error
.len
= 1;
6855 p
->pre_bit_count
.len
= 1;
6856 p
->post_bit_error
.len
= 1;
6857 p
->post_bit_count
.len
= 1;
6859 p
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
6860 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6861 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6862 p
->block_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6863 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6864 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6865 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6866 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
6868 pr_info("frontend initialized.\n");
6869 return &state
->frontend
;
6872 pr_err("not found\n");
6876 EXPORT_SYMBOL(drxk_attach
);
6878 MODULE_DESCRIPTION("DRX-K driver");
6879 MODULE_AUTHOR("Ralph Metzler");
6880 MODULE_LICENSE("GPL");