2 Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc.
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
8 * Redistributions of source code must retain the above copyright notice,
9 this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright notice,
11 this list of conditions and the following disclaimer in the documentation
12 and/or other materials provided with the distribution.
13 * Neither the name of Trident Microsystems nor Hauppauge Computer Works
14 nor the names of its contributors may be used to endorse or promote
15 products derived from this software without specific prior written
18 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 POSSIBILITY OF SUCH DAMAGE.
30 DRXJ specific implementation of DRX driver
31 authors: Dragan Savic, Milos Nikolic, Mihajlo Katona, Tao Ding, Paul Janssen
33 The Linux DVB Driver for Micronas DRX39xx family (drx3933j) was
34 written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
36 This program is free software; you can redistribute it and/or modify
37 it under the terms of the GNU General Public License as published by
38 the Free Software Foundation; either version 2 of the License, or
39 (at your option) any later version.
41 This program is distributed in the hope that it will be useful,
42 but WITHOUT ANY WARRANTY; without even the implied warranty of
43 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
45 GNU General Public License for more details.
47 You should have received a copy of the GNU General Public License
48 along with this program; if not, write to the Free Software
49 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
52 /*-----------------------------------------------------------------------------
54 ----------------------------------------------------------------------------*/
56 #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
58 #include <linux/module.h>
59 #include <linux/init.h>
60 #include <linux/string.h>
61 #include <linux/slab.h>
62 #include <asm/div64.h>
64 #include "dvb_frontend.h"
70 /*============================================================================*/
71 /*=== DEFINES ================================================================*/
72 /*============================================================================*/
74 #define DRX39XX_MAIN_FIRMWARE "dvb-fe-drxj-mc-1.0.8.fw"
77 * \brief Maximum u32 value.
80 #define MAX_U32 ((u32) (0xFFFFFFFFL))
83 /* Customer configurable hardware settings, etc */
84 #ifndef MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
85 #define MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
88 #ifndef MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
89 #define MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
92 #ifndef MPEG_OUTPUT_CLK_DRIVE_STRENGTH
93 #define MPEG_OUTPUT_CLK_DRIVE_STRENGTH 0x06
96 #ifndef OOB_CRX_DRIVE_STRENGTH
97 #define OOB_CRX_DRIVE_STRENGTH 0x02
100 #ifndef OOB_DRX_DRIVE_STRENGTH
101 #define OOB_DRX_DRIVE_STRENGTH 0x02
103 /**** START DJCOMBO patches to DRXJ registermap constants *********************/
104 /**** registermap 200706071303 from drxj **************************************/
105 #define ATV_TOP_CR_AMP_TH_FM 0x0
106 #define ATV_TOP_CR_AMP_TH_L 0xA
107 #define ATV_TOP_CR_AMP_TH_LP 0xA
108 #define ATV_TOP_CR_AMP_TH_BG 0x8
109 #define ATV_TOP_CR_AMP_TH_DK 0x8
110 #define ATV_TOP_CR_AMP_TH_I 0x8
111 #define ATV_TOP_CR_CONT_CR_D_MN 0x18
112 #define ATV_TOP_CR_CONT_CR_D_FM 0x0
113 #define ATV_TOP_CR_CONT_CR_D_L 0x20
114 #define ATV_TOP_CR_CONT_CR_D_LP 0x20
115 #define ATV_TOP_CR_CONT_CR_D_BG 0x18
116 #define ATV_TOP_CR_CONT_CR_D_DK 0x18
117 #define ATV_TOP_CR_CONT_CR_D_I 0x18
118 #define ATV_TOP_CR_CONT_CR_I_MN 0x80
119 #define ATV_TOP_CR_CONT_CR_I_FM 0x0
120 #define ATV_TOP_CR_CONT_CR_I_L 0x80
121 #define ATV_TOP_CR_CONT_CR_I_LP 0x80
122 #define ATV_TOP_CR_CONT_CR_I_BG 0x80
123 #define ATV_TOP_CR_CONT_CR_I_DK 0x80
124 #define ATV_TOP_CR_CONT_CR_I_I 0x80
125 #define ATV_TOP_CR_CONT_CR_P_MN 0x4
126 #define ATV_TOP_CR_CONT_CR_P_FM 0x0
127 #define ATV_TOP_CR_CONT_CR_P_L 0x4
128 #define ATV_TOP_CR_CONT_CR_P_LP 0x4
129 #define ATV_TOP_CR_CONT_CR_P_BG 0x4
130 #define ATV_TOP_CR_CONT_CR_P_DK 0x4
131 #define ATV_TOP_CR_CONT_CR_P_I 0x4
132 #define ATV_TOP_CR_OVM_TH_MN 0xA0
133 #define ATV_TOP_CR_OVM_TH_FM 0x0
134 #define ATV_TOP_CR_OVM_TH_L 0xA0
135 #define ATV_TOP_CR_OVM_TH_LP 0xA0
136 #define ATV_TOP_CR_OVM_TH_BG 0xA0
137 #define ATV_TOP_CR_OVM_TH_DK 0xA0
138 #define ATV_TOP_CR_OVM_TH_I 0xA0
139 #define ATV_TOP_EQU0_EQU_C0_FM 0x0
140 #define ATV_TOP_EQU0_EQU_C0_L 0x3
141 #define ATV_TOP_EQU0_EQU_C0_LP 0x3
142 #define ATV_TOP_EQU0_EQU_C0_BG 0x7
143 #define ATV_TOP_EQU0_EQU_C0_DK 0x0
144 #define ATV_TOP_EQU0_EQU_C0_I 0x3
145 #define ATV_TOP_EQU1_EQU_C1_FM 0x0
146 #define ATV_TOP_EQU1_EQU_C1_L 0x1F6
147 #define ATV_TOP_EQU1_EQU_C1_LP 0x1F6
148 #define ATV_TOP_EQU1_EQU_C1_BG 0x197
149 #define ATV_TOP_EQU1_EQU_C1_DK 0x198
150 #define ATV_TOP_EQU1_EQU_C1_I 0x1F6
151 #define ATV_TOP_EQU2_EQU_C2_FM 0x0
152 #define ATV_TOP_EQU2_EQU_C2_L 0x28
153 #define ATV_TOP_EQU2_EQU_C2_LP 0x28
154 #define ATV_TOP_EQU2_EQU_C2_BG 0xC5
155 #define ATV_TOP_EQU2_EQU_C2_DK 0xB0
156 #define ATV_TOP_EQU2_EQU_C2_I 0x28
157 #define ATV_TOP_EQU3_EQU_C3_FM 0x0
158 #define ATV_TOP_EQU3_EQU_C3_L 0x192
159 #define ATV_TOP_EQU3_EQU_C3_LP 0x192
160 #define ATV_TOP_EQU3_EQU_C3_BG 0x12E
161 #define ATV_TOP_EQU3_EQU_C3_DK 0x18E
162 #define ATV_TOP_EQU3_EQU_C3_I 0x192
163 #define ATV_TOP_STD_MODE_MN 0x0
164 #define ATV_TOP_STD_MODE_FM 0x1
165 #define ATV_TOP_STD_MODE_L 0x0
166 #define ATV_TOP_STD_MODE_LP 0x0
167 #define ATV_TOP_STD_MODE_BG 0x0
168 #define ATV_TOP_STD_MODE_DK 0x0
169 #define ATV_TOP_STD_MODE_I 0x0
170 #define ATV_TOP_STD_VID_POL_MN 0x0
171 #define ATV_TOP_STD_VID_POL_FM 0x0
172 #define ATV_TOP_STD_VID_POL_L 0x2
173 #define ATV_TOP_STD_VID_POL_LP 0x2
174 #define ATV_TOP_STD_VID_POL_BG 0x0
175 #define ATV_TOP_STD_VID_POL_DK 0x0
176 #define ATV_TOP_STD_VID_POL_I 0x0
177 #define ATV_TOP_VID_AMP_MN 0x380
178 #define ATV_TOP_VID_AMP_FM 0x0
179 #define ATV_TOP_VID_AMP_L 0xF50
180 #define ATV_TOP_VID_AMP_LP 0xF50
181 #define ATV_TOP_VID_AMP_BG 0x380
182 #define ATV_TOP_VID_AMP_DK 0x394
183 #define ATV_TOP_VID_AMP_I 0x3D8
184 #define IQM_CF_OUT_ENA_OFDM__M 0x4
185 #define IQM_FS_ADJ_SEL_B_QAM 0x1
186 #define IQM_FS_ADJ_SEL_B_OFF 0x0
187 #define IQM_FS_ADJ_SEL_B_VSB 0x2
188 #define IQM_RC_ADJ_SEL_B_OFF 0x0
189 #define IQM_RC_ADJ_SEL_B_QAM 0x1
190 #define IQM_RC_ADJ_SEL_B_VSB 0x2
191 /**** END DJCOMBO patches to DRXJ registermap *********************************/
193 #include "drx_driver_version.h"
195 /* #define DRX_DEBUG */
200 /*-----------------------------------------------------------------------------
202 ----------------------------------------------------------------------------*/
204 /*-----------------------------------------------------------------------------
206 ----------------------------------------------------------------------------*/
207 #ifndef DRXJ_WAKE_UP_KEY
208 #define DRXJ_WAKE_UP_KEY (demod->my_i2c_dev_addr->i2c_addr)
212 * \def DRXJ_DEF_I2C_ADDR
213 * \brief Default I2C address of a demodulator instance.
215 #define DRXJ_DEF_I2C_ADDR (0x52)
218 * \def DRXJ_DEF_DEMOD_DEV_ID
219 * \brief Default device identifier of a demodultor instance.
221 #define DRXJ_DEF_DEMOD_DEV_ID (1)
224 * \def DRXJ_SCAN_TIMEOUT
225 * \brief Timeout value for waiting on demod lock during channel scan (millisec).
227 #define DRXJ_SCAN_TIMEOUT 1000
231 * \brief HI timing delay for I2C timing (in nano seconds)
233 * Used to compute HI_CFG_DIV
235 #define HI_I2C_DELAY 42
238 * \def HI_I2C_BRIDGE_DELAY
239 * \brief HI timing delay for I2C timing (in nano seconds)
241 * Used to compute HI_CFG_BDL
243 #define HI_I2C_BRIDGE_DELAY 750
246 * \brief Time Window for MER and SER Measurement in Units of Segment duration.
248 #define VSB_TOP_MEASUREMENT_PERIOD 64
249 #define SYMBOLS_PER_SEGMENT 832
252 * \brief bit rate and segment rate constants used for SER and BER.
254 /* values taken from the QAM microcode */
255 #define DRXJ_QAM_SL_SIG_POWER_QAM_UNKNOWN 0
256 #define DRXJ_QAM_SL_SIG_POWER_QPSK 32768
257 #define DRXJ_QAM_SL_SIG_POWER_QAM8 24576
258 #define DRXJ_QAM_SL_SIG_POWER_QAM16 40960
259 #define DRXJ_QAM_SL_SIG_POWER_QAM32 20480
260 #define DRXJ_QAM_SL_SIG_POWER_QAM64 43008
261 #define DRXJ_QAM_SL_SIG_POWER_QAM128 20992
262 #define DRXJ_QAM_SL_SIG_POWER_QAM256 43520
264 * \brief Min supported symbolrates.
266 #ifndef DRXJ_QAM_SYMBOLRATE_MIN
267 #define DRXJ_QAM_SYMBOLRATE_MIN (520000)
271 * \brief Max supported symbolrates.
273 #ifndef DRXJ_QAM_SYMBOLRATE_MAX
274 #define DRXJ_QAM_SYMBOLRATE_MAX (7233000)
278 * \def DRXJ_QAM_MAX_WAITTIME
279 * \brief Maximal wait time for QAM auto constellation in ms
281 #ifndef DRXJ_QAM_MAX_WAITTIME
282 #define DRXJ_QAM_MAX_WAITTIME 900
285 #ifndef DRXJ_QAM_FEC_LOCK_WAITTIME
286 #define DRXJ_QAM_FEC_LOCK_WAITTIME 150
289 #ifndef DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
290 #define DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME 200
294 * \def SCU status and results
297 #define DRX_SCU_READY 0
298 #define DRXJ_MAX_WAITTIME 100 /* ms */
299 #define FEC_RS_MEASUREMENT_PERIOD 12894 /* 1 sec */
300 #define FEC_RS_MEASUREMENT_PRESCALE 1 /* n sec */
303 * \def DRX_AUD_MAX_DEVIATION
304 * \brief Needed for calculation of prescale feature in AUD
306 #ifndef DRXJ_AUD_MAX_FM_DEVIATION
307 #define DRXJ_AUD_MAX_FM_DEVIATION 100 /* kHz */
311 * \brief Needed for calculation of NICAM prescale feature in AUD
313 #ifndef DRXJ_AUD_MAX_NICAM_PRESCALE
314 #define DRXJ_AUD_MAX_NICAM_PRESCALE (9) /* dB */
318 * \brief Needed for calculation of NICAM prescale feature in AUD
320 #ifndef DRXJ_AUD_MAX_WAITTIME
321 #define DRXJ_AUD_MAX_WAITTIME 250 /* ms */
324 /* ATV config changed flags */
325 #define DRXJ_ATV_CHANGED_COEF (0x00000001UL)
326 #define DRXJ_ATV_CHANGED_PEAK_FLT (0x00000008UL)
327 #define DRXJ_ATV_CHANGED_NOISE_FLT (0x00000010UL)
328 #define DRXJ_ATV_CHANGED_OUTPUT (0x00000020UL)
329 #define DRXJ_ATV_CHANGED_SIF_ATT (0x00000040UL)
332 #define DRX_UIO_MODE_FIRMWARE_SMA DRX_UIO_MODE_FIRMWARE0
333 #define DRX_UIO_MODE_FIRMWARE_SAW DRX_UIO_MODE_FIRMWARE1
336 * MICROCODE RELATED DEFINES
339 /* Magic word for checking correct Endianness of microcode data */
340 #define DRX_UCODE_MAGIC_WORD ((((u16)'H')<<8)+((u16)'L'))
342 /* CRC flag in ucode header, flags field. */
343 #define DRX_UCODE_CRC_FLAG (0x0001)
346 * Maximum size of buffer used to verify the microcode.
347 * Must be an even number
349 #define DRX_UCODE_MAX_BUF_SIZE (DRXDAP_MAX_RCHUNKSIZE)
351 #if DRX_UCODE_MAX_BUF_SIZE & 1
352 #error DRX_UCODE_MAX_BUF_SIZE must be an even number
359 #define DRX_ISPOWERDOWNMODE(mode) ((mode == DRX_POWER_MODE_9) || \
360 (mode == DRX_POWER_MODE_10) || \
361 (mode == DRX_POWER_MODE_11) || \
362 (mode == DRX_POWER_MODE_12) || \
363 (mode == DRX_POWER_MODE_13) || \
364 (mode == DRX_POWER_MODE_14) || \
365 (mode == DRX_POWER_MODE_15) || \
366 (mode == DRX_POWER_MODE_16) || \
367 (mode == DRX_POWER_DOWN))
369 /* Pin safe mode macro */
370 #define DRXJ_PIN_SAFE_MODE 0x0000
371 /*============================================================================*/
372 /*=== GLOBAL VARIABLEs =======================================================*/
373 /*============================================================================*/
378 * \brief Temporary register definitions.
379 * (register definitions that are not yet available in register master)
382 /******************************************************************************/
383 /* Audio block 0x103 is write only. To avoid shadowing in driver accessing */
384 /* RAM adresses directly. This must be READ ONLY to avoid problems. */
385 /* Writing to the interface adresses is more than only writing the RAM */
387 /******************************************************************************/
389 * \brief RAM location of MODUS registers
391 #define AUD_DEM_RAM_MODUS_HI__A 0x10204A3
392 #define AUD_DEM_RAM_MODUS_HI__M 0xF000
394 #define AUD_DEM_RAM_MODUS_LO__A 0x10204A4
395 #define AUD_DEM_RAM_MODUS_LO__M 0x0FFF
398 * \brief RAM location of I2S config registers
400 #define AUD_DEM_RAM_I2S_CONFIG1__A 0x10204B1
401 #define AUD_DEM_RAM_I2S_CONFIG2__A 0x10204B2
404 * \brief RAM location of DCO config registers
406 #define AUD_DEM_RAM_DCO_B_HI__A 0x1020461
407 #define AUD_DEM_RAM_DCO_B_LO__A 0x1020462
408 #define AUD_DEM_RAM_DCO_A_HI__A 0x1020463
409 #define AUD_DEM_RAM_DCO_A_LO__A 0x1020464
412 * \brief RAM location of Threshold registers
414 #define AUD_DEM_RAM_NICAM_THRSHLD__A 0x102045A
415 #define AUD_DEM_RAM_A2_THRSHLD__A 0x10204BB
416 #define AUD_DEM_RAM_BTSC_THRSHLD__A 0x10204A6
419 * \brief RAM location of Carrier Threshold registers
421 #define AUD_DEM_RAM_CM_A_THRSHLD__A 0x10204AF
422 #define AUD_DEM_RAM_CM_B_THRSHLD__A 0x10204B0
425 * \brief FM Matrix register fix
427 #ifdef AUD_DEM_WR_FM_MATRIX__A
428 #undef AUD_DEM_WR_FM_MATRIX__A
430 #define AUD_DEM_WR_FM_MATRIX__A 0x105006F
432 /*============================================================================*/
434 * \brief Defines required for audio
436 #define AUD_VOLUME_ZERO_DB 115
437 #define AUD_VOLUME_DB_MIN -60
438 #define AUD_VOLUME_DB_MAX 12
439 #define AUD_CARRIER_STRENGTH_QP_0DB 0x4000
440 #define AUD_CARRIER_STRENGTH_QP_0DB_LOG10T100 421
441 #define AUD_MAX_AVC_REF_LEVEL 15
442 #define AUD_I2S_FREQUENCY_MAX 48000UL
443 #define AUD_I2S_FREQUENCY_MIN 12000UL
444 #define AUD_RDS_ARRAY_SIZE 18
447 * \brief Needed for calculation of prescale feature in AUD
449 #ifndef DRX_AUD_MAX_FM_DEVIATION
450 #define DRX_AUD_MAX_FM_DEVIATION (100) /* kHz */
454 * \brief Needed for calculation of NICAM prescale feature in AUD
456 #ifndef DRX_AUD_MAX_NICAM_PRESCALE
457 #define DRX_AUD_MAX_NICAM_PRESCALE (9) /* dB */
460 /*============================================================================*/
461 /* Values for I2S Master/Slave pin configurations */
462 #define SIO_PDR_I2S_CL_CFG_MODE__MASTER 0x0004
463 #define SIO_PDR_I2S_CL_CFG_DRIVE__MASTER 0x0008
464 #define SIO_PDR_I2S_CL_CFG_MODE__SLAVE 0x0004
465 #define SIO_PDR_I2S_CL_CFG_DRIVE__SLAVE 0x0000
467 #define SIO_PDR_I2S_DA_CFG_MODE__MASTER 0x0003
468 #define SIO_PDR_I2S_DA_CFG_DRIVE__MASTER 0x0008
469 #define SIO_PDR_I2S_DA_CFG_MODE__SLAVE 0x0003
470 #define SIO_PDR_I2S_DA_CFG_DRIVE__SLAVE 0x0008
472 #define SIO_PDR_I2S_WS_CFG_MODE__MASTER 0x0004
473 #define SIO_PDR_I2S_WS_CFG_DRIVE__MASTER 0x0008
474 #define SIO_PDR_I2S_WS_CFG_MODE__SLAVE 0x0004
475 #define SIO_PDR_I2S_WS_CFG_DRIVE__SLAVE 0x0000
477 /*============================================================================*/
478 /*=== REGISTER ACCESS MACROS =================================================*/
479 /*============================================================================*/
482 * This macro is used to create byte arrays for block writes.
483 * Block writes speed up I2C traffic between host and demod.
484 * The macro takes care of the required byte order in a 16 bits word.
485 * x -> lowbyte(x), highbyte(x)
487 #define DRXJ_16TO8(x) ((u8) (((u16)x) & 0xFF)), \
488 ((u8)((((u16)x)>>8)&0xFF))
490 * This macro is used to convert byte array to 16 bit register value for block read.
491 * Block read speed up I2C traffic between host and demod.
492 * The macro takes care of the required byte order in a 16 bits word.
494 #define DRXJ_8TO16(x) ((u16) (x[0] | (x[1] << 8)))
496 /*============================================================================*/
497 /*=== MISC DEFINES ===========================================================*/
498 /*============================================================================*/
500 /*============================================================================*/
501 /*=== HI COMMAND RELATED DEFINES =============================================*/
502 /*============================================================================*/
505 * \brief General maximum number of retries for ucode command interfaces
507 #define DRXJ_MAX_RETRIES (100)
509 /*============================================================================*/
510 /*=== STANDARD RELATED MACROS ================================================*/
511 /*============================================================================*/
513 #define DRXJ_ISATVSTD(std) ((std == DRX_STANDARD_PAL_SECAM_BG) || \
514 (std == DRX_STANDARD_PAL_SECAM_DK) || \
515 (std == DRX_STANDARD_PAL_SECAM_I) || \
516 (std == DRX_STANDARD_PAL_SECAM_L) || \
517 (std == DRX_STANDARD_PAL_SECAM_LP) || \
518 (std == DRX_STANDARD_NTSC) || \
519 (std == DRX_STANDARD_FM))
521 #define DRXJ_ISQAMSTD(std) ((std == DRX_STANDARD_ITU_A) || \
522 (std == DRX_STANDARD_ITU_B) || \
523 (std == DRX_STANDARD_ITU_C) || \
524 (std == DRX_STANDARD_ITU_D))
526 /*-----------------------------------------------------------------------------
528 ----------------------------------------------------------------------------*/
530 * DRXJ DAP structures
533 static int drxdap_fasi_read_block(struct i2c_device_addr
*dev_addr
,
536 u8
*data
, u32 flags
);
539 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr
*dev_addr
,
542 u16 wdata
, u16
*rdata
);
544 static int drxj_dap_read_reg16(struct i2c_device_addr
*dev_addr
,
546 u16
*data
, u32 flags
);
548 static int drxdap_fasi_read_reg32(struct i2c_device_addr
*dev_addr
,
550 u32
*data
, u32 flags
);
552 static int drxdap_fasi_write_block(struct i2c_device_addr
*dev_addr
,
555 u8
*data
, u32 flags
);
557 static int drxj_dap_write_reg16(struct i2c_device_addr
*dev_addr
,
559 u16 data
, u32 flags
);
561 static int drxdap_fasi_write_reg32(struct i2c_device_addr
*dev_addr
,
563 u32 data
, u32 flags
);
565 static struct drxj_data drxj_data_g
= {
566 false, /* has_lna : true if LNA (aka PGA) present */
567 false, /* has_oob : true if OOB supported */
568 false, /* has_ntsc: true if NTSC supported */
569 false, /* has_btsc: true if BTSC supported */
570 false, /* has_smatx: true if SMA_TX pin is available */
571 false, /* has_smarx: true if SMA_RX pin is available */
572 false, /* has_gpio : true if GPIO pin is available */
573 false, /* has_irqn : true if IRQN pin is available */
574 0, /* mfx A1/A2/A... */
577 false, /* tuner mirrors RF signal */
578 /* standard/channel settings */
579 DRX_STANDARD_UNKNOWN
, /* current standard */
580 DRX_CONSTELLATION_AUTO
, /* constellation */
581 0, /* frequency in KHz */
582 DRX_BANDWIDTH_UNKNOWN
, /* curr_bandwidth */
583 DRX_MIRROR_NO
, /* mirror */
585 /* signal quality information: */
586 /* default values taken from the QAM Programming guide */
587 /* fec_bits_desired should not be less than 4000000 */
588 4000000, /* fec_bits_desired */
590 4, /* qam_vd_prescale */
591 0xFFFF, /* qamVDPeriod */
592 204 * 8, /* fec_rs_plen annex A */
593 1, /* fec_rs_prescale */
594 FEC_RS_MEASUREMENT_PERIOD
, /* fec_rs_period */
595 true, /* reset_pkt_err_acc */
596 0, /* pkt_err_acc_start */
598 /* HI configuration */
599 0, /* hi_cfg_timing_div */
600 0, /* hi_cfg_bridge_delay */
601 0, /* hi_cfg_wake_up_key */
603 0, /* HICfgTimeout */
604 /* UIO configuartion */
605 DRX_UIO_MODE_DISABLE
, /* uio_sma_rx_mode */
606 DRX_UIO_MODE_DISABLE
, /* uio_sma_tx_mode */
607 DRX_UIO_MODE_DISABLE
, /* uioASELMode */
608 DRX_UIO_MODE_DISABLE
, /* uio_irqn_mode */
610 0UL, /* iqm_fs_rate_ofs */
611 false, /* pos_image */
613 0UL, /* iqm_rc_rate_ofs */
614 /* AUD information */
615 /* false, * flagSetAUDdone */
616 /* false, * detectedRDS */
617 /* true, * flagASDRequest */
618 /* false, * flagHDevClear */
619 /* false, * flagHDevSet */
620 /* (u16) 0xFFF, * rdsLastCount */
622 /* ATV configuartion */
623 0UL, /* flags cfg changes */
624 /* shadow of ATV_TOP_EQU0__A */
626 ATV_TOP_EQU0_EQU_C0_FM
,
627 ATV_TOP_EQU0_EQU_C0_L
,
628 ATV_TOP_EQU0_EQU_C0_LP
,
629 ATV_TOP_EQU0_EQU_C0_BG
,
630 ATV_TOP_EQU0_EQU_C0_DK
,
631 ATV_TOP_EQU0_EQU_C0_I
},
632 /* shadow of ATV_TOP_EQU1__A */
634 ATV_TOP_EQU1_EQU_C1_FM
,
635 ATV_TOP_EQU1_EQU_C1_L
,
636 ATV_TOP_EQU1_EQU_C1_LP
,
637 ATV_TOP_EQU1_EQU_C1_BG
,
638 ATV_TOP_EQU1_EQU_C1_DK
,
639 ATV_TOP_EQU1_EQU_C1_I
},
640 /* shadow of ATV_TOP_EQU2__A */
642 ATV_TOP_EQU2_EQU_C2_FM
,
643 ATV_TOP_EQU2_EQU_C2_L
,
644 ATV_TOP_EQU2_EQU_C2_LP
,
645 ATV_TOP_EQU2_EQU_C2_BG
,
646 ATV_TOP_EQU2_EQU_C2_DK
,
647 ATV_TOP_EQU2_EQU_C2_I
},
648 /* shadow of ATV_TOP_EQU3__A */
650 ATV_TOP_EQU3_EQU_C3_FM
,
651 ATV_TOP_EQU3_EQU_C3_L
,
652 ATV_TOP_EQU3_EQU_C3_LP
,
653 ATV_TOP_EQU3_EQU_C3_BG
,
654 ATV_TOP_EQU3_EQU_C3_DK
,
655 ATV_TOP_EQU3_EQU_C3_I
},
656 false, /* flag: true=bypass */
657 ATV_TOP_VID_PEAK__PRE
, /* shadow of ATV_TOP_VID_PEAK__A */
658 ATV_TOP_NOISE_TH__PRE
, /* shadow of ATV_TOP_NOISE_TH__A */
659 true, /* flag CVBS ouput enable */
660 false, /* flag SIF ouput enable */
661 DRXJ_SIF_ATTENUATION_0DB
, /* current SIF att setting */
662 { /* qam_rf_agc_cfg */
663 DRX_STANDARD_ITU_B
, /* standard */
664 DRX_AGC_CTRL_AUTO
, /* ctrl_mode */
665 0, /* output_level */
666 0, /* min_output_level */
667 0xFFFF, /* max_output_level */
672 { /* qam_if_agc_cfg */
673 DRX_STANDARD_ITU_B
, /* standard */
674 DRX_AGC_CTRL_AUTO
, /* ctrl_mode */
675 0, /* output_level */
676 0, /* min_output_level */
677 0xFFFF, /* max_output_level */
679 0x0000, /* top (don't care) */
680 0x0000 /* c.o.c. (don't care) */
682 { /* vsb_rf_agc_cfg */
683 DRX_STANDARD_8VSB
, /* standard */
684 DRX_AGC_CTRL_AUTO
, /* ctrl_mode */
685 0, /* output_level */
686 0, /* min_output_level */
687 0xFFFF, /* max_output_level */
689 0x0000, /* top (don't care) */
690 0x0000 /* c.o.c. (don't care) */
692 { /* vsb_if_agc_cfg */
693 DRX_STANDARD_8VSB
, /* standard */
694 DRX_AGC_CTRL_AUTO
, /* ctrl_mode */
695 0, /* output_level */
696 0, /* min_output_level */
697 0xFFFF, /* max_output_level */
699 0x0000, /* top (don't care) */
700 0x0000 /* c.o.c. (don't care) */
704 { /* qam_pre_saw_cfg */
705 DRX_STANDARD_ITU_B
, /* standard */
707 false /* use_pre_saw */
709 { /* vsb_pre_saw_cfg */
710 DRX_STANDARD_8VSB
, /* standard */
712 false /* use_pre_saw */
715 /* Version information */
718 "01234567890", /* human readable version microcode */
719 "01234567890" /* human readable version device specific code */
722 { /* struct drx_version for microcode */
730 { /* struct drx_version for device specific code */
740 { /* struct drx_version_list for microcode */
741 (struct drx_version
*) (NULL
),
742 (struct drx_version_list
*) (NULL
)
744 { /* struct drx_version_list for device specific code */
745 (struct drx_version
*) (NULL
),
746 (struct drx_version_list
*) (NULL
)
750 false, /* smart_ant_inverted */
751 /* Tracking filter setting for OOB */
761 false, /* oob_power_on */
762 0, /* mpeg_ts_static_bitrate */
763 false, /* disable_te_ihandling */
764 false, /* bit_reverse_mpeg_outout */
765 DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO
, /* mpeg_output_clock_rate */
766 DRXJ_MPEG_START_WIDTH_1CLKCYC
, /* mpeg_start_width */
768 /* Pre SAW & Agc configuration for ATV */
770 DRX_STANDARD_NTSC
, /* standard */
772 true /* use_pre_saw */
775 DRX_STANDARD_NTSC
, /* standard */
776 DRX_AGC_CTRL_AUTO
, /* ctrl_mode */
777 0, /* output_level */
778 0, /* min_output_level (d.c.) */
779 0, /* max_output_level (d.c.) */
782 4000 /* cut-off current */
785 DRX_STANDARD_NTSC
, /* standard */
786 DRX_AGC_CTRL_AUTO
, /* ctrl_mode */
787 0, /* output_level */
788 0, /* min_output_level (d.c.) */
789 0, /* max_output_level (d.c.) */
792 0 /* c.o.c. (d.c.) */
794 140, /* ATV PGA config */
795 0, /* curr_symbol_rate */
797 false, /* pdr_safe_mode */
798 SIO_PDR_GPIO_CFG__PRE
, /* pdr_safe_restore_val_gpio */
799 SIO_PDR_VSYNC_CFG__PRE
, /* pdr_safe_restore_val_v_sync */
800 SIO_PDR_SMA_RX_CFG__PRE
, /* pdr_safe_restore_val_sma_rx */
801 SIO_PDR_SMA_TX_CFG__PRE
, /* pdr_safe_restore_val_sma_tx */
804 DRXJ_OOB_LO_POW_MINUS10DB
, /* oob_lo_pow */
806 false /* aud_data, only first member */
811 * \var drxj_default_addr_g
812 * \brief Default I2C address and device identifier.
814 static struct i2c_device_addr drxj_default_addr_g
= {
815 DRXJ_DEF_I2C_ADDR
, /* i2c address */
816 DRXJ_DEF_DEMOD_DEV_ID
/* device id */
820 * \var drxj_default_comm_attr_g
821 * \brief Default common attributes of a drxj demodulator instance.
823 static struct drx_common_attr drxj_default_comm_attr_g
= {
824 NULL
, /* ucode file */
825 true, /* ucode verify switch */
826 {0}, /* version record */
828 44000, /* IF in kHz in case no tuner instance is used */
829 (151875 - 0), /* system clock frequency in kHz */
830 0, /* oscillator frequency kHz */
831 0, /* oscillator deviation in ppm, signed */
832 false, /* If true mirror frequency spectrum */
834 /* MPEG output configuration */
835 true, /* If true, enable MPEG ouput */
836 false, /* If true, insert RS byte */
837 false, /* If true, parallel out otherwise serial */
838 false, /* If true, invert DATA signals */
839 false, /* If true, invert ERR signal */
840 false, /* If true, invert STR signals */
841 false, /* If true, invert VAL signals */
842 false, /* If true, invert CLK signals */
843 true, /* If true, static MPEG clockrate will
844 be used, otherwise clockrate will
845 adapt to the bitrate of the TS */
846 19392658UL, /* Maximum bitrate in b/s in case
847 static clockrate is selected */
848 DRX_MPEG_STR_WIDTH_1
/* MPEG Start width in clock cycles */
850 /* Initilisations below can be omitted, they require no user input and
851 are initialy 0, NULL or false. The compiler will initialize them to these
852 values when omitted. */
853 false, /* is_opened */
856 NULL
, /* no scan params yet */
857 0, /* current scan index */
858 0, /* next scan frequency */
859 false, /* scan ready flag */
860 0, /* max channels to scan */
861 0, /* nr of channels scanned */
862 NULL
, /* default scan function */
863 NULL
, /* default context pointer */
864 0, /* millisec to wait for demod lock */
865 DRXJ_DEMOD_LOCK
, /* desired lock */
868 /* Power management */
872 1, /* nr of I2C port to wich tuner is */
873 0L, /* minimum RF input frequency, in kHz */
874 0L, /* maximum RF input frequency, in kHz */
875 false, /* Rf Agc Polarity */
876 false, /* If Agc Polarity */
877 false, /* tuner slow mode */
879 { /* current channel (all 0) */
880 0UL /* channel.frequency */
882 DRX_STANDARD_UNKNOWN
, /* current standard */
883 DRX_STANDARD_UNKNOWN
, /* previous standard */
884 DRX_STANDARD_UNKNOWN
, /* di_cache_standard */
885 false, /* use_bootloader */
886 0UL, /* capabilities */
891 * \var drxj_default_demod_g
892 * \brief Default drxj demodulator instance.
894 static struct drx_demod_instance drxj_default_demod_g
= {
895 &drxj_default_addr_g
, /* i2c address & device id */
896 &drxj_default_comm_attr_g
, /* demod common attributes */
897 &drxj_data_g
/* demod device specific attributes */
901 * \brief Default audio data structure for DRK demodulator instance.
903 * This structure is DRXK specific.
906 static struct drx_aud_data drxj_default_aud_data_g
= {
907 false, /* audio_is_active */
908 DRX_AUD_STANDARD_AUTO
, /* audio_standard */
912 false, /* output_enable */
913 48000, /* frequency */
914 DRX_I2S_MODE_MASTER
, /* mode */
915 DRX_I2S_WORDLENGTH_32
, /* word_length */
916 DRX_I2S_POLARITY_RIGHT
, /* polarity */
917 DRX_I2S_FORMAT_WS_WITH_DATA
/* format */
923 DRX_AUD_AVC_OFF
, /* avc_mode */
924 0, /* avc_ref_level */
925 DRX_AUD_AVC_MAX_GAIN_12DB
, /* avc_max_gain */
926 DRX_AUD_AVC_MAX_ATTEN_24DB
, /* avc_max_atten */
927 0, /* strength_left */
928 0 /* strength_right */
930 DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_ON
, /* auto_sound */
942 DRX_NO_CARRIER_NOISE
, /* opt */
949 DRX_NO_CARRIER_MUTE
, /* opt */
957 DRX_AUD_SRC_STEREO_OR_A
, /* source_i2s */
958 DRX_AUD_I2S_MATRIX_STEREO
, /* matrix_i2s */
959 DRX_AUD_FM_MATRIX_SOUND_A
/* matrix_fm */
961 DRX_AUD_DEVIATION_NORMAL
, /* deviation */
962 DRX_AUD_AVSYNC_OFF
, /* av_sync */
966 DRX_AUD_MAX_FM_DEVIATION
, /* fm_deviation */
967 DRX_AUD_MAX_NICAM_PRESCALE
/* nicam_gain */
969 DRX_AUD_FM_DEEMPH_75US
, /* deemph */
970 DRX_BTSC_STEREO
, /* btsc_detect */
971 0, /* rds_data_counter */
972 false /* rds_data_present */
975 /*-----------------------------------------------------------------------------
977 ----------------------------------------------------------------------------*/
996 /*============================================================================*/
997 /*=== MICROCODE RELATED STRUCTURES ===========================================*/
998 /*============================================================================*/
1001 * struct drxu_code_block_hdr - Structure of the microcode block headers
1003 * @addr: Destination address of the data in this block
1004 * @size: Size of the block data following this header counted in
1006 * @CRC: CRC value of the data block, only valid if CRC flag is
1009 struct drxu_code_block_hdr
{
1016 /*-----------------------------------------------------------------------------
1018 ----------------------------------------------------------------------------*/
1019 /* Some prototypes */
1021 hi_command(struct i2c_device_addr
*dev_addr
,
1022 const struct drxj_hi_cmd
*cmd
, u16
*result
);
1025 ctrl_lock_status(struct drx_demod_instance
*demod
, enum drx_lock_status
*lock_stat
);
1028 ctrl_power_mode(struct drx_demod_instance
*demod
, enum drx_power_mode
*mode
);
1030 static int power_down_aud(struct drx_demod_instance
*demod
);
1033 ctrl_set_cfg_pre_saw(struct drx_demod_instance
*demod
, struct drxj_cfg_pre_saw
*pre_saw
);
1036 ctrl_set_cfg_afe_gain(struct drx_demod_instance
*demod
, struct drxj_cfg_afe_gain
*afe_gain
);
1038 /*============================================================================*/
1039 /*============================================================================*/
1040 /*== HELPER FUNCTIONS ==*/
1041 /*============================================================================*/
1042 /*============================================================================*/
1045 /*============================================================================*/
1048 * \fn u32 frac28(u32 N, u32 D)
1049 * \brief Compute: (1<<28)*N/D
1052 * \return (1<<28)*N/D
1053 * This function is used to avoid floating-point calculations as they may
1054 * not be present on the target platform.
1056 * frac28 performs an unsigned 28/28 bits division to 32-bit fixed point
1057 * fraction used for setting the Frequency Shifter registers.
1058 * N and D can hold numbers up to width: 28-bits.
1059 * The 4 bits integer part and the 28 bits fractional part are calculated.
1061 * Usage condition: ((1<<28)*n)/d < ((1<<32)-1) => (n/d) < 15.999
1063 * N: 0...(1<<28)-1 = 268435454
1067 static u32
frac28(u32 N
, u32 D
)
1073 R0
= (N
% D
) << 4; /* 32-28 == 4 shifts possible at max */
1074 Q1
= N
/ D
; /* integer part, only the 4 least significant bits
1075 will be visible in the result */
1077 /* division using radix 16, 7 nibbles in the result */
1078 for (i
= 0; i
< 7; i
++) {
1079 Q1
= (Q1
<< 4) | R0
/ D
;
1090 * \fn u32 log1_times100( u32 x)
1091 * \brief Compute: 100*log10(x)
1093 * \return 100*log10(x)
1096 * = 100*(log2(x)/log2(10)))
1097 * = (100*(2^15)*log2(x))/((2^15)*log2(10))
1098 * = ((200*(2^15)*log2(x))/((2^15)*log2(10)))/2
1099 * = ((200*(2^15)*(log2(x/y)+log2(y)))/((2^15)*log2(10)))/2
1100 * = ((200*(2^15)*log2(x/y))+(200*(2^15)*log2(y)))/((2^15)*log2(10)))/2
1102 * where y = 2^k and 1<= (x/y) < 2
1105 static u32
log1_times100(u32 x
)
1107 static const u8 scale
= 15;
1108 static const u8 index_width
= 5;
1110 log2lut[n] = (1<<scale) * 200 * log2( 1.0 + ( (1.0/(1<<INDEXWIDTH)) * n ))
1111 0 <= n < ((1<<INDEXWIDTH)+1)
1114 static const u32 log2lut
[] = {
1116 290941, /* 290941.300628 */
1117 573196, /* 573196.476418 */
1118 847269, /* 847269.179851 */
1119 1113620, /* 1113620.489452 */
1120 1372674, /* 1372673.576986 */
1121 1624818, /* 1624817.752104 */
1122 1870412, /* 1870411.981536 */
1123 2109788, /* 2109787.962654 */
1124 2343253, /* 2343252.817465 */
1125 2571091, /* 2571091.461923 */
1126 2793569, /* 2793568.696416 */
1127 3010931, /* 3010931.055901 */
1128 3223408, /* 3223408.452106 */
1129 3431216, /* 3431215.635215 */
1130 3634553, /* 3634553.498355 */
1131 3833610, /* 3833610.244726 */
1132 4028562, /* 4028562.434393 */
1133 4219576, /* 4219575.925308 */
1134 4406807, /* 4406806.721144 */
1135 4590402, /* 4590401.736809 */
1136 4770499, /* 4770499.491025 */
1137 4947231, /* 4947230.734179 */
1138 5120719, /* 5120719.018555 */
1139 5291081, /* 5291081.217197 */
1140 5458428, /* 5458427.996830 */
1141 5622864, /* 5622864.249668 */
1142 5784489, /* 5784489.488298 */
1143 5943398, /* 5943398.207380 */
1144 6099680, /* 6099680.215452 */
1145 6253421, /* 6253420.939751 */
1146 6404702, /* 6404701.706649 */
1147 6553600, /* 6553600.000000 */
1159 /* Scale x (normalize) */
1160 /* computing y in log(x/y) = log(x) - log(y) */
1161 if ((x
& (((u32
) (-1)) << (scale
+ 1))) == 0) {
1162 for (k
= scale
; k
> 0; k
--) {
1163 if (x
& (((u32
) 1) << scale
))
1168 for (k
= scale
; k
< 31; k
++) {
1169 if ((x
& (((u32
) (-1)) << (scale
+ 1))) == 0)
1175 Now x has binary point between bit[scale] and bit[scale-1]
1176 and 1.0 <= x < 2.0 */
1178 /* correction for division: log(x) = log(x/y)+log(y) */
1179 y
= k
* ((((u32
) 1) << scale
) * 200);
1181 /* remove integer part */
1182 x
&= ((((u32
) 1) << scale
) - 1);
1184 i
= (u8
) (x
>> (scale
- index_width
));
1185 /* compute delta (x-a) */
1186 d
= x
& ((((u32
) 1) << (scale
- index_width
)) - 1);
1187 /* compute log, multiplication ( d* (.. )) must be within range ! */
1189 ((d
* (log2lut
[i
+ 1] - log2lut
[i
])) >> (scale
- index_width
));
1190 /* Conver to log10() */
1191 y
/= 108853; /* (log2(10) << scale) */
1202 * \fn u32 frac_times1e6( u16 N, u32 D)
1203 * \brief Compute: (N/D) * 1000000.
1204 * \param N nominator 16-bits.
1205 * \param D denominator 32-bits.
1207 * \retval ((N/D) * 1000000), 32 bits
1211 static u32
frac_times1e6(u32 N
, u32 D
)
1217 frac = (N * 1000000) / D
1218 To let it fit in a 32 bits computation:
1219 frac = (N * (1000000 >> 4)) / (D >> 4)
1220 This would result in a problem in case D < 16 (div by 0).
1221 So we do it more elaborate as shown below.
1223 frac
= (((u32
) N
) * (1000000 >> 4)) / D
;
1225 remainder
= (((u32
) N
) * (1000000 >> 4)) % D
;
1227 frac
+= remainder
/ D
;
1228 remainder
= remainder
% D
;
1229 if ((remainder
* 2) > D
)
1235 /*============================================================================*/
1239 * \brief Values for NICAM prescaler gain. Computed from dB to integer
1240 * and rounded. For calc used formula: 16*10^(prescaleGain[dB]/20).
1244 /* Currently, unused as we lack support for analog TV */
1245 static const u16 nicam_presc_table_val
[43] = {
1246 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
1247 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16,
1248 18, 20, 23, 25, 28, 32, 36, 40, 45,
1249 51, 57, 64, 71, 80, 90, 101, 113, 127
1253 /*============================================================================*/
1254 /*== END HELPER FUNCTIONS ==*/
1255 /*============================================================================*/
1257 /*============================================================================*/
1258 /*============================================================================*/
1259 /*== DRXJ DAP FUNCTIONS ==*/
1260 /*============================================================================*/
1261 /*============================================================================*/
1264 This layer takes care of some device specific register access protocols:
1265 -conversion to short address format
1266 -access to audio block
1267 This layer is placed between the drx_dap_fasi and the rest of the drxj
1268 specific implementation. This layer can use address map knowledge whereas
1269 dap_fasi may not use memory map knowledge.
1271 * For audio currently only 16 bits read and write register access is
1272 supported. More is not needed. RMW and 32 or 8 bit access on audio
1273 registers will have undefined behaviour. Flags (RMW, CRC reset, broadcast
1274 single/multi master) will be ignored.
1276 TODO: check ignoring single/multimaster is ok for AUD access ?
1279 #define DRXJ_ISAUDWRITE(addr) (((((addr)>>16)&1) == 1) ? true : false)
1280 #define DRXJ_DAP_AUDTRIF_TIMEOUT 80 /* millisec */
1281 /*============================================================================*/
1284 * \fn bool is_handled_by_aud_tr_if( u32 addr )
1285 * \brief Check if this address is handled by the audio token ring interface.
1288 * \retval true Yes, handled by audio token ring interface
1289 * \retval false No, not handled by audio token ring interface
1293 bool is_handled_by_aud_tr_if(u32 addr
)
1295 bool retval
= false;
1297 if ((DRXDAP_FASI_ADDR2BLOCK(addr
) == 4) &&
1298 (DRXDAP_FASI_ADDR2BANK(addr
) > 1) &&
1299 (DRXDAP_FASI_ADDR2BANK(addr
) < 6)) {
1306 /*============================================================================*/
1308 int drxbsp_i2c_write_read(struct i2c_device_addr
*w_dev_addr
,
1311 struct i2c_device_addr
*r_dev_addr
,
1312 u16 r_count
, u8
*r_data
)
1314 struct drx39xxj_state
*state
;
1315 struct i2c_msg msg
[2];
1316 unsigned int num_msgs
;
1318 if (w_dev_addr
== NULL
) {
1320 state
= r_dev_addr
->user_data
;
1321 msg
[0].addr
= r_dev_addr
->i2c_addr
>> 1;
1322 msg
[0].flags
= I2C_M_RD
;
1323 msg
[0].buf
= r_data
;
1324 msg
[0].len
= r_count
;
1326 } else if (r_dev_addr
== NULL
) {
1328 state
= w_dev_addr
->user_data
;
1329 msg
[0].addr
= w_dev_addr
->i2c_addr
>> 1;
1332 msg
[0].len
= w_count
;
1335 /* Both write and read */
1336 state
= w_dev_addr
->user_data
;
1337 msg
[0].addr
= w_dev_addr
->i2c_addr
>> 1;
1340 msg
[0].len
= w_count
;
1341 msg
[1].addr
= r_dev_addr
->i2c_addr
>> 1;
1342 msg
[1].flags
= I2C_M_RD
;
1343 msg
[1].buf
= r_data
;
1344 msg
[1].len
= r_count
;
1348 if (state
->i2c
== NULL
) {
1349 pr_err("i2c was zero, aborting\n");
1352 if (i2c_transfer(state
->i2c
, msg
, num_msgs
) != num_msgs
) {
1353 pr_warn("drx3933: I2C write/read failed\n");
1358 if (w_dev_addr
== NULL
|| r_dev_addr
== NULL
)
1361 state
= w_dev_addr
->user_data
;
1363 if (state
->i2c
== NULL
)
1366 msg
[0].addr
= w_dev_addr
->i2c_addr
;
1369 msg
[0].len
= w_count
;
1370 msg
[1].addr
= r_dev_addr
->i2c_addr
;
1371 msg
[1].flags
= I2C_M_RD
;
1372 msg
[1].buf
= r_data
;
1373 msg
[1].len
= r_count
;
1376 pr_debug("drx3933 i2c operation addr=%x i2c=%p, wc=%x rc=%x\n",
1377 w_dev_addr
->i2c_addr
, state
->i2c
, w_count
, r_count
);
1379 if (i2c_transfer(state
->i2c
, msg
, 2) != 2) {
1380 pr_warn("drx3933: I2C write/read failed\n");
1387 /*============================================================================*/
1389 /******************************
1391 * int drxdap_fasi_read_block (
1392 * struct i2c_device_addr *dev_addr, -- address of I2C device
1393 * u32 addr, -- address of chip register/memory
1394 * u16 datasize, -- number of bytes to read
1395 * u8 *data, -- data to receive
1396 * u32 flags) -- special device flags
1398 * Read block data from chip address. Because the chip is word oriented,
1399 * the number of bytes to read must be even.
1401 * Make sure that the buffer to receive the data is large enough.
1403 * Although this function expects an even number of bytes, it is still byte
1404 * oriented, and the data read back is NOT translated to the endianness of
1405 * the target platform.
1408 * - 0 if reading was successful
1409 * in that case: data read is in *data.
1410 * - -EIO if anything went wrong
1412 ******************************/
1414 static int drxdap_fasi_read_block(struct i2c_device_addr
*dev_addr
,
1417 u8
*data
, u32 flags
)
1422 u16 overhead_size
= 0;
1424 /* Check parameters ******************************************************* */
1425 if (dev_addr
== NULL
)
1428 overhead_size
= (IS_I2C_10BIT(dev_addr
->i2c_addr
) ? 2 : 1) +
1429 (DRXDAP_FASI_LONG_FORMAT(addr
) ? 4 : 2);
1431 if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr
)) ||
1432 ((!(DRXDAPFASI_LONG_ADDR_ALLOWED
)) &&
1433 DRXDAP_FASI_LONG_FORMAT(addr
)) ||
1434 (overhead_size
> (DRXDAP_MAX_WCHUNKSIZE
)) ||
1435 ((datasize
!= 0) && (data
== NULL
)) || ((datasize
& 1) == 1)) {
1439 /* ReadModifyWrite & mode flag bits are not allowed */
1440 flags
&= (~DRXDAP_FASI_RMW
& ~DRXDAP_FASI_MODEFLAGS
);
1441 #if DRXDAP_SINGLE_MASTER
1442 flags
|= DRXDAP_FASI_SINGLE_MASTER
;
1445 /* Read block from I2C **************************************************** */
1447 u16 todo
= (datasize
< DRXDAP_MAX_RCHUNKSIZE
?
1448 datasize
: DRXDAP_MAX_RCHUNKSIZE
);
1452 addr
&= ~DRXDAP_FASI_FLAGS
;
1455 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1456 /* short format address preferred but long format otherwise */
1457 if (DRXDAP_FASI_LONG_FORMAT(addr
)) {
1459 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1460 buf
[bufx
++] = (u8
) (((addr
<< 1) & 0xFF) | 0x01);
1461 buf
[bufx
++] = (u8
) ((addr
>> 16) & 0xFF);
1462 buf
[bufx
++] = (u8
) ((addr
>> 24) & 0xFF);
1463 buf
[bufx
++] = (u8
) ((addr
>> 7) & 0xFF);
1465 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1468 #if (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)
1469 buf
[bufx
++] = (u8
) ((addr
<< 1) & 0xFF);
1471 (u8
) (((addr
>> 16) & 0x0F) |
1472 ((addr
>> 18) & 0xF0));
1474 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1478 #if DRXDAP_SINGLE_MASTER
1480 * In single master mode, split the read and write actions.
1481 * No special action is needed for write chunks here.
1483 rc
= drxbsp_i2c_write_read(dev_addr
, bufx
, buf
,
1486 rc
= drxbsp_i2c_write_read(NULL
, 0, NULL
, dev_addr
, todo
, data
);
1488 /* In multi master mode, do everything in one RW action */
1489 rc
= drxbsp_i2c_write_read(dev_addr
, bufx
, buf
, dev_addr
, todo
,
1493 addr
+= (todo
>> 1);
1495 } while (datasize
&& rc
== 0);
1501 /******************************
1503 * int drxdap_fasi_read_reg16 (
1504 * struct i2c_device_addr *dev_addr, -- address of I2C device
1505 * u32 addr, -- address of chip register/memory
1506 * u16 *data, -- data to receive
1507 * u32 flags) -- special device flags
1509 * Read one 16-bit register or memory location. The data received back is
1510 * converted back to the target platform's endianness.
1513 * - 0 if reading was successful
1514 * in that case: read data is at *data
1515 * - -EIO if anything went wrong
1517 ******************************/
1519 static int drxdap_fasi_read_reg16(struct i2c_device_addr
*dev_addr
,
1521 u16
*data
, u32 flags
)
1523 u8 buf
[sizeof(*data
)];
1529 rc
= drxdap_fasi_read_block(dev_addr
, addr
, sizeof(*data
), buf
, flags
);
1530 *data
= buf
[0] + (((u16
) buf
[1]) << 8);
1534 /******************************
1536 * int drxdap_fasi_read_reg32 (
1537 * struct i2c_device_addr *dev_addr, -- address of I2C device
1538 * u32 addr, -- address of chip register/memory
1539 * u32 *data, -- data to receive
1540 * u32 flags) -- special device flags
1542 * Read one 32-bit register or memory location. The data received back is
1543 * converted back to the target platform's endianness.
1546 * - 0 if reading was successful
1547 * in that case: read data is at *data
1548 * - -EIO if anything went wrong
1550 ******************************/
1552 static int drxdap_fasi_read_reg32(struct i2c_device_addr
*dev_addr
,
1554 u32
*data
, u32 flags
)
1556 u8 buf
[sizeof(*data
)];
1562 rc
= drxdap_fasi_read_block(dev_addr
, addr
, sizeof(*data
), buf
, flags
);
1563 *data
= (((u32
) buf
[0]) << 0) +
1564 (((u32
) buf
[1]) << 8) +
1565 (((u32
) buf
[2]) << 16) + (((u32
) buf
[3]) << 24);
1569 /******************************
1571 * int drxdap_fasi_write_block (
1572 * struct i2c_device_addr *dev_addr, -- address of I2C device
1573 * u32 addr, -- address of chip register/memory
1574 * u16 datasize, -- number of bytes to read
1575 * u8 *data, -- data to receive
1576 * u32 flags) -- special device flags
1578 * Write block data to chip address. Because the chip is word oriented,
1579 * the number of bytes to write must be even.
1581 * Although this function expects an even number of bytes, it is still byte
1582 * oriented, and the data being written is NOT translated from the endianness of
1583 * the target platform.
1586 * - 0 if writing was successful
1587 * - -EIO if anything went wrong
1589 ******************************/
1591 static int drxdap_fasi_write_block(struct i2c_device_addr
*dev_addr
,
1594 u8
*data
, u32 flags
)
1596 u8 buf
[DRXDAP_MAX_WCHUNKSIZE
];
1599 u16 overhead_size
= 0;
1602 /* Check parameters ******************************************************* */
1603 if (dev_addr
== NULL
)
1606 overhead_size
= (IS_I2C_10BIT(dev_addr
->i2c_addr
) ? 2 : 1) +
1607 (DRXDAP_FASI_LONG_FORMAT(addr
) ? 4 : 2);
1609 if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr
)) ||
1610 ((!(DRXDAPFASI_LONG_ADDR_ALLOWED
)) &&
1611 DRXDAP_FASI_LONG_FORMAT(addr
)) ||
1612 (overhead_size
> (DRXDAP_MAX_WCHUNKSIZE
)) ||
1613 ((datasize
!= 0) && (data
== NULL
)) || ((datasize
& 1) == 1))
1616 flags
&= DRXDAP_FASI_FLAGS
;
1617 flags
&= ~DRXDAP_FASI_MODEFLAGS
;
1618 #if DRXDAP_SINGLE_MASTER
1619 flags
|= DRXDAP_FASI_SINGLE_MASTER
;
1622 /* Write block to I2C ***************************************************** */
1623 block_size
= ((DRXDAP_MAX_WCHUNKSIZE
) - overhead_size
) & ~1;
1628 /* Buffer device address */
1629 addr
&= ~DRXDAP_FASI_FLAGS
;
1631 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1632 /* short format address preferred but long format otherwise */
1633 if (DRXDAP_FASI_LONG_FORMAT(addr
)) {
1635 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1)
1636 buf
[bufx
++] = (u8
) (((addr
<< 1) & 0xFF) | 0x01);
1637 buf
[bufx
++] = (u8
) ((addr
>> 16) & 0xFF);
1638 buf
[bufx
++] = (u8
) ((addr
>> 24) & 0xFF);
1639 buf
[bufx
++] = (u8
) ((addr
>> 7) & 0xFF);
1641 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1644 #if ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1)
1645 buf
[bufx
++] = (u8
) ((addr
<< 1) & 0xFF);
1647 (u8
) (((addr
>> 16) & 0x0F) |
1648 ((addr
>> 18) & 0xF0));
1650 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1655 In single master mode block_size can be 0. In such a case this I2C
1656 sequense will be visible: (1) write address {i2c addr,
1657 4 bytes chip address} (2) write data {i2c addr, 4 bytes data }
1658 (3) write address (4) write data etc...
1659 Address must be rewriten because HI is reset after data transport and
1662 todo
= (block_size
< datasize
? block_size
: datasize
);
1664 u16 overhead_size_i2c_addr
= 0;
1665 u16 data_block_size
= 0;
1667 overhead_size_i2c_addr
=
1668 (IS_I2C_10BIT(dev_addr
->i2c_addr
) ? 2 : 1);
1670 (DRXDAP_MAX_WCHUNKSIZE
- overhead_size_i2c_addr
) & ~1;
1672 /* write device address */
1673 st
= drxbsp_i2c_write_read(dev_addr
,
1676 (struct i2c_device_addr
*)(NULL
),
1679 if ((st
!= 0) && (first_err
== 0)) {
1680 /* at the end, return the first error encountered */
1686 datasize
? data_block_size
: datasize
);
1688 memcpy(&buf
[bufx
], data
, todo
);
1689 /* write (address if can do and) data */
1690 st
= drxbsp_i2c_write_read(dev_addr
,
1691 (u16
) (bufx
+ todo
),
1693 (struct i2c_device_addr
*)(NULL
),
1696 if ((st
!= 0) && (first_err
== 0)) {
1697 /* at the end, return the first error encountered */
1702 addr
+= (todo
>> 1);
1708 /******************************
1710 * int drxdap_fasi_write_reg16 (
1711 * struct i2c_device_addr *dev_addr, -- address of I2C device
1712 * u32 addr, -- address of chip register/memory
1713 * u16 data, -- data to send
1714 * u32 flags) -- special device flags
1716 * Write one 16-bit register or memory location. The data being written is
1717 * converted from the target platform's endianness to little endian.
1720 * - 0 if writing was successful
1721 * - -EIO if anything went wrong
1723 ******************************/
1725 static int drxdap_fasi_write_reg16(struct i2c_device_addr
*dev_addr
,
1727 u16 data
, u32 flags
)
1729 u8 buf
[sizeof(data
)];
1731 buf
[0] = (u8
) ((data
>> 0) & 0xFF);
1732 buf
[1] = (u8
) ((data
>> 8) & 0xFF);
1734 return drxdap_fasi_write_block(dev_addr
, addr
, sizeof(data
), buf
, flags
);
1737 /******************************
1739 * int drxdap_fasi_read_modify_write_reg16 (
1740 * struct i2c_device_addr *dev_addr, -- address of I2C device
1741 * u32 waddr, -- address of chip register/memory
1742 * u32 raddr, -- chip address to read back from
1743 * u16 wdata, -- data to send
1744 * u16 *rdata) -- data to receive back
1746 * Write 16-bit data, then read back the original contents of that location.
1747 * Requires long addressing format to be allowed.
1749 * Before sending data, the data is converted to little endian. The
1750 * data received back is converted back to the target platform's endianness.
1752 * WARNING: This function is only guaranteed to work if there is one
1753 * master on the I2C bus.
1756 * - 0 if reading was successful
1757 * in that case: read back data is at *rdata
1758 * - -EIO if anything went wrong
1760 ******************************/
1762 static int drxdap_fasi_read_modify_write_reg16(struct i2c_device_addr
*dev_addr
,
1765 u16 wdata
, u16
*rdata
)
1769 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1773 rc
= drxdap_fasi_write_reg16(dev_addr
, waddr
, wdata
, DRXDAP_FASI_RMW
);
1775 rc
= drxdap_fasi_read_reg16(dev_addr
, raddr
, rdata
, 0);
1781 /******************************
1783 * int drxdap_fasi_write_reg32 (
1784 * struct i2c_device_addr *dev_addr, -- address of I2C device
1785 * u32 addr, -- address of chip register/memory
1786 * u32 data, -- data to send
1787 * u32 flags) -- special device flags
1789 * Write one 32-bit register or memory location. The data being written is
1790 * converted from the target platform's endianness to little endian.
1793 * - 0 if writing was successful
1794 * - -EIO if anything went wrong
1796 ******************************/
1798 static int drxdap_fasi_write_reg32(struct i2c_device_addr
*dev_addr
,
1800 u32 data
, u32 flags
)
1802 u8 buf
[sizeof(data
)];
1804 buf
[0] = (u8
) ((data
>> 0) & 0xFF);
1805 buf
[1] = (u8
) ((data
>> 8) & 0xFF);
1806 buf
[2] = (u8
) ((data
>> 16) & 0xFF);
1807 buf
[3] = (u8
) ((data
>> 24) & 0xFF);
1809 return drxdap_fasi_write_block(dev_addr
, addr
, sizeof(data
), buf
, flags
);
1812 /*============================================================================*/
1815 * \fn int drxj_dap_rm_write_reg16short
1816 * \brief Read modify write 16 bits audio register using short format only.
1818 * \param waddr Address to write to
1819 * \param raddr Address to read from (usually SIO_HI_RA_RAM_S0_RMWBUF__A)
1820 * \param wdata Data to write
1821 * \param rdata Buffer for data to read
1824 * \retval -EIO Timeout, I2C error, illegal bank
1826 * 16 bits register read modify write access using short addressing format only.
1827 * Requires knowledge of the registermap, thus device dependent.
1828 * Using DAP FASI directly to avoid endless recursion of RMWs to audio registers.
1832 /* TODO correct define should be #if ( DRXDAPFASI_SHORT_ADDR_ALLOWED==1 )
1833 See comments drxj_dap_read_modify_write_reg16 */
1834 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 0)
1835 static int drxj_dap_rm_write_reg16short(struct i2c_device_addr
*dev_addr
,
1838 u16 wdata
, u16
*rdata
)
1846 rc
= drxdap_fasi_write_reg16(dev_addr
,
1847 SIO_HI_RA_RAM_S0_FLG_ACC__A
,
1848 SIO_HI_RA_RAM_S0_FLG_ACC_S0_RWM__M
,
1851 /* Write new data: triggers RMW */
1852 rc
= drxdap_fasi_write_reg16(dev_addr
, waddr
, wdata
,
1857 rc
= drxdap_fasi_read_reg16(dev_addr
, raddr
, rdata
,
1861 /* Reset RMW flag */
1862 rc
= drxdap_fasi_write_reg16(dev_addr
,
1863 SIO_HI_RA_RAM_S0_FLG_ACC__A
,
1871 /*============================================================================*/
1873 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr
*dev_addr
,
1876 u16 wdata
, u16
*rdata
)
1878 /* TODO: correct short/long addressing format decision,
1879 now long format has higher prio then short because short also
1880 needs virt bnks (not impl yet) for certain audio registers */
1881 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1882 return drxdap_fasi_read_modify_write_reg16(dev_addr
,
1884 raddr
, wdata
, rdata
);
1886 return drxj_dap_rm_write_reg16short(dev_addr
, waddr
, raddr
, wdata
, rdata
);
1891 /*============================================================================*/
1894 * \fn int drxj_dap_read_aud_reg16
1895 * \brief Read 16 bits audio register
1901 * \retval -EIO Timeout, I2C error, illegal bank
1903 * 16 bits register read access via audio token ring interface.
1906 static int drxj_dap_read_aud_reg16(struct i2c_device_addr
*dev_addr
,
1907 u32 addr
, u16
*data
)
1909 u32 start_timer
= 0;
1910 u32 current_timer
= 0;
1911 u32 delta_timer
= 0;
1915 /* No read possible for bank 3, return with error */
1916 if (DRXDAP_FASI_ADDR2BANK(addr
) == 3) {
1919 const u32 write_bit
= ((dr_xaddr_t
) 1) << 16;
1921 /* Force reset write bit */
1922 addr
&= (~write_bit
);
1925 start_timer
= jiffies_to_msecs(jiffies
);
1927 /* RMW to aud TR IF until request is granted or timeout */
1928 stat
= drxj_dap_read_modify_write_reg16(dev_addr
,
1930 SIO_HI_RA_RAM_S0_RMWBUF__A
,
1931 0x0000, &tr_status
);
1936 current_timer
= jiffies_to_msecs(jiffies
);
1937 delta_timer
= current_timer
- start_timer
;
1938 if (delta_timer
> DRXJ_DAP_AUDTRIF_TIMEOUT
) {
1943 } while (((tr_status
& AUD_TOP_TR_CTR_FIFO_LOCK__M
) ==
1944 AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED
) ||
1945 ((tr_status
& AUD_TOP_TR_CTR_FIFO_FULL__M
) ==
1946 AUD_TOP_TR_CTR_FIFO_FULL_FULL
));
1947 } /* if ( DRXDAP_FASI_ADDR2BANK(addr)!=3 ) */
1949 /* Wait for read ready status or timeout */
1951 start_timer
= jiffies_to_msecs(jiffies
);
1953 while ((tr_status
& AUD_TOP_TR_CTR_FIFO_RD_RDY__M
) !=
1954 AUD_TOP_TR_CTR_FIFO_RD_RDY_READY
) {
1955 stat
= drxj_dap_read_reg16(dev_addr
,
1957 &tr_status
, 0x0000);
1961 current_timer
= jiffies_to_msecs(jiffies
);
1962 delta_timer
= current_timer
- start_timer
;
1963 if (delta_timer
> DRXJ_DAP_AUDTRIF_TIMEOUT
) {
1967 } /* while ( ... ) */
1972 stat
= drxj_dap_read_modify_write_reg16(dev_addr
,
1973 AUD_TOP_TR_RD_REG__A
,
1974 SIO_HI_RA_RAM_S0_RMWBUF__A
,
1979 /*============================================================================*/
1981 static int drxj_dap_read_reg16(struct i2c_device_addr
*dev_addr
,
1983 u16
*data
, u32 flags
)
1988 if ((dev_addr
== NULL
) || (data
== NULL
))
1991 if (is_handled_by_aud_tr_if(addr
))
1992 stat
= drxj_dap_read_aud_reg16(dev_addr
, addr
, data
);
1994 stat
= drxdap_fasi_read_reg16(dev_addr
, addr
, data
, flags
);
1998 /*============================================================================*/
2001 * \fn int drxj_dap_write_aud_reg16
2002 * \brief Write 16 bits audio register
2008 * \retval -EIO Timeout, I2C error, illegal bank
2010 * 16 bits register write access via audio token ring interface.
2013 static int drxj_dap_write_aud_reg16(struct i2c_device_addr
*dev_addr
,
2018 /* No write possible for bank 2, return with error */
2019 if (DRXDAP_FASI_ADDR2BANK(addr
) == 2) {
2022 u32 start_timer
= 0;
2023 u32 current_timer
= 0;
2024 u32 delta_timer
= 0;
2026 const u32 write_bit
= ((dr_xaddr_t
) 1) << 16;
2028 /* Force write bit */
2030 start_timer
= jiffies_to_msecs(jiffies
);
2032 /* RMW to aud TR IF until request is granted or timeout */
2033 stat
= drxj_dap_read_modify_write_reg16(dev_addr
,
2035 SIO_HI_RA_RAM_S0_RMWBUF__A
,
2040 current_timer
= jiffies_to_msecs(jiffies
);
2041 delta_timer
= current_timer
- start_timer
;
2042 if (delta_timer
> DRXJ_DAP_AUDTRIF_TIMEOUT
) {
2047 } while (((tr_status
& AUD_TOP_TR_CTR_FIFO_LOCK__M
) ==
2048 AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED
) ||
2049 ((tr_status
& AUD_TOP_TR_CTR_FIFO_FULL__M
) ==
2050 AUD_TOP_TR_CTR_FIFO_FULL_FULL
));
2052 } /* if ( DRXDAP_FASI_ADDR2BANK(addr)!=2 ) */
2057 /*============================================================================*/
2059 static int drxj_dap_write_reg16(struct i2c_device_addr
*dev_addr
,
2061 u16 data
, u32 flags
)
2066 if (dev_addr
== NULL
)
2069 if (is_handled_by_aud_tr_if(addr
))
2070 stat
= drxj_dap_write_aud_reg16(dev_addr
, addr
, data
);
2072 stat
= drxdap_fasi_write_reg16(dev_addr
,
2078 /*============================================================================*/
2080 /* Free data ram in SIO HI */
2081 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2082 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2084 #define DRXJ_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2085 #define DRXJ_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2086 #define DRXJ_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2087 #define DRXJ_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2090 * \fn int drxj_dap_atomic_read_write_block()
2091 * \brief Basic access routine for atomic read or write access
2092 * \param dev_addr pointer to i2c dev address
2093 * \param addr destination/source address
2094 * \param datasize size of data buffer in bytes
2095 * \param data pointer to data buffer
2098 * \retval -EIO Timeout, I2C error, illegal bank
2102 int drxj_dap_atomic_read_write_block(struct i2c_device_addr
*dev_addr
,
2105 u8
*data
, bool read_flag
)
2107 struct drxj_hi_cmd hi_cmd
;
2113 /* Parameter check */
2114 if (!data
|| !dev_addr
|| ((datasize
% 2)) || ((datasize
/ 2) > 8))
2117 /* Set up HI parameters to read or write n bytes */
2118 hi_cmd
.cmd
= SIO_HI_RA_RAM_CMD_ATOMIC_COPY
;
2120 (u16
) ((DRXDAP_FASI_ADDR2BLOCK(DRXJ_HI_ATOMIC_BUF_START
) << 6) +
2121 DRXDAP_FASI_ADDR2BANK(DRXJ_HI_ATOMIC_BUF_START
));
2123 (u16
) DRXDAP_FASI_ADDR2OFFSET(DRXJ_HI_ATOMIC_BUF_START
);
2124 hi_cmd
.param3
= (u16
) ((datasize
/ 2) - 1);
2126 hi_cmd
.param3
|= DRXJ_HI_ATOMIC_WRITE
;
2128 hi_cmd
.param3
|= DRXJ_HI_ATOMIC_READ
;
2129 hi_cmd
.param4
= (u16
) ((DRXDAP_FASI_ADDR2BLOCK(addr
) << 6) +
2130 DRXDAP_FASI_ADDR2BANK(addr
));
2131 hi_cmd
.param5
= (u16
) DRXDAP_FASI_ADDR2OFFSET(addr
);
2134 /* write data to buffer */
2135 for (i
= 0; i
< (datasize
/ 2); i
++) {
2137 word
= ((u16
) data
[2 * i
]);
2138 word
+= (((u16
) data
[(2 * i
) + 1]) << 8);
2139 drxj_dap_write_reg16(dev_addr
,
2140 (DRXJ_HI_ATOMIC_BUF_START
+ i
),
2145 rc
= hi_command(dev_addr
, &hi_cmd
, &dummy
);
2147 pr_err("error %d\n", rc
);
2152 /* read data from buffer */
2153 for (i
= 0; i
< (datasize
/ 2); i
++) {
2154 drxj_dap_read_reg16(dev_addr
,
2155 (DRXJ_HI_ATOMIC_BUF_START
+ i
),
2157 data
[2 * i
] = (u8
) (word
& 0xFF);
2158 data
[(2 * i
) + 1] = (u8
) (word
>> 8);
2169 /*============================================================================*/
2172 * \fn int drxj_dap_atomic_read_reg32()
2173 * \brief Atomic read of 32 bits words
2176 int drxj_dap_atomic_read_reg32(struct i2c_device_addr
*dev_addr
,
2178 u32
*data
, u32 flags
)
2180 u8 buf
[sizeof(*data
)] = { 0 };
2187 rc
= drxj_dap_atomic_read_write_block(dev_addr
, addr
,
2188 sizeof(*data
), buf
, true);
2193 word
= (u32
) buf
[3];
2195 word
|= (u32
) buf
[2];
2197 word
|= (u32
) buf
[1];
2199 word
|= (u32
) buf
[0];
2206 /*============================================================================*/
2208 /*============================================================================*/
2209 /*== END DRXJ DAP FUNCTIONS ==*/
2210 /*============================================================================*/
2212 /*============================================================================*/
2213 /*============================================================================*/
2214 /*== HOST INTERFACE FUNCTIONS ==*/
2215 /*============================================================================*/
2216 /*============================================================================*/
2219 * \fn int hi_cfg_command()
2220 * \brief Configure HI with settings stored in the demod structure.
2221 * \param demod Demodulator.
2224 * This routine was created because to much orthogonal settings have
2225 * been put into one HI API function (configure). Especially the I2C bridge
2226 * enable/disable should not need re-configuration of the HI.
2229 static int hi_cfg_command(const struct drx_demod_instance
*demod
)
2231 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
2232 struct drxj_hi_cmd hi_cmd
;
2236 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
2238 hi_cmd
.cmd
= SIO_HI_RA_RAM_CMD_CONFIG
;
2239 hi_cmd
.param1
= SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY
;
2240 hi_cmd
.param2
= ext_attr
->hi_cfg_timing_div
;
2241 hi_cmd
.param3
= ext_attr
->hi_cfg_bridge_delay
;
2242 hi_cmd
.param4
= ext_attr
->hi_cfg_wake_up_key
;
2243 hi_cmd
.param5
= ext_attr
->hi_cfg_ctrl
;
2244 hi_cmd
.param6
= ext_attr
->hi_cfg_transmit
;
2246 rc
= hi_command(demod
->my_i2c_dev_addr
, &hi_cmd
, &result
);
2248 pr_err("error %d\n", rc
);
2252 /* Reset power down flag (set one call only) */
2253 ext_attr
->hi_cfg_ctrl
&= (~(SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
));
2262 * \fn int hi_command()
2263 * \brief Configure HI with settings stored in the demod structure.
2264 * \param dev_addr I2C address.
2265 * \param cmd HI command.
2266 * \param result HI command result.
2269 * Sends command to HI
2273 hi_command(struct i2c_device_addr
*dev_addr
, const struct drxj_hi_cmd
*cmd
, u16
*result
)
2277 bool powerdown_cmd
= false;
2280 /* Write parameters */
2283 case SIO_HI_RA_RAM_CMD_CONFIG
:
2284 case SIO_HI_RA_RAM_CMD_ATOMIC_COPY
:
2285 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_6__A
, cmd
->param6
, 0);
2287 pr_err("error %d\n", rc
);
2290 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_5__A
, cmd
->param5
, 0);
2292 pr_err("error %d\n", rc
);
2295 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_4__A
, cmd
->param4
, 0);
2297 pr_err("error %d\n", rc
);
2300 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_3__A
, cmd
->param3
, 0);
2302 pr_err("error %d\n", rc
);
2306 case SIO_HI_RA_RAM_CMD_BRDCTRL
:
2307 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_2__A
, cmd
->param2
, 0);
2309 pr_err("error %d\n", rc
);
2312 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_1__A
, cmd
->param1
, 0);
2314 pr_err("error %d\n", rc
);
2318 case SIO_HI_RA_RAM_CMD_NULL
:
2328 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_CMD__A
, cmd
->cmd
, 0);
2330 pr_err("error %d\n", rc
);
2334 if ((cmd
->cmd
) == SIO_HI_RA_RAM_CMD_RESET
)
2337 /* Detect power down to ommit reading result */
2338 powerdown_cmd
= (bool) ((cmd
->cmd
== SIO_HI_RA_RAM_CMD_CONFIG
) &&
2340 param5
) & SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M
)
2341 == SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
));
2342 if (!powerdown_cmd
) {
2343 /* Wait until command rdy */
2346 if (nr_retries
> DRXJ_MAX_RETRIES
) {
2347 pr_err("timeout\n");
2351 rc
= drxj_dap_read_reg16(dev_addr
, SIO_HI_RA_RAM_CMD__A
, &wait_cmd
, 0);
2353 pr_err("error %d\n", rc
);
2356 } while (wait_cmd
!= 0);
2359 rc
= drxj_dap_read_reg16(dev_addr
, SIO_HI_RA_RAM_RES__A
, result
, 0);
2361 pr_err("error %d\n", rc
);
2366 /* if ( powerdown_cmd == true ) */
2373 * \fn int init_hi( const struct drx_demod_instance *demod )
2374 * \brief Initialise and configurate HI.
2375 * \param demod pointer to demod data.
2376 * \return int Return status.
2377 * \retval 0 Success.
2378 * \retval -EIO Failure.
2380 * Needs to know Psys (System Clock period) and Posc (Osc Clock period)
2381 * Need to store configuration in driver because of the way I2C
2382 * bridging is controlled.
2385 static int init_hi(const struct drx_demod_instance
*demod
)
2387 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
2388 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) (NULL
);
2389 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
2392 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
2393 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
2394 dev_addr
= demod
->my_i2c_dev_addr
;
2396 /* PATCH for bug 5003, HI ucode v3.1.0 */
2397 rc
= drxj_dap_write_reg16(dev_addr
, 0x4301D7, 0x801, 0);
2399 pr_err("error %d\n", rc
);
2403 /* Timing div, 250ns/Psys */
2404 /* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */
2405 ext_attr
->hi_cfg_timing_div
=
2406 (u16
) ((common_attr
->sys_clock_freq
/ 1000) * HI_I2C_DELAY
) / 1000;
2408 if ((ext_attr
->hi_cfg_timing_div
) > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M
)
2409 ext_attr
->hi_cfg_timing_div
= SIO_HI_RA_RAM_PAR_2_CFG_DIV__M
;
2410 /* Bridge delay, uses oscilator clock */
2411 /* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */
2412 /* SDA brdige delay */
2413 ext_attr
->hi_cfg_bridge_delay
=
2414 (u16
) ((common_attr
->osc_clock_freq
/ 1000) * HI_I2C_BRIDGE_DELAY
) /
2417 if ((ext_attr
->hi_cfg_bridge_delay
) > SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M
)
2418 ext_attr
->hi_cfg_bridge_delay
= SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M
;
2419 /* SCL bridge delay, same as SDA for now */
2420 ext_attr
->hi_cfg_bridge_delay
+= ((ext_attr
->hi_cfg_bridge_delay
) <<
2421 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B
);
2422 /* Wakeup key, setting the read flag (as suggest in the documentation) does
2423 not always result into a working solution (barebones worked VI2C failed).
2424 Not setting the bit works in all cases . */
2425 ext_attr
->hi_cfg_wake_up_key
= DRXJ_WAKE_UP_KEY
;
2426 /* port/bridge/power down ctrl */
2427 ext_attr
->hi_cfg_ctrl
= (SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE
);
2428 /* transit mode time out delay and watch dog divider */
2429 ext_attr
->hi_cfg_transmit
= SIO_HI_RA_RAM_PAR_6__PRE
;
2431 rc
= hi_cfg_command(demod
);
2433 pr_err("error %d\n", rc
);
2443 /*============================================================================*/
2444 /*== END HOST INTERFACE FUNCTIONS ==*/
2445 /*============================================================================*/
2447 /*============================================================================*/
2448 /*============================================================================*/
2449 /*== AUXILIARY FUNCTIONS ==*/
2450 /*============================================================================*/
2451 /*============================================================================*/
2454 * \fn int get_device_capabilities()
2455 * \brief Get and store device capabilities.
2456 * \param demod Pointer to demodulator instance.
2459 * \retval -EIO Failure
2461 * Depending on pulldowns on MDx pins the following internals are set:
2462 * * common_attr->osc_clock_freq
2463 * * ext_attr->has_lna
2464 * * ext_attr->has_ntsc
2465 * * ext_attr->has_btsc
2466 * * ext_attr->has_oob
2469 static int get_device_capabilities(struct drx_demod_instance
*demod
)
2471 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) (NULL
);
2472 struct drxj_data
*ext_attr
= (struct drxj_data
*) NULL
;
2473 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
2474 u16 sio_pdr_ohw_cfg
= 0;
2475 u32 sio_top_jtagid_lo
= 0;
2479 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
2480 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
2481 dev_addr
= demod
->my_i2c_dev_addr
;
2483 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
2485 pr_err("error %d\n", rc
);
2488 rc
= drxj_dap_read_reg16(dev_addr
, SIO_PDR_OHW_CFG__A
, &sio_pdr_ohw_cfg
, 0);
2490 pr_err("error %d\n", rc
);
2493 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY__PRE
, 0);
2495 pr_err("error %d\n", rc
);
2499 switch ((sio_pdr_ohw_cfg
& SIO_PDR_OHW_CFG_FREF_SEL__M
)) {
2501 /* ignore (bypass ?) */
2505 common_attr
->osc_clock_freq
= 27000;
2509 common_attr
->osc_clock_freq
= 20250;
2513 common_attr
->osc_clock_freq
= 4000;
2520 Determine device capabilities
2521 Based on pinning v47
2523 rc
= drxdap_fasi_read_reg32(dev_addr
, SIO_TOP_JTAGID_LO__A
, &sio_top_jtagid_lo
, 0);
2525 pr_err("error %d\n", rc
);
2528 ext_attr
->mfx
= (u8
) ((sio_top_jtagid_lo
>> 29) & 0xF);
2530 switch ((sio_top_jtagid_lo
>> 12) & 0xFF) {
2532 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
2534 pr_err("error %d\n", rc
);
2537 rc
= drxj_dap_read_reg16(dev_addr
, SIO_PDR_UIO_IN_HI__A
, &bid
, 0);
2539 pr_err("error %d\n", rc
);
2542 bid
= (bid
>> 10) & 0xf;
2543 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY__PRE
, 0);
2545 pr_err("error %d\n", rc
);
2549 ext_attr
->has_lna
= true;
2550 ext_attr
->has_ntsc
= false;
2551 ext_attr
->has_btsc
= false;
2552 ext_attr
->has_oob
= false;
2553 ext_attr
->has_smatx
= true;
2554 ext_attr
->has_smarx
= false;
2555 ext_attr
->has_gpio
= false;
2556 ext_attr
->has_irqn
= false;
2559 ext_attr
->has_lna
= false;
2560 ext_attr
->has_ntsc
= false;
2561 ext_attr
->has_btsc
= false;
2562 ext_attr
->has_oob
= false;
2563 ext_attr
->has_smatx
= true;
2564 ext_attr
->has_smarx
= false;
2565 ext_attr
->has_gpio
= false;
2566 ext_attr
->has_irqn
= false;
2569 ext_attr
->has_lna
= true;
2570 ext_attr
->has_ntsc
= true;
2571 ext_attr
->has_btsc
= false;
2572 ext_attr
->has_oob
= false;
2573 ext_attr
->has_smatx
= true;
2574 ext_attr
->has_smarx
= true;
2575 ext_attr
->has_gpio
= true;
2576 ext_attr
->has_irqn
= false;
2579 ext_attr
->has_lna
= false;
2580 ext_attr
->has_ntsc
= true;
2581 ext_attr
->has_btsc
= false;
2582 ext_attr
->has_oob
= false;
2583 ext_attr
->has_smatx
= true;
2584 ext_attr
->has_smarx
= true;
2585 ext_attr
->has_gpio
= true;
2586 ext_attr
->has_irqn
= false;
2589 ext_attr
->has_lna
= true;
2590 ext_attr
->has_ntsc
= true;
2591 ext_attr
->has_btsc
= true;
2592 ext_attr
->has_oob
= false;
2593 ext_attr
->has_smatx
= true;
2594 ext_attr
->has_smarx
= true;
2595 ext_attr
->has_gpio
= true;
2596 ext_attr
->has_irqn
= false;
2599 ext_attr
->has_lna
= false;
2600 ext_attr
->has_ntsc
= true;
2601 ext_attr
->has_btsc
= true;
2602 ext_attr
->has_oob
= false;
2603 ext_attr
->has_smatx
= true;
2604 ext_attr
->has_smarx
= true;
2605 ext_attr
->has_gpio
= true;
2606 ext_attr
->has_irqn
= false;
2609 ext_attr
->has_lna
= true;
2610 ext_attr
->has_ntsc
= false;
2611 ext_attr
->has_btsc
= false;
2612 ext_attr
->has_oob
= true;
2613 ext_attr
->has_smatx
= true;
2614 ext_attr
->has_smarx
= true;
2615 ext_attr
->has_gpio
= true;
2616 ext_attr
->has_irqn
= true;
2619 ext_attr
->has_lna
= false;
2620 ext_attr
->has_ntsc
= true;
2621 ext_attr
->has_btsc
= true;
2622 ext_attr
->has_oob
= true;
2623 ext_attr
->has_smatx
= true;
2624 ext_attr
->has_smarx
= true;
2625 ext_attr
->has_gpio
= true;
2626 ext_attr
->has_irqn
= true;
2629 ext_attr
->has_lna
= true;
2630 ext_attr
->has_ntsc
= true;
2631 ext_attr
->has_btsc
= true;
2632 ext_attr
->has_oob
= true;
2633 ext_attr
->has_smatx
= true;
2634 ext_attr
->has_smarx
= true;
2635 ext_attr
->has_gpio
= true;
2636 ext_attr
->has_irqn
= true;
2639 ext_attr
->has_lna
= false;
2640 ext_attr
->has_ntsc
= true;
2641 ext_attr
->has_btsc
= true;
2642 ext_attr
->has_oob
= true;
2643 ext_attr
->has_smatx
= true;
2644 ext_attr
->has_smarx
= true;
2645 ext_attr
->has_gpio
= true;
2646 ext_attr
->has_irqn
= true;
2649 /* Unknown device variant */
2660 * \fn int power_up_device()
2661 * \brief Power up device.
2662 * \param demod Pointer to demodulator instance.
2665 * \retval -EIO Failure, I2C or max retries reached
2669 #ifndef DRXJ_MAX_RETRIES_POWERUP
2670 #define DRXJ_MAX_RETRIES_POWERUP 10
2673 static int power_up_device(struct drx_demod_instance
*demod
)
2675 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
2677 u16 retry_count
= 0;
2678 struct i2c_device_addr wake_up_addr
;
2680 dev_addr
= demod
->my_i2c_dev_addr
;
2681 wake_up_addr
.i2c_addr
= DRXJ_WAKE_UP_KEY
;
2682 wake_up_addr
.i2c_dev_id
= dev_addr
->i2c_dev_id
;
2683 wake_up_addr
.user_data
= dev_addr
->user_data
;
2685 * I2C access may fail in this case: no ack
2686 * dummy write must be used to wake uop device, dummy read must be used to
2687 * reset HI state machine (avoiding actual writes)
2691 drxbsp_i2c_write_read(&wake_up_addr
, 1, &data
,
2692 (struct i2c_device_addr
*)(NULL
), 0,
2696 } while ((drxbsp_i2c_write_read
2697 ((struct i2c_device_addr
*) (NULL
), 0, (u8
*)(NULL
), dev_addr
, 1,
2699 != 0) && (retry_count
< DRXJ_MAX_RETRIES_POWERUP
));
2701 /* Need some recovery time .... */
2704 if (retry_count
== DRXJ_MAX_RETRIES_POWERUP
)
2710 /*----------------------------------------------------------------------------*/
2711 /* MPEG Output Configuration Functions - begin */
2712 /*----------------------------------------------------------------------------*/
2714 * \fn int ctrl_set_cfg_mpeg_output()
2715 * \brief Set MPEG output configuration of the device.
2716 * \param devmod Pointer to demodulator instance.
2717 * \param cfg_data Pointer to mpeg output configuaration.
2720 * Configure MPEG output parameters.
2724 ctrl_set_cfg_mpeg_output(struct drx_demod_instance
*demod
, struct drx_cfg_mpeg_output
*cfg_data
)
2726 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
2727 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
2728 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) (NULL
);
2730 u16 fec_oc_reg_mode
= 0;
2731 u16 fec_oc_reg_ipr_mode
= 0;
2732 u16 fec_oc_reg_ipr_invert
= 0;
2733 u32 max_bit_rate
= 0;
2736 u16 sio_pdr_md_cfg
= 0;
2737 /* data mask for the output data byte */
2738 u16 invert_data_mask
=
2739 FEC_OC_IPR_INVERT_MD7__M
| FEC_OC_IPR_INVERT_MD6__M
|
2740 FEC_OC_IPR_INVERT_MD5__M
| FEC_OC_IPR_INVERT_MD4__M
|
2741 FEC_OC_IPR_INVERT_MD3__M
| FEC_OC_IPR_INVERT_MD2__M
|
2742 FEC_OC_IPR_INVERT_MD1__M
| FEC_OC_IPR_INVERT_MD0__M
;
2744 /* check arguments */
2745 if ((demod
== NULL
) || (cfg_data
== NULL
))
2748 dev_addr
= demod
->my_i2c_dev_addr
;
2749 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
2750 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
2752 if (cfg_data
->enable_mpeg_output
== true) {
2753 /* quick and dirty patch to set MPEG incase current std is not
2755 switch (ext_attr
->standard
) {
2756 case DRX_STANDARD_8VSB
:
2757 case DRX_STANDARD_ITU_A
:
2758 case DRX_STANDARD_ITU_B
:
2759 case DRX_STANDARD_ITU_C
:
2765 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_OCR_INVERT__A
, 0, 0);
2767 pr_err("error %d\n", rc
);
2770 switch (ext_attr
->standard
) {
2771 case DRX_STANDARD_8VSB
:
2772 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_FCT_USAGE__A
, 7, 0);
2774 pr_err("error %d\n", rc
);
2776 } /* 2048 bytes fifo ram */
2777 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_TMD_CTL_UPD_RATE__A
, 10, 0);
2779 pr_err("error %d\n", rc
);
2782 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_TMD_INT_UPD_RATE__A
, 10, 0);
2784 pr_err("error %d\n", rc
);
2787 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_AVR_PARM_A__A
, 5, 0);
2789 pr_err("error %d\n", rc
);
2792 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_AVR_PARM_B__A
, 7, 0);
2794 pr_err("error %d\n", rc
);
2797 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_RCN_GAIN__A
, 10, 0);
2799 pr_err("error %d\n", rc
);
2802 /* Low Water Mark for synchronization */
2803 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_LWM__A
, 3, 0);
2805 pr_err("error %d\n", rc
);
2808 /* High Water Mark for synchronization */
2809 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_HWM__A
, 5, 0);
2811 pr_err("error %d\n", rc
);
2815 case DRX_STANDARD_ITU_A
:
2816 case DRX_STANDARD_ITU_C
:
2817 switch (ext_attr
->constellation
) {
2818 case DRX_CONSTELLATION_QAM256
:
2821 case DRX_CONSTELLATION_QAM128
:
2824 case DRX_CONSTELLATION_QAM64
:
2827 case DRX_CONSTELLATION_QAM32
:
2830 case DRX_CONSTELLATION_QAM16
:
2835 } /* ext_attr->constellation */
2836 /* max_bit_rate = symbol_rate * nr_bits * coef */
2837 /* coef = 188/204 */
2839 (ext_attr
->curr_symbol_rate
/ 8) * nr_bits
* 188;
2840 /* pass through b/c Annex A/c need following settings */
2841 case DRX_STANDARD_ITU_B
:
2842 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_FCT_USAGE__A
, FEC_OC_FCT_USAGE__PRE
, 0);
2844 pr_err("error %d\n", rc
);
2847 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_TMD_CTL_UPD_RATE__A
, FEC_OC_TMD_CTL_UPD_RATE__PRE
, 0);
2849 pr_err("error %d\n", rc
);
2852 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_TMD_INT_UPD_RATE__A
, 5, 0);
2854 pr_err("error %d\n", rc
);
2857 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_AVR_PARM_A__A
, FEC_OC_AVR_PARM_A__PRE
, 0);
2859 pr_err("error %d\n", rc
);
2862 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_AVR_PARM_B__A
, FEC_OC_AVR_PARM_B__PRE
, 0);
2864 pr_err("error %d\n", rc
);
2867 if (cfg_data
->static_clk
== true) {
2868 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_RCN_GAIN__A
, 0xD, 0);
2870 pr_err("error %d\n", rc
);
2874 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_RCN_GAIN__A
, FEC_OC_RCN_GAIN__PRE
, 0);
2876 pr_err("error %d\n", rc
);
2880 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_LWM__A
, 2, 0);
2882 pr_err("error %d\n", rc
);
2885 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_HWM__A
, 12, 0);
2887 pr_err("error %d\n", rc
);
2893 } /* swtich (standard) */
2895 /* Check insertion of the Reed-Solomon parity bytes */
2896 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_MODE__A
, &fec_oc_reg_mode
, 0);
2898 pr_err("error %d\n", rc
);
2901 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_IPR_MODE__A
, &fec_oc_reg_ipr_mode
, 0);
2903 pr_err("error %d\n", rc
);
2906 if (cfg_data
->insert_rs_byte
== true) {
2907 /* enable parity symbol forward */
2908 fec_oc_reg_mode
|= FEC_OC_MODE_PARITY__M
;
2909 /* MVAL disable during parity bytes */
2910 fec_oc_reg_ipr_mode
|= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M
;
2911 switch (ext_attr
->standard
) {
2912 case DRX_STANDARD_8VSB
:
2913 rcn_rate
= 0x004854D3;
2915 case DRX_STANDARD_ITU_B
:
2916 fec_oc_reg_mode
|= FEC_OC_MODE_TRANSPARENT__M
;
2917 switch (ext_attr
->constellation
) {
2918 case DRX_CONSTELLATION_QAM256
:
2919 rcn_rate
= 0x008945E7;
2921 case DRX_CONSTELLATION_QAM64
:
2922 rcn_rate
= 0x005F64D4;
2928 case DRX_STANDARD_ITU_A
:
2929 case DRX_STANDARD_ITU_C
:
2930 /* insert_rs_byte = true -> coef = 188/188 -> 1, RS bits are in MPEG output */
2934 (u32
) (common_attr
->sys_clock_freq
/ 8))) /
2939 } /* ext_attr->standard */
2940 } else { /* insert_rs_byte == false */
2942 /* disable parity symbol forward */
2943 fec_oc_reg_mode
&= (~FEC_OC_MODE_PARITY__M
);
2944 /* MVAL enable during parity bytes */
2945 fec_oc_reg_ipr_mode
&= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M
);
2946 switch (ext_attr
->standard
) {
2947 case DRX_STANDARD_8VSB
:
2948 rcn_rate
= 0x0041605C;
2950 case DRX_STANDARD_ITU_B
:
2951 fec_oc_reg_mode
&= (~FEC_OC_MODE_TRANSPARENT__M
);
2952 switch (ext_attr
->constellation
) {
2953 case DRX_CONSTELLATION_QAM256
:
2954 rcn_rate
= 0x0082D6A0;
2956 case DRX_CONSTELLATION_QAM64
:
2957 rcn_rate
= 0x005AEC1A;
2963 case DRX_STANDARD_ITU_A
:
2964 case DRX_STANDARD_ITU_C
:
2965 /* insert_rs_byte = false -> coef = 188/204, RS bits not in MPEG output */
2969 (u32
) (common_attr
->sys_clock_freq
/ 8))) /
2974 } /* ext_attr->standard */
2977 if (cfg_data
->enable_parallel
== true) { /* MPEG data output is parallel -> clear ipr_mode[0] */
2978 fec_oc_reg_ipr_mode
&= (~(FEC_OC_IPR_MODE_SERIAL__M
));
2979 } else { /* MPEG data output is serial -> set ipr_mode[0] */
2980 fec_oc_reg_ipr_mode
|= FEC_OC_IPR_MODE_SERIAL__M
;
2983 /* Control slective inversion of output bits */
2984 if (cfg_data
->invert_data
== true)
2985 fec_oc_reg_ipr_invert
|= invert_data_mask
;
2987 fec_oc_reg_ipr_invert
&= (~(invert_data_mask
));
2989 if (cfg_data
->invert_err
== true)
2990 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MERR__M
;
2992 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MERR__M
));
2994 if (cfg_data
->invert_str
== true)
2995 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MSTRT__M
;
2997 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MSTRT__M
));
2999 if (cfg_data
->invert_val
== true)
3000 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MVAL__M
;
3002 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MVAL__M
));
3004 if (cfg_data
->invert_clk
== true)
3005 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MCLK__M
;
3007 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MCLK__M
));
3010 if (cfg_data
->static_clk
== true) { /* Static mode */
3013 u16 fec_oc_dto_burst_len
= 0;
3014 u16 fec_oc_dto_period
= 0;
3016 fec_oc_dto_burst_len
= FEC_OC_DTO_BURST_LEN__PRE
;
3018 switch (ext_attr
->standard
) {
3019 case DRX_STANDARD_8VSB
:
3020 fec_oc_dto_period
= 4;
3021 if (cfg_data
->insert_rs_byte
== true)
3022 fec_oc_dto_burst_len
= 208;
3024 case DRX_STANDARD_ITU_A
:
3026 u32 symbol_rate_th
= 6400000;
3027 if (cfg_data
->insert_rs_byte
== true) {
3028 fec_oc_dto_burst_len
= 204;
3029 symbol_rate_th
= 5900000;
3031 if (ext_attr
->curr_symbol_rate
>=
3033 fec_oc_dto_period
= 0;
3035 fec_oc_dto_period
= 1;
3039 case DRX_STANDARD_ITU_B
:
3040 fec_oc_dto_period
= 1;
3041 if (cfg_data
->insert_rs_byte
== true)
3042 fec_oc_dto_burst_len
= 128;
3044 case DRX_STANDARD_ITU_C
:
3045 fec_oc_dto_period
= 1;
3046 if (cfg_data
->insert_rs_byte
== true)
3047 fec_oc_dto_burst_len
= 204;
3053 common_attr
->sys_clock_freq
* 1000 / (fec_oc_dto_period
+
3056 frac28(bit_rate
, common_attr
->sys_clock_freq
* 1000);
3058 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_RATE_HI__A
, (u16
)((dto_rate
>> 16) & FEC_OC_DTO_RATE_HI__M
), 0);
3060 pr_err("error %d\n", rc
);
3063 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_RATE_LO__A
, (u16
)(dto_rate
& FEC_OC_DTO_RATE_LO_RATE_LO__M
), 0);
3065 pr_err("error %d\n", rc
);
3068 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_MODE__A
, FEC_OC_DTO_MODE_DYNAMIC__M
| FEC_OC_DTO_MODE_OFFSET_ENABLE__M
, 0);
3070 pr_err("error %d\n", rc
);
3073 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_FCT_MODE__A
, FEC_OC_FCT_MODE_RAT_ENA__M
| FEC_OC_FCT_MODE_VIRT_ENA__M
, 0);
3075 pr_err("error %d\n", rc
);
3078 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_BURST_LEN__A
, fec_oc_dto_burst_len
, 0);
3080 pr_err("error %d\n", rc
);
3083 if (ext_attr
->mpeg_output_clock_rate
!= DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO
)
3084 fec_oc_dto_period
= ext_attr
->mpeg_output_clock_rate
- 1;
3085 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_PERIOD__A
, fec_oc_dto_period
, 0);
3087 pr_err("error %d\n", rc
);
3090 } else { /* Dynamic mode */
3092 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_MODE__A
, FEC_OC_DTO_MODE_DYNAMIC__M
, 0);
3094 pr_err("error %d\n", rc
);
3097 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_FCT_MODE__A
, 0, 0);
3099 pr_err("error %d\n", rc
);
3104 rc
= drxdap_fasi_write_reg32(dev_addr
, FEC_OC_RCN_CTL_RATE_LO__A
, rcn_rate
, 0);
3106 pr_err("error %d\n", rc
);
3110 /* Write appropriate registers with requested configuration */
3111 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_MODE__A
, fec_oc_reg_mode
, 0);
3113 pr_err("error %d\n", rc
);
3116 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_IPR_MODE__A
, fec_oc_reg_ipr_mode
, 0);
3118 pr_err("error %d\n", rc
);
3121 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_IPR_INVERT__A
, fec_oc_reg_ipr_invert
, 0);
3123 pr_err("error %d\n", rc
);
3127 /* enabling for both parallel and serial now */
3128 /* Write magic word to enable pdr reg write */
3129 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0xFABA, 0);
3131 pr_err("error %d\n", rc
);
3134 /* Set MPEG TS pads to outputmode */
3135 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MSTRT_CFG__A
, 0x0013, 0);
3137 pr_err("error %d\n", rc
);
3140 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MERR_CFG__A
, 0x0013, 0);
3142 pr_err("error %d\n", rc
);
3145 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MCLK_CFG__A
, MPEG_OUTPUT_CLK_DRIVE_STRENGTH
<< SIO_PDR_MCLK_CFG_DRIVE__B
| 0x03 << SIO_PDR_MCLK_CFG_MODE__B
, 0);
3147 pr_err("error %d\n", rc
);
3150 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MVAL_CFG__A
, 0x0013, 0);
3152 pr_err("error %d\n", rc
);
3156 MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
<<
3157 SIO_PDR_MD0_CFG_DRIVE__B
| 0x03 << SIO_PDR_MD0_CFG_MODE__B
;
3158 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD0_CFG__A
, sio_pdr_md_cfg
, 0);
3160 pr_err("error %d\n", rc
);
3163 if (cfg_data
->enable_parallel
== true) { /* MPEG data output is parallel -> set MD1 to MD7 to output mode */
3165 MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
<<
3166 SIO_PDR_MD0_CFG_DRIVE__B
| 0x03 <<
3167 SIO_PDR_MD0_CFG_MODE__B
;
3168 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD0_CFG__A
, sio_pdr_md_cfg
, 0);
3170 pr_err("error %d\n", rc
);
3173 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD1_CFG__A
, sio_pdr_md_cfg
, 0);
3175 pr_err("error %d\n", rc
);
3178 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD2_CFG__A
, sio_pdr_md_cfg
, 0);
3180 pr_err("error %d\n", rc
);
3183 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD3_CFG__A
, sio_pdr_md_cfg
, 0);
3185 pr_err("error %d\n", rc
);
3188 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD4_CFG__A
, sio_pdr_md_cfg
, 0);
3190 pr_err("error %d\n", rc
);
3193 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD5_CFG__A
, sio_pdr_md_cfg
, 0);
3195 pr_err("error %d\n", rc
);
3198 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD6_CFG__A
, sio_pdr_md_cfg
, 0);
3200 pr_err("error %d\n", rc
);
3203 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD7_CFG__A
, sio_pdr_md_cfg
, 0);
3205 pr_err("error %d\n", rc
);
3208 } else { /* MPEG data output is serial -> set MD1 to MD7 to tri-state */
3209 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD1_CFG__A
, 0x0000, 0);
3211 pr_err("error %d\n", rc
);
3214 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD2_CFG__A
, 0x0000, 0);
3216 pr_err("error %d\n", rc
);
3219 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD3_CFG__A
, 0x0000, 0);
3221 pr_err("error %d\n", rc
);
3224 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD4_CFG__A
, 0x0000, 0);
3226 pr_err("error %d\n", rc
);
3229 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD5_CFG__A
, 0x0000, 0);
3231 pr_err("error %d\n", rc
);
3234 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD6_CFG__A
, 0x0000, 0);
3236 pr_err("error %d\n", rc
);
3239 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD7_CFG__A
, 0x0000, 0);
3241 pr_err("error %d\n", rc
);
3245 /* Enable Monitor Bus output over MPEG pads and ctl input */
3246 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MON_CFG__A
, 0x0000, 0);
3248 pr_err("error %d\n", rc
);
3251 /* Write nomagic word to enable pdr reg write */
3252 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3254 pr_err("error %d\n", rc
);
3258 /* Write magic word to enable pdr reg write */
3259 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0xFABA, 0);
3261 pr_err("error %d\n", rc
);
3264 /* Set MPEG TS pads to inputmode */
3265 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MSTRT_CFG__A
, 0x0000, 0);
3267 pr_err("error %d\n", rc
);
3270 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MERR_CFG__A
, 0x0000, 0);
3272 pr_err("error %d\n", rc
);
3275 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MCLK_CFG__A
, 0x0000, 0);
3277 pr_err("error %d\n", rc
);
3280 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MVAL_CFG__A
, 0x0000, 0);
3282 pr_err("error %d\n", rc
);
3285 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD0_CFG__A
, 0x0000, 0);
3287 pr_err("error %d\n", rc
);
3290 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD1_CFG__A
, 0x0000, 0);
3292 pr_err("error %d\n", rc
);
3295 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD2_CFG__A
, 0x0000, 0);
3297 pr_err("error %d\n", rc
);
3300 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD3_CFG__A
, 0x0000, 0);
3302 pr_err("error %d\n", rc
);
3305 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD4_CFG__A
, 0x0000, 0);
3307 pr_err("error %d\n", rc
);
3310 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD5_CFG__A
, 0x0000, 0);
3312 pr_err("error %d\n", rc
);
3315 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD6_CFG__A
, 0x0000, 0);
3317 pr_err("error %d\n", rc
);
3320 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD7_CFG__A
, 0x0000, 0);
3322 pr_err("error %d\n", rc
);
3325 /* Enable Monitor Bus output over MPEG pads and ctl input */
3326 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MON_CFG__A
, 0x0000, 0);
3328 pr_err("error %d\n", rc
);
3331 /* Write nomagic word to enable pdr reg write */
3332 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3334 pr_err("error %d\n", rc
);
3339 /* save values for restore after re-acquire */
3340 common_attr
->mpeg_cfg
.enable_mpeg_output
= cfg_data
->enable_mpeg_output
;
3347 /*----------------------------------------------------------------------------*/
3350 /*----------------------------------------------------------------------------*/
3351 /* MPEG Output Configuration Functions - end */
3352 /*----------------------------------------------------------------------------*/
3354 /*----------------------------------------------------------------------------*/
3355 /* miscellaneous configuartions - begin */
3356 /*----------------------------------------------------------------------------*/
3359 * \fn int set_mpegtei_handling()
3360 * \brief Activate MPEG TEI handling settings.
3361 * \param devmod Pointer to demodulator instance.
3364 * This routine should be called during a set channel of QAM/VSB
3367 static int set_mpegtei_handling(struct drx_demod_instance
*demod
)
3369 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3370 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
3372 u16 fec_oc_dpr_mode
= 0;
3373 u16 fec_oc_snc_mode
= 0;
3374 u16 fec_oc_ems_mode
= 0;
3376 dev_addr
= demod
->my_i2c_dev_addr
;
3377 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3379 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_DPR_MODE__A
, &fec_oc_dpr_mode
, 0);
3381 pr_err("error %d\n", rc
);
3384 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_SNC_MODE__A
, &fec_oc_snc_mode
, 0);
3386 pr_err("error %d\n", rc
);
3389 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_EMS_MODE__A
, &fec_oc_ems_mode
, 0);
3391 pr_err("error %d\n", rc
);
3395 /* reset to default, allow TEI bit to be changed */
3396 fec_oc_dpr_mode
&= (~FEC_OC_DPR_MODE_ERR_DISABLE__M
);
3397 fec_oc_snc_mode
&= (~(FEC_OC_SNC_MODE_ERROR_CTL__M
|
3398 FEC_OC_SNC_MODE_CORR_DISABLE__M
));
3399 fec_oc_ems_mode
&= (~FEC_OC_EMS_MODE_MODE__M
);
3401 if (ext_attr
->disable_te_ihandling
) {
3402 /* do not change TEI bit */
3403 fec_oc_dpr_mode
|= FEC_OC_DPR_MODE_ERR_DISABLE__M
;
3404 fec_oc_snc_mode
|= FEC_OC_SNC_MODE_CORR_DISABLE__M
|
3405 ((0x2) << (FEC_OC_SNC_MODE_ERROR_CTL__B
));
3406 fec_oc_ems_mode
|= ((0x01) << (FEC_OC_EMS_MODE_MODE__B
));
3409 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DPR_MODE__A
, fec_oc_dpr_mode
, 0);
3411 pr_err("error %d\n", rc
);
3414 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_MODE__A
, fec_oc_snc_mode
, 0);
3416 pr_err("error %d\n", rc
);
3419 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_EMS_MODE__A
, fec_oc_ems_mode
, 0);
3421 pr_err("error %d\n", rc
);
3430 /*----------------------------------------------------------------------------*/
3432 * \fn int bit_reverse_mpeg_output()
3433 * \brief Set MPEG output bit-endian settings.
3434 * \param devmod Pointer to demodulator instance.
3437 * This routine should be called during a set channel of QAM/VSB
3440 static int bit_reverse_mpeg_output(struct drx_demod_instance
*demod
)
3442 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3443 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
3445 u16 fec_oc_ipr_mode
= 0;
3447 dev_addr
= demod
->my_i2c_dev_addr
;
3448 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3450 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_IPR_MODE__A
, &fec_oc_ipr_mode
, 0);
3452 pr_err("error %d\n", rc
);
3456 /* reset to default (normal bit order) */
3457 fec_oc_ipr_mode
&= (~FEC_OC_IPR_MODE_REVERSE_ORDER__M
);
3459 if (ext_attr
->bit_reverse_mpeg_outout
)
3460 fec_oc_ipr_mode
|= FEC_OC_IPR_MODE_REVERSE_ORDER__M
;
3462 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_IPR_MODE__A
, fec_oc_ipr_mode
, 0);
3464 pr_err("error %d\n", rc
);
3473 /*----------------------------------------------------------------------------*/
3475 * \fn int set_mpeg_start_width()
3476 * \brief Set MPEG start width.
3477 * \param devmod Pointer to demodulator instance.
3480 * This routine should be called during a set channel of QAM/VSB
3483 static int set_mpeg_start_width(struct drx_demod_instance
*demod
)
3485 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3486 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
3487 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) NULL
;
3489 u16 fec_oc_comm_mb
= 0;
3491 dev_addr
= demod
->my_i2c_dev_addr
;
3492 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3493 common_attr
= demod
->my_common_attr
;
3495 if ((common_attr
->mpeg_cfg
.static_clk
== true)
3496 && (common_attr
->mpeg_cfg
.enable_parallel
== false)) {
3497 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_COMM_MB__A
, &fec_oc_comm_mb
, 0);
3499 pr_err("error %d\n", rc
);
3502 fec_oc_comm_mb
&= ~FEC_OC_COMM_MB_CTL_ON
;
3503 if (ext_attr
->mpeg_start_width
== DRXJ_MPEG_START_WIDTH_8CLKCYC
)
3504 fec_oc_comm_mb
|= FEC_OC_COMM_MB_CTL_ON
;
3505 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_COMM_MB__A
, fec_oc_comm_mb
, 0);
3507 pr_err("error %d\n", rc
);
3517 /*----------------------------------------------------------------------------*/
3518 /* miscellaneous configuartions - end */
3519 /*----------------------------------------------------------------------------*/
3521 /*----------------------------------------------------------------------------*/
3522 /* UIO Configuration Functions - begin */
3523 /*----------------------------------------------------------------------------*/
3525 * \fn int ctrl_set_uio_cfg()
3526 * \brief Configure modus oprandi UIO.
3527 * \param demod Pointer to demodulator instance.
3528 * \param uio_cfg Pointer to a configuration setting for a certain UIO.
3531 static int ctrl_set_uio_cfg(struct drx_demod_instance
*demod
, struct drxuio_cfg
*uio_cfg
)
3533 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3536 if ((uio_cfg
== NULL
) || (demod
== NULL
))
3539 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3541 /* Write magic word to enable pdr reg write */
3542 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
3544 pr_err("error %d\n", rc
);
3547 switch (uio_cfg
->uio
) {
3548 /*====================================================================*/
3550 /* DRX_UIO1: SMA_TX UIO-1 */
3551 if (!ext_attr
->has_smatx
)
3553 switch (uio_cfg
->mode
) {
3554 case DRX_UIO_MODE_FIRMWARE_SMA
: /* falltrough */
3555 case DRX_UIO_MODE_FIRMWARE_SAW
: /* falltrough */
3556 case DRX_UIO_MODE_READWRITE
:
3557 ext_attr
->uio_sma_tx_mode
= uio_cfg
->mode
;
3559 case DRX_UIO_MODE_DISABLE
:
3560 ext_attr
->uio_sma_tx_mode
= uio_cfg
->mode
;
3561 /* pad configuration register is set 0 - input mode */
3562 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_TX_CFG__A
, 0, 0);
3564 pr_err("error %d\n", rc
);
3570 } /* switch ( uio_cfg->mode ) */
3572 /*====================================================================*/
3574 /* DRX_UIO2: SMA_RX UIO-2 */
3575 if (!ext_attr
->has_smarx
)
3577 switch (uio_cfg
->mode
) {
3578 case DRX_UIO_MODE_FIRMWARE0
: /* falltrough */
3579 case DRX_UIO_MODE_READWRITE
:
3580 ext_attr
->uio_sma_rx_mode
= uio_cfg
->mode
;
3582 case DRX_UIO_MODE_DISABLE
:
3583 ext_attr
->uio_sma_rx_mode
= uio_cfg
->mode
;
3584 /* pad configuration register is set 0 - input mode */
3585 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_RX_CFG__A
, 0, 0);
3587 pr_err("error %d\n", rc
);
3594 } /* switch ( uio_cfg->mode ) */
3596 /*====================================================================*/
3598 /* DRX_UIO3: GPIO UIO-3 */
3599 if (!ext_attr
->has_gpio
)
3601 switch (uio_cfg
->mode
) {
3602 case DRX_UIO_MODE_FIRMWARE0
: /* falltrough */
3603 case DRX_UIO_MODE_READWRITE
:
3604 ext_attr
->uio_gpio_mode
= uio_cfg
->mode
;
3606 case DRX_UIO_MODE_DISABLE
:
3607 ext_attr
->uio_gpio_mode
= uio_cfg
->mode
;
3608 /* pad configuration register is set 0 - input mode */
3609 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_GPIO_CFG__A
, 0, 0);
3611 pr_err("error %d\n", rc
);
3618 } /* switch ( uio_cfg->mode ) */
3620 /*====================================================================*/
3622 /* DRX_UIO4: IRQN UIO-4 */
3623 if (!ext_attr
->has_irqn
)
3625 switch (uio_cfg
->mode
) {
3626 case DRX_UIO_MODE_READWRITE
:
3627 ext_attr
->uio_irqn_mode
= uio_cfg
->mode
;
3629 case DRX_UIO_MODE_DISABLE
:
3630 /* pad configuration register is set 0 - input mode */
3631 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_IRQN_CFG__A
, 0, 0);
3633 pr_err("error %d\n", rc
);
3636 ext_attr
->uio_irqn_mode
= uio_cfg
->mode
;
3638 case DRX_UIO_MODE_FIRMWARE0
: /* falltrough */
3642 } /* switch ( uio_cfg->mode ) */
3644 /*====================================================================*/
3647 } /* switch ( uio_cfg->uio ) */
3649 /* Write magic word to disable pdr reg write */
3650 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3652 pr_err("error %d\n", rc
);
3662 * \fn int ctrl_uio_write()
3663 * \brief Write to a UIO.
3664 * \param demod Pointer to demodulator instance.
3665 * \param uio_data Pointer to data container for a certain UIO.
3669 ctrl_uio_write(struct drx_demod_instance
*demod
, struct drxuio_data
*uio_data
)
3671 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3673 u16 pin_cfg_value
= 0;
3676 if ((uio_data
== NULL
) || (demod
== NULL
))
3679 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3681 /* Write magic word to enable pdr reg write */
3682 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
3684 pr_err("error %d\n", rc
);
3687 switch (uio_data
->uio
) {
3688 /*====================================================================*/
3690 /* DRX_UIO1: SMA_TX UIO-1 */
3691 if (!ext_attr
->has_smatx
)
3693 if ((ext_attr
->uio_sma_tx_mode
!= DRX_UIO_MODE_READWRITE
)
3694 && (ext_attr
->uio_sma_tx_mode
!= DRX_UIO_MODE_FIRMWARE_SAW
)) {
3698 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3699 pin_cfg_value
|= 0x0113;
3700 /* io_pad_cfg_mode output mode is drive always */
3701 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3703 /* write to io pad configuration register - output mode */
3704 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_TX_CFG__A
, pin_cfg_value
, 0);
3706 pr_err("error %d\n", rc
);
3710 /* use corresponding bit in io data output registar */
3711 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, &value
, 0);
3713 pr_err("error %d\n", rc
);
3716 if (!uio_data
->value
)
3717 value
&= 0x7FFF; /* write zero to 15th bit - 1st UIO */
3719 value
|= 0x8000; /* write one to 15th bit - 1st UIO */
3721 /* write back to io data output register */
3722 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, value
, 0);
3724 pr_err("error %d\n", rc
);
3728 /*======================================================================*/
3730 /* DRX_UIO2: SMA_RX UIO-2 */
3731 if (!ext_attr
->has_smarx
)
3733 if (ext_attr
->uio_sma_rx_mode
!= DRX_UIO_MODE_READWRITE
)
3737 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3738 pin_cfg_value
|= 0x0113;
3739 /* io_pad_cfg_mode output mode is drive always */
3740 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3742 /* write to io pad configuration register - output mode */
3743 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_RX_CFG__A
, pin_cfg_value
, 0);
3745 pr_err("error %d\n", rc
);
3749 /* use corresponding bit in io data output registar */
3750 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, &value
, 0);
3752 pr_err("error %d\n", rc
);
3755 if (!uio_data
->value
)
3756 value
&= 0xBFFF; /* write zero to 14th bit - 2nd UIO */
3758 value
|= 0x4000; /* write one to 14th bit - 2nd UIO */
3760 /* write back to io data output register */
3761 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, value
, 0);
3763 pr_err("error %d\n", rc
);
3767 /*====================================================================*/
3769 /* DRX_UIO3: ASEL UIO-3 */
3770 if (!ext_attr
->has_gpio
)
3772 if (ext_attr
->uio_gpio_mode
!= DRX_UIO_MODE_READWRITE
)
3776 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3777 pin_cfg_value
|= 0x0113;
3778 /* io_pad_cfg_mode output mode is drive always */
3779 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3781 /* write to io pad configuration register - output mode */
3782 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_GPIO_CFG__A
, pin_cfg_value
, 0);
3784 pr_err("error %d\n", rc
);
3788 /* use corresponding bit in io data output registar */
3789 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_HI__A
, &value
, 0);
3791 pr_err("error %d\n", rc
);
3794 if (!uio_data
->value
)
3795 value
&= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
3797 value
|= 0x0004; /* write one to 2nd bit - 3rd UIO */
3799 /* write back to io data output register */
3800 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_HI__A
, value
, 0);
3802 pr_err("error %d\n", rc
);
3806 /*=====================================================================*/
3808 /* DRX_UIO4: IRQN UIO-4 */
3809 if (!ext_attr
->has_irqn
)
3812 if (ext_attr
->uio_irqn_mode
!= DRX_UIO_MODE_READWRITE
)
3816 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3817 pin_cfg_value
|= 0x0113;
3818 /* io_pad_cfg_mode output mode is drive always */
3819 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3821 /* write to io pad configuration register - output mode */
3822 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_IRQN_CFG__A
, pin_cfg_value
, 0);
3824 pr_err("error %d\n", rc
);
3828 /* use corresponding bit in io data output registar */
3829 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, &value
, 0);
3831 pr_err("error %d\n", rc
);
3834 if (uio_data
->value
== false)
3835 value
&= 0xEFFF; /* write zero to 12th bit - 4th UIO */
3837 value
|= 0x1000; /* write one to 12th bit - 4th UIO */
3839 /* write back to io data output register */
3840 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, value
, 0);
3842 pr_err("error %d\n", rc
);
3846 /*=====================================================================*/
3849 } /* switch ( uio_data->uio ) */
3851 /* Write magic word to disable pdr reg write */
3852 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3854 pr_err("error %d\n", rc
);
3863 /*---------------------------------------------------------------------------*/
3864 /* UIO Configuration Functions - end */
3865 /*---------------------------------------------------------------------------*/
3867 /*----------------------------------------------------------------------------*/
3868 /* I2C Bridge Functions - begin */
3869 /*----------------------------------------------------------------------------*/
3871 * \fn int ctrl_i2c_bridge()
3872 * \brief Open or close the I2C switch to tuner.
3873 * \param demod Pointer to demodulator instance.
3874 * \param bridge_closed Pointer to bool indication if bridge is closed not.
3879 ctrl_i2c_bridge(struct drx_demod_instance
*demod
, bool *bridge_closed
)
3881 struct drxj_hi_cmd hi_cmd
;
3884 /* check arguments */
3885 if (bridge_closed
== NULL
)
3888 hi_cmd
.cmd
= SIO_HI_RA_RAM_CMD_BRDCTRL
;
3889 hi_cmd
.param1
= SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY
;
3891 hi_cmd
.param2
= SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED
;
3893 hi_cmd
.param2
= SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN
;
3895 return hi_command(demod
->my_i2c_dev_addr
, &hi_cmd
, &result
);
3898 /*----------------------------------------------------------------------------*/
3899 /* I2C Bridge Functions - end */
3900 /*----------------------------------------------------------------------------*/
3902 /*----------------------------------------------------------------------------*/
3903 /* Smart antenna Functions - begin */
3904 /*----------------------------------------------------------------------------*/
3906 * \fn int smart_ant_init()
3907 * \brief Initialize Smart Antenna.
3908 * \param pointer to struct drx_demod_instance.
3912 static int smart_ant_init(struct drx_demod_instance
*demod
)
3914 struct drxj_data
*ext_attr
= NULL
;
3915 struct i2c_device_addr
*dev_addr
= NULL
;
3916 struct drxuio_cfg uio_cfg
= { DRX_UIO1
, DRX_UIO_MODE_FIRMWARE_SMA
};
3920 dev_addr
= demod
->my_i2c_dev_addr
;
3921 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3923 /* Write magic word to enable pdr reg write */
3924 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
3926 pr_err("error %d\n", rc
);
3929 /* init smart antenna */
3930 rc
= drxj_dap_read_reg16(dev_addr
, SIO_SA_TX_COMMAND__A
, &data
, 0);
3932 pr_err("error %d\n", rc
);
3935 if (ext_attr
->smart_ant_inverted
) {
3936 rc
= drxj_dap_write_reg16(dev_addr
, SIO_SA_TX_COMMAND__A
, (data
| SIO_SA_TX_COMMAND_TX_INVERT__M
) | SIO_SA_TX_COMMAND_TX_ENABLE__M
, 0);
3938 pr_err("error %d\n", rc
);
3942 rc
= drxj_dap_write_reg16(dev_addr
, SIO_SA_TX_COMMAND__A
, (data
& (~SIO_SA_TX_COMMAND_TX_INVERT__M
)) | SIO_SA_TX_COMMAND_TX_ENABLE__M
, 0);
3944 pr_err("error %d\n", rc
);
3949 /* config SMA_TX pin to smart antenna mode */
3950 rc
= ctrl_set_uio_cfg(demod
, &uio_cfg
);
3952 pr_err("error %d\n", rc
);
3955 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_TX_CFG__A
, 0x13, 0);
3957 pr_err("error %d\n", rc
);
3960 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_TX_GPIO_FNC__A
, 0x03, 0);
3962 pr_err("error %d\n", rc
);
3966 /* Write magic word to disable pdr reg write */
3967 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3969 pr_err("error %d\n", rc
);
3978 static int scu_command(struct i2c_device_addr
*dev_addr
, struct drxjscu_cmd
*cmd
)
3982 unsigned long timeout
;
3988 /* Wait until SCU command interface is ready to receive command */
3989 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_COMMAND__A
, &cur_cmd
, 0);
3991 pr_err("error %d\n", rc
);
3994 if (cur_cmd
!= DRX_SCU_READY
)
3997 switch (cmd
->parameter_len
) {
3999 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_4__A
, *(cmd
->parameter
+ 4), 0);
4001 pr_err("error %d\n", rc
);
4005 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_3__A
, *(cmd
->parameter
+ 3), 0);
4007 pr_err("error %d\n", rc
);
4011 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_2__A
, *(cmd
->parameter
+ 2), 0);
4013 pr_err("error %d\n", rc
);
4017 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_1__A
, *(cmd
->parameter
+ 1), 0);
4019 pr_err("error %d\n", rc
);
4023 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_0__A
, *(cmd
->parameter
+ 0), 0);
4025 pr_err("error %d\n", rc
);
4032 /* this number of parameters is not supported */
4035 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_COMMAND__A
, cmd
->command
, 0);
4037 pr_err("error %d\n", rc
);
4041 /* Wait until SCU has processed command */
4042 timeout
= jiffies
+ msecs_to_jiffies(DRXJ_MAX_WAITTIME
);
4043 while (time_is_after_jiffies(timeout
)) {
4044 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_COMMAND__A
, &cur_cmd
, 0);
4046 pr_err("error %d\n", rc
);
4049 if (cur_cmd
== DRX_SCU_READY
)
4051 usleep_range(1000, 2000);
4054 if (cur_cmd
!= DRX_SCU_READY
)
4058 if ((cmd
->result_len
> 0) && (cmd
->result
!= NULL
)) {
4061 switch (cmd
->result_len
) {
4063 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_PARAM_3__A
, cmd
->result
+ 3, 0);
4065 pr_err("error %d\n", rc
);
4069 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_PARAM_2__A
, cmd
->result
+ 2, 0);
4071 pr_err("error %d\n", rc
);
4075 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_PARAM_1__A
, cmd
->result
+ 1, 0);
4077 pr_err("error %d\n", rc
);
4081 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_PARAM_0__A
, cmd
->result
+ 0, 0);
4083 pr_err("error %d\n", rc
);
4090 /* this number of parameters is not supported */
4094 /* Check if an error was reported by SCU */
4095 err
= cmd
->result
[0];
4097 /* check a few fixed error codes */
4098 if ((err
== (s16
) SCU_RAM_PARAM_0_RESULT_UNKSTD
)
4099 || (err
== (s16
) SCU_RAM_PARAM_0_RESULT_UNKCMD
)
4100 || (err
== (s16
) SCU_RAM_PARAM_0_RESULT_INVPAR
)
4101 || (err
== (s16
) SCU_RAM_PARAM_0_RESULT_SIZE
)
4105 /* here it is assumed that negative means error, and positive no error */
4119 * \fn int DRXJ_DAP_SCUAtomicReadWriteBlock()
4120 * \brief Basic access routine for SCU atomic read or write access
4121 * \param dev_addr pointer to i2c dev address
4122 * \param addr destination/source address
4123 * \param datasize size of data buffer in bytes
4124 * \param data pointer to data buffer
4127 * \retval -EIO Timeout, I2C error, illegal bank
4130 #define ADDR_AT_SCU_SPACE(x) ((x - 0x82E000) * 2)
4132 int drxj_dap_scu_atomic_read_write_block(struct i2c_device_addr
*dev_addr
, u32 addr
, u16 datasize
, /* max 30 bytes because the limit of SCU parameter */
4133 u8
*data
, bool read_flag
)
4135 struct drxjscu_cmd scu_cmd
;
4137 u16 set_param_parameters
[18];
4140 /* Parameter check */
4141 if (!data
|| !dev_addr
|| (datasize
% 2) || ((datasize
/ 2) > 16))
4144 set_param_parameters
[1] = (u16
) ADDR_AT_SCU_SPACE(addr
);
4145 if (read_flag
) { /* read */
4146 set_param_parameters
[0] = ((~(0x0080)) & datasize
);
4147 scu_cmd
.parameter_len
= 2;
4148 scu_cmd
.result_len
= datasize
/ 2 + 2;
4152 set_param_parameters
[0] = 0x0080 | datasize
;
4153 for (i
= 0; i
< (datasize
/ 2); i
++) {
4154 set_param_parameters
[i
+ 2] =
4155 (data
[2 * i
] | (data
[(2 * i
) + 1] << 8));
4157 scu_cmd
.parameter_len
= datasize
/ 2 + 2;
4158 scu_cmd
.result_len
= 1;
4162 SCU_RAM_COMMAND_STANDARD_TOP
|
4163 SCU_RAM_COMMAND_CMD_AUX_SCU_ATOMIC_ACCESS
;
4164 scu_cmd
.result
= cmd_result
;
4165 scu_cmd
.parameter
= set_param_parameters
;
4166 rc
= scu_command(dev_addr
, &scu_cmd
);
4168 pr_err("error %d\n", rc
);
4174 /* read data from buffer */
4175 for (i
= 0; i
< (datasize
/ 2); i
++) {
4176 data
[2 * i
] = (u8
) (scu_cmd
.result
[i
+ 2] & 0xFF);
4177 data
[(2 * i
) + 1] = (u8
) (scu_cmd
.result
[i
+ 2] >> 8);
4188 /*============================================================================*/
4191 * \fn int DRXJ_DAP_AtomicReadReg16()
4192 * \brief Atomic read of 16 bits words
4195 int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr
*dev_addr
,
4197 u16
*data
, u32 flags
)
4206 rc
= drxj_dap_scu_atomic_read_write_block(dev_addr
, addr
, 2, buf
, true);
4210 word
= (u16
) (buf
[0] + (buf
[1] << 8));
4217 /*============================================================================*/
4219 * \fn int drxj_dap_scu_atomic_write_reg16()
4220 * \brief Atomic read of 16 bits words
4223 int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr
*dev_addr
,
4225 u16 data
, u32 flags
)
4230 buf
[0] = (u8
) (data
& 0xff);
4231 buf
[1] = (u8
) ((data
>> 8) & 0xff);
4233 rc
= drxj_dap_scu_atomic_read_write_block(dev_addr
, addr
, 2, buf
, false);
4238 /* -------------------------------------------------------------------------- */
4240 * \brief Measure result of ADC synchronisation
4241 * \param demod demod instance
4242 * \param count (returned) count
4245 * \retval -EIO Failure: I2C error
4248 static int adc_sync_measurement(struct drx_demod_instance
*demod
, u16
*count
)
4250 struct i2c_device_addr
*dev_addr
= NULL
;
4254 dev_addr
= demod
->my_i2c_dev_addr
;
4256 /* Start measurement */
4257 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_COMM_EXEC__A
, IQM_AF_COMM_EXEC_ACTIVE
, 0);
4259 pr_err("error %d\n", rc
);
4262 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_START_LOCK__A
, 1, 0);
4264 pr_err("error %d\n", rc
);
4268 /* Wait at least 3*128*(1/sysclk) <<< 1 millisec */
4272 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_PHASE0__A
, &data
, 0);
4274 pr_err("error %d\n", rc
);
4278 *count
= *count
+ 1;
4279 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_PHASE1__A
, &data
, 0);
4281 pr_err("error %d\n", rc
);
4285 *count
= *count
+ 1;
4286 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_PHASE2__A
, &data
, 0);
4288 pr_err("error %d\n", rc
);
4292 *count
= *count
+ 1;
4300 * \brief Synchronize analog and digital clock domains
4301 * \param demod demod instance
4304 * \retval -EIO Failure: I2C error or failure to synchronize
4306 * An IQM reset will also reset the results of this synchronization.
4307 * After an IQM reset this routine needs to be called again.
4311 static int adc_synchronization(struct drx_demod_instance
*demod
)
4313 struct i2c_device_addr
*dev_addr
= NULL
;
4317 dev_addr
= demod
->my_i2c_dev_addr
;
4319 rc
= adc_sync_measurement(demod
, &count
);
4321 pr_err("error %d\n", rc
);
4326 /* Try sampling on a different edge */
4329 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_CLKNEG__A
, &clk_neg
, 0);
4331 pr_err("error %d\n", rc
);
4335 clk_neg
^= IQM_AF_CLKNEG_CLKNEGDATA__M
;
4336 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLKNEG__A
, clk_neg
, 0);
4338 pr_err("error %d\n", rc
);
4342 rc
= adc_sync_measurement(demod
, &count
);
4344 pr_err("error %d\n", rc
);
4349 /* TODO: implement fallback scenarios */
4358 /*============================================================================*/
4359 /*== END AUXILIARY FUNCTIONS ==*/
4360 /*============================================================================*/
4362 /*============================================================================*/
4363 /*============================================================================*/
4364 /*== 8VSB & QAM COMMON DATAPATH FUNCTIONS ==*/
4365 /*============================================================================*/
4366 /*============================================================================*/
4368 * \fn int init_agc ()
4369 * \brief Initialize AGC for all standards.
4370 * \param demod instance of demodulator.
4371 * \param channel pointer to channel data.
4374 static int init_agc(struct drx_demod_instance
*demod
)
4376 struct i2c_device_addr
*dev_addr
= NULL
;
4377 struct drx_common_attr
*common_attr
= NULL
;
4378 struct drxj_data
*ext_attr
= NULL
;
4379 struct drxj_cfg_agc
*p_agc_rf_settings
= NULL
;
4380 struct drxj_cfg_agc
*p_agc_if_settings
= NULL
;
4382 u16 ingain_tgt_max
= 0;
4384 u16 sns_sum_max
= 0;
4385 u16 clp_sum_max
= 0;
4387 u16 ki_innergain_min
= 0;
4390 u16 if_iaccu_hi_tgt_min
= 0;
4392 u16 agc_ki_dgain
= 0;
4394 u16 clp_ctrl_mode
= 0;
4398 dev_addr
= demod
->my_i2c_dev_addr
;
4399 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
4400 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
4402 switch (ext_attr
->standard
) {
4403 case DRX_STANDARD_8VSB
:
4405 clp_dir_to
= (u16
) (-9);
4407 sns_dir_to
= (u16
) (-9);
4408 ki_innergain_min
= (u16
) (-32768);
4411 if_iaccu_hi_tgt_min
= 2047;
4413 ingain_tgt_max
= 16383;
4415 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MINGAIN__A
, 0x7fff, 0);
4417 pr_err("error %d\n", rc
);
4420 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MAXGAIN__A
, 0x0, 0);
4422 pr_err("error %d\n", rc
);
4425 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_SUM__A
, 0, 0);
4427 pr_err("error %d\n", rc
);
4430 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_CYCCNT__A
, 0, 0);
4432 pr_err("error %d\n", rc
);
4435 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_WD__A
, 0, 0);
4437 pr_err("error %d\n", rc
);
4440 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_STP__A
, 1, 0);
4442 pr_err("error %d\n", rc
);
4445 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_SUM__A
, 0, 0);
4447 pr_err("error %d\n", rc
);
4450 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_CYCCNT__A
, 0, 0);
4452 pr_err("error %d\n", rc
);
4455 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_WD__A
, 0, 0);
4457 pr_err("error %d\n", rc
);
4460 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_STP__A
, 1, 0);
4462 pr_err("error %d\n", rc
);
4465 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN__A
, 1024, 0);
4467 pr_err("error %d\n", rc
);
4470 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_VSB_AGC_POW_TGT__A
, 22600, 0);
4472 pr_err("error %d\n", rc
);
4475 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN_TGT__A
, 13200, 0);
4477 pr_err("error %d\n", rc
);
4480 p_agc_if_settings
= &(ext_attr
->vsb_if_agc_cfg
);
4481 p_agc_rf_settings
= &(ext_attr
->vsb_rf_agc_cfg
);
4483 #ifndef DRXJ_VSB_ONLY
4484 case DRX_STANDARD_ITU_A
:
4485 case DRX_STANDARD_ITU_C
:
4486 case DRX_STANDARD_ITU_B
:
4487 ingain_tgt_max
= 5119;
4489 clp_dir_to
= (u16
) (-5);
4491 sns_dir_to
= (u16
) (-3);
4492 ki_innergain_min
= 0;
4494 if_iaccu_hi_tgt_min
= 2047;
4498 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MINGAIN__A
, 0x7fff, 0);
4500 pr_err("error %d\n", rc
);
4503 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MAXGAIN__A
, 0x0, 0);
4505 pr_err("error %d\n", rc
);
4508 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_SUM__A
, 0, 0);
4510 pr_err("error %d\n", rc
);
4513 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_CYCCNT__A
, 0, 0);
4515 pr_err("error %d\n", rc
);
4518 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_WD__A
, 0, 0);
4520 pr_err("error %d\n", rc
);
4523 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_STP__A
, 1, 0);
4525 pr_err("error %d\n", rc
);
4528 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_SUM__A
, 0, 0);
4530 pr_err("error %d\n", rc
);
4533 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_CYCCNT__A
, 0, 0);
4535 pr_err("error %d\n", rc
);
4538 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_WD__A
, 0, 0);
4540 pr_err("error %d\n", rc
);
4543 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_STP__A
, 1, 0);
4545 pr_err("error %d\n", rc
);
4548 p_agc_if_settings
= &(ext_attr
->qam_if_agc_cfg
);
4549 p_agc_rf_settings
= &(ext_attr
->qam_rf_agc_cfg
);
4550 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN_TGT__A
, p_agc_if_settings
->top
, 0);
4552 pr_err("error %d\n", rc
);
4556 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_AGC_KI__A
, &agc_ki
, 0);
4558 pr_err("error %d\n", rc
);
4562 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI__A
, agc_ki
, 0);
4564 pr_err("error %d\n", rc
);
4573 /* for new AGC interface */
4574 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN_TGT_MIN__A
, p_agc_if_settings
->top
, 0);
4576 pr_err("error %d\n", rc
);
4579 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN__A
, p_agc_if_settings
->top
, 0);
4581 pr_err("error %d\n", rc
);
4583 } /* Gain fed from inner to outer AGC */
4584 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN_TGT_MAX__A
, ingain_tgt_max
, 0);
4586 pr_err("error %d\n", rc
);
4589 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A
, if_iaccu_hi_tgt_min
, 0);
4591 pr_err("error %d\n", rc
);
4594 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI__A
, 0, 0);
4596 pr_err("error %d\n", rc
);
4598 } /* set to p_agc_settings->top before */
4599 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_IF_IACCU_LO__A
, 0, 0);
4601 pr_err("error %d\n", rc
);
4604 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_RF_IACCU_HI__A
, 0, 0);
4606 pr_err("error %d\n", rc
);
4609 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_RF_IACCU_LO__A
, 0, 0);
4611 pr_err("error %d\n", rc
);
4614 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_RF_MAX__A
, 32767, 0);
4616 pr_err("error %d\n", rc
);
4619 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_SUM_MAX__A
, clp_sum_max
, 0);
4621 pr_err("error %d\n", rc
);
4624 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_SUM_MAX__A
, sns_sum_max
, 0);
4626 pr_err("error %d\n", rc
);
4629 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_INNERGAIN_MIN__A
, ki_innergain_min
, 0);
4631 pr_err("error %d\n", rc
);
4634 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A
, 50, 0);
4636 pr_err("error %d\n", rc
);
4639 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_CYCLEN__A
, 500, 0);
4641 pr_err("error %d\n", rc
);
4644 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_CYCLEN__A
, 500, 0);
4646 pr_err("error %d\n", rc
);
4649 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A
, 20, 0);
4651 pr_err("error %d\n", rc
);
4654 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MIN__A
, ki_min
, 0);
4656 pr_err("error %d\n", rc
);
4659 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MAX__A
, ki_max
, 0);
4661 pr_err("error %d\n", rc
);
4664 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_RED__A
, 0, 0);
4666 pr_err("error %d\n", rc
);
4669 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_SUM_MIN__A
, 8, 0);
4671 pr_err("error %d\n", rc
);
4674 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_CYCLEN__A
, 500, 0);
4676 pr_err("error %d\n", rc
);
4679 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_TO__A
, clp_dir_to
, 0);
4681 pr_err("error %d\n", rc
);
4684 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_SUM_MIN__A
, 8, 0);
4686 pr_err("error %d\n", rc
);
4689 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_TO__A
, sns_dir_to
, 0);
4691 pr_err("error %d\n", rc
);
4694 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A
, 50, 0);
4696 pr_err("error %d\n", rc
);
4699 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_CTRL_MODE__A
, clp_ctrl_mode
, 0);
4701 pr_err("error %d\n", rc
);
4705 agc_rf
= 0x800 + p_agc_rf_settings
->cut_off_current
;
4706 if (common_attr
->tuner_rf_agc_pol
== true)
4707 agc_rf
= 0x87ff - agc_rf
;
4710 if (common_attr
->tuner_if_agc_pol
== true)
4711 agc_rf
= 0x87ff - agc_rf
;
4713 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_AGC_RF__A
, agc_rf
, 0);
4715 pr_err("error %d\n", rc
);
4718 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_AGC_IF__A
, agc_if
, 0);
4720 pr_err("error %d\n", rc
);
4724 /* Set/restore Ki DGAIN factor */
4725 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
4727 pr_err("error %d\n", rc
);
4730 data
&= ~SCU_RAM_AGC_KI_DGAIN__M
;
4731 data
|= (agc_ki_dgain
<< SCU_RAM_AGC_KI_DGAIN__B
);
4732 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
4734 pr_err("error %d\n", rc
);
4744 * \fn int set_frequency ()
4745 * \brief Set frequency shift.
4746 * \param demod instance of demodulator.
4747 * \param channel pointer to channel data.
4748 * \param tuner_freq_offset residual frequency from tuner.
4752 set_frequency(struct drx_demod_instance
*demod
,
4753 struct drx_channel
*channel
, s32 tuner_freq_offset
)
4755 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
4756 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
4758 s32 sampling_frequency
= 0;
4759 s32 frequency_shift
= 0;
4760 s32 if_freq_actual
= 0;
4761 s32 rf_freq_residual
= -1 * tuner_freq_offset
;
4763 s32 intermediate_freq
= 0;
4764 u32 iqm_fs_rate_ofs
= 0;
4765 bool adc_flip
= true;
4766 bool select_pos_image
= false;
4769 bool image_to_select
= true;
4770 s32 fm_frequency_shift
= 0;
4772 rf_mirror
= (ext_attr
->mirror
== DRX_MIRROR_YES
) ? true : false;
4773 tuner_mirror
= demod
->my_common_attr
->mirror_freq_spect
? false : true;
4775 Program frequency shifter
4776 No need to account for mirroring on RF
4778 switch (ext_attr
->standard
) {
4779 case DRX_STANDARD_ITU_A
: /* fallthrough */
4780 case DRX_STANDARD_ITU_C
: /* fallthrough */
4781 case DRX_STANDARD_PAL_SECAM_LP
: /* fallthrough */
4782 case DRX_STANDARD_8VSB
:
4783 select_pos_image
= true;
4785 case DRX_STANDARD_FM
:
4786 /* After IQM FS sound carrier must appear at 4 Mhz in spect.
4787 Sound carrier is already 3Mhz above centre frequency due
4788 to tuner setting so now add an extra shift of 1MHz... */
4789 fm_frequency_shift
= 1000;
4790 case DRX_STANDARD_ITU_B
: /* fallthrough */
4791 case DRX_STANDARD_NTSC
: /* fallthrough */
4792 case DRX_STANDARD_PAL_SECAM_BG
: /* fallthrough */
4793 case DRX_STANDARD_PAL_SECAM_DK
: /* fallthrough */
4794 case DRX_STANDARD_PAL_SECAM_I
: /* fallthrough */
4795 case DRX_STANDARD_PAL_SECAM_L
:
4796 select_pos_image
= false;
4801 intermediate_freq
= demod
->my_common_attr
->intermediate_freq
;
4802 sampling_frequency
= demod
->my_common_attr
->sys_clock_freq
/ 3;
4804 if_freq_actual
= intermediate_freq
+ rf_freq_residual
+ fm_frequency_shift
;
4806 if_freq_actual
= intermediate_freq
- rf_freq_residual
- fm_frequency_shift
;
4807 if (if_freq_actual
> sampling_frequency
/ 2) {
4809 adc_freq
= sampling_frequency
- if_freq_actual
;
4812 /* adc doesn't mirror */
4813 adc_freq
= if_freq_actual
;
4817 frequency_shift
= adc_freq
;
4819 (bool) (rf_mirror
^ tuner_mirror
^ adc_flip
^ select_pos_image
);
4820 iqm_fs_rate_ofs
= frac28(frequency_shift
, sampling_frequency
);
4822 if (image_to_select
)
4823 iqm_fs_rate_ofs
= ~iqm_fs_rate_ofs
+ 1;
4825 /* Program frequency shifter with tuner offset compensation */
4826 /* frequency_shift += tuner_freq_offset; TODO */
4827 rc
= drxdap_fasi_write_reg32(dev_addr
, IQM_FS_RATE_OFS_LO__A
, iqm_fs_rate_ofs
, 0);
4829 pr_err("error %d\n", rc
);
4832 ext_attr
->iqm_fs_rate_ofs
= iqm_fs_rate_ofs
;
4833 ext_attr
->pos_image
= (bool) (rf_mirror
^ tuner_mirror
^ select_pos_image
);
4841 * \fn int get_acc_pkt_err()
4842 * \brief Retrieve signal strength for VSB and QAM.
4843 * \param demod Pointer to demod instance
4844 * \param packet_err Pointer to packet error
4846 * \retval 0 sig_strength contains valid data.
4847 * \retval -EINVAL sig_strength is NULL.
4848 * \retval -EIO Erroneous data, sig_strength contains invalid data.
4850 #ifdef DRXJ_SIGNAL_ACCUM_ERR
4851 static int get_acc_pkt_err(struct drx_demod_instance
*demod
, u16
*packet_err
)
4855 static u16 last_pkt_err
;
4857 struct drxj_data
*ext_attr
= NULL
;
4858 struct i2c_device_addr
*dev_addr
= NULL
;
4860 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
4861 dev_addr
= demod
->my_i2c_dev_addr
;
4863 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, &data
, 0);
4865 pr_err("error %d\n", rc
);
4868 if (ext_attr
->reset_pkt_err_acc
) {
4869 last_pkt_err
= data
;
4871 ext_attr
->reset_pkt_err_acc
= false;
4874 if (data
< last_pkt_err
) {
4875 pkt_err
+= 0xffff - last_pkt_err
;
4878 pkt_err
+= (data
- last_pkt_err
);
4880 *packet_err
= pkt_err
;
4881 last_pkt_err
= data
;
4890 /*============================================================================*/
4893 * \fn int set_agc_rf ()
4894 * \brief Configure RF AGC
4895 * \param demod instance of demodulator.
4896 * \param agc_settings AGC configuration structure
4900 set_agc_rf(struct drx_demod_instance
*demod
, struct drxj_cfg_agc
*agc_settings
, bool atomic
)
4902 struct i2c_device_addr
*dev_addr
= NULL
;
4903 struct drxj_data
*ext_attr
= NULL
;
4904 struct drxj_cfg_agc
*p_agc_settings
= NULL
;
4905 struct drx_common_attr
*common_attr
= NULL
;
4907 drx_write_reg16func_t scu_wr16
= NULL
;
4908 drx_read_reg16func_t scu_rr16
= NULL
;
4910 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
4911 dev_addr
= demod
->my_i2c_dev_addr
;
4912 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
4915 scu_rr16
= drxj_dap_scu_atomic_read_reg16
;
4916 scu_wr16
= drxj_dap_scu_atomic_write_reg16
;
4918 scu_rr16
= drxj_dap_read_reg16
;
4919 scu_wr16
= drxj_dap_write_reg16
;
4922 /* Configure AGC only if standard is currently active */
4923 if ((ext_attr
->standard
== agc_settings
->standard
) ||
4924 (DRXJ_ISQAMSTD(ext_attr
->standard
) &&
4925 DRXJ_ISQAMSTD(agc_settings
->standard
)) ||
4926 (DRXJ_ISATVSTD(ext_attr
->standard
) &&
4927 DRXJ_ISATVSTD(agc_settings
->standard
))) {
4930 switch (agc_settings
->ctrl_mode
) {
4931 case DRX_AGC_CTRL_AUTO
:
4933 /* Enable RF AGC DAC */
4934 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
4936 pr_err("error %d\n", rc
);
4939 data
|= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE
;
4940 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
4942 pr_err("error %d\n", rc
);
4946 /* Enable SCU RF AGC loop */
4947 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
4949 pr_err("error %d\n", rc
);
4952 data
&= ~SCU_RAM_AGC_KI_RF__M
;
4953 if (ext_attr
->standard
== DRX_STANDARD_8VSB
)
4954 data
|= (2 << SCU_RAM_AGC_KI_RF__B
);
4955 else if (DRXJ_ISQAMSTD(ext_attr
->standard
))
4956 data
|= (5 << SCU_RAM_AGC_KI_RF__B
);
4958 data
|= (4 << SCU_RAM_AGC_KI_RF__B
);
4960 if (common_attr
->tuner_rf_agc_pol
)
4961 data
|= SCU_RAM_AGC_KI_INV_RF_POL__M
;
4963 data
&= ~SCU_RAM_AGC_KI_INV_RF_POL__M
;
4964 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
4966 pr_err("error %d\n", rc
);
4970 /* Set speed ( using complementary reduction value ) */
4971 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI_RED__A
, &data
, 0);
4973 pr_err("error %d\n", rc
);
4976 data
&= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M
;
4977 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI_RED__A
, (~(agc_settings
->speed
<< SCU_RAM_AGC_KI_RED_RAGC_RED__B
) & SCU_RAM_AGC_KI_RED_RAGC_RED__M
) | data
, 0);
4979 pr_err("error %d\n", rc
);
4983 if (agc_settings
->standard
== DRX_STANDARD_8VSB
)
4984 p_agc_settings
= &(ext_attr
->vsb_if_agc_cfg
);
4985 else if (DRXJ_ISQAMSTD(agc_settings
->standard
))
4986 p_agc_settings
= &(ext_attr
->qam_if_agc_cfg
);
4987 else if (DRXJ_ISATVSTD(agc_settings
->standard
))
4988 p_agc_settings
= &(ext_attr
->atv_if_agc_cfg
);
4992 /* Set TOP, only if IF-AGC is in AUTO mode */
4993 if (p_agc_settings
->ctrl_mode
== DRX_AGC_CTRL_AUTO
) {
4994 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, agc_settings
->top
, 0);
4996 pr_err("error %d\n", rc
);
4999 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT__A
, agc_settings
->top
, 0);
5001 pr_err("error %d\n", rc
);
5006 /* Cut-Off current */
5007 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_RF_IACCU_HI_CO__A
, agc_settings
->cut_off_current
, 0);
5009 pr_err("error %d\n", rc
);
5013 case DRX_AGC_CTRL_USER
:
5015 /* Enable RF AGC DAC */
5016 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5018 pr_err("error %d\n", rc
);
5021 data
|= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE
;
5022 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5024 pr_err("error %d\n", rc
);
5028 /* Disable SCU RF AGC loop */
5029 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5031 pr_err("error %d\n", rc
);
5034 data
&= ~SCU_RAM_AGC_KI_RF__M
;
5035 if (common_attr
->tuner_rf_agc_pol
)
5036 data
|= SCU_RAM_AGC_KI_INV_RF_POL__M
;
5038 data
&= ~SCU_RAM_AGC_KI_INV_RF_POL__M
;
5039 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5041 pr_err("error %d\n", rc
);
5045 /* Write value to output pin */
5046 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_RF_IACCU_HI__A
, agc_settings
->output_level
, 0);
5048 pr_err("error %d\n", rc
);
5052 case DRX_AGC_CTRL_OFF
:
5054 /* Disable RF AGC DAC */
5055 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5057 pr_err("error %d\n", rc
);
5060 data
&= (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE
);
5061 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5063 pr_err("error %d\n", rc
);
5067 /* Disable SCU RF AGC loop */
5068 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5070 pr_err("error %d\n", rc
);
5073 data
&= ~SCU_RAM_AGC_KI_RF__M
;
5074 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5076 pr_err("error %d\n", rc
);
5082 } /* switch ( agcsettings->ctrl_mode ) */
5085 /* Store rf agc settings */
5086 switch (agc_settings
->standard
) {
5087 case DRX_STANDARD_8VSB
:
5088 ext_attr
->vsb_rf_agc_cfg
= *agc_settings
;
5090 #ifndef DRXJ_VSB_ONLY
5091 case DRX_STANDARD_ITU_A
:
5092 case DRX_STANDARD_ITU_B
:
5093 case DRX_STANDARD_ITU_C
:
5094 ext_attr
->qam_rf_agc_cfg
= *agc_settings
;
5107 * \fn int set_agc_if ()
5108 * \brief Configure If AGC
5109 * \param demod instance of demodulator.
5110 * \param agc_settings AGC configuration structure
5114 set_agc_if(struct drx_demod_instance
*demod
, struct drxj_cfg_agc
*agc_settings
, bool atomic
)
5116 struct i2c_device_addr
*dev_addr
= NULL
;
5117 struct drxj_data
*ext_attr
= NULL
;
5118 struct drxj_cfg_agc
*p_agc_settings
= NULL
;
5119 struct drx_common_attr
*common_attr
= NULL
;
5120 drx_write_reg16func_t scu_wr16
= NULL
;
5121 drx_read_reg16func_t scu_rr16
= NULL
;
5124 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
5125 dev_addr
= demod
->my_i2c_dev_addr
;
5126 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
5129 scu_rr16
= drxj_dap_scu_atomic_read_reg16
;
5130 scu_wr16
= drxj_dap_scu_atomic_write_reg16
;
5132 scu_rr16
= drxj_dap_read_reg16
;
5133 scu_wr16
= drxj_dap_write_reg16
;
5136 /* Configure AGC only if standard is currently active */
5137 if ((ext_attr
->standard
== agc_settings
->standard
) ||
5138 (DRXJ_ISQAMSTD(ext_attr
->standard
) &&
5139 DRXJ_ISQAMSTD(agc_settings
->standard
)) ||
5140 (DRXJ_ISATVSTD(ext_attr
->standard
) &&
5141 DRXJ_ISATVSTD(agc_settings
->standard
))) {
5144 switch (agc_settings
->ctrl_mode
) {
5145 case DRX_AGC_CTRL_AUTO
:
5146 /* Enable IF AGC DAC */
5147 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5149 pr_err("error %d\n", rc
);
5152 data
|= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE
;
5153 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5155 pr_err("error %d\n", rc
);
5159 /* Enable SCU IF AGC loop */
5160 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5162 pr_err("error %d\n", rc
);
5165 data
&= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5166 data
&= ~SCU_RAM_AGC_KI_IF__M
;
5167 if (ext_attr
->standard
== DRX_STANDARD_8VSB
)
5168 data
|= (3 << SCU_RAM_AGC_KI_IF__B
);
5169 else if (DRXJ_ISQAMSTD(ext_attr
->standard
))
5170 data
|= (6 << SCU_RAM_AGC_KI_IF__B
);
5172 data
|= (5 << SCU_RAM_AGC_KI_IF__B
);
5174 if (common_attr
->tuner_if_agc_pol
)
5175 data
|= SCU_RAM_AGC_KI_INV_IF_POL__M
;
5177 data
&= ~SCU_RAM_AGC_KI_INV_IF_POL__M
;
5178 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5180 pr_err("error %d\n", rc
);
5184 /* Set speed (using complementary reduction value) */
5185 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI_RED__A
, &data
, 0);
5187 pr_err("error %d\n", rc
);
5190 data
&= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M
;
5191 rc
= (*scu_wr16
) (dev_addr
, SCU_RAM_AGC_KI_RED__A
, (~(agc_settings
->speed
<< SCU_RAM_AGC_KI_RED_IAGC_RED__B
) & SCU_RAM_AGC_KI_RED_IAGC_RED__M
) | data
, 0);
5193 pr_err("error %d\n", rc
);
5197 if (agc_settings
->standard
== DRX_STANDARD_8VSB
)
5198 p_agc_settings
= &(ext_attr
->vsb_rf_agc_cfg
);
5199 else if (DRXJ_ISQAMSTD(agc_settings
->standard
))
5200 p_agc_settings
= &(ext_attr
->qam_rf_agc_cfg
);
5201 else if (DRXJ_ISATVSTD(agc_settings
->standard
))
5202 p_agc_settings
= &(ext_attr
->atv_rf_agc_cfg
);
5207 if (p_agc_settings
->ctrl_mode
== DRX_AGC_CTRL_AUTO
) {
5208 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, p_agc_settings
->top
, 0);
5210 pr_err("error %d\n", rc
);
5213 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT__A
, p_agc_settings
->top
, 0);
5215 pr_err("error %d\n", rc
);
5219 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, 0, 0);
5221 pr_err("error %d\n", rc
);
5224 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT__A
, 0, 0);
5226 pr_err("error %d\n", rc
);
5232 case DRX_AGC_CTRL_USER
:
5234 /* Enable IF AGC DAC */
5235 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5237 pr_err("error %d\n", rc
);
5240 data
|= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE
;
5241 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5243 pr_err("error %d\n", rc
);
5247 /* Disable SCU IF AGC loop */
5248 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5250 pr_err("error %d\n", rc
);
5253 data
&= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5254 data
|= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5255 if (common_attr
->tuner_if_agc_pol
)
5256 data
|= SCU_RAM_AGC_KI_INV_IF_POL__M
;
5258 data
&= ~SCU_RAM_AGC_KI_INV_IF_POL__M
;
5259 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5261 pr_err("error %d\n", rc
);
5265 /* Write value to output pin */
5266 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, agc_settings
->output_level
, 0);
5268 pr_err("error %d\n", rc
);
5273 case DRX_AGC_CTRL_OFF
:
5275 /* Disable If AGC DAC */
5276 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5278 pr_err("error %d\n", rc
);
5281 data
&= (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE
);
5282 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5284 pr_err("error %d\n", rc
);
5288 /* Disable SCU IF AGC loop */
5289 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5291 pr_err("error %d\n", rc
);
5294 data
&= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5295 data
|= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5296 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5298 pr_err("error %d\n", rc
);
5304 } /* switch ( agcsettings->ctrl_mode ) */
5306 /* always set the top to support configurations without if-loop */
5307 rc
= (*scu_wr16
) (dev_addr
, SCU_RAM_AGC_INGAIN_TGT_MIN__A
, agc_settings
->top
, 0);
5309 pr_err("error %d\n", rc
);
5314 /* Store if agc settings */
5315 switch (agc_settings
->standard
) {
5316 case DRX_STANDARD_8VSB
:
5317 ext_attr
->vsb_if_agc_cfg
= *agc_settings
;
5319 #ifndef DRXJ_VSB_ONLY
5320 case DRX_STANDARD_ITU_A
:
5321 case DRX_STANDARD_ITU_B
:
5322 case DRX_STANDARD_ITU_C
:
5323 ext_attr
->qam_if_agc_cfg
= *agc_settings
;
5336 * \fn int set_iqm_af ()
5337 * \brief Configure IQM AF registers
5338 * \param demod instance of demodulator.
5342 static int set_iqm_af(struct drx_demod_instance
*demod
, bool active
)
5345 struct i2c_device_addr
*dev_addr
= NULL
;
5348 dev_addr
= demod
->my_i2c_dev_addr
;
5351 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5353 pr_err("error %d\n", rc
);
5357 data
&= ((~IQM_AF_STDBY_STDBY_ADC_A2_ACTIVE
) & (~IQM_AF_STDBY_STDBY_AMP_A2_ACTIVE
) & (~IQM_AF_STDBY_STDBY_PD_A2_ACTIVE
) & (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE
) & (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE
));
5359 data
|= (IQM_AF_STDBY_STDBY_ADC_A2_ACTIVE
| IQM_AF_STDBY_STDBY_AMP_A2_ACTIVE
| IQM_AF_STDBY_STDBY_PD_A2_ACTIVE
| IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE
| IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE
);
5360 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5362 pr_err("error %d\n", rc
);
5371 /*============================================================================*/
5372 /*== END 8VSB & QAM COMMON DATAPATH FUNCTIONS ==*/
5373 /*============================================================================*/
5375 /*============================================================================*/
5376 /*============================================================================*/
5377 /*== 8VSB DATAPATH FUNCTIONS ==*/
5378 /*============================================================================*/
5379 /*============================================================================*/
5382 * \fn int power_down_vsb ()
5383 * \brief Powr down QAM related blocks.
5384 * \param demod instance of demodulator.
5385 * \param channel pointer to channel data.
5388 static int power_down_vsb(struct drx_demod_instance
*demod
, bool primary
)
5390 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
5391 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
5392 /* parameter_len */ 0,
5394 /* *parameter */ NULL
,
5397 struct drx_cfg_mpeg_output cfg_mpeg_output
;
5403 reset of FEC and VSB HW
5405 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
|
5406 SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
5407 cmd_scu
.parameter_len
= 0;
5408 cmd_scu
.result_len
= 1;
5409 cmd_scu
.parameter
= NULL
;
5410 cmd_scu
.result
= &cmd_result
;
5411 rc
= scu_command(dev_addr
, &cmd_scu
);
5413 pr_err("error %d\n", rc
);
5417 /* stop all comm_exec */
5418 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
, 0);
5420 pr_err("error %d\n", rc
);
5423 rc
= drxj_dap_write_reg16(dev_addr
, VSB_COMM_EXEC__A
, VSB_COMM_EXEC_STOP
, 0);
5425 pr_err("error %d\n", rc
);
5429 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_STOP
, 0);
5431 pr_err("error %d\n", rc
);
5434 rc
= set_iqm_af(demod
, false);
5436 pr_err("error %d\n", rc
);
5440 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
5442 pr_err("error %d\n", rc
);
5445 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
5447 pr_err("error %d\n", rc
);
5450 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
5452 pr_err("error %d\n", rc
);
5455 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
5457 pr_err("error %d\n", rc
);
5460 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
5462 pr_err("error %d\n", rc
);
5467 cfg_mpeg_output
.enable_mpeg_output
= false;
5468 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
5470 pr_err("error %d\n", rc
);
5480 * \fn int set_vsb_leak_n_gain ()
5481 * \brief Set ATSC demod.
5482 * \param demod instance of demodulator.
5485 static int set_vsb_leak_n_gain(struct drx_demod_instance
*demod
)
5487 struct i2c_device_addr
*dev_addr
= NULL
;
5490 const u8 vsb_ffe_leak_gain_ram0
[] = {
5491 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO1 */
5492 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO2 */
5493 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO3 */
5494 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO4 */
5495 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO5 */
5496 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO6 */
5497 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO7 */
5498 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO8 */
5499 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO9 */
5500 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO10 */
5501 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO11 */
5502 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO12 */
5503 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO1 */
5504 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO2 */
5505 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO3 */
5506 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO4 */
5507 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO5 */
5508 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO6 */
5509 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO7 */
5510 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO8 */
5511 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO9 */
5512 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO10 */
5513 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO11 */
5514 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO12 */
5515 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO1 */
5516 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO2 */
5517 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO3 */
5518 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO4 */
5519 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO5 */
5520 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO6 */
5521 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO7 */
5522 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO8 */
5523 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO9 */
5524 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO10 */
5525 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO11 */
5526 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO12 */
5527 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO1 */
5528 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO2 */
5529 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO3 */
5530 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO4 */
5531 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO5 */
5532 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO6 */
5533 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO7 */
5534 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO8 */
5535 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO9 */
5536 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO10 */
5537 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO11 */
5538 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO12 */
5539 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO1 */
5540 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO2 */
5541 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO3 */
5542 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO4 */
5543 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO5 */
5544 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO6 */
5545 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO7 */
5546 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO8 */
5547 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO9 */
5548 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO10 */
5549 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO11 */
5550 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO12 */
5551 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO1 */
5552 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO2 */
5553 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO3 */
5554 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO4 */
5555 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO5 */
5556 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO6 */
5557 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO7 */
5558 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO8 */
5559 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO9 */
5560 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO10 */
5561 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO11 */
5562 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO12 */
5563 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO1 */
5564 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO2 */
5565 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO3 */
5566 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO4 */
5567 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO5 */
5568 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO6 */
5569 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO7 */
5570 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO8 */
5571 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO9 */
5572 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO10 */
5573 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO11 */
5574 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO12 */
5575 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO1 */
5576 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO2 */
5577 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO3 */
5578 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO4 */
5579 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO5 */
5580 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO6 */
5581 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO7 */
5582 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO8 */
5583 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO9 */
5584 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO10 */
5585 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO11 */
5586 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO12 */
5587 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO1 */
5588 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO2 */
5589 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO3 */
5590 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO4 */
5591 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO5 */
5592 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO6 */
5593 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO7 */
5594 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO8 */
5595 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO9 */
5596 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO10 */
5597 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO11 */
5598 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO12 */
5599 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN1 */
5600 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN2 */
5601 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN3 */
5602 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN4 */
5603 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN5 */
5604 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN6 */
5605 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN7 */
5606 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN8 */
5607 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN9 */
5608 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN10 */
5609 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN11 */
5610 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN12 */
5611 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN1 */
5612 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN2 */
5613 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN3 */
5614 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN4 */
5615 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN5 */
5616 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN6 */
5617 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN7 */
5618 DRXJ_16TO8(0x1010) /* FIRRCA1GAIN8 */
5621 const u8 vsb_ffe_leak_gain_ram1
[] = {
5622 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN9 */
5623 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN10 */
5624 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN11 */
5625 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN12 */
5626 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN1 */
5627 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN2 */
5628 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN3 */
5629 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN4 */
5630 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN5 */
5631 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN6 */
5632 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN7 */
5633 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN8 */
5634 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN9 */
5635 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN10 */
5636 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN11 */
5637 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN12 */
5638 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN1 */
5639 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN2 */
5640 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN3 */
5641 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN4 */
5642 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN5 */
5643 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN6 */
5644 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN7 */
5645 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN8 */
5646 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN9 */
5647 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN10 */
5648 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN11 */
5649 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN12 */
5650 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN1 */
5651 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN2 */
5652 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN3 */
5653 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN4 */
5654 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN5 */
5655 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN6 */
5656 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN7 */
5657 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN8 */
5658 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN9 */
5659 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN10 */
5660 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN11 */
5661 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN12 */
5662 DRXJ_16TO8(0x001f), /* DFETRAINLKRATIO */
5663 DRXJ_16TO8(0x01ff), /* DFERCA1TRAINLKRATIO */
5664 DRXJ_16TO8(0x01ff), /* DFERCA1DATALKRATIO */
5665 DRXJ_16TO8(0x004f), /* DFERCA2TRAINLKRATIO */
5666 DRXJ_16TO8(0x004f), /* DFERCA2DATALKRATIO */
5667 DRXJ_16TO8(0x01ff), /* DFEDDM1TRAINLKRATIO */
5668 DRXJ_16TO8(0x01ff), /* DFEDDM1DATALKRATIO */
5669 DRXJ_16TO8(0x0352), /* DFEDDM2TRAINLKRATIO */
5670 DRXJ_16TO8(0x0352), /* DFEDDM2DATALKRATIO */
5671 DRXJ_16TO8(0x0000), /* DFETRAINGAIN */
5672 DRXJ_16TO8(0x2020), /* DFERCA1GAIN */
5673 DRXJ_16TO8(0x1010), /* DFERCA2GAIN */
5674 DRXJ_16TO8(0x1818), /* DFEDDM1GAIN */
5675 DRXJ_16TO8(0x1212) /* DFEDDM2GAIN */
5678 dev_addr
= demod
->my_i2c_dev_addr
;
5679 rc
= drxdap_fasi_write_block(dev_addr
, VSB_SYSCTRL_RAM0_FFETRAINLKRATIO1__A
, sizeof(vsb_ffe_leak_gain_ram0
), ((u8
*)vsb_ffe_leak_gain_ram0
), 0);
5681 pr_err("error %d\n", rc
);
5684 rc
= drxdap_fasi_write_block(dev_addr
, VSB_SYSCTRL_RAM1_FIRRCA1GAIN9__A
, sizeof(vsb_ffe_leak_gain_ram1
), ((u8
*)vsb_ffe_leak_gain_ram1
), 0);
5686 pr_err("error %d\n", rc
);
5697 * \brief Set 8VSB demod.
5698 * \param demod instance of demodulator.
5702 static int set_vsb(struct drx_demod_instance
*demod
)
5704 struct i2c_device_addr
*dev_addr
= NULL
;
5706 struct drx_common_attr
*common_attr
= NULL
;
5707 struct drxjscu_cmd cmd_scu
;
5708 struct drxj_data
*ext_attr
= NULL
;
5711 const u8 vsb_taps_re
[] = {
5712 DRXJ_16TO8(-2), /* re0 */
5713 DRXJ_16TO8(4), /* re1 */
5714 DRXJ_16TO8(1), /* re2 */
5715 DRXJ_16TO8(-4), /* re3 */
5716 DRXJ_16TO8(1), /* re4 */
5717 DRXJ_16TO8(4), /* re5 */
5718 DRXJ_16TO8(-3), /* re6 */
5719 DRXJ_16TO8(-3), /* re7 */
5720 DRXJ_16TO8(6), /* re8 */
5721 DRXJ_16TO8(1), /* re9 */
5722 DRXJ_16TO8(-9), /* re10 */
5723 DRXJ_16TO8(3), /* re11 */
5724 DRXJ_16TO8(12), /* re12 */
5725 DRXJ_16TO8(-9), /* re13 */
5726 DRXJ_16TO8(-15), /* re14 */
5727 DRXJ_16TO8(17), /* re15 */
5728 DRXJ_16TO8(19), /* re16 */
5729 DRXJ_16TO8(-29), /* re17 */
5730 DRXJ_16TO8(-22), /* re18 */
5731 DRXJ_16TO8(45), /* re19 */
5732 DRXJ_16TO8(25), /* re20 */
5733 DRXJ_16TO8(-70), /* re21 */
5734 DRXJ_16TO8(-28), /* re22 */
5735 DRXJ_16TO8(111), /* re23 */
5736 DRXJ_16TO8(30), /* re24 */
5737 DRXJ_16TO8(-201), /* re25 */
5738 DRXJ_16TO8(-31), /* re26 */
5739 DRXJ_16TO8(629) /* re27 */
5742 dev_addr
= demod
->my_i2c_dev_addr
;
5743 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
5744 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
5746 /* stop all comm_exec */
5747 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
, 0);
5749 pr_err("error %d\n", rc
);
5752 rc
= drxj_dap_write_reg16(dev_addr
, VSB_COMM_EXEC__A
, VSB_COMM_EXEC_STOP
, 0);
5754 pr_err("error %d\n", rc
);
5757 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
5759 pr_err("error %d\n", rc
);
5762 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
5764 pr_err("error %d\n", rc
);
5767 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
5769 pr_err("error %d\n", rc
);
5772 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
5774 pr_err("error %d\n", rc
);
5777 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
5779 pr_err("error %d\n", rc
);
5783 /* reset demodulator */
5784 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
5785 | SCU_RAM_COMMAND_CMD_DEMOD_RESET
;
5786 cmd_scu
.parameter_len
= 0;
5787 cmd_scu
.result_len
= 1;
5788 cmd_scu
.parameter
= NULL
;
5789 cmd_scu
.result
= &cmd_result
;
5790 rc
= scu_command(dev_addr
, &cmd_scu
);
5792 pr_err("error %d\n", rc
);
5796 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_DCF_BYPASS__A
, 1, 0);
5798 pr_err("error %d\n", rc
);
5801 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_ADJ_SEL__A
, IQM_FS_ADJ_SEL_B_VSB
, 0);
5803 pr_err("error %d\n", rc
);
5806 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_ADJ_SEL__A
, IQM_RC_ADJ_SEL_B_VSB
, 0);
5808 pr_err("error %d\n", rc
);
5811 ext_attr
->iqm_rc_rate_ofs
= 0x00AD0D79;
5812 rc
= drxdap_fasi_write_reg32(dev_addr
, IQM_RC_RATE_OFS_LO__A
, ext_attr
->iqm_rc_rate_ofs
, 0);
5814 pr_err("error %d\n", rc
);
5817 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CFAGC_GAINSHIFT__A
, 4, 0);
5819 pr_err("error %d\n", rc
);
5822 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CYGN1TRK__A
, 1, 0);
5824 pr_err("error %d\n", rc
);
5828 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_CROUT_ENA__A
, 1, 0);
5830 pr_err("error %d\n", rc
);
5833 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_STRETCH__A
, 28, 0);
5835 pr_err("error %d\n", rc
);
5838 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_ACTIVE__A
, 0, 0);
5840 pr_err("error %d\n", rc
);
5843 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SYMMETRIC__A
, 0, 0);
5845 pr_err("error %d\n", rc
);
5848 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_MIDTAP__A
, 3, 0);
5850 pr_err("error %d\n", rc
);
5853 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_OUT_ENA__A
, IQM_CF_OUT_ENA_VSB__M
, 0);
5855 pr_err("error %d\n", rc
);
5858 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SCALE__A
, 1393, 0);
5860 pr_err("error %d\n", rc
);
5863 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SCALE_SH__A
, 0, 0);
5865 pr_err("error %d\n", rc
);
5868 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_POW_MEAS_LEN__A
, 1, 0);
5870 pr_err("error %d\n", rc
);
5874 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(vsb_taps_re
), ((u8
*)vsb_taps_re
), 0);
5876 pr_err("error %d\n", rc
);
5879 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(vsb_taps_re
), ((u8
*)vsb_taps_re
), 0);
5881 pr_err("error %d\n", rc
);
5885 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_BNTHRESH__A
, 330, 0);
5887 pr_err("error %d\n", rc
);
5889 } /* set higher threshold */
5890 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CLPLASTNUM__A
, 90, 0);
5892 pr_err("error %d\n", rc
);
5894 } /* burst detection on */
5895 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SNRTH_RCA1__A
, 0x0042, 0);
5897 pr_err("error %d\n", rc
);
5899 } /* drop thresholds by 1 dB */
5900 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SNRTH_RCA2__A
, 0x0053, 0);
5902 pr_err("error %d\n", rc
);
5904 } /* drop thresholds by 2 dB */
5905 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_EQCTRL__A
, 0x1, 0);
5907 pr_err("error %d\n", rc
);
5910 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_GPIO__A
, 0, 0);
5912 pr_err("error %d\n", rc
);
5916 /* Initialize the FEC Subsystem */
5917 rc
= drxj_dap_write_reg16(dev_addr
, FEC_TOP_ANNEX__A
, FEC_TOP_ANNEX_D
, 0);
5919 pr_err("error %d\n", rc
);
5923 u16 fec_oc_snc_mode
= 0;
5924 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_SNC_MODE__A
, &fec_oc_snc_mode
, 0);
5926 pr_err("error %d\n", rc
);
5929 /* output data even when not locked */
5930 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_MODE__A
, fec_oc_snc_mode
| FEC_OC_SNC_MODE_UNLOCK_ENABLE__M
, 0);
5932 pr_err("error %d\n", rc
);
5938 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLP_LEN__A
, 0, 0);
5940 pr_err("error %d\n", rc
);
5943 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLP_TH__A
, 470, 0);
5945 pr_err("error %d\n", rc
);
5948 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_SNS_LEN__A
, 0, 0);
5950 pr_err("error %d\n", rc
);
5953 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SNRTH_PT__A
, 0xD4, 0);
5955 pr_err("error %d\n", rc
);
5958 /* no transparent, no A&C framing; parity is set in mpegoutput */
5960 u16 fec_oc_reg_mode
= 0;
5961 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_MODE__A
, &fec_oc_reg_mode
, 0);
5963 pr_err("error %d\n", rc
);
5966 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_MODE__A
, fec_oc_reg_mode
& (~(FEC_OC_MODE_TRANSPARENT__M
| FEC_OC_MODE_CLEAR__M
| FEC_OC_MODE_RETAIN_FRAMING__M
)), 0);
5968 pr_err("error %d\n", rc
);
5973 rc
= drxj_dap_write_reg16(dev_addr
, FEC_DI_TIMEOUT_LO__A
, 0, 0);
5975 pr_err("error %d\n", rc
);
5977 } /* timeout counter for restarting */
5978 rc
= drxj_dap_write_reg16(dev_addr
, FEC_DI_TIMEOUT_HI__A
, 3, 0);
5980 pr_err("error %d\n", rc
);
5983 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MODE__A
, 0, 0);
5985 pr_err("error %d\n", rc
);
5987 } /* bypass disabled */
5988 /* initialize RS packet error measurement parameters */
5989 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MEASUREMENT_PERIOD__A
, FEC_RS_MEASUREMENT_PERIOD
, 0);
5991 pr_err("error %d\n", rc
);
5994 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MEASUREMENT_PRESCALE__A
, FEC_RS_MEASUREMENT_PRESCALE
, 0);
5996 pr_err("error %d\n", rc
);
6000 /* init measurement period of MER/SER */
6001 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_MEASUREMENT_PERIOD__A
, VSB_TOP_MEASUREMENT_PERIOD
, 0);
6003 pr_err("error %d\n", rc
);
6006 rc
= drxdap_fasi_write_reg32(dev_addr
, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A
, 0, 0);
6008 pr_err("error %d\n", rc
);
6011 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_FEC_MEAS_COUNT__A
, 0, 0);
6013 pr_err("error %d\n", rc
);
6016 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, 0, 0);
6018 pr_err("error %d\n", rc
);
6022 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CKGN1TRK__A
, 128, 0);
6024 pr_err("error %d\n", rc
);
6027 /* B-Input to ADC, PGA+filter in standby */
6028 if (!ext_attr
->has_lna
) {
6029 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_AMUX__A
, 0x02, 0);
6031 pr_err("error %d\n", rc
);
6036 /* turn on IQMAF. It has to be in front of setAgc**() */
6037 rc
= set_iqm_af(demod
, true);
6039 pr_err("error %d\n", rc
);
6042 rc
= adc_synchronization(demod
);
6044 pr_err("error %d\n", rc
);
6048 rc
= init_agc(demod
);
6050 pr_err("error %d\n", rc
);
6053 rc
= set_agc_if(demod
, &(ext_attr
->vsb_if_agc_cfg
), false);
6055 pr_err("error %d\n", rc
);
6058 rc
= set_agc_rf(demod
, &(ext_attr
->vsb_rf_agc_cfg
), false);
6060 pr_err("error %d\n", rc
);
6064 /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
6066 struct drxj_cfg_afe_gain vsb_pga_cfg
= { DRX_STANDARD_8VSB
, 0 };
6068 vsb_pga_cfg
.gain
= ext_attr
->vsb_pga_cfg
;
6069 rc
= ctrl_set_cfg_afe_gain(demod
, &vsb_pga_cfg
);
6071 pr_err("error %d\n", rc
);
6075 rc
= ctrl_set_cfg_pre_saw(demod
, &(ext_attr
->vsb_pre_saw_cfg
));
6077 pr_err("error %d\n", rc
);
6081 /* Mpeg output has to be in front of FEC active */
6082 rc
= set_mpegtei_handling(demod
);
6084 pr_err("error %d\n", rc
);
6087 rc
= bit_reverse_mpeg_output(demod
);
6089 pr_err("error %d\n", rc
);
6092 rc
= set_mpeg_start_width(demod
);
6094 pr_err("error %d\n", rc
);
6098 /* TODO: move to set_standard after hardware reset value problem is solved */
6099 /* Configure initial MPEG output */
6100 struct drx_cfg_mpeg_output cfg_mpeg_output
;
6102 memcpy(&cfg_mpeg_output
, &common_attr
->mpeg_cfg
, sizeof(cfg_mpeg_output
));
6103 cfg_mpeg_output
.enable_mpeg_output
= true;
6105 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
6107 pr_err("error %d\n", rc
);
6112 /* TBD: what parameters should be set */
6113 cmd_param
= 0x00; /* Default mode AGC on, etc */
6114 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
6115 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM
;
6116 cmd_scu
.parameter_len
= 1;
6117 cmd_scu
.result_len
= 1;
6118 cmd_scu
.parameter
= &cmd_param
;
6119 cmd_scu
.result
= &cmd_result
;
6120 rc
= scu_command(dev_addr
, &cmd_scu
);
6122 pr_err("error %d\n", rc
);
6126 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_BEAGC_GAINSHIFT__A
, 0x0004, 0);
6128 pr_err("error %d\n", rc
);
6131 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SNRTH_PT__A
, 0x00D2, 0);
6133 pr_err("error %d\n", rc
);
6136 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SYSSMTRNCTRL__A
, VSB_TOP_SYSSMTRNCTRL__PRE
| VSB_TOP_SYSSMTRNCTRL_NCOTIMEOUTCNTEN__M
, 0);
6138 pr_err("error %d\n", rc
);
6141 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_BEDETCTRL__A
, 0x142, 0);
6143 pr_err("error %d\n", rc
);
6146 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_LBAGCREFLVL__A
, 640, 0);
6148 pr_err("error %d\n", rc
);
6151 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CYGN1ACQ__A
, 4, 0);
6153 pr_err("error %d\n", rc
);
6156 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CYGN1TRK__A
, 2, 0);
6158 pr_err("error %d\n", rc
);
6161 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CYGN2TRK__A
, 3, 0);
6163 pr_err("error %d\n", rc
);
6167 /* start demodulator */
6168 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
6169 | SCU_RAM_COMMAND_CMD_DEMOD_START
;
6170 cmd_scu
.parameter_len
= 0;
6171 cmd_scu
.result_len
= 1;
6172 cmd_scu
.parameter
= NULL
;
6173 cmd_scu
.result
= &cmd_result
;
6174 rc
= scu_command(dev_addr
, &cmd_scu
);
6176 pr_err("error %d\n", rc
);
6180 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_ACTIVE
, 0);
6182 pr_err("error %d\n", rc
);
6185 rc
= drxj_dap_write_reg16(dev_addr
, VSB_COMM_EXEC__A
, VSB_COMM_EXEC_ACTIVE
, 0);
6187 pr_err("error %d\n", rc
);
6190 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_ACTIVE
, 0);
6192 pr_err("error %d\n", rc
);
6202 * \fn static short get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *PckErrs)
6203 * \brief Get the values of packet error in 8VSB mode
6204 * \return Error code
6206 static int get_vsb_post_rs_pck_err(struct i2c_device_addr
*dev_addr
,
6207 u32
*pck_errs
, u32
*pck_count
)
6213 u16 packet_errors_mant
= 0;
6214 u16 packet_errors_exp
= 0;
6216 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_FAILURES__A
, &data
, 0);
6218 pr_err("error %d\n", rc
);
6221 packet_errors_mant
= data
& FEC_RS_NR_FAILURES_FIXED_MANT__M
;
6222 packet_errors_exp
= (data
& FEC_RS_NR_FAILURES_EXP__M
)
6223 >> FEC_RS_NR_FAILURES_EXP__B
;
6224 period
= FEC_RS_MEASUREMENT_PERIOD
;
6225 prescale
= FEC_RS_MEASUREMENT_PRESCALE
;
6226 /* packet error rate = (error packet number) per second */
6227 /* 77.3 us is time for per packet */
6228 if (period
* prescale
== 0) {
6229 pr_err("error: period and/or prescale is zero!\n");
6232 *pck_errs
= packet_errors_mant
* (1 << packet_errors_exp
);
6233 *pck_count
= period
* prescale
* 77;
6241 * \fn static short GetVSBBer(struct i2c_device_addr *dev_addr, u32 *ber)
6242 * \brief Get the values of ber in VSB mode
6243 * \return Error code
6245 static int get_vs_bpost_viterbi_ber(struct i2c_device_addr
*dev_addr
,
6252 u16 bit_errors_mant
= 0;
6253 u16 bit_errors_exp
= 0;
6255 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_BIT_ERRORS__A
, &data
, 0);
6257 pr_err("error %d\n", rc
);
6260 period
= FEC_RS_MEASUREMENT_PERIOD
;
6261 prescale
= FEC_RS_MEASUREMENT_PRESCALE
;
6263 bit_errors_mant
= data
& FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M
;
6264 bit_errors_exp
= (data
& FEC_RS_NR_BIT_ERRORS_EXP__M
)
6265 >> FEC_RS_NR_BIT_ERRORS_EXP__B
;
6267 *cnt
= period
* prescale
* 207 * ((bit_errors_exp
> 2) ? 1 : 8);
6269 if (((bit_errors_mant
<< bit_errors_exp
) >> 3) > 68700)
6270 *ber
= (*cnt
) * 26570;
6272 if (period
* prescale
== 0) {
6273 pr_err("error: period and/or prescale is zero!\n");
6276 *ber
= bit_errors_mant
<< ((bit_errors_exp
> 2) ?
6277 (bit_errors_exp
- 3) : bit_errors_exp
);
6286 * \fn static short get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
6287 * \brief Get the values of ber in VSB mode
6288 * \return Error code
6290 static int get_vs_bpre_viterbi_ber(struct i2c_device_addr
*dev_addr
,
6296 rc
= drxj_dap_read_reg16(dev_addr
, VSB_TOP_NR_SYM_ERRS__A
, &data
, 0);
6298 pr_err("error %d\n", rc
);
6302 *cnt
= VSB_TOP_MEASUREMENT_PERIOD
* SYMBOLS_PER_SEGMENT
;
6308 * \fn static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6309 * \brief Get the values of MER
6310 * \return Error code
6312 static int get_vsbmer(struct i2c_device_addr
*dev_addr
, u16
*mer
)
6317 rc
= drxj_dap_read_reg16(dev_addr
, VSB_TOP_ERR_ENERGY_H__A
, &data_hi
, 0);
6319 pr_err("error %d\n", rc
);
6323 (u16
) (log1_times100(21504) - log1_times100((data_hi
<< 6) / 52));
6331 /*============================================================================*/
6332 /*== END 8VSB DATAPATH FUNCTIONS ==*/
6333 /*============================================================================*/
6335 /*============================================================================*/
6336 /*============================================================================*/
6337 /*== QAM DATAPATH FUNCTIONS ==*/
6338 /*============================================================================*/
6339 /*============================================================================*/
6342 * \fn int power_down_qam ()
6343 * \brief Powr down QAM related blocks.
6344 * \param demod instance of demodulator.
6345 * \param channel pointer to channel data.
6348 static int power_down_qam(struct drx_demod_instance
*demod
, bool primary
)
6350 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
6351 /* parameter_len */ 0,
6353 /* *parameter */ NULL
,
6357 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
6358 struct drx_cfg_mpeg_output cfg_mpeg_output
;
6359 struct drx_common_attr
*common_attr
= demod
->my_common_attr
;
6364 resets IQM, QAM and FEC HW blocks
6366 /* stop all comm_exec */
6367 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
, 0);
6369 pr_err("error %d\n", rc
);
6372 rc
= drxj_dap_write_reg16(dev_addr
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_STOP
, 0);
6374 pr_err("error %d\n", rc
);
6378 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
6379 SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
6380 cmd_scu
.parameter_len
= 0;
6381 cmd_scu
.result_len
= 1;
6382 cmd_scu
.parameter
= NULL
;
6383 cmd_scu
.result
= &cmd_result
;
6384 rc
= scu_command(dev_addr
, &cmd_scu
);
6386 pr_err("error %d\n", rc
);
6391 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_STOP
, 0);
6393 pr_err("error %d\n", rc
);
6396 rc
= set_iqm_af(demod
, false);
6398 pr_err("error %d\n", rc
);
6402 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
6404 pr_err("error %d\n", rc
);
6407 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
6409 pr_err("error %d\n", rc
);
6412 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
6414 pr_err("error %d\n", rc
);
6417 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
6419 pr_err("error %d\n", rc
);
6422 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
6424 pr_err("error %d\n", rc
);
6429 memcpy(&cfg_mpeg_output
, &common_attr
->mpeg_cfg
, sizeof(cfg_mpeg_output
));
6430 cfg_mpeg_output
.enable_mpeg_output
= false;
6432 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
6434 pr_err("error %d\n", rc
);
6443 /*============================================================================*/
6446 * \fn int set_qam_measurement ()
6447 * \brief Setup of the QAM Measuremnt intervals for signal quality
6448 * \param demod instance of demod.
6449 * \param constellation current constellation.
6453 * Take into account that for certain settings the errorcounters can overflow.
6454 * The implementation does not check this.
6456 * TODO: overriding the ext_attr->fec_bits_desired by constellation dependent
6457 * constants to get a measurement period of approx. 1 sec. Remove fec_bits_desired
6461 #ifndef DRXJ_VSB_ONLY
6463 set_qam_measurement(struct drx_demod_instance
*demod
,
6464 enum drx_modulation constellation
, u32 symbol_rate
)
6466 struct i2c_device_addr
*dev_addr
= NULL
; /* device address for I2C writes */
6467 struct drxj_data
*ext_attr
= NULL
; /* Global data container for DRXJ specific data */
6469 u32 fec_bits_desired
= 0; /* BER accounting period */
6470 u16 fec_rs_plen
= 0; /* defines RS BER measurement period */
6471 u16 fec_rs_prescale
= 0; /* ReedSolomon Measurement Prescale */
6472 u32 fec_rs_period
= 0; /* Value for corresponding I2C register */
6473 u32 fec_rs_bit_cnt
= 0; /* Actual precise amount of bits */
6474 u32 fec_oc_snc_fail_period
= 0; /* Value for corresponding I2C register */
6475 u32 qam_vd_period
= 0; /* Value for corresponding I2C register */
6476 u32 qam_vd_bit_cnt
= 0; /* Actual precise amount of bits */
6477 u16 fec_vd_plen
= 0; /* no of trellis symbols: VD SER measur period */
6478 u16 qam_vd_prescale
= 0; /* Viterbi Measurement Prescale */
6480 dev_addr
= demod
->my_i2c_dev_addr
;
6481 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
6483 fec_bits_desired
= ext_attr
->fec_bits_desired
;
6484 fec_rs_prescale
= ext_attr
->fec_rs_prescale
;
6486 switch (constellation
) {
6487 case DRX_CONSTELLATION_QAM16
:
6488 fec_bits_desired
= 4 * symbol_rate
;
6490 case DRX_CONSTELLATION_QAM32
:
6491 fec_bits_desired
= 5 * symbol_rate
;
6493 case DRX_CONSTELLATION_QAM64
:
6494 fec_bits_desired
= 6 * symbol_rate
;
6496 case DRX_CONSTELLATION_QAM128
:
6497 fec_bits_desired
= 7 * symbol_rate
;
6499 case DRX_CONSTELLATION_QAM256
:
6500 fec_bits_desired
= 8 * symbol_rate
;
6506 /* Parameters for Reed-Solomon Decoder */
6507 /* fecrs_period = (int)ceil(FEC_BITS_DESIRED/(fecrs_prescale*plen)) */
6508 /* rs_bit_cnt = fecrs_period*fecrs_prescale*plen */
6509 /* result is within 32 bit arithmetic -> */
6510 /* no need for mult or frac functions */
6512 /* TODO: use constant instead of calculation and remove the fec_rs_plen in ext_attr */
6513 switch (ext_attr
->standard
) {
6514 case DRX_STANDARD_ITU_A
:
6515 case DRX_STANDARD_ITU_C
:
6516 fec_rs_plen
= 204 * 8;
6518 case DRX_STANDARD_ITU_B
:
6519 fec_rs_plen
= 128 * 7;
6525 ext_attr
->fec_rs_plen
= fec_rs_plen
; /* for getSigQual */
6526 fec_rs_bit_cnt
= fec_rs_prescale
* fec_rs_plen
; /* temp storage */
6527 if (fec_rs_bit_cnt
== 0) {
6528 pr_err("error: fec_rs_bit_cnt is zero!\n");
6531 fec_rs_period
= fec_bits_desired
/ fec_rs_bit_cnt
+ 1; /* ceil */
6532 if (ext_attr
->standard
!= DRX_STANDARD_ITU_B
)
6533 fec_oc_snc_fail_period
= fec_rs_period
;
6535 /* limit to max 16 bit value (I2C register width) if needed */
6536 if (fec_rs_period
> 0xFFFF)
6537 fec_rs_period
= 0xFFFF;
6539 /* write corresponding registers */
6540 switch (ext_attr
->standard
) {
6541 case DRX_STANDARD_ITU_A
:
6542 case DRX_STANDARD_ITU_C
:
6544 case DRX_STANDARD_ITU_B
:
6545 switch (constellation
) {
6546 case DRX_CONSTELLATION_QAM64
:
6547 fec_rs_period
= 31581;
6548 fec_oc_snc_fail_period
= 17932;
6550 case DRX_CONSTELLATION_QAM256
:
6551 fec_rs_period
= 45446;
6552 fec_oc_snc_fail_period
= 25805;
6562 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_FAIL_PERIOD__A
, (u16
)fec_oc_snc_fail_period
, 0);
6564 pr_err("error %d\n", rc
);
6567 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MEASUREMENT_PERIOD__A
, (u16
)fec_rs_period
, 0);
6569 pr_err("error %d\n", rc
);
6572 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MEASUREMENT_PRESCALE__A
, fec_rs_prescale
, 0);
6574 pr_err("error %d\n", rc
);
6577 ext_attr
->fec_rs_period
= (u16
) fec_rs_period
;
6578 ext_attr
->fec_rs_prescale
= fec_rs_prescale
;
6579 rc
= drxdap_fasi_write_reg32(dev_addr
, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A
, 0, 0);
6581 pr_err("error %d\n", rc
);
6584 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_FEC_MEAS_COUNT__A
, 0, 0);
6586 pr_err("error %d\n", rc
);
6589 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, 0, 0);
6591 pr_err("error %d\n", rc
);
6595 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
6596 /* Parameters for Viterbi Decoder */
6597 /* qamvd_period = (int)ceil(FEC_BITS_DESIRED/ */
6598 /* (qamvd_prescale*plen*(qam_constellation+1))) */
6599 /* vd_bit_cnt = qamvd_period*qamvd_prescale*plen */
6600 /* result is within 32 bit arithmetic -> */
6601 /* no need for mult or frac functions */
6603 /* a(8 bit) * b(8 bit) = 16 bit result => mult32 not needed */
6604 fec_vd_plen
= ext_attr
->fec_vd_plen
;
6605 qam_vd_prescale
= ext_attr
->qam_vd_prescale
;
6606 qam_vd_bit_cnt
= qam_vd_prescale
* fec_vd_plen
; /* temp storage */
6608 switch (constellation
) {
6609 case DRX_CONSTELLATION_QAM64
:
6610 /* a(16 bit) * b(4 bit) = 20 bit result => mult32 not needed */
6612 qam_vd_bit_cnt
* (QAM_TOP_CONSTELLATION_QAM64
+ 1)
6613 * (QAM_TOP_CONSTELLATION_QAM64
+ 1);
6615 case DRX_CONSTELLATION_QAM256
:
6616 /* a(16 bit) * b(5 bit) = 21 bit result => mult32 not needed */
6618 qam_vd_bit_cnt
* (QAM_TOP_CONSTELLATION_QAM256
+ 1)
6619 * (QAM_TOP_CONSTELLATION_QAM256
+ 1);
6624 if (qam_vd_period
== 0) {
6625 pr_err("error: qam_vd_period is zero!\n");
6628 qam_vd_period
= fec_bits_desired
/ qam_vd_period
;
6629 /* limit to max 16 bit value (I2C register width) if needed */
6630 if (qam_vd_period
> 0xFFFF)
6631 qam_vd_period
= 0xFFFF;
6633 /* a(16 bit) * b(16 bit) = 32 bit result => mult32 not needed */
6634 qam_vd_bit_cnt
*= qam_vd_period
;
6636 rc
= drxj_dap_write_reg16(dev_addr
, QAM_VD_MEASUREMENT_PERIOD__A
, (u16
)qam_vd_period
, 0);
6638 pr_err("error %d\n", rc
);
6641 rc
= drxj_dap_write_reg16(dev_addr
, QAM_VD_MEASUREMENT_PRESCALE__A
, qam_vd_prescale
, 0);
6643 pr_err("error %d\n", rc
);
6646 ext_attr
->qam_vd_period
= (u16
) qam_vd_period
;
6647 ext_attr
->qam_vd_prescale
= qam_vd_prescale
;
6655 /*============================================================================*/
6658 * \fn int set_qam16 ()
6659 * \brief QAM16 specific setup
6660 * \param demod instance of demod.
6663 static int set_qam16(struct drx_demod_instance
*demod
)
6665 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
6667 const u8 qam_dq_qual_fun
[] = {
6668 DRXJ_16TO8(2), /* fun0 */
6669 DRXJ_16TO8(2), /* fun1 */
6670 DRXJ_16TO8(2), /* fun2 */
6671 DRXJ_16TO8(2), /* fun3 */
6672 DRXJ_16TO8(3), /* fun4 */
6673 DRXJ_16TO8(3), /* fun5 */
6675 const u8 qam_eq_cma_rad
[] = {
6676 DRXJ_16TO8(13517), /* RAD0 */
6677 DRXJ_16TO8(13517), /* RAD1 */
6678 DRXJ_16TO8(13517), /* RAD2 */
6679 DRXJ_16TO8(13517), /* RAD3 */
6680 DRXJ_16TO8(13517), /* RAD4 */
6681 DRXJ_16TO8(13517), /* RAD5 */
6684 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
6686 pr_err("error %d\n", rc
);
6689 rc
= drxdap_fasi_write_block(dev_addr
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, sizeof(qam_eq_cma_rad
), ((u8
*)qam_eq_cma_rad
), 0);
6691 pr_err("error %d\n", rc
);
6695 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 140, 0);
6697 pr_err("error %d\n", rc
);
6700 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 50, 0);
6702 pr_err("error %d\n", rc
);
6705 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 120, 0);
6707 pr_err("error %d\n", rc
);
6710 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 230, 0);
6712 pr_err("error %d\n", rc
);
6715 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 95, 0);
6717 pr_err("error %d\n", rc
);
6720 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 105, 0);
6722 pr_err("error %d\n", rc
);
6726 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
6728 pr_err("error %d\n", rc
);
6731 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 56, 0);
6733 pr_err("error %d\n", rc
);
6736 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
6738 pr_err("error %d\n", rc
);
6742 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 16, 0);
6744 pr_err("error %d\n", rc
);
6747 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 220, 0);
6749 pr_err("error %d\n", rc
);
6752 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, 25, 0);
6754 pr_err("error %d\n", rc
);
6757 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, 6, 0);
6759 pr_err("error %d\n", rc
);
6762 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
)(-24), 0);
6764 pr_err("error %d\n", rc
);
6767 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
)(-65), 0);
6769 pr_err("error %d\n", rc
);
6772 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-127), 0);
6774 pr_err("error %d\n", rc
);
6778 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
6780 pr_err("error %d\n", rc
);
6783 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
6785 pr_err("error %d\n", rc
);
6788 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
6790 pr_err("error %d\n", rc
);
6793 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 20, 0);
6795 pr_err("error %d\n", rc
);
6798 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
6800 pr_err("error %d\n", rc
);
6803 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
6805 pr_err("error %d\n", rc
);
6808 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 10, 0);
6810 pr_err("error %d\n", rc
);
6813 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50, 0);
6815 pr_err("error %d\n", rc
);
6818 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
6820 pr_err("error %d\n", rc
);
6823 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
6825 pr_err("error %d\n", rc
);
6828 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
6830 pr_err("error %d\n", rc
);
6833 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
6835 pr_err("error %d\n", rc
);
6838 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
6840 pr_err("error %d\n", rc
);
6843 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
6845 pr_err("error %d\n", rc
);
6848 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
6850 pr_err("error %d\n", rc
);
6853 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 32, 0);
6855 pr_err("error %d\n", rc
);
6858 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 240, 0);
6860 pr_err("error %d\n", rc
);
6863 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
6865 pr_err("error %d\n", rc
);
6868 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
6870 pr_err("error %d\n", rc
);
6873 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 32, 0);
6875 pr_err("error %d\n", rc
);
6879 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 40960, 0);
6881 pr_err("error %d\n", rc
);
6890 /*============================================================================*/
6893 * \fn int set_qam32 ()
6894 * \brief QAM32 specific setup
6895 * \param demod instance of demod.
6898 static int set_qam32(struct drx_demod_instance
*demod
)
6900 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
6902 const u8 qam_dq_qual_fun
[] = {
6903 DRXJ_16TO8(3), /* fun0 */
6904 DRXJ_16TO8(3), /* fun1 */
6905 DRXJ_16TO8(3), /* fun2 */
6906 DRXJ_16TO8(3), /* fun3 */
6907 DRXJ_16TO8(4), /* fun4 */
6908 DRXJ_16TO8(4), /* fun5 */
6910 const u8 qam_eq_cma_rad
[] = {
6911 DRXJ_16TO8(6707), /* RAD0 */
6912 DRXJ_16TO8(6707), /* RAD1 */
6913 DRXJ_16TO8(6707), /* RAD2 */
6914 DRXJ_16TO8(6707), /* RAD3 */
6915 DRXJ_16TO8(6707), /* RAD4 */
6916 DRXJ_16TO8(6707), /* RAD5 */
6919 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
6921 pr_err("error %d\n", rc
);
6924 rc
= drxdap_fasi_write_block(dev_addr
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, sizeof(qam_eq_cma_rad
), ((u8
*)qam_eq_cma_rad
), 0);
6926 pr_err("error %d\n", rc
);
6930 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 90, 0);
6932 pr_err("error %d\n", rc
);
6935 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 50, 0);
6937 pr_err("error %d\n", rc
);
6940 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 100, 0);
6942 pr_err("error %d\n", rc
);
6945 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 170, 0);
6947 pr_err("error %d\n", rc
);
6950 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 80, 0);
6952 pr_err("error %d\n", rc
);
6955 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 100, 0);
6957 pr_err("error %d\n", rc
);
6961 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
6963 pr_err("error %d\n", rc
);
6966 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 56, 0);
6968 pr_err("error %d\n", rc
);
6971 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
6973 pr_err("error %d\n", rc
);
6977 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 12, 0);
6979 pr_err("error %d\n", rc
);
6982 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 140, 0);
6984 pr_err("error %d\n", rc
);
6987 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
)(-8), 0);
6989 pr_err("error %d\n", rc
);
6992 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
)(-16), 0);
6994 pr_err("error %d\n", rc
);
6997 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
)(-26), 0);
6999 pr_err("error %d\n", rc
);
7002 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
)(-56), 0);
7004 pr_err("error %d\n", rc
);
7007 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-86), 0);
7009 pr_err("error %d\n", rc
);
7013 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
7015 pr_err("error %d\n", rc
);
7018 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
7020 pr_err("error %d\n", rc
);
7023 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
7025 pr_err("error %d\n", rc
);
7028 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 20, 0);
7030 pr_err("error %d\n", rc
);
7033 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
7035 pr_err("error %d\n", rc
);
7038 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
7040 pr_err("error %d\n", rc
);
7043 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 10, 0);
7045 pr_err("error %d\n", rc
);
7048 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50, 0);
7050 pr_err("error %d\n", rc
);
7053 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
7055 pr_err("error %d\n", rc
);
7058 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
7060 pr_err("error %d\n", rc
);
7063 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
7065 pr_err("error %d\n", rc
);
7068 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
7070 pr_err("error %d\n", rc
);
7073 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
7075 pr_err("error %d\n", rc
);
7078 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
7080 pr_err("error %d\n", rc
);
7083 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
7085 pr_err("error %d\n", rc
);
7088 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 32, 0);
7090 pr_err("error %d\n", rc
);
7093 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 176, 0);
7095 pr_err("error %d\n", rc
);
7098 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
7100 pr_err("error %d\n", rc
);
7103 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
7105 pr_err("error %d\n", rc
);
7108 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 8, 0);
7110 pr_err("error %d\n", rc
);
7114 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 20480, 0);
7116 pr_err("error %d\n", rc
);
7125 /*============================================================================*/
7128 * \fn int set_qam64 ()
7129 * \brief QAM64 specific setup
7130 * \param demod instance of demod.
7133 static int set_qam64(struct drx_demod_instance
*demod
)
7135 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
7137 const u8 qam_dq_qual_fun
[] = { /* this is hw reset value. no necessary to re-write */
7138 DRXJ_16TO8(4), /* fun0 */
7139 DRXJ_16TO8(4), /* fun1 */
7140 DRXJ_16TO8(4), /* fun2 */
7141 DRXJ_16TO8(4), /* fun3 */
7142 DRXJ_16TO8(6), /* fun4 */
7143 DRXJ_16TO8(6), /* fun5 */
7145 const u8 qam_eq_cma_rad
[] = {
7146 DRXJ_16TO8(13336), /* RAD0 */
7147 DRXJ_16TO8(12618), /* RAD1 */
7148 DRXJ_16TO8(11988), /* RAD2 */
7149 DRXJ_16TO8(13809), /* RAD3 */
7150 DRXJ_16TO8(13809), /* RAD4 */
7151 DRXJ_16TO8(15609), /* RAD5 */
7154 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
7156 pr_err("error %d\n", rc
);
7159 rc
= drxdap_fasi_write_block(dev_addr
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, sizeof(qam_eq_cma_rad
), ((u8
*)qam_eq_cma_rad
), 0);
7161 pr_err("error %d\n", rc
);
7165 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 105, 0);
7167 pr_err("error %d\n", rc
);
7170 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 60, 0);
7172 pr_err("error %d\n", rc
);
7175 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 100, 0);
7177 pr_err("error %d\n", rc
);
7180 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 195, 0);
7182 pr_err("error %d\n", rc
);
7185 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 80, 0);
7187 pr_err("error %d\n", rc
);
7190 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 84, 0);
7192 pr_err("error %d\n", rc
);
7196 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
7198 pr_err("error %d\n", rc
);
7201 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 32, 0);
7203 pr_err("error %d\n", rc
);
7206 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
7208 pr_err("error %d\n", rc
);
7212 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 12, 0);
7214 pr_err("error %d\n", rc
);
7217 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 141, 0);
7219 pr_err("error %d\n", rc
);
7222 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, 7, 0);
7224 pr_err("error %d\n", rc
);
7227 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, 0, 0);
7229 pr_err("error %d\n", rc
);
7232 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
)(-15), 0);
7234 pr_err("error %d\n", rc
);
7237 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
)(-45), 0);
7239 pr_err("error %d\n", rc
);
7242 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-80), 0);
7244 pr_err("error %d\n", rc
);
7248 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
7250 pr_err("error %d\n", rc
);
7253 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
7255 pr_err("error %d\n", rc
);
7258 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
7260 pr_err("error %d\n", rc
);
7263 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 30, 0);
7265 pr_err("error %d\n", rc
);
7268 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
7270 pr_err("error %d\n", rc
);
7273 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
7275 pr_err("error %d\n", rc
);
7278 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 15, 0);
7280 pr_err("error %d\n", rc
);
7283 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 80, 0);
7285 pr_err("error %d\n", rc
);
7288 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
7290 pr_err("error %d\n", rc
);
7293 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
7295 pr_err("error %d\n", rc
);
7298 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
7300 pr_err("error %d\n", rc
);
7303 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
7305 pr_err("error %d\n", rc
);
7308 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
7310 pr_err("error %d\n", rc
);
7313 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
7315 pr_err("error %d\n", rc
);
7318 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
7320 pr_err("error %d\n", rc
);
7323 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 48, 0);
7325 pr_err("error %d\n", rc
);
7328 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 160, 0);
7330 pr_err("error %d\n", rc
);
7333 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
7335 pr_err("error %d\n", rc
);
7338 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
7340 pr_err("error %d\n", rc
);
7343 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 32, 0);
7345 pr_err("error %d\n", rc
);
7349 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 43008, 0);
7351 pr_err("error %d\n", rc
);
7360 /*============================================================================*/
7363 * \fn int set_qam128 ()
7364 * \brief QAM128 specific setup
7365 * \param demod: instance of demod.
7368 static int set_qam128(struct drx_demod_instance
*demod
)
7370 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
7372 const u8 qam_dq_qual_fun
[] = {
7373 DRXJ_16TO8(6), /* fun0 */
7374 DRXJ_16TO8(6), /* fun1 */
7375 DRXJ_16TO8(6), /* fun2 */
7376 DRXJ_16TO8(6), /* fun3 */
7377 DRXJ_16TO8(9), /* fun4 */
7378 DRXJ_16TO8(9), /* fun5 */
7380 const u8 qam_eq_cma_rad
[] = {
7381 DRXJ_16TO8(6164), /* RAD0 */
7382 DRXJ_16TO8(6598), /* RAD1 */
7383 DRXJ_16TO8(6394), /* RAD2 */
7384 DRXJ_16TO8(6409), /* RAD3 */
7385 DRXJ_16TO8(6656), /* RAD4 */
7386 DRXJ_16TO8(7238), /* RAD5 */
7389 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
7391 pr_err("error %d\n", rc
);
7394 rc
= drxdap_fasi_write_block(dev_addr
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, sizeof(qam_eq_cma_rad
), ((u8
*)qam_eq_cma_rad
), 0);
7396 pr_err("error %d\n", rc
);
7400 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 50, 0);
7402 pr_err("error %d\n", rc
);
7405 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 60, 0);
7407 pr_err("error %d\n", rc
);
7410 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 100, 0);
7412 pr_err("error %d\n", rc
);
7415 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 140, 0);
7417 pr_err("error %d\n", rc
);
7420 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 80, 0);
7422 pr_err("error %d\n", rc
);
7425 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 100, 0);
7427 pr_err("error %d\n", rc
);
7431 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
7433 pr_err("error %d\n", rc
);
7436 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 32, 0);
7438 pr_err("error %d\n", rc
);
7441 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
7443 pr_err("error %d\n", rc
);
7447 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 8, 0);
7449 pr_err("error %d\n", rc
);
7452 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 65, 0);
7454 pr_err("error %d\n", rc
);
7457 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, 5, 0);
7459 pr_err("error %d\n", rc
);
7462 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, 3, 0);
7464 pr_err("error %d\n", rc
);
7467 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
)(-1), 0);
7469 pr_err("error %d\n", rc
);
7472 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, 12, 0);
7474 pr_err("error %d\n", rc
);
7477 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-23), 0);
7479 pr_err("error %d\n", rc
);
7483 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
7485 pr_err("error %d\n", rc
);
7488 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
7490 pr_err("error %d\n", rc
);
7493 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
7495 pr_err("error %d\n", rc
);
7498 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 40, 0);
7500 pr_err("error %d\n", rc
);
7503 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
7505 pr_err("error %d\n", rc
);
7508 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
7510 pr_err("error %d\n", rc
);
7513 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 20, 0);
7515 pr_err("error %d\n", rc
);
7518 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 80, 0);
7520 pr_err("error %d\n", rc
);
7523 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
7525 pr_err("error %d\n", rc
);
7528 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
7530 pr_err("error %d\n", rc
);
7533 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
7535 pr_err("error %d\n", rc
);
7538 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
7540 pr_err("error %d\n", rc
);
7543 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
7545 pr_err("error %d\n", rc
);
7548 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
7550 pr_err("error %d\n", rc
);
7553 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
7555 pr_err("error %d\n", rc
);
7558 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 32, 0);
7560 pr_err("error %d\n", rc
);
7563 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 144, 0);
7565 pr_err("error %d\n", rc
);
7568 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
7570 pr_err("error %d\n", rc
);
7573 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
7575 pr_err("error %d\n", rc
);
7578 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 16, 0);
7580 pr_err("error %d\n", rc
);
7584 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 20992, 0);
7586 pr_err("error %d\n", rc
);
7595 /*============================================================================*/
7598 * \fn int set_qam256 ()
7599 * \brief QAM256 specific setup
7600 * \param demod: instance of demod.
7603 static int set_qam256(struct drx_demod_instance
*demod
)
7605 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
7607 const u8 qam_dq_qual_fun
[] = {
7608 DRXJ_16TO8(8), /* fun0 */
7609 DRXJ_16TO8(8), /* fun1 */
7610 DRXJ_16TO8(8), /* fun2 */
7611 DRXJ_16TO8(8), /* fun3 */
7612 DRXJ_16TO8(12), /* fun4 */
7613 DRXJ_16TO8(12), /* fun5 */
7615 const u8 qam_eq_cma_rad
[] = {
7616 DRXJ_16TO8(12345), /* RAD0 */
7617 DRXJ_16TO8(12345), /* RAD1 */
7618 DRXJ_16TO8(13626), /* RAD2 */
7619 DRXJ_16TO8(12931), /* RAD3 */
7620 DRXJ_16TO8(14719), /* RAD4 */
7621 DRXJ_16TO8(15356), /* RAD5 */
7624 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
7626 pr_err("error %d\n", rc
);
7629 rc
= drxdap_fasi_write_block(dev_addr
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, sizeof(qam_eq_cma_rad
), ((u8
*)qam_eq_cma_rad
), 0);
7631 pr_err("error %d\n", rc
);
7635 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 50, 0);
7637 pr_err("error %d\n", rc
);
7640 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 60, 0);
7642 pr_err("error %d\n", rc
);
7645 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 100, 0);
7647 pr_err("error %d\n", rc
);
7650 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 150, 0);
7652 pr_err("error %d\n", rc
);
7655 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 80, 0);
7657 pr_err("error %d\n", rc
);
7660 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 110, 0);
7662 pr_err("error %d\n", rc
);
7666 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
7668 pr_err("error %d\n", rc
);
7671 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 16, 0);
7673 pr_err("error %d\n", rc
);
7676 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
7678 pr_err("error %d\n", rc
);
7682 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 8, 0);
7684 pr_err("error %d\n", rc
);
7687 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 74, 0);
7689 pr_err("error %d\n", rc
);
7692 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, 18, 0);
7694 pr_err("error %d\n", rc
);
7697 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, 13, 0);
7699 pr_err("error %d\n", rc
);
7702 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, 7, 0);
7704 pr_err("error %d\n", rc
);
7707 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, 0, 0);
7709 pr_err("error %d\n", rc
);
7712 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-8), 0);
7714 pr_err("error %d\n", rc
);
7718 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
7720 pr_err("error %d\n", rc
);
7723 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
7725 pr_err("error %d\n", rc
);
7728 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
7730 pr_err("error %d\n", rc
);
7733 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 50, 0);
7735 pr_err("error %d\n", rc
);
7738 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
7740 pr_err("error %d\n", rc
);
7743 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
7745 pr_err("error %d\n", rc
);
7748 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 25, 0);
7750 pr_err("error %d\n", rc
);
7753 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 80, 0);
7755 pr_err("error %d\n", rc
);
7758 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
7760 pr_err("error %d\n", rc
);
7763 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
7765 pr_err("error %d\n", rc
);
7768 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
7770 pr_err("error %d\n", rc
);
7773 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
7775 pr_err("error %d\n", rc
);
7778 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
7780 pr_err("error %d\n", rc
);
7783 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
7785 pr_err("error %d\n", rc
);
7788 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
7790 pr_err("error %d\n", rc
);
7793 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 48, 0);
7795 pr_err("error %d\n", rc
);
7798 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 80, 0);
7800 pr_err("error %d\n", rc
);
7803 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
7805 pr_err("error %d\n", rc
);
7808 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
7810 pr_err("error %d\n", rc
);
7813 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 16, 0);
7815 pr_err("error %d\n", rc
);
7819 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 43520, 0);
7821 pr_err("error %d\n", rc
);
7830 /*============================================================================*/
7831 #define QAM_SET_OP_ALL 0x1
7832 #define QAM_SET_OP_CONSTELLATION 0x2
7833 #define QAM_SET_OP_SPECTRUM 0X4
7836 * \fn int set_qam ()
7837 * \brief Set QAM demod.
7838 * \param demod: instance of demod.
7839 * \param channel: pointer to channel data.
7843 set_qam(struct drx_demod_instance
*demod
,
7844 struct drx_channel
*channel
, s32 tuner_freq_offset
, u32 op
)
7846 struct i2c_device_addr
*dev_addr
= NULL
;
7847 struct drxj_data
*ext_attr
= NULL
;
7848 struct drx_common_attr
*common_attr
= NULL
;
7850 u32 adc_frequency
= 0;
7851 u32 iqm_rc_rate
= 0;
7853 u16 lc_symbol_freq
= 0;
7854 u16 iqm_rc_stretch
= 0;
7855 u16 set_env_parameters
= 0;
7856 u16 set_param_parameters
[2] = { 0 };
7857 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
7858 /* parameter_len */ 0,
7860 /* parameter */ NULL
,
7863 const u8 qam_a_taps
[] = {
7864 DRXJ_16TO8(-1), /* re0 */
7865 DRXJ_16TO8(1), /* re1 */
7866 DRXJ_16TO8(1), /* re2 */
7867 DRXJ_16TO8(-1), /* re3 */
7868 DRXJ_16TO8(-1), /* re4 */
7869 DRXJ_16TO8(2), /* re5 */
7870 DRXJ_16TO8(1), /* re6 */
7871 DRXJ_16TO8(-2), /* re7 */
7872 DRXJ_16TO8(0), /* re8 */
7873 DRXJ_16TO8(3), /* re9 */
7874 DRXJ_16TO8(-1), /* re10 */
7875 DRXJ_16TO8(-3), /* re11 */
7876 DRXJ_16TO8(4), /* re12 */
7877 DRXJ_16TO8(1), /* re13 */
7878 DRXJ_16TO8(-8), /* re14 */
7879 DRXJ_16TO8(4), /* re15 */
7880 DRXJ_16TO8(13), /* re16 */
7881 DRXJ_16TO8(-13), /* re17 */
7882 DRXJ_16TO8(-19), /* re18 */
7883 DRXJ_16TO8(28), /* re19 */
7884 DRXJ_16TO8(25), /* re20 */
7885 DRXJ_16TO8(-53), /* re21 */
7886 DRXJ_16TO8(-31), /* re22 */
7887 DRXJ_16TO8(96), /* re23 */
7888 DRXJ_16TO8(37), /* re24 */
7889 DRXJ_16TO8(-190), /* re25 */
7890 DRXJ_16TO8(-40), /* re26 */
7891 DRXJ_16TO8(619) /* re27 */
7893 const u8 qam_b64_taps
[] = {
7894 DRXJ_16TO8(0), /* re0 */
7895 DRXJ_16TO8(-2), /* re1 */
7896 DRXJ_16TO8(1), /* re2 */
7897 DRXJ_16TO8(2), /* re3 */
7898 DRXJ_16TO8(-2), /* re4 */
7899 DRXJ_16TO8(0), /* re5 */
7900 DRXJ_16TO8(4), /* re6 */
7901 DRXJ_16TO8(-2), /* re7 */
7902 DRXJ_16TO8(-4), /* re8 */
7903 DRXJ_16TO8(4), /* re9 */
7904 DRXJ_16TO8(3), /* re10 */
7905 DRXJ_16TO8(-6), /* re11 */
7906 DRXJ_16TO8(0), /* re12 */
7907 DRXJ_16TO8(6), /* re13 */
7908 DRXJ_16TO8(-5), /* re14 */
7909 DRXJ_16TO8(-3), /* re15 */
7910 DRXJ_16TO8(11), /* re16 */
7911 DRXJ_16TO8(-4), /* re17 */
7912 DRXJ_16TO8(-19), /* re18 */
7913 DRXJ_16TO8(19), /* re19 */
7914 DRXJ_16TO8(28), /* re20 */
7915 DRXJ_16TO8(-45), /* re21 */
7916 DRXJ_16TO8(-36), /* re22 */
7917 DRXJ_16TO8(90), /* re23 */
7918 DRXJ_16TO8(42), /* re24 */
7919 DRXJ_16TO8(-185), /* re25 */
7920 DRXJ_16TO8(-46), /* re26 */
7921 DRXJ_16TO8(614) /* re27 */
7923 const u8 qam_b256_taps
[] = {
7924 DRXJ_16TO8(-2), /* re0 */
7925 DRXJ_16TO8(4), /* re1 */
7926 DRXJ_16TO8(1), /* re2 */
7927 DRXJ_16TO8(-4), /* re3 */
7928 DRXJ_16TO8(0), /* re4 */
7929 DRXJ_16TO8(4), /* re5 */
7930 DRXJ_16TO8(-2), /* re6 */
7931 DRXJ_16TO8(-4), /* re7 */
7932 DRXJ_16TO8(5), /* re8 */
7933 DRXJ_16TO8(2), /* re9 */
7934 DRXJ_16TO8(-8), /* re10 */
7935 DRXJ_16TO8(2), /* re11 */
7936 DRXJ_16TO8(11), /* re12 */
7937 DRXJ_16TO8(-8), /* re13 */
7938 DRXJ_16TO8(-15), /* re14 */
7939 DRXJ_16TO8(16), /* re15 */
7940 DRXJ_16TO8(19), /* re16 */
7941 DRXJ_16TO8(-27), /* re17 */
7942 DRXJ_16TO8(-22), /* re18 */
7943 DRXJ_16TO8(44), /* re19 */
7944 DRXJ_16TO8(26), /* re20 */
7945 DRXJ_16TO8(-69), /* re21 */
7946 DRXJ_16TO8(-28), /* re22 */
7947 DRXJ_16TO8(110), /* re23 */
7948 DRXJ_16TO8(31), /* re24 */
7949 DRXJ_16TO8(-201), /* re25 */
7950 DRXJ_16TO8(-32), /* re26 */
7951 DRXJ_16TO8(628) /* re27 */
7953 const u8 qam_c_taps
[] = {
7954 DRXJ_16TO8(-3), /* re0 */
7955 DRXJ_16TO8(3), /* re1 */
7956 DRXJ_16TO8(2), /* re2 */
7957 DRXJ_16TO8(-4), /* re3 */
7958 DRXJ_16TO8(0), /* re4 */
7959 DRXJ_16TO8(4), /* re5 */
7960 DRXJ_16TO8(-1), /* re6 */
7961 DRXJ_16TO8(-4), /* re7 */
7962 DRXJ_16TO8(3), /* re8 */
7963 DRXJ_16TO8(3), /* re9 */
7964 DRXJ_16TO8(-5), /* re10 */
7965 DRXJ_16TO8(0), /* re11 */
7966 DRXJ_16TO8(9), /* re12 */
7967 DRXJ_16TO8(-4), /* re13 */
7968 DRXJ_16TO8(-12), /* re14 */
7969 DRXJ_16TO8(10), /* re15 */
7970 DRXJ_16TO8(16), /* re16 */
7971 DRXJ_16TO8(-21), /* re17 */
7972 DRXJ_16TO8(-20), /* re18 */
7973 DRXJ_16TO8(37), /* re19 */
7974 DRXJ_16TO8(25), /* re20 */
7975 DRXJ_16TO8(-62), /* re21 */
7976 DRXJ_16TO8(-28), /* re22 */
7977 DRXJ_16TO8(105), /* re23 */
7978 DRXJ_16TO8(31), /* re24 */
7979 DRXJ_16TO8(-197), /* re25 */
7980 DRXJ_16TO8(-33), /* re26 */
7981 DRXJ_16TO8(626) /* re27 */
7984 dev_addr
= demod
->my_i2c_dev_addr
;
7985 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
7986 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
7988 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
7989 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
7990 switch (channel
->constellation
) {
7991 case DRX_CONSTELLATION_QAM256
:
7992 iqm_rc_rate
= 0x00AE3562;
7994 QAM_LC_SYMBOL_FREQ_FREQ_QAM_B_256
;
7995 channel
->symbolrate
= 5360537;
7996 iqm_rc_stretch
= IQM_RC_STRETCH_QAM_B_256
;
7998 case DRX_CONSTELLATION_QAM64
:
7999 iqm_rc_rate
= 0x00C05A0E;
8000 lc_symbol_freq
= 409;
8001 channel
->symbolrate
= 5056941;
8002 iqm_rc_stretch
= IQM_RC_STRETCH_QAM_B_64
;
8008 adc_frequency
= (common_attr
->sys_clock_freq
* 1000) / 3;
8009 if (channel
->symbolrate
== 0) {
8010 pr_err("error: channel symbolrate is zero!\n");
8014 (adc_frequency
/ channel
->symbolrate
) * (1 << 21) +
8016 ((adc_frequency
% channel
->symbolrate
),
8017 channel
->symbolrate
) >> 7) - (1 << 23);
8020 (channel
->symbolrate
+
8021 (adc_frequency
>> 13),
8022 adc_frequency
) >> 16);
8023 if (lc_symbol_freq
> 511)
8024 lc_symbol_freq
= 511;
8026 iqm_rc_stretch
= 21;
8029 if (ext_attr
->standard
== DRX_STANDARD_ITU_A
) {
8030 set_env_parameters
= QAM_TOP_ANNEX_A
; /* annex */
8031 set_param_parameters
[0] = channel
->constellation
; /* constellation */
8032 set_param_parameters
[1] = DRX_INTERLEAVEMODE_I12_J17
; /* interleave mode */
8033 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
8034 set_env_parameters
= QAM_TOP_ANNEX_B
; /* annex */
8035 set_param_parameters
[0] = channel
->constellation
; /* constellation */
8036 set_param_parameters
[1] = channel
->interleavemode
; /* interleave mode */
8037 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_C
) {
8038 set_env_parameters
= QAM_TOP_ANNEX_C
; /* annex */
8039 set_param_parameters
[0] = channel
->constellation
; /* constellation */
8040 set_param_parameters
[1] = DRX_INTERLEAVEMODE_I12_J17
; /* interleave mode */
8046 if (op
& QAM_SET_OP_ALL
) {
8048 STEP 1: reset demodulator
8049 resets IQM, QAM and FEC HW blocks
8050 resets SCU variables
8052 /* stop all comm_exec */
8053 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
, 0);
8055 pr_err("error %d\n", rc
);
8058 rc
= drxj_dap_write_reg16(dev_addr
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_STOP
, 0);
8060 pr_err("error %d\n", rc
);
8063 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
8065 pr_err("error %d\n", rc
);
8068 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
8070 pr_err("error %d\n", rc
);
8073 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
8075 pr_err("error %d\n", rc
);
8078 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
8080 pr_err("error %d\n", rc
);
8083 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
8085 pr_err("error %d\n", rc
);
8089 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
8090 SCU_RAM_COMMAND_CMD_DEMOD_RESET
;
8091 cmd_scu
.parameter_len
= 0;
8092 cmd_scu
.result_len
= 1;
8093 cmd_scu
.parameter
= NULL
;
8094 cmd_scu
.result
= &cmd_result
;
8095 rc
= scu_command(dev_addr
, &cmd_scu
);
8097 pr_err("error %d\n", rc
);
8102 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
8104 STEP 2: configure demodulator
8106 -set params (resets IQM,QAM,FEC HW; initializes some SCU variables )
8108 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
8109 SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV
;
8110 cmd_scu
.parameter_len
= 1;
8111 cmd_scu
.result_len
= 1;
8112 cmd_scu
.parameter
= &set_env_parameters
;
8113 cmd_scu
.result
= &cmd_result
;
8114 rc
= scu_command(dev_addr
, &cmd_scu
);
8116 pr_err("error %d\n", rc
);
8120 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
8121 SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM
;
8122 cmd_scu
.parameter_len
= 2;
8123 cmd_scu
.result_len
= 1;
8124 cmd_scu
.parameter
= set_param_parameters
;
8125 cmd_scu
.result
= &cmd_result
;
8126 rc
= scu_command(dev_addr
, &cmd_scu
);
8128 pr_err("error %d\n", rc
);
8131 /* set symbol rate */
8132 rc
= drxdap_fasi_write_reg32(dev_addr
, IQM_RC_RATE_OFS_LO__A
, iqm_rc_rate
, 0);
8134 pr_err("error %d\n", rc
);
8137 ext_attr
->iqm_rc_rate_ofs
= iqm_rc_rate
;
8138 rc
= set_qam_measurement(demod
, channel
->constellation
, channel
->symbolrate
);
8140 pr_err("error %d\n", rc
);
8144 /* STEP 3: enable the system in a mode where the ADC provides valid signal
8145 setup constellation independent registers */
8146 /* from qam_cmd.py script (qam_driver_b) */
8147 /* TODO: remove re-writes of HW reset values */
8148 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_SPECTRUM
)) {
8149 rc
= set_frequency(demod
, channel
, tuner_freq_offset
);
8151 pr_err("error %d\n", rc
);
8156 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
8158 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_SYMBOL_FREQ__A
, lc_symbol_freq
, 0);
8160 pr_err("error %d\n", rc
);
8163 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_STRETCH__A
, iqm_rc_stretch
, 0);
8165 pr_err("error %d\n", rc
);
8170 if (op
& QAM_SET_OP_ALL
) {
8171 if (!ext_attr
->has_lna
) {
8172 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_AMUX__A
, 0x02, 0);
8174 pr_err("error %d\n", rc
);
8178 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SYMMETRIC__A
, 0, 0);
8180 pr_err("error %d\n", rc
);
8183 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_MIDTAP__A
, 3, 0);
8185 pr_err("error %d\n", rc
);
8188 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_OUT_ENA__A
, IQM_CF_OUT_ENA_QAM__M
, 0);
8190 pr_err("error %d\n", rc
);
8194 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_WR_RSV_0__A
, 0x5f, 0);
8196 pr_err("error %d\n", rc
);
8198 } /* scu temporary shut down agc */
8200 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_SYNC_SEL__A
, 3, 0);
8202 pr_err("error %d\n", rc
);
8205 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLP_LEN__A
, 0, 0);
8207 pr_err("error %d\n", rc
);
8210 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLP_TH__A
, 448, 0);
8212 pr_err("error %d\n", rc
);
8215 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_SNS_LEN__A
, 0, 0);
8217 pr_err("error %d\n", rc
);
8220 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_PDREF__A
, 4, 0);
8222 pr_err("error %d\n", rc
);
8225 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, 0x10, 0);
8227 pr_err("error %d\n", rc
);
8230 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_PGA_GAIN__A
, 11, 0);
8232 pr_err("error %d\n", rc
);
8236 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_POW_MEAS_LEN__A
, 1, 0);
8238 pr_err("error %d\n", rc
);
8241 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SCALE_SH__A
, IQM_CF_SCALE_SH__PRE
, 0);
8243 pr_err("error %d\n", rc
);
8245 } /*! reset default val ! */
8247 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_TIMEOUT__A
, QAM_SY_TIMEOUT__PRE
, 0);
8249 pr_err("error %d\n", rc
);
8251 } /*! reset default val ! */
8252 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
8253 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_LWM__A
, QAM_SY_SYNC_LWM__PRE
, 0);
8255 pr_err("error %d\n", rc
);
8257 } /*! reset default val ! */
8258 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_AWM__A
, QAM_SY_SYNC_AWM__PRE
, 0);
8260 pr_err("error %d\n", rc
);
8262 } /*! reset default val ! */
8263 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_HWM__A
, QAM_SY_SYNC_HWM__PRE
, 0);
8265 pr_err("error %d\n", rc
);
8267 } /*! reset default val ! */
8269 switch (channel
->constellation
) {
8270 case DRX_CONSTELLATION_QAM16
:
8271 case DRX_CONSTELLATION_QAM64
:
8272 case DRX_CONSTELLATION_QAM256
:
8273 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_LWM__A
, 0x03, 0);
8275 pr_err("error %d\n", rc
);
8278 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_AWM__A
, 0x04, 0);
8280 pr_err("error %d\n", rc
);
8283 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_HWM__A
, QAM_SY_SYNC_HWM__PRE
, 0);
8285 pr_err("error %d\n", rc
);
8287 } /*! reset default val ! */
8289 case DRX_CONSTELLATION_QAM32
:
8290 case DRX_CONSTELLATION_QAM128
:
8291 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_LWM__A
, 0x03, 0);
8293 pr_err("error %d\n", rc
);
8296 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_AWM__A
, 0x05, 0);
8298 pr_err("error %d\n", rc
);
8301 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_HWM__A
, 0x06, 0);
8303 pr_err("error %d\n", rc
);
8312 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_MODE__A
, QAM_LC_MODE__PRE
, 0);
8314 pr_err("error %d\n", rc
);
8316 } /*! reset default val ! */
8317 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_RATE_LIMIT__A
, 3, 0);
8319 pr_err("error %d\n", rc
);
8322 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_LPF_FACTORP__A
, 4, 0);
8324 pr_err("error %d\n", rc
);
8327 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_LPF_FACTORI__A
, 4, 0);
8329 pr_err("error %d\n", rc
);
8332 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_MODE__A
, 7, 0);
8334 pr_err("error %d\n", rc
);
8337 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB0__A
, 1, 0);
8339 pr_err("error %d\n", rc
);
8342 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB1__A
, 1, 0);
8344 pr_err("error %d\n", rc
);
8347 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB2__A
, 1, 0);
8349 pr_err("error %d\n", rc
);
8352 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB3__A
, 1, 0);
8354 pr_err("error %d\n", rc
);
8357 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB4__A
, 2, 0);
8359 pr_err("error %d\n", rc
);
8362 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB5__A
, 2, 0);
8364 pr_err("error %d\n", rc
);
8367 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB6__A
, 2, 0);
8369 pr_err("error %d\n", rc
);
8372 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB8__A
, 2, 0);
8374 pr_err("error %d\n", rc
);
8377 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB9__A
, 2, 0);
8379 pr_err("error %d\n", rc
);
8382 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB10__A
, 2, 0);
8384 pr_err("error %d\n", rc
);
8387 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB12__A
, 2, 0);
8389 pr_err("error %d\n", rc
);
8392 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB15__A
, 3, 0);
8394 pr_err("error %d\n", rc
);
8397 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB16__A
, 3, 0);
8399 pr_err("error %d\n", rc
);
8402 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB20__A
, 4, 0);
8404 pr_err("error %d\n", rc
);
8407 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB25__A
, 4, 0);
8409 pr_err("error %d\n", rc
);
8413 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_ADJ_SEL__A
, 1, 0);
8415 pr_err("error %d\n", rc
);
8418 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_ADJ_SEL__A
, 1, 0);
8420 pr_err("error %d\n", rc
);
8423 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_ADJ_SEL__A
, 1, 0);
8425 pr_err("error %d\n", rc
);
8428 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_POW_MEAS_LEN__A
, 0, 0);
8430 pr_err("error %d\n", rc
);
8433 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_GPIO__A
, 0, 0);
8435 pr_err("error %d\n", rc
);
8439 /* No more resets of the IQM, current standard correctly set =>
8440 now AGCs can be configured. */
8441 /* turn on IQMAF. It has to be in front of setAgc**() */
8442 rc
= set_iqm_af(demod
, true);
8444 pr_err("error %d\n", rc
);
8447 rc
= adc_synchronization(demod
);
8449 pr_err("error %d\n", rc
);
8453 rc
= init_agc(demod
);
8455 pr_err("error %d\n", rc
);
8458 rc
= set_agc_if(demod
, &(ext_attr
->qam_if_agc_cfg
), false);
8460 pr_err("error %d\n", rc
);
8463 rc
= set_agc_rf(demod
, &(ext_attr
->qam_rf_agc_cfg
), false);
8465 pr_err("error %d\n", rc
);
8469 /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
8471 struct drxj_cfg_afe_gain qam_pga_cfg
= { DRX_STANDARD_ITU_B
, 0 };
8473 qam_pga_cfg
.gain
= ext_attr
->qam_pga_cfg
;
8474 rc
= ctrl_set_cfg_afe_gain(demod
, &qam_pga_cfg
);
8476 pr_err("error %d\n", rc
);
8480 rc
= ctrl_set_cfg_pre_saw(demod
, &(ext_attr
->qam_pre_saw_cfg
));
8482 pr_err("error %d\n", rc
);
8487 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
8488 if (ext_attr
->standard
== DRX_STANDARD_ITU_A
) {
8489 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(qam_a_taps
), ((u8
*)qam_a_taps
), 0);
8491 pr_err("error %d\n", rc
);
8494 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(qam_a_taps
), ((u8
*)qam_a_taps
), 0);
8496 pr_err("error %d\n", rc
);
8499 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
8500 switch (channel
->constellation
) {
8501 case DRX_CONSTELLATION_QAM64
:
8502 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(qam_b64_taps
), ((u8
*)qam_b64_taps
), 0);
8504 pr_err("error %d\n", rc
);
8507 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(qam_b64_taps
), ((u8
*)qam_b64_taps
), 0);
8509 pr_err("error %d\n", rc
);
8513 case DRX_CONSTELLATION_QAM256
:
8514 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(qam_b256_taps
), ((u8
*)qam_b256_taps
), 0);
8516 pr_err("error %d\n", rc
);
8519 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(qam_b256_taps
), ((u8
*)qam_b256_taps
), 0);
8521 pr_err("error %d\n", rc
);
8528 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_C
) {
8529 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(qam_c_taps
), ((u8
*)qam_c_taps
), 0);
8531 pr_err("error %d\n", rc
);
8534 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(qam_c_taps
), ((u8
*)qam_c_taps
), 0);
8536 pr_err("error %d\n", rc
);
8541 /* SETP 4: constellation specific setup */
8542 switch (channel
->constellation
) {
8543 case DRX_CONSTELLATION_QAM16
:
8544 rc
= set_qam16(demod
);
8546 pr_err("error %d\n", rc
);
8550 case DRX_CONSTELLATION_QAM32
:
8551 rc
= set_qam32(demod
);
8553 pr_err("error %d\n", rc
);
8557 case DRX_CONSTELLATION_QAM64
:
8558 rc
= set_qam64(demod
);
8560 pr_err("error %d\n", rc
);
8564 case DRX_CONSTELLATION_QAM128
:
8565 rc
= set_qam128(demod
);
8567 pr_err("error %d\n", rc
);
8571 case DRX_CONSTELLATION_QAM256
:
8572 rc
= set_qam256(demod
);
8574 pr_err("error %d\n", rc
);
8583 if ((op
& QAM_SET_OP_ALL
)) {
8584 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SCALE_SH__A
, 0, 0);
8586 pr_err("error %d\n", rc
);
8590 /* Mpeg output has to be in front of FEC active */
8591 rc
= set_mpegtei_handling(demod
);
8593 pr_err("error %d\n", rc
);
8596 rc
= bit_reverse_mpeg_output(demod
);
8598 pr_err("error %d\n", rc
);
8601 rc
= set_mpeg_start_width(demod
);
8603 pr_err("error %d\n", rc
);
8607 /* TODO: move to set_standard after hardware reset value problem is solved */
8608 /* Configure initial MPEG output */
8609 struct drx_cfg_mpeg_output cfg_mpeg_output
;
8611 memcpy(&cfg_mpeg_output
, &common_attr
->mpeg_cfg
, sizeof(cfg_mpeg_output
));
8612 cfg_mpeg_output
.enable_mpeg_output
= true;
8614 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
8616 pr_err("error %d\n", rc
);
8622 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
8624 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
8625 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
8626 SCU_RAM_COMMAND_CMD_DEMOD_START
;
8627 cmd_scu
.parameter_len
= 0;
8628 cmd_scu
.result_len
= 1;
8629 cmd_scu
.parameter
= NULL
;
8630 cmd_scu
.result
= &cmd_result
;
8631 rc
= scu_command(dev_addr
, &cmd_scu
);
8633 pr_err("error %d\n", rc
);
8638 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_ACTIVE
, 0);
8640 pr_err("error %d\n", rc
);
8643 rc
= drxj_dap_write_reg16(dev_addr
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_ACTIVE
, 0);
8645 pr_err("error %d\n", rc
);
8648 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_ACTIVE
, 0);
8650 pr_err("error %d\n", rc
);
8659 /*============================================================================*/
8660 static int ctrl_get_qam_sig_quality(struct drx_demod_instance
*demod
);
8662 static int qam_flip_spec(struct drx_demod_instance
*demod
, struct drx_channel
*channel
)
8664 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
8665 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
8667 u32 iqm_fs_rate_ofs
= 0;
8668 u32 iqm_fs_rate_lo
= 0;
8669 u16 qam_ctl_ena
= 0;
8676 /* Silence the controlling of lc, equ, and the acquisition state machine */
8677 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_QAM_CTL_ENA__A
, &qam_ctl_ena
, 0);
8679 pr_err("error %d\n", rc
);
8682 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_CTL_ENA__A
, qam_ctl_ena
& ~(SCU_RAM_QAM_CTL_ENA_ACQ__M
| SCU_RAM_QAM_CTL_ENA_EQU__M
| SCU_RAM_QAM_CTL_ENA_LC__M
), 0);
8684 pr_err("error %d\n", rc
);
8688 /* freeze the frequency control loop */
8689 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_CF__A
, 0, 0);
8691 pr_err("error %d\n", rc
);
8694 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_CF1__A
, 0, 0);
8696 pr_err("error %d\n", rc
);
8700 rc
= drxj_dap_atomic_read_reg32(dev_addr
, IQM_FS_RATE_OFS_LO__A
, &iqm_fs_rate_ofs
, 0);
8702 pr_err("error %d\n", rc
);
8705 rc
= drxj_dap_atomic_read_reg32(dev_addr
, IQM_FS_RATE_LO__A
, &iqm_fs_rate_lo
, 0);
8707 pr_err("error %d\n", rc
);
8710 ofsofs
= iqm_fs_rate_lo
- iqm_fs_rate_ofs
;
8711 iqm_fs_rate_ofs
= ~iqm_fs_rate_ofs
+ 1;
8712 iqm_fs_rate_ofs
-= 2 * ofsofs
;
8714 /* freeze dq/fq updating */
8715 rc
= drxj_dap_read_reg16(dev_addr
, QAM_DQ_MODE__A
, &data
, 0);
8717 pr_err("error %d\n", rc
);
8720 data
= (data
& 0xfff9);
8721 rc
= drxj_dap_write_reg16(dev_addr
, QAM_DQ_MODE__A
, data
, 0);
8723 pr_err("error %d\n", rc
);
8726 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_MODE__A
, data
, 0);
8728 pr_err("error %d\n", rc
);
8732 /* lc_cp / _ci / _ca */
8733 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_CI__A
, 0, 0);
8735 pr_err("error %d\n", rc
);
8738 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_EP__A
, 0, 0);
8740 pr_err("error %d\n", rc
);
8743 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_LA_FACTOR__A
, 0, 0);
8745 pr_err("error %d\n", rc
);
8750 rc
= drxdap_fasi_write_reg32(dev_addr
, IQM_FS_RATE_OFS_LO__A
, iqm_fs_rate_ofs
, 0);
8752 pr_err("error %d\n", rc
);
8755 ext_attr
->iqm_fs_rate_ofs
= iqm_fs_rate_ofs
;
8756 ext_attr
->pos_image
= (ext_attr
->pos_image
) ? false : true;
8758 /* freeze dq/fq updating */
8759 rc
= drxj_dap_read_reg16(dev_addr
, QAM_DQ_MODE__A
, &data
, 0);
8761 pr_err("error %d\n", rc
);
8765 data
= (data
& 0xfff9);
8766 rc
= drxj_dap_write_reg16(dev_addr
, QAM_DQ_MODE__A
, data
, 0);
8768 pr_err("error %d\n", rc
);
8771 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_MODE__A
, data
, 0);
8773 pr_err("error %d\n", rc
);
8777 for (i
= 0; i
< 28; i
++) {
8778 rc
= drxj_dap_read_reg16(dev_addr
, QAM_DQ_TAP_IM_EL0__A
+ (2 * i
), &data
, 0);
8780 pr_err("error %d\n", rc
);
8783 rc
= drxj_dap_write_reg16(dev_addr
, QAM_DQ_TAP_IM_EL0__A
+ (2 * i
), -data
, 0);
8785 pr_err("error %d\n", rc
);
8790 for (i
= 0; i
< 24; i
++) {
8791 rc
= drxj_dap_read_reg16(dev_addr
, QAM_FQ_TAP_IM_EL0__A
+ (2 * i
), &data
, 0);
8793 pr_err("error %d\n", rc
);
8796 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_TAP_IM_EL0__A
+ (2 * i
), -data
, 0);
8798 pr_err("error %d\n", rc
);
8804 rc
= drxj_dap_write_reg16(dev_addr
, QAM_DQ_MODE__A
, data
, 0);
8806 pr_err("error %d\n", rc
);
8809 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_MODE__A
, data
, 0);
8811 pr_err("error %d\n", rc
);
8815 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_STATE_TGT__A
, 4, 0);
8817 pr_err("error %d\n", rc
);
8822 while ((fsm_state
!= 4) && (i
++ < 100)) {
8823 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_QAM_FSM_STATE__A
, &fsm_state
, 0);
8825 pr_err("error %d\n", rc
);
8829 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_CTL_ENA__A
, (qam_ctl_ena
| 0x0016), 0);
8831 pr_err("error %d\n", rc
);
8842 #define DEMOD_LOCKED 0x1
8843 #define SYNC_FLIPPED 0x2
8844 #define SPEC_MIRRORED 0x4
8846 * \fn int qam64auto ()
8847 * \brief auto do sync pattern switching and mirroring.
8848 * \param demod: instance of demod.
8849 * \param channel: pointer to channel data.
8850 * \param tuner_freq_offset: tuner frequency offset.
8851 * \param lock_status: pointer to lock status.
8855 qam64auto(struct drx_demod_instance
*demod
,
8856 struct drx_channel
*channel
,
8857 s32 tuner_freq_offset
, enum drx_lock_status
*lock_status
)
8859 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
8860 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
8861 struct drx39xxj_state
*state
= dev_addr
->user_data
;
8862 struct dtv_frontend_properties
*p
= &state
->frontend
.dtv_property_cache
;
8864 u32 lck_state
= NO_LOCK
;
8866 u32 d_locked_time
= 0;
8867 u32 timeout_ofs
= 0;
8870 /* external attributes for storing acquired channel constellation */
8871 *lock_status
= DRX_NOT_LOCKED
;
8872 start_time
= jiffies_to_msecs(jiffies
);
8873 lck_state
= NO_LOCK
;
8875 rc
= ctrl_lock_status(demod
, lock_status
);
8877 pr_err("error %d\n", rc
);
8881 switch (lck_state
) {
8883 if (*lock_status
== DRXJ_DEMOD_LOCK
) {
8884 rc
= ctrl_get_qam_sig_quality(demod
);
8886 pr_err("error %d\n", rc
);
8889 if (p
->cnr
.stat
[0].svalue
> 20800) {
8890 lck_state
= DEMOD_LOCKED
;
8891 /* some delay to see if fec_lock possible TODO find the right value */
8892 timeout_ofs
+= DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
; /* see something, waiting longer */
8893 d_locked_time
= jiffies_to_msecs(jiffies
);
8898 if ((*lock_status
== DRXJ_DEMOD_LOCK
) && /* still demod_lock in 150ms */
8899 ((jiffies_to_msecs(jiffies
) - d_locked_time
) >
8900 DRXJ_QAM_FEC_LOCK_WAITTIME
)) {
8901 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, &data
, 0);
8903 pr_err("error %d\n", rc
);
8906 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, data
| 0x1, 0);
8908 pr_err("error %d\n", rc
);
8911 lck_state
= SYNC_FLIPPED
;
8916 if (*lock_status
== DRXJ_DEMOD_LOCK
) {
8917 if (channel
->mirror
== DRX_MIRROR_AUTO
) {
8918 /* flip sync pattern back */
8919 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, &data
, 0);
8921 pr_err("error %d\n", rc
);
8924 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, data
& 0xFFFE, 0);
8926 pr_err("error %d\n", rc
);
8930 ext_attr
->mirror
= DRX_MIRROR_YES
;
8931 rc
= qam_flip_spec(demod
, channel
);
8933 pr_err("error %d\n", rc
);
8936 lck_state
= SPEC_MIRRORED
;
8937 /* reset timer TODO: still need 500ms? */
8938 start_time
= d_locked_time
=
8939 jiffies_to_msecs(jiffies
);
8941 } else { /* no need to wait lock */
8944 jiffies_to_msecs(jiffies
) -
8945 DRXJ_QAM_MAX_WAITTIME
- timeout_ofs
;
8950 if ((*lock_status
== DRXJ_DEMOD_LOCK
) && /* still demod_lock in 150ms */
8951 ((jiffies_to_msecs(jiffies
) - d_locked_time
) >
8952 DRXJ_QAM_FEC_LOCK_WAITTIME
)) {
8953 rc
= ctrl_get_qam_sig_quality(demod
);
8955 pr_err("error %d\n", rc
);
8958 if (p
->cnr
.stat
[0].svalue
> 20800) {
8959 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, &data
, 0);
8961 pr_err("error %d\n", rc
);
8964 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, data
| 0x1, 0);
8966 pr_err("error %d\n", rc
);
8969 /* no need to wait lock */
8971 jiffies_to_msecs(jiffies
) -
8972 DRXJ_QAM_MAX_WAITTIME
- timeout_ofs
;
8981 ((*lock_status
!= DRX_LOCKED
) &&
8982 (*lock_status
!= DRX_NEVER_LOCK
) &&
8983 ((jiffies_to_msecs(jiffies
) - start_time
) <
8984 (DRXJ_QAM_MAX_WAITTIME
+ timeout_ofs
))
8986 /* Returning control to apllication ... */
8994 * \fn int qam256auto ()
8995 * \brief auto do sync pattern switching and mirroring.
8996 * \param demod: instance of demod.
8997 * \param channel: pointer to channel data.
8998 * \param tuner_freq_offset: tuner frequency offset.
8999 * \param lock_status: pointer to lock status.
9003 qam256auto(struct drx_demod_instance
*demod
,
9004 struct drx_channel
*channel
,
9005 s32 tuner_freq_offset
, enum drx_lock_status
*lock_status
)
9007 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
9008 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9009 struct drx39xxj_state
*state
= dev_addr
->user_data
;
9010 struct dtv_frontend_properties
*p
= &state
->frontend
.dtv_property_cache
;
9012 u32 lck_state
= NO_LOCK
;
9014 u32 d_locked_time
= 0;
9015 u32 timeout_ofs
= DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
;
9017 /* external attributes for storing acquired channel constellation */
9018 *lock_status
= DRX_NOT_LOCKED
;
9019 start_time
= jiffies_to_msecs(jiffies
);
9020 lck_state
= NO_LOCK
;
9022 rc
= ctrl_lock_status(demod
, lock_status
);
9024 pr_err("error %d\n", rc
);
9027 switch (lck_state
) {
9029 if (*lock_status
== DRXJ_DEMOD_LOCK
) {
9030 rc
= ctrl_get_qam_sig_quality(demod
);
9032 pr_err("error %d\n", rc
);
9035 if (p
->cnr
.stat
[0].svalue
> 26800) {
9036 lck_state
= DEMOD_LOCKED
;
9037 timeout_ofs
+= DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
; /* see something, wait longer */
9038 d_locked_time
= jiffies_to_msecs(jiffies
);
9043 if (*lock_status
== DRXJ_DEMOD_LOCK
) {
9044 if ((channel
->mirror
== DRX_MIRROR_AUTO
) &&
9045 ((jiffies_to_msecs(jiffies
) - d_locked_time
) >
9046 DRXJ_QAM_FEC_LOCK_WAITTIME
)) {
9047 ext_attr
->mirror
= DRX_MIRROR_YES
;
9048 rc
= qam_flip_spec(demod
, channel
);
9050 pr_err("error %d\n", rc
);
9053 lck_state
= SPEC_MIRRORED
;
9054 /* reset timer TODO: still need 300ms? */
9055 start_time
= jiffies_to_msecs(jiffies
);
9056 timeout_ofs
= -DRXJ_QAM_MAX_WAITTIME
/ 2;
9067 ((*lock_status
< DRX_LOCKED
) &&
9068 (*lock_status
!= DRX_NEVER_LOCK
) &&
9069 ((jiffies_to_msecs(jiffies
) - start_time
) <
9070 (DRXJ_QAM_MAX_WAITTIME
+ timeout_ofs
)));
9078 * \fn int set_qam_channel ()
9079 * \brief Set QAM channel according to the requested constellation.
9080 * \param demod: instance of demod.
9081 * \param channel: pointer to channel data.
9085 set_qam_channel(struct drx_demod_instance
*demod
,
9086 struct drx_channel
*channel
, s32 tuner_freq_offset
)
9088 struct drxj_data
*ext_attr
= NULL
;
9090 enum drx_lock_status lock_status
= DRX_NOT_LOCKED
;
9091 bool auto_flag
= false;
9093 /* external attributes for storing acquired channel constellation */
9094 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
9096 /* set QAM channel constellation */
9097 switch (channel
->constellation
) {
9098 case DRX_CONSTELLATION_QAM16
:
9099 case DRX_CONSTELLATION_QAM32
:
9100 case DRX_CONSTELLATION_QAM128
:
9102 case DRX_CONSTELLATION_QAM64
:
9103 case DRX_CONSTELLATION_QAM256
:
9104 if (ext_attr
->standard
!= DRX_STANDARD_ITU_B
)
9107 ext_attr
->constellation
= channel
->constellation
;
9108 if (channel
->mirror
== DRX_MIRROR_AUTO
)
9109 ext_attr
->mirror
= DRX_MIRROR_NO
;
9111 ext_attr
->mirror
= channel
->mirror
;
9113 rc
= set_qam(demod
, channel
, tuner_freq_offset
, QAM_SET_OP_ALL
);
9115 pr_err("error %d\n", rc
);
9119 if (channel
->constellation
== DRX_CONSTELLATION_QAM64
)
9120 rc
= qam64auto(demod
, channel
, tuner_freq_offset
,
9123 rc
= qam256auto(demod
, channel
, tuner_freq_offset
,
9126 pr_err("error %d\n", rc
);
9130 case DRX_CONSTELLATION_AUTO
: /* for channel scan */
9131 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
9132 u16 qam_ctl_ena
= 0;
9136 /* try to lock default QAM constellation: QAM256 */
9137 channel
->constellation
= DRX_CONSTELLATION_QAM256
;
9138 ext_attr
->constellation
= DRX_CONSTELLATION_QAM256
;
9139 if (channel
->mirror
== DRX_MIRROR_AUTO
)
9140 ext_attr
->mirror
= DRX_MIRROR_NO
;
9142 ext_attr
->mirror
= channel
->mirror
;
9143 rc
= set_qam(demod
, channel
, tuner_freq_offset
,
9146 pr_err("error %d\n", rc
);
9149 rc
= qam256auto(demod
, channel
, tuner_freq_offset
,
9152 pr_err("error %d\n", rc
);
9156 if (lock_status
>= DRX_LOCKED
) {
9157 channel
->constellation
= DRX_CONSTELLATION_AUTO
;
9161 /* QAM254 not locked. Try QAM64 constellation */
9162 channel
->constellation
= DRX_CONSTELLATION_QAM64
;
9163 ext_attr
->constellation
= DRX_CONSTELLATION_QAM64
;
9164 if (channel
->mirror
== DRX_MIRROR_AUTO
)
9165 ext_attr
->mirror
= DRX_MIRROR_NO
;
9167 ext_attr
->mirror
= channel
->mirror
;
9169 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
,
9170 SCU_RAM_QAM_CTL_ENA__A
,
9173 pr_err("error %d\n", rc
);
9176 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9177 SCU_RAM_QAM_CTL_ENA__A
,
9178 qam_ctl_ena
& ~SCU_RAM_QAM_CTL_ENA_ACQ__M
, 0);
9180 pr_err("error %d\n", rc
);
9183 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9184 SCU_RAM_QAM_FSM_STATE_TGT__A
,
9187 pr_err("error %d\n", rc
);
9189 } /* force to rate hunting */
9191 rc
= set_qam(demod
, channel
, tuner_freq_offset
,
9192 QAM_SET_OP_CONSTELLATION
);
9194 pr_err("error %d\n", rc
);
9197 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9198 SCU_RAM_QAM_CTL_ENA__A
,
9201 pr_err("error %d\n", rc
);
9205 rc
= qam64auto(demod
, channel
, tuner_freq_offset
,
9208 pr_err("error %d\n", rc
);
9212 channel
->constellation
= DRX_CONSTELLATION_AUTO
;
9213 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_C
) {
9214 u16 qam_ctl_ena
= 0;
9216 channel
->constellation
= DRX_CONSTELLATION_QAM64
;
9217 ext_attr
->constellation
= DRX_CONSTELLATION_QAM64
;
9220 if (channel
->mirror
== DRX_MIRROR_AUTO
)
9221 ext_attr
->mirror
= DRX_MIRROR_NO
;
9223 ext_attr
->mirror
= channel
->mirror
;
9224 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
,
9225 SCU_RAM_QAM_CTL_ENA__A
,
9228 pr_err("error %d\n", rc
);
9231 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9232 SCU_RAM_QAM_CTL_ENA__A
,
9233 qam_ctl_ena
& ~SCU_RAM_QAM_CTL_ENA_ACQ__M
, 0);
9235 pr_err("error %d\n", rc
);
9238 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9239 SCU_RAM_QAM_FSM_STATE_TGT__A
,
9242 pr_err("error %d\n", rc
);
9244 } /* force to rate hunting */
9246 rc
= set_qam(demod
, channel
, tuner_freq_offset
,
9247 QAM_SET_OP_CONSTELLATION
);
9249 pr_err("error %d\n", rc
);
9252 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9253 SCU_RAM_QAM_CTL_ENA__A
,
9256 pr_err("error %d\n", rc
);
9259 rc
= qam64auto(demod
, channel
, tuner_freq_offset
,
9262 pr_err("error %d\n", rc
);
9265 channel
->constellation
= DRX_CONSTELLATION_AUTO
;
9276 /* restore starting value */
9278 channel
->constellation
= DRX_CONSTELLATION_AUTO
;
9282 /*============================================================================*/
9285 * \fn static short get_qamrs_err_count(struct i2c_device_addr *dev_addr)
9286 * \brief Get RS error count in QAM mode (used for post RS BER calculation)
9287 * \return Error code
9289 * precondition: measurement period & measurement prescale must be set
9293 get_qamrs_err_count(struct i2c_device_addr
*dev_addr
,
9294 struct drxjrs_errors
*rs_errors
)
9297 u16 nr_bit_errors
= 0,
9298 nr_symbol_errors
= 0,
9299 nr_packet_errors
= 0, nr_failures
= 0, nr_snc_par_fail_count
= 0;
9301 /* check arguments */
9302 if (dev_addr
== NULL
)
9305 /* all reported errors are received in the */
9306 /* most recently finished measurment period */
9307 /* no of pre RS bit errors */
9308 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_BIT_ERRORS__A
, &nr_bit_errors
, 0);
9310 pr_err("error %d\n", rc
);
9313 /* no of symbol errors */
9314 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_SYMBOL_ERRORS__A
, &nr_symbol_errors
, 0);
9316 pr_err("error %d\n", rc
);
9319 /* no of packet errors */
9320 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_PACKET_ERRORS__A
, &nr_packet_errors
, 0);
9322 pr_err("error %d\n", rc
);
9325 /* no of failures to decode */
9326 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_FAILURES__A
, &nr_failures
, 0);
9328 pr_err("error %d\n", rc
);
9331 /* no of post RS bit erros */
9332 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_SNC_FAIL_COUNT__A
, &nr_snc_par_fail_count
, 0);
9334 pr_err("error %d\n", rc
);
9338 /* These register values are fetched in non-atomic fashion */
9339 /* It is possible that the read values contain unrelated information */
9341 rs_errors
->nr_bit_errors
= nr_bit_errors
& FEC_RS_NR_BIT_ERRORS__M
;
9342 rs_errors
->nr_symbol_errors
= nr_symbol_errors
& FEC_RS_NR_SYMBOL_ERRORS__M
;
9343 rs_errors
->nr_packet_errors
= nr_packet_errors
& FEC_RS_NR_PACKET_ERRORS__M
;
9344 rs_errors
->nr_failures
= nr_failures
& FEC_RS_NR_FAILURES__M
;
9345 rs_errors
->nr_snc_par_fail_count
=
9346 nr_snc_par_fail_count
& FEC_OC_SNC_FAIL_COUNT__M
;
9353 /*============================================================================*/
9356 * \fn int get_sig_strength()
9357 * \brief Retrieve signal strength for VSB and QAM.
9358 * \param demod Pointer to demod instance
9359 * \param u16-t Pointer to signal strength data; range 0, .. , 100.
9361 * \retval 0 sig_strength contains valid data.
9362 * \retval -EINVAL sig_strength is NULL.
9363 * \retval -EIO Erroneous data, sig_strength contains invalid data.
9365 #define DRXJ_AGC_TOP 0x2800
9366 #define DRXJ_AGC_SNS 0x1600
9367 #define DRXJ_RFAGC_MAX 0x3fff
9368 #define DRXJ_RFAGC_MIN 0x800
9370 static int get_sig_strength(struct drx_demod_instance
*demod
, u16
*sig_strength
)
9372 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9381 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_AGC_IF__A
, &if_gain
, 0);
9383 pr_err("error %d\n", rc
);
9386 if_gain
&= IQM_AF_AGC_IF__M
;
9387 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_AGC_RF__A
, &rf_gain
, 0);
9389 pr_err("error %d\n", rc
);
9392 rf_gain
&= IQM_AF_AGC_RF__M
;
9394 if_agc_sns
= DRXJ_AGC_SNS
;
9395 if_agc_top
= DRXJ_AGC_TOP
;
9396 rf_agc_max
= DRXJ_RFAGC_MAX
;
9397 rf_agc_min
= DRXJ_RFAGC_MIN
;
9399 if (if_gain
> if_agc_top
) {
9400 if (rf_gain
> rf_agc_max
)
9401 *sig_strength
= 100;
9402 else if (rf_gain
> rf_agc_min
) {
9403 if (rf_agc_max
== rf_agc_min
) {
9404 pr_err("error: rf_agc_max == rf_agc_min\n");
9408 75 + 25 * (rf_gain
- rf_agc_min
) / (rf_agc_max
-
9412 } else if (if_gain
> if_agc_sns
) {
9413 if (if_agc_top
== if_agc_sns
) {
9414 pr_err("error: if_agc_top == if_agc_sns\n");
9418 20 + 55 * (if_gain
- if_agc_sns
) / (if_agc_top
- if_agc_sns
);
9421 pr_err("error: if_agc_sns is zero!\n");
9424 *sig_strength
= (20 * if_gain
/ if_agc_sns
);
9427 if (*sig_strength
<= 7)
9436 * \fn int ctrl_get_qam_sig_quality()
9437 * \brief Retrieve QAM signal quality from device.
9438 * \param devmod Pointer to demodulator instance.
9439 * \param sig_quality Pointer to signal quality data.
9441 * \retval 0 sig_quality contains valid data.
9442 * \retval -EINVAL sig_quality is NULL.
9443 * \retval -EIO Erroneous data, sig_quality contains invalid data.
9445 * Pre-condition: Device must be started and in lock.
9448 ctrl_get_qam_sig_quality(struct drx_demod_instance
*demod
)
9450 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9451 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
9452 struct drx39xxj_state
*state
= dev_addr
->user_data
;
9453 struct dtv_frontend_properties
*p
= &state
->frontend
.dtv_property_cache
;
9454 struct drxjrs_errors measuredrs_errors
= { 0, 0, 0, 0, 0 };
9455 enum drx_modulation constellation
= ext_attr
->constellation
;
9458 u32 pre_bit_err_rs
= 0; /* pre RedSolomon Bit Error Rate */
9459 u32 post_bit_err_rs
= 0; /* post RedSolomon Bit Error Rate */
9460 u32 pkt_errs
= 0; /* no of packet errors in RS */
9461 u16 qam_sl_err_power
= 0; /* accumulated error between raw and sliced symbols */
9462 u16 qsym_err_vd
= 0; /* quadrature symbol errors in QAM_VD */
9463 u16 fec_oc_period
= 0; /* SNC sync failure measurement period */
9464 u16 fec_rs_prescale
= 0; /* ReedSolomon Measurement Prescale */
9465 u16 fec_rs_period
= 0; /* Value for corresponding I2C register */
9466 /* calculation constants */
9467 u32 rs_bit_cnt
= 0; /* RedSolomon Bit Count */
9468 u32 qam_sl_sig_power
= 0; /* used for MER, depends of QAM constellation */
9469 /* intermediate results */
9470 u32 e
= 0; /* exponent value used for QAM BER/SER */
9471 u32 m
= 0; /* mantisa value used for QAM BER/SER */
9472 u32 ber_cnt
= 0; /* BER count */
9473 /* signal quality info */
9474 u32 qam_sl_mer
= 0; /* QAM MER */
9475 u32 qam_pre_rs_ber
= 0; /* Pre RedSolomon BER */
9476 u32 qam_post_rs_ber
= 0; /* Post RedSolomon BER */
9477 u32 qam_vd_ser
= 0; /* ViterbiDecoder SER */
9478 u16 qam_vd_prescale
= 0; /* Viterbi Measurement Prescale */
9479 u16 qam_vd_period
= 0; /* Viterbi Measurement period */
9480 u32 vd_bit_cnt
= 0; /* ViterbiDecoder Bit Count */
9482 p
->block_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9484 /* read the physical registers */
9485 /* Get the RS error data */
9486 rc
= get_qamrs_err_count(dev_addr
, &measuredrs_errors
);
9488 pr_err("error %d\n", rc
);
9491 /* get the register value needed for MER */
9492 rc
= drxj_dap_read_reg16(dev_addr
, QAM_SL_ERR_POWER__A
, &qam_sl_err_power
, 0);
9494 pr_err("error %d\n", rc
);
9497 /* get the register value needed for post RS BER */
9498 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_SNC_FAIL_PERIOD__A
, &fec_oc_period
, 0);
9500 pr_err("error %d\n", rc
);
9504 /* get constants needed for signal quality calculation */
9505 fec_rs_period
= ext_attr
->fec_rs_period
;
9506 fec_rs_prescale
= ext_attr
->fec_rs_prescale
;
9507 rs_bit_cnt
= fec_rs_period
* fec_rs_prescale
* ext_attr
->fec_rs_plen
;
9508 qam_vd_period
= ext_attr
->qam_vd_period
;
9509 qam_vd_prescale
= ext_attr
->qam_vd_prescale
;
9510 vd_bit_cnt
= qam_vd_period
* qam_vd_prescale
* ext_attr
->fec_vd_plen
;
9512 /* DRXJ_QAM_SL_SIG_POWER_QAMxxx * 4 */
9513 switch (constellation
) {
9514 case DRX_CONSTELLATION_QAM16
:
9515 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM16
<< 2;
9517 case DRX_CONSTELLATION_QAM32
:
9518 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM32
<< 2;
9520 case DRX_CONSTELLATION_QAM64
:
9521 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM64
<< 2;
9523 case DRX_CONSTELLATION_QAM128
:
9524 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM128
<< 2;
9526 case DRX_CONSTELLATION_QAM256
:
9527 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM256
<< 2;
9533 /* ------------------------------ */
9534 /* MER Calculation */
9535 /* ------------------------------ */
9536 /* MER is good if it is above 27.5 for QAM256 or 21.5 for QAM64 */
9538 /* 10.0*log10(qam_sl_sig_power * 4.0 / qam_sl_err_power); */
9539 if (qam_sl_err_power
== 0)
9542 qam_sl_mer
= log1_times100(qam_sl_sig_power
) - log1_times100((u32
)qam_sl_err_power
);
9544 /* ----------------------------------------- */
9545 /* Pre Viterbi Symbol Error Rate Calculation */
9546 /* ----------------------------------------- */
9547 /* pre viterbi SER is good if it is below 0.025 */
9549 /* get the register value */
9550 /* no of quadrature symbol errors */
9551 rc
= drxj_dap_read_reg16(dev_addr
, QAM_VD_NR_QSYM_ERRORS__A
, &qsym_err_vd
, 0);
9553 pr_err("error %d\n", rc
);
9556 /* Extract the Exponent and the Mantisa */
9557 /* of number of quadrature symbol errors */
9558 e
= (qsym_err_vd
& QAM_VD_NR_QSYM_ERRORS_EXP__M
) >>
9559 QAM_VD_NR_QSYM_ERRORS_EXP__B
;
9560 m
= (qsym_err_vd
& QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__M
) >>
9561 QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B
;
9563 if ((m
<< e
) >> 3 > 549752)
9564 qam_vd_ser
= 500000 * vd_bit_cnt
* ((e
> 2) ? 1 : 8) / 8;
9566 qam_vd_ser
= m
<< ((e
> 2) ? (e
- 3) : e
);
9568 /* --------------------------------------- */
9569 /* pre and post RedSolomon BER Calculation */
9570 /* --------------------------------------- */
9571 /* pre RS BER is good if it is below 3.5e-4 */
9573 /* get the register values */
9574 pre_bit_err_rs
= (u32
) measuredrs_errors
.nr_bit_errors
;
9575 pkt_errs
= post_bit_err_rs
= (u32
) measuredrs_errors
.nr_snc_par_fail_count
;
9577 /* Extract the Exponent and the Mantisa of the */
9578 /* pre Reed-Solomon bit error count */
9579 e
= (pre_bit_err_rs
& FEC_RS_NR_BIT_ERRORS_EXP__M
) >>
9580 FEC_RS_NR_BIT_ERRORS_EXP__B
;
9581 m
= (pre_bit_err_rs
& FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M
) >>
9582 FEC_RS_NR_BIT_ERRORS_FIXED_MANT__B
;
9586 /*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */
9587 if (m
> (rs_bit_cnt
>> (e
+ 1)) || (rs_bit_cnt
>> e
) == 0)
9588 qam_pre_rs_ber
= 500000 * rs_bit_cnt
>> e
;
9590 qam_pre_rs_ber
= ber_cnt
;
9592 /* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) / */
9593 /* (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A) */
9595 => c = (1000000*100*11.17)/1504 =
9596 post RS BER = (( c* FEC_OC_SNC_FAIL_COUNT__A) /
9597 (100 * FEC_OC_SNC_FAIL_PERIOD__A)
9598 *100 and /100 is for more precision.
9599 => (20 bits * 12 bits) /(16 bits * 7 bits) => safe in 32 bits computation
9601 Precision errors still possible.
9603 if (!fec_oc_period
) {
9604 qam_post_rs_ber
= 0xFFFFFFFF;
9606 e
= post_bit_err_rs
* 742686;
9607 m
= fec_oc_period
* 100;
9608 qam_post_rs_ber
= e
/ m
;
9611 /* fill signal quality data structure */
9612 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
9613 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
9614 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
9615 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
9616 p
->block_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
9617 p
->cnr
.stat
[0].scale
= FE_SCALE_DECIBEL
;
9619 p
->cnr
.stat
[0].svalue
= ((u16
) qam_sl_mer
) * 100;
9620 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
9621 p
->pre_bit_error
.stat
[0].uvalue
+= qam_vd_ser
;
9622 p
->pre_bit_count
.stat
[0].uvalue
+= vd_bit_cnt
* ((e
> 2) ? 1 : 8) / 8;
9624 p
->pre_bit_error
.stat
[0].uvalue
+= qam_pre_rs_ber
;
9625 p
->pre_bit_count
.stat
[0].uvalue
+= rs_bit_cnt
>> e
;
9628 p
->post_bit_error
.stat
[0].uvalue
+= qam_post_rs_ber
;
9629 p
->post_bit_count
.stat
[0].uvalue
+= rs_bit_cnt
>> e
;
9631 p
->block_error
.stat
[0].uvalue
+= pkt_errs
;
9633 #ifdef DRXJ_SIGNAL_ACCUM_ERR
9634 rc
= get_acc_pkt_err(demod
, &sig_quality
->packet_error
);
9636 pr_err("error %d\n", rc
);
9643 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9644 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9645 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9646 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9647 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9648 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9653 #endif /* #ifndef DRXJ_VSB_ONLY */
9655 /*============================================================================*/
9656 /*== END QAM DATAPATH FUNCTIONS ==*/
9657 /*============================================================================*/
9659 /*============================================================================*/
9660 /*============================================================================*/
9661 /*== ATV DATAPATH FUNCTIONS ==*/
9662 /*============================================================================*/
9663 /*============================================================================*/
9666 Implementation notes.
9670 Four AGCs are used for NTSC:
9671 (1) RF (used to attenuate the input signal in case of to much power)
9672 (2) IF (used to attenuate the input signal in case of to much power)
9673 (3) Video AGC (used to amplify the output signal in case input to low)
9674 (4) SIF AGC (used to amplify the output signal in case input to low)
9676 Video AGC is coupled to RF and IF. SIF AGC is not coupled. It is assumed
9677 that the coupling between Video AGC and the RF and IF AGCs also works in
9678 favor of the SIF AGC.
9680 Three AGCs are used for FM:
9681 (1) RF (used to attenuate the input signal in case of to much power)
9682 (2) IF (used to attenuate the input signal in case of to much power)
9683 (3) SIF AGC (used to amplify the output signal in case input to low)
9685 The SIF AGC is now coupled to the RF/IF AGCs.
9686 The SIF AGC is needed for both SIF ouput and the internal SIF signal to
9689 RF and IF AGCs DACs are part of AFE, Video and SIF AGC DACs are part of
9690 the ATV block. The AGC control algorithms are all implemented in
9695 (Shadow settings will not be used for now, they will be implemented
9696 later on because of the schedule)
9698 Several HW/SCU "settings" can be used for ATV. The standard selection
9699 will reset most of these settings. To avoid that the end user apllication
9700 has to perform these settings each time the ATV or FM standards is
9701 selected the driver will shadow these settings. This enables the end user
9702 to perform the settings only once after a drx_open(). The driver must
9703 write the shadow settings to HW/SCU incase:
9704 ( setstandard FM/ATV) ||
9705 ( settings have changed && FM/ATV standard is active)
9706 The shadow settings will be stored in the device specific data container.
9707 A set of flags will be defined to flag changes in shadow settings.
9708 A routine will be implemented to write all changed shadow settings to
9711 The "settings" will consist of: AGC settings, filter settings etc.
9713 Disadvantage of use of shadow settings:
9714 Direct changes in HW/SCU registers will not be reflected in the
9715 shadow settings and these changes will be overwritten during a next
9716 update. This can happen during evaluation. This will not be a problem
9717 for normal customer usage.
9719 /* -------------------------------------------------------------------------- */
9722 * \fn int power_down_atv ()
9723 * \brief Power down ATV.
9724 * \param demod instance of demodulator
9725 * \param standard either NTSC or FM (sub strandard for ATV )
9728 * Stops and thus resets ATV and IQM block
9729 * SIF and CVBS ADC are powered down
9730 * Calls audio power down
9733 power_down_atv(struct drx_demod_instance
*demod
, enum drx_standard standard
, bool primary
)
9735 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9736 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
9737 /* parameter_len */ 0,
9739 /* *parameter */ NULL
,
9747 /* Stop ATV SCU (will reset ATV and IQM hardware */
9748 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_ATV
|
9749 SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
9750 cmd_scu
.parameter_len
= 0;
9751 cmd_scu
.result_len
= 1;
9752 cmd_scu
.parameter
= NULL
;
9753 cmd_scu
.result
= &cmd_result
;
9754 rc
= scu_command(dev_addr
, &cmd_scu
);
9756 pr_err("error %d\n", rc
);
9759 /* Disable ATV outputs (ATV reset enables CVBS, undo this) */
9760 rc
= drxj_dap_write_reg16(dev_addr
, ATV_TOP_STDBY__A
, (ATV_TOP_STDBY_SIF_STDBY_STANDBY
& (~ATV_TOP_STDBY_CVBS_STDBY_A2_ACTIVE
)), 0);
9762 pr_err("error %d\n", rc
);
9766 rc
= drxj_dap_write_reg16(dev_addr
, ATV_COMM_EXEC__A
, ATV_COMM_EXEC_STOP
, 0);
9768 pr_err("error %d\n", rc
);
9772 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_STOP
, 0);
9774 pr_err("error %d\n", rc
);
9777 rc
= set_iqm_af(demod
, false);
9779 pr_err("error %d\n", rc
);
9783 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
9785 pr_err("error %d\n", rc
);
9788 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
9790 pr_err("error %d\n", rc
);
9793 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
9795 pr_err("error %d\n", rc
);
9798 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
9800 pr_err("error %d\n", rc
);
9803 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
9805 pr_err("error %d\n", rc
);
9809 rc
= power_down_aud(demod
);
9811 pr_err("error %d\n", rc
);
9820 /*============================================================================*/
9823 * \brief Power up AUD.
9824 * \param demod instance of demodulator
9828 static int power_down_aud(struct drx_demod_instance
*demod
)
9830 struct i2c_device_addr
*dev_addr
= NULL
;
9831 struct drxj_data
*ext_attr
= NULL
;
9834 dev_addr
= (struct i2c_device_addr
*)demod
->my_i2c_dev_addr
;
9835 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
9837 rc
= drxj_dap_write_reg16(dev_addr
, AUD_COMM_EXEC__A
, AUD_COMM_EXEC_STOP
, 0);
9839 pr_err("error %d\n", rc
);
9843 ext_attr
->aud_data
.audio_is_active
= false;
9851 * \fn int set_orx_nsu_aox()
9852 * \brief Configure OrxNsuAox for OOB
9853 * \param demod instance of demodulator.
9857 static int set_orx_nsu_aox(struct drx_demod_instance
*demod
, bool active
)
9859 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9863 /* Configure NSU_AOX */
9864 rc
= drxj_dap_read_reg16(dev_addr
, ORX_NSU_AOX_STDBY_W__A
, &data
, 0);
9866 pr_err("error %d\n", rc
);
9870 data
&= ((~ORX_NSU_AOX_STDBY_W_STDBYADC_A2_ON
) & (~ORX_NSU_AOX_STDBY_W_STDBYAMP_A2_ON
) & (~ORX_NSU_AOX_STDBY_W_STDBYBIAS_A2_ON
) & (~ORX_NSU_AOX_STDBY_W_STDBYPLL_A2_ON
) & (~ORX_NSU_AOX_STDBY_W_STDBYPD_A2_ON
) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_IF_A2_ON
) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_RF_A2_ON
) & (~ORX_NSU_AOX_STDBY_W_STDBYFLT_A2_ON
));
9872 data
|= (ORX_NSU_AOX_STDBY_W_STDBYADC_A2_ON
| ORX_NSU_AOX_STDBY_W_STDBYAMP_A2_ON
| ORX_NSU_AOX_STDBY_W_STDBYBIAS_A2_ON
| ORX_NSU_AOX_STDBY_W_STDBYPLL_A2_ON
| ORX_NSU_AOX_STDBY_W_STDBYPD_A2_ON
| ORX_NSU_AOX_STDBY_W_STDBYTAGC_IF_A2_ON
| ORX_NSU_AOX_STDBY_W_STDBYTAGC_RF_A2_ON
| ORX_NSU_AOX_STDBY_W_STDBYFLT_A2_ON
);
9873 rc
= drxj_dap_write_reg16(dev_addr
, ORX_NSU_AOX_STDBY_W__A
, data
, 0);
9875 pr_err("error %d\n", rc
);
9885 * \fn int ctrl_set_oob()
9886 * \brief Set OOB channel to be used.
9887 * \param demod instance of demodulator
9888 * \param oob_param OOB parameters for channel setting.
9889 * \frequency should be in KHz
9892 * Accepts only. Returns error otherwise.
9893 * Demapper value is written after scu_command START
9894 * because START command causes COMM_EXEC transition
9895 * from 0 to 1 which causes all registers to be
9896 * overwritten with initial value
9900 /* Nyquist filter impulse response */
9901 #define IMPULSE_COSINE_ALPHA_0_3 {-3, -4, -1, 6, 10, 7, -5, -20, -25, -10, 29, 79, 123, 140} /*sqrt raised-cosine filter with alpha=0.3 */
9902 #define IMPULSE_COSINE_ALPHA_0_5 { 2, 0, -2, -2, 2, 5, 2, -10, -20, -14, 20, 74, 125, 145} /*sqrt raised-cosine filter with alpha=0.5 */
9903 #define IMPULSE_COSINE_ALPHA_RO_0_5 { 0, 0, 1, 2, 3, 0, -7, -15, -16, 0, 34, 77, 114, 128} /*full raised-cosine filter with alpha=0.5 (receiver only) */
9905 /* Coefficients for the nyquist fitler (total: 27 taps) */
9906 #define NYQFILTERLEN 27
9908 static int ctrl_set_oob(struct drx_demod_instance
*demod
, struct drxoob
*oob_param
)
9911 s32 freq
= 0; /* KHz */
9912 struct i2c_device_addr
*dev_addr
= NULL
;
9913 struct drxj_data
*ext_attr
= NULL
;
9915 bool mirror_freq_spect_oob
= false;
9916 u16 trk_filter_value
= 0;
9917 struct drxjscu_cmd scu_cmd
;
9918 u16 set_param_parameters
[3];
9919 u16 cmd_result
[2] = { 0, 0 };
9920 s16 nyquist_coeffs
[4][(NYQFILTERLEN
+ 1) / 2] = {
9921 IMPULSE_COSINE_ALPHA_0_3
, /* Target Mode 0 */
9922 IMPULSE_COSINE_ALPHA_0_3
, /* Target Mode 1 */
9923 IMPULSE_COSINE_ALPHA_0_5
, /* Target Mode 2 */
9924 IMPULSE_COSINE_ALPHA_RO_0_5
/* Target Mode 3 */
9926 u8 mode_val
[4] = { 2, 2, 0, 1 };
9927 u8 pfi_coeffs
[4][6] = {
9928 {DRXJ_16TO8(-92), DRXJ_16TO8(-108), DRXJ_16TO8(100)}, /* TARGET_MODE = 0: PFI_A = -23/32; PFI_B = -54/32; PFI_C = 25/32; fg = 0.5 MHz (Att=26dB) */
9929 {DRXJ_16TO8(-64), DRXJ_16TO8(-80), DRXJ_16TO8(80)}, /* TARGET_MODE = 1: PFI_A = -16/32; PFI_B = -40/32; PFI_C = 20/32; fg = 1.0 MHz (Att=28dB) */
9930 {DRXJ_16TO8(-80), DRXJ_16TO8(-98), DRXJ_16TO8(92)}, /* TARGET_MODE = 2, 3: PFI_A = -20/32; PFI_B = -49/32; PFI_C = 23/32; fg = 0.8 MHz (Att=25dB) */
9931 {DRXJ_16TO8(-80), DRXJ_16TO8(-98), DRXJ_16TO8(92)} /* TARGET_MODE = 2, 3: PFI_A = -20/32; PFI_B = -49/32; PFI_C = 23/32; fg = 0.8 MHz (Att=25dB) */
9935 dev_addr
= demod
->my_i2c_dev_addr
;
9936 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
9937 mirror_freq_spect_oob
= ext_attr
->mirror_freq_spect_oob
;
9939 /* Check parameters */
9940 if (oob_param
== NULL
) {
9941 /* power off oob module */
9942 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
9943 | SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
9944 scu_cmd
.parameter_len
= 0;
9945 scu_cmd
.result_len
= 1;
9946 scu_cmd
.result
= cmd_result
;
9947 rc
= scu_command(dev_addr
, &scu_cmd
);
9949 pr_err("error %d\n", rc
);
9952 rc
= set_orx_nsu_aox(demod
, false);
9954 pr_err("error %d\n", rc
);
9957 rc
= drxj_dap_write_reg16(dev_addr
, ORX_COMM_EXEC__A
, ORX_COMM_EXEC_STOP
, 0);
9959 pr_err("error %d\n", rc
);
9963 ext_attr
->oob_power_on
= false;
9967 freq
= oob_param
->frequency
;
9968 if ((freq
< 70000) || (freq
> 130000))
9970 freq
= (freq
- 50000) / 50;
9975 u16
*trk_filtercfg
= ext_attr
->oob_trk_filter_cfg
;
9977 index
= (u16
) ((freq
- 400) / 200);
9978 remainder
= (u16
) ((freq
- 400) % 200);
9980 trk_filtercfg
[index
] - (trk_filtercfg
[index
] -
9981 trk_filtercfg
[index
+
9982 1]) / 10 * remainder
/
9989 rc
= drxj_dap_write_reg16(dev_addr
, ORX_COMM_EXEC__A
, ORX_COMM_EXEC_STOP
, 0);
9991 pr_err("error %d\n", rc
);
9994 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
9995 | SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
9996 scu_cmd
.parameter_len
= 0;
9997 scu_cmd
.result_len
= 1;
9998 scu_cmd
.result
= cmd_result
;
9999 rc
= scu_command(dev_addr
, &scu_cmd
);
10001 pr_err("error %d\n", rc
);
10007 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
10008 | SCU_RAM_COMMAND_CMD_DEMOD_RESET
;
10009 scu_cmd
.parameter_len
= 0;
10010 scu_cmd
.result_len
= 1;
10011 scu_cmd
.result
= cmd_result
;
10012 rc
= scu_command(dev_addr
, &scu_cmd
);
10014 pr_err("error %d\n", rc
);
10020 /* set frequency, spectrum inversion and data rate */
10021 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
10022 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV
;
10023 scu_cmd
.parameter_len
= 3;
10024 /* 1-data rate;2-frequency */
10025 switch (oob_param
->standard
) {
10026 case DRX_OOB_MODE_A
:
10028 /* signal is transmitted inverted */
10029 ((oob_param
->spectrum_inverted
== true) &&
10030 /* and tuner is not mirroring the signal */
10031 (!mirror_freq_spect_oob
)) |
10033 /* signal is transmitted noninverted */
10034 ((oob_param
->spectrum_inverted
== false) &&
10035 /* and tuner is mirroring the signal */
10036 (mirror_freq_spect_oob
))
10038 set_param_parameters
[0] =
10039 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_INVSPEC
;
10041 set_param_parameters
[0] =
10042 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_REGSPEC
;
10044 case DRX_OOB_MODE_B_GRADE_A
:
10046 /* signal is transmitted inverted */
10047 ((oob_param
->spectrum_inverted
== true) &&
10048 /* and tuner is not mirroring the signal */
10049 (!mirror_freq_spect_oob
)) |
10051 /* signal is transmitted noninverted */
10052 ((oob_param
->spectrum_inverted
== false) &&
10053 /* and tuner is mirroring the signal */
10054 (mirror_freq_spect_oob
))
10056 set_param_parameters
[0] =
10057 SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_INVSPEC
;
10059 set_param_parameters
[0] =
10060 SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_REGSPEC
;
10062 case DRX_OOB_MODE_B_GRADE_B
:
10065 /* signal is transmitted inverted */
10066 ((oob_param
->spectrum_inverted
== true) &&
10067 /* and tuner is not mirroring the signal */
10068 (!mirror_freq_spect_oob
)) |
10070 /* signal is transmitted noninverted */
10071 ((oob_param
->spectrum_inverted
== false) &&
10072 /* and tuner is mirroring the signal */
10073 (mirror_freq_spect_oob
))
10075 set_param_parameters
[0] =
10076 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_INVSPEC
;
10078 set_param_parameters
[0] =
10079 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_REGSPEC
;
10082 set_param_parameters
[1] = (u16
) (freq
& 0xFFFF);
10083 set_param_parameters
[2] = trk_filter_value
;
10084 scu_cmd
.parameter
= set_param_parameters
;
10085 scu_cmd
.result_len
= 1;
10086 scu_cmd
.result
= cmd_result
;
10087 mode_index
= mode_val
[(set_param_parameters
[0] & 0xC0) >> 6];
10088 rc
= scu_command(dev_addr
, &scu_cmd
);
10090 pr_err("error %d\n", rc
);
10094 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0xFABA, 0);
10096 pr_err("error %d\n", rc
);
10098 } /* Write magic word to enable pdr reg write */
10099 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_OOB_CRX_CFG__A
, OOB_CRX_DRIVE_STRENGTH
<< SIO_PDR_OOB_CRX_CFG_DRIVE__B
| 0x03 << SIO_PDR_OOB_CRX_CFG_MODE__B
, 0);
10101 pr_err("error %d\n", rc
);
10104 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_OOB_DRX_CFG__A
, OOB_DRX_DRIVE_STRENGTH
<< SIO_PDR_OOB_DRX_CFG_DRIVE__B
| 0x03 << SIO_PDR_OOB_DRX_CFG_MODE__B
, 0);
10106 pr_err("error %d\n", rc
);
10109 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
10111 pr_err("error %d\n", rc
);
10113 } /* Write magic word to disable pdr reg write */
10115 rc
= drxj_dap_write_reg16(dev_addr
, ORX_TOP_COMM_KEY__A
, 0, 0);
10117 pr_err("error %d\n", rc
);
10120 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_AAG_LEN_W__A
, 16000, 0);
10122 pr_err("error %d\n", rc
);
10125 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_AAG_THR_W__A
, 40, 0);
10127 pr_err("error %d\n", rc
);
10132 rc
= drxj_dap_write_reg16(dev_addr
, ORX_DDC_OFO_SET_W__A
, ORX_DDC_OFO_SET_W__PRE
, 0);
10134 pr_err("error %d\n", rc
);
10139 rc
= drxj_dap_write_reg16(dev_addr
, ORX_NSU_AOX_LOPOW_W__A
, ext_attr
->oob_lo_pow
, 0);
10141 pr_err("error %d\n", rc
);
10145 /* initialization for target mode */
10146 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TARGET_MODE__A
, SCU_RAM_ORX_TARGET_MODE_2048KBPS_SQRT
, 0);
10148 pr_err("error %d\n", rc
);
10151 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FREQ_GAIN_CORR__A
, SCU_RAM_ORX_FREQ_GAIN_CORR_2048KBPS
, 0);
10153 pr_err("error %d\n", rc
);
10157 /* Reset bits for timing and freq. recovery */
10158 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_RST_CPH__A
, 0x0001, 0);
10160 pr_err("error %d\n", rc
);
10163 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_RST_CTI__A
, 0x0002, 0);
10165 pr_err("error %d\n", rc
);
10168 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_RST_KRN__A
, 0x0004, 0);
10170 pr_err("error %d\n", rc
);
10173 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_RST_KRP__A
, 0x0008, 0);
10175 pr_err("error %d\n", rc
);
10179 /* AGN_LOCK = {2048>>3, -2048, 8, -8, 0, 1}; */
10180 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_LOCK_TH__A
, 2048 >> 3, 0);
10182 pr_err("error %d\n", rc
);
10185 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_LOCK_TOTH__A
, (u16
)(-2048), 0);
10187 pr_err("error %d\n", rc
);
10190 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_ONLOCK_TTH__A
, 8, 0);
10192 pr_err("error %d\n", rc
);
10195 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_UNLOCK_TTH__A
, (u16
)(-8), 0);
10197 pr_err("error %d\n", rc
);
10200 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_LOCK_MASK__A
, 1, 0);
10202 pr_err("error %d\n", rc
);
10206 /* DGN_LOCK = {10, -2048, 8, -8, 0, 1<<1}; */
10207 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_LOCK_TH__A
, 10, 0);
10209 pr_err("error %d\n", rc
);
10212 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_LOCK_TOTH__A
, (u16
)(-2048), 0);
10214 pr_err("error %d\n", rc
);
10217 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_ONLOCK_TTH__A
, 8, 0);
10219 pr_err("error %d\n", rc
);
10222 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_UNLOCK_TTH__A
, (u16
)(-8), 0);
10224 pr_err("error %d\n", rc
);
10227 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_LOCK_MASK__A
, 1 << 1, 0);
10229 pr_err("error %d\n", rc
);
10233 /* FRQ_LOCK = {15,-2048, 8, -8, 0, 1<<2}; */
10234 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_LOCK_TH__A
, 17, 0);
10236 pr_err("error %d\n", rc
);
10239 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_LOCK_TOTH__A
, (u16
)(-2048), 0);
10241 pr_err("error %d\n", rc
);
10244 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_ONLOCK_TTH__A
, 8, 0);
10246 pr_err("error %d\n", rc
);
10249 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_UNLOCK_TTH__A
, (u16
)(-8), 0);
10251 pr_err("error %d\n", rc
);
10254 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_LOCK_MASK__A
, 1 << 2, 0);
10256 pr_err("error %d\n", rc
);
10260 /* PHA_LOCK = {5000, -2048, 8, -8, 0, 1<<3}; */
10261 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_LOCK_TH__A
, 3000, 0);
10263 pr_err("error %d\n", rc
);
10266 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_LOCK_TOTH__A
, (u16
)(-2048), 0);
10268 pr_err("error %d\n", rc
);
10271 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_ONLOCK_TTH__A
, 8, 0);
10273 pr_err("error %d\n", rc
);
10276 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_UNLOCK_TTH__A
, (u16
)(-8), 0);
10278 pr_err("error %d\n", rc
);
10281 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_LOCK_MASK__A
, 1 << 3, 0);
10283 pr_err("error %d\n", rc
);
10287 /* TIM_LOCK = {300, -2048, 8, -8, 0, 1<<4}; */
10288 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_LOCK_TH__A
, 400, 0);
10290 pr_err("error %d\n", rc
);
10293 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_LOCK_TOTH__A
, (u16
)(-2048), 0);
10295 pr_err("error %d\n", rc
);
10298 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_ONLOCK_TTH__A
, 8, 0);
10300 pr_err("error %d\n", rc
);
10303 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_UNLOCK_TTH__A
, (u16
)(-8), 0);
10305 pr_err("error %d\n", rc
);
10308 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_LOCK_MASK__A
, 1 << 4, 0);
10310 pr_err("error %d\n", rc
);
10314 /* EQU_LOCK = {20, -2048, 8, -8, 0, 1<<5}; */
10315 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_LOCK_TH__A
, 20, 0);
10317 pr_err("error %d\n", rc
);
10320 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_LOCK_TOTH__A
, (u16
)(-2048), 0);
10322 pr_err("error %d\n", rc
);
10325 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_ONLOCK_TTH__A
, 4, 0);
10327 pr_err("error %d\n", rc
);
10330 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_UNLOCK_TTH__A
, (u16
)(-4), 0);
10332 pr_err("error %d\n", rc
);
10335 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_LOCK_MASK__A
, 1 << 5, 0);
10337 pr_err("error %d\n", rc
);
10341 /* PRE-Filter coefficients (PFI) */
10342 rc
= drxdap_fasi_write_block(dev_addr
, ORX_FWP_PFI_A_W__A
, sizeof(pfi_coeffs
[mode_index
]), ((u8
*)pfi_coeffs
[mode_index
]), 0);
10344 pr_err("error %d\n", rc
);
10347 rc
= drxj_dap_write_reg16(dev_addr
, ORX_TOP_MDE_W__A
, mode_index
, 0);
10349 pr_err("error %d\n", rc
);
10353 /* NYQUIST-Filter coefficients (NYQ) */
10354 for (i
= 0; i
< (NYQFILTERLEN
+ 1) / 2; i
++) {
10355 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_NYQ_ADR_W__A
, i
, 0);
10357 pr_err("error %d\n", rc
);
10360 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_NYQ_COF_RW__A
, nyquist_coeffs
[mode_index
][i
], 0);
10362 pr_err("error %d\n", rc
);
10366 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_NYQ_ADR_W__A
, 31, 0);
10368 pr_err("error %d\n", rc
);
10371 rc
= drxj_dap_write_reg16(dev_addr
, ORX_COMM_EXEC__A
, ORX_COMM_EXEC_ACTIVE
, 0);
10373 pr_err("error %d\n", rc
);
10379 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
10380 | SCU_RAM_COMMAND_CMD_DEMOD_START
;
10381 scu_cmd
.parameter_len
= 0;
10382 scu_cmd
.result_len
= 1;
10383 scu_cmd
.result
= cmd_result
;
10384 rc
= scu_command(dev_addr
, &scu_cmd
);
10386 pr_err("error %d\n", rc
);
10390 rc
= set_orx_nsu_aox(demod
, true);
10392 pr_err("error %d\n", rc
);
10395 rc
= drxj_dap_write_reg16(dev_addr
, ORX_NSU_AOX_STHR_W__A
, ext_attr
->oob_pre_saw
, 0);
10397 pr_err("error %d\n", rc
);
10401 ext_attr
->oob_power_on
= true;
10408 /*============================================================================*/
10409 /*== END OOB DATAPATH FUNCTIONS ==*/
10410 /*============================================================================*/
10412 /*=============================================================================
10413 ===== MC command related functions ==========================================
10414 ===========================================================================*/
10416 /*=============================================================================
10417 ===== ctrl_set_channel() ==========================================================
10418 ===========================================================================*/
10420 * \fn int ctrl_set_channel()
10421 * \brief Select a new transmission channel.
10422 * \param demod instance of demod.
10423 * \param channel Pointer to channel data.
10426 * In case the tuner module is not used and in case of NTSC/FM the pogrammer
10427 * must tune the tuner to the centre frequency of the NTSC/FM channel.
10431 ctrl_set_channel(struct drx_demod_instance
*demod
, struct drx_channel
*channel
)
10434 s32 tuner_freq_offset
= 0;
10435 struct drxj_data
*ext_attr
= NULL
;
10436 struct i2c_device_addr
*dev_addr
= NULL
;
10437 enum drx_standard standard
= DRX_STANDARD_UNKNOWN
;
10438 #ifndef DRXJ_VSB_ONLY
10439 u32 min_symbol_rate
= 0;
10440 u32 max_symbol_rate
= 0;
10441 int bandwidth_temp
= 0;
10444 /*== check arguments ======================================================*/
10445 if ((demod
== NULL
) || (channel
== NULL
))
10448 dev_addr
= demod
->my_i2c_dev_addr
;
10449 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
10450 standard
= ext_attr
->standard
;
10452 /* check valid standards */
10453 switch (standard
) {
10454 case DRX_STANDARD_8VSB
:
10455 #ifndef DRXJ_VSB_ONLY
10456 case DRX_STANDARD_ITU_A
:
10457 case DRX_STANDARD_ITU_B
:
10458 case DRX_STANDARD_ITU_C
:
10459 #endif /* DRXJ_VSB_ONLY */
10461 case DRX_STANDARD_UNKNOWN
:
10466 /* check bandwidth QAM annex B, NTSC and 8VSB */
10467 if ((standard
== DRX_STANDARD_ITU_B
) ||
10468 (standard
== DRX_STANDARD_8VSB
) ||
10469 (standard
== DRX_STANDARD_NTSC
)) {
10470 switch (channel
->bandwidth
) {
10471 case DRX_BANDWIDTH_6MHZ
:
10472 case DRX_BANDWIDTH_UNKNOWN
: /* fall through */
10473 channel
->bandwidth
= DRX_BANDWIDTH_6MHZ
;
10475 case DRX_BANDWIDTH_8MHZ
: /* fall through */
10476 case DRX_BANDWIDTH_7MHZ
: /* fall through */
10482 /* For QAM annex A and annex C:
10483 -check symbolrate and constellation
10484 -derive bandwidth from symbolrate (input bandwidth is ignored)
10486 #ifndef DRXJ_VSB_ONLY
10487 if ((standard
== DRX_STANDARD_ITU_A
) ||
10488 (standard
== DRX_STANDARD_ITU_C
)) {
10489 struct drxuio_cfg uio_cfg
= { DRX_UIO1
, DRX_UIO_MODE_FIRMWARE_SAW
};
10490 int bw_rolloff_factor
= 0;
10492 bw_rolloff_factor
= (standard
== DRX_STANDARD_ITU_A
) ? 115 : 113;
10493 min_symbol_rate
= DRXJ_QAM_SYMBOLRATE_MIN
;
10494 max_symbol_rate
= DRXJ_QAM_SYMBOLRATE_MAX
;
10495 /* config SMA_TX pin to SAW switch mode */
10496 rc
= ctrl_set_uio_cfg(demod
, &uio_cfg
);
10498 pr_err("error %d\n", rc
);
10502 if (channel
->symbolrate
< min_symbol_rate
||
10503 channel
->symbolrate
> max_symbol_rate
) {
10507 switch (channel
->constellation
) {
10508 case DRX_CONSTELLATION_QAM16
: /* fall through */
10509 case DRX_CONSTELLATION_QAM32
: /* fall through */
10510 case DRX_CONSTELLATION_QAM64
: /* fall through */
10511 case DRX_CONSTELLATION_QAM128
: /* fall through */
10512 case DRX_CONSTELLATION_QAM256
:
10513 bandwidth_temp
= channel
->symbolrate
* bw_rolloff_factor
;
10514 bandwidth
= bandwidth_temp
/ 100;
10516 if ((bandwidth_temp
% 100) >= 50)
10519 if (bandwidth
<= 6100000) {
10520 channel
->bandwidth
= DRX_BANDWIDTH_6MHZ
;
10521 } else if ((bandwidth
> 6100000)
10522 && (bandwidth
<= 7100000)) {
10523 channel
->bandwidth
= DRX_BANDWIDTH_7MHZ
;
10524 } else if (bandwidth
> 7100000) {
10525 channel
->bandwidth
= DRX_BANDWIDTH_8MHZ
;
10533 /* For QAM annex B:
10534 -check constellation
10536 if (standard
== DRX_STANDARD_ITU_B
) {
10537 switch (channel
->constellation
) {
10538 case DRX_CONSTELLATION_AUTO
:
10539 case DRX_CONSTELLATION_QAM256
:
10540 case DRX_CONSTELLATION_QAM64
:
10546 switch (channel
->interleavemode
) {
10547 case DRX_INTERLEAVEMODE_I128_J1
:
10548 case DRX_INTERLEAVEMODE_I128_J1_V2
:
10549 case DRX_INTERLEAVEMODE_I128_J2
:
10550 case DRX_INTERLEAVEMODE_I64_J2
:
10551 case DRX_INTERLEAVEMODE_I128_J3
:
10552 case DRX_INTERLEAVEMODE_I32_J4
:
10553 case DRX_INTERLEAVEMODE_I128_J4
:
10554 case DRX_INTERLEAVEMODE_I16_J8
:
10555 case DRX_INTERLEAVEMODE_I128_J5
:
10556 case DRX_INTERLEAVEMODE_I8_J16
:
10557 case DRX_INTERLEAVEMODE_I128_J6
:
10558 case DRX_INTERLEAVEMODE_I128_J7
:
10559 case DRX_INTERLEAVEMODE_I128_J8
:
10560 case DRX_INTERLEAVEMODE_I12_J17
:
10561 case DRX_INTERLEAVEMODE_I5_J4
:
10562 case DRX_INTERLEAVEMODE_B52_M240
:
10563 case DRX_INTERLEAVEMODE_B52_M720
:
10564 case DRX_INTERLEAVEMODE_UNKNOWN
:
10565 case DRX_INTERLEAVEMODE_AUTO
:
10572 if ((ext_attr
->uio_sma_tx_mode
) == DRX_UIO_MODE_FIRMWARE_SAW
) {
10573 /* SAW SW, user UIO is used for switchable SAW */
10574 struct drxuio_data uio1
= { DRX_UIO1
, false };
10576 switch (channel
->bandwidth
) {
10577 case DRX_BANDWIDTH_8MHZ
:
10580 case DRX_BANDWIDTH_7MHZ
:
10581 uio1
.value
= false;
10583 case DRX_BANDWIDTH_6MHZ
:
10584 uio1
.value
= false;
10586 case DRX_BANDWIDTH_UNKNOWN
:
10591 rc
= ctrl_uio_write(demod
, &uio1
);
10593 pr_err("error %d\n", rc
);
10597 #endif /* DRXJ_VSB_ONLY */
10598 rc
= drxj_dap_write_reg16(dev_addr
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
, 0);
10600 pr_err("error %d\n", rc
);
10604 tuner_freq_offset
= 0;
10606 /*== Setup demod for specific standard ====================================*/
10607 switch (standard
) {
10608 case DRX_STANDARD_8VSB
:
10609 if (channel
->mirror
== DRX_MIRROR_AUTO
)
10610 ext_attr
->mirror
= DRX_MIRROR_NO
;
10612 ext_attr
->mirror
= channel
->mirror
;
10613 rc
= set_vsb(demod
);
10615 pr_err("error %d\n", rc
);
10618 rc
= set_frequency(demod
, channel
, tuner_freq_offset
);
10620 pr_err("error %d\n", rc
);
10624 #ifndef DRXJ_VSB_ONLY
10625 case DRX_STANDARD_ITU_A
: /* fallthrough */
10626 case DRX_STANDARD_ITU_B
: /* fallthrough */
10627 case DRX_STANDARD_ITU_C
:
10628 rc
= set_qam_channel(demod
, channel
, tuner_freq_offset
);
10630 pr_err("error %d\n", rc
);
10635 case DRX_STANDARD_UNKNOWN
:
10640 /* flag the packet error counter reset */
10641 ext_attr
->reset_pkt_err_acc
= true;
10648 /*=============================================================================
10649 ===== SigQuality() ==========================================================
10650 ===========================================================================*/
10653 * \fn int ctrl_sig_quality()
10654 * \brief Retrieve signal quality form device.
10655 * \param devmod Pointer to demodulator instance.
10656 * \param sig_quality Pointer to signal quality data.
10658 * \retval 0 sig_quality contains valid data.
10659 * \retval -EINVAL sig_quality is NULL.
10660 * \retval -EIO Erroneous data, sig_quality contains invalid data.
10664 ctrl_sig_quality(struct drx_demod_instance
*demod
,
10665 enum drx_lock_status lock_status
)
10667 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
10668 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
10669 struct drx39xxj_state
*state
= dev_addr
->user_data
;
10670 struct dtv_frontend_properties
*p
= &state
->frontend
.dtv_property_cache
;
10671 enum drx_standard standard
= ext_attr
->standard
;
10673 u32 ber
, cnt
, err
, pkt
;
10674 u16 mer
, strength
= 0;
10676 rc
= get_sig_strength(demod
, &strength
);
10678 pr_err("error getting signal strength %d\n", rc
);
10679 p
->strength
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10681 p
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
10682 p
->strength
.stat
[0].uvalue
= 65535UL * strength
/ 100;
10685 switch (standard
) {
10686 case DRX_STANDARD_8VSB
:
10687 #ifdef DRXJ_SIGNAL_ACCUM_ERR
10688 rc
= get_acc_pkt_err(demod
, &pkt
);
10690 pr_err("error %d\n", rc
);
10694 if (lock_status
!= DRXJ_DEMOD_LOCK
&& lock_status
!= DRX_LOCKED
) {
10695 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10696 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10697 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10698 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10699 p
->block_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10700 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10701 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10703 rc
= get_vsb_post_rs_pck_err(dev_addr
, &err
, &pkt
);
10705 pr_err("error %d getting UCB\n", rc
);
10706 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10708 p
->block_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
10709 p
->block_error
.stat
[0].uvalue
+= err
;
10710 p
->block_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
10711 p
->block_count
.stat
[0].uvalue
+= pkt
;
10714 /* PostViterbi is compute in steps of 10^(-6) */
10715 rc
= get_vs_bpre_viterbi_ber(dev_addr
, &ber
, &cnt
);
10717 pr_err("error %d getting pre-ber\n", rc
);
10718 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10720 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
10721 p
->pre_bit_error
.stat
[0].uvalue
+= ber
;
10722 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
10723 p
->pre_bit_count
.stat
[0].uvalue
+= cnt
;
10726 rc
= get_vs_bpost_viterbi_ber(dev_addr
, &ber
, &cnt
);
10728 pr_err("error %d getting post-ber\n", rc
);
10729 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10731 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
10732 p
->post_bit_error
.stat
[0].uvalue
+= ber
;
10733 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
10734 p
->post_bit_count
.stat
[0].uvalue
+= cnt
;
10736 rc
= get_vsbmer(dev_addr
, &mer
);
10738 pr_err("error %d getting MER\n", rc
);
10739 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10741 p
->cnr
.stat
[0].svalue
= mer
* 100;
10742 p
->cnr
.stat
[0].scale
= FE_SCALE_DECIBEL
;
10746 #ifndef DRXJ_VSB_ONLY
10747 case DRX_STANDARD_ITU_A
:
10748 case DRX_STANDARD_ITU_B
:
10749 case DRX_STANDARD_ITU_C
:
10750 rc
= ctrl_get_qam_sig_quality(demod
);
10752 pr_err("error %d\n", rc
);
10766 /*============================================================================*/
10769 * \fn int ctrl_lock_status()
10770 * \brief Retrieve lock status .
10771 * \param dev_addr Pointer to demodulator device address.
10772 * \param lock_stat Pointer to lock status structure.
10777 ctrl_lock_status(struct drx_demod_instance
*demod
, enum drx_lock_status
*lock_stat
)
10779 enum drx_standard standard
= DRX_STANDARD_UNKNOWN
;
10780 struct drxj_data
*ext_attr
= NULL
;
10781 struct i2c_device_addr
*dev_addr
= NULL
;
10782 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
10783 /* parameter_len */ 0,
10784 /* result_len */ 0,
10785 /* *parameter */ NULL
,
10789 u16 cmd_result
[2] = { 0, 0 };
10790 u16 demod_lock
= SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_DEMOD_LOCKED
;
10792 /* check arguments */
10793 if ((demod
== NULL
) || (lock_stat
== NULL
))
10796 dev_addr
= demod
->my_i2c_dev_addr
;
10797 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
10798 standard
= ext_attr
->standard
;
10800 *lock_stat
= DRX_NOT_LOCKED
;
10802 /* define the SCU command code */
10803 switch (standard
) {
10804 case DRX_STANDARD_8VSB
:
10805 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
|
10806 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK
;
10809 #ifndef DRXJ_VSB_ONLY
10810 case DRX_STANDARD_ITU_A
:
10811 case DRX_STANDARD_ITU_B
:
10812 case DRX_STANDARD_ITU_C
:
10813 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
10814 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK
;
10817 case DRX_STANDARD_UNKNOWN
: /* fallthrough */
10822 /* define the SCU command parameters and execute the command */
10823 cmd_scu
.parameter_len
= 0;
10824 cmd_scu
.result_len
= 2;
10825 cmd_scu
.parameter
= NULL
;
10826 cmd_scu
.result
= cmd_result
;
10827 rc
= scu_command(dev_addr
, &cmd_scu
);
10829 pr_err("error %d\n", rc
);
10833 /* set the lock status */
10834 if (cmd_scu
.result
[1] < demod_lock
) {
10835 /* 0x0000 NOT LOCKED */
10836 *lock_stat
= DRX_NOT_LOCKED
;
10837 } else if (cmd_scu
.result
[1] < SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_LOCKED
) {
10838 *lock_stat
= DRXJ_DEMOD_LOCK
;
10839 } else if (cmd_scu
.result
[1] <
10840 SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_NEVER_LOCK
) {
10841 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
10842 *lock_stat
= DRX_LOCKED
;
10844 /* 0xC000 NEVER LOCKED */
10845 /* (system will never be able to lock to the signal) */
10846 *lock_stat
= DRX_NEVER_LOCK
;
10854 /*============================================================================*/
10857 * \fn int ctrl_set_standard()
10858 * \brief Set modulation standard to be used.
10859 * \param standard Modulation standard.
10862 * Setup stuff for the desired demodulation standard.
10863 * Disable and power down the previous selected demodulation standard
10867 ctrl_set_standard(struct drx_demod_instance
*demod
, enum drx_standard
*standard
)
10869 struct drxj_data
*ext_attr
= NULL
;
10871 enum drx_standard prev_standard
;
10873 /* check arguments */
10874 if ((standard
== NULL
) || (demod
== NULL
))
10877 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
10878 prev_standard
= ext_attr
->standard
;
10881 Stop and power down previous standard
10883 switch (prev_standard
) {
10884 #ifndef DRXJ_VSB_ONLY
10885 case DRX_STANDARD_ITU_A
: /* fallthrough */
10886 case DRX_STANDARD_ITU_B
: /* fallthrough */
10887 case DRX_STANDARD_ITU_C
:
10888 rc
= power_down_qam(demod
, false);
10890 pr_err("error %d\n", rc
);
10895 case DRX_STANDARD_8VSB
:
10896 rc
= power_down_vsb(demod
, false);
10898 pr_err("error %d\n", rc
);
10902 case DRX_STANDARD_UNKNOWN
:
10905 case DRX_STANDARD_AUTO
: /* fallthrough */
10911 Initialize channel independent registers
10912 Power up new standard
10914 ext_attr
->standard
= *standard
;
10916 switch (*standard
) {
10917 #ifndef DRXJ_VSB_ONLY
10918 case DRX_STANDARD_ITU_A
: /* fallthrough */
10919 case DRX_STANDARD_ITU_B
: /* fallthrough */
10920 case DRX_STANDARD_ITU_C
:
10923 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SCU_RAM_VERSION_HI__A
, &dummy
, 0);
10925 pr_err("error %d\n", rc
);
10931 case DRX_STANDARD_8VSB
:
10932 rc
= set_vsb_leak_n_gain(demod
);
10934 pr_err("error %d\n", rc
);
10939 ext_attr
->standard
= DRX_STANDARD_UNKNOWN
;
10946 /* Don't know what the standard is now ... try again */
10947 ext_attr
->standard
= DRX_STANDARD_UNKNOWN
;
10951 /*============================================================================*/
10953 static void drxj_reset_mode(struct drxj_data
*ext_attr
)
10955 /* Initialize default AFE configuartion for QAM */
10956 if (ext_attr
->has_lna
) {
10957 /* IF AGC off, PGA active */
10958 #ifndef DRXJ_VSB_ONLY
10959 ext_attr
->qam_if_agc_cfg
.standard
= DRX_STANDARD_ITU_B
;
10960 ext_attr
->qam_if_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_OFF
;
10961 ext_attr
->qam_pga_cfg
= 140 + (11 * 13);
10963 ext_attr
->vsb_if_agc_cfg
.standard
= DRX_STANDARD_8VSB
;
10964 ext_attr
->vsb_if_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_OFF
;
10965 ext_attr
->vsb_pga_cfg
= 140 + (11 * 13);
10967 /* IF AGC on, PGA not active */
10968 #ifndef DRXJ_VSB_ONLY
10969 ext_attr
->qam_if_agc_cfg
.standard
= DRX_STANDARD_ITU_B
;
10970 ext_attr
->qam_if_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_AUTO
;
10971 ext_attr
->qam_if_agc_cfg
.min_output_level
= 0;
10972 ext_attr
->qam_if_agc_cfg
.max_output_level
= 0x7FFF;
10973 ext_attr
->qam_if_agc_cfg
.speed
= 3;
10974 ext_attr
->qam_if_agc_cfg
.top
= 1297;
10975 ext_attr
->qam_pga_cfg
= 140;
10977 ext_attr
->vsb_if_agc_cfg
.standard
= DRX_STANDARD_8VSB
;
10978 ext_attr
->vsb_if_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_AUTO
;
10979 ext_attr
->vsb_if_agc_cfg
.min_output_level
= 0;
10980 ext_attr
->vsb_if_agc_cfg
.max_output_level
= 0x7FFF;
10981 ext_attr
->vsb_if_agc_cfg
.speed
= 3;
10982 ext_attr
->vsb_if_agc_cfg
.top
= 1024;
10983 ext_attr
->vsb_pga_cfg
= 140;
10985 /* TODO: remove min_output_level and max_output_level for both QAM and VSB after */
10986 /* mc has not used them */
10987 #ifndef DRXJ_VSB_ONLY
10988 ext_attr
->qam_rf_agc_cfg
.standard
= DRX_STANDARD_ITU_B
;
10989 ext_attr
->qam_rf_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_AUTO
;
10990 ext_attr
->qam_rf_agc_cfg
.min_output_level
= 0;
10991 ext_attr
->qam_rf_agc_cfg
.max_output_level
= 0x7FFF;
10992 ext_attr
->qam_rf_agc_cfg
.speed
= 3;
10993 ext_attr
->qam_rf_agc_cfg
.top
= 9500;
10994 ext_attr
->qam_rf_agc_cfg
.cut_off_current
= 4000;
10995 ext_attr
->qam_pre_saw_cfg
.standard
= DRX_STANDARD_ITU_B
;
10996 ext_attr
->qam_pre_saw_cfg
.reference
= 0x07;
10997 ext_attr
->qam_pre_saw_cfg
.use_pre_saw
= true;
10999 /* Initialize default AFE configuartion for VSB */
11000 ext_attr
->vsb_rf_agc_cfg
.standard
= DRX_STANDARD_8VSB
;
11001 ext_attr
->vsb_rf_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_AUTO
;
11002 ext_attr
->vsb_rf_agc_cfg
.min_output_level
= 0;
11003 ext_attr
->vsb_rf_agc_cfg
.max_output_level
= 0x7FFF;
11004 ext_attr
->vsb_rf_agc_cfg
.speed
= 3;
11005 ext_attr
->vsb_rf_agc_cfg
.top
= 9500;
11006 ext_attr
->vsb_rf_agc_cfg
.cut_off_current
= 4000;
11007 ext_attr
->vsb_pre_saw_cfg
.standard
= DRX_STANDARD_8VSB
;
11008 ext_attr
->vsb_pre_saw_cfg
.reference
= 0x07;
11009 ext_attr
->vsb_pre_saw_cfg
.use_pre_saw
= true;
11013 * \fn int ctrl_power_mode()
11014 * \brief Set the power mode of the device to the specified power mode
11015 * \param demod Pointer to demodulator instance.
11016 * \param mode Pointer to new power mode.
11018 * \retval 0 Success
11019 * \retval -EIO I2C error or other failure
11020 * \retval -EINVAL Invalid mode argument.
11025 ctrl_power_mode(struct drx_demod_instance
*demod
, enum drx_power_mode
*mode
)
11027 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) NULL
;
11028 struct drxj_data
*ext_attr
= (struct drxj_data
*) NULL
;
11029 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)NULL
;
11031 u16 sio_cc_pwd_mode
= 0;
11033 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
11034 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
11035 dev_addr
= demod
->my_i2c_dev_addr
;
11037 /* Check arguments */
11041 /* If already in requested power mode, do nothing */
11042 if (common_attr
->current_power_mode
== *mode
)
11047 case DRXJ_POWER_DOWN_MAIN_PATH
:
11048 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_NONE
;
11050 case DRXJ_POWER_DOWN_CORE
:
11051 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_CLOCK
;
11053 case DRXJ_POWER_DOWN_PLL
:
11054 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_PLL
;
11056 case DRX_POWER_DOWN
:
11057 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_OSC
;
11060 /* Unknow sleep mode */
11065 /* Check if device needs to be powered up */
11066 if ((common_attr
->current_power_mode
!= DRX_POWER_UP
)) {
11067 rc
= power_up_device(demod
);
11069 pr_err("error %d\n", rc
);
11074 if ((*mode
== DRX_POWER_UP
)) {
11075 /* Restore analog & pin configuartion */
11077 /* Initialize default AFE configuartion for VSB */
11078 drxj_reset_mode(ext_attr
);
11080 /* Power down to requested mode */
11081 /* Backup some register settings */
11082 /* Set pins with possible pull-ups connected to them in input mode */
11083 /* Analog power down */
11084 /* ADC power down */
11085 /* Power down device */
11086 /* stop all comm_exec */
11088 Stop and power down previous standard
11091 switch (ext_attr
->standard
) {
11092 case DRX_STANDARD_ITU_A
:
11093 case DRX_STANDARD_ITU_B
:
11094 case DRX_STANDARD_ITU_C
:
11095 rc
= power_down_qam(demod
, true);
11097 pr_err("error %d\n", rc
);
11101 case DRX_STANDARD_8VSB
:
11102 rc
= power_down_vsb(demod
, true);
11104 pr_err("error %d\n", rc
);
11108 case DRX_STANDARD_PAL_SECAM_BG
: /* fallthrough */
11109 case DRX_STANDARD_PAL_SECAM_DK
: /* fallthrough */
11110 case DRX_STANDARD_PAL_SECAM_I
: /* fallthrough */
11111 case DRX_STANDARD_PAL_SECAM_L
: /* fallthrough */
11112 case DRX_STANDARD_PAL_SECAM_LP
: /* fallthrough */
11113 case DRX_STANDARD_NTSC
: /* fallthrough */
11114 case DRX_STANDARD_FM
:
11115 rc
= power_down_atv(demod
, ext_attr
->standard
, true);
11117 pr_err("error %d\n", rc
);
11121 case DRX_STANDARD_UNKNOWN
:
11124 case DRX_STANDARD_AUTO
: /* fallthrough */
11128 ext_attr
->standard
= DRX_STANDARD_UNKNOWN
;
11131 if (*mode
!= DRXJ_POWER_DOWN_MAIN_PATH
) {
11132 rc
= drxj_dap_write_reg16(dev_addr
, SIO_CC_PWD_MODE__A
, sio_cc_pwd_mode
, 0);
11134 pr_err("error %d\n", rc
);
11137 rc
= drxj_dap_write_reg16(dev_addr
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
, 0);
11139 pr_err("error %d\n", rc
);
11143 if ((*mode
!= DRX_POWER_UP
)) {
11144 /* Initialize HI, wakeup key especially before put IC to sleep */
11145 rc
= init_hi(demod
);
11147 pr_err("error %d\n", rc
);
11151 ext_attr
->hi_cfg_ctrl
|= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
;
11152 rc
= hi_cfg_command(demod
);
11154 pr_err("error %d\n", rc
);
11160 common_attr
->current_power_mode
= *mode
;
11167 /*============================================================================*/
11168 /*== CTRL Set/Get Config related functions ===================================*/
11169 /*============================================================================*/
11172 * \fn int ctrl_set_cfg_pre_saw()
11173 * \brief Set Pre-saw reference.
11174 * \param demod demod instance
11179 * Dispatch handling to standard specific function.
11183 ctrl_set_cfg_pre_saw(struct drx_demod_instance
*demod
, struct drxj_cfg_pre_saw
*pre_saw
)
11185 struct i2c_device_addr
*dev_addr
= NULL
;
11186 struct drxj_data
*ext_attr
= NULL
;
11189 dev_addr
= demod
->my_i2c_dev_addr
;
11190 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
11192 /* check arguments */
11193 if ((pre_saw
== NULL
) || (pre_saw
->reference
> IQM_AF_PDREF__M
)
11198 /* Only if standard is currently active */
11199 if ((ext_attr
->standard
== pre_saw
->standard
) ||
11200 (DRXJ_ISQAMSTD(ext_attr
->standard
) &&
11201 DRXJ_ISQAMSTD(pre_saw
->standard
)) ||
11202 (DRXJ_ISATVSTD(ext_attr
->standard
) &&
11203 DRXJ_ISATVSTD(pre_saw
->standard
))) {
11204 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_PDREF__A
, pre_saw
->reference
, 0);
11206 pr_err("error %d\n", rc
);
11211 /* Store pre-saw settings */
11212 switch (pre_saw
->standard
) {
11213 case DRX_STANDARD_8VSB
:
11214 ext_attr
->vsb_pre_saw_cfg
= *pre_saw
;
11216 #ifndef DRXJ_VSB_ONLY
11217 case DRX_STANDARD_ITU_A
: /* fallthrough */
11218 case DRX_STANDARD_ITU_B
: /* fallthrough */
11219 case DRX_STANDARD_ITU_C
:
11220 ext_attr
->qam_pre_saw_cfg
= *pre_saw
;
11232 /*============================================================================*/
11235 * \fn int ctrl_set_cfg_afe_gain()
11236 * \brief Set AFE Gain.
11237 * \param demod demod instance
11242 * Dispatch handling to standard specific function.
11246 ctrl_set_cfg_afe_gain(struct drx_demod_instance
*demod
, struct drxj_cfg_afe_gain
*afe_gain
)
11248 struct i2c_device_addr
*dev_addr
= NULL
;
11249 struct drxj_data
*ext_attr
= NULL
;
11253 /* check arguments */
11254 if (afe_gain
== NULL
)
11257 dev_addr
= demod
->my_i2c_dev_addr
;
11258 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
11260 switch (afe_gain
->standard
) {
11261 case DRX_STANDARD_8VSB
: /* fallthrough */
11262 #ifndef DRXJ_VSB_ONLY
11263 case DRX_STANDARD_ITU_A
: /* fallthrough */
11264 case DRX_STANDARD_ITU_B
: /* fallthrough */
11265 case DRX_STANDARD_ITU_C
:
11273 /* TODO PGA gain is also written by microcode (at least by QAM and VSB)
11274 So I (PJ) think interface requires choice between auto, user mode */
11276 if (afe_gain
->gain
>= 329)
11278 else if (afe_gain
->gain
<= 147)
11281 gain
= (afe_gain
->gain
- 140 + 6) / 13;
11283 /* Only if standard is currently active */
11284 if (ext_attr
->standard
== afe_gain
->standard
) {
11285 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_PGA_GAIN__A
, gain
, 0);
11287 pr_err("error %d\n", rc
);
11292 /* Store AFE Gain settings */
11293 switch (afe_gain
->standard
) {
11294 case DRX_STANDARD_8VSB
:
11295 ext_attr
->vsb_pga_cfg
= gain
* 13 + 140;
11297 #ifndef DRXJ_VSB_ONLY
11298 case DRX_STANDARD_ITU_A
: /* fallthrough */
11299 case DRX_STANDARD_ITU_B
: /* fallthrough */
11300 case DRX_STANDARD_ITU_C
:
11301 ext_attr
->qam_pga_cfg
= gain
* 13 + 140;
11313 /*============================================================================*/
11316 /*=============================================================================
11317 ===== EXPORTED FUNCTIONS ====================================================*/
11319 static int drx_ctrl_u_code(struct drx_demod_instance
*demod
,
11320 struct drxu_code_info
*mc_info
,
11321 enum drxu_code_action action
);
11322 static int drxj_set_lna_state(struct drx_demod_instance
*demod
, bool state
);
11326 * \brief Open the demod instance, configure device, configure drxdriver
11327 * \return Status_t Return status.
11329 * drxj_open() can be called with a NULL ucode image => no ucode upload.
11330 * This means that drxj_open() must NOT contain SCU commands or, in general,
11331 * rely on SCU or AUD ucode to be present.
11335 static int drxj_open(struct drx_demod_instance
*demod
)
11337 struct i2c_device_addr
*dev_addr
= NULL
;
11338 struct drxj_data
*ext_attr
= NULL
;
11339 struct drx_common_attr
*common_attr
= NULL
;
11340 u32 driver_version
= 0;
11341 struct drxu_code_info ucode_info
;
11342 struct drx_cfg_mpeg_output cfg_mpeg_output
;
11344 enum drx_power_mode power_mode
= DRX_POWER_UP
;
11346 if ((demod
== NULL
) ||
11347 (demod
->my_common_attr
== NULL
) ||
11348 (demod
->my_ext_attr
== NULL
) ||
11349 (demod
->my_i2c_dev_addr
== NULL
) ||
11350 (demod
->my_common_attr
->is_opened
)) {
11354 /* Check arguments */
11355 if (demod
->my_ext_attr
== NULL
)
11358 dev_addr
= demod
->my_i2c_dev_addr
;
11359 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
11360 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
11362 rc
= ctrl_power_mode(demod
, &power_mode
);
11364 pr_err("error %d\n", rc
);
11367 if (power_mode
!= DRX_POWER_UP
) {
11369 pr_err("failed to powerup device\n");
11373 /* has to be in front of setIqmAf and setOrxNsuAox */
11374 rc
= get_device_capabilities(demod
);
11376 pr_err("error %d\n", rc
);
11381 * Soft reset of sys- and osc-clockdomain
11383 * HACK: On windows, it writes a 0x07 here, instead of just 0x03.
11384 * As we didn't load the firmware here yet, we should do the same.
11385 * Btw, this is coherent with DRX-K, where we send reset codes
11386 * for modulation (OFTM, in DRX-k), SYS and OSC clock domains.
11388 rc
= drxj_dap_write_reg16(dev_addr
, SIO_CC_SOFT_RST__A
, (0x04 | SIO_CC_SOFT_RST_SYS__M
| SIO_CC_SOFT_RST_OSC__M
), 0);
11390 pr_err("error %d\n", rc
);
11393 rc
= drxj_dap_write_reg16(dev_addr
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
, 0);
11395 pr_err("error %d\n", rc
);
11400 /* TODO first make sure that everything keeps working before enabling this */
11401 /* PowerDownAnalogBlocks() */
11402 rc
= drxj_dap_write_reg16(dev_addr
, ATV_TOP_STDBY__A
, (~ATV_TOP_STDBY_CVBS_STDBY_A2_ACTIVE
) | ATV_TOP_STDBY_SIF_STDBY_STANDBY
, 0);
11404 pr_err("error %d\n", rc
);
11408 rc
= set_iqm_af(demod
, false);
11410 pr_err("error %d\n", rc
);
11413 rc
= set_orx_nsu_aox(demod
, false);
11415 pr_err("error %d\n", rc
);
11419 rc
= init_hi(demod
);
11421 pr_err("error %d\n", rc
);
11425 /* disable mpegoutput pins */
11426 memcpy(&cfg_mpeg_output
, &common_attr
->mpeg_cfg
, sizeof(cfg_mpeg_output
));
11427 cfg_mpeg_output
.enable_mpeg_output
= false;
11429 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
11431 pr_err("error %d\n", rc
);
11434 /* Stop AUD Inform SetAudio it will need to do all setting */
11435 rc
= power_down_aud(demod
);
11437 pr_err("error %d\n", rc
);
11441 rc
= drxj_dap_write_reg16(dev_addr
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_STOP
, 0);
11443 pr_err("error %d\n", rc
);
11447 /* Upload microcode */
11448 if (common_attr
->microcode_file
!= NULL
) {
11449 /* Dirty trick to use common ucode upload & verify,
11450 pretend device is already open */
11451 common_attr
->is_opened
= true;
11452 ucode_info
.mc_file
= common_attr
->microcode_file
;
11454 if (DRX_ISPOWERDOWNMODE(demod
->my_common_attr
->current_power_mode
)) {
11455 pr_err("Should powerup before loading the firmware.");
11459 rc
= drx_ctrl_u_code(demod
, &ucode_info
, UCODE_UPLOAD
);
11461 pr_err("error %d while uploading the firmware\n", rc
);
11464 if (common_attr
->verify_microcode
== true) {
11465 rc
= drx_ctrl_u_code(demod
, &ucode_info
, UCODE_VERIFY
);
11467 pr_err("error %d while verifying the firmware\n",
11472 common_attr
->is_opened
= false;
11475 /* Run SCU for a little while to initialize microcode version numbers */
11476 rc
= drxj_dap_write_reg16(dev_addr
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
, 0);
11478 pr_err("error %d\n", rc
);
11482 /* Initialize scan timeout */
11483 common_attr
->scan_demod_lock_timeout
= DRXJ_SCAN_TIMEOUT
;
11484 common_attr
->scan_desired_lock
= DRX_LOCKED
;
11486 drxj_reset_mode(ext_attr
);
11487 ext_attr
->standard
= DRX_STANDARD_UNKNOWN
;
11489 rc
= smart_ant_init(demod
);
11491 pr_err("error %d\n", rc
);
11495 /* Stamp driver version number in SCU data RAM in BCD code
11496 Done to enable field application engineers to retrieve drxdriver version
11497 via I2C from SCU RAM
11499 driver_version
= (VERSION_MAJOR
/ 100) % 10;
11500 driver_version
<<= 4;
11501 driver_version
+= (VERSION_MAJOR
/ 10) % 10;
11502 driver_version
<<= 4;
11503 driver_version
+= (VERSION_MAJOR
% 10);
11504 driver_version
<<= 4;
11505 driver_version
+= (VERSION_MINOR
% 10);
11506 driver_version
<<= 4;
11507 driver_version
+= (VERSION_PATCH
/ 1000) % 10;
11508 driver_version
<<= 4;
11509 driver_version
+= (VERSION_PATCH
/ 100) % 10;
11510 driver_version
<<= 4;
11511 driver_version
+= (VERSION_PATCH
/ 10) % 10;
11512 driver_version
<<= 4;
11513 driver_version
+= (VERSION_PATCH
% 10);
11514 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_DRIVER_VER_HI__A
, (u16
)(driver_version
>> 16), 0);
11516 pr_err("error %d\n", rc
);
11519 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_DRIVER_VER_LO__A
, (u16
)(driver_version
& 0xFFFF), 0);
11521 pr_err("error %d\n", rc
);
11525 rc
= ctrl_set_oob(demod
, NULL
);
11527 pr_err("error %d\n", rc
);
11531 /* refresh the audio data structure with default */
11532 ext_attr
->aud_data
= drxj_default_aud_data_g
;
11534 demod
->my_common_attr
->is_opened
= true;
11535 drxj_set_lna_state(demod
, false);
11538 common_attr
->is_opened
= false;
11542 /*============================================================================*/
11545 * \brief Close the demod instance, power down the device
11546 * \return Status_t Return status.
11549 static int drxj_close(struct drx_demod_instance
*demod
)
11551 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
11553 enum drx_power_mode power_mode
= DRX_POWER_UP
;
11555 if ((demod
->my_common_attr
== NULL
) ||
11556 (demod
->my_ext_attr
== NULL
) ||
11557 (demod
->my_i2c_dev_addr
== NULL
) ||
11558 (!demod
->my_common_attr
->is_opened
)) {
11563 rc
= ctrl_power_mode(demod
, &power_mode
);
11565 pr_err("error %d\n", rc
);
11569 rc
= drxj_dap_write_reg16(dev_addr
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
, 0);
11571 pr_err("error %d\n", rc
);
11574 power_mode
= DRX_POWER_DOWN
;
11575 rc
= ctrl_power_mode(demod
, &power_mode
);
11577 pr_err("error %d\n", rc
);
11581 DRX_ATTR_ISOPENED(demod
) = false;
11585 DRX_ATTR_ISOPENED(demod
) = false;
11591 * Microcode related functions
11595 * drx_u_code_compute_crc - Compute CRC of block of microcode data.
11596 * @block_data: Pointer to microcode data.
11597 * @nr_words: Size of microcode block (number of 16 bits words).
11599 * returns The computed CRC residue.
11601 static u16
drx_u_code_compute_crc(u8
*block_data
, u16 nr_words
)
11608 while (i
< nr_words
) {
11609 crc_word
|= (u32
)be16_to_cpu(*(__be16
*)(block_data
));
11610 for (j
= 0; j
< 16; j
++) {
11613 crc_word
^= 0x80050000UL
;
11614 carry
= crc_word
& 0x80000000UL
;
11617 block_data
+= (sizeof(u16
));
11619 return (u16
)(crc_word
>> 16);
11623 * drx_check_firmware - checks if the loaded firmware is valid
11625 * @demod: demod structure
11626 * @mc_data: pointer to the start of the firmware
11627 * @size: firmware size
11629 static int drx_check_firmware(struct drx_demod_instance
*demod
, u8
*mc_data
,
11632 struct drxu_code_block_hdr block_hdr
;
11634 unsigned count
= 2 * sizeof(u16
);
11635 u32 mc_dev_type
, mc_version
, mc_base_version
;
11636 u16 mc_nr_of_blks
= be16_to_cpu(*(__be16
*)(mc_data
+ sizeof(u16
)));
11639 * Scan microcode blocks first for version info
11640 * and firmware check
11643 /* Clear version block */
11644 DRX_ATTR_MCRECORD(demod
).aux_type
= 0;
11645 DRX_ATTR_MCRECORD(demod
).mc_dev_type
= 0;
11646 DRX_ATTR_MCRECORD(demod
).mc_version
= 0;
11647 DRX_ATTR_MCRECORD(demod
).mc_base_version
= 0;
11649 for (i
= 0; i
< mc_nr_of_blks
; i
++) {
11650 if (count
+ 3 * sizeof(u16
) + sizeof(u32
) > size
)
11653 /* Process block header */
11654 block_hdr
.addr
= be32_to_cpu(*(__be32
*)(mc_data
+ count
));
11655 count
+= sizeof(u32
);
11656 block_hdr
.size
= be16_to_cpu(*(__be16
*)(mc_data
+ count
));
11657 count
+= sizeof(u16
);
11658 block_hdr
.flags
= be16_to_cpu(*(__be16
*)(mc_data
+ count
));
11659 count
+= sizeof(u16
);
11660 block_hdr
.CRC
= be16_to_cpu(*(__be16
*)(mc_data
+ count
));
11661 count
+= sizeof(u16
);
11663 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11664 count
, block_hdr
.addr
, block_hdr
.size
, block_hdr
.flags
,
11667 if (block_hdr
.flags
& 0x8) {
11668 u8
*auxblk
= ((void *)mc_data
) + block_hdr
.addr
;
11671 if (block_hdr
.addr
+ sizeof(u16
) > size
)
11674 auxtype
= be16_to_cpu(*(__be16
*)(auxblk
));
11676 /* Aux block. Check type */
11677 if (DRX_ISMCVERTYPE(auxtype
)) {
11678 if (block_hdr
.addr
+ 2 * sizeof(u16
) + 2 * sizeof (u32
) > size
)
11681 auxblk
+= sizeof(u16
);
11682 mc_dev_type
= be32_to_cpu(*(__be32
*)(auxblk
));
11683 auxblk
+= sizeof(u32
);
11684 mc_version
= be32_to_cpu(*(__be32
*)(auxblk
));
11685 auxblk
+= sizeof(u32
);
11686 mc_base_version
= be32_to_cpu(*(__be32
*)(auxblk
));
11688 DRX_ATTR_MCRECORD(demod
).aux_type
= auxtype
;
11689 DRX_ATTR_MCRECORD(demod
).mc_dev_type
= mc_dev_type
;
11690 DRX_ATTR_MCRECORD(demod
).mc_version
= mc_version
;
11691 DRX_ATTR_MCRECORD(demod
).mc_base_version
= mc_base_version
;
11693 pr_info("Firmware dev %x, ver %x, base ver %x\n",
11694 mc_dev_type
, mc_version
, mc_base_version
);
11697 } else if (count
+ block_hdr
.size
* sizeof(u16
) > size
)
11700 count
+= block_hdr
.size
* sizeof(u16
);
11704 pr_err("Firmware is truncated at pos %u/%u\n", count
, size
);
11709 * drx_ctrl_u_code - Handle microcode upload or verify.
11710 * @dev_addr: Address of device.
11711 * @mc_info: Pointer to information about microcode data.
11712 * @action: Either UCODE_UPLOAD or UCODE_VERIFY
11714 * This function returns:
11716 * - In case of UCODE_UPLOAD: code is successfully uploaded.
11717 * - In case of UCODE_VERIFY: image on device is equal to
11718 * image provided to this control function.
11720 * - In case of UCODE_UPLOAD: I2C error.
11721 * - In case of UCODE_VERIFY: I2C error or image on device
11722 * is not equal to image provided to this control function.
11724 * - Invalid arguments.
11725 * - Provided image is corrupt
11727 static int drx_ctrl_u_code(struct drx_demod_instance
*demod
,
11728 struct drxu_code_info
*mc_info
,
11729 enum drxu_code_action action
)
11731 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
11734 u16 mc_nr_of_blks
= 0;
11735 u16 mc_magic_word
= 0;
11736 const u8
*mc_data_init
= NULL
;
11737 u8
*mc_data
= NULL
;
11741 /* Check arguments */
11742 if (!mc_info
|| !mc_info
->mc_file
)
11745 mc_file
= mc_info
->mc_file
;
11747 if (!demod
->firmware
) {
11748 const struct firmware
*fw
= NULL
;
11750 rc
= request_firmware(&fw
, mc_file
, demod
->i2c
->dev
.parent
);
11752 pr_err("Couldn't read firmware %s\n", mc_file
);
11755 demod
->firmware
= fw
;
11757 if (demod
->firmware
->size
< 2 * sizeof(u16
)) {
11759 pr_err("Firmware is too short!\n");
11763 pr_info("Firmware %s, size %zu\n",
11764 mc_file
, demod
->firmware
->size
);
11767 mc_data_init
= demod
->firmware
->data
;
11768 size
= demod
->firmware
->size
;
11770 mc_data
= (void *)mc_data_init
;
11772 mc_magic_word
= be16_to_cpu(*(__be16
*)(mc_data
));
11773 mc_data
+= sizeof(u16
);
11774 mc_nr_of_blks
= be16_to_cpu(*(__be16
*)(mc_data
));
11775 mc_data
+= sizeof(u16
);
11777 if ((mc_magic_word
!= DRX_UCODE_MAGIC_WORD
) || (mc_nr_of_blks
== 0)) {
11779 pr_err("Firmware magic word doesn't match\n");
11783 if (action
== UCODE_UPLOAD
) {
11784 rc
= drx_check_firmware(demod
, (u8
*)mc_data_init
, size
);
11787 pr_info("Uploading firmware %s\n", mc_file
);
11789 pr_info("Verifying if firmware upload was ok.\n");
11792 /* Process microcode blocks */
11793 for (i
= 0; i
< mc_nr_of_blks
; i
++) {
11794 struct drxu_code_block_hdr block_hdr
;
11795 u16 mc_block_nr_bytes
= 0;
11797 /* Process block header */
11798 block_hdr
.addr
= be32_to_cpu(*(__be32
*)(mc_data
));
11799 mc_data
+= sizeof(u32
);
11800 block_hdr
.size
= be16_to_cpu(*(__be16
*)(mc_data
));
11801 mc_data
+= sizeof(u16
);
11802 block_hdr
.flags
= be16_to_cpu(*(__be16
*)(mc_data
));
11803 mc_data
+= sizeof(u16
);
11804 block_hdr
.CRC
= be16_to_cpu(*(__be16
*)(mc_data
));
11805 mc_data
+= sizeof(u16
);
11807 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11808 (unsigned)(mc_data
- mc_data_init
), block_hdr
.addr
,
11809 block_hdr
.size
, block_hdr
.flags
, block_hdr
.CRC
);
11811 /* Check block header on:
11812 - data larger than 64Kb
11813 - if CRC enabled check CRC
11815 if ((block_hdr
.size
> 0x7FFF) ||
11816 (((block_hdr
.flags
& DRX_UCODE_CRC_FLAG
) != 0) &&
11817 (block_hdr
.CRC
!= drx_u_code_compute_crc(mc_data
, block_hdr
.size
)))
11821 pr_err("firmware CRC is wrong\n");
11825 if (!block_hdr
.size
)
11828 mc_block_nr_bytes
= block_hdr
.size
* ((u16
) sizeof(u16
));
11830 /* Perform the desired action */
11832 case UCODE_UPLOAD
: /* Upload microcode */
11833 if (drxdap_fasi_write_block(dev_addr
,
11836 mc_data
, 0x0000)) {
11838 pr_err("error writing firmware at pos %u\n",
11839 (unsigned)(mc_data
- mc_data_init
));
11843 case UCODE_VERIFY
: { /* Verify uploaded microcode */
11845 u8 mc_data_buffer
[DRX_UCODE_MAX_BUF_SIZE
];
11846 u32 bytes_to_comp
= 0;
11847 u32 bytes_left
= mc_block_nr_bytes
;
11848 u32 curr_addr
= block_hdr
.addr
;
11849 u8
*curr_ptr
= mc_data
;
11851 while (bytes_left
!= 0) {
11852 if (bytes_left
> DRX_UCODE_MAX_BUF_SIZE
)
11853 bytes_to_comp
= DRX_UCODE_MAX_BUF_SIZE
;
11855 bytes_to_comp
= bytes_left
;
11857 if (drxdap_fasi_read_block(dev_addr
,
11859 (u16
)bytes_to_comp
,
11860 (u8
*)mc_data_buffer
,
11862 pr_err("error reading firmware at pos %u\n",
11863 (unsigned)(mc_data
- mc_data_init
));
11867 result
= memcmp(curr_ptr
, mc_data_buffer
,
11871 pr_err("error verifying firmware at pos %u\n",
11872 (unsigned)(mc_data
- mc_data_init
));
11876 curr_addr
+= ((dr_xaddr_t
)(bytes_to_comp
/ 2));
11877 curr_ptr
=&(curr_ptr
[bytes_to_comp
]);
11878 bytes_left
-=((u32
) bytes_to_comp
);
11887 mc_data
+= mc_block_nr_bytes
;
11893 release_firmware(demod
->firmware
);
11894 demod
->firmware
= NULL
;
11899 /* caller is expected to check if lna is supported before enabling */
11900 static int drxj_set_lna_state(struct drx_demod_instance
*demod
, bool state
)
11902 struct drxuio_cfg uio_cfg
;
11903 struct drxuio_data uio_data
;
11906 uio_cfg
.uio
= DRX_UIO1
;
11907 uio_cfg
.mode
= DRX_UIO_MODE_READWRITE
;
11908 /* Configure user-I/O #3: enable read/write */
11909 result
= ctrl_set_uio_cfg(demod
, &uio_cfg
);
11911 pr_err("Failed to setup LNA GPIO!\n");
11915 uio_data
.uio
= DRX_UIO1
;
11916 uio_data
.value
= state
;
11917 result
= ctrl_uio_write(demod
, &uio_data
);
11919 pr_err("Failed to %sable LNA!\n",
11920 state
? "en" : "dis");
11927 * The Linux DVB Driver for Micronas DRX39xx family (drx3933j)
11929 * Written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
11932 static int drx39xxj_set_powerstate(struct dvb_frontend
*fe
, int enable
)
11934 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
11935 struct drx_demod_instance
*demod
= state
->demod
;
11937 enum drx_power_mode power_mode
;
11940 power_mode
= DRX_POWER_UP
;
11942 power_mode
= DRX_POWER_DOWN
;
11944 result
= ctrl_power_mode(demod
, &power_mode
);
11946 pr_err("Power state change failed\n");
11953 static int drx39xxj_read_status(struct dvb_frontend
*fe
, enum fe_status
*status
)
11955 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
11956 struct drx_demod_instance
*demod
= state
->demod
;
11958 enum drx_lock_status lock_status
;
11962 result
= ctrl_lock_status(demod
, &lock_status
);
11964 pr_err("drx39xxj: could not get lock status!\n");
11968 switch (lock_status
) {
11969 case DRX_NEVER_LOCK
:
11971 pr_err("drx says NEVER_LOCK\n");
11973 case DRX_NOT_LOCKED
:
11976 case DRX_LOCK_STATE_1
:
11977 case DRX_LOCK_STATE_2
:
11978 case DRX_LOCK_STATE_3
:
11979 case DRX_LOCK_STATE_4
:
11980 case DRX_LOCK_STATE_5
:
11981 case DRX_LOCK_STATE_6
:
11982 case DRX_LOCK_STATE_7
:
11983 case DRX_LOCK_STATE_8
:
11984 case DRX_LOCK_STATE_9
:
11985 *status
= FE_HAS_SIGNAL
11986 | FE_HAS_CARRIER
| FE_HAS_VITERBI
| FE_HAS_SYNC
;
11989 *status
= FE_HAS_SIGNAL
11991 | FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
;
11994 pr_err("Lock state unknown %d\n", lock_status
);
11996 ctrl_sig_quality(demod
, lock_status
);
12001 static int drx39xxj_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
12003 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12005 if (p
->pre_bit_error
.stat
[0].scale
== FE_SCALE_NOT_AVAILABLE
) {
12010 if (!p
->pre_bit_count
.stat
[0].uvalue
) {
12011 if (!p
->pre_bit_error
.stat
[0].uvalue
)
12016 *ber
= frac_times1e6(p
->pre_bit_error
.stat
[0].uvalue
,
12017 p
->pre_bit_count
.stat
[0].uvalue
);
12022 static int drx39xxj_read_signal_strength(struct dvb_frontend
*fe
,
12025 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12027 if (p
->strength
.stat
[0].scale
== FE_SCALE_NOT_AVAILABLE
) {
12032 *strength
= p
->strength
.stat
[0].uvalue
;
12036 static int drx39xxj_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
12038 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12041 if (p
->cnr
.stat
[0].scale
== FE_SCALE_NOT_AVAILABLE
) {
12046 tmp64
= p
->cnr
.stat
[0].svalue
;
12052 static int drx39xxj_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucb
)
12054 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12056 if (p
->block_error
.stat
[0].scale
== FE_SCALE_NOT_AVAILABLE
) {
12061 *ucb
= p
->block_error
.stat
[0].uvalue
;
12065 static int drx39xxj_set_frontend(struct dvb_frontend
*fe
)
12070 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12071 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12072 struct drx_demod_instance
*demod
= state
->demod
;
12073 enum drx_standard standard
= DRX_STANDARD_8VSB
;
12074 struct drx_channel channel
;
12076 static const struct drx_channel def_channel
= {
12078 /* bandwidth */ DRX_BANDWIDTH_6MHZ
,
12079 /* mirror */ DRX_MIRROR_NO
,
12080 /* constellation */ DRX_CONSTELLATION_AUTO
,
12081 /* hierarchy */ DRX_HIERARCHY_UNKNOWN
,
12082 /* priority */ DRX_PRIORITY_UNKNOWN
,
12083 /* coderate */ DRX_CODERATE_UNKNOWN
,
12084 /* guard */ DRX_GUARD_UNKNOWN
,
12085 /* fftmode */ DRX_FFTMODE_UNKNOWN
,
12086 /* classification */ DRX_CLASSIFICATION_AUTO
,
12087 /* symbolrate */ 5057000,
12088 /* interleavemode */ DRX_INTERLEAVEMODE_UNKNOWN
,
12089 /* ldpc */ DRX_LDPC_UNKNOWN
,
12090 /* carrier */ DRX_CARRIER_UNKNOWN
,
12091 /* frame mode */ DRX_FRAMEMODE_UNKNOWN
12093 u32 constellation
= DRX_CONSTELLATION_AUTO
;
12095 /* Bring the demod out of sleep */
12096 drx39xxj_set_powerstate(fe
, 1);
12098 if (fe
->ops
.tuner_ops
.set_params
) {
12101 if (fe
->ops
.i2c_gate_ctrl
)
12102 fe
->ops
.i2c_gate_ctrl(fe
, 1);
12104 /* Set tuner to desired frequency and standard */
12105 fe
->ops
.tuner_ops
.set_params(fe
);
12107 /* Use the tuner's IF */
12108 if (fe
->ops
.tuner_ops
.get_if_frequency
) {
12109 fe
->ops
.tuner_ops
.get_if_frequency(fe
, &int_freq
);
12110 demod
->my_common_attr
->intermediate_freq
= int_freq
/ 1000;
12113 if (fe
->ops
.i2c_gate_ctrl
)
12114 fe
->ops
.i2c_gate_ctrl(fe
, 0);
12117 switch (p
->delivery_system
) {
12119 standard
= DRX_STANDARD_8VSB
;
12121 case SYS_DVBC_ANNEX_B
:
12122 standard
= DRX_STANDARD_ITU_B
;
12124 switch (p
->modulation
) {
12126 constellation
= DRX_CONSTELLATION_QAM64
;
12129 constellation
= DRX_CONSTELLATION_QAM256
;
12132 constellation
= DRX_CONSTELLATION_AUTO
;
12139 /* Set the standard (will be powered up if necessary */
12140 result
= ctrl_set_standard(demod
, &standard
);
12142 pr_err("Failed to set standard! result=%02x\n",
12147 /* set channel parameters */
12148 channel
= def_channel
;
12149 channel
.frequency
= p
->frequency
/ 1000;
12150 channel
.bandwidth
= DRX_BANDWIDTH_6MHZ
;
12151 channel
.constellation
= constellation
;
12153 /* program channel */
12154 result
= ctrl_set_channel(demod
, &channel
);
12156 pr_err("Failed to set channel!\n");
12159 /* Just for giggles, let's shut off the LNA again.... */
12160 drxj_set_lna_state(demod
, false);
12162 /* After set_frontend, except for strength, stats aren't available */
12163 p
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
12168 static int drx39xxj_sleep(struct dvb_frontend
*fe
)
12170 /* power-down the demodulator */
12171 return drx39xxj_set_powerstate(fe
, 0);
12174 static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
12176 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12177 struct drx_demod_instance
*demod
= state
->demod
;
12178 bool i2c_gate_state
;
12182 pr_debug("i2c gate call: enable=%d state=%d\n", enable
,
12183 state
->i2c_gate_open
);
12187 i2c_gate_state
= true;
12189 i2c_gate_state
= false;
12191 if (state
->i2c_gate_open
== enable
) {
12192 /* We're already in the desired state */
12196 result
= ctrl_i2c_bridge(demod
, &i2c_gate_state
);
12198 pr_err("drx39xxj: could not open i2c gate [%d]\n",
12202 state
->i2c_gate_open
= enable
;
12207 static int drx39xxj_init(struct dvb_frontend
*fe
)
12209 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12210 struct drx_demod_instance
*demod
= state
->demod
;
12213 if (fe
->exit
== DVB_FE_DEVICE_RESUME
) {
12214 /* so drxj_open() does what it needs to do */
12215 demod
->my_common_attr
->is_opened
= false;
12216 rc
= drxj_open(demod
);
12218 pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc
);
12220 drx39xxj_set_powerstate(fe
, 1);
12225 static int drx39xxj_set_lna(struct dvb_frontend
*fe
)
12227 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
12228 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12229 struct drx_demod_instance
*demod
= state
->demod
;
12230 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
12233 if (!ext_attr
->has_lna
) {
12234 pr_err("LNA is not supported on this device!\n");
12240 return drxj_set_lna_state(demod
, c
->lna
);
12243 static int drx39xxj_get_tune_settings(struct dvb_frontend
*fe
,
12244 struct dvb_frontend_tune_settings
*tune
)
12246 tune
->min_delay_ms
= 1000;
12250 static void drx39xxj_release(struct dvb_frontend
*fe
)
12252 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12253 struct drx_demod_instance
*demod
= state
->demod
;
12255 /* if device is removed don't access it */
12256 if (fe
->exit
!= DVB_FE_DEVICE_REMOVED
)
12259 kfree(demod
->my_ext_attr
);
12260 kfree(demod
->my_common_attr
);
12261 kfree(demod
->my_i2c_dev_addr
);
12262 release_firmware(demod
->firmware
);
12267 static const struct dvb_frontend_ops drx39xxj_ops
;
12269 struct dvb_frontend
*drx39xxj_attach(struct i2c_adapter
*i2c
)
12271 struct drx39xxj_state
*state
= NULL
;
12272 struct i2c_device_addr
*demod_addr
= NULL
;
12273 struct drx_common_attr
*demod_comm_attr
= NULL
;
12274 struct drxj_data
*demod_ext_attr
= NULL
;
12275 struct drx_demod_instance
*demod
= NULL
;
12276 struct dtv_frontend_properties
*p
;
12279 /* allocate memory for the internal state */
12280 state
= kzalloc(sizeof(struct drx39xxj_state
), GFP_KERNEL
);
12284 demod
= kmalloc(sizeof(struct drx_demod_instance
), GFP_KERNEL
);
12288 demod_addr
= kmemdup(&drxj_default_addr_g
,
12289 sizeof(struct i2c_device_addr
), GFP_KERNEL
);
12290 if (demod_addr
== NULL
)
12293 demod_comm_attr
= kmemdup(&drxj_default_comm_attr_g
,
12294 sizeof(struct drx_common_attr
), GFP_KERNEL
);
12295 if (demod_comm_attr
== NULL
)
12298 demod_ext_attr
= kmemdup(&drxj_data_g
, sizeof(struct drxj_data
),
12300 if (demod_ext_attr
== NULL
)
12303 /* setup the state */
12305 state
->demod
= demod
;
12307 /* setup the demod data */
12308 memcpy(demod
, &drxj_default_demod_g
, sizeof(struct drx_demod_instance
));
12310 demod
->my_i2c_dev_addr
= demod_addr
;
12311 demod
->my_common_attr
= demod_comm_attr
;
12312 demod
->my_i2c_dev_addr
->user_data
= state
;
12313 demod
->my_common_attr
->microcode_file
= DRX39XX_MAIN_FIRMWARE
;
12314 demod
->my_common_attr
->verify_microcode
= true;
12315 demod
->my_common_attr
->intermediate_freq
= 5000;
12316 demod
->my_common_attr
->current_power_mode
= DRX_POWER_DOWN
;
12317 demod
->my_ext_attr
= demod_ext_attr
;
12318 ((struct drxj_data
*)demod_ext_attr
)->uio_sma_tx_mode
= DRX_UIO_MODE_READWRITE
;
12321 result
= drxj_open(demod
);
12323 pr_err("DRX open failed! Aborting\n");
12327 /* create dvb_frontend */
12328 memcpy(&state
->frontend
.ops
, &drx39xxj_ops
,
12329 sizeof(struct dvb_frontend_ops
));
12331 state
->frontend
.demodulator_priv
= state
;
12333 /* Initialize stats - needed for DVBv5 stats to work */
12334 p
= &state
->frontend
.dtv_property_cache
;
12335 p
->strength
.len
= 1;
12336 p
->pre_bit_count
.len
= 1;
12337 p
->pre_bit_error
.len
= 1;
12338 p
->post_bit_count
.len
= 1;
12339 p
->post_bit_error
.len
= 1;
12340 p
->block_count
.len
= 1;
12341 p
->block_error
.len
= 1;
12344 p
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
12345 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12346 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12347 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12348 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12349 p
->block_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12350 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12351 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12353 return &state
->frontend
;
12356 kfree(demod_ext_attr
);
12357 kfree(demod_comm_attr
);
12364 EXPORT_SYMBOL(drx39xxj_attach
);
12366 static const struct dvb_frontend_ops drx39xxj_ops
= {
12367 .delsys
= { SYS_ATSC
, SYS_DVBC_ANNEX_B
},
12369 .name
= "Micronas DRX39xxj family Frontend",
12370 .frequency_stepsize
= 62500,
12371 .frequency_min
= 51000000,
12372 .frequency_max
= 858000000,
12373 .caps
= FE_CAN_QAM_64
| FE_CAN_QAM_256
| FE_CAN_8VSB
12376 .init
= drx39xxj_init
,
12377 .i2c_gate_ctrl
= drx39xxj_i2c_gate_ctrl
,
12378 .sleep
= drx39xxj_sleep
,
12379 .set_frontend
= drx39xxj_set_frontend
,
12380 .get_tune_settings
= drx39xxj_get_tune_settings
,
12381 .read_status
= drx39xxj_read_status
,
12382 .read_ber
= drx39xxj_read_ber
,
12383 .read_signal_strength
= drx39xxj_read_signal_strength
,
12384 .read_snr
= drx39xxj_read_snr
,
12385 .read_ucblocks
= drx39xxj_read_ucblocks
,
12386 .release
= drx39xxj_release
,
12387 .set_lna
= drx39xxj_set_lna
,
12390 MODULE_DESCRIPTION("Micronas DRX39xxj Frontend");
12391 MODULE_AUTHOR("Devin Heitmueller");
12392 MODULE_LICENSE("GPL");
12393 MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE
);