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 <media/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 addresses directly. This must be READ ONLY to avoid problems. */
385 /* Writing to the interface addresses are 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 configuration */
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 configuration */
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 output enable */
660 false, /* flag SIF output 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 output */
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 initially 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 which 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 rewritten 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 rc
= drxj_dap_read_reg16(dev_addr
,
2155 (DRXJ_HI_ATOMIC_BUF_START
+ i
),
2158 pr_err("error %d\n", rc
);
2161 data
[2 * i
] = (u8
) (word
& 0xFF);
2162 data
[(2 * i
) + 1] = (u8
) (word
>> 8);
2173 /*============================================================================*/
2176 * \fn int drxj_dap_atomic_read_reg32()
2177 * \brief Atomic read of 32 bits words
2180 int drxj_dap_atomic_read_reg32(struct i2c_device_addr
*dev_addr
,
2182 u32
*data
, u32 flags
)
2184 u8 buf
[sizeof(*data
)] = { 0 };
2191 rc
= drxj_dap_atomic_read_write_block(dev_addr
, addr
,
2192 sizeof(*data
), buf
, true);
2197 word
= (u32
) buf
[3];
2199 word
|= (u32
) buf
[2];
2201 word
|= (u32
) buf
[1];
2203 word
|= (u32
) buf
[0];
2210 /*============================================================================*/
2212 /*============================================================================*/
2213 /*== END DRXJ DAP FUNCTIONS ==*/
2214 /*============================================================================*/
2216 /*============================================================================*/
2217 /*============================================================================*/
2218 /*== HOST INTERFACE FUNCTIONS ==*/
2219 /*============================================================================*/
2220 /*============================================================================*/
2223 * \fn int hi_cfg_command()
2224 * \brief Configure HI with settings stored in the demod structure.
2225 * \param demod Demodulator.
2228 * This routine was created because to much orthogonal settings have
2229 * been put into one HI API function (configure). Especially the I2C bridge
2230 * enable/disable should not need re-configuration of the HI.
2233 static int hi_cfg_command(const struct drx_demod_instance
*demod
)
2235 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
2236 struct drxj_hi_cmd hi_cmd
;
2240 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
2242 hi_cmd
.cmd
= SIO_HI_RA_RAM_CMD_CONFIG
;
2243 hi_cmd
.param1
= SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY
;
2244 hi_cmd
.param2
= ext_attr
->hi_cfg_timing_div
;
2245 hi_cmd
.param3
= ext_attr
->hi_cfg_bridge_delay
;
2246 hi_cmd
.param4
= ext_attr
->hi_cfg_wake_up_key
;
2247 hi_cmd
.param5
= ext_attr
->hi_cfg_ctrl
;
2248 hi_cmd
.param6
= ext_attr
->hi_cfg_transmit
;
2250 rc
= hi_command(demod
->my_i2c_dev_addr
, &hi_cmd
, &result
);
2252 pr_err("error %d\n", rc
);
2256 /* Reset power down flag (set one call only) */
2257 ext_attr
->hi_cfg_ctrl
&= (~(SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
));
2266 * \fn int hi_command()
2267 * \brief Configure HI with settings stored in the demod structure.
2268 * \param dev_addr I2C address.
2269 * \param cmd HI command.
2270 * \param result HI command result.
2273 * Sends command to HI
2277 hi_command(struct i2c_device_addr
*dev_addr
, const struct drxj_hi_cmd
*cmd
, u16
*result
)
2281 bool powerdown_cmd
= false;
2284 /* Write parameters */
2287 case SIO_HI_RA_RAM_CMD_CONFIG
:
2288 case SIO_HI_RA_RAM_CMD_ATOMIC_COPY
:
2289 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_6__A
, cmd
->param6
, 0);
2291 pr_err("error %d\n", rc
);
2294 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_5__A
, cmd
->param5
, 0);
2296 pr_err("error %d\n", rc
);
2299 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_4__A
, cmd
->param4
, 0);
2301 pr_err("error %d\n", rc
);
2304 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_3__A
, cmd
->param3
, 0);
2306 pr_err("error %d\n", rc
);
2310 case SIO_HI_RA_RAM_CMD_BRDCTRL
:
2311 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_2__A
, cmd
->param2
, 0);
2313 pr_err("error %d\n", rc
);
2316 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_PAR_1__A
, cmd
->param1
, 0);
2318 pr_err("error %d\n", rc
);
2322 case SIO_HI_RA_RAM_CMD_NULL
:
2332 rc
= drxj_dap_write_reg16(dev_addr
, SIO_HI_RA_RAM_CMD__A
, cmd
->cmd
, 0);
2334 pr_err("error %d\n", rc
);
2338 if ((cmd
->cmd
) == SIO_HI_RA_RAM_CMD_RESET
)
2341 /* Detect power down to omit reading result */
2342 powerdown_cmd
= (bool) ((cmd
->cmd
== SIO_HI_RA_RAM_CMD_CONFIG
) &&
2344 param5
) & SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M
)
2345 == SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
));
2346 if (!powerdown_cmd
) {
2347 /* Wait until command rdy */
2350 if (nr_retries
> DRXJ_MAX_RETRIES
) {
2351 pr_err("timeout\n");
2355 rc
= drxj_dap_read_reg16(dev_addr
, SIO_HI_RA_RAM_CMD__A
, &wait_cmd
, 0);
2357 pr_err("error %d\n", rc
);
2360 } while (wait_cmd
!= 0);
2363 rc
= drxj_dap_read_reg16(dev_addr
, SIO_HI_RA_RAM_RES__A
, result
, 0);
2365 pr_err("error %d\n", rc
);
2370 /* if ( powerdown_cmd == true ) */
2377 * \fn int init_hi( const struct drx_demod_instance *demod )
2378 * \brief Initialise and configurate HI.
2379 * \param demod pointer to demod data.
2380 * \return int Return status.
2381 * \retval 0 Success.
2382 * \retval -EIO Failure.
2384 * Needs to know Psys (System Clock period) and Posc (Osc Clock period)
2385 * Need to store configuration in driver because of the way I2C
2386 * bridging is controlled.
2389 static int init_hi(const struct drx_demod_instance
*demod
)
2391 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
2392 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) (NULL
);
2393 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
2396 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
2397 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
2398 dev_addr
= demod
->my_i2c_dev_addr
;
2400 /* PATCH for bug 5003, HI ucode v3.1.0 */
2401 rc
= drxj_dap_write_reg16(dev_addr
, 0x4301D7, 0x801, 0);
2403 pr_err("error %d\n", rc
);
2407 /* Timing div, 250ns/Psys */
2408 /* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */
2409 ext_attr
->hi_cfg_timing_div
=
2410 (u16
) ((common_attr
->sys_clock_freq
/ 1000) * HI_I2C_DELAY
) / 1000;
2412 if ((ext_attr
->hi_cfg_timing_div
) > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M
)
2413 ext_attr
->hi_cfg_timing_div
= SIO_HI_RA_RAM_PAR_2_CFG_DIV__M
;
2414 /* Bridge delay, uses oscilator clock */
2415 /* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */
2416 /* SDA brdige delay */
2417 ext_attr
->hi_cfg_bridge_delay
=
2418 (u16
) ((common_attr
->osc_clock_freq
/ 1000) * HI_I2C_BRIDGE_DELAY
) /
2421 if ((ext_attr
->hi_cfg_bridge_delay
) > SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M
)
2422 ext_attr
->hi_cfg_bridge_delay
= SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M
;
2423 /* SCL bridge delay, same as SDA for now */
2424 ext_attr
->hi_cfg_bridge_delay
+= ((ext_attr
->hi_cfg_bridge_delay
) <<
2425 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B
);
2426 /* Wakeup key, setting the read flag (as suggest in the documentation) does
2427 not always result into a working solution (barebones worked VI2C failed).
2428 Not setting the bit works in all cases . */
2429 ext_attr
->hi_cfg_wake_up_key
= DRXJ_WAKE_UP_KEY
;
2430 /* port/bridge/power down ctrl */
2431 ext_attr
->hi_cfg_ctrl
= (SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE
);
2432 /* transit mode time out delay and watch dog divider */
2433 ext_attr
->hi_cfg_transmit
= SIO_HI_RA_RAM_PAR_6__PRE
;
2435 rc
= hi_cfg_command(demod
);
2437 pr_err("error %d\n", rc
);
2447 /*============================================================================*/
2448 /*== END HOST INTERFACE FUNCTIONS ==*/
2449 /*============================================================================*/
2451 /*============================================================================*/
2452 /*============================================================================*/
2453 /*== AUXILIARY FUNCTIONS ==*/
2454 /*============================================================================*/
2455 /*============================================================================*/
2458 * \fn int get_device_capabilities()
2459 * \brief Get and store device capabilities.
2460 * \param demod Pointer to demodulator instance.
2463 * \retval -EIO Failure
2465 * Depending on pulldowns on MDx pins the following internals are set:
2466 * * common_attr->osc_clock_freq
2467 * * ext_attr->has_lna
2468 * * ext_attr->has_ntsc
2469 * * ext_attr->has_btsc
2470 * * ext_attr->has_oob
2473 static int get_device_capabilities(struct drx_demod_instance
*demod
)
2475 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) (NULL
);
2476 struct drxj_data
*ext_attr
= (struct drxj_data
*) NULL
;
2477 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
2478 u16 sio_pdr_ohw_cfg
= 0;
2479 u32 sio_top_jtagid_lo
= 0;
2483 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
2484 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
2485 dev_addr
= demod
->my_i2c_dev_addr
;
2487 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
2489 pr_err("error %d\n", rc
);
2492 rc
= drxj_dap_read_reg16(dev_addr
, SIO_PDR_OHW_CFG__A
, &sio_pdr_ohw_cfg
, 0);
2494 pr_err("error %d\n", rc
);
2497 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY__PRE
, 0);
2499 pr_err("error %d\n", rc
);
2503 switch ((sio_pdr_ohw_cfg
& SIO_PDR_OHW_CFG_FREF_SEL__M
)) {
2505 /* ignore (bypass ?) */
2509 common_attr
->osc_clock_freq
= 27000;
2513 common_attr
->osc_clock_freq
= 20250;
2517 common_attr
->osc_clock_freq
= 4000;
2524 Determine device capabilities
2525 Based on pinning v47
2527 rc
= drxdap_fasi_read_reg32(dev_addr
, SIO_TOP_JTAGID_LO__A
, &sio_top_jtagid_lo
, 0);
2529 pr_err("error %d\n", rc
);
2532 ext_attr
->mfx
= (u8
) ((sio_top_jtagid_lo
>> 29) & 0xF);
2534 switch ((sio_top_jtagid_lo
>> 12) & 0xFF) {
2536 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
2538 pr_err("error %d\n", rc
);
2541 rc
= drxj_dap_read_reg16(dev_addr
, SIO_PDR_UIO_IN_HI__A
, &bid
, 0);
2543 pr_err("error %d\n", rc
);
2546 bid
= (bid
>> 10) & 0xf;
2547 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY__PRE
, 0);
2549 pr_err("error %d\n", rc
);
2553 ext_attr
->has_lna
= true;
2554 ext_attr
->has_ntsc
= false;
2555 ext_attr
->has_btsc
= false;
2556 ext_attr
->has_oob
= false;
2557 ext_attr
->has_smatx
= true;
2558 ext_attr
->has_smarx
= false;
2559 ext_attr
->has_gpio
= false;
2560 ext_attr
->has_irqn
= false;
2563 ext_attr
->has_lna
= false;
2564 ext_attr
->has_ntsc
= false;
2565 ext_attr
->has_btsc
= false;
2566 ext_attr
->has_oob
= false;
2567 ext_attr
->has_smatx
= true;
2568 ext_attr
->has_smarx
= false;
2569 ext_attr
->has_gpio
= false;
2570 ext_attr
->has_irqn
= false;
2573 ext_attr
->has_lna
= true;
2574 ext_attr
->has_ntsc
= true;
2575 ext_attr
->has_btsc
= false;
2576 ext_attr
->has_oob
= false;
2577 ext_attr
->has_smatx
= true;
2578 ext_attr
->has_smarx
= true;
2579 ext_attr
->has_gpio
= true;
2580 ext_attr
->has_irqn
= false;
2583 ext_attr
->has_lna
= false;
2584 ext_attr
->has_ntsc
= true;
2585 ext_attr
->has_btsc
= false;
2586 ext_attr
->has_oob
= false;
2587 ext_attr
->has_smatx
= true;
2588 ext_attr
->has_smarx
= true;
2589 ext_attr
->has_gpio
= true;
2590 ext_attr
->has_irqn
= false;
2593 ext_attr
->has_lna
= true;
2594 ext_attr
->has_ntsc
= true;
2595 ext_attr
->has_btsc
= true;
2596 ext_attr
->has_oob
= false;
2597 ext_attr
->has_smatx
= true;
2598 ext_attr
->has_smarx
= true;
2599 ext_attr
->has_gpio
= true;
2600 ext_attr
->has_irqn
= false;
2603 ext_attr
->has_lna
= false;
2604 ext_attr
->has_ntsc
= true;
2605 ext_attr
->has_btsc
= true;
2606 ext_attr
->has_oob
= false;
2607 ext_attr
->has_smatx
= true;
2608 ext_attr
->has_smarx
= true;
2609 ext_attr
->has_gpio
= true;
2610 ext_attr
->has_irqn
= false;
2613 ext_attr
->has_lna
= true;
2614 ext_attr
->has_ntsc
= false;
2615 ext_attr
->has_btsc
= false;
2616 ext_attr
->has_oob
= true;
2617 ext_attr
->has_smatx
= true;
2618 ext_attr
->has_smarx
= true;
2619 ext_attr
->has_gpio
= true;
2620 ext_attr
->has_irqn
= true;
2623 ext_attr
->has_lna
= false;
2624 ext_attr
->has_ntsc
= true;
2625 ext_attr
->has_btsc
= true;
2626 ext_attr
->has_oob
= true;
2627 ext_attr
->has_smatx
= true;
2628 ext_attr
->has_smarx
= true;
2629 ext_attr
->has_gpio
= true;
2630 ext_attr
->has_irqn
= true;
2633 ext_attr
->has_lna
= true;
2634 ext_attr
->has_ntsc
= true;
2635 ext_attr
->has_btsc
= true;
2636 ext_attr
->has_oob
= true;
2637 ext_attr
->has_smatx
= true;
2638 ext_attr
->has_smarx
= true;
2639 ext_attr
->has_gpio
= true;
2640 ext_attr
->has_irqn
= true;
2643 ext_attr
->has_lna
= false;
2644 ext_attr
->has_ntsc
= true;
2645 ext_attr
->has_btsc
= true;
2646 ext_attr
->has_oob
= true;
2647 ext_attr
->has_smatx
= true;
2648 ext_attr
->has_smarx
= true;
2649 ext_attr
->has_gpio
= true;
2650 ext_attr
->has_irqn
= true;
2653 /* Unknown device variant */
2664 * \fn int power_up_device()
2665 * \brief Power up device.
2666 * \param demod Pointer to demodulator instance.
2669 * \retval -EIO Failure, I2C or max retries reached
2673 #ifndef DRXJ_MAX_RETRIES_POWERUP
2674 #define DRXJ_MAX_RETRIES_POWERUP 10
2677 static int power_up_device(struct drx_demod_instance
*demod
)
2679 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
2681 u16 retry_count
= 0;
2682 struct i2c_device_addr wake_up_addr
;
2684 dev_addr
= demod
->my_i2c_dev_addr
;
2685 wake_up_addr
.i2c_addr
= DRXJ_WAKE_UP_KEY
;
2686 wake_up_addr
.i2c_dev_id
= dev_addr
->i2c_dev_id
;
2687 wake_up_addr
.user_data
= dev_addr
->user_data
;
2689 * I2C access may fail in this case: no ack
2690 * dummy write must be used to wake uop device, dummy read must be used to
2691 * reset HI state machine (avoiding actual writes)
2695 drxbsp_i2c_write_read(&wake_up_addr
, 1, &data
,
2696 (struct i2c_device_addr
*)(NULL
), 0,
2700 } while ((drxbsp_i2c_write_read
2701 ((struct i2c_device_addr
*) (NULL
), 0, (u8
*)(NULL
), dev_addr
, 1,
2703 != 0) && (retry_count
< DRXJ_MAX_RETRIES_POWERUP
));
2705 /* Need some recovery time .... */
2708 if (retry_count
== DRXJ_MAX_RETRIES_POWERUP
)
2714 /*----------------------------------------------------------------------------*/
2715 /* MPEG Output Configuration Functions - begin */
2716 /*----------------------------------------------------------------------------*/
2718 * \fn int ctrl_set_cfg_mpeg_output()
2719 * \brief Set MPEG output configuration of the device.
2720 * \param devmod Pointer to demodulator instance.
2721 * \param cfg_data Pointer to mpeg output configuaration.
2724 * Configure MPEG output parameters.
2728 ctrl_set_cfg_mpeg_output(struct drx_demod_instance
*demod
, struct drx_cfg_mpeg_output
*cfg_data
)
2730 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
2731 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
2732 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) (NULL
);
2734 u16 fec_oc_reg_mode
= 0;
2735 u16 fec_oc_reg_ipr_mode
= 0;
2736 u16 fec_oc_reg_ipr_invert
= 0;
2737 u32 max_bit_rate
= 0;
2740 u16 sio_pdr_md_cfg
= 0;
2741 /* data mask for the output data byte */
2742 u16 invert_data_mask
=
2743 FEC_OC_IPR_INVERT_MD7__M
| FEC_OC_IPR_INVERT_MD6__M
|
2744 FEC_OC_IPR_INVERT_MD5__M
| FEC_OC_IPR_INVERT_MD4__M
|
2745 FEC_OC_IPR_INVERT_MD3__M
| FEC_OC_IPR_INVERT_MD2__M
|
2746 FEC_OC_IPR_INVERT_MD1__M
| FEC_OC_IPR_INVERT_MD0__M
;
2748 /* check arguments */
2749 if ((demod
== NULL
) || (cfg_data
== NULL
))
2752 dev_addr
= demod
->my_i2c_dev_addr
;
2753 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
2754 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
2756 if (cfg_data
->enable_mpeg_output
== true) {
2757 /* quick and dirty patch to set MPEG in case current std is not
2759 switch (ext_attr
->standard
) {
2760 case DRX_STANDARD_8VSB
:
2761 case DRX_STANDARD_ITU_A
:
2762 case DRX_STANDARD_ITU_B
:
2763 case DRX_STANDARD_ITU_C
:
2769 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_OCR_INVERT__A
, 0, 0);
2771 pr_err("error %d\n", rc
);
2774 switch (ext_attr
->standard
) {
2775 case DRX_STANDARD_8VSB
:
2776 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_FCT_USAGE__A
, 7, 0);
2778 pr_err("error %d\n", rc
);
2780 } /* 2048 bytes fifo ram */
2781 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_TMD_CTL_UPD_RATE__A
, 10, 0);
2783 pr_err("error %d\n", rc
);
2786 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_TMD_INT_UPD_RATE__A
, 10, 0);
2788 pr_err("error %d\n", rc
);
2791 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_AVR_PARM_A__A
, 5, 0);
2793 pr_err("error %d\n", rc
);
2796 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_AVR_PARM_B__A
, 7, 0);
2798 pr_err("error %d\n", rc
);
2801 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_RCN_GAIN__A
, 10, 0);
2803 pr_err("error %d\n", rc
);
2806 /* Low Water Mark for synchronization */
2807 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_LWM__A
, 3, 0);
2809 pr_err("error %d\n", rc
);
2812 /* High Water Mark for synchronization */
2813 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_HWM__A
, 5, 0);
2815 pr_err("error %d\n", rc
);
2819 case DRX_STANDARD_ITU_A
:
2820 case DRX_STANDARD_ITU_C
:
2821 switch (ext_attr
->constellation
) {
2822 case DRX_CONSTELLATION_QAM256
:
2825 case DRX_CONSTELLATION_QAM128
:
2828 case DRX_CONSTELLATION_QAM64
:
2831 case DRX_CONSTELLATION_QAM32
:
2834 case DRX_CONSTELLATION_QAM16
:
2839 } /* ext_attr->constellation */
2840 /* max_bit_rate = symbol_rate * nr_bits * coef */
2841 /* coef = 188/204 */
2843 (ext_attr
->curr_symbol_rate
/ 8) * nr_bits
* 188;
2844 /* fall-through - as b/c Annex A/C need following settings */
2845 case DRX_STANDARD_ITU_B
:
2846 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_FCT_USAGE__A
, FEC_OC_FCT_USAGE__PRE
, 0);
2848 pr_err("error %d\n", rc
);
2851 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_TMD_CTL_UPD_RATE__A
, FEC_OC_TMD_CTL_UPD_RATE__PRE
, 0);
2853 pr_err("error %d\n", rc
);
2856 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_TMD_INT_UPD_RATE__A
, 5, 0);
2858 pr_err("error %d\n", rc
);
2861 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_AVR_PARM_A__A
, FEC_OC_AVR_PARM_A__PRE
, 0);
2863 pr_err("error %d\n", rc
);
2866 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_AVR_PARM_B__A
, FEC_OC_AVR_PARM_B__PRE
, 0);
2868 pr_err("error %d\n", rc
);
2871 if (cfg_data
->static_clk
== true) {
2872 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_RCN_GAIN__A
, 0xD, 0);
2874 pr_err("error %d\n", rc
);
2878 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_RCN_GAIN__A
, FEC_OC_RCN_GAIN__PRE
, 0);
2880 pr_err("error %d\n", rc
);
2884 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_LWM__A
, 2, 0);
2886 pr_err("error %d\n", rc
);
2889 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_HWM__A
, 12, 0);
2891 pr_err("error %d\n", rc
);
2897 } /* switch (standard) */
2899 /* Check insertion of the Reed-Solomon parity bytes */
2900 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_MODE__A
, &fec_oc_reg_mode
, 0);
2902 pr_err("error %d\n", rc
);
2905 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_IPR_MODE__A
, &fec_oc_reg_ipr_mode
, 0);
2907 pr_err("error %d\n", rc
);
2910 if (cfg_data
->insert_rs_byte
== true) {
2911 /* enable parity symbol forward */
2912 fec_oc_reg_mode
|= FEC_OC_MODE_PARITY__M
;
2913 /* MVAL disable during parity bytes */
2914 fec_oc_reg_ipr_mode
|= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M
;
2915 switch (ext_attr
->standard
) {
2916 case DRX_STANDARD_8VSB
:
2917 rcn_rate
= 0x004854D3;
2919 case DRX_STANDARD_ITU_B
:
2920 fec_oc_reg_mode
|= FEC_OC_MODE_TRANSPARENT__M
;
2921 switch (ext_attr
->constellation
) {
2922 case DRX_CONSTELLATION_QAM256
:
2923 rcn_rate
= 0x008945E7;
2925 case DRX_CONSTELLATION_QAM64
:
2926 rcn_rate
= 0x005F64D4;
2932 case DRX_STANDARD_ITU_A
:
2933 case DRX_STANDARD_ITU_C
:
2934 /* insert_rs_byte = true -> coef = 188/188 -> 1, RS bits are in MPEG output */
2938 (u32
) (common_attr
->sys_clock_freq
/ 8))) /
2943 } /* ext_attr->standard */
2944 } else { /* insert_rs_byte == false */
2946 /* disable parity symbol forward */
2947 fec_oc_reg_mode
&= (~FEC_OC_MODE_PARITY__M
);
2948 /* MVAL enable during parity bytes */
2949 fec_oc_reg_ipr_mode
&= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M
);
2950 switch (ext_attr
->standard
) {
2951 case DRX_STANDARD_8VSB
:
2952 rcn_rate
= 0x0041605C;
2954 case DRX_STANDARD_ITU_B
:
2955 fec_oc_reg_mode
&= (~FEC_OC_MODE_TRANSPARENT__M
);
2956 switch (ext_attr
->constellation
) {
2957 case DRX_CONSTELLATION_QAM256
:
2958 rcn_rate
= 0x0082D6A0;
2960 case DRX_CONSTELLATION_QAM64
:
2961 rcn_rate
= 0x005AEC1A;
2967 case DRX_STANDARD_ITU_A
:
2968 case DRX_STANDARD_ITU_C
:
2969 /* insert_rs_byte = false -> coef = 188/204, RS bits not in MPEG output */
2973 (u32
) (common_attr
->sys_clock_freq
/ 8))) /
2978 } /* ext_attr->standard */
2981 if (cfg_data
->enable_parallel
== true) { /* MPEG data output is parallel -> clear ipr_mode[0] */
2982 fec_oc_reg_ipr_mode
&= (~(FEC_OC_IPR_MODE_SERIAL__M
));
2983 } else { /* MPEG data output is serial -> set ipr_mode[0] */
2984 fec_oc_reg_ipr_mode
|= FEC_OC_IPR_MODE_SERIAL__M
;
2987 /* Control slective inversion of output bits */
2988 if (cfg_data
->invert_data
== true)
2989 fec_oc_reg_ipr_invert
|= invert_data_mask
;
2991 fec_oc_reg_ipr_invert
&= (~(invert_data_mask
));
2993 if (cfg_data
->invert_err
== true)
2994 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MERR__M
;
2996 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MERR__M
));
2998 if (cfg_data
->invert_str
== true)
2999 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MSTRT__M
;
3001 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MSTRT__M
));
3003 if (cfg_data
->invert_val
== true)
3004 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MVAL__M
;
3006 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MVAL__M
));
3008 if (cfg_data
->invert_clk
== true)
3009 fec_oc_reg_ipr_invert
|= FEC_OC_IPR_INVERT_MCLK__M
;
3011 fec_oc_reg_ipr_invert
&= (~(FEC_OC_IPR_INVERT_MCLK__M
));
3014 if (cfg_data
->static_clk
== true) { /* Static mode */
3017 u16 fec_oc_dto_burst_len
= 0;
3018 u16 fec_oc_dto_period
= 0;
3020 fec_oc_dto_burst_len
= FEC_OC_DTO_BURST_LEN__PRE
;
3022 switch (ext_attr
->standard
) {
3023 case DRX_STANDARD_8VSB
:
3024 fec_oc_dto_period
= 4;
3025 if (cfg_data
->insert_rs_byte
== true)
3026 fec_oc_dto_burst_len
= 208;
3028 case DRX_STANDARD_ITU_A
:
3030 u32 symbol_rate_th
= 6400000;
3031 if (cfg_data
->insert_rs_byte
== true) {
3032 fec_oc_dto_burst_len
= 204;
3033 symbol_rate_th
= 5900000;
3035 if (ext_attr
->curr_symbol_rate
>=
3037 fec_oc_dto_period
= 0;
3039 fec_oc_dto_period
= 1;
3043 case DRX_STANDARD_ITU_B
:
3044 fec_oc_dto_period
= 1;
3045 if (cfg_data
->insert_rs_byte
== true)
3046 fec_oc_dto_burst_len
= 128;
3048 case DRX_STANDARD_ITU_C
:
3049 fec_oc_dto_period
= 1;
3050 if (cfg_data
->insert_rs_byte
== true)
3051 fec_oc_dto_burst_len
= 204;
3057 common_attr
->sys_clock_freq
* 1000 / (fec_oc_dto_period
+
3060 frac28(bit_rate
, common_attr
->sys_clock_freq
* 1000);
3062 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_RATE_HI__A
, (u16
)((dto_rate
>> 16) & FEC_OC_DTO_RATE_HI__M
), 0);
3064 pr_err("error %d\n", rc
);
3067 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);
3069 pr_err("error %d\n", rc
);
3072 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);
3074 pr_err("error %d\n", rc
);
3077 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);
3079 pr_err("error %d\n", rc
);
3082 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_BURST_LEN__A
, fec_oc_dto_burst_len
, 0);
3084 pr_err("error %d\n", rc
);
3087 if (ext_attr
->mpeg_output_clock_rate
!= DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO
)
3088 fec_oc_dto_period
= ext_attr
->mpeg_output_clock_rate
- 1;
3089 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_PERIOD__A
, fec_oc_dto_period
, 0);
3091 pr_err("error %d\n", rc
);
3094 } else { /* Dynamic mode */
3096 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DTO_MODE__A
, FEC_OC_DTO_MODE_DYNAMIC__M
, 0);
3098 pr_err("error %d\n", rc
);
3101 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_FCT_MODE__A
, 0, 0);
3103 pr_err("error %d\n", rc
);
3108 rc
= drxdap_fasi_write_reg32(dev_addr
, FEC_OC_RCN_CTL_RATE_LO__A
, rcn_rate
, 0);
3110 pr_err("error %d\n", rc
);
3114 /* Write appropriate registers with requested configuration */
3115 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_MODE__A
, fec_oc_reg_mode
, 0);
3117 pr_err("error %d\n", rc
);
3120 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_IPR_MODE__A
, fec_oc_reg_ipr_mode
, 0);
3122 pr_err("error %d\n", rc
);
3125 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_IPR_INVERT__A
, fec_oc_reg_ipr_invert
, 0);
3127 pr_err("error %d\n", rc
);
3131 /* enabling for both parallel and serial now */
3132 /* Write magic word to enable pdr reg write */
3133 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0xFABA, 0);
3135 pr_err("error %d\n", rc
);
3138 /* Set MPEG TS pads to outputmode */
3139 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MSTRT_CFG__A
, 0x0013, 0);
3141 pr_err("error %d\n", rc
);
3144 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MERR_CFG__A
, 0x0013, 0);
3146 pr_err("error %d\n", rc
);
3149 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);
3151 pr_err("error %d\n", rc
);
3154 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MVAL_CFG__A
, 0x0013, 0);
3156 pr_err("error %d\n", rc
);
3160 MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
<<
3161 SIO_PDR_MD0_CFG_DRIVE__B
| 0x03 << SIO_PDR_MD0_CFG_MODE__B
;
3162 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD0_CFG__A
, sio_pdr_md_cfg
, 0);
3164 pr_err("error %d\n", rc
);
3167 if (cfg_data
->enable_parallel
== true) { /* MPEG data output is parallel -> set MD1 to MD7 to output mode */
3169 MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
<<
3170 SIO_PDR_MD0_CFG_DRIVE__B
| 0x03 <<
3171 SIO_PDR_MD0_CFG_MODE__B
;
3172 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD0_CFG__A
, sio_pdr_md_cfg
, 0);
3174 pr_err("error %d\n", rc
);
3177 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD1_CFG__A
, sio_pdr_md_cfg
, 0);
3179 pr_err("error %d\n", rc
);
3182 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD2_CFG__A
, sio_pdr_md_cfg
, 0);
3184 pr_err("error %d\n", rc
);
3187 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD3_CFG__A
, sio_pdr_md_cfg
, 0);
3189 pr_err("error %d\n", rc
);
3192 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD4_CFG__A
, sio_pdr_md_cfg
, 0);
3194 pr_err("error %d\n", rc
);
3197 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD5_CFG__A
, sio_pdr_md_cfg
, 0);
3199 pr_err("error %d\n", rc
);
3202 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD6_CFG__A
, sio_pdr_md_cfg
, 0);
3204 pr_err("error %d\n", rc
);
3207 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD7_CFG__A
, sio_pdr_md_cfg
, 0);
3209 pr_err("error %d\n", rc
);
3212 } else { /* MPEG data output is serial -> set MD1 to MD7 to tri-state */
3213 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD1_CFG__A
, 0x0000, 0);
3215 pr_err("error %d\n", rc
);
3218 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD2_CFG__A
, 0x0000, 0);
3220 pr_err("error %d\n", rc
);
3223 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD3_CFG__A
, 0x0000, 0);
3225 pr_err("error %d\n", rc
);
3228 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD4_CFG__A
, 0x0000, 0);
3230 pr_err("error %d\n", rc
);
3233 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD5_CFG__A
, 0x0000, 0);
3235 pr_err("error %d\n", rc
);
3238 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD6_CFG__A
, 0x0000, 0);
3240 pr_err("error %d\n", rc
);
3243 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD7_CFG__A
, 0x0000, 0);
3245 pr_err("error %d\n", rc
);
3249 /* Enable Monitor Bus output over MPEG pads and ctl input */
3250 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MON_CFG__A
, 0x0000, 0);
3252 pr_err("error %d\n", rc
);
3255 /* Write nomagic word to enable pdr reg write */
3256 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3258 pr_err("error %d\n", rc
);
3262 /* Write magic word to enable pdr reg write */
3263 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0xFABA, 0);
3265 pr_err("error %d\n", rc
);
3268 /* Set MPEG TS pads to inputmode */
3269 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MSTRT_CFG__A
, 0x0000, 0);
3271 pr_err("error %d\n", rc
);
3274 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MERR_CFG__A
, 0x0000, 0);
3276 pr_err("error %d\n", rc
);
3279 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MCLK_CFG__A
, 0x0000, 0);
3281 pr_err("error %d\n", rc
);
3284 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MVAL_CFG__A
, 0x0000, 0);
3286 pr_err("error %d\n", rc
);
3289 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD0_CFG__A
, 0x0000, 0);
3291 pr_err("error %d\n", rc
);
3294 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD1_CFG__A
, 0x0000, 0);
3296 pr_err("error %d\n", rc
);
3299 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD2_CFG__A
, 0x0000, 0);
3301 pr_err("error %d\n", rc
);
3304 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD3_CFG__A
, 0x0000, 0);
3306 pr_err("error %d\n", rc
);
3309 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD4_CFG__A
, 0x0000, 0);
3311 pr_err("error %d\n", rc
);
3314 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD5_CFG__A
, 0x0000, 0);
3316 pr_err("error %d\n", rc
);
3319 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD6_CFG__A
, 0x0000, 0);
3321 pr_err("error %d\n", rc
);
3324 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MD7_CFG__A
, 0x0000, 0);
3326 pr_err("error %d\n", rc
);
3329 /* Enable Monitor Bus output over MPEG pads and ctl input */
3330 rc
= drxj_dap_write_reg16(dev_addr
, SIO_PDR_MON_CFG__A
, 0x0000, 0);
3332 pr_err("error %d\n", rc
);
3335 /* Write nomagic word to enable pdr reg write */
3336 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3338 pr_err("error %d\n", rc
);
3343 /* save values for restore after re-acquire */
3344 common_attr
->mpeg_cfg
.enable_mpeg_output
= cfg_data
->enable_mpeg_output
;
3351 /*----------------------------------------------------------------------------*/
3354 /*----------------------------------------------------------------------------*/
3355 /* MPEG Output Configuration Functions - end */
3356 /*----------------------------------------------------------------------------*/
3358 /*----------------------------------------------------------------------------*/
3359 /* miscellaneous configurations - begin */
3360 /*----------------------------------------------------------------------------*/
3363 * \fn int set_mpegtei_handling()
3364 * \brief Activate MPEG TEI handling settings.
3365 * \param devmod Pointer to demodulator instance.
3368 * This routine should be called during a set channel of QAM/VSB
3371 static int set_mpegtei_handling(struct drx_demod_instance
*demod
)
3373 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3374 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
3376 u16 fec_oc_dpr_mode
= 0;
3377 u16 fec_oc_snc_mode
= 0;
3378 u16 fec_oc_ems_mode
= 0;
3380 dev_addr
= demod
->my_i2c_dev_addr
;
3381 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3383 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_DPR_MODE__A
, &fec_oc_dpr_mode
, 0);
3385 pr_err("error %d\n", rc
);
3388 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_SNC_MODE__A
, &fec_oc_snc_mode
, 0);
3390 pr_err("error %d\n", rc
);
3393 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_EMS_MODE__A
, &fec_oc_ems_mode
, 0);
3395 pr_err("error %d\n", rc
);
3399 /* reset to default, allow TEI bit to be changed */
3400 fec_oc_dpr_mode
&= (~FEC_OC_DPR_MODE_ERR_DISABLE__M
);
3401 fec_oc_snc_mode
&= (~(FEC_OC_SNC_MODE_ERROR_CTL__M
|
3402 FEC_OC_SNC_MODE_CORR_DISABLE__M
));
3403 fec_oc_ems_mode
&= (~FEC_OC_EMS_MODE_MODE__M
);
3405 if (ext_attr
->disable_te_ihandling
) {
3406 /* do not change TEI bit */
3407 fec_oc_dpr_mode
|= FEC_OC_DPR_MODE_ERR_DISABLE__M
;
3408 fec_oc_snc_mode
|= FEC_OC_SNC_MODE_CORR_DISABLE__M
|
3409 ((0x2) << (FEC_OC_SNC_MODE_ERROR_CTL__B
));
3410 fec_oc_ems_mode
|= ((0x01) << (FEC_OC_EMS_MODE_MODE__B
));
3413 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_DPR_MODE__A
, fec_oc_dpr_mode
, 0);
3415 pr_err("error %d\n", rc
);
3418 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_MODE__A
, fec_oc_snc_mode
, 0);
3420 pr_err("error %d\n", rc
);
3423 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_EMS_MODE__A
, fec_oc_ems_mode
, 0);
3425 pr_err("error %d\n", rc
);
3434 /*----------------------------------------------------------------------------*/
3436 * \fn int bit_reverse_mpeg_output()
3437 * \brief Set MPEG output bit-endian settings.
3438 * \param devmod Pointer to demodulator instance.
3441 * This routine should be called during a set channel of QAM/VSB
3444 static int bit_reverse_mpeg_output(struct drx_demod_instance
*demod
)
3446 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3447 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
3449 u16 fec_oc_ipr_mode
= 0;
3451 dev_addr
= demod
->my_i2c_dev_addr
;
3452 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3454 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_IPR_MODE__A
, &fec_oc_ipr_mode
, 0);
3456 pr_err("error %d\n", rc
);
3460 /* reset to default (normal bit order) */
3461 fec_oc_ipr_mode
&= (~FEC_OC_IPR_MODE_REVERSE_ORDER__M
);
3463 if (ext_attr
->bit_reverse_mpeg_outout
)
3464 fec_oc_ipr_mode
|= FEC_OC_IPR_MODE_REVERSE_ORDER__M
;
3466 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_IPR_MODE__A
, fec_oc_ipr_mode
, 0);
3468 pr_err("error %d\n", rc
);
3477 /*----------------------------------------------------------------------------*/
3479 * \fn int set_mpeg_start_width()
3480 * \brief Set MPEG start width.
3481 * \param devmod Pointer to demodulator instance.
3484 * This routine should be called during a set channel of QAM/VSB
3487 static int set_mpeg_start_width(struct drx_demod_instance
*demod
)
3489 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3490 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)(NULL
);
3491 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) NULL
;
3493 u16 fec_oc_comm_mb
= 0;
3495 dev_addr
= demod
->my_i2c_dev_addr
;
3496 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3497 common_attr
= demod
->my_common_attr
;
3499 if ((common_attr
->mpeg_cfg
.static_clk
== true)
3500 && (common_attr
->mpeg_cfg
.enable_parallel
== false)) {
3501 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_COMM_MB__A
, &fec_oc_comm_mb
, 0);
3503 pr_err("error %d\n", rc
);
3506 fec_oc_comm_mb
&= ~FEC_OC_COMM_MB_CTL_ON
;
3507 if (ext_attr
->mpeg_start_width
== DRXJ_MPEG_START_WIDTH_8CLKCYC
)
3508 fec_oc_comm_mb
|= FEC_OC_COMM_MB_CTL_ON
;
3509 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_COMM_MB__A
, fec_oc_comm_mb
, 0);
3511 pr_err("error %d\n", rc
);
3521 /*----------------------------------------------------------------------------*/
3522 /* miscellaneous configurations - end */
3523 /*----------------------------------------------------------------------------*/
3525 /*----------------------------------------------------------------------------*/
3526 /* UIO Configuration Functions - begin */
3527 /*----------------------------------------------------------------------------*/
3529 * \fn int ctrl_set_uio_cfg()
3530 * \brief Configure modus oprandi UIO.
3531 * \param demod Pointer to demodulator instance.
3532 * \param uio_cfg Pointer to a configuration setting for a certain UIO.
3535 static int ctrl_set_uio_cfg(struct drx_demod_instance
*demod
, struct drxuio_cfg
*uio_cfg
)
3537 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3540 if ((uio_cfg
== NULL
) || (demod
== NULL
))
3543 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3545 /* Write magic word to enable pdr reg write */
3546 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
3548 pr_err("error %d\n", rc
);
3551 switch (uio_cfg
->uio
) {
3552 /*====================================================================*/
3554 /* DRX_UIO1: SMA_TX UIO-1 */
3555 if (!ext_attr
->has_smatx
)
3557 switch (uio_cfg
->mode
) {
3558 case DRX_UIO_MODE_FIRMWARE_SMA
: /* fall through */
3559 case DRX_UIO_MODE_FIRMWARE_SAW
: /* fall through */
3560 case DRX_UIO_MODE_READWRITE
:
3561 ext_attr
->uio_sma_tx_mode
= uio_cfg
->mode
;
3563 case DRX_UIO_MODE_DISABLE
:
3564 ext_attr
->uio_sma_tx_mode
= uio_cfg
->mode
;
3565 /* pad configuration register is set 0 - input mode */
3566 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_TX_CFG__A
, 0, 0);
3568 pr_err("error %d\n", rc
);
3574 } /* switch ( uio_cfg->mode ) */
3576 /*====================================================================*/
3578 /* DRX_UIO2: SMA_RX UIO-2 */
3579 if (!ext_attr
->has_smarx
)
3581 switch (uio_cfg
->mode
) {
3582 case DRX_UIO_MODE_FIRMWARE0
: /* fall through */
3583 case DRX_UIO_MODE_READWRITE
:
3584 ext_attr
->uio_sma_rx_mode
= uio_cfg
->mode
;
3586 case DRX_UIO_MODE_DISABLE
:
3587 ext_attr
->uio_sma_rx_mode
= uio_cfg
->mode
;
3588 /* pad configuration register is set 0 - input mode */
3589 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_RX_CFG__A
, 0, 0);
3591 pr_err("error %d\n", rc
);
3598 } /* switch ( uio_cfg->mode ) */
3600 /*====================================================================*/
3602 /* DRX_UIO3: GPIO UIO-3 */
3603 if (!ext_attr
->has_gpio
)
3605 switch (uio_cfg
->mode
) {
3606 case DRX_UIO_MODE_FIRMWARE0
: /* fall through */
3607 case DRX_UIO_MODE_READWRITE
:
3608 ext_attr
->uio_gpio_mode
= uio_cfg
->mode
;
3610 case DRX_UIO_MODE_DISABLE
:
3611 ext_attr
->uio_gpio_mode
= uio_cfg
->mode
;
3612 /* pad configuration register is set 0 - input mode */
3613 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_GPIO_CFG__A
, 0, 0);
3615 pr_err("error %d\n", rc
);
3622 } /* switch ( uio_cfg->mode ) */
3624 /*====================================================================*/
3626 /* DRX_UIO4: IRQN UIO-4 */
3627 if (!ext_attr
->has_irqn
)
3629 switch (uio_cfg
->mode
) {
3630 case DRX_UIO_MODE_READWRITE
:
3631 ext_attr
->uio_irqn_mode
= uio_cfg
->mode
;
3633 case DRX_UIO_MODE_DISABLE
:
3634 /* pad configuration register is set 0 - input mode */
3635 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_IRQN_CFG__A
, 0, 0);
3637 pr_err("error %d\n", rc
);
3640 ext_attr
->uio_irqn_mode
= uio_cfg
->mode
;
3642 case DRX_UIO_MODE_FIRMWARE0
: /* fall through */
3646 } /* switch ( uio_cfg->mode ) */
3648 /*====================================================================*/
3651 } /* switch ( uio_cfg->uio ) */
3653 /* Write magic word to disable pdr reg write */
3654 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3656 pr_err("error %d\n", rc
);
3666 * \fn int ctrl_uio_write()
3667 * \brief Write to a UIO.
3668 * \param demod Pointer to demodulator instance.
3669 * \param uio_data Pointer to data container for a certain UIO.
3673 ctrl_uio_write(struct drx_demod_instance
*demod
, struct drxuio_data
*uio_data
)
3675 struct drxj_data
*ext_attr
= (struct drxj_data
*) (NULL
);
3677 u16 pin_cfg_value
= 0;
3680 if ((uio_data
== NULL
) || (demod
== NULL
))
3683 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3685 /* Write magic word to enable pdr reg write */
3686 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
3688 pr_err("error %d\n", rc
);
3691 switch (uio_data
->uio
) {
3692 /*====================================================================*/
3694 /* DRX_UIO1: SMA_TX UIO-1 */
3695 if (!ext_attr
->has_smatx
)
3697 if ((ext_attr
->uio_sma_tx_mode
!= DRX_UIO_MODE_READWRITE
)
3698 && (ext_attr
->uio_sma_tx_mode
!= DRX_UIO_MODE_FIRMWARE_SAW
)) {
3702 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3703 pin_cfg_value
|= 0x0113;
3704 /* io_pad_cfg_mode output mode is drive always */
3705 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3707 /* write to io pad configuration register - output mode */
3708 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_TX_CFG__A
, pin_cfg_value
, 0);
3710 pr_err("error %d\n", rc
);
3714 /* use corresponding bit in io data output registar */
3715 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, &value
, 0);
3717 pr_err("error %d\n", rc
);
3720 if (!uio_data
->value
)
3721 value
&= 0x7FFF; /* write zero to 15th bit - 1st UIO */
3723 value
|= 0x8000; /* write one to 15th bit - 1st UIO */
3725 /* write back to io data output register */
3726 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, value
, 0);
3728 pr_err("error %d\n", rc
);
3732 /*======================================================================*/
3734 /* DRX_UIO2: SMA_RX UIO-2 */
3735 if (!ext_attr
->has_smarx
)
3737 if (ext_attr
->uio_sma_rx_mode
!= DRX_UIO_MODE_READWRITE
)
3741 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3742 pin_cfg_value
|= 0x0113;
3743 /* io_pad_cfg_mode output mode is drive always */
3744 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3746 /* write to io pad configuration register - output mode */
3747 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_RX_CFG__A
, pin_cfg_value
, 0);
3749 pr_err("error %d\n", rc
);
3753 /* use corresponding bit in io data output registar */
3754 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, &value
, 0);
3756 pr_err("error %d\n", rc
);
3759 if (!uio_data
->value
)
3760 value
&= 0xBFFF; /* write zero to 14th bit - 2nd UIO */
3762 value
|= 0x4000; /* write one to 14th bit - 2nd UIO */
3764 /* write back to io data output register */
3765 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, value
, 0);
3767 pr_err("error %d\n", rc
);
3771 /*====================================================================*/
3773 /* DRX_UIO3: ASEL UIO-3 */
3774 if (!ext_attr
->has_gpio
)
3776 if (ext_attr
->uio_gpio_mode
!= DRX_UIO_MODE_READWRITE
)
3780 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3781 pin_cfg_value
|= 0x0113;
3782 /* io_pad_cfg_mode output mode is drive always */
3783 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3785 /* write to io pad configuration register - output mode */
3786 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_GPIO_CFG__A
, pin_cfg_value
, 0);
3788 pr_err("error %d\n", rc
);
3792 /* use corresponding bit in io data output registar */
3793 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_HI__A
, &value
, 0);
3795 pr_err("error %d\n", rc
);
3798 if (!uio_data
->value
)
3799 value
&= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
3801 value
|= 0x0004; /* write one to 2nd bit - 3rd UIO */
3803 /* write back to io data output register */
3804 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_HI__A
, value
, 0);
3806 pr_err("error %d\n", rc
);
3810 /*=====================================================================*/
3812 /* DRX_UIO4: IRQN UIO-4 */
3813 if (!ext_attr
->has_irqn
)
3816 if (ext_attr
->uio_irqn_mode
!= DRX_UIO_MODE_READWRITE
)
3820 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3821 pin_cfg_value
|= 0x0113;
3822 /* io_pad_cfg_mode output mode is drive always */
3823 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3825 /* write to io pad configuration register - output mode */
3826 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_IRQN_CFG__A
, pin_cfg_value
, 0);
3828 pr_err("error %d\n", rc
);
3832 /* use corresponding bit in io data output registar */
3833 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, &value
, 0);
3835 pr_err("error %d\n", rc
);
3838 if (uio_data
->value
== false)
3839 value
&= 0xEFFF; /* write zero to 12th bit - 4th UIO */
3841 value
|= 0x1000; /* write one to 12th bit - 4th UIO */
3843 /* write back to io data output register */
3844 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_UIO_OUT_LO__A
, value
, 0);
3846 pr_err("error %d\n", rc
);
3850 /*=====================================================================*/
3853 } /* switch ( uio_data->uio ) */
3855 /* Write magic word to disable pdr reg write */
3856 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3858 pr_err("error %d\n", rc
);
3867 /*---------------------------------------------------------------------------*/
3868 /* UIO Configuration Functions - end */
3869 /*---------------------------------------------------------------------------*/
3871 /*----------------------------------------------------------------------------*/
3872 /* I2C Bridge Functions - begin */
3873 /*----------------------------------------------------------------------------*/
3875 * \fn int ctrl_i2c_bridge()
3876 * \brief Open or close the I2C switch to tuner.
3877 * \param demod Pointer to demodulator instance.
3878 * \param bridge_closed Pointer to bool indication if bridge is closed not.
3883 ctrl_i2c_bridge(struct drx_demod_instance
*demod
, bool *bridge_closed
)
3885 struct drxj_hi_cmd hi_cmd
;
3888 /* check arguments */
3889 if (bridge_closed
== NULL
)
3892 hi_cmd
.cmd
= SIO_HI_RA_RAM_CMD_BRDCTRL
;
3893 hi_cmd
.param1
= SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY
;
3895 hi_cmd
.param2
= SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED
;
3897 hi_cmd
.param2
= SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN
;
3899 return hi_command(demod
->my_i2c_dev_addr
, &hi_cmd
, &result
);
3902 /*----------------------------------------------------------------------------*/
3903 /* I2C Bridge Functions - end */
3904 /*----------------------------------------------------------------------------*/
3906 /*----------------------------------------------------------------------------*/
3907 /* Smart antenna Functions - begin */
3908 /*----------------------------------------------------------------------------*/
3910 * \fn int smart_ant_init()
3911 * \brief Initialize Smart Antenna.
3912 * \param pointer to struct drx_demod_instance.
3916 static int smart_ant_init(struct drx_demod_instance
*demod
)
3918 struct drxj_data
*ext_attr
= NULL
;
3919 struct i2c_device_addr
*dev_addr
= NULL
;
3920 struct drxuio_cfg uio_cfg
= { DRX_UIO1
, DRX_UIO_MODE_FIRMWARE_SMA
};
3924 dev_addr
= demod
->my_i2c_dev_addr
;
3925 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
3927 /* Write magic word to enable pdr reg write */
3928 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
, 0);
3930 pr_err("error %d\n", rc
);
3933 /* init smart antenna */
3934 rc
= drxj_dap_read_reg16(dev_addr
, SIO_SA_TX_COMMAND__A
, &data
, 0);
3936 pr_err("error %d\n", rc
);
3939 if (ext_attr
->smart_ant_inverted
) {
3940 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);
3942 pr_err("error %d\n", rc
);
3946 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);
3948 pr_err("error %d\n", rc
);
3953 /* config SMA_TX pin to smart antenna mode */
3954 rc
= ctrl_set_uio_cfg(demod
, &uio_cfg
);
3956 pr_err("error %d\n", rc
);
3959 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_TX_CFG__A
, 0x13, 0);
3961 pr_err("error %d\n", rc
);
3964 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_PDR_SMA_TX_GPIO_FNC__A
, 0x03, 0);
3966 pr_err("error %d\n", rc
);
3970 /* Write magic word to disable pdr reg write */
3971 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
3973 pr_err("error %d\n", rc
);
3982 static int scu_command(struct i2c_device_addr
*dev_addr
, struct drxjscu_cmd
*cmd
)
3986 unsigned long timeout
;
3992 /* Wait until SCU command interface is ready to receive command */
3993 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_COMMAND__A
, &cur_cmd
, 0);
3995 pr_err("error %d\n", rc
);
3998 if (cur_cmd
!= DRX_SCU_READY
)
4001 switch (cmd
->parameter_len
) {
4003 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_4__A
, *(cmd
->parameter
+ 4), 0);
4005 pr_err("error %d\n", rc
);
4009 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_3__A
, *(cmd
->parameter
+ 3), 0);
4011 pr_err("error %d\n", rc
);
4015 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_2__A
, *(cmd
->parameter
+ 2), 0);
4017 pr_err("error %d\n", rc
);
4021 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_1__A
, *(cmd
->parameter
+ 1), 0);
4023 pr_err("error %d\n", rc
);
4027 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_PARAM_0__A
, *(cmd
->parameter
+ 0), 0);
4029 pr_err("error %d\n", rc
);
4036 /* this number of parameters is not supported */
4039 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_COMMAND__A
, cmd
->command
, 0);
4041 pr_err("error %d\n", rc
);
4045 /* Wait until SCU has processed command */
4046 timeout
= jiffies
+ msecs_to_jiffies(DRXJ_MAX_WAITTIME
);
4047 while (time_is_after_jiffies(timeout
)) {
4048 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_COMMAND__A
, &cur_cmd
, 0);
4050 pr_err("error %d\n", rc
);
4053 if (cur_cmd
== DRX_SCU_READY
)
4055 usleep_range(1000, 2000);
4058 if (cur_cmd
!= DRX_SCU_READY
)
4062 if ((cmd
->result_len
> 0) && (cmd
->result
!= NULL
)) {
4065 switch (cmd
->result_len
) {
4067 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_PARAM_3__A
, cmd
->result
+ 3, 0);
4069 pr_err("error %d\n", rc
);
4073 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_PARAM_2__A
, cmd
->result
+ 2, 0);
4075 pr_err("error %d\n", rc
);
4079 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_PARAM_1__A
, cmd
->result
+ 1, 0);
4081 pr_err("error %d\n", rc
);
4085 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_PARAM_0__A
, cmd
->result
+ 0, 0);
4087 pr_err("error %d\n", rc
);
4094 /* this number of parameters is not supported */
4098 /* Check if an error was reported by SCU */
4099 err
= cmd
->result
[0];
4101 /* check a few fixed error codes */
4102 if ((err
== (s16
) SCU_RAM_PARAM_0_RESULT_UNKSTD
)
4103 || (err
== (s16
) SCU_RAM_PARAM_0_RESULT_UNKCMD
)
4104 || (err
== (s16
) SCU_RAM_PARAM_0_RESULT_INVPAR
)
4105 || (err
== (s16
) SCU_RAM_PARAM_0_RESULT_SIZE
)
4109 /* here it is assumed that negative means error, and positive no error */
4123 * \fn int DRXJ_DAP_SCUAtomicReadWriteBlock()
4124 * \brief Basic access routine for SCU atomic read or write access
4125 * \param dev_addr pointer to i2c dev address
4126 * \param addr destination/source address
4127 * \param datasize size of data buffer in bytes
4128 * \param data pointer to data buffer
4131 * \retval -EIO Timeout, I2C error, illegal bank
4134 #define ADDR_AT_SCU_SPACE(x) ((x - 0x82E000) * 2)
4136 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 */
4137 u8
*data
, bool read_flag
)
4139 struct drxjscu_cmd scu_cmd
;
4141 u16 set_param_parameters
[18];
4144 /* Parameter check */
4145 if (!data
|| !dev_addr
|| (datasize
% 2) || ((datasize
/ 2) > 16))
4148 set_param_parameters
[1] = (u16
) ADDR_AT_SCU_SPACE(addr
);
4149 if (read_flag
) { /* read */
4150 set_param_parameters
[0] = ((~(0x0080)) & datasize
);
4151 scu_cmd
.parameter_len
= 2;
4152 scu_cmd
.result_len
= datasize
/ 2 + 2;
4156 set_param_parameters
[0] = 0x0080 | datasize
;
4157 for (i
= 0; i
< (datasize
/ 2); i
++) {
4158 set_param_parameters
[i
+ 2] =
4159 (data
[2 * i
] | (data
[(2 * i
) + 1] << 8));
4161 scu_cmd
.parameter_len
= datasize
/ 2 + 2;
4162 scu_cmd
.result_len
= 1;
4166 SCU_RAM_COMMAND_STANDARD_TOP
|
4167 SCU_RAM_COMMAND_CMD_AUX_SCU_ATOMIC_ACCESS
;
4168 scu_cmd
.result
= cmd_result
;
4169 scu_cmd
.parameter
= set_param_parameters
;
4170 rc
= scu_command(dev_addr
, &scu_cmd
);
4172 pr_err("error %d\n", rc
);
4178 /* read data from buffer */
4179 for (i
= 0; i
< (datasize
/ 2); i
++) {
4180 data
[2 * i
] = (u8
) (scu_cmd
.result
[i
+ 2] & 0xFF);
4181 data
[(2 * i
) + 1] = (u8
) (scu_cmd
.result
[i
+ 2] >> 8);
4192 /*============================================================================*/
4195 * \fn int DRXJ_DAP_AtomicReadReg16()
4196 * \brief Atomic read of 16 bits words
4199 int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr
*dev_addr
,
4201 u16
*data
, u32 flags
)
4210 rc
= drxj_dap_scu_atomic_read_write_block(dev_addr
, addr
, 2, buf
, true);
4214 word
= (u16
) (buf
[0] + (buf
[1] << 8));
4221 /*============================================================================*/
4223 * \fn int drxj_dap_scu_atomic_write_reg16()
4224 * \brief Atomic read of 16 bits words
4227 int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr
*dev_addr
,
4229 u16 data
, u32 flags
)
4234 buf
[0] = (u8
) (data
& 0xff);
4235 buf
[1] = (u8
) ((data
>> 8) & 0xff);
4237 rc
= drxj_dap_scu_atomic_read_write_block(dev_addr
, addr
, 2, buf
, false);
4242 /* -------------------------------------------------------------------------- */
4244 * \brief Measure result of ADC synchronisation
4245 * \param demod demod instance
4246 * \param count (returned) count
4249 * \retval -EIO Failure: I2C error
4252 static int adc_sync_measurement(struct drx_demod_instance
*demod
, u16
*count
)
4254 struct i2c_device_addr
*dev_addr
= NULL
;
4258 dev_addr
= demod
->my_i2c_dev_addr
;
4260 /* Start measurement */
4261 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_COMM_EXEC__A
, IQM_AF_COMM_EXEC_ACTIVE
, 0);
4263 pr_err("error %d\n", rc
);
4266 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_START_LOCK__A
, 1, 0);
4268 pr_err("error %d\n", rc
);
4272 /* Wait at least 3*128*(1/sysclk) <<< 1 millisec */
4276 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_PHASE0__A
, &data
, 0);
4278 pr_err("error %d\n", rc
);
4282 *count
= *count
+ 1;
4283 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_PHASE1__A
, &data
, 0);
4285 pr_err("error %d\n", rc
);
4289 *count
= *count
+ 1;
4290 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_PHASE2__A
, &data
, 0);
4292 pr_err("error %d\n", rc
);
4296 *count
= *count
+ 1;
4304 * \brief Synchronize analog and digital clock domains
4305 * \param demod demod instance
4308 * \retval -EIO Failure: I2C error or failure to synchronize
4310 * An IQM reset will also reset the results of this synchronization.
4311 * After an IQM reset this routine needs to be called again.
4315 static int adc_synchronization(struct drx_demod_instance
*demod
)
4317 struct i2c_device_addr
*dev_addr
= NULL
;
4321 dev_addr
= demod
->my_i2c_dev_addr
;
4323 rc
= adc_sync_measurement(demod
, &count
);
4325 pr_err("error %d\n", rc
);
4330 /* Try sampling on a different edge */
4333 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_CLKNEG__A
, &clk_neg
, 0);
4335 pr_err("error %d\n", rc
);
4339 clk_neg
^= IQM_AF_CLKNEG_CLKNEGDATA__M
;
4340 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLKNEG__A
, clk_neg
, 0);
4342 pr_err("error %d\n", rc
);
4346 rc
= adc_sync_measurement(demod
, &count
);
4348 pr_err("error %d\n", rc
);
4353 /* TODO: implement fallback scenarios */
4362 /*============================================================================*/
4363 /*== END AUXILIARY FUNCTIONS ==*/
4364 /*============================================================================*/
4366 /*============================================================================*/
4367 /*============================================================================*/
4368 /*== 8VSB & QAM COMMON DATAPATH FUNCTIONS ==*/
4369 /*============================================================================*/
4370 /*============================================================================*/
4372 * \fn int init_agc ()
4373 * \brief Initialize AGC for all standards.
4374 * \param demod instance of demodulator.
4375 * \param channel pointer to channel data.
4378 static int init_agc(struct drx_demod_instance
*demod
)
4380 struct i2c_device_addr
*dev_addr
= NULL
;
4381 struct drx_common_attr
*common_attr
= NULL
;
4382 struct drxj_data
*ext_attr
= NULL
;
4383 struct drxj_cfg_agc
*p_agc_rf_settings
= NULL
;
4384 struct drxj_cfg_agc
*p_agc_if_settings
= NULL
;
4386 u16 ingain_tgt_max
= 0;
4388 u16 sns_sum_max
= 0;
4389 u16 clp_sum_max
= 0;
4391 u16 ki_innergain_min
= 0;
4394 u16 if_iaccu_hi_tgt_min
= 0;
4396 u16 agc_ki_dgain
= 0;
4398 u16 clp_ctrl_mode
= 0;
4402 dev_addr
= demod
->my_i2c_dev_addr
;
4403 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
4404 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
4406 switch (ext_attr
->standard
) {
4407 case DRX_STANDARD_8VSB
:
4409 clp_dir_to
= (u16
) (-9);
4411 sns_dir_to
= (u16
) (-9);
4412 ki_innergain_min
= (u16
) (-32768);
4415 if_iaccu_hi_tgt_min
= 2047;
4417 ingain_tgt_max
= 16383;
4419 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MINGAIN__A
, 0x7fff, 0);
4421 pr_err("error %d\n", rc
);
4424 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MAXGAIN__A
, 0x0, 0);
4426 pr_err("error %d\n", rc
);
4429 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_SUM__A
, 0, 0);
4431 pr_err("error %d\n", rc
);
4434 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_CYCCNT__A
, 0, 0);
4436 pr_err("error %d\n", rc
);
4439 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_WD__A
, 0, 0);
4441 pr_err("error %d\n", rc
);
4444 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_STP__A
, 1, 0);
4446 pr_err("error %d\n", rc
);
4449 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_SUM__A
, 0, 0);
4451 pr_err("error %d\n", rc
);
4454 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_CYCCNT__A
, 0, 0);
4456 pr_err("error %d\n", rc
);
4459 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_WD__A
, 0, 0);
4461 pr_err("error %d\n", rc
);
4464 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_STP__A
, 1, 0);
4466 pr_err("error %d\n", rc
);
4469 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN__A
, 1024, 0);
4471 pr_err("error %d\n", rc
);
4474 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_VSB_AGC_POW_TGT__A
, 22600, 0);
4476 pr_err("error %d\n", rc
);
4479 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN_TGT__A
, 13200, 0);
4481 pr_err("error %d\n", rc
);
4484 p_agc_if_settings
= &(ext_attr
->vsb_if_agc_cfg
);
4485 p_agc_rf_settings
= &(ext_attr
->vsb_rf_agc_cfg
);
4487 #ifndef DRXJ_VSB_ONLY
4488 case DRX_STANDARD_ITU_A
:
4489 case DRX_STANDARD_ITU_C
:
4490 case DRX_STANDARD_ITU_B
:
4491 ingain_tgt_max
= 5119;
4493 clp_dir_to
= (u16
) (-5);
4495 sns_dir_to
= (u16
) (-3);
4496 ki_innergain_min
= 0;
4498 if_iaccu_hi_tgt_min
= 2047;
4502 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MINGAIN__A
, 0x7fff, 0);
4504 pr_err("error %d\n", rc
);
4507 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MAXGAIN__A
, 0x0, 0);
4509 pr_err("error %d\n", rc
);
4512 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_SUM__A
, 0, 0);
4514 pr_err("error %d\n", rc
);
4517 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_CYCCNT__A
, 0, 0);
4519 pr_err("error %d\n", rc
);
4522 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_WD__A
, 0, 0);
4524 pr_err("error %d\n", rc
);
4527 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_STP__A
, 1, 0);
4529 pr_err("error %d\n", rc
);
4532 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_SUM__A
, 0, 0);
4534 pr_err("error %d\n", rc
);
4537 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_CYCCNT__A
, 0, 0);
4539 pr_err("error %d\n", rc
);
4542 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_WD__A
, 0, 0);
4544 pr_err("error %d\n", rc
);
4547 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_STP__A
, 1, 0);
4549 pr_err("error %d\n", rc
);
4552 p_agc_if_settings
= &(ext_attr
->qam_if_agc_cfg
);
4553 p_agc_rf_settings
= &(ext_attr
->qam_rf_agc_cfg
);
4554 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN_TGT__A
, p_agc_if_settings
->top
, 0);
4556 pr_err("error %d\n", rc
);
4560 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_AGC_KI__A
, &agc_ki
, 0);
4562 pr_err("error %d\n", rc
);
4566 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI__A
, agc_ki
, 0);
4568 pr_err("error %d\n", rc
);
4577 /* for new AGC interface */
4578 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN_TGT_MIN__A
, p_agc_if_settings
->top
, 0);
4580 pr_err("error %d\n", rc
);
4583 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN__A
, p_agc_if_settings
->top
, 0);
4585 pr_err("error %d\n", rc
);
4587 } /* Gain fed from inner to outer AGC */
4588 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_INGAIN_TGT_MAX__A
, ingain_tgt_max
, 0);
4590 pr_err("error %d\n", rc
);
4593 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A
, if_iaccu_hi_tgt_min
, 0);
4595 pr_err("error %d\n", rc
);
4598 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI__A
, 0, 0);
4600 pr_err("error %d\n", rc
);
4602 } /* set to p_agc_settings->top before */
4603 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_IF_IACCU_LO__A
, 0, 0);
4605 pr_err("error %d\n", rc
);
4608 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_RF_IACCU_HI__A
, 0, 0);
4610 pr_err("error %d\n", rc
);
4613 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_RF_IACCU_LO__A
, 0, 0);
4615 pr_err("error %d\n", rc
);
4618 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_RF_MAX__A
, 32767, 0);
4620 pr_err("error %d\n", rc
);
4623 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_SUM_MAX__A
, clp_sum_max
, 0);
4625 pr_err("error %d\n", rc
);
4628 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_SUM_MAX__A
, sns_sum_max
, 0);
4630 pr_err("error %d\n", rc
);
4633 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_INNERGAIN_MIN__A
, ki_innergain_min
, 0);
4635 pr_err("error %d\n", rc
);
4638 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A
, 50, 0);
4640 pr_err("error %d\n", rc
);
4643 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_CYCLEN__A
, 500, 0);
4645 pr_err("error %d\n", rc
);
4648 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_CYCLEN__A
, 500, 0);
4650 pr_err("error %d\n", rc
);
4653 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A
, 20, 0);
4655 pr_err("error %d\n", rc
);
4658 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MIN__A
, ki_min
, 0);
4660 pr_err("error %d\n", rc
);
4663 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_MAX__A
, ki_max
, 0);
4665 pr_err("error %d\n", rc
);
4668 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI_RED__A
, 0, 0);
4670 pr_err("error %d\n", rc
);
4673 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_SUM_MIN__A
, 8, 0);
4675 pr_err("error %d\n", rc
);
4678 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_CYCLEN__A
, 500, 0);
4680 pr_err("error %d\n", rc
);
4683 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_DIR_TO__A
, clp_dir_to
, 0);
4685 pr_err("error %d\n", rc
);
4688 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_SUM_MIN__A
, 8, 0);
4690 pr_err("error %d\n", rc
);
4693 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_SNS_DIR_TO__A
, sns_dir_to
, 0);
4695 pr_err("error %d\n", rc
);
4698 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A
, 50, 0);
4700 pr_err("error %d\n", rc
);
4703 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_CLP_CTRL_MODE__A
, clp_ctrl_mode
, 0);
4705 pr_err("error %d\n", rc
);
4709 agc_rf
= 0x800 + p_agc_rf_settings
->cut_off_current
;
4710 if (common_attr
->tuner_rf_agc_pol
== true)
4711 agc_rf
= 0x87ff - agc_rf
;
4714 if (common_attr
->tuner_if_agc_pol
== true)
4715 agc_rf
= 0x87ff - agc_rf
;
4717 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_AGC_RF__A
, agc_rf
, 0);
4719 pr_err("error %d\n", rc
);
4722 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_AGC_IF__A
, agc_if
, 0);
4724 pr_err("error %d\n", rc
);
4728 /* Set/restore Ki DGAIN factor */
4729 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
4731 pr_err("error %d\n", rc
);
4734 data
&= ~SCU_RAM_AGC_KI_DGAIN__M
;
4735 data
|= (agc_ki_dgain
<< SCU_RAM_AGC_KI_DGAIN__B
);
4736 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
4738 pr_err("error %d\n", rc
);
4748 * \fn int set_frequency ()
4749 * \brief Set frequency shift.
4750 * \param demod instance of demodulator.
4751 * \param channel pointer to channel data.
4752 * \param tuner_freq_offset residual frequency from tuner.
4756 set_frequency(struct drx_demod_instance
*demod
,
4757 struct drx_channel
*channel
, s32 tuner_freq_offset
)
4759 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
4760 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
4762 s32 sampling_frequency
= 0;
4763 s32 frequency_shift
= 0;
4764 s32 if_freq_actual
= 0;
4765 s32 rf_freq_residual
= -1 * tuner_freq_offset
;
4767 s32 intermediate_freq
= 0;
4768 u32 iqm_fs_rate_ofs
= 0;
4769 bool adc_flip
= true;
4770 bool select_pos_image
= false;
4773 bool image_to_select
= true;
4774 s32 fm_frequency_shift
= 0;
4776 rf_mirror
= (ext_attr
->mirror
== DRX_MIRROR_YES
) ? true : false;
4777 tuner_mirror
= demod
->my_common_attr
->mirror_freq_spect
? false : true;
4779 Program frequency shifter
4780 No need to account for mirroring on RF
4782 switch (ext_attr
->standard
) {
4783 case DRX_STANDARD_ITU_A
:
4784 case DRX_STANDARD_ITU_C
:
4785 case DRX_STANDARD_PAL_SECAM_LP
:
4786 case DRX_STANDARD_8VSB
:
4787 select_pos_image
= true;
4789 case DRX_STANDARD_FM
:
4790 /* After IQM FS sound carrier must appear at 4 Mhz in spect.
4791 Sound carrier is already 3Mhz above centre frequency due
4792 to tuner setting so now add an extra shift of 1MHz... */
4793 fm_frequency_shift
= 1000;
4795 case DRX_STANDARD_ITU_B
:
4796 case DRX_STANDARD_NTSC
:
4797 case DRX_STANDARD_PAL_SECAM_BG
:
4798 case DRX_STANDARD_PAL_SECAM_DK
:
4799 case DRX_STANDARD_PAL_SECAM_I
:
4800 case DRX_STANDARD_PAL_SECAM_L
:
4801 select_pos_image
= false;
4806 intermediate_freq
= demod
->my_common_attr
->intermediate_freq
;
4807 sampling_frequency
= demod
->my_common_attr
->sys_clock_freq
/ 3;
4809 if_freq_actual
= intermediate_freq
+ rf_freq_residual
+ fm_frequency_shift
;
4811 if_freq_actual
= intermediate_freq
- rf_freq_residual
- fm_frequency_shift
;
4812 if (if_freq_actual
> sampling_frequency
/ 2) {
4814 adc_freq
= sampling_frequency
- if_freq_actual
;
4817 /* adc doesn't mirror */
4818 adc_freq
= if_freq_actual
;
4822 frequency_shift
= adc_freq
;
4824 (bool) (rf_mirror
^ tuner_mirror
^ adc_flip
^ select_pos_image
);
4825 iqm_fs_rate_ofs
= frac28(frequency_shift
, sampling_frequency
);
4827 if (image_to_select
)
4828 iqm_fs_rate_ofs
= ~iqm_fs_rate_ofs
+ 1;
4830 /* Program frequency shifter with tuner offset compensation */
4831 /* frequency_shift += tuner_freq_offset; TODO */
4832 rc
= drxdap_fasi_write_reg32(dev_addr
, IQM_FS_RATE_OFS_LO__A
, iqm_fs_rate_ofs
, 0);
4834 pr_err("error %d\n", rc
);
4837 ext_attr
->iqm_fs_rate_ofs
= iqm_fs_rate_ofs
;
4838 ext_attr
->pos_image
= (bool) (rf_mirror
^ tuner_mirror
^ select_pos_image
);
4846 * \fn int get_acc_pkt_err()
4847 * \brief Retrieve signal strength for VSB and QAM.
4848 * \param demod Pointer to demod instance
4849 * \param packet_err Pointer to packet error
4851 * \retval 0 sig_strength contains valid data.
4852 * \retval -EINVAL sig_strength is NULL.
4853 * \retval -EIO Erroneous data, sig_strength contains invalid data.
4855 #ifdef DRXJ_SIGNAL_ACCUM_ERR
4856 static int get_acc_pkt_err(struct drx_demod_instance
*demod
, u16
*packet_err
)
4860 static u16 last_pkt_err
;
4862 struct drxj_data
*ext_attr
= NULL
;
4863 struct i2c_device_addr
*dev_addr
= NULL
;
4865 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
4866 dev_addr
= demod
->my_i2c_dev_addr
;
4868 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, &data
, 0);
4870 pr_err("error %d\n", rc
);
4873 if (ext_attr
->reset_pkt_err_acc
) {
4874 last_pkt_err
= data
;
4876 ext_attr
->reset_pkt_err_acc
= false;
4879 if (data
< last_pkt_err
) {
4880 pkt_err
+= 0xffff - last_pkt_err
;
4883 pkt_err
+= (data
- last_pkt_err
);
4885 *packet_err
= pkt_err
;
4886 last_pkt_err
= data
;
4895 /*============================================================================*/
4898 * \fn int set_agc_rf ()
4899 * \brief Configure RF AGC
4900 * \param demod instance of demodulator.
4901 * \param agc_settings AGC configuration structure
4905 set_agc_rf(struct drx_demod_instance
*demod
, struct drxj_cfg_agc
*agc_settings
, bool atomic
)
4907 struct i2c_device_addr
*dev_addr
= NULL
;
4908 struct drxj_data
*ext_attr
= NULL
;
4909 struct drxj_cfg_agc
*p_agc_settings
= NULL
;
4910 struct drx_common_attr
*common_attr
= NULL
;
4912 drx_write_reg16func_t scu_wr16
= NULL
;
4913 drx_read_reg16func_t scu_rr16
= NULL
;
4915 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
4916 dev_addr
= demod
->my_i2c_dev_addr
;
4917 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
4920 scu_rr16
= drxj_dap_scu_atomic_read_reg16
;
4921 scu_wr16
= drxj_dap_scu_atomic_write_reg16
;
4923 scu_rr16
= drxj_dap_read_reg16
;
4924 scu_wr16
= drxj_dap_write_reg16
;
4927 /* Configure AGC only if standard is currently active */
4928 if ((ext_attr
->standard
== agc_settings
->standard
) ||
4929 (DRXJ_ISQAMSTD(ext_attr
->standard
) &&
4930 DRXJ_ISQAMSTD(agc_settings
->standard
)) ||
4931 (DRXJ_ISATVSTD(ext_attr
->standard
) &&
4932 DRXJ_ISATVSTD(agc_settings
->standard
))) {
4935 switch (agc_settings
->ctrl_mode
) {
4936 case DRX_AGC_CTRL_AUTO
:
4938 /* Enable RF AGC DAC */
4939 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
4941 pr_err("error %d\n", rc
);
4944 data
|= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE
;
4945 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
4947 pr_err("error %d\n", rc
);
4951 /* Enable SCU RF AGC loop */
4952 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
4954 pr_err("error %d\n", rc
);
4957 data
&= ~SCU_RAM_AGC_KI_RF__M
;
4958 if (ext_attr
->standard
== DRX_STANDARD_8VSB
)
4959 data
|= (2 << SCU_RAM_AGC_KI_RF__B
);
4960 else if (DRXJ_ISQAMSTD(ext_attr
->standard
))
4961 data
|= (5 << SCU_RAM_AGC_KI_RF__B
);
4963 data
|= (4 << SCU_RAM_AGC_KI_RF__B
);
4965 if (common_attr
->tuner_rf_agc_pol
)
4966 data
|= SCU_RAM_AGC_KI_INV_RF_POL__M
;
4968 data
&= ~SCU_RAM_AGC_KI_INV_RF_POL__M
;
4969 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
4971 pr_err("error %d\n", rc
);
4975 /* Set speed ( using complementary reduction value ) */
4976 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI_RED__A
, &data
, 0);
4978 pr_err("error %d\n", rc
);
4981 data
&= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M
;
4982 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);
4984 pr_err("error %d\n", rc
);
4988 if (agc_settings
->standard
== DRX_STANDARD_8VSB
)
4989 p_agc_settings
= &(ext_attr
->vsb_if_agc_cfg
);
4990 else if (DRXJ_ISQAMSTD(agc_settings
->standard
))
4991 p_agc_settings
= &(ext_attr
->qam_if_agc_cfg
);
4992 else if (DRXJ_ISATVSTD(agc_settings
->standard
))
4993 p_agc_settings
= &(ext_attr
->atv_if_agc_cfg
);
4997 /* Set TOP, only if IF-AGC is in AUTO mode */
4998 if (p_agc_settings
->ctrl_mode
== DRX_AGC_CTRL_AUTO
) {
4999 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, agc_settings
->top
, 0);
5001 pr_err("error %d\n", rc
);
5004 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT__A
, agc_settings
->top
, 0);
5006 pr_err("error %d\n", rc
);
5011 /* Cut-Off current */
5012 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_RF_IACCU_HI_CO__A
, agc_settings
->cut_off_current
, 0);
5014 pr_err("error %d\n", rc
);
5018 case DRX_AGC_CTRL_USER
:
5020 /* Enable RF AGC DAC */
5021 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5023 pr_err("error %d\n", rc
);
5026 data
|= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE
;
5027 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5029 pr_err("error %d\n", rc
);
5033 /* Disable SCU RF AGC loop */
5034 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5036 pr_err("error %d\n", rc
);
5039 data
&= ~SCU_RAM_AGC_KI_RF__M
;
5040 if (common_attr
->tuner_rf_agc_pol
)
5041 data
|= SCU_RAM_AGC_KI_INV_RF_POL__M
;
5043 data
&= ~SCU_RAM_AGC_KI_INV_RF_POL__M
;
5044 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5046 pr_err("error %d\n", rc
);
5050 /* Write value to output pin */
5051 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_RF_IACCU_HI__A
, agc_settings
->output_level
, 0);
5053 pr_err("error %d\n", rc
);
5057 case DRX_AGC_CTRL_OFF
:
5059 /* Disable RF AGC DAC */
5060 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5062 pr_err("error %d\n", rc
);
5065 data
&= (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE
);
5066 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5068 pr_err("error %d\n", rc
);
5072 /* Disable SCU RF AGC loop */
5073 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5075 pr_err("error %d\n", rc
);
5078 data
&= ~SCU_RAM_AGC_KI_RF__M
;
5079 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5081 pr_err("error %d\n", rc
);
5087 } /* switch ( agcsettings->ctrl_mode ) */
5090 /* Store rf agc settings */
5091 switch (agc_settings
->standard
) {
5092 case DRX_STANDARD_8VSB
:
5093 ext_attr
->vsb_rf_agc_cfg
= *agc_settings
;
5095 #ifndef DRXJ_VSB_ONLY
5096 case DRX_STANDARD_ITU_A
:
5097 case DRX_STANDARD_ITU_B
:
5098 case DRX_STANDARD_ITU_C
:
5099 ext_attr
->qam_rf_agc_cfg
= *agc_settings
;
5112 * \fn int set_agc_if ()
5113 * \brief Configure If AGC
5114 * \param demod instance of demodulator.
5115 * \param agc_settings AGC configuration structure
5119 set_agc_if(struct drx_demod_instance
*demod
, struct drxj_cfg_agc
*agc_settings
, bool atomic
)
5121 struct i2c_device_addr
*dev_addr
= NULL
;
5122 struct drxj_data
*ext_attr
= NULL
;
5123 struct drxj_cfg_agc
*p_agc_settings
= NULL
;
5124 struct drx_common_attr
*common_attr
= NULL
;
5125 drx_write_reg16func_t scu_wr16
= NULL
;
5126 drx_read_reg16func_t scu_rr16
= NULL
;
5129 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
5130 dev_addr
= demod
->my_i2c_dev_addr
;
5131 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
5134 scu_rr16
= drxj_dap_scu_atomic_read_reg16
;
5135 scu_wr16
= drxj_dap_scu_atomic_write_reg16
;
5137 scu_rr16
= drxj_dap_read_reg16
;
5138 scu_wr16
= drxj_dap_write_reg16
;
5141 /* Configure AGC only if standard is currently active */
5142 if ((ext_attr
->standard
== agc_settings
->standard
) ||
5143 (DRXJ_ISQAMSTD(ext_attr
->standard
) &&
5144 DRXJ_ISQAMSTD(agc_settings
->standard
)) ||
5145 (DRXJ_ISATVSTD(ext_attr
->standard
) &&
5146 DRXJ_ISATVSTD(agc_settings
->standard
))) {
5149 switch (agc_settings
->ctrl_mode
) {
5150 case DRX_AGC_CTRL_AUTO
:
5151 /* Enable IF AGC DAC */
5152 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5154 pr_err("error %d\n", rc
);
5157 data
|= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE
;
5158 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5160 pr_err("error %d\n", rc
);
5164 /* Enable SCU IF AGC loop */
5165 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5167 pr_err("error %d\n", rc
);
5170 data
&= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5171 data
&= ~SCU_RAM_AGC_KI_IF__M
;
5172 if (ext_attr
->standard
== DRX_STANDARD_8VSB
)
5173 data
|= (3 << SCU_RAM_AGC_KI_IF__B
);
5174 else if (DRXJ_ISQAMSTD(ext_attr
->standard
))
5175 data
|= (6 << SCU_RAM_AGC_KI_IF__B
);
5177 data
|= (5 << SCU_RAM_AGC_KI_IF__B
);
5179 if (common_attr
->tuner_if_agc_pol
)
5180 data
|= SCU_RAM_AGC_KI_INV_IF_POL__M
;
5182 data
&= ~SCU_RAM_AGC_KI_INV_IF_POL__M
;
5183 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5185 pr_err("error %d\n", rc
);
5189 /* Set speed (using complementary reduction value) */
5190 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI_RED__A
, &data
, 0);
5192 pr_err("error %d\n", rc
);
5195 data
&= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M
;
5196 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);
5198 pr_err("error %d\n", rc
);
5202 if (agc_settings
->standard
== DRX_STANDARD_8VSB
)
5203 p_agc_settings
= &(ext_attr
->vsb_rf_agc_cfg
);
5204 else if (DRXJ_ISQAMSTD(agc_settings
->standard
))
5205 p_agc_settings
= &(ext_attr
->qam_rf_agc_cfg
);
5206 else if (DRXJ_ISATVSTD(agc_settings
->standard
))
5207 p_agc_settings
= &(ext_attr
->atv_rf_agc_cfg
);
5212 if (p_agc_settings
->ctrl_mode
== DRX_AGC_CTRL_AUTO
) {
5213 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, p_agc_settings
->top
, 0);
5215 pr_err("error %d\n", rc
);
5218 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT__A
, p_agc_settings
->top
, 0);
5220 pr_err("error %d\n", rc
);
5224 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, 0, 0);
5226 pr_err("error %d\n", rc
);
5229 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT__A
, 0, 0);
5231 pr_err("error %d\n", rc
);
5237 case DRX_AGC_CTRL_USER
:
5239 /* Enable IF AGC DAC */
5240 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5242 pr_err("error %d\n", rc
);
5245 data
|= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE
;
5246 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5248 pr_err("error %d\n", rc
);
5252 /* Disable SCU IF AGC loop */
5253 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5255 pr_err("error %d\n", rc
);
5258 data
&= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5259 data
|= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5260 if (common_attr
->tuner_if_agc_pol
)
5261 data
|= SCU_RAM_AGC_KI_INV_IF_POL__M
;
5263 data
&= ~SCU_RAM_AGC_KI_INV_IF_POL__M
;
5264 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5266 pr_err("error %d\n", rc
);
5270 /* Write value to output pin */
5271 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, agc_settings
->output_level
, 0);
5273 pr_err("error %d\n", rc
);
5278 case DRX_AGC_CTRL_OFF
:
5280 /* Disable If AGC DAC */
5281 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5283 pr_err("error %d\n", rc
);
5286 data
&= (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE
);
5287 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5289 pr_err("error %d\n", rc
);
5293 /* Disable SCU IF AGC loop */
5294 rc
= (*scu_rr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, &data
, 0);
5296 pr_err("error %d\n", rc
);
5299 data
&= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5300 data
|= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M
;
5301 rc
= (*scu_wr16
)(dev_addr
, SCU_RAM_AGC_KI__A
, data
, 0);
5303 pr_err("error %d\n", rc
);
5309 } /* switch ( agcsettings->ctrl_mode ) */
5311 /* always set the top to support configurations without if-loop */
5312 rc
= (*scu_wr16
) (dev_addr
, SCU_RAM_AGC_INGAIN_TGT_MIN__A
, agc_settings
->top
, 0);
5314 pr_err("error %d\n", rc
);
5319 /* Store if agc settings */
5320 switch (agc_settings
->standard
) {
5321 case DRX_STANDARD_8VSB
:
5322 ext_attr
->vsb_if_agc_cfg
= *agc_settings
;
5324 #ifndef DRXJ_VSB_ONLY
5325 case DRX_STANDARD_ITU_A
:
5326 case DRX_STANDARD_ITU_B
:
5327 case DRX_STANDARD_ITU_C
:
5328 ext_attr
->qam_if_agc_cfg
= *agc_settings
;
5341 * \fn int set_iqm_af ()
5342 * \brief Configure IQM AF registers
5343 * \param demod instance of demodulator.
5347 static int set_iqm_af(struct drx_demod_instance
*demod
, bool active
)
5350 struct i2c_device_addr
*dev_addr
= NULL
;
5353 dev_addr
= demod
->my_i2c_dev_addr
;
5356 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_STDBY__A
, &data
, 0);
5358 pr_err("error %d\n", rc
);
5362 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
));
5364 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
);
5365 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, data
, 0);
5367 pr_err("error %d\n", rc
);
5376 /*============================================================================*/
5377 /*== END 8VSB & QAM COMMON DATAPATH FUNCTIONS ==*/
5378 /*============================================================================*/
5380 /*============================================================================*/
5381 /*============================================================================*/
5382 /*== 8VSB DATAPATH FUNCTIONS ==*/
5383 /*============================================================================*/
5384 /*============================================================================*/
5387 * \fn int power_down_vsb ()
5388 * \brief Powr down QAM related blocks.
5389 * \param demod instance of demodulator.
5390 * \param channel pointer to channel data.
5393 static int power_down_vsb(struct drx_demod_instance
*demod
, bool primary
)
5395 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
5396 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
5397 /* parameter_len */ 0,
5399 /* *parameter */ NULL
,
5402 struct drx_cfg_mpeg_output cfg_mpeg_output
;
5408 reset of FEC and VSB HW
5410 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
|
5411 SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
5412 cmd_scu
.parameter_len
= 0;
5413 cmd_scu
.result_len
= 1;
5414 cmd_scu
.parameter
= NULL
;
5415 cmd_scu
.result
= &cmd_result
;
5416 rc
= scu_command(dev_addr
, &cmd_scu
);
5418 pr_err("error %d\n", rc
);
5422 /* stop all comm_exec */
5423 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
, 0);
5425 pr_err("error %d\n", rc
);
5428 rc
= drxj_dap_write_reg16(dev_addr
, VSB_COMM_EXEC__A
, VSB_COMM_EXEC_STOP
, 0);
5430 pr_err("error %d\n", rc
);
5434 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_STOP
, 0);
5436 pr_err("error %d\n", rc
);
5439 rc
= set_iqm_af(demod
, false);
5441 pr_err("error %d\n", rc
);
5445 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
5447 pr_err("error %d\n", rc
);
5450 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
5452 pr_err("error %d\n", rc
);
5455 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
5457 pr_err("error %d\n", rc
);
5460 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
5462 pr_err("error %d\n", rc
);
5465 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
5467 pr_err("error %d\n", rc
);
5472 cfg_mpeg_output
.enable_mpeg_output
= false;
5473 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
5475 pr_err("error %d\n", rc
);
5485 * \fn int set_vsb_leak_n_gain ()
5486 * \brief Set ATSC demod.
5487 * \param demod instance of demodulator.
5490 static int set_vsb_leak_n_gain(struct drx_demod_instance
*demod
)
5492 struct i2c_device_addr
*dev_addr
= NULL
;
5495 static const u8 vsb_ffe_leak_gain_ram0
[] = {
5496 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO1 */
5497 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO2 */
5498 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO3 */
5499 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO4 */
5500 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO5 */
5501 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO6 */
5502 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO7 */
5503 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO8 */
5504 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO9 */
5505 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO10 */
5506 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO11 */
5507 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO12 */
5508 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO1 */
5509 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO2 */
5510 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO3 */
5511 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO4 */
5512 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO5 */
5513 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO6 */
5514 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO7 */
5515 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO8 */
5516 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO9 */
5517 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO10 */
5518 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO11 */
5519 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO12 */
5520 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO1 */
5521 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO2 */
5522 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO3 */
5523 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO4 */
5524 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO5 */
5525 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO6 */
5526 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO7 */
5527 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO8 */
5528 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO9 */
5529 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO10 */
5530 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO11 */
5531 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO12 */
5532 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO1 */
5533 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO2 */
5534 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO3 */
5535 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO4 */
5536 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO5 */
5537 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO6 */
5538 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO7 */
5539 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO8 */
5540 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO9 */
5541 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO10 */
5542 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO11 */
5543 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO12 */
5544 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO1 */
5545 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO2 */
5546 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO3 */
5547 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO4 */
5548 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO5 */
5549 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO6 */
5550 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO7 */
5551 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO8 */
5552 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO9 */
5553 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO10 */
5554 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO11 */
5555 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO12 */
5556 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO1 */
5557 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO2 */
5558 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO3 */
5559 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO4 */
5560 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO5 */
5561 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO6 */
5562 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO7 */
5563 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO8 */
5564 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO9 */
5565 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO10 */
5566 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO11 */
5567 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO12 */
5568 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO1 */
5569 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO2 */
5570 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO3 */
5571 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO4 */
5572 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO5 */
5573 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO6 */
5574 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO7 */
5575 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO8 */
5576 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO9 */
5577 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO10 */
5578 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO11 */
5579 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO12 */
5580 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO1 */
5581 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO2 */
5582 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO3 */
5583 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO4 */
5584 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO5 */
5585 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO6 */
5586 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO7 */
5587 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO8 */
5588 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO9 */
5589 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO10 */
5590 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO11 */
5591 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO12 */
5592 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO1 */
5593 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO2 */
5594 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO3 */
5595 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO4 */
5596 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO5 */
5597 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO6 */
5598 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO7 */
5599 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO8 */
5600 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO9 */
5601 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO10 */
5602 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO11 */
5603 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO12 */
5604 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN1 */
5605 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN2 */
5606 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN3 */
5607 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN4 */
5608 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN5 */
5609 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN6 */
5610 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN7 */
5611 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN8 */
5612 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN9 */
5613 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN10 */
5614 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN11 */
5615 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN12 */
5616 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN1 */
5617 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN2 */
5618 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN3 */
5619 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN4 */
5620 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN5 */
5621 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN6 */
5622 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN7 */
5623 DRXJ_16TO8(0x1010) /* FIRRCA1GAIN8 */
5626 static const u8 vsb_ffe_leak_gain_ram1
[] = {
5627 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN9 */
5628 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN10 */
5629 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN11 */
5630 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN12 */
5631 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN1 */
5632 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN2 */
5633 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN3 */
5634 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN4 */
5635 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN5 */
5636 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN6 */
5637 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN7 */
5638 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN8 */
5639 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN9 */
5640 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN10 */
5641 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN11 */
5642 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN12 */
5643 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN1 */
5644 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN2 */
5645 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN3 */
5646 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN4 */
5647 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN5 */
5648 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN6 */
5649 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN7 */
5650 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN8 */
5651 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN9 */
5652 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN10 */
5653 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN11 */
5654 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN12 */
5655 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN1 */
5656 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN2 */
5657 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN3 */
5658 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN4 */
5659 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN5 */
5660 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN6 */
5661 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN7 */
5662 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN8 */
5663 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN9 */
5664 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN10 */
5665 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN11 */
5666 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN12 */
5667 DRXJ_16TO8(0x001f), /* DFETRAINLKRATIO */
5668 DRXJ_16TO8(0x01ff), /* DFERCA1TRAINLKRATIO */
5669 DRXJ_16TO8(0x01ff), /* DFERCA1DATALKRATIO */
5670 DRXJ_16TO8(0x004f), /* DFERCA2TRAINLKRATIO */
5671 DRXJ_16TO8(0x004f), /* DFERCA2DATALKRATIO */
5672 DRXJ_16TO8(0x01ff), /* DFEDDM1TRAINLKRATIO */
5673 DRXJ_16TO8(0x01ff), /* DFEDDM1DATALKRATIO */
5674 DRXJ_16TO8(0x0352), /* DFEDDM2TRAINLKRATIO */
5675 DRXJ_16TO8(0x0352), /* DFEDDM2DATALKRATIO */
5676 DRXJ_16TO8(0x0000), /* DFETRAINGAIN */
5677 DRXJ_16TO8(0x2020), /* DFERCA1GAIN */
5678 DRXJ_16TO8(0x1010), /* DFERCA2GAIN */
5679 DRXJ_16TO8(0x1818), /* DFEDDM1GAIN */
5680 DRXJ_16TO8(0x1212) /* DFEDDM2GAIN */
5683 dev_addr
= demod
->my_i2c_dev_addr
;
5684 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);
5686 pr_err("error %d\n", rc
);
5689 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);
5691 pr_err("error %d\n", rc
);
5702 * \brief Set 8VSB demod.
5703 * \param demod instance of demodulator.
5707 static int set_vsb(struct drx_demod_instance
*demod
)
5709 struct i2c_device_addr
*dev_addr
= NULL
;
5711 struct drx_common_attr
*common_attr
= NULL
;
5712 struct drxjscu_cmd cmd_scu
;
5713 struct drxj_data
*ext_attr
= NULL
;
5716 static const u8 vsb_taps_re
[] = {
5717 DRXJ_16TO8(-2), /* re0 */
5718 DRXJ_16TO8(4), /* re1 */
5719 DRXJ_16TO8(1), /* re2 */
5720 DRXJ_16TO8(-4), /* re3 */
5721 DRXJ_16TO8(1), /* re4 */
5722 DRXJ_16TO8(4), /* re5 */
5723 DRXJ_16TO8(-3), /* re6 */
5724 DRXJ_16TO8(-3), /* re7 */
5725 DRXJ_16TO8(6), /* re8 */
5726 DRXJ_16TO8(1), /* re9 */
5727 DRXJ_16TO8(-9), /* re10 */
5728 DRXJ_16TO8(3), /* re11 */
5729 DRXJ_16TO8(12), /* re12 */
5730 DRXJ_16TO8(-9), /* re13 */
5731 DRXJ_16TO8(-15), /* re14 */
5732 DRXJ_16TO8(17), /* re15 */
5733 DRXJ_16TO8(19), /* re16 */
5734 DRXJ_16TO8(-29), /* re17 */
5735 DRXJ_16TO8(-22), /* re18 */
5736 DRXJ_16TO8(45), /* re19 */
5737 DRXJ_16TO8(25), /* re20 */
5738 DRXJ_16TO8(-70), /* re21 */
5739 DRXJ_16TO8(-28), /* re22 */
5740 DRXJ_16TO8(111), /* re23 */
5741 DRXJ_16TO8(30), /* re24 */
5742 DRXJ_16TO8(-201), /* re25 */
5743 DRXJ_16TO8(-31), /* re26 */
5744 DRXJ_16TO8(629) /* re27 */
5747 dev_addr
= demod
->my_i2c_dev_addr
;
5748 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
5749 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
5751 /* stop all comm_exec */
5752 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
, 0);
5754 pr_err("error %d\n", rc
);
5757 rc
= drxj_dap_write_reg16(dev_addr
, VSB_COMM_EXEC__A
, VSB_COMM_EXEC_STOP
, 0);
5759 pr_err("error %d\n", rc
);
5762 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
5764 pr_err("error %d\n", rc
);
5767 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
5769 pr_err("error %d\n", rc
);
5772 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
5774 pr_err("error %d\n", rc
);
5777 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
5779 pr_err("error %d\n", rc
);
5782 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
5784 pr_err("error %d\n", rc
);
5788 /* reset demodulator */
5789 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
5790 | SCU_RAM_COMMAND_CMD_DEMOD_RESET
;
5791 cmd_scu
.parameter_len
= 0;
5792 cmd_scu
.result_len
= 1;
5793 cmd_scu
.parameter
= NULL
;
5794 cmd_scu
.result
= &cmd_result
;
5795 rc
= scu_command(dev_addr
, &cmd_scu
);
5797 pr_err("error %d\n", rc
);
5801 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_DCF_BYPASS__A
, 1, 0);
5803 pr_err("error %d\n", rc
);
5806 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_ADJ_SEL__A
, IQM_FS_ADJ_SEL_B_VSB
, 0);
5808 pr_err("error %d\n", rc
);
5811 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_ADJ_SEL__A
, IQM_RC_ADJ_SEL_B_VSB
, 0);
5813 pr_err("error %d\n", rc
);
5816 ext_attr
->iqm_rc_rate_ofs
= 0x00AD0D79;
5817 rc
= drxdap_fasi_write_reg32(dev_addr
, IQM_RC_RATE_OFS_LO__A
, ext_attr
->iqm_rc_rate_ofs
, 0);
5819 pr_err("error %d\n", rc
);
5822 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CFAGC_GAINSHIFT__A
, 4, 0);
5824 pr_err("error %d\n", rc
);
5827 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CYGN1TRK__A
, 1, 0);
5829 pr_err("error %d\n", rc
);
5833 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_CROUT_ENA__A
, 1, 0);
5835 pr_err("error %d\n", rc
);
5838 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_STRETCH__A
, 28, 0);
5840 pr_err("error %d\n", rc
);
5843 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_ACTIVE__A
, 0, 0);
5845 pr_err("error %d\n", rc
);
5848 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SYMMETRIC__A
, 0, 0);
5850 pr_err("error %d\n", rc
);
5853 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_MIDTAP__A
, 3, 0);
5855 pr_err("error %d\n", rc
);
5858 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_OUT_ENA__A
, IQM_CF_OUT_ENA_VSB__M
, 0);
5860 pr_err("error %d\n", rc
);
5863 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SCALE__A
, 1393, 0);
5865 pr_err("error %d\n", rc
);
5868 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SCALE_SH__A
, 0, 0);
5870 pr_err("error %d\n", rc
);
5873 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_POW_MEAS_LEN__A
, 1, 0);
5875 pr_err("error %d\n", rc
);
5879 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(vsb_taps_re
), ((u8
*)vsb_taps_re
), 0);
5881 pr_err("error %d\n", rc
);
5884 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(vsb_taps_re
), ((u8
*)vsb_taps_re
), 0);
5886 pr_err("error %d\n", rc
);
5890 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_BNTHRESH__A
, 330, 0);
5892 pr_err("error %d\n", rc
);
5894 } /* set higher threshold */
5895 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CLPLASTNUM__A
, 90, 0);
5897 pr_err("error %d\n", rc
);
5899 } /* burst detection on */
5900 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SNRTH_RCA1__A
, 0x0042, 0);
5902 pr_err("error %d\n", rc
);
5904 } /* drop thresholds by 1 dB */
5905 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SNRTH_RCA2__A
, 0x0053, 0);
5907 pr_err("error %d\n", rc
);
5909 } /* drop thresholds by 2 dB */
5910 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_EQCTRL__A
, 0x1, 0);
5912 pr_err("error %d\n", rc
);
5915 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_GPIO__A
, 0, 0);
5917 pr_err("error %d\n", rc
);
5921 /* Initialize the FEC Subsystem */
5922 rc
= drxj_dap_write_reg16(dev_addr
, FEC_TOP_ANNEX__A
, FEC_TOP_ANNEX_D
, 0);
5924 pr_err("error %d\n", rc
);
5928 u16 fec_oc_snc_mode
= 0;
5929 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_SNC_MODE__A
, &fec_oc_snc_mode
, 0);
5931 pr_err("error %d\n", rc
);
5934 /* output data even when not locked */
5935 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_MODE__A
, fec_oc_snc_mode
| FEC_OC_SNC_MODE_UNLOCK_ENABLE__M
, 0);
5937 pr_err("error %d\n", rc
);
5943 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLP_LEN__A
, 0, 0);
5945 pr_err("error %d\n", rc
);
5948 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLP_TH__A
, 470, 0);
5950 pr_err("error %d\n", rc
);
5953 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_SNS_LEN__A
, 0, 0);
5955 pr_err("error %d\n", rc
);
5958 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SNRTH_PT__A
, 0xD4, 0);
5960 pr_err("error %d\n", rc
);
5963 /* no transparent, no A&C framing; parity is set in mpegoutput */
5965 u16 fec_oc_reg_mode
= 0;
5966 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_MODE__A
, &fec_oc_reg_mode
, 0);
5968 pr_err("error %d\n", rc
);
5971 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);
5973 pr_err("error %d\n", rc
);
5978 rc
= drxj_dap_write_reg16(dev_addr
, FEC_DI_TIMEOUT_LO__A
, 0, 0);
5980 pr_err("error %d\n", rc
);
5982 } /* timeout counter for restarting */
5983 rc
= drxj_dap_write_reg16(dev_addr
, FEC_DI_TIMEOUT_HI__A
, 3, 0);
5985 pr_err("error %d\n", rc
);
5988 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MODE__A
, 0, 0);
5990 pr_err("error %d\n", rc
);
5992 } /* bypass disabled */
5993 /* initialize RS packet error measurement parameters */
5994 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MEASUREMENT_PERIOD__A
, FEC_RS_MEASUREMENT_PERIOD
, 0);
5996 pr_err("error %d\n", rc
);
5999 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MEASUREMENT_PRESCALE__A
, FEC_RS_MEASUREMENT_PRESCALE
, 0);
6001 pr_err("error %d\n", rc
);
6005 /* init measurement period of MER/SER */
6006 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_MEASUREMENT_PERIOD__A
, VSB_TOP_MEASUREMENT_PERIOD
, 0);
6008 pr_err("error %d\n", rc
);
6011 rc
= drxdap_fasi_write_reg32(dev_addr
, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A
, 0, 0);
6013 pr_err("error %d\n", rc
);
6016 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_FEC_MEAS_COUNT__A
, 0, 0);
6018 pr_err("error %d\n", rc
);
6021 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, 0, 0);
6023 pr_err("error %d\n", rc
);
6027 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CKGN1TRK__A
, 128, 0);
6029 pr_err("error %d\n", rc
);
6032 /* B-Input to ADC, PGA+filter in standby */
6033 if (!ext_attr
->has_lna
) {
6034 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_AMUX__A
, 0x02, 0);
6036 pr_err("error %d\n", rc
);
6041 /* turn on IQMAF. It has to be in front of setAgc**() */
6042 rc
= set_iqm_af(demod
, true);
6044 pr_err("error %d\n", rc
);
6047 rc
= adc_synchronization(demod
);
6049 pr_err("error %d\n", rc
);
6053 rc
= init_agc(demod
);
6055 pr_err("error %d\n", rc
);
6058 rc
= set_agc_if(demod
, &(ext_attr
->vsb_if_agc_cfg
), false);
6060 pr_err("error %d\n", rc
);
6063 rc
= set_agc_rf(demod
, &(ext_attr
->vsb_rf_agc_cfg
), false);
6065 pr_err("error %d\n", rc
);
6069 /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
6071 struct drxj_cfg_afe_gain vsb_pga_cfg
= { DRX_STANDARD_8VSB
, 0 };
6073 vsb_pga_cfg
.gain
= ext_attr
->vsb_pga_cfg
;
6074 rc
= ctrl_set_cfg_afe_gain(demod
, &vsb_pga_cfg
);
6076 pr_err("error %d\n", rc
);
6080 rc
= ctrl_set_cfg_pre_saw(demod
, &(ext_attr
->vsb_pre_saw_cfg
));
6082 pr_err("error %d\n", rc
);
6086 /* Mpeg output has to be in front of FEC active */
6087 rc
= set_mpegtei_handling(demod
);
6089 pr_err("error %d\n", rc
);
6092 rc
= bit_reverse_mpeg_output(demod
);
6094 pr_err("error %d\n", rc
);
6097 rc
= set_mpeg_start_width(demod
);
6099 pr_err("error %d\n", rc
);
6103 /* TODO: move to set_standard after hardware reset value problem is solved */
6104 /* Configure initial MPEG output */
6105 struct drx_cfg_mpeg_output cfg_mpeg_output
;
6107 memcpy(&cfg_mpeg_output
, &common_attr
->mpeg_cfg
, sizeof(cfg_mpeg_output
));
6108 cfg_mpeg_output
.enable_mpeg_output
= true;
6110 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
6112 pr_err("error %d\n", rc
);
6117 /* TBD: what parameters should be set */
6118 cmd_param
= 0x00; /* Default mode AGC on, etc */
6119 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
6120 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM
;
6121 cmd_scu
.parameter_len
= 1;
6122 cmd_scu
.result_len
= 1;
6123 cmd_scu
.parameter
= &cmd_param
;
6124 cmd_scu
.result
= &cmd_result
;
6125 rc
= scu_command(dev_addr
, &cmd_scu
);
6127 pr_err("error %d\n", rc
);
6131 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_BEAGC_GAINSHIFT__A
, 0x0004, 0);
6133 pr_err("error %d\n", rc
);
6136 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SNRTH_PT__A
, 0x00D2, 0);
6138 pr_err("error %d\n", rc
);
6141 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_SYSSMTRNCTRL__A
, VSB_TOP_SYSSMTRNCTRL__PRE
| VSB_TOP_SYSSMTRNCTRL_NCOTIMEOUTCNTEN__M
, 0);
6143 pr_err("error %d\n", rc
);
6146 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_BEDETCTRL__A
, 0x142, 0);
6148 pr_err("error %d\n", rc
);
6151 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_LBAGCREFLVL__A
, 640, 0);
6153 pr_err("error %d\n", rc
);
6156 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CYGN1ACQ__A
, 4, 0);
6158 pr_err("error %d\n", rc
);
6161 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CYGN1TRK__A
, 2, 0);
6163 pr_err("error %d\n", rc
);
6166 rc
= drxj_dap_write_reg16(dev_addr
, VSB_TOP_CYGN2TRK__A
, 3, 0);
6168 pr_err("error %d\n", rc
);
6172 /* start demodulator */
6173 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
6174 | SCU_RAM_COMMAND_CMD_DEMOD_START
;
6175 cmd_scu
.parameter_len
= 0;
6176 cmd_scu
.result_len
= 1;
6177 cmd_scu
.parameter
= NULL
;
6178 cmd_scu
.result
= &cmd_result
;
6179 rc
= scu_command(dev_addr
, &cmd_scu
);
6181 pr_err("error %d\n", rc
);
6185 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_ACTIVE
, 0);
6187 pr_err("error %d\n", rc
);
6190 rc
= drxj_dap_write_reg16(dev_addr
, VSB_COMM_EXEC__A
, VSB_COMM_EXEC_ACTIVE
, 0);
6192 pr_err("error %d\n", rc
);
6195 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_ACTIVE
, 0);
6197 pr_err("error %d\n", rc
);
6207 * \fn static short get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *PckErrs)
6208 * \brief Get the values of packet error in 8VSB mode
6209 * \return Error code
6211 static int get_vsb_post_rs_pck_err(struct i2c_device_addr
*dev_addr
,
6212 u32
*pck_errs
, u32
*pck_count
)
6218 u16 packet_errors_mant
= 0;
6219 u16 packet_errors_exp
= 0;
6221 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_FAILURES__A
, &data
, 0);
6223 pr_err("error %d\n", rc
);
6226 packet_errors_mant
= data
& FEC_RS_NR_FAILURES_FIXED_MANT__M
;
6227 packet_errors_exp
= (data
& FEC_RS_NR_FAILURES_EXP__M
)
6228 >> FEC_RS_NR_FAILURES_EXP__B
;
6229 period
= FEC_RS_MEASUREMENT_PERIOD
;
6230 prescale
= FEC_RS_MEASUREMENT_PRESCALE
;
6231 /* packet error rate = (error packet number) per second */
6232 /* 77.3 us is time for per packet */
6233 if (period
* prescale
== 0) {
6234 pr_err("error: period and/or prescale is zero!\n");
6237 *pck_errs
= packet_errors_mant
* (1 << packet_errors_exp
);
6238 *pck_count
= period
* prescale
* 77;
6246 * \fn static short GetVSBBer(struct i2c_device_addr *dev_addr, u32 *ber)
6247 * \brief Get the values of ber in VSB mode
6248 * \return Error code
6250 static int get_vs_bpost_viterbi_ber(struct i2c_device_addr
*dev_addr
,
6257 u16 bit_errors_mant
= 0;
6258 u16 bit_errors_exp
= 0;
6260 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_BIT_ERRORS__A
, &data
, 0);
6262 pr_err("error %d\n", rc
);
6265 period
= FEC_RS_MEASUREMENT_PERIOD
;
6266 prescale
= FEC_RS_MEASUREMENT_PRESCALE
;
6268 bit_errors_mant
= data
& FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M
;
6269 bit_errors_exp
= (data
& FEC_RS_NR_BIT_ERRORS_EXP__M
)
6270 >> FEC_RS_NR_BIT_ERRORS_EXP__B
;
6272 *cnt
= period
* prescale
* 207 * ((bit_errors_exp
> 2) ? 1 : 8);
6274 if (((bit_errors_mant
<< bit_errors_exp
) >> 3) > 68700)
6275 *ber
= (*cnt
) * 26570;
6277 if (period
* prescale
== 0) {
6278 pr_err("error: period and/or prescale is zero!\n");
6281 *ber
= bit_errors_mant
<< ((bit_errors_exp
> 2) ?
6282 (bit_errors_exp
- 3) : bit_errors_exp
);
6291 * \fn static short get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
6292 * \brief Get the values of ber in VSB mode
6293 * \return Error code
6295 static int get_vs_bpre_viterbi_ber(struct i2c_device_addr
*dev_addr
,
6301 rc
= drxj_dap_read_reg16(dev_addr
, VSB_TOP_NR_SYM_ERRS__A
, &data
, 0);
6303 pr_err("error %d\n", rc
);
6307 *cnt
= VSB_TOP_MEASUREMENT_PERIOD
* SYMBOLS_PER_SEGMENT
;
6313 * \fn static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6314 * \brief Get the values of MER
6315 * \return Error code
6317 static int get_vsbmer(struct i2c_device_addr
*dev_addr
, u16
*mer
)
6322 rc
= drxj_dap_read_reg16(dev_addr
, VSB_TOP_ERR_ENERGY_H__A
, &data_hi
, 0);
6324 pr_err("error %d\n", rc
);
6328 (u16
) (log1_times100(21504) - log1_times100((data_hi
<< 6) / 52));
6336 /*============================================================================*/
6337 /*== END 8VSB DATAPATH FUNCTIONS ==*/
6338 /*============================================================================*/
6340 /*============================================================================*/
6341 /*============================================================================*/
6342 /*== QAM DATAPATH FUNCTIONS ==*/
6343 /*============================================================================*/
6344 /*============================================================================*/
6347 * \fn int power_down_qam ()
6348 * \brief Powr down QAM related blocks.
6349 * \param demod instance of demodulator.
6350 * \param channel pointer to channel data.
6353 static int power_down_qam(struct drx_demod_instance
*demod
, bool primary
)
6355 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
6356 /* parameter_len */ 0,
6358 /* *parameter */ NULL
,
6362 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
6363 struct drx_cfg_mpeg_output cfg_mpeg_output
;
6364 struct drx_common_attr
*common_attr
= demod
->my_common_attr
;
6369 resets IQM, QAM and FEC HW blocks
6371 /* stop all comm_exec */
6372 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
, 0);
6374 pr_err("error %d\n", rc
);
6377 rc
= drxj_dap_write_reg16(dev_addr
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_STOP
, 0);
6379 pr_err("error %d\n", rc
);
6383 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
6384 SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
6385 cmd_scu
.parameter_len
= 0;
6386 cmd_scu
.result_len
= 1;
6387 cmd_scu
.parameter
= NULL
;
6388 cmd_scu
.result
= &cmd_result
;
6389 rc
= scu_command(dev_addr
, &cmd_scu
);
6391 pr_err("error %d\n", rc
);
6396 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_STOP
, 0);
6398 pr_err("error %d\n", rc
);
6401 rc
= set_iqm_af(demod
, false);
6403 pr_err("error %d\n", rc
);
6407 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
6409 pr_err("error %d\n", rc
);
6412 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
6414 pr_err("error %d\n", rc
);
6417 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
6419 pr_err("error %d\n", rc
);
6422 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
6424 pr_err("error %d\n", rc
);
6427 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
6429 pr_err("error %d\n", rc
);
6434 memcpy(&cfg_mpeg_output
, &common_attr
->mpeg_cfg
, sizeof(cfg_mpeg_output
));
6435 cfg_mpeg_output
.enable_mpeg_output
= false;
6437 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
6439 pr_err("error %d\n", rc
);
6448 /*============================================================================*/
6451 * \fn int set_qam_measurement ()
6452 * \brief Setup of the QAM Measuremnt intervals for signal quality
6453 * \param demod instance of demod.
6454 * \param constellation current constellation.
6458 * Take into account that for certain settings the errorcounters can overflow.
6459 * The implementation does not check this.
6461 * TODO: overriding the ext_attr->fec_bits_desired by constellation dependent
6462 * constants to get a measurement period of approx. 1 sec. Remove fec_bits_desired
6466 #ifndef DRXJ_VSB_ONLY
6468 set_qam_measurement(struct drx_demod_instance
*demod
,
6469 enum drx_modulation constellation
, u32 symbol_rate
)
6471 struct i2c_device_addr
*dev_addr
= NULL
; /* device address for I2C writes */
6472 struct drxj_data
*ext_attr
= NULL
; /* Global data container for DRXJ specific data */
6474 u32 fec_bits_desired
= 0; /* BER accounting period */
6475 u16 fec_rs_plen
= 0; /* defines RS BER measurement period */
6476 u16 fec_rs_prescale
= 0; /* ReedSolomon Measurement Prescale */
6477 u32 fec_rs_period
= 0; /* Value for corresponding I2C register */
6478 u32 fec_rs_bit_cnt
= 0; /* Actual precise amount of bits */
6479 u32 fec_oc_snc_fail_period
= 0; /* Value for corresponding I2C register */
6480 u32 qam_vd_period
= 0; /* Value for corresponding I2C register */
6481 u32 qam_vd_bit_cnt
= 0; /* Actual precise amount of bits */
6482 u16 fec_vd_plen
= 0; /* no of trellis symbols: VD SER measur period */
6483 u16 qam_vd_prescale
= 0; /* Viterbi Measurement Prescale */
6485 dev_addr
= demod
->my_i2c_dev_addr
;
6486 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
6488 fec_bits_desired
= ext_attr
->fec_bits_desired
;
6489 fec_rs_prescale
= ext_attr
->fec_rs_prescale
;
6491 switch (constellation
) {
6492 case DRX_CONSTELLATION_QAM16
:
6493 fec_bits_desired
= 4 * symbol_rate
;
6495 case DRX_CONSTELLATION_QAM32
:
6496 fec_bits_desired
= 5 * symbol_rate
;
6498 case DRX_CONSTELLATION_QAM64
:
6499 fec_bits_desired
= 6 * symbol_rate
;
6501 case DRX_CONSTELLATION_QAM128
:
6502 fec_bits_desired
= 7 * symbol_rate
;
6504 case DRX_CONSTELLATION_QAM256
:
6505 fec_bits_desired
= 8 * symbol_rate
;
6511 /* Parameters for Reed-Solomon Decoder */
6512 /* fecrs_period = (int)ceil(FEC_BITS_DESIRED/(fecrs_prescale*plen)) */
6513 /* rs_bit_cnt = fecrs_period*fecrs_prescale*plen */
6514 /* result is within 32 bit arithmetic -> */
6515 /* no need for mult or frac functions */
6517 /* TODO: use constant instead of calculation and remove the fec_rs_plen in ext_attr */
6518 switch (ext_attr
->standard
) {
6519 case DRX_STANDARD_ITU_A
:
6520 case DRX_STANDARD_ITU_C
:
6521 fec_rs_plen
= 204 * 8;
6523 case DRX_STANDARD_ITU_B
:
6524 fec_rs_plen
= 128 * 7;
6530 ext_attr
->fec_rs_plen
= fec_rs_plen
; /* for getSigQual */
6531 fec_rs_bit_cnt
= fec_rs_prescale
* fec_rs_plen
; /* temp storage */
6532 if (fec_rs_bit_cnt
== 0) {
6533 pr_err("error: fec_rs_bit_cnt is zero!\n");
6536 fec_rs_period
= fec_bits_desired
/ fec_rs_bit_cnt
+ 1; /* ceil */
6537 if (ext_attr
->standard
!= DRX_STANDARD_ITU_B
)
6538 fec_oc_snc_fail_period
= fec_rs_period
;
6540 /* limit to max 16 bit value (I2C register width) if needed */
6541 if (fec_rs_period
> 0xFFFF)
6542 fec_rs_period
= 0xFFFF;
6544 /* write corresponding registers */
6545 switch (ext_attr
->standard
) {
6546 case DRX_STANDARD_ITU_A
:
6547 case DRX_STANDARD_ITU_C
:
6549 case DRX_STANDARD_ITU_B
:
6550 switch (constellation
) {
6551 case DRX_CONSTELLATION_QAM64
:
6552 fec_rs_period
= 31581;
6553 fec_oc_snc_fail_period
= 17932;
6555 case DRX_CONSTELLATION_QAM256
:
6556 fec_rs_period
= 45446;
6557 fec_oc_snc_fail_period
= 25805;
6567 rc
= drxj_dap_write_reg16(dev_addr
, FEC_OC_SNC_FAIL_PERIOD__A
, (u16
)fec_oc_snc_fail_period
, 0);
6569 pr_err("error %d\n", rc
);
6572 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MEASUREMENT_PERIOD__A
, (u16
)fec_rs_period
, 0);
6574 pr_err("error %d\n", rc
);
6577 rc
= drxj_dap_write_reg16(dev_addr
, FEC_RS_MEASUREMENT_PRESCALE__A
, fec_rs_prescale
, 0);
6579 pr_err("error %d\n", rc
);
6582 ext_attr
->fec_rs_period
= (u16
) fec_rs_period
;
6583 ext_attr
->fec_rs_prescale
= fec_rs_prescale
;
6584 rc
= drxdap_fasi_write_reg32(dev_addr
, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A
, 0, 0);
6586 pr_err("error %d\n", rc
);
6589 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_FEC_MEAS_COUNT__A
, 0, 0);
6591 pr_err("error %d\n", rc
);
6594 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, 0, 0);
6596 pr_err("error %d\n", rc
);
6600 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
6601 /* Parameters for Viterbi Decoder */
6602 /* qamvd_period = (int)ceil(FEC_BITS_DESIRED/ */
6603 /* (qamvd_prescale*plen*(qam_constellation+1))) */
6604 /* vd_bit_cnt = qamvd_period*qamvd_prescale*plen */
6605 /* result is within 32 bit arithmetic -> */
6606 /* no need for mult or frac functions */
6608 /* a(8 bit) * b(8 bit) = 16 bit result => mult32 not needed */
6609 fec_vd_plen
= ext_attr
->fec_vd_plen
;
6610 qam_vd_prescale
= ext_attr
->qam_vd_prescale
;
6611 qam_vd_bit_cnt
= qam_vd_prescale
* fec_vd_plen
; /* temp storage */
6613 switch (constellation
) {
6614 case DRX_CONSTELLATION_QAM64
:
6615 /* a(16 bit) * b(4 bit) = 20 bit result => mult32 not needed */
6617 qam_vd_bit_cnt
* (QAM_TOP_CONSTELLATION_QAM64
+ 1)
6618 * (QAM_TOP_CONSTELLATION_QAM64
+ 1);
6620 case DRX_CONSTELLATION_QAM256
:
6621 /* a(16 bit) * b(5 bit) = 21 bit result => mult32 not needed */
6623 qam_vd_bit_cnt
* (QAM_TOP_CONSTELLATION_QAM256
+ 1)
6624 * (QAM_TOP_CONSTELLATION_QAM256
+ 1);
6629 if (qam_vd_period
== 0) {
6630 pr_err("error: qam_vd_period is zero!\n");
6633 qam_vd_period
= fec_bits_desired
/ qam_vd_period
;
6634 /* limit to max 16 bit value (I2C register width) if needed */
6635 if (qam_vd_period
> 0xFFFF)
6636 qam_vd_period
= 0xFFFF;
6638 /* a(16 bit) * b(16 bit) = 32 bit result => mult32 not needed */
6639 qam_vd_bit_cnt
*= qam_vd_period
;
6641 rc
= drxj_dap_write_reg16(dev_addr
, QAM_VD_MEASUREMENT_PERIOD__A
, (u16
)qam_vd_period
, 0);
6643 pr_err("error %d\n", rc
);
6646 rc
= drxj_dap_write_reg16(dev_addr
, QAM_VD_MEASUREMENT_PRESCALE__A
, qam_vd_prescale
, 0);
6648 pr_err("error %d\n", rc
);
6651 ext_attr
->qam_vd_period
= (u16
) qam_vd_period
;
6652 ext_attr
->qam_vd_prescale
= qam_vd_prescale
;
6660 /*============================================================================*/
6663 * \fn int set_qam16 ()
6664 * \brief QAM16 specific setup
6665 * \param demod instance of demod.
6668 static int set_qam16(struct drx_demod_instance
*demod
)
6670 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
6672 static const u8 qam_dq_qual_fun
[] = {
6673 DRXJ_16TO8(2), /* fun0 */
6674 DRXJ_16TO8(2), /* fun1 */
6675 DRXJ_16TO8(2), /* fun2 */
6676 DRXJ_16TO8(2), /* fun3 */
6677 DRXJ_16TO8(3), /* fun4 */
6678 DRXJ_16TO8(3), /* fun5 */
6680 static const u8 qam_eq_cma_rad
[] = {
6681 DRXJ_16TO8(13517), /* RAD0 */
6682 DRXJ_16TO8(13517), /* RAD1 */
6683 DRXJ_16TO8(13517), /* RAD2 */
6684 DRXJ_16TO8(13517), /* RAD3 */
6685 DRXJ_16TO8(13517), /* RAD4 */
6686 DRXJ_16TO8(13517), /* RAD5 */
6689 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
6691 pr_err("error %d\n", rc
);
6694 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);
6696 pr_err("error %d\n", rc
);
6700 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 140, 0);
6702 pr_err("error %d\n", rc
);
6705 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 50, 0);
6707 pr_err("error %d\n", rc
);
6710 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 120, 0);
6712 pr_err("error %d\n", rc
);
6715 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 230, 0);
6717 pr_err("error %d\n", rc
);
6720 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 95, 0);
6722 pr_err("error %d\n", rc
);
6725 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 105, 0);
6727 pr_err("error %d\n", rc
);
6731 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
6733 pr_err("error %d\n", rc
);
6736 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 56, 0);
6738 pr_err("error %d\n", rc
);
6741 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
6743 pr_err("error %d\n", rc
);
6747 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 16, 0);
6749 pr_err("error %d\n", rc
);
6752 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 220, 0);
6754 pr_err("error %d\n", rc
);
6757 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, 25, 0);
6759 pr_err("error %d\n", rc
);
6762 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, 6, 0);
6764 pr_err("error %d\n", rc
);
6767 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
)(-24), 0);
6769 pr_err("error %d\n", rc
);
6772 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
)(-65), 0);
6774 pr_err("error %d\n", rc
);
6777 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-127), 0);
6779 pr_err("error %d\n", rc
);
6783 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
6785 pr_err("error %d\n", rc
);
6788 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
6790 pr_err("error %d\n", rc
);
6793 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
6795 pr_err("error %d\n", rc
);
6798 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 20, 0);
6800 pr_err("error %d\n", rc
);
6803 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
6805 pr_err("error %d\n", rc
);
6808 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
6810 pr_err("error %d\n", rc
);
6813 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 10, 0);
6815 pr_err("error %d\n", rc
);
6818 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50, 0);
6820 pr_err("error %d\n", rc
);
6823 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
6825 pr_err("error %d\n", rc
);
6828 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
6830 pr_err("error %d\n", rc
);
6833 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
6835 pr_err("error %d\n", rc
);
6838 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
6840 pr_err("error %d\n", rc
);
6843 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
6845 pr_err("error %d\n", rc
);
6848 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
6850 pr_err("error %d\n", rc
);
6853 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
6855 pr_err("error %d\n", rc
);
6858 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 32, 0);
6860 pr_err("error %d\n", rc
);
6863 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 240, 0);
6865 pr_err("error %d\n", rc
);
6868 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
6870 pr_err("error %d\n", rc
);
6873 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
6875 pr_err("error %d\n", rc
);
6878 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 32, 0);
6880 pr_err("error %d\n", rc
);
6884 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 40960, 0);
6886 pr_err("error %d\n", rc
);
6895 /*============================================================================*/
6898 * \fn int set_qam32 ()
6899 * \brief QAM32 specific setup
6900 * \param demod instance of demod.
6903 static int set_qam32(struct drx_demod_instance
*demod
)
6905 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
6907 static const u8 qam_dq_qual_fun
[] = {
6908 DRXJ_16TO8(3), /* fun0 */
6909 DRXJ_16TO8(3), /* fun1 */
6910 DRXJ_16TO8(3), /* fun2 */
6911 DRXJ_16TO8(3), /* fun3 */
6912 DRXJ_16TO8(4), /* fun4 */
6913 DRXJ_16TO8(4), /* fun5 */
6915 static const u8 qam_eq_cma_rad
[] = {
6916 DRXJ_16TO8(6707), /* RAD0 */
6917 DRXJ_16TO8(6707), /* RAD1 */
6918 DRXJ_16TO8(6707), /* RAD2 */
6919 DRXJ_16TO8(6707), /* RAD3 */
6920 DRXJ_16TO8(6707), /* RAD4 */
6921 DRXJ_16TO8(6707), /* RAD5 */
6924 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
6926 pr_err("error %d\n", rc
);
6929 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);
6931 pr_err("error %d\n", rc
);
6935 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 90, 0);
6937 pr_err("error %d\n", rc
);
6940 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 50, 0);
6942 pr_err("error %d\n", rc
);
6945 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 100, 0);
6947 pr_err("error %d\n", rc
);
6950 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 170, 0);
6952 pr_err("error %d\n", rc
);
6955 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 80, 0);
6957 pr_err("error %d\n", rc
);
6960 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 100, 0);
6962 pr_err("error %d\n", rc
);
6966 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
6968 pr_err("error %d\n", rc
);
6971 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 56, 0);
6973 pr_err("error %d\n", rc
);
6976 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
6978 pr_err("error %d\n", rc
);
6982 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 12, 0);
6984 pr_err("error %d\n", rc
);
6987 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 140, 0);
6989 pr_err("error %d\n", rc
);
6992 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
)(-8), 0);
6994 pr_err("error %d\n", rc
);
6997 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
)(-16), 0);
6999 pr_err("error %d\n", rc
);
7002 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
)(-26), 0);
7004 pr_err("error %d\n", rc
);
7007 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
)(-56), 0);
7009 pr_err("error %d\n", rc
);
7012 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-86), 0);
7014 pr_err("error %d\n", rc
);
7018 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
7020 pr_err("error %d\n", rc
);
7023 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
7025 pr_err("error %d\n", rc
);
7028 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
7030 pr_err("error %d\n", rc
);
7033 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 20, 0);
7035 pr_err("error %d\n", rc
);
7038 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
7040 pr_err("error %d\n", rc
);
7043 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
7045 pr_err("error %d\n", rc
);
7048 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 10, 0);
7050 pr_err("error %d\n", rc
);
7053 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50, 0);
7055 pr_err("error %d\n", rc
);
7058 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
7060 pr_err("error %d\n", rc
);
7063 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
7065 pr_err("error %d\n", rc
);
7068 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
7070 pr_err("error %d\n", rc
);
7073 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
7075 pr_err("error %d\n", rc
);
7078 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
7080 pr_err("error %d\n", rc
);
7083 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
7085 pr_err("error %d\n", rc
);
7088 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
7090 pr_err("error %d\n", rc
);
7093 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 32, 0);
7095 pr_err("error %d\n", rc
);
7098 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 176, 0);
7100 pr_err("error %d\n", rc
);
7103 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
7105 pr_err("error %d\n", rc
);
7108 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
7110 pr_err("error %d\n", rc
);
7113 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 8, 0);
7115 pr_err("error %d\n", rc
);
7119 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 20480, 0);
7121 pr_err("error %d\n", rc
);
7130 /*============================================================================*/
7133 * \fn int set_qam64 ()
7134 * \brief QAM64 specific setup
7135 * \param demod instance of demod.
7138 static int set_qam64(struct drx_demod_instance
*demod
)
7140 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
7142 static const u8 qam_dq_qual_fun
[] = {
7143 /* this is hw reset value. no necessary to re-write */
7144 DRXJ_16TO8(4), /* fun0 */
7145 DRXJ_16TO8(4), /* fun1 */
7146 DRXJ_16TO8(4), /* fun2 */
7147 DRXJ_16TO8(4), /* fun3 */
7148 DRXJ_16TO8(6), /* fun4 */
7149 DRXJ_16TO8(6), /* fun5 */
7151 static const u8 qam_eq_cma_rad
[] = {
7152 DRXJ_16TO8(13336), /* RAD0 */
7153 DRXJ_16TO8(12618), /* RAD1 */
7154 DRXJ_16TO8(11988), /* RAD2 */
7155 DRXJ_16TO8(13809), /* RAD3 */
7156 DRXJ_16TO8(13809), /* RAD4 */
7157 DRXJ_16TO8(15609), /* RAD5 */
7160 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
7162 pr_err("error %d\n", rc
);
7165 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);
7167 pr_err("error %d\n", rc
);
7171 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 105, 0);
7173 pr_err("error %d\n", rc
);
7176 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 60, 0);
7178 pr_err("error %d\n", rc
);
7181 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 100, 0);
7183 pr_err("error %d\n", rc
);
7186 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 195, 0);
7188 pr_err("error %d\n", rc
);
7191 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 80, 0);
7193 pr_err("error %d\n", rc
);
7196 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 84, 0);
7198 pr_err("error %d\n", rc
);
7202 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
7204 pr_err("error %d\n", rc
);
7207 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 32, 0);
7209 pr_err("error %d\n", rc
);
7212 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
7214 pr_err("error %d\n", rc
);
7218 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 12, 0);
7220 pr_err("error %d\n", rc
);
7223 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 141, 0);
7225 pr_err("error %d\n", rc
);
7228 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, 7, 0);
7230 pr_err("error %d\n", rc
);
7233 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, 0, 0);
7235 pr_err("error %d\n", rc
);
7238 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
)(-15), 0);
7240 pr_err("error %d\n", rc
);
7243 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
)(-45), 0);
7245 pr_err("error %d\n", rc
);
7248 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-80), 0);
7250 pr_err("error %d\n", rc
);
7254 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
7256 pr_err("error %d\n", rc
);
7259 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
7261 pr_err("error %d\n", rc
);
7264 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
7266 pr_err("error %d\n", rc
);
7269 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 30, 0);
7271 pr_err("error %d\n", rc
);
7274 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
7276 pr_err("error %d\n", rc
);
7279 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
7281 pr_err("error %d\n", rc
);
7284 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 15, 0);
7286 pr_err("error %d\n", rc
);
7289 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 80, 0);
7291 pr_err("error %d\n", rc
);
7294 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
7296 pr_err("error %d\n", rc
);
7299 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
7301 pr_err("error %d\n", rc
);
7304 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
7306 pr_err("error %d\n", rc
);
7309 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
7311 pr_err("error %d\n", rc
);
7314 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
7316 pr_err("error %d\n", rc
);
7319 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
7321 pr_err("error %d\n", rc
);
7324 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
7326 pr_err("error %d\n", rc
);
7329 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 48, 0);
7331 pr_err("error %d\n", rc
);
7334 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 160, 0);
7336 pr_err("error %d\n", rc
);
7339 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
7341 pr_err("error %d\n", rc
);
7344 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
7346 pr_err("error %d\n", rc
);
7349 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 32, 0);
7351 pr_err("error %d\n", rc
);
7355 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 43008, 0);
7357 pr_err("error %d\n", rc
);
7366 /*============================================================================*/
7369 * \fn int set_qam128 ()
7370 * \brief QAM128 specific setup
7371 * \param demod: instance of demod.
7374 static int set_qam128(struct drx_demod_instance
*demod
)
7376 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
7378 static const u8 qam_dq_qual_fun
[] = {
7379 DRXJ_16TO8(6), /* fun0 */
7380 DRXJ_16TO8(6), /* fun1 */
7381 DRXJ_16TO8(6), /* fun2 */
7382 DRXJ_16TO8(6), /* fun3 */
7383 DRXJ_16TO8(9), /* fun4 */
7384 DRXJ_16TO8(9), /* fun5 */
7386 static const u8 qam_eq_cma_rad
[] = {
7387 DRXJ_16TO8(6164), /* RAD0 */
7388 DRXJ_16TO8(6598), /* RAD1 */
7389 DRXJ_16TO8(6394), /* RAD2 */
7390 DRXJ_16TO8(6409), /* RAD3 */
7391 DRXJ_16TO8(6656), /* RAD4 */
7392 DRXJ_16TO8(7238), /* RAD5 */
7395 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
7397 pr_err("error %d\n", rc
);
7400 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);
7402 pr_err("error %d\n", rc
);
7406 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 50, 0);
7408 pr_err("error %d\n", rc
);
7411 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 60, 0);
7413 pr_err("error %d\n", rc
);
7416 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 100, 0);
7418 pr_err("error %d\n", rc
);
7421 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 140, 0);
7423 pr_err("error %d\n", rc
);
7426 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 80, 0);
7428 pr_err("error %d\n", rc
);
7431 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 100, 0);
7433 pr_err("error %d\n", rc
);
7437 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
7439 pr_err("error %d\n", rc
);
7442 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 32, 0);
7444 pr_err("error %d\n", rc
);
7447 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
7449 pr_err("error %d\n", rc
);
7453 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 8, 0);
7455 pr_err("error %d\n", rc
);
7458 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 65, 0);
7460 pr_err("error %d\n", rc
);
7463 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, 5, 0);
7465 pr_err("error %d\n", rc
);
7468 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, 3, 0);
7470 pr_err("error %d\n", rc
);
7473 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
)(-1), 0);
7475 pr_err("error %d\n", rc
);
7478 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, 12, 0);
7480 pr_err("error %d\n", rc
);
7483 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-23), 0);
7485 pr_err("error %d\n", rc
);
7489 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
7491 pr_err("error %d\n", rc
);
7494 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
7496 pr_err("error %d\n", rc
);
7499 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
7501 pr_err("error %d\n", rc
);
7504 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 40, 0);
7506 pr_err("error %d\n", rc
);
7509 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
7511 pr_err("error %d\n", rc
);
7514 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
7516 pr_err("error %d\n", rc
);
7519 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 20, 0);
7521 pr_err("error %d\n", rc
);
7524 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 80, 0);
7526 pr_err("error %d\n", rc
);
7529 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
7531 pr_err("error %d\n", rc
);
7534 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
7536 pr_err("error %d\n", rc
);
7539 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
7541 pr_err("error %d\n", rc
);
7544 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
7546 pr_err("error %d\n", rc
);
7549 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
7551 pr_err("error %d\n", rc
);
7554 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
7556 pr_err("error %d\n", rc
);
7559 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
7561 pr_err("error %d\n", rc
);
7564 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 32, 0);
7566 pr_err("error %d\n", rc
);
7569 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 144, 0);
7571 pr_err("error %d\n", rc
);
7574 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
7576 pr_err("error %d\n", rc
);
7579 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
7581 pr_err("error %d\n", rc
);
7584 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 16, 0);
7586 pr_err("error %d\n", rc
);
7590 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 20992, 0);
7592 pr_err("error %d\n", rc
);
7601 /*============================================================================*/
7604 * \fn int set_qam256 ()
7605 * \brief QAM256 specific setup
7606 * \param demod: instance of demod.
7609 static int set_qam256(struct drx_demod_instance
*demod
)
7611 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
7613 static const u8 qam_dq_qual_fun
[] = {
7614 DRXJ_16TO8(8), /* fun0 */
7615 DRXJ_16TO8(8), /* fun1 */
7616 DRXJ_16TO8(8), /* fun2 */
7617 DRXJ_16TO8(8), /* fun3 */
7618 DRXJ_16TO8(12), /* fun4 */
7619 DRXJ_16TO8(12), /* fun5 */
7621 static const u8 qam_eq_cma_rad
[] = {
7622 DRXJ_16TO8(12345), /* RAD0 */
7623 DRXJ_16TO8(12345), /* RAD1 */
7624 DRXJ_16TO8(13626), /* RAD2 */
7625 DRXJ_16TO8(12931), /* RAD3 */
7626 DRXJ_16TO8(14719), /* RAD4 */
7627 DRXJ_16TO8(15356), /* RAD5 */
7630 rc
= drxdap_fasi_write_block(dev_addr
, QAM_DQ_QUAL_FUN0__A
, sizeof(qam_dq_qual_fun
), ((u8
*)qam_dq_qual_fun
), 0);
7632 pr_err("error %d\n", rc
);
7635 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);
7637 pr_err("error %d\n", rc
);
7641 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RTH__A
, 50, 0);
7643 pr_err("error %d\n", rc
);
7646 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FTH__A
, 60, 0);
7648 pr_err("error %d\n", rc
);
7651 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_PTH__A
, 100, 0);
7653 pr_err("error %d\n", rc
);
7656 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_QTH__A
, 150, 0);
7658 pr_err("error %d\n", rc
);
7661 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_CTH__A
, 80, 0);
7663 pr_err("error %d\n", rc
);
7666 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MTH__A
, 110, 0);
7668 pr_err("error %d\n", rc
);
7672 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40, 0);
7674 pr_err("error %d\n", rc
);
7677 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 16, 0);
7679 pr_err("error %d\n", rc
);
7682 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 3, 0);
7684 pr_err("error %d\n", rc
);
7688 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, 8, 0);
7690 pr_err("error %d\n", rc
);
7693 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, 74, 0);
7695 pr_err("error %d\n", rc
);
7698 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, 18, 0);
7700 pr_err("error %d\n", rc
);
7703 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, 13, 0);
7705 pr_err("error %d\n", rc
);
7708 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, 7, 0);
7710 pr_err("error %d\n", rc
);
7713 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, 0, 0);
7715 pr_err("error %d\n", rc
);
7718 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
)(-8), 0);
7720 pr_err("error %d\n", rc
);
7724 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_FINE__A
, 15, 0);
7726 pr_err("error %d\n", rc
);
7729 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40, 0);
7731 pr_err("error %d\n", rc
);
7734 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_FINE__A
, 2, 0);
7736 pr_err("error %d\n", rc
);
7739 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 50, 0);
7741 pr_err("error %d\n", rc
);
7744 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CP_COARSE__A
, 255, 0);
7746 pr_err("error %d\n", rc
);
7749 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_FINE__A
, 2, 0);
7751 pr_err("error %d\n", rc
);
7754 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 25, 0);
7756 pr_err("error %d\n", rc
);
7759 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CI_COARSE__A
, 80, 0);
7761 pr_err("error %d\n", rc
);
7764 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_FINE__A
, 12, 0);
7766 pr_err("error %d\n", rc
);
7769 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24, 0);
7771 pr_err("error %d\n", rc
);
7774 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24, 0);
7776 pr_err("error %d\n", rc
);
7779 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_FINE__A
, 12, 0);
7781 pr_err("error %d\n", rc
);
7784 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16, 0);
7786 pr_err("error %d\n", rc
);
7789 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16, 0);
7791 pr_err("error %d\n", rc
);
7794 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_FINE__A
, 16, 0);
7796 pr_err("error %d\n", rc
);
7799 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 48, 0);
7801 pr_err("error %d\n", rc
);
7804 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF_COARSE__A
, 80, 0);
7806 pr_err("error %d\n", rc
);
7809 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5, 0);
7811 pr_err("error %d\n", rc
);
7814 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 15, 0);
7816 pr_err("error %d\n", rc
);
7819 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 16, 0);
7821 pr_err("error %d\n", rc
);
7825 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_SL_SIG_POWER__A
, 43520, 0);
7827 pr_err("error %d\n", rc
);
7836 /*============================================================================*/
7837 #define QAM_SET_OP_ALL 0x1
7838 #define QAM_SET_OP_CONSTELLATION 0x2
7839 #define QAM_SET_OP_SPECTRUM 0X4
7842 * \fn int set_qam ()
7843 * \brief Set QAM demod.
7844 * \param demod: instance of demod.
7845 * \param channel: pointer to channel data.
7849 set_qam(struct drx_demod_instance
*demod
,
7850 struct drx_channel
*channel
, s32 tuner_freq_offset
, u32 op
)
7852 struct i2c_device_addr
*dev_addr
= NULL
;
7853 struct drxj_data
*ext_attr
= NULL
;
7854 struct drx_common_attr
*common_attr
= NULL
;
7856 u32 adc_frequency
= 0;
7857 u32 iqm_rc_rate
= 0;
7859 u16 lc_symbol_freq
= 0;
7860 u16 iqm_rc_stretch
= 0;
7861 u16 set_env_parameters
= 0;
7862 u16 set_param_parameters
[2] = { 0 };
7863 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
7864 /* parameter_len */ 0,
7866 /* parameter */ NULL
,
7869 static const u8 qam_a_taps
[] = {
7870 DRXJ_16TO8(-1), /* re0 */
7871 DRXJ_16TO8(1), /* re1 */
7872 DRXJ_16TO8(1), /* re2 */
7873 DRXJ_16TO8(-1), /* re3 */
7874 DRXJ_16TO8(-1), /* re4 */
7875 DRXJ_16TO8(2), /* re5 */
7876 DRXJ_16TO8(1), /* re6 */
7877 DRXJ_16TO8(-2), /* re7 */
7878 DRXJ_16TO8(0), /* re8 */
7879 DRXJ_16TO8(3), /* re9 */
7880 DRXJ_16TO8(-1), /* re10 */
7881 DRXJ_16TO8(-3), /* re11 */
7882 DRXJ_16TO8(4), /* re12 */
7883 DRXJ_16TO8(1), /* re13 */
7884 DRXJ_16TO8(-8), /* re14 */
7885 DRXJ_16TO8(4), /* re15 */
7886 DRXJ_16TO8(13), /* re16 */
7887 DRXJ_16TO8(-13), /* re17 */
7888 DRXJ_16TO8(-19), /* re18 */
7889 DRXJ_16TO8(28), /* re19 */
7890 DRXJ_16TO8(25), /* re20 */
7891 DRXJ_16TO8(-53), /* re21 */
7892 DRXJ_16TO8(-31), /* re22 */
7893 DRXJ_16TO8(96), /* re23 */
7894 DRXJ_16TO8(37), /* re24 */
7895 DRXJ_16TO8(-190), /* re25 */
7896 DRXJ_16TO8(-40), /* re26 */
7897 DRXJ_16TO8(619) /* re27 */
7899 static const u8 qam_b64_taps
[] = {
7900 DRXJ_16TO8(0), /* re0 */
7901 DRXJ_16TO8(-2), /* re1 */
7902 DRXJ_16TO8(1), /* re2 */
7903 DRXJ_16TO8(2), /* re3 */
7904 DRXJ_16TO8(-2), /* re4 */
7905 DRXJ_16TO8(0), /* re5 */
7906 DRXJ_16TO8(4), /* re6 */
7907 DRXJ_16TO8(-2), /* re7 */
7908 DRXJ_16TO8(-4), /* re8 */
7909 DRXJ_16TO8(4), /* re9 */
7910 DRXJ_16TO8(3), /* re10 */
7911 DRXJ_16TO8(-6), /* re11 */
7912 DRXJ_16TO8(0), /* re12 */
7913 DRXJ_16TO8(6), /* re13 */
7914 DRXJ_16TO8(-5), /* re14 */
7915 DRXJ_16TO8(-3), /* re15 */
7916 DRXJ_16TO8(11), /* re16 */
7917 DRXJ_16TO8(-4), /* re17 */
7918 DRXJ_16TO8(-19), /* re18 */
7919 DRXJ_16TO8(19), /* re19 */
7920 DRXJ_16TO8(28), /* re20 */
7921 DRXJ_16TO8(-45), /* re21 */
7922 DRXJ_16TO8(-36), /* re22 */
7923 DRXJ_16TO8(90), /* re23 */
7924 DRXJ_16TO8(42), /* re24 */
7925 DRXJ_16TO8(-185), /* re25 */
7926 DRXJ_16TO8(-46), /* re26 */
7927 DRXJ_16TO8(614) /* re27 */
7929 static const u8 qam_b256_taps
[] = {
7930 DRXJ_16TO8(-2), /* re0 */
7931 DRXJ_16TO8(4), /* re1 */
7932 DRXJ_16TO8(1), /* re2 */
7933 DRXJ_16TO8(-4), /* re3 */
7934 DRXJ_16TO8(0), /* re4 */
7935 DRXJ_16TO8(4), /* re5 */
7936 DRXJ_16TO8(-2), /* re6 */
7937 DRXJ_16TO8(-4), /* re7 */
7938 DRXJ_16TO8(5), /* re8 */
7939 DRXJ_16TO8(2), /* re9 */
7940 DRXJ_16TO8(-8), /* re10 */
7941 DRXJ_16TO8(2), /* re11 */
7942 DRXJ_16TO8(11), /* re12 */
7943 DRXJ_16TO8(-8), /* re13 */
7944 DRXJ_16TO8(-15), /* re14 */
7945 DRXJ_16TO8(16), /* re15 */
7946 DRXJ_16TO8(19), /* re16 */
7947 DRXJ_16TO8(-27), /* re17 */
7948 DRXJ_16TO8(-22), /* re18 */
7949 DRXJ_16TO8(44), /* re19 */
7950 DRXJ_16TO8(26), /* re20 */
7951 DRXJ_16TO8(-69), /* re21 */
7952 DRXJ_16TO8(-28), /* re22 */
7953 DRXJ_16TO8(110), /* re23 */
7954 DRXJ_16TO8(31), /* re24 */
7955 DRXJ_16TO8(-201), /* re25 */
7956 DRXJ_16TO8(-32), /* re26 */
7957 DRXJ_16TO8(628) /* re27 */
7959 static const u8 qam_c_taps
[] = {
7960 DRXJ_16TO8(-3), /* re0 */
7961 DRXJ_16TO8(3), /* re1 */
7962 DRXJ_16TO8(2), /* re2 */
7963 DRXJ_16TO8(-4), /* re3 */
7964 DRXJ_16TO8(0), /* re4 */
7965 DRXJ_16TO8(4), /* re5 */
7966 DRXJ_16TO8(-1), /* re6 */
7967 DRXJ_16TO8(-4), /* re7 */
7968 DRXJ_16TO8(3), /* re8 */
7969 DRXJ_16TO8(3), /* re9 */
7970 DRXJ_16TO8(-5), /* re10 */
7971 DRXJ_16TO8(0), /* re11 */
7972 DRXJ_16TO8(9), /* re12 */
7973 DRXJ_16TO8(-4), /* re13 */
7974 DRXJ_16TO8(-12), /* re14 */
7975 DRXJ_16TO8(10), /* re15 */
7976 DRXJ_16TO8(16), /* re16 */
7977 DRXJ_16TO8(-21), /* re17 */
7978 DRXJ_16TO8(-20), /* re18 */
7979 DRXJ_16TO8(37), /* re19 */
7980 DRXJ_16TO8(25), /* re20 */
7981 DRXJ_16TO8(-62), /* re21 */
7982 DRXJ_16TO8(-28), /* re22 */
7983 DRXJ_16TO8(105), /* re23 */
7984 DRXJ_16TO8(31), /* re24 */
7985 DRXJ_16TO8(-197), /* re25 */
7986 DRXJ_16TO8(-33), /* re26 */
7987 DRXJ_16TO8(626) /* re27 */
7990 dev_addr
= demod
->my_i2c_dev_addr
;
7991 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
7992 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
7994 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
7995 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
7996 switch (channel
->constellation
) {
7997 case DRX_CONSTELLATION_QAM256
:
7998 iqm_rc_rate
= 0x00AE3562;
8000 QAM_LC_SYMBOL_FREQ_FREQ_QAM_B_256
;
8001 channel
->symbolrate
= 5360537;
8002 iqm_rc_stretch
= IQM_RC_STRETCH_QAM_B_256
;
8004 case DRX_CONSTELLATION_QAM64
:
8005 iqm_rc_rate
= 0x00C05A0E;
8006 lc_symbol_freq
= 409;
8007 channel
->symbolrate
= 5056941;
8008 iqm_rc_stretch
= IQM_RC_STRETCH_QAM_B_64
;
8014 adc_frequency
= (common_attr
->sys_clock_freq
* 1000) / 3;
8015 if (channel
->symbolrate
== 0) {
8016 pr_err("error: channel symbolrate is zero!\n");
8020 (adc_frequency
/ channel
->symbolrate
) * (1 << 21) +
8022 ((adc_frequency
% channel
->symbolrate
),
8023 channel
->symbolrate
) >> 7) - (1 << 23);
8026 (channel
->symbolrate
+
8027 (adc_frequency
>> 13),
8028 adc_frequency
) >> 16);
8029 if (lc_symbol_freq
> 511)
8030 lc_symbol_freq
= 511;
8032 iqm_rc_stretch
= 21;
8035 if (ext_attr
->standard
== DRX_STANDARD_ITU_A
) {
8036 set_env_parameters
= QAM_TOP_ANNEX_A
; /* annex */
8037 set_param_parameters
[0] = channel
->constellation
; /* constellation */
8038 set_param_parameters
[1] = DRX_INTERLEAVEMODE_I12_J17
; /* interleave mode */
8039 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
8040 set_env_parameters
= QAM_TOP_ANNEX_B
; /* annex */
8041 set_param_parameters
[0] = channel
->constellation
; /* constellation */
8042 set_param_parameters
[1] = channel
->interleavemode
; /* interleave mode */
8043 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_C
) {
8044 set_env_parameters
= QAM_TOP_ANNEX_C
; /* annex */
8045 set_param_parameters
[0] = channel
->constellation
; /* constellation */
8046 set_param_parameters
[1] = DRX_INTERLEAVEMODE_I12_J17
; /* interleave mode */
8052 if (op
& QAM_SET_OP_ALL
) {
8054 STEP 1: reset demodulator
8055 resets IQM, QAM and FEC HW blocks
8056 resets SCU variables
8058 /* stop all comm_exec */
8059 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
, 0);
8061 pr_err("error %d\n", rc
);
8064 rc
= drxj_dap_write_reg16(dev_addr
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_STOP
, 0);
8066 pr_err("error %d\n", rc
);
8069 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
8071 pr_err("error %d\n", rc
);
8074 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
8076 pr_err("error %d\n", rc
);
8079 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
8081 pr_err("error %d\n", rc
);
8084 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
8086 pr_err("error %d\n", rc
);
8089 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
8091 pr_err("error %d\n", rc
);
8095 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
8096 SCU_RAM_COMMAND_CMD_DEMOD_RESET
;
8097 cmd_scu
.parameter_len
= 0;
8098 cmd_scu
.result_len
= 1;
8099 cmd_scu
.parameter
= NULL
;
8100 cmd_scu
.result
= &cmd_result
;
8101 rc
= scu_command(dev_addr
, &cmd_scu
);
8103 pr_err("error %d\n", rc
);
8108 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
8110 STEP 2: configure demodulator
8112 -set params (resets IQM,QAM,FEC HW; initializes some SCU variables )
8114 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
8115 SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV
;
8116 cmd_scu
.parameter_len
= 1;
8117 cmd_scu
.result_len
= 1;
8118 cmd_scu
.parameter
= &set_env_parameters
;
8119 cmd_scu
.result
= &cmd_result
;
8120 rc
= scu_command(dev_addr
, &cmd_scu
);
8122 pr_err("error %d\n", rc
);
8126 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
8127 SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM
;
8128 cmd_scu
.parameter_len
= 2;
8129 cmd_scu
.result_len
= 1;
8130 cmd_scu
.parameter
= set_param_parameters
;
8131 cmd_scu
.result
= &cmd_result
;
8132 rc
= scu_command(dev_addr
, &cmd_scu
);
8134 pr_err("error %d\n", rc
);
8137 /* set symbol rate */
8138 rc
= drxdap_fasi_write_reg32(dev_addr
, IQM_RC_RATE_OFS_LO__A
, iqm_rc_rate
, 0);
8140 pr_err("error %d\n", rc
);
8143 ext_attr
->iqm_rc_rate_ofs
= iqm_rc_rate
;
8144 rc
= set_qam_measurement(demod
, channel
->constellation
, channel
->symbolrate
);
8146 pr_err("error %d\n", rc
);
8150 /* STEP 3: enable the system in a mode where the ADC provides valid signal
8151 setup constellation independent registers */
8152 /* from qam_cmd.py script (qam_driver_b) */
8153 /* TODO: remove re-writes of HW reset values */
8154 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_SPECTRUM
)) {
8155 rc
= set_frequency(demod
, channel
, tuner_freq_offset
);
8157 pr_err("error %d\n", rc
);
8162 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
8164 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_SYMBOL_FREQ__A
, lc_symbol_freq
, 0);
8166 pr_err("error %d\n", rc
);
8169 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_STRETCH__A
, iqm_rc_stretch
, 0);
8171 pr_err("error %d\n", rc
);
8176 if (op
& QAM_SET_OP_ALL
) {
8177 if (!ext_attr
->has_lna
) {
8178 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_AMUX__A
, 0x02, 0);
8180 pr_err("error %d\n", rc
);
8184 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SYMMETRIC__A
, 0, 0);
8186 pr_err("error %d\n", rc
);
8189 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_MIDTAP__A
, 3, 0);
8191 pr_err("error %d\n", rc
);
8194 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_OUT_ENA__A
, IQM_CF_OUT_ENA_QAM__M
, 0);
8196 pr_err("error %d\n", rc
);
8200 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_WR_RSV_0__A
, 0x5f, 0);
8202 pr_err("error %d\n", rc
);
8204 } /* scu temporary shut down agc */
8206 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_SYNC_SEL__A
, 3, 0);
8208 pr_err("error %d\n", rc
);
8211 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLP_LEN__A
, 0, 0);
8213 pr_err("error %d\n", rc
);
8216 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_CLP_TH__A
, 448, 0);
8218 pr_err("error %d\n", rc
);
8221 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_SNS_LEN__A
, 0, 0);
8223 pr_err("error %d\n", rc
);
8226 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_PDREF__A
, 4, 0);
8228 pr_err("error %d\n", rc
);
8231 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_STDBY__A
, 0x10, 0);
8233 pr_err("error %d\n", rc
);
8236 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_PGA_GAIN__A
, 11, 0);
8238 pr_err("error %d\n", rc
);
8242 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_POW_MEAS_LEN__A
, 1, 0);
8244 pr_err("error %d\n", rc
);
8247 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SCALE_SH__A
, IQM_CF_SCALE_SH__PRE
, 0);
8249 pr_err("error %d\n", rc
);
8251 } /*! reset default val ! */
8253 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_TIMEOUT__A
, QAM_SY_TIMEOUT__PRE
, 0);
8255 pr_err("error %d\n", rc
);
8257 } /*! reset default val ! */
8258 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
8259 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_LWM__A
, QAM_SY_SYNC_LWM__PRE
, 0);
8261 pr_err("error %d\n", rc
);
8263 } /*! reset default val ! */
8264 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_AWM__A
, QAM_SY_SYNC_AWM__PRE
, 0);
8266 pr_err("error %d\n", rc
);
8268 } /*! reset default val ! */
8269 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_HWM__A
, QAM_SY_SYNC_HWM__PRE
, 0);
8271 pr_err("error %d\n", rc
);
8273 } /*! reset default val ! */
8275 switch (channel
->constellation
) {
8276 case DRX_CONSTELLATION_QAM16
:
8277 case DRX_CONSTELLATION_QAM64
:
8278 case DRX_CONSTELLATION_QAM256
:
8279 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_LWM__A
, 0x03, 0);
8281 pr_err("error %d\n", rc
);
8284 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_AWM__A
, 0x04, 0);
8286 pr_err("error %d\n", rc
);
8289 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_HWM__A
, QAM_SY_SYNC_HWM__PRE
, 0);
8291 pr_err("error %d\n", rc
);
8293 } /*! reset default val ! */
8295 case DRX_CONSTELLATION_QAM32
:
8296 case DRX_CONSTELLATION_QAM128
:
8297 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_LWM__A
, 0x03, 0);
8299 pr_err("error %d\n", rc
);
8302 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_AWM__A
, 0x05, 0);
8304 pr_err("error %d\n", rc
);
8307 rc
= drxj_dap_write_reg16(dev_addr
, QAM_SY_SYNC_HWM__A
, 0x06, 0);
8309 pr_err("error %d\n", rc
);
8318 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_MODE__A
, QAM_LC_MODE__PRE
, 0);
8320 pr_err("error %d\n", rc
);
8322 } /*! reset default val ! */
8323 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_RATE_LIMIT__A
, 3, 0);
8325 pr_err("error %d\n", rc
);
8328 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_LPF_FACTORP__A
, 4, 0);
8330 pr_err("error %d\n", rc
);
8333 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_LPF_FACTORI__A
, 4, 0);
8335 pr_err("error %d\n", rc
);
8338 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_MODE__A
, 7, 0);
8340 pr_err("error %d\n", rc
);
8343 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB0__A
, 1, 0);
8345 pr_err("error %d\n", rc
);
8348 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB1__A
, 1, 0);
8350 pr_err("error %d\n", rc
);
8353 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB2__A
, 1, 0);
8355 pr_err("error %d\n", rc
);
8358 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB3__A
, 1, 0);
8360 pr_err("error %d\n", rc
);
8363 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB4__A
, 2, 0);
8365 pr_err("error %d\n", rc
);
8368 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB5__A
, 2, 0);
8370 pr_err("error %d\n", rc
);
8373 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB6__A
, 2, 0);
8375 pr_err("error %d\n", rc
);
8378 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB8__A
, 2, 0);
8380 pr_err("error %d\n", rc
);
8383 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB9__A
, 2, 0);
8385 pr_err("error %d\n", rc
);
8388 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB10__A
, 2, 0);
8390 pr_err("error %d\n", rc
);
8393 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB12__A
, 2, 0);
8395 pr_err("error %d\n", rc
);
8398 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB15__A
, 3, 0);
8400 pr_err("error %d\n", rc
);
8403 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB16__A
, 3, 0);
8405 pr_err("error %d\n", rc
);
8408 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB20__A
, 4, 0);
8410 pr_err("error %d\n", rc
);
8413 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_QUAL_TAB25__A
, 4, 0);
8415 pr_err("error %d\n", rc
);
8419 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_ADJ_SEL__A
, 1, 0);
8421 pr_err("error %d\n", rc
);
8424 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_ADJ_SEL__A
, 1, 0);
8426 pr_err("error %d\n", rc
);
8429 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_ADJ_SEL__A
, 1, 0);
8431 pr_err("error %d\n", rc
);
8434 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_POW_MEAS_LEN__A
, 0, 0);
8436 pr_err("error %d\n", rc
);
8439 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_GPIO__A
, 0, 0);
8441 pr_err("error %d\n", rc
);
8445 /* No more resets of the IQM, current standard correctly set =>
8446 now AGCs can be configured. */
8447 /* turn on IQMAF. It has to be in front of setAgc**() */
8448 rc
= set_iqm_af(demod
, true);
8450 pr_err("error %d\n", rc
);
8453 rc
= adc_synchronization(demod
);
8455 pr_err("error %d\n", rc
);
8459 rc
= init_agc(demod
);
8461 pr_err("error %d\n", rc
);
8464 rc
= set_agc_if(demod
, &(ext_attr
->qam_if_agc_cfg
), false);
8466 pr_err("error %d\n", rc
);
8469 rc
= set_agc_rf(demod
, &(ext_attr
->qam_rf_agc_cfg
), false);
8471 pr_err("error %d\n", rc
);
8475 /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
8477 struct drxj_cfg_afe_gain qam_pga_cfg
= { DRX_STANDARD_ITU_B
, 0 };
8479 qam_pga_cfg
.gain
= ext_attr
->qam_pga_cfg
;
8480 rc
= ctrl_set_cfg_afe_gain(demod
, &qam_pga_cfg
);
8482 pr_err("error %d\n", rc
);
8486 rc
= ctrl_set_cfg_pre_saw(demod
, &(ext_attr
->qam_pre_saw_cfg
));
8488 pr_err("error %d\n", rc
);
8493 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
8494 if (ext_attr
->standard
== DRX_STANDARD_ITU_A
) {
8495 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(qam_a_taps
), ((u8
*)qam_a_taps
), 0);
8497 pr_err("error %d\n", rc
);
8500 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(qam_a_taps
), ((u8
*)qam_a_taps
), 0);
8502 pr_err("error %d\n", rc
);
8505 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
8506 switch (channel
->constellation
) {
8507 case DRX_CONSTELLATION_QAM64
:
8508 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(qam_b64_taps
), ((u8
*)qam_b64_taps
), 0);
8510 pr_err("error %d\n", rc
);
8513 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(qam_b64_taps
), ((u8
*)qam_b64_taps
), 0);
8515 pr_err("error %d\n", rc
);
8519 case DRX_CONSTELLATION_QAM256
:
8520 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(qam_b256_taps
), ((u8
*)qam_b256_taps
), 0);
8522 pr_err("error %d\n", rc
);
8525 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(qam_b256_taps
), ((u8
*)qam_b256_taps
), 0);
8527 pr_err("error %d\n", rc
);
8534 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_C
) {
8535 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_RE0__A
, sizeof(qam_c_taps
), ((u8
*)qam_c_taps
), 0);
8537 pr_err("error %d\n", rc
);
8540 rc
= drxdap_fasi_write_block(dev_addr
, IQM_CF_TAP_IM0__A
, sizeof(qam_c_taps
), ((u8
*)qam_c_taps
), 0);
8542 pr_err("error %d\n", rc
);
8547 /* SETP 4: constellation specific setup */
8548 switch (channel
->constellation
) {
8549 case DRX_CONSTELLATION_QAM16
:
8550 rc
= set_qam16(demod
);
8552 pr_err("error %d\n", rc
);
8556 case DRX_CONSTELLATION_QAM32
:
8557 rc
= set_qam32(demod
);
8559 pr_err("error %d\n", rc
);
8563 case DRX_CONSTELLATION_QAM64
:
8564 rc
= set_qam64(demod
);
8566 pr_err("error %d\n", rc
);
8570 case DRX_CONSTELLATION_QAM128
:
8571 rc
= set_qam128(demod
);
8573 pr_err("error %d\n", rc
);
8577 case DRX_CONSTELLATION_QAM256
:
8578 rc
= set_qam256(demod
);
8580 pr_err("error %d\n", rc
);
8589 if ((op
& QAM_SET_OP_ALL
)) {
8590 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_SCALE_SH__A
, 0, 0);
8592 pr_err("error %d\n", rc
);
8596 /* Mpeg output has to be in front of FEC active */
8597 rc
= set_mpegtei_handling(demod
);
8599 pr_err("error %d\n", rc
);
8602 rc
= bit_reverse_mpeg_output(demod
);
8604 pr_err("error %d\n", rc
);
8607 rc
= set_mpeg_start_width(demod
);
8609 pr_err("error %d\n", rc
);
8613 /* TODO: move to set_standard after hardware reset value problem is solved */
8614 /* Configure initial MPEG output */
8615 struct drx_cfg_mpeg_output cfg_mpeg_output
;
8617 memcpy(&cfg_mpeg_output
, &common_attr
->mpeg_cfg
, sizeof(cfg_mpeg_output
));
8618 cfg_mpeg_output
.enable_mpeg_output
= true;
8620 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
8622 pr_err("error %d\n", rc
);
8628 if ((op
& QAM_SET_OP_ALL
) || (op
& QAM_SET_OP_CONSTELLATION
)) {
8630 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
8631 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
8632 SCU_RAM_COMMAND_CMD_DEMOD_START
;
8633 cmd_scu
.parameter_len
= 0;
8634 cmd_scu
.result_len
= 1;
8635 cmd_scu
.parameter
= NULL
;
8636 cmd_scu
.result
= &cmd_result
;
8637 rc
= scu_command(dev_addr
, &cmd_scu
);
8639 pr_err("error %d\n", rc
);
8644 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_ACTIVE
, 0);
8646 pr_err("error %d\n", rc
);
8649 rc
= drxj_dap_write_reg16(dev_addr
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_ACTIVE
, 0);
8651 pr_err("error %d\n", rc
);
8654 rc
= drxj_dap_write_reg16(dev_addr
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_ACTIVE
, 0);
8656 pr_err("error %d\n", rc
);
8665 /*============================================================================*/
8666 static int ctrl_get_qam_sig_quality(struct drx_demod_instance
*demod
);
8668 static int qam_flip_spec(struct drx_demod_instance
*demod
, struct drx_channel
*channel
)
8670 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
8671 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
8673 u32 iqm_fs_rate_ofs
= 0;
8674 u32 iqm_fs_rate_lo
= 0;
8675 u16 qam_ctl_ena
= 0;
8682 /* Silence the controlling of lc, equ, and the acquisition state machine */
8683 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_QAM_CTL_ENA__A
, &qam_ctl_ena
, 0);
8685 pr_err("error %d\n", rc
);
8688 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);
8690 pr_err("error %d\n", rc
);
8694 /* freeze the frequency control loop */
8695 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_CF__A
, 0, 0);
8697 pr_err("error %d\n", rc
);
8700 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_CF1__A
, 0, 0);
8702 pr_err("error %d\n", rc
);
8706 rc
= drxj_dap_atomic_read_reg32(dev_addr
, IQM_FS_RATE_OFS_LO__A
, &iqm_fs_rate_ofs
, 0);
8708 pr_err("error %d\n", rc
);
8711 rc
= drxj_dap_atomic_read_reg32(dev_addr
, IQM_FS_RATE_LO__A
, &iqm_fs_rate_lo
, 0);
8713 pr_err("error %d\n", rc
);
8716 ofsofs
= iqm_fs_rate_lo
- iqm_fs_rate_ofs
;
8717 iqm_fs_rate_ofs
= ~iqm_fs_rate_ofs
+ 1;
8718 iqm_fs_rate_ofs
-= 2 * ofsofs
;
8720 /* freeze dq/fq updating */
8721 rc
= drxj_dap_read_reg16(dev_addr
, QAM_DQ_MODE__A
, &data
, 0);
8723 pr_err("error %d\n", rc
);
8726 data
= (data
& 0xfff9);
8727 rc
= drxj_dap_write_reg16(dev_addr
, QAM_DQ_MODE__A
, data
, 0);
8729 pr_err("error %d\n", rc
);
8732 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_MODE__A
, data
, 0);
8734 pr_err("error %d\n", rc
);
8738 /* lc_cp / _ci / _ca */
8739 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_CI__A
, 0, 0);
8741 pr_err("error %d\n", rc
);
8744 rc
= drxj_dap_write_reg16(dev_addr
, QAM_LC_EP__A
, 0, 0);
8746 pr_err("error %d\n", rc
);
8749 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_LA_FACTOR__A
, 0, 0);
8751 pr_err("error %d\n", rc
);
8756 rc
= drxdap_fasi_write_reg32(dev_addr
, IQM_FS_RATE_OFS_LO__A
, iqm_fs_rate_ofs
, 0);
8758 pr_err("error %d\n", rc
);
8761 ext_attr
->iqm_fs_rate_ofs
= iqm_fs_rate_ofs
;
8762 ext_attr
->pos_image
= (ext_attr
->pos_image
) ? false : true;
8764 /* freeze dq/fq updating */
8765 rc
= drxj_dap_read_reg16(dev_addr
, QAM_DQ_MODE__A
, &data
, 0);
8767 pr_err("error %d\n", rc
);
8771 data
= (data
& 0xfff9);
8772 rc
= drxj_dap_write_reg16(dev_addr
, QAM_DQ_MODE__A
, data
, 0);
8774 pr_err("error %d\n", rc
);
8777 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_MODE__A
, data
, 0);
8779 pr_err("error %d\n", rc
);
8783 for (i
= 0; i
< 28; i
++) {
8784 rc
= drxj_dap_read_reg16(dev_addr
, QAM_DQ_TAP_IM_EL0__A
+ (2 * i
), &data
, 0);
8786 pr_err("error %d\n", rc
);
8789 rc
= drxj_dap_write_reg16(dev_addr
, QAM_DQ_TAP_IM_EL0__A
+ (2 * i
), -data
, 0);
8791 pr_err("error %d\n", rc
);
8796 for (i
= 0; i
< 24; i
++) {
8797 rc
= drxj_dap_read_reg16(dev_addr
, QAM_FQ_TAP_IM_EL0__A
+ (2 * i
), &data
, 0);
8799 pr_err("error %d\n", rc
);
8802 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_TAP_IM_EL0__A
+ (2 * i
), -data
, 0);
8804 pr_err("error %d\n", rc
);
8810 rc
= drxj_dap_write_reg16(dev_addr
, QAM_DQ_MODE__A
, data
, 0);
8812 pr_err("error %d\n", rc
);
8815 rc
= drxj_dap_write_reg16(dev_addr
, QAM_FQ_MODE__A
, data
, 0);
8817 pr_err("error %d\n", rc
);
8821 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_FSM_STATE_TGT__A
, 4, 0);
8823 pr_err("error %d\n", rc
);
8828 while ((fsm_state
!= 4) && (i
++ < 100)) {
8829 rc
= drxj_dap_read_reg16(dev_addr
, SCU_RAM_QAM_FSM_STATE__A
, &fsm_state
, 0);
8831 pr_err("error %d\n", rc
);
8835 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_QAM_CTL_ENA__A
, (qam_ctl_ena
| 0x0016), 0);
8837 pr_err("error %d\n", rc
);
8848 #define DEMOD_LOCKED 0x1
8849 #define SYNC_FLIPPED 0x2
8850 #define SPEC_MIRRORED 0x4
8852 * \fn int qam64auto ()
8853 * \brief auto do sync pattern switching and mirroring.
8854 * \param demod: instance of demod.
8855 * \param channel: pointer to channel data.
8856 * \param tuner_freq_offset: tuner frequency offset.
8857 * \param lock_status: pointer to lock status.
8861 qam64auto(struct drx_demod_instance
*demod
,
8862 struct drx_channel
*channel
,
8863 s32 tuner_freq_offset
, enum drx_lock_status
*lock_status
)
8865 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
8866 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
8867 struct drx39xxj_state
*state
= dev_addr
->user_data
;
8868 struct dtv_frontend_properties
*p
= &state
->frontend
.dtv_property_cache
;
8870 u32 lck_state
= NO_LOCK
;
8872 u32 d_locked_time
= 0;
8873 u32 timeout_ofs
= 0;
8876 /* external attributes for storing acquired channel constellation */
8877 *lock_status
= DRX_NOT_LOCKED
;
8878 start_time
= jiffies_to_msecs(jiffies
);
8879 lck_state
= NO_LOCK
;
8881 rc
= ctrl_lock_status(demod
, lock_status
);
8883 pr_err("error %d\n", rc
);
8887 switch (lck_state
) {
8889 if (*lock_status
== DRXJ_DEMOD_LOCK
) {
8890 rc
= ctrl_get_qam_sig_quality(demod
);
8892 pr_err("error %d\n", rc
);
8895 if (p
->cnr
.stat
[0].svalue
> 20800) {
8896 lck_state
= DEMOD_LOCKED
;
8897 /* some delay to see if fec_lock possible TODO find the right value */
8898 timeout_ofs
+= DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
; /* see something, waiting longer */
8899 d_locked_time
= jiffies_to_msecs(jiffies
);
8904 if ((*lock_status
== DRXJ_DEMOD_LOCK
) && /* still demod_lock in 150ms */
8905 ((jiffies_to_msecs(jiffies
) - d_locked_time
) >
8906 DRXJ_QAM_FEC_LOCK_WAITTIME
)) {
8907 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, &data
, 0);
8909 pr_err("error %d\n", rc
);
8912 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, data
| 0x1, 0);
8914 pr_err("error %d\n", rc
);
8917 lck_state
= SYNC_FLIPPED
;
8922 if (*lock_status
== DRXJ_DEMOD_LOCK
) {
8923 if (channel
->mirror
== DRX_MIRROR_AUTO
) {
8924 /* flip sync pattern back */
8925 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, &data
, 0);
8927 pr_err("error %d\n", rc
);
8930 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, data
& 0xFFFE, 0);
8932 pr_err("error %d\n", rc
);
8936 ext_attr
->mirror
= DRX_MIRROR_YES
;
8937 rc
= qam_flip_spec(demod
, channel
);
8939 pr_err("error %d\n", rc
);
8942 lck_state
= SPEC_MIRRORED
;
8943 /* reset timer TODO: still need 500ms? */
8944 start_time
= d_locked_time
=
8945 jiffies_to_msecs(jiffies
);
8947 } else { /* no need to wait lock */
8950 jiffies_to_msecs(jiffies
) -
8951 DRXJ_QAM_MAX_WAITTIME
- timeout_ofs
;
8956 if ((*lock_status
== DRXJ_DEMOD_LOCK
) && /* still demod_lock in 150ms */
8957 ((jiffies_to_msecs(jiffies
) - d_locked_time
) >
8958 DRXJ_QAM_FEC_LOCK_WAITTIME
)) {
8959 rc
= ctrl_get_qam_sig_quality(demod
);
8961 pr_err("error %d\n", rc
);
8964 if (p
->cnr
.stat
[0].svalue
> 20800) {
8965 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, &data
, 0);
8967 pr_err("error %d\n", rc
);
8970 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
, QAM_SY_TIMEOUT__A
, data
| 0x1, 0);
8972 pr_err("error %d\n", rc
);
8975 /* no need to wait lock */
8977 jiffies_to_msecs(jiffies
) -
8978 DRXJ_QAM_MAX_WAITTIME
- timeout_ofs
;
8987 ((*lock_status
!= DRX_LOCKED
) &&
8988 (*lock_status
!= DRX_NEVER_LOCK
) &&
8989 ((jiffies_to_msecs(jiffies
) - start_time
) <
8990 (DRXJ_QAM_MAX_WAITTIME
+ timeout_ofs
))
8992 /* Returning control to application ... */
9000 * \fn int qam256auto ()
9001 * \brief auto do sync pattern switching and mirroring.
9002 * \param demod: instance of demod.
9003 * \param channel: pointer to channel data.
9004 * \param tuner_freq_offset: tuner frequency offset.
9005 * \param lock_status: pointer to lock status.
9009 qam256auto(struct drx_demod_instance
*demod
,
9010 struct drx_channel
*channel
,
9011 s32 tuner_freq_offset
, enum drx_lock_status
*lock_status
)
9013 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
9014 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9015 struct drx39xxj_state
*state
= dev_addr
->user_data
;
9016 struct dtv_frontend_properties
*p
= &state
->frontend
.dtv_property_cache
;
9018 u32 lck_state
= NO_LOCK
;
9020 u32 d_locked_time
= 0;
9021 u32 timeout_ofs
= DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
;
9023 /* external attributes for storing acquired channel constellation */
9024 *lock_status
= DRX_NOT_LOCKED
;
9025 start_time
= jiffies_to_msecs(jiffies
);
9026 lck_state
= NO_LOCK
;
9028 rc
= ctrl_lock_status(demod
, lock_status
);
9030 pr_err("error %d\n", rc
);
9033 switch (lck_state
) {
9035 if (*lock_status
== DRXJ_DEMOD_LOCK
) {
9036 rc
= ctrl_get_qam_sig_quality(demod
);
9038 pr_err("error %d\n", rc
);
9041 if (p
->cnr
.stat
[0].svalue
> 26800) {
9042 lck_state
= DEMOD_LOCKED
;
9043 timeout_ofs
+= DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
; /* see something, wait longer */
9044 d_locked_time
= jiffies_to_msecs(jiffies
);
9049 if (*lock_status
== DRXJ_DEMOD_LOCK
) {
9050 if ((channel
->mirror
== DRX_MIRROR_AUTO
) &&
9051 ((jiffies_to_msecs(jiffies
) - d_locked_time
) >
9052 DRXJ_QAM_FEC_LOCK_WAITTIME
)) {
9053 ext_attr
->mirror
= DRX_MIRROR_YES
;
9054 rc
= qam_flip_spec(demod
, channel
);
9056 pr_err("error %d\n", rc
);
9059 lck_state
= SPEC_MIRRORED
;
9060 /* reset timer TODO: still need 300ms? */
9061 start_time
= jiffies_to_msecs(jiffies
);
9062 timeout_ofs
= -DRXJ_QAM_MAX_WAITTIME
/ 2;
9073 ((*lock_status
< DRX_LOCKED
) &&
9074 (*lock_status
!= DRX_NEVER_LOCK
) &&
9075 ((jiffies_to_msecs(jiffies
) - start_time
) <
9076 (DRXJ_QAM_MAX_WAITTIME
+ timeout_ofs
)));
9084 * \fn int set_qam_channel ()
9085 * \brief Set QAM channel according to the requested constellation.
9086 * \param demod: instance of demod.
9087 * \param channel: pointer to channel data.
9091 set_qam_channel(struct drx_demod_instance
*demod
,
9092 struct drx_channel
*channel
, s32 tuner_freq_offset
)
9094 struct drxj_data
*ext_attr
= NULL
;
9096 enum drx_lock_status lock_status
= DRX_NOT_LOCKED
;
9097 bool auto_flag
= false;
9099 /* external attributes for storing acquired channel constellation */
9100 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
9102 /* set QAM channel constellation */
9103 switch (channel
->constellation
) {
9104 case DRX_CONSTELLATION_QAM16
:
9105 case DRX_CONSTELLATION_QAM32
:
9106 case DRX_CONSTELLATION_QAM128
:
9108 case DRX_CONSTELLATION_QAM64
:
9109 case DRX_CONSTELLATION_QAM256
:
9110 if (ext_attr
->standard
!= DRX_STANDARD_ITU_B
)
9113 ext_attr
->constellation
= channel
->constellation
;
9114 if (channel
->mirror
== DRX_MIRROR_AUTO
)
9115 ext_attr
->mirror
= DRX_MIRROR_NO
;
9117 ext_attr
->mirror
= channel
->mirror
;
9119 rc
= set_qam(demod
, channel
, tuner_freq_offset
, QAM_SET_OP_ALL
);
9121 pr_err("error %d\n", rc
);
9125 if (channel
->constellation
== DRX_CONSTELLATION_QAM64
)
9126 rc
= qam64auto(demod
, channel
, tuner_freq_offset
,
9129 rc
= qam256auto(demod
, channel
, tuner_freq_offset
,
9132 pr_err("error %d\n", rc
);
9136 case DRX_CONSTELLATION_AUTO
: /* for channel scan */
9137 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
9138 u16 qam_ctl_ena
= 0;
9142 /* try to lock default QAM constellation: QAM256 */
9143 channel
->constellation
= DRX_CONSTELLATION_QAM256
;
9144 ext_attr
->constellation
= DRX_CONSTELLATION_QAM256
;
9145 if (channel
->mirror
== DRX_MIRROR_AUTO
)
9146 ext_attr
->mirror
= DRX_MIRROR_NO
;
9148 ext_attr
->mirror
= channel
->mirror
;
9149 rc
= set_qam(demod
, channel
, tuner_freq_offset
,
9152 pr_err("error %d\n", rc
);
9155 rc
= qam256auto(demod
, channel
, tuner_freq_offset
,
9158 pr_err("error %d\n", rc
);
9162 if (lock_status
>= DRX_LOCKED
) {
9163 channel
->constellation
= DRX_CONSTELLATION_AUTO
;
9167 /* QAM254 not locked. Try QAM64 constellation */
9168 channel
->constellation
= DRX_CONSTELLATION_QAM64
;
9169 ext_attr
->constellation
= DRX_CONSTELLATION_QAM64
;
9170 if (channel
->mirror
== DRX_MIRROR_AUTO
)
9171 ext_attr
->mirror
= DRX_MIRROR_NO
;
9173 ext_attr
->mirror
= channel
->mirror
;
9175 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
,
9176 SCU_RAM_QAM_CTL_ENA__A
,
9179 pr_err("error %d\n", rc
);
9182 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9183 SCU_RAM_QAM_CTL_ENA__A
,
9184 qam_ctl_ena
& ~SCU_RAM_QAM_CTL_ENA_ACQ__M
, 0);
9186 pr_err("error %d\n", rc
);
9189 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9190 SCU_RAM_QAM_FSM_STATE_TGT__A
,
9193 pr_err("error %d\n", rc
);
9195 } /* force to rate hunting */
9197 rc
= set_qam(demod
, channel
, tuner_freq_offset
,
9198 QAM_SET_OP_CONSTELLATION
);
9200 pr_err("error %d\n", rc
);
9203 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9204 SCU_RAM_QAM_CTL_ENA__A
,
9207 pr_err("error %d\n", rc
);
9211 rc
= qam64auto(demod
, channel
, tuner_freq_offset
,
9214 pr_err("error %d\n", rc
);
9218 channel
->constellation
= DRX_CONSTELLATION_AUTO
;
9219 } else if (ext_attr
->standard
== DRX_STANDARD_ITU_C
) {
9220 u16 qam_ctl_ena
= 0;
9222 channel
->constellation
= DRX_CONSTELLATION_QAM64
;
9223 ext_attr
->constellation
= DRX_CONSTELLATION_QAM64
;
9226 if (channel
->mirror
== DRX_MIRROR_AUTO
)
9227 ext_attr
->mirror
= DRX_MIRROR_NO
;
9229 ext_attr
->mirror
= channel
->mirror
;
9230 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
,
9231 SCU_RAM_QAM_CTL_ENA__A
,
9234 pr_err("error %d\n", rc
);
9237 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9238 SCU_RAM_QAM_CTL_ENA__A
,
9239 qam_ctl_ena
& ~SCU_RAM_QAM_CTL_ENA_ACQ__M
, 0);
9241 pr_err("error %d\n", rc
);
9244 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9245 SCU_RAM_QAM_FSM_STATE_TGT__A
,
9248 pr_err("error %d\n", rc
);
9250 } /* force to rate hunting */
9252 rc
= set_qam(demod
, channel
, tuner_freq_offset
,
9253 QAM_SET_OP_CONSTELLATION
);
9255 pr_err("error %d\n", rc
);
9258 rc
= drxj_dap_write_reg16(demod
->my_i2c_dev_addr
,
9259 SCU_RAM_QAM_CTL_ENA__A
,
9262 pr_err("error %d\n", rc
);
9265 rc
= qam64auto(demod
, channel
, tuner_freq_offset
,
9268 pr_err("error %d\n", rc
);
9271 channel
->constellation
= DRX_CONSTELLATION_AUTO
;
9282 /* restore starting value */
9284 channel
->constellation
= DRX_CONSTELLATION_AUTO
;
9288 /*============================================================================*/
9291 * \fn static short get_qamrs_err_count(struct i2c_device_addr *dev_addr)
9292 * \brief Get RS error count in QAM mode (used for post RS BER calculation)
9293 * \return Error code
9295 * precondition: measurement period & measurement prescale must be set
9299 get_qamrs_err_count(struct i2c_device_addr
*dev_addr
,
9300 struct drxjrs_errors
*rs_errors
)
9303 u16 nr_bit_errors
= 0,
9304 nr_symbol_errors
= 0,
9305 nr_packet_errors
= 0, nr_failures
= 0, nr_snc_par_fail_count
= 0;
9307 /* check arguments */
9308 if (dev_addr
== NULL
)
9311 /* all reported errors are received in the */
9312 /* most recently finished measurement period */
9313 /* no of pre RS bit errors */
9314 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_BIT_ERRORS__A
, &nr_bit_errors
, 0);
9316 pr_err("error %d\n", rc
);
9319 /* no of symbol errors */
9320 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_SYMBOL_ERRORS__A
, &nr_symbol_errors
, 0);
9322 pr_err("error %d\n", rc
);
9325 /* no of packet errors */
9326 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_PACKET_ERRORS__A
, &nr_packet_errors
, 0);
9328 pr_err("error %d\n", rc
);
9331 /* no of failures to decode */
9332 rc
= drxj_dap_read_reg16(dev_addr
, FEC_RS_NR_FAILURES__A
, &nr_failures
, 0);
9334 pr_err("error %d\n", rc
);
9337 /* no of post RS bit erros */
9338 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_SNC_FAIL_COUNT__A
, &nr_snc_par_fail_count
, 0);
9340 pr_err("error %d\n", rc
);
9344 /* These register values are fetched in non-atomic fashion */
9345 /* It is possible that the read values contain unrelated information */
9347 rs_errors
->nr_bit_errors
= nr_bit_errors
& FEC_RS_NR_BIT_ERRORS__M
;
9348 rs_errors
->nr_symbol_errors
= nr_symbol_errors
& FEC_RS_NR_SYMBOL_ERRORS__M
;
9349 rs_errors
->nr_packet_errors
= nr_packet_errors
& FEC_RS_NR_PACKET_ERRORS__M
;
9350 rs_errors
->nr_failures
= nr_failures
& FEC_RS_NR_FAILURES__M
;
9351 rs_errors
->nr_snc_par_fail_count
=
9352 nr_snc_par_fail_count
& FEC_OC_SNC_FAIL_COUNT__M
;
9359 /*============================================================================*/
9362 * \fn int get_sig_strength()
9363 * \brief Retrieve signal strength for VSB and QAM.
9364 * \param demod Pointer to demod instance
9365 * \param u16-t Pointer to signal strength data; range 0, .. , 100.
9367 * \retval 0 sig_strength contains valid data.
9368 * \retval -EINVAL sig_strength is NULL.
9369 * \retval -EIO Erroneous data, sig_strength contains invalid data.
9371 #define DRXJ_AGC_TOP 0x2800
9372 #define DRXJ_AGC_SNS 0x1600
9373 #define DRXJ_RFAGC_MAX 0x3fff
9374 #define DRXJ_RFAGC_MIN 0x800
9376 static int get_sig_strength(struct drx_demod_instance
*demod
, u16
*sig_strength
)
9378 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9387 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_AGC_IF__A
, &if_gain
, 0);
9389 pr_err("error %d\n", rc
);
9392 if_gain
&= IQM_AF_AGC_IF__M
;
9393 rc
= drxj_dap_read_reg16(dev_addr
, IQM_AF_AGC_RF__A
, &rf_gain
, 0);
9395 pr_err("error %d\n", rc
);
9398 rf_gain
&= IQM_AF_AGC_RF__M
;
9400 if_agc_sns
= DRXJ_AGC_SNS
;
9401 if_agc_top
= DRXJ_AGC_TOP
;
9402 rf_agc_max
= DRXJ_RFAGC_MAX
;
9403 rf_agc_min
= DRXJ_RFAGC_MIN
;
9405 if (if_gain
> if_agc_top
) {
9406 if (rf_gain
> rf_agc_max
)
9407 *sig_strength
= 100;
9408 else if (rf_gain
> rf_agc_min
) {
9409 if (rf_agc_max
== rf_agc_min
) {
9410 pr_err("error: rf_agc_max == rf_agc_min\n");
9414 75 + 25 * (rf_gain
- rf_agc_min
) / (rf_agc_max
-
9418 } else if (if_gain
> if_agc_sns
) {
9419 if (if_agc_top
== if_agc_sns
) {
9420 pr_err("error: if_agc_top == if_agc_sns\n");
9424 20 + 55 * (if_gain
- if_agc_sns
) / (if_agc_top
- if_agc_sns
);
9427 pr_err("error: if_agc_sns is zero!\n");
9430 *sig_strength
= (20 * if_gain
/ if_agc_sns
);
9433 if (*sig_strength
<= 7)
9442 * \fn int ctrl_get_qam_sig_quality()
9443 * \brief Retrieve QAM signal quality from device.
9444 * \param devmod Pointer to demodulator instance.
9445 * \param sig_quality Pointer to signal quality data.
9447 * \retval 0 sig_quality contains valid data.
9448 * \retval -EINVAL sig_quality is NULL.
9449 * \retval -EIO Erroneous data, sig_quality contains invalid data.
9451 * Pre-condition: Device must be started and in lock.
9454 ctrl_get_qam_sig_quality(struct drx_demod_instance
*demod
)
9456 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9457 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
9458 struct drx39xxj_state
*state
= dev_addr
->user_data
;
9459 struct dtv_frontend_properties
*p
= &state
->frontend
.dtv_property_cache
;
9460 struct drxjrs_errors measuredrs_errors
= { 0, 0, 0, 0, 0 };
9461 enum drx_modulation constellation
= ext_attr
->constellation
;
9464 u32 pre_bit_err_rs
= 0; /* pre RedSolomon Bit Error Rate */
9465 u32 post_bit_err_rs
= 0; /* post RedSolomon Bit Error Rate */
9466 u32 pkt_errs
= 0; /* no of packet errors in RS */
9467 u16 qam_sl_err_power
= 0; /* accumulated error between raw and sliced symbols */
9468 u16 qsym_err_vd
= 0; /* quadrature symbol errors in QAM_VD */
9469 u16 fec_oc_period
= 0; /* SNC sync failure measurement period */
9470 u16 fec_rs_prescale
= 0; /* ReedSolomon Measurement Prescale */
9471 u16 fec_rs_period
= 0; /* Value for corresponding I2C register */
9472 /* calculation constants */
9473 u32 rs_bit_cnt
= 0; /* RedSolomon Bit Count */
9474 u32 qam_sl_sig_power
= 0; /* used for MER, depends of QAM constellation */
9475 /* intermediate results */
9476 u32 e
= 0; /* exponent value used for QAM BER/SER */
9477 u32 m
= 0; /* mantisa value used for QAM BER/SER */
9478 u32 ber_cnt
= 0; /* BER count */
9479 /* signal quality info */
9480 u32 qam_sl_mer
= 0; /* QAM MER */
9481 u32 qam_pre_rs_ber
= 0; /* Pre RedSolomon BER */
9482 u32 qam_post_rs_ber
= 0; /* Post RedSolomon BER */
9483 u32 qam_vd_ser
= 0; /* ViterbiDecoder SER */
9484 u16 qam_vd_prescale
= 0; /* Viterbi Measurement Prescale */
9485 u16 qam_vd_period
= 0; /* Viterbi Measurement period */
9486 u32 vd_bit_cnt
= 0; /* ViterbiDecoder Bit Count */
9488 p
->block_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9490 /* read the physical registers */
9491 /* Get the RS error data */
9492 rc
= get_qamrs_err_count(dev_addr
, &measuredrs_errors
);
9494 pr_err("error %d\n", rc
);
9497 /* get the register value needed for MER */
9498 rc
= drxj_dap_read_reg16(dev_addr
, QAM_SL_ERR_POWER__A
, &qam_sl_err_power
, 0);
9500 pr_err("error %d\n", rc
);
9503 /* get the register value needed for post RS BER */
9504 rc
= drxj_dap_read_reg16(dev_addr
, FEC_OC_SNC_FAIL_PERIOD__A
, &fec_oc_period
, 0);
9506 pr_err("error %d\n", rc
);
9510 /* get constants needed for signal quality calculation */
9511 fec_rs_period
= ext_attr
->fec_rs_period
;
9512 fec_rs_prescale
= ext_attr
->fec_rs_prescale
;
9513 rs_bit_cnt
= fec_rs_period
* fec_rs_prescale
* ext_attr
->fec_rs_plen
;
9514 qam_vd_period
= ext_attr
->qam_vd_period
;
9515 qam_vd_prescale
= ext_attr
->qam_vd_prescale
;
9516 vd_bit_cnt
= qam_vd_period
* qam_vd_prescale
* ext_attr
->fec_vd_plen
;
9518 /* DRXJ_QAM_SL_SIG_POWER_QAMxxx * 4 */
9519 switch (constellation
) {
9520 case DRX_CONSTELLATION_QAM16
:
9521 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM16
<< 2;
9523 case DRX_CONSTELLATION_QAM32
:
9524 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM32
<< 2;
9526 case DRX_CONSTELLATION_QAM64
:
9527 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM64
<< 2;
9529 case DRX_CONSTELLATION_QAM128
:
9530 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM128
<< 2;
9532 case DRX_CONSTELLATION_QAM256
:
9533 qam_sl_sig_power
= DRXJ_QAM_SL_SIG_POWER_QAM256
<< 2;
9539 /* ------------------------------ */
9540 /* MER Calculation */
9541 /* ------------------------------ */
9542 /* MER is good if it is above 27.5 for QAM256 or 21.5 for QAM64 */
9544 /* 10.0*log10(qam_sl_sig_power * 4.0 / qam_sl_err_power); */
9545 if (qam_sl_err_power
== 0)
9548 qam_sl_mer
= log1_times100(qam_sl_sig_power
) - log1_times100((u32
)qam_sl_err_power
);
9550 /* ----------------------------------------- */
9551 /* Pre Viterbi Symbol Error Rate Calculation */
9552 /* ----------------------------------------- */
9553 /* pre viterbi SER is good if it is below 0.025 */
9555 /* get the register value */
9556 /* no of quadrature symbol errors */
9557 rc
= drxj_dap_read_reg16(dev_addr
, QAM_VD_NR_QSYM_ERRORS__A
, &qsym_err_vd
, 0);
9559 pr_err("error %d\n", rc
);
9562 /* Extract the Exponent and the Mantisa */
9563 /* of number of quadrature symbol errors */
9564 e
= (qsym_err_vd
& QAM_VD_NR_QSYM_ERRORS_EXP__M
) >>
9565 QAM_VD_NR_QSYM_ERRORS_EXP__B
;
9566 m
= (qsym_err_vd
& QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__M
) >>
9567 QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B
;
9569 if ((m
<< e
) >> 3 > 549752)
9570 qam_vd_ser
= 500000 * vd_bit_cnt
* ((e
> 2) ? 1 : 8) / 8;
9572 qam_vd_ser
= m
<< ((e
> 2) ? (e
- 3) : e
);
9574 /* --------------------------------------- */
9575 /* pre and post RedSolomon BER Calculation */
9576 /* --------------------------------------- */
9577 /* pre RS BER is good if it is below 3.5e-4 */
9579 /* get the register values */
9580 pre_bit_err_rs
= (u32
) measuredrs_errors
.nr_bit_errors
;
9581 pkt_errs
= post_bit_err_rs
= (u32
) measuredrs_errors
.nr_snc_par_fail_count
;
9583 /* Extract the Exponent and the Mantisa of the */
9584 /* pre Reed-Solomon bit error count */
9585 e
= (pre_bit_err_rs
& FEC_RS_NR_BIT_ERRORS_EXP__M
) >>
9586 FEC_RS_NR_BIT_ERRORS_EXP__B
;
9587 m
= (pre_bit_err_rs
& FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M
) >>
9588 FEC_RS_NR_BIT_ERRORS_FIXED_MANT__B
;
9592 /*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */
9593 if (m
> (rs_bit_cnt
>> (e
+ 1)) || (rs_bit_cnt
>> e
) == 0)
9594 qam_pre_rs_ber
= 500000 * rs_bit_cnt
>> e
;
9596 qam_pre_rs_ber
= ber_cnt
;
9598 /* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) / */
9599 /* (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A) */
9601 => c = (1000000*100*11.17)/1504 =
9602 post RS BER = (( c* FEC_OC_SNC_FAIL_COUNT__A) /
9603 (100 * FEC_OC_SNC_FAIL_PERIOD__A)
9604 *100 and /100 is for more precision.
9605 => (20 bits * 12 bits) /(16 bits * 7 bits) => safe in 32 bits computation
9607 Precision errors still possible.
9609 if (!fec_oc_period
) {
9610 qam_post_rs_ber
= 0xFFFFFFFF;
9612 e
= post_bit_err_rs
* 742686;
9613 m
= fec_oc_period
* 100;
9614 qam_post_rs_ber
= e
/ m
;
9617 /* fill signal quality data structure */
9618 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
9619 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
9620 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
9621 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
9622 p
->block_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
9623 p
->cnr
.stat
[0].scale
= FE_SCALE_DECIBEL
;
9625 p
->cnr
.stat
[0].svalue
= ((u16
) qam_sl_mer
) * 100;
9626 if (ext_attr
->standard
== DRX_STANDARD_ITU_B
) {
9627 p
->pre_bit_error
.stat
[0].uvalue
+= qam_vd_ser
;
9628 p
->pre_bit_count
.stat
[0].uvalue
+= vd_bit_cnt
* ((e
> 2) ? 1 : 8) / 8;
9630 p
->pre_bit_error
.stat
[0].uvalue
+= qam_pre_rs_ber
;
9631 p
->pre_bit_count
.stat
[0].uvalue
+= rs_bit_cnt
>> e
;
9634 p
->post_bit_error
.stat
[0].uvalue
+= qam_post_rs_ber
;
9635 p
->post_bit_count
.stat
[0].uvalue
+= rs_bit_cnt
>> e
;
9637 p
->block_error
.stat
[0].uvalue
+= pkt_errs
;
9639 #ifdef DRXJ_SIGNAL_ACCUM_ERR
9640 rc
= get_acc_pkt_err(demod
, &sig_quality
->packet_error
);
9642 pr_err("error %d\n", rc
);
9649 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9650 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9651 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9652 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9653 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9654 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
9659 #endif /* #ifndef DRXJ_VSB_ONLY */
9661 /*============================================================================*/
9662 /*== END QAM DATAPATH FUNCTIONS ==*/
9663 /*============================================================================*/
9665 /*============================================================================*/
9666 /*============================================================================*/
9667 /*== ATV DATAPATH FUNCTIONS ==*/
9668 /*============================================================================*/
9669 /*============================================================================*/
9672 Implementation notes.
9676 Four AGCs are used for NTSC:
9677 (1) RF (used to attenuate the input signal in case of to much power)
9678 (2) IF (used to attenuate the input signal in case of to much power)
9679 (3) Video AGC (used to amplify the output signal in case input to low)
9680 (4) SIF AGC (used to amplify the output signal in case input to low)
9682 Video AGC is coupled to RF and IF. SIF AGC is not coupled. It is assumed
9683 that the coupling between Video AGC and the RF and IF AGCs also works in
9684 favor of the SIF AGC.
9686 Three AGCs are used for FM:
9687 (1) RF (used to attenuate the input signal in case of to much power)
9688 (2) IF (used to attenuate the input signal in case of to much power)
9689 (3) SIF AGC (used to amplify the output signal in case input to low)
9691 The SIF AGC is now coupled to the RF/IF AGCs.
9692 The SIF AGC is needed for both SIF output and the internal SIF signal to
9695 RF and IF AGCs DACs are part of AFE, Video and SIF AGC DACs are part of
9696 the ATV block. The AGC control algorithms are all implemented in
9701 (Shadow settings will not be used for now, they will be implemented
9702 later on because of the schedule)
9704 Several HW/SCU "settings" can be used for ATV. The standard selection
9705 will reset most of these settings. To avoid that the end user application
9706 has to perform these settings each time the ATV or FM standards is
9707 selected the driver will shadow these settings. This enables the end user
9708 to perform the settings only once after a drx_open(). The driver must
9709 write the shadow settings to HW/SCU in case:
9710 ( setstandard FM/ATV) ||
9711 ( settings have changed && FM/ATV standard is active)
9712 The shadow settings will be stored in the device specific data container.
9713 A set of flags will be defined to flag changes in shadow settings.
9714 A routine will be implemented to write all changed shadow settings to
9717 The "settings" will consist of: AGC settings, filter settings etc.
9719 Disadvantage of use of shadow settings:
9720 Direct changes in HW/SCU registers will not be reflected in the
9721 shadow settings and these changes will be overwritten during a next
9722 update. This can happen during evaluation. This will not be a problem
9723 for normal customer usage.
9725 /* -------------------------------------------------------------------------- */
9728 * \fn int power_down_atv ()
9729 * \brief Power down ATV.
9730 * \param demod instance of demodulator
9731 * \param standard either NTSC or FM (sub strandard for ATV )
9734 * Stops and thus resets ATV and IQM block
9735 * SIF and CVBS ADC are powered down
9736 * Calls audio power down
9739 power_down_atv(struct drx_demod_instance
*demod
, enum drx_standard standard
, bool primary
)
9741 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9742 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
9743 /* parameter_len */ 0,
9745 /* *parameter */ NULL
,
9753 /* Stop ATV SCU (will reset ATV and IQM hardware */
9754 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_ATV
|
9755 SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
9756 cmd_scu
.parameter_len
= 0;
9757 cmd_scu
.result_len
= 1;
9758 cmd_scu
.parameter
= NULL
;
9759 cmd_scu
.result
= &cmd_result
;
9760 rc
= scu_command(dev_addr
, &cmd_scu
);
9762 pr_err("error %d\n", rc
);
9765 /* Disable ATV outputs (ATV reset enables CVBS, undo this) */
9766 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);
9768 pr_err("error %d\n", rc
);
9772 rc
= drxj_dap_write_reg16(dev_addr
, ATV_COMM_EXEC__A
, ATV_COMM_EXEC_STOP
, 0);
9774 pr_err("error %d\n", rc
);
9778 rc
= drxj_dap_write_reg16(dev_addr
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_STOP
, 0);
9780 pr_err("error %d\n", rc
);
9783 rc
= set_iqm_af(demod
, false);
9785 pr_err("error %d\n", rc
);
9789 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FS_COMM_EXEC__A
, IQM_FS_COMM_EXEC_STOP
, 0);
9791 pr_err("error %d\n", rc
);
9794 rc
= drxj_dap_write_reg16(dev_addr
, IQM_FD_COMM_EXEC__A
, IQM_FD_COMM_EXEC_STOP
, 0);
9796 pr_err("error %d\n", rc
);
9799 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RC_COMM_EXEC__A
, IQM_RC_COMM_EXEC_STOP
, 0);
9801 pr_err("error %d\n", rc
);
9804 rc
= drxj_dap_write_reg16(dev_addr
, IQM_RT_COMM_EXEC__A
, IQM_RT_COMM_EXEC_STOP
, 0);
9806 pr_err("error %d\n", rc
);
9809 rc
= drxj_dap_write_reg16(dev_addr
, IQM_CF_COMM_EXEC__A
, IQM_CF_COMM_EXEC_STOP
, 0);
9811 pr_err("error %d\n", rc
);
9815 rc
= power_down_aud(demod
);
9817 pr_err("error %d\n", rc
);
9826 /*============================================================================*/
9829 * \brief Power up AUD.
9830 * \param demod instance of demodulator
9834 static int power_down_aud(struct drx_demod_instance
*demod
)
9836 struct i2c_device_addr
*dev_addr
= NULL
;
9837 struct drxj_data
*ext_attr
= NULL
;
9840 dev_addr
= (struct i2c_device_addr
*)demod
->my_i2c_dev_addr
;
9841 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
9843 rc
= drxj_dap_write_reg16(dev_addr
, AUD_COMM_EXEC__A
, AUD_COMM_EXEC_STOP
, 0);
9845 pr_err("error %d\n", rc
);
9849 ext_attr
->aud_data
.audio_is_active
= false;
9857 * \fn int set_orx_nsu_aox()
9858 * \brief Configure OrxNsuAox for OOB
9859 * \param demod instance of demodulator.
9863 static int set_orx_nsu_aox(struct drx_demod_instance
*demod
, bool active
)
9865 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
9869 /* Configure NSU_AOX */
9870 rc
= drxj_dap_read_reg16(dev_addr
, ORX_NSU_AOX_STDBY_W__A
, &data
, 0);
9872 pr_err("error %d\n", rc
);
9876 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
));
9878 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
);
9879 rc
= drxj_dap_write_reg16(dev_addr
, ORX_NSU_AOX_STDBY_W__A
, data
, 0);
9881 pr_err("error %d\n", rc
);
9891 * \fn int ctrl_set_oob()
9892 * \brief Set OOB channel to be used.
9893 * \param demod instance of demodulator
9894 * \param oob_param OOB parameters for channel setting.
9895 * \frequency should be in KHz
9898 * Accepts only. Returns error otherwise.
9899 * Demapper value is written after scu_command START
9900 * because START command causes COMM_EXEC transition
9901 * from 0 to 1 which causes all registers to be
9902 * overwritten with initial value
9906 /* Nyquist filter impulse response */
9907 #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 */
9908 #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 */
9909 #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) */
9911 /* Coefficients for the nyquist filter (total: 27 taps) */
9912 #define NYQFILTERLEN 27
9914 static int ctrl_set_oob(struct drx_demod_instance
*demod
, struct drxoob
*oob_param
)
9917 s32 freq
= 0; /* KHz */
9918 struct i2c_device_addr
*dev_addr
= NULL
;
9919 struct drxj_data
*ext_attr
= NULL
;
9921 bool mirror_freq_spect_oob
= false;
9922 u16 trk_filter_value
= 0;
9923 struct drxjscu_cmd scu_cmd
;
9924 u16 set_param_parameters
[3];
9925 u16 cmd_result
[2] = { 0, 0 };
9926 s16 nyquist_coeffs
[4][(NYQFILTERLEN
+ 1) / 2] = {
9927 IMPULSE_COSINE_ALPHA_0_3
, /* Target Mode 0 */
9928 IMPULSE_COSINE_ALPHA_0_3
, /* Target Mode 1 */
9929 IMPULSE_COSINE_ALPHA_0_5
, /* Target Mode 2 */
9930 IMPULSE_COSINE_ALPHA_RO_0_5
/* Target Mode 3 */
9932 u8 mode_val
[4] = { 2, 2, 0, 1 };
9933 u8 pfi_coeffs
[4][6] = {
9934 {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) */
9935 {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) */
9936 {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) */
9937 {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) */
9941 dev_addr
= demod
->my_i2c_dev_addr
;
9942 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
9943 mirror_freq_spect_oob
= ext_attr
->mirror_freq_spect_oob
;
9945 /* Check parameters */
9946 if (oob_param
== NULL
) {
9947 /* power off oob module */
9948 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
9949 | SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
9950 scu_cmd
.parameter_len
= 0;
9951 scu_cmd
.result_len
= 1;
9952 scu_cmd
.result
= cmd_result
;
9953 rc
= scu_command(dev_addr
, &scu_cmd
);
9955 pr_err("error %d\n", rc
);
9958 rc
= set_orx_nsu_aox(demod
, false);
9960 pr_err("error %d\n", rc
);
9963 rc
= drxj_dap_write_reg16(dev_addr
, ORX_COMM_EXEC__A
, ORX_COMM_EXEC_STOP
, 0);
9965 pr_err("error %d\n", rc
);
9969 ext_attr
->oob_power_on
= false;
9973 freq
= oob_param
->frequency
;
9974 if ((freq
< 70000) || (freq
> 130000))
9976 freq
= (freq
- 50000) / 50;
9981 u16
*trk_filtercfg
= ext_attr
->oob_trk_filter_cfg
;
9983 index
= (u16
) ((freq
- 400) / 200);
9984 remainder
= (u16
) ((freq
- 400) % 200);
9986 trk_filtercfg
[index
] - (trk_filtercfg
[index
] -
9987 trk_filtercfg
[index
+
9988 1]) / 10 * remainder
/
9995 rc
= drxj_dap_write_reg16(dev_addr
, ORX_COMM_EXEC__A
, ORX_COMM_EXEC_STOP
, 0);
9997 pr_err("error %d\n", rc
);
10000 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
10001 | SCU_RAM_COMMAND_CMD_DEMOD_STOP
;
10002 scu_cmd
.parameter_len
= 0;
10003 scu_cmd
.result_len
= 1;
10004 scu_cmd
.result
= cmd_result
;
10005 rc
= scu_command(dev_addr
, &scu_cmd
);
10007 pr_err("error %d\n", rc
);
10013 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
10014 | SCU_RAM_COMMAND_CMD_DEMOD_RESET
;
10015 scu_cmd
.parameter_len
= 0;
10016 scu_cmd
.result_len
= 1;
10017 scu_cmd
.result
= cmd_result
;
10018 rc
= scu_command(dev_addr
, &scu_cmd
);
10020 pr_err("error %d\n", rc
);
10026 /* set frequency, spectrum inversion and data rate */
10027 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
10028 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV
;
10029 scu_cmd
.parameter_len
= 3;
10030 /* 1-data rate;2-frequency */
10031 switch (oob_param
->standard
) {
10032 case DRX_OOB_MODE_A
:
10034 /* signal is transmitted inverted */
10035 ((oob_param
->spectrum_inverted
== true) &&
10036 /* and tuner is not mirroring the signal */
10037 (!mirror_freq_spect_oob
)) |
10039 /* signal is transmitted noninverted */
10040 ((oob_param
->spectrum_inverted
== false) &&
10041 /* and tuner is mirroring the signal */
10042 (mirror_freq_spect_oob
))
10044 set_param_parameters
[0] =
10045 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_INVSPEC
;
10047 set_param_parameters
[0] =
10048 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_REGSPEC
;
10050 case DRX_OOB_MODE_B_GRADE_A
:
10052 /* signal is transmitted inverted */
10053 ((oob_param
->spectrum_inverted
== true) &&
10054 /* and tuner is not mirroring the signal */
10055 (!mirror_freq_spect_oob
)) |
10057 /* signal is transmitted noninverted */
10058 ((oob_param
->spectrum_inverted
== false) &&
10059 /* and tuner is mirroring the signal */
10060 (mirror_freq_spect_oob
))
10062 set_param_parameters
[0] =
10063 SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_INVSPEC
;
10065 set_param_parameters
[0] =
10066 SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_REGSPEC
;
10068 case DRX_OOB_MODE_B_GRADE_B
:
10071 /* signal is transmitted inverted */
10072 ((oob_param
->spectrum_inverted
== true) &&
10073 /* and tuner is not mirroring the signal */
10074 (!mirror_freq_spect_oob
)) |
10076 /* signal is transmitted noninverted */
10077 ((oob_param
->spectrum_inverted
== false) &&
10078 /* and tuner is mirroring the signal */
10079 (mirror_freq_spect_oob
))
10081 set_param_parameters
[0] =
10082 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_INVSPEC
;
10084 set_param_parameters
[0] =
10085 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_REGSPEC
;
10088 set_param_parameters
[1] = (u16
) (freq
& 0xFFFF);
10089 set_param_parameters
[2] = trk_filter_value
;
10090 scu_cmd
.parameter
= set_param_parameters
;
10091 scu_cmd
.result_len
= 1;
10092 scu_cmd
.result
= cmd_result
;
10093 mode_index
= mode_val
[(set_param_parameters
[0] & 0xC0) >> 6];
10094 rc
= scu_command(dev_addr
, &scu_cmd
);
10096 pr_err("error %d\n", rc
);
10100 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0xFABA, 0);
10102 pr_err("error %d\n", rc
);
10104 } /* Write magic word to enable pdr reg write */
10105 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);
10107 pr_err("error %d\n", rc
);
10110 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);
10112 pr_err("error %d\n", rc
);
10115 rc
= drxj_dap_write_reg16(dev_addr
, SIO_TOP_COMM_KEY__A
, 0x0000, 0);
10117 pr_err("error %d\n", rc
);
10119 } /* Write magic word to disable pdr reg write */
10121 rc
= drxj_dap_write_reg16(dev_addr
, ORX_TOP_COMM_KEY__A
, 0, 0);
10123 pr_err("error %d\n", rc
);
10126 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_AAG_LEN_W__A
, 16000, 0);
10128 pr_err("error %d\n", rc
);
10131 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_AAG_THR_W__A
, 40, 0);
10133 pr_err("error %d\n", rc
);
10138 rc
= drxj_dap_write_reg16(dev_addr
, ORX_DDC_OFO_SET_W__A
, ORX_DDC_OFO_SET_W__PRE
, 0);
10140 pr_err("error %d\n", rc
);
10145 rc
= drxj_dap_write_reg16(dev_addr
, ORX_NSU_AOX_LOPOW_W__A
, ext_attr
->oob_lo_pow
, 0);
10147 pr_err("error %d\n", rc
);
10151 /* initialization for target mode */
10152 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TARGET_MODE__A
, SCU_RAM_ORX_TARGET_MODE_2048KBPS_SQRT
, 0);
10154 pr_err("error %d\n", rc
);
10157 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FREQ_GAIN_CORR__A
, SCU_RAM_ORX_FREQ_GAIN_CORR_2048KBPS
, 0);
10159 pr_err("error %d\n", rc
);
10163 /* Reset bits for timing and freq. recovery */
10164 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_RST_CPH__A
, 0x0001, 0);
10166 pr_err("error %d\n", rc
);
10169 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_RST_CTI__A
, 0x0002, 0);
10171 pr_err("error %d\n", rc
);
10174 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_RST_KRN__A
, 0x0004, 0);
10176 pr_err("error %d\n", rc
);
10179 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_RST_KRP__A
, 0x0008, 0);
10181 pr_err("error %d\n", rc
);
10185 /* AGN_LOCK = {2048>>3, -2048, 8, -8, 0, 1}; */
10186 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_LOCK_TH__A
, 2048 >> 3, 0);
10188 pr_err("error %d\n", rc
);
10191 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_LOCK_TOTH__A
, (u16
)(-2048), 0);
10193 pr_err("error %d\n", rc
);
10196 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_ONLOCK_TTH__A
, 8, 0);
10198 pr_err("error %d\n", rc
);
10201 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_UNLOCK_TTH__A
, (u16
)(-8), 0);
10203 pr_err("error %d\n", rc
);
10206 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_AGN_LOCK_MASK__A
, 1, 0);
10208 pr_err("error %d\n", rc
);
10212 /* DGN_LOCK = {10, -2048, 8, -8, 0, 1<<1}; */
10213 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_LOCK_TH__A
, 10, 0);
10215 pr_err("error %d\n", rc
);
10218 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_LOCK_TOTH__A
, (u16
)(-2048), 0);
10220 pr_err("error %d\n", rc
);
10223 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_ONLOCK_TTH__A
, 8, 0);
10225 pr_err("error %d\n", rc
);
10228 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_UNLOCK_TTH__A
, (u16
)(-8), 0);
10230 pr_err("error %d\n", rc
);
10233 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_DGN_LOCK_MASK__A
, 1 << 1, 0);
10235 pr_err("error %d\n", rc
);
10239 /* FRQ_LOCK = {15,-2048, 8, -8, 0, 1<<2}; */
10240 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_LOCK_TH__A
, 17, 0);
10242 pr_err("error %d\n", rc
);
10245 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_LOCK_TOTH__A
, (u16
)(-2048), 0);
10247 pr_err("error %d\n", rc
);
10250 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_ONLOCK_TTH__A
, 8, 0);
10252 pr_err("error %d\n", rc
);
10255 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_UNLOCK_TTH__A
, (u16
)(-8), 0);
10257 pr_err("error %d\n", rc
);
10260 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_FRQ_LOCK_MASK__A
, 1 << 2, 0);
10262 pr_err("error %d\n", rc
);
10266 /* PHA_LOCK = {5000, -2048, 8, -8, 0, 1<<3}; */
10267 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_LOCK_TH__A
, 3000, 0);
10269 pr_err("error %d\n", rc
);
10272 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_LOCK_TOTH__A
, (u16
)(-2048), 0);
10274 pr_err("error %d\n", rc
);
10277 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_ONLOCK_TTH__A
, 8, 0);
10279 pr_err("error %d\n", rc
);
10282 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_UNLOCK_TTH__A
, (u16
)(-8), 0);
10284 pr_err("error %d\n", rc
);
10287 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_PHA_LOCK_MASK__A
, 1 << 3, 0);
10289 pr_err("error %d\n", rc
);
10293 /* TIM_LOCK = {300, -2048, 8, -8, 0, 1<<4}; */
10294 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_LOCK_TH__A
, 400, 0);
10296 pr_err("error %d\n", rc
);
10299 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_LOCK_TOTH__A
, (u16
)(-2048), 0);
10301 pr_err("error %d\n", rc
);
10304 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_ONLOCK_TTH__A
, 8, 0);
10306 pr_err("error %d\n", rc
);
10309 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_UNLOCK_TTH__A
, (u16
)(-8), 0);
10311 pr_err("error %d\n", rc
);
10314 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_TIM_LOCK_MASK__A
, 1 << 4, 0);
10316 pr_err("error %d\n", rc
);
10320 /* EQU_LOCK = {20, -2048, 8, -8, 0, 1<<5}; */
10321 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_LOCK_TH__A
, 20, 0);
10323 pr_err("error %d\n", rc
);
10326 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_LOCK_TOTH__A
, (u16
)(-2048), 0);
10328 pr_err("error %d\n", rc
);
10331 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_ONLOCK_TTH__A
, 4, 0);
10333 pr_err("error %d\n", rc
);
10336 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_UNLOCK_TTH__A
, (u16
)(-4), 0);
10338 pr_err("error %d\n", rc
);
10341 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_ORX_EQU_LOCK_MASK__A
, 1 << 5, 0);
10343 pr_err("error %d\n", rc
);
10347 /* PRE-Filter coefficients (PFI) */
10348 rc
= drxdap_fasi_write_block(dev_addr
, ORX_FWP_PFI_A_W__A
, sizeof(pfi_coeffs
[mode_index
]), ((u8
*)pfi_coeffs
[mode_index
]), 0);
10350 pr_err("error %d\n", rc
);
10353 rc
= drxj_dap_write_reg16(dev_addr
, ORX_TOP_MDE_W__A
, mode_index
, 0);
10355 pr_err("error %d\n", rc
);
10359 /* NYQUIST-Filter coefficients (NYQ) */
10360 for (i
= 0; i
< (NYQFILTERLEN
+ 1) / 2; i
++) {
10361 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_NYQ_ADR_W__A
, i
, 0);
10363 pr_err("error %d\n", rc
);
10366 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_NYQ_COF_RW__A
, nyquist_coeffs
[mode_index
][i
], 0);
10368 pr_err("error %d\n", rc
);
10372 rc
= drxj_dap_write_reg16(dev_addr
, ORX_FWP_NYQ_ADR_W__A
, 31, 0);
10374 pr_err("error %d\n", rc
);
10377 rc
= drxj_dap_write_reg16(dev_addr
, ORX_COMM_EXEC__A
, ORX_COMM_EXEC_ACTIVE
, 0);
10379 pr_err("error %d\n", rc
);
10385 scu_cmd
.command
= SCU_RAM_COMMAND_STANDARD_OOB
10386 | SCU_RAM_COMMAND_CMD_DEMOD_START
;
10387 scu_cmd
.parameter_len
= 0;
10388 scu_cmd
.result_len
= 1;
10389 scu_cmd
.result
= cmd_result
;
10390 rc
= scu_command(dev_addr
, &scu_cmd
);
10392 pr_err("error %d\n", rc
);
10396 rc
= set_orx_nsu_aox(demod
, true);
10398 pr_err("error %d\n", rc
);
10401 rc
= drxj_dap_write_reg16(dev_addr
, ORX_NSU_AOX_STHR_W__A
, ext_attr
->oob_pre_saw
, 0);
10403 pr_err("error %d\n", rc
);
10407 ext_attr
->oob_power_on
= true;
10414 /*============================================================================*/
10415 /*== END OOB DATAPATH FUNCTIONS ==*/
10416 /*============================================================================*/
10418 /*=============================================================================
10419 ===== MC command related functions ==========================================
10420 ===========================================================================*/
10422 /*=============================================================================
10423 ===== ctrl_set_channel() ==========================================================
10424 ===========================================================================*/
10426 * \fn int ctrl_set_channel()
10427 * \brief Select a new transmission channel.
10428 * \param demod instance of demod.
10429 * \param channel Pointer to channel data.
10432 * In case the tuner module is not used and in case of NTSC/FM the pogrammer
10433 * must tune the tuner to the centre frequency of the NTSC/FM channel.
10437 ctrl_set_channel(struct drx_demod_instance
*demod
, struct drx_channel
*channel
)
10440 s32 tuner_freq_offset
= 0;
10441 struct drxj_data
*ext_attr
= NULL
;
10442 struct i2c_device_addr
*dev_addr
= NULL
;
10443 enum drx_standard standard
= DRX_STANDARD_UNKNOWN
;
10444 #ifndef DRXJ_VSB_ONLY
10445 u32 min_symbol_rate
= 0;
10446 u32 max_symbol_rate
= 0;
10447 int bandwidth_temp
= 0;
10450 /*== check arguments ======================================================*/
10451 if ((demod
== NULL
) || (channel
== NULL
))
10454 dev_addr
= demod
->my_i2c_dev_addr
;
10455 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
10456 standard
= ext_attr
->standard
;
10458 /* check valid standards */
10459 switch (standard
) {
10460 case DRX_STANDARD_8VSB
:
10461 #ifndef DRXJ_VSB_ONLY
10462 case DRX_STANDARD_ITU_A
:
10463 case DRX_STANDARD_ITU_B
:
10464 case DRX_STANDARD_ITU_C
:
10465 #endif /* DRXJ_VSB_ONLY */
10467 case DRX_STANDARD_UNKNOWN
:
10472 /* check bandwidth QAM annex B, NTSC and 8VSB */
10473 if ((standard
== DRX_STANDARD_ITU_B
) ||
10474 (standard
== DRX_STANDARD_8VSB
) ||
10475 (standard
== DRX_STANDARD_NTSC
)) {
10476 switch (channel
->bandwidth
) {
10477 case DRX_BANDWIDTH_6MHZ
:
10478 case DRX_BANDWIDTH_UNKNOWN
: /* fall through */
10479 channel
->bandwidth
= DRX_BANDWIDTH_6MHZ
;
10481 case DRX_BANDWIDTH_8MHZ
: /* fall through */
10482 case DRX_BANDWIDTH_7MHZ
: /* fall through */
10488 /* For QAM annex A and annex C:
10489 -check symbolrate and constellation
10490 -derive bandwidth from symbolrate (input bandwidth is ignored)
10492 #ifndef DRXJ_VSB_ONLY
10493 if ((standard
== DRX_STANDARD_ITU_A
) ||
10494 (standard
== DRX_STANDARD_ITU_C
)) {
10495 struct drxuio_cfg uio_cfg
= { DRX_UIO1
, DRX_UIO_MODE_FIRMWARE_SAW
};
10496 int bw_rolloff_factor
= 0;
10498 bw_rolloff_factor
= (standard
== DRX_STANDARD_ITU_A
) ? 115 : 113;
10499 min_symbol_rate
= DRXJ_QAM_SYMBOLRATE_MIN
;
10500 max_symbol_rate
= DRXJ_QAM_SYMBOLRATE_MAX
;
10501 /* config SMA_TX pin to SAW switch mode */
10502 rc
= ctrl_set_uio_cfg(demod
, &uio_cfg
);
10504 pr_err("error %d\n", rc
);
10508 if (channel
->symbolrate
< min_symbol_rate
||
10509 channel
->symbolrate
> max_symbol_rate
) {
10513 switch (channel
->constellation
) {
10514 case DRX_CONSTELLATION_QAM16
: /* fall through */
10515 case DRX_CONSTELLATION_QAM32
: /* fall through */
10516 case DRX_CONSTELLATION_QAM64
: /* fall through */
10517 case DRX_CONSTELLATION_QAM128
: /* fall through */
10518 case DRX_CONSTELLATION_QAM256
:
10519 bandwidth_temp
= channel
->symbolrate
* bw_rolloff_factor
;
10520 bandwidth
= bandwidth_temp
/ 100;
10522 if ((bandwidth_temp
% 100) >= 50)
10525 if (bandwidth
<= 6100000) {
10526 channel
->bandwidth
= DRX_BANDWIDTH_6MHZ
;
10527 } else if ((bandwidth
> 6100000)
10528 && (bandwidth
<= 7100000)) {
10529 channel
->bandwidth
= DRX_BANDWIDTH_7MHZ
;
10530 } else if (bandwidth
> 7100000) {
10531 channel
->bandwidth
= DRX_BANDWIDTH_8MHZ
;
10539 /* For QAM annex B:
10540 -check constellation
10542 if (standard
== DRX_STANDARD_ITU_B
) {
10543 switch (channel
->constellation
) {
10544 case DRX_CONSTELLATION_AUTO
:
10545 case DRX_CONSTELLATION_QAM256
:
10546 case DRX_CONSTELLATION_QAM64
:
10552 switch (channel
->interleavemode
) {
10553 case DRX_INTERLEAVEMODE_I128_J1
:
10554 case DRX_INTERLEAVEMODE_I128_J1_V2
:
10555 case DRX_INTERLEAVEMODE_I128_J2
:
10556 case DRX_INTERLEAVEMODE_I64_J2
:
10557 case DRX_INTERLEAVEMODE_I128_J3
:
10558 case DRX_INTERLEAVEMODE_I32_J4
:
10559 case DRX_INTERLEAVEMODE_I128_J4
:
10560 case DRX_INTERLEAVEMODE_I16_J8
:
10561 case DRX_INTERLEAVEMODE_I128_J5
:
10562 case DRX_INTERLEAVEMODE_I8_J16
:
10563 case DRX_INTERLEAVEMODE_I128_J6
:
10564 case DRX_INTERLEAVEMODE_I128_J7
:
10565 case DRX_INTERLEAVEMODE_I128_J8
:
10566 case DRX_INTERLEAVEMODE_I12_J17
:
10567 case DRX_INTERLEAVEMODE_I5_J4
:
10568 case DRX_INTERLEAVEMODE_B52_M240
:
10569 case DRX_INTERLEAVEMODE_B52_M720
:
10570 case DRX_INTERLEAVEMODE_UNKNOWN
:
10571 case DRX_INTERLEAVEMODE_AUTO
:
10578 if ((ext_attr
->uio_sma_tx_mode
) == DRX_UIO_MODE_FIRMWARE_SAW
) {
10579 /* SAW SW, user UIO is used for switchable SAW */
10580 struct drxuio_data uio1
= { DRX_UIO1
, false };
10582 switch (channel
->bandwidth
) {
10583 case DRX_BANDWIDTH_8MHZ
:
10586 case DRX_BANDWIDTH_7MHZ
:
10587 uio1
.value
= false;
10589 case DRX_BANDWIDTH_6MHZ
:
10590 uio1
.value
= false;
10592 case DRX_BANDWIDTH_UNKNOWN
:
10597 rc
= ctrl_uio_write(demod
, &uio1
);
10599 pr_err("error %d\n", rc
);
10603 #endif /* DRXJ_VSB_ONLY */
10604 rc
= drxj_dap_write_reg16(dev_addr
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
, 0);
10606 pr_err("error %d\n", rc
);
10610 tuner_freq_offset
= 0;
10612 /*== Setup demod for specific standard ====================================*/
10613 switch (standard
) {
10614 case DRX_STANDARD_8VSB
:
10615 if (channel
->mirror
== DRX_MIRROR_AUTO
)
10616 ext_attr
->mirror
= DRX_MIRROR_NO
;
10618 ext_attr
->mirror
= channel
->mirror
;
10619 rc
= set_vsb(demod
);
10621 pr_err("error %d\n", rc
);
10624 rc
= set_frequency(demod
, channel
, tuner_freq_offset
);
10626 pr_err("error %d\n", rc
);
10630 #ifndef DRXJ_VSB_ONLY
10631 case DRX_STANDARD_ITU_A
: /* fallthrough */
10632 case DRX_STANDARD_ITU_B
: /* fallthrough */
10633 case DRX_STANDARD_ITU_C
:
10634 rc
= set_qam_channel(demod
, channel
, tuner_freq_offset
);
10636 pr_err("error %d\n", rc
);
10641 case DRX_STANDARD_UNKNOWN
:
10646 /* flag the packet error counter reset */
10647 ext_attr
->reset_pkt_err_acc
= true;
10654 /*=============================================================================
10655 ===== SigQuality() ==========================================================
10656 ===========================================================================*/
10659 * \fn int ctrl_sig_quality()
10660 * \brief Retrieve signal quality form device.
10661 * \param devmod Pointer to demodulator instance.
10662 * \param sig_quality Pointer to signal quality data.
10664 * \retval 0 sig_quality contains valid data.
10665 * \retval -EINVAL sig_quality is NULL.
10666 * \retval -EIO Erroneous data, sig_quality contains invalid data.
10670 ctrl_sig_quality(struct drx_demod_instance
*demod
,
10671 enum drx_lock_status lock_status
)
10673 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
10674 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
10675 struct drx39xxj_state
*state
= dev_addr
->user_data
;
10676 struct dtv_frontend_properties
*p
= &state
->frontend
.dtv_property_cache
;
10677 enum drx_standard standard
= ext_attr
->standard
;
10679 u32 ber
, cnt
, err
, pkt
;
10680 u16 mer
, strength
= 0;
10682 rc
= get_sig_strength(demod
, &strength
);
10684 pr_err("error getting signal strength %d\n", rc
);
10685 p
->strength
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10687 p
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
10688 p
->strength
.stat
[0].uvalue
= 65535UL * strength
/ 100;
10691 switch (standard
) {
10692 case DRX_STANDARD_8VSB
:
10693 #ifdef DRXJ_SIGNAL_ACCUM_ERR
10694 rc
= get_acc_pkt_err(demod
, &pkt
);
10696 pr_err("error %d\n", rc
);
10700 if (lock_status
!= DRXJ_DEMOD_LOCK
&& lock_status
!= DRX_LOCKED
) {
10701 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10702 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10703 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10704 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10705 p
->block_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10706 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10707 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10709 rc
= get_vsb_post_rs_pck_err(dev_addr
, &err
, &pkt
);
10711 pr_err("error %d getting UCB\n", rc
);
10712 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10714 p
->block_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
10715 p
->block_error
.stat
[0].uvalue
+= err
;
10716 p
->block_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
10717 p
->block_count
.stat
[0].uvalue
+= pkt
;
10720 /* PostViterbi is compute in steps of 10^(-6) */
10721 rc
= get_vs_bpre_viterbi_ber(dev_addr
, &ber
, &cnt
);
10723 pr_err("error %d getting pre-ber\n", rc
);
10724 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10726 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
10727 p
->pre_bit_error
.stat
[0].uvalue
+= ber
;
10728 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
10729 p
->pre_bit_count
.stat
[0].uvalue
+= cnt
;
10732 rc
= get_vs_bpost_viterbi_ber(dev_addr
, &ber
, &cnt
);
10734 pr_err("error %d getting post-ber\n", rc
);
10735 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10737 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
10738 p
->post_bit_error
.stat
[0].uvalue
+= ber
;
10739 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
10740 p
->post_bit_count
.stat
[0].uvalue
+= cnt
;
10742 rc
= get_vsbmer(dev_addr
, &mer
);
10744 pr_err("error %d getting MER\n", rc
);
10745 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
10747 p
->cnr
.stat
[0].svalue
= mer
* 100;
10748 p
->cnr
.stat
[0].scale
= FE_SCALE_DECIBEL
;
10752 #ifndef DRXJ_VSB_ONLY
10753 case DRX_STANDARD_ITU_A
:
10754 case DRX_STANDARD_ITU_B
:
10755 case DRX_STANDARD_ITU_C
:
10756 rc
= ctrl_get_qam_sig_quality(demod
);
10758 pr_err("error %d\n", rc
);
10772 /*============================================================================*/
10775 * \fn int ctrl_lock_status()
10776 * \brief Retrieve lock status .
10777 * \param dev_addr Pointer to demodulator device address.
10778 * \param lock_stat Pointer to lock status structure.
10783 ctrl_lock_status(struct drx_demod_instance
*demod
, enum drx_lock_status
*lock_stat
)
10785 enum drx_standard standard
= DRX_STANDARD_UNKNOWN
;
10786 struct drxj_data
*ext_attr
= NULL
;
10787 struct i2c_device_addr
*dev_addr
= NULL
;
10788 struct drxjscu_cmd cmd_scu
= { /* command */ 0,
10789 /* parameter_len */ 0,
10790 /* result_len */ 0,
10791 /* *parameter */ NULL
,
10795 u16 cmd_result
[2] = { 0, 0 };
10796 u16 demod_lock
= SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_DEMOD_LOCKED
;
10798 /* check arguments */
10799 if ((demod
== NULL
) || (lock_stat
== NULL
))
10802 dev_addr
= demod
->my_i2c_dev_addr
;
10803 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
10804 standard
= ext_attr
->standard
;
10806 *lock_stat
= DRX_NOT_LOCKED
;
10808 /* define the SCU command code */
10809 switch (standard
) {
10810 case DRX_STANDARD_8VSB
:
10811 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_VSB
|
10812 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK
;
10815 #ifndef DRXJ_VSB_ONLY
10816 case DRX_STANDARD_ITU_A
:
10817 case DRX_STANDARD_ITU_B
:
10818 case DRX_STANDARD_ITU_C
:
10819 cmd_scu
.command
= SCU_RAM_COMMAND_STANDARD_QAM
|
10820 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK
;
10823 case DRX_STANDARD_UNKNOWN
: /* fallthrough */
10828 /* define the SCU command parameters and execute the command */
10829 cmd_scu
.parameter_len
= 0;
10830 cmd_scu
.result_len
= 2;
10831 cmd_scu
.parameter
= NULL
;
10832 cmd_scu
.result
= cmd_result
;
10833 rc
= scu_command(dev_addr
, &cmd_scu
);
10835 pr_err("error %d\n", rc
);
10839 /* set the lock status */
10840 if (cmd_scu
.result
[1] < demod_lock
) {
10841 /* 0x0000 NOT LOCKED */
10842 *lock_stat
= DRX_NOT_LOCKED
;
10843 } else if (cmd_scu
.result
[1] < SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_LOCKED
) {
10844 *lock_stat
= DRXJ_DEMOD_LOCK
;
10845 } else if (cmd_scu
.result
[1] <
10846 SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_NEVER_LOCK
) {
10847 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
10848 *lock_stat
= DRX_LOCKED
;
10850 /* 0xC000 NEVER LOCKED */
10851 /* (system will never be able to lock to the signal) */
10852 *lock_stat
= DRX_NEVER_LOCK
;
10860 /*============================================================================*/
10863 * \fn int ctrl_set_standard()
10864 * \brief Set modulation standard to be used.
10865 * \param standard Modulation standard.
10868 * Setup stuff for the desired demodulation standard.
10869 * Disable and power down the previous selected demodulation standard
10873 ctrl_set_standard(struct drx_demod_instance
*demod
, enum drx_standard
*standard
)
10875 struct drxj_data
*ext_attr
= NULL
;
10877 enum drx_standard prev_standard
;
10879 /* check arguments */
10880 if ((standard
== NULL
) || (demod
== NULL
))
10883 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
10884 prev_standard
= ext_attr
->standard
;
10887 Stop and power down previous standard
10889 switch (prev_standard
) {
10890 #ifndef DRXJ_VSB_ONLY
10891 case DRX_STANDARD_ITU_A
: /* fallthrough */
10892 case DRX_STANDARD_ITU_B
: /* fallthrough */
10893 case DRX_STANDARD_ITU_C
:
10894 rc
= power_down_qam(demod
, false);
10896 pr_err("error %d\n", rc
);
10901 case DRX_STANDARD_8VSB
:
10902 rc
= power_down_vsb(demod
, false);
10904 pr_err("error %d\n", rc
);
10908 case DRX_STANDARD_UNKNOWN
:
10911 case DRX_STANDARD_AUTO
: /* fallthrough */
10917 Initialize channel independent registers
10918 Power up new standard
10920 ext_attr
->standard
= *standard
;
10922 switch (*standard
) {
10923 #ifndef DRXJ_VSB_ONLY
10924 case DRX_STANDARD_ITU_A
: /* fallthrough */
10925 case DRX_STANDARD_ITU_B
: /* fallthrough */
10926 case DRX_STANDARD_ITU_C
:
10929 rc
= drxj_dap_read_reg16(demod
->my_i2c_dev_addr
, SCU_RAM_VERSION_HI__A
, &dummy
, 0);
10931 pr_err("error %d\n", rc
);
10937 case DRX_STANDARD_8VSB
:
10938 rc
= set_vsb_leak_n_gain(demod
);
10940 pr_err("error %d\n", rc
);
10945 ext_attr
->standard
= DRX_STANDARD_UNKNOWN
;
10952 /* Don't know what the standard is now ... try again */
10953 ext_attr
->standard
= DRX_STANDARD_UNKNOWN
;
10957 /*============================================================================*/
10959 static void drxj_reset_mode(struct drxj_data
*ext_attr
)
10961 /* Initialize default AFE configuration for QAM */
10962 if (ext_attr
->has_lna
) {
10963 /* IF AGC off, PGA active */
10964 #ifndef DRXJ_VSB_ONLY
10965 ext_attr
->qam_if_agc_cfg
.standard
= DRX_STANDARD_ITU_B
;
10966 ext_attr
->qam_if_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_OFF
;
10967 ext_attr
->qam_pga_cfg
= 140 + (11 * 13);
10969 ext_attr
->vsb_if_agc_cfg
.standard
= DRX_STANDARD_8VSB
;
10970 ext_attr
->vsb_if_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_OFF
;
10971 ext_attr
->vsb_pga_cfg
= 140 + (11 * 13);
10973 /* IF AGC on, PGA not active */
10974 #ifndef DRXJ_VSB_ONLY
10975 ext_attr
->qam_if_agc_cfg
.standard
= DRX_STANDARD_ITU_B
;
10976 ext_attr
->qam_if_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_AUTO
;
10977 ext_attr
->qam_if_agc_cfg
.min_output_level
= 0;
10978 ext_attr
->qam_if_agc_cfg
.max_output_level
= 0x7FFF;
10979 ext_attr
->qam_if_agc_cfg
.speed
= 3;
10980 ext_attr
->qam_if_agc_cfg
.top
= 1297;
10981 ext_attr
->qam_pga_cfg
= 140;
10983 ext_attr
->vsb_if_agc_cfg
.standard
= DRX_STANDARD_8VSB
;
10984 ext_attr
->vsb_if_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_AUTO
;
10985 ext_attr
->vsb_if_agc_cfg
.min_output_level
= 0;
10986 ext_attr
->vsb_if_agc_cfg
.max_output_level
= 0x7FFF;
10987 ext_attr
->vsb_if_agc_cfg
.speed
= 3;
10988 ext_attr
->vsb_if_agc_cfg
.top
= 1024;
10989 ext_attr
->vsb_pga_cfg
= 140;
10991 /* TODO: remove min_output_level and max_output_level for both QAM and VSB after */
10992 /* mc has not used them */
10993 #ifndef DRXJ_VSB_ONLY
10994 ext_attr
->qam_rf_agc_cfg
.standard
= DRX_STANDARD_ITU_B
;
10995 ext_attr
->qam_rf_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_AUTO
;
10996 ext_attr
->qam_rf_agc_cfg
.min_output_level
= 0;
10997 ext_attr
->qam_rf_agc_cfg
.max_output_level
= 0x7FFF;
10998 ext_attr
->qam_rf_agc_cfg
.speed
= 3;
10999 ext_attr
->qam_rf_agc_cfg
.top
= 9500;
11000 ext_attr
->qam_rf_agc_cfg
.cut_off_current
= 4000;
11001 ext_attr
->qam_pre_saw_cfg
.standard
= DRX_STANDARD_ITU_B
;
11002 ext_attr
->qam_pre_saw_cfg
.reference
= 0x07;
11003 ext_attr
->qam_pre_saw_cfg
.use_pre_saw
= true;
11005 /* Initialize default AFE configuration for VSB */
11006 ext_attr
->vsb_rf_agc_cfg
.standard
= DRX_STANDARD_8VSB
;
11007 ext_attr
->vsb_rf_agc_cfg
.ctrl_mode
= DRX_AGC_CTRL_AUTO
;
11008 ext_attr
->vsb_rf_agc_cfg
.min_output_level
= 0;
11009 ext_attr
->vsb_rf_agc_cfg
.max_output_level
= 0x7FFF;
11010 ext_attr
->vsb_rf_agc_cfg
.speed
= 3;
11011 ext_attr
->vsb_rf_agc_cfg
.top
= 9500;
11012 ext_attr
->vsb_rf_agc_cfg
.cut_off_current
= 4000;
11013 ext_attr
->vsb_pre_saw_cfg
.standard
= DRX_STANDARD_8VSB
;
11014 ext_attr
->vsb_pre_saw_cfg
.reference
= 0x07;
11015 ext_attr
->vsb_pre_saw_cfg
.use_pre_saw
= true;
11019 * \fn int ctrl_power_mode()
11020 * \brief Set the power mode of the device to the specified power mode
11021 * \param demod Pointer to demodulator instance.
11022 * \param mode Pointer to new power mode.
11024 * \retval 0 Success
11025 * \retval -EIO I2C error or other failure
11026 * \retval -EINVAL Invalid mode argument.
11031 ctrl_power_mode(struct drx_demod_instance
*demod
, enum drx_power_mode
*mode
)
11033 struct drx_common_attr
*common_attr
= (struct drx_common_attr
*) NULL
;
11034 struct drxj_data
*ext_attr
= (struct drxj_data
*) NULL
;
11035 struct i2c_device_addr
*dev_addr
= (struct i2c_device_addr
*)NULL
;
11037 u16 sio_cc_pwd_mode
= 0;
11039 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
11040 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
11041 dev_addr
= demod
->my_i2c_dev_addr
;
11043 /* Check arguments */
11047 /* If already in requested power mode, do nothing */
11048 if (common_attr
->current_power_mode
== *mode
)
11053 case DRXJ_POWER_DOWN_MAIN_PATH
:
11054 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_NONE
;
11056 case DRXJ_POWER_DOWN_CORE
:
11057 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_CLOCK
;
11059 case DRXJ_POWER_DOWN_PLL
:
11060 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_PLL
;
11062 case DRX_POWER_DOWN
:
11063 sio_cc_pwd_mode
= SIO_CC_PWD_MODE_LEVEL_OSC
;
11066 /* Unknow sleep mode */
11071 /* Check if device needs to be powered up */
11072 if ((common_attr
->current_power_mode
!= DRX_POWER_UP
)) {
11073 rc
= power_up_device(demod
);
11075 pr_err("error %d\n", rc
);
11080 if (*mode
== DRX_POWER_UP
) {
11081 /* Restore analog & pin configuration */
11083 /* Initialize default AFE configuration for VSB */
11084 drxj_reset_mode(ext_attr
);
11086 /* Power down to requested mode */
11087 /* Backup some register settings */
11088 /* Set pins with possible pull-ups connected to them in input mode */
11089 /* Analog power down */
11090 /* ADC power down */
11091 /* Power down device */
11092 /* stop all comm_exec */
11094 Stop and power down previous standard
11097 switch (ext_attr
->standard
) {
11098 case DRX_STANDARD_ITU_A
:
11099 case DRX_STANDARD_ITU_B
:
11100 case DRX_STANDARD_ITU_C
:
11101 rc
= power_down_qam(demod
, true);
11103 pr_err("error %d\n", rc
);
11107 case DRX_STANDARD_8VSB
:
11108 rc
= power_down_vsb(demod
, true);
11110 pr_err("error %d\n", rc
);
11114 case DRX_STANDARD_PAL_SECAM_BG
: /* fallthrough */
11115 case DRX_STANDARD_PAL_SECAM_DK
: /* fallthrough */
11116 case DRX_STANDARD_PAL_SECAM_I
: /* fallthrough */
11117 case DRX_STANDARD_PAL_SECAM_L
: /* fallthrough */
11118 case DRX_STANDARD_PAL_SECAM_LP
: /* fallthrough */
11119 case DRX_STANDARD_NTSC
: /* fallthrough */
11120 case DRX_STANDARD_FM
:
11121 rc
= power_down_atv(demod
, ext_attr
->standard
, true);
11123 pr_err("error %d\n", rc
);
11127 case DRX_STANDARD_UNKNOWN
:
11130 case DRX_STANDARD_AUTO
: /* fallthrough */
11134 ext_attr
->standard
= DRX_STANDARD_UNKNOWN
;
11137 if (*mode
!= DRXJ_POWER_DOWN_MAIN_PATH
) {
11138 rc
= drxj_dap_write_reg16(dev_addr
, SIO_CC_PWD_MODE__A
, sio_cc_pwd_mode
, 0);
11140 pr_err("error %d\n", rc
);
11143 rc
= drxj_dap_write_reg16(dev_addr
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
, 0);
11145 pr_err("error %d\n", rc
);
11149 if ((*mode
!= DRX_POWER_UP
)) {
11150 /* Initialize HI, wakeup key especially before put IC to sleep */
11151 rc
= init_hi(demod
);
11153 pr_err("error %d\n", rc
);
11157 ext_attr
->hi_cfg_ctrl
|= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
;
11158 rc
= hi_cfg_command(demod
);
11160 pr_err("error %d\n", rc
);
11166 common_attr
->current_power_mode
= *mode
;
11173 /*============================================================================*/
11174 /*== CTRL Set/Get Config related functions ===================================*/
11175 /*============================================================================*/
11178 * \fn int ctrl_set_cfg_pre_saw()
11179 * \brief Set Pre-saw reference.
11180 * \param demod demod instance
11185 * Dispatch handling to standard specific function.
11189 ctrl_set_cfg_pre_saw(struct drx_demod_instance
*demod
, struct drxj_cfg_pre_saw
*pre_saw
)
11191 struct i2c_device_addr
*dev_addr
= NULL
;
11192 struct drxj_data
*ext_attr
= NULL
;
11195 dev_addr
= demod
->my_i2c_dev_addr
;
11196 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
11198 /* check arguments */
11199 if ((pre_saw
== NULL
) || (pre_saw
->reference
> IQM_AF_PDREF__M
)
11204 /* Only if standard is currently active */
11205 if ((ext_attr
->standard
== pre_saw
->standard
) ||
11206 (DRXJ_ISQAMSTD(ext_attr
->standard
) &&
11207 DRXJ_ISQAMSTD(pre_saw
->standard
)) ||
11208 (DRXJ_ISATVSTD(ext_attr
->standard
) &&
11209 DRXJ_ISATVSTD(pre_saw
->standard
))) {
11210 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_PDREF__A
, pre_saw
->reference
, 0);
11212 pr_err("error %d\n", rc
);
11217 /* Store pre-saw settings */
11218 switch (pre_saw
->standard
) {
11219 case DRX_STANDARD_8VSB
:
11220 ext_attr
->vsb_pre_saw_cfg
= *pre_saw
;
11222 #ifndef DRXJ_VSB_ONLY
11223 case DRX_STANDARD_ITU_A
: /* fallthrough */
11224 case DRX_STANDARD_ITU_B
: /* fallthrough */
11225 case DRX_STANDARD_ITU_C
:
11226 ext_attr
->qam_pre_saw_cfg
= *pre_saw
;
11238 /*============================================================================*/
11241 * \fn int ctrl_set_cfg_afe_gain()
11242 * \brief Set AFE Gain.
11243 * \param demod demod instance
11248 * Dispatch handling to standard specific function.
11252 ctrl_set_cfg_afe_gain(struct drx_demod_instance
*demod
, struct drxj_cfg_afe_gain
*afe_gain
)
11254 struct i2c_device_addr
*dev_addr
= NULL
;
11255 struct drxj_data
*ext_attr
= NULL
;
11259 /* check arguments */
11260 if (afe_gain
== NULL
)
11263 dev_addr
= demod
->my_i2c_dev_addr
;
11264 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
11266 switch (afe_gain
->standard
) {
11267 case DRX_STANDARD_8VSB
: /* fallthrough */
11268 #ifndef DRXJ_VSB_ONLY
11269 case DRX_STANDARD_ITU_A
: /* fallthrough */
11270 case DRX_STANDARD_ITU_B
: /* fallthrough */
11271 case DRX_STANDARD_ITU_C
:
11279 /* TODO PGA gain is also written by microcode (at least by QAM and VSB)
11280 So I (PJ) think interface requires choice between auto, user mode */
11282 if (afe_gain
->gain
>= 329)
11284 else if (afe_gain
->gain
<= 147)
11287 gain
= (afe_gain
->gain
- 140 + 6) / 13;
11289 /* Only if standard is currently active */
11290 if (ext_attr
->standard
== afe_gain
->standard
) {
11291 rc
= drxj_dap_write_reg16(dev_addr
, IQM_AF_PGA_GAIN__A
, gain
, 0);
11293 pr_err("error %d\n", rc
);
11298 /* Store AFE Gain settings */
11299 switch (afe_gain
->standard
) {
11300 case DRX_STANDARD_8VSB
:
11301 ext_attr
->vsb_pga_cfg
= gain
* 13 + 140;
11303 #ifndef DRXJ_VSB_ONLY
11304 case DRX_STANDARD_ITU_A
: /* fallthrough */
11305 case DRX_STANDARD_ITU_B
: /* fallthrough */
11306 case DRX_STANDARD_ITU_C
:
11307 ext_attr
->qam_pga_cfg
= gain
* 13 + 140;
11319 /*============================================================================*/
11322 /*=============================================================================
11323 ===== EXPORTED FUNCTIONS ====================================================*/
11325 static int drx_ctrl_u_code(struct drx_demod_instance
*demod
,
11326 struct drxu_code_info
*mc_info
,
11327 enum drxu_code_action action
);
11328 static int drxj_set_lna_state(struct drx_demod_instance
*demod
, bool state
);
11332 * \brief Open the demod instance, configure device, configure drxdriver
11333 * \return Status_t Return status.
11335 * drxj_open() can be called with a NULL ucode image => no ucode upload.
11336 * This means that drxj_open() must NOT contain SCU commands or, in general,
11337 * rely on SCU or AUD ucode to be present.
11341 static int drxj_open(struct drx_demod_instance
*demod
)
11343 struct i2c_device_addr
*dev_addr
= NULL
;
11344 struct drxj_data
*ext_attr
= NULL
;
11345 struct drx_common_attr
*common_attr
= NULL
;
11346 u32 driver_version
= 0;
11347 struct drxu_code_info ucode_info
;
11348 struct drx_cfg_mpeg_output cfg_mpeg_output
;
11350 enum drx_power_mode power_mode
= DRX_POWER_UP
;
11352 if ((demod
== NULL
) ||
11353 (demod
->my_common_attr
== NULL
) ||
11354 (demod
->my_ext_attr
== NULL
) ||
11355 (demod
->my_i2c_dev_addr
== NULL
) ||
11356 (demod
->my_common_attr
->is_opened
)) {
11360 /* Check arguments */
11361 if (demod
->my_ext_attr
== NULL
)
11364 dev_addr
= demod
->my_i2c_dev_addr
;
11365 ext_attr
= (struct drxj_data
*) demod
->my_ext_attr
;
11366 common_attr
= (struct drx_common_attr
*) demod
->my_common_attr
;
11368 rc
= ctrl_power_mode(demod
, &power_mode
);
11370 pr_err("error %d\n", rc
);
11373 if (power_mode
!= DRX_POWER_UP
) {
11375 pr_err("failed to powerup device\n");
11379 /* has to be in front of setIqmAf and setOrxNsuAox */
11380 rc
= get_device_capabilities(demod
);
11382 pr_err("error %d\n", rc
);
11387 * Soft reset of sys- and osc-clockdomain
11389 * HACK: On windows, it writes a 0x07 here, instead of just 0x03.
11390 * As we didn't load the firmware here yet, we should do the same.
11391 * Btw, this is coherent with DRX-K, where we send reset codes
11392 * for modulation (OFTM, in DRX-k), SYS and OSC clock domains.
11394 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);
11396 pr_err("error %d\n", rc
);
11399 rc
= drxj_dap_write_reg16(dev_addr
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
, 0);
11401 pr_err("error %d\n", rc
);
11406 /* TODO first make sure that everything keeps working before enabling this */
11407 /* PowerDownAnalogBlocks() */
11408 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);
11410 pr_err("error %d\n", rc
);
11414 rc
= set_iqm_af(demod
, false);
11416 pr_err("error %d\n", rc
);
11419 rc
= set_orx_nsu_aox(demod
, false);
11421 pr_err("error %d\n", rc
);
11425 rc
= init_hi(demod
);
11427 pr_err("error %d\n", rc
);
11431 /* disable mpegoutput pins */
11432 memcpy(&cfg_mpeg_output
, &common_attr
->mpeg_cfg
, sizeof(cfg_mpeg_output
));
11433 cfg_mpeg_output
.enable_mpeg_output
= false;
11435 rc
= ctrl_set_cfg_mpeg_output(demod
, &cfg_mpeg_output
);
11437 pr_err("error %d\n", rc
);
11440 /* Stop AUD Inform SetAudio it will need to do all setting */
11441 rc
= power_down_aud(demod
);
11443 pr_err("error %d\n", rc
);
11447 rc
= drxj_dap_write_reg16(dev_addr
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_STOP
, 0);
11449 pr_err("error %d\n", rc
);
11453 /* Upload microcode */
11454 if (common_attr
->microcode_file
!= NULL
) {
11455 /* Dirty trick to use common ucode upload & verify,
11456 pretend device is already open */
11457 common_attr
->is_opened
= true;
11458 ucode_info
.mc_file
= common_attr
->microcode_file
;
11460 if (DRX_ISPOWERDOWNMODE(demod
->my_common_attr
->current_power_mode
)) {
11461 pr_err("Should powerup before loading the firmware.");
11465 rc
= drx_ctrl_u_code(demod
, &ucode_info
, UCODE_UPLOAD
);
11467 pr_err("error %d while uploading the firmware\n", rc
);
11470 if (common_attr
->verify_microcode
== true) {
11471 rc
= drx_ctrl_u_code(demod
, &ucode_info
, UCODE_VERIFY
);
11473 pr_err("error %d while verifying the firmware\n",
11478 common_attr
->is_opened
= false;
11481 /* Run SCU for a little while to initialize microcode version numbers */
11482 rc
= drxj_dap_write_reg16(dev_addr
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
, 0);
11484 pr_err("error %d\n", rc
);
11488 /* Initialize scan timeout */
11489 common_attr
->scan_demod_lock_timeout
= DRXJ_SCAN_TIMEOUT
;
11490 common_attr
->scan_desired_lock
= DRX_LOCKED
;
11492 drxj_reset_mode(ext_attr
);
11493 ext_attr
->standard
= DRX_STANDARD_UNKNOWN
;
11495 rc
= smart_ant_init(demod
);
11497 pr_err("error %d\n", rc
);
11501 /* Stamp driver version number in SCU data RAM in BCD code
11502 Done to enable field application engineers to retrieve drxdriver version
11503 via I2C from SCU RAM
11505 driver_version
= (VERSION_MAJOR
/ 100) % 10;
11506 driver_version
<<= 4;
11507 driver_version
+= (VERSION_MAJOR
/ 10) % 10;
11508 driver_version
<<= 4;
11509 driver_version
+= (VERSION_MAJOR
% 10);
11510 driver_version
<<= 4;
11511 driver_version
+= (VERSION_MINOR
% 10);
11512 driver_version
<<= 4;
11513 driver_version
+= (VERSION_PATCH
/ 1000) % 10;
11514 driver_version
<<= 4;
11515 driver_version
+= (VERSION_PATCH
/ 100) % 10;
11516 driver_version
<<= 4;
11517 driver_version
+= (VERSION_PATCH
/ 10) % 10;
11518 driver_version
<<= 4;
11519 driver_version
+= (VERSION_PATCH
% 10);
11520 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_DRIVER_VER_HI__A
, (u16
)(driver_version
>> 16), 0);
11522 pr_err("error %d\n", rc
);
11525 rc
= drxj_dap_write_reg16(dev_addr
, SCU_RAM_DRIVER_VER_LO__A
, (u16
)(driver_version
& 0xFFFF), 0);
11527 pr_err("error %d\n", rc
);
11531 rc
= ctrl_set_oob(demod
, NULL
);
11533 pr_err("error %d\n", rc
);
11537 /* refresh the audio data structure with default */
11538 ext_attr
->aud_data
= drxj_default_aud_data_g
;
11540 demod
->my_common_attr
->is_opened
= true;
11541 drxj_set_lna_state(demod
, false);
11544 common_attr
->is_opened
= false;
11548 /*============================================================================*/
11551 * \brief Close the demod instance, power down the device
11552 * \return Status_t Return status.
11555 static int drxj_close(struct drx_demod_instance
*demod
)
11557 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
11559 enum drx_power_mode power_mode
= DRX_POWER_UP
;
11561 if ((demod
->my_common_attr
== NULL
) ||
11562 (demod
->my_ext_attr
== NULL
) ||
11563 (demod
->my_i2c_dev_addr
== NULL
) ||
11564 (!demod
->my_common_attr
->is_opened
)) {
11569 rc
= ctrl_power_mode(demod
, &power_mode
);
11571 pr_err("error %d\n", rc
);
11575 rc
= drxj_dap_write_reg16(dev_addr
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
, 0);
11577 pr_err("error %d\n", rc
);
11580 power_mode
= DRX_POWER_DOWN
;
11581 rc
= ctrl_power_mode(demod
, &power_mode
);
11583 pr_err("error %d\n", rc
);
11587 DRX_ATTR_ISOPENED(demod
) = false;
11591 DRX_ATTR_ISOPENED(demod
) = false;
11597 * Microcode related functions
11601 * drx_u_code_compute_crc - Compute CRC of block of microcode data.
11602 * @block_data: Pointer to microcode data.
11603 * @nr_words: Size of microcode block (number of 16 bits words).
11605 * returns The computed CRC residue.
11607 static u16
drx_u_code_compute_crc(u8
*block_data
, u16 nr_words
)
11614 while (i
< nr_words
) {
11615 crc_word
|= (u32
)be16_to_cpu(*(__be16
*)(block_data
));
11616 for (j
= 0; j
< 16; j
++) {
11619 crc_word
^= 0x80050000UL
;
11620 carry
= crc_word
& 0x80000000UL
;
11623 block_data
+= (sizeof(u16
));
11625 return (u16
)(crc_word
>> 16);
11629 * drx_check_firmware - checks if the loaded firmware is valid
11631 * @demod: demod structure
11632 * @mc_data: pointer to the start of the firmware
11633 * @size: firmware size
11635 static int drx_check_firmware(struct drx_demod_instance
*demod
, u8
*mc_data
,
11638 struct drxu_code_block_hdr block_hdr
;
11640 unsigned count
= 2 * sizeof(u16
);
11641 u32 mc_dev_type
, mc_version
, mc_base_version
;
11642 u16 mc_nr_of_blks
= be16_to_cpu(*(__be16
*)(mc_data
+ sizeof(u16
)));
11645 * Scan microcode blocks first for version info
11646 * and firmware check
11649 /* Clear version block */
11650 DRX_ATTR_MCRECORD(demod
).aux_type
= 0;
11651 DRX_ATTR_MCRECORD(demod
).mc_dev_type
= 0;
11652 DRX_ATTR_MCRECORD(demod
).mc_version
= 0;
11653 DRX_ATTR_MCRECORD(demod
).mc_base_version
= 0;
11655 for (i
= 0; i
< mc_nr_of_blks
; i
++) {
11656 if (count
+ 3 * sizeof(u16
) + sizeof(u32
) > size
)
11659 /* Process block header */
11660 block_hdr
.addr
= be32_to_cpu(*(__be32
*)(mc_data
+ count
));
11661 count
+= sizeof(u32
);
11662 block_hdr
.size
= be16_to_cpu(*(__be16
*)(mc_data
+ count
));
11663 count
+= sizeof(u16
);
11664 block_hdr
.flags
= be16_to_cpu(*(__be16
*)(mc_data
+ count
));
11665 count
+= sizeof(u16
);
11666 block_hdr
.CRC
= be16_to_cpu(*(__be16
*)(mc_data
+ count
));
11667 count
+= sizeof(u16
);
11669 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11670 count
, block_hdr
.addr
, block_hdr
.size
, block_hdr
.flags
,
11673 if (block_hdr
.flags
& 0x8) {
11674 u8
*auxblk
= ((void *)mc_data
) + block_hdr
.addr
;
11677 if (block_hdr
.addr
+ sizeof(u16
) > size
)
11680 auxtype
= be16_to_cpu(*(__be16
*)(auxblk
));
11682 /* Aux block. Check type */
11683 if (DRX_ISMCVERTYPE(auxtype
)) {
11684 if (block_hdr
.addr
+ 2 * sizeof(u16
) + 2 * sizeof (u32
) > size
)
11687 auxblk
+= sizeof(u16
);
11688 mc_dev_type
= be32_to_cpu(*(__be32
*)(auxblk
));
11689 auxblk
+= sizeof(u32
);
11690 mc_version
= be32_to_cpu(*(__be32
*)(auxblk
));
11691 auxblk
+= sizeof(u32
);
11692 mc_base_version
= be32_to_cpu(*(__be32
*)(auxblk
));
11694 DRX_ATTR_MCRECORD(demod
).aux_type
= auxtype
;
11695 DRX_ATTR_MCRECORD(demod
).mc_dev_type
= mc_dev_type
;
11696 DRX_ATTR_MCRECORD(demod
).mc_version
= mc_version
;
11697 DRX_ATTR_MCRECORD(demod
).mc_base_version
= mc_base_version
;
11699 pr_info("Firmware dev %x, ver %x, base ver %x\n",
11700 mc_dev_type
, mc_version
, mc_base_version
);
11703 } else if (count
+ block_hdr
.size
* sizeof(u16
) > size
)
11706 count
+= block_hdr
.size
* sizeof(u16
);
11710 pr_err("Firmware is truncated at pos %u/%u\n", count
, size
);
11715 * drx_ctrl_u_code - Handle microcode upload or verify.
11716 * @dev_addr: Address of device.
11717 * @mc_info: Pointer to information about microcode data.
11718 * @action: Either UCODE_UPLOAD or UCODE_VERIFY
11720 * This function returns:
11722 * - In case of UCODE_UPLOAD: code is successfully uploaded.
11723 * - In case of UCODE_VERIFY: image on device is equal to
11724 * image provided to this control function.
11726 * - In case of UCODE_UPLOAD: I2C error.
11727 * - In case of UCODE_VERIFY: I2C error or image on device
11728 * is not equal to image provided to this control function.
11730 * - Invalid arguments.
11731 * - Provided image is corrupt
11733 static int drx_ctrl_u_code(struct drx_demod_instance
*demod
,
11734 struct drxu_code_info
*mc_info
,
11735 enum drxu_code_action action
)
11737 struct i2c_device_addr
*dev_addr
= demod
->my_i2c_dev_addr
;
11740 u16 mc_nr_of_blks
= 0;
11741 u16 mc_magic_word
= 0;
11742 const u8
*mc_data_init
= NULL
;
11743 u8
*mc_data
= NULL
;
11747 /* Check arguments */
11748 if (!mc_info
|| !mc_info
->mc_file
)
11751 mc_file
= mc_info
->mc_file
;
11753 if (!demod
->firmware
) {
11754 const struct firmware
*fw
= NULL
;
11756 rc
= request_firmware(&fw
, mc_file
, demod
->i2c
->dev
.parent
);
11758 pr_err("Couldn't read firmware %s\n", mc_file
);
11761 demod
->firmware
= fw
;
11763 if (demod
->firmware
->size
< 2 * sizeof(u16
)) {
11765 pr_err("Firmware is too short!\n");
11769 pr_info("Firmware %s, size %zu\n",
11770 mc_file
, demod
->firmware
->size
);
11773 mc_data_init
= demod
->firmware
->data
;
11774 size
= demod
->firmware
->size
;
11776 mc_data
= (void *)mc_data_init
;
11778 mc_magic_word
= be16_to_cpu(*(__be16
*)(mc_data
));
11779 mc_data
+= sizeof(u16
);
11780 mc_nr_of_blks
= be16_to_cpu(*(__be16
*)(mc_data
));
11781 mc_data
+= sizeof(u16
);
11783 if ((mc_magic_word
!= DRX_UCODE_MAGIC_WORD
) || (mc_nr_of_blks
== 0)) {
11785 pr_err("Firmware magic word doesn't match\n");
11789 if (action
== UCODE_UPLOAD
) {
11790 rc
= drx_check_firmware(demod
, (u8
*)mc_data_init
, size
);
11793 pr_info("Uploading firmware %s\n", mc_file
);
11795 pr_info("Verifying if firmware upload was ok.\n");
11798 /* Process microcode blocks */
11799 for (i
= 0; i
< mc_nr_of_blks
; i
++) {
11800 struct drxu_code_block_hdr block_hdr
;
11801 u16 mc_block_nr_bytes
= 0;
11803 /* Process block header */
11804 block_hdr
.addr
= be32_to_cpu(*(__be32
*)(mc_data
));
11805 mc_data
+= sizeof(u32
);
11806 block_hdr
.size
= be16_to_cpu(*(__be16
*)(mc_data
));
11807 mc_data
+= sizeof(u16
);
11808 block_hdr
.flags
= be16_to_cpu(*(__be16
*)(mc_data
));
11809 mc_data
+= sizeof(u16
);
11810 block_hdr
.CRC
= be16_to_cpu(*(__be16
*)(mc_data
));
11811 mc_data
+= sizeof(u16
);
11813 pr_debug("%zd: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11814 (mc_data
- mc_data_init
), block_hdr
.addr
,
11815 block_hdr
.size
, block_hdr
.flags
, block_hdr
.CRC
);
11817 /* Check block header on:
11818 - data larger than 64Kb
11819 - if CRC enabled check CRC
11821 if ((block_hdr
.size
> 0x7FFF) ||
11822 (((block_hdr
.flags
& DRX_UCODE_CRC_FLAG
) != 0) &&
11823 (block_hdr
.CRC
!= drx_u_code_compute_crc(mc_data
, block_hdr
.size
)))
11827 pr_err("firmware CRC is wrong\n");
11831 if (!block_hdr
.size
)
11834 mc_block_nr_bytes
= block_hdr
.size
* ((u16
) sizeof(u16
));
11836 /* Perform the desired action */
11838 case UCODE_UPLOAD
: /* Upload microcode */
11839 if (drxdap_fasi_write_block(dev_addr
,
11842 mc_data
, 0x0000)) {
11844 pr_err("error writing firmware at pos %zd\n",
11845 mc_data
- mc_data_init
);
11849 case UCODE_VERIFY
: { /* Verify uploaded microcode */
11851 u8 mc_data_buffer
[DRX_UCODE_MAX_BUF_SIZE
];
11852 u32 bytes_to_comp
= 0;
11853 u32 bytes_left
= mc_block_nr_bytes
;
11854 u32 curr_addr
= block_hdr
.addr
;
11855 u8
*curr_ptr
= mc_data
;
11857 while (bytes_left
!= 0) {
11858 if (bytes_left
> DRX_UCODE_MAX_BUF_SIZE
)
11859 bytes_to_comp
= DRX_UCODE_MAX_BUF_SIZE
;
11861 bytes_to_comp
= bytes_left
;
11863 if (drxdap_fasi_read_block(dev_addr
,
11865 (u16
)bytes_to_comp
,
11866 (u8
*)mc_data_buffer
,
11868 pr_err("error reading firmware at pos %zd\n",
11869 mc_data
- mc_data_init
);
11873 result
= memcmp(curr_ptr
, mc_data_buffer
,
11877 pr_err("error verifying firmware at pos %zd\n",
11878 mc_data
- mc_data_init
);
11882 curr_addr
+= ((dr_xaddr_t
)(bytes_to_comp
/ 2));
11883 curr_ptr
=&(curr_ptr
[bytes_to_comp
]);
11884 bytes_left
-=((u32
) bytes_to_comp
);
11893 mc_data
+= mc_block_nr_bytes
;
11899 release_firmware(demod
->firmware
);
11900 demod
->firmware
= NULL
;
11905 /* caller is expected to check if lna is supported before enabling */
11906 static int drxj_set_lna_state(struct drx_demod_instance
*demod
, bool state
)
11908 struct drxuio_cfg uio_cfg
;
11909 struct drxuio_data uio_data
;
11912 uio_cfg
.uio
= DRX_UIO1
;
11913 uio_cfg
.mode
= DRX_UIO_MODE_READWRITE
;
11914 /* Configure user-I/O #3: enable read/write */
11915 result
= ctrl_set_uio_cfg(demod
, &uio_cfg
);
11917 pr_err("Failed to setup LNA GPIO!\n");
11921 uio_data
.uio
= DRX_UIO1
;
11922 uio_data
.value
= state
;
11923 result
= ctrl_uio_write(demod
, &uio_data
);
11925 pr_err("Failed to %sable LNA!\n",
11926 state
? "en" : "dis");
11933 * The Linux DVB Driver for Micronas DRX39xx family (drx3933j)
11935 * Written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
11938 static int drx39xxj_set_powerstate(struct dvb_frontend
*fe
, int enable
)
11940 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
11941 struct drx_demod_instance
*demod
= state
->demod
;
11943 enum drx_power_mode power_mode
;
11946 power_mode
= DRX_POWER_UP
;
11948 power_mode
= DRX_POWER_DOWN
;
11950 result
= ctrl_power_mode(demod
, &power_mode
);
11952 pr_err("Power state change failed\n");
11959 static int drx39xxj_read_status(struct dvb_frontend
*fe
, enum fe_status
*status
)
11961 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
11962 struct drx_demod_instance
*demod
= state
->demod
;
11964 enum drx_lock_status lock_status
;
11968 result
= ctrl_lock_status(demod
, &lock_status
);
11970 pr_err("drx39xxj: could not get lock status!\n");
11974 switch (lock_status
) {
11975 case DRX_NEVER_LOCK
:
11977 pr_err("drx says NEVER_LOCK\n");
11979 case DRX_NOT_LOCKED
:
11982 case DRX_LOCK_STATE_1
:
11983 case DRX_LOCK_STATE_2
:
11984 case DRX_LOCK_STATE_3
:
11985 case DRX_LOCK_STATE_4
:
11986 case DRX_LOCK_STATE_5
:
11987 case DRX_LOCK_STATE_6
:
11988 case DRX_LOCK_STATE_7
:
11989 case DRX_LOCK_STATE_8
:
11990 case DRX_LOCK_STATE_9
:
11991 *status
= FE_HAS_SIGNAL
11992 | FE_HAS_CARRIER
| FE_HAS_VITERBI
| FE_HAS_SYNC
;
11995 *status
= FE_HAS_SIGNAL
11997 | FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
;
12000 pr_err("Lock state unknown %d\n", lock_status
);
12002 ctrl_sig_quality(demod
, lock_status
);
12007 static int drx39xxj_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
12009 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12011 if (p
->pre_bit_error
.stat
[0].scale
== FE_SCALE_NOT_AVAILABLE
) {
12016 if (!p
->pre_bit_count
.stat
[0].uvalue
) {
12017 if (!p
->pre_bit_error
.stat
[0].uvalue
)
12022 *ber
= frac_times1e6(p
->pre_bit_error
.stat
[0].uvalue
,
12023 p
->pre_bit_count
.stat
[0].uvalue
);
12028 static int drx39xxj_read_signal_strength(struct dvb_frontend
*fe
,
12031 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12033 if (p
->strength
.stat
[0].scale
== FE_SCALE_NOT_AVAILABLE
) {
12038 *strength
= p
->strength
.stat
[0].uvalue
;
12042 static int drx39xxj_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
12044 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12047 if (p
->cnr
.stat
[0].scale
== FE_SCALE_NOT_AVAILABLE
) {
12052 tmp64
= p
->cnr
.stat
[0].svalue
;
12058 static int drx39xxj_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucb
)
12060 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12062 if (p
->block_error
.stat
[0].scale
== FE_SCALE_NOT_AVAILABLE
) {
12067 *ucb
= p
->block_error
.stat
[0].uvalue
;
12071 static int drx39xxj_set_frontend(struct dvb_frontend
*fe
)
12076 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
12077 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12078 struct drx_demod_instance
*demod
= state
->demod
;
12079 enum drx_standard standard
= DRX_STANDARD_8VSB
;
12080 struct drx_channel channel
;
12082 static const struct drx_channel def_channel
= {
12084 /* bandwidth */ DRX_BANDWIDTH_6MHZ
,
12085 /* mirror */ DRX_MIRROR_NO
,
12086 /* constellation */ DRX_CONSTELLATION_AUTO
,
12087 /* hierarchy */ DRX_HIERARCHY_UNKNOWN
,
12088 /* priority */ DRX_PRIORITY_UNKNOWN
,
12089 /* coderate */ DRX_CODERATE_UNKNOWN
,
12090 /* guard */ DRX_GUARD_UNKNOWN
,
12091 /* fftmode */ DRX_FFTMODE_UNKNOWN
,
12092 /* classification */ DRX_CLASSIFICATION_AUTO
,
12093 /* symbolrate */ 5057000,
12094 /* interleavemode */ DRX_INTERLEAVEMODE_UNKNOWN
,
12095 /* ldpc */ DRX_LDPC_UNKNOWN
,
12096 /* carrier */ DRX_CARRIER_UNKNOWN
,
12097 /* frame mode */ DRX_FRAMEMODE_UNKNOWN
12099 u32 constellation
= DRX_CONSTELLATION_AUTO
;
12101 /* Bring the demod out of sleep */
12102 drx39xxj_set_powerstate(fe
, 1);
12104 if (fe
->ops
.tuner_ops
.set_params
) {
12107 if (fe
->ops
.i2c_gate_ctrl
)
12108 fe
->ops
.i2c_gate_ctrl(fe
, 1);
12110 /* Set tuner to desired frequency and standard */
12111 fe
->ops
.tuner_ops
.set_params(fe
);
12113 /* Use the tuner's IF */
12114 if (fe
->ops
.tuner_ops
.get_if_frequency
) {
12115 fe
->ops
.tuner_ops
.get_if_frequency(fe
, &int_freq
);
12116 demod
->my_common_attr
->intermediate_freq
= int_freq
/ 1000;
12119 if (fe
->ops
.i2c_gate_ctrl
)
12120 fe
->ops
.i2c_gate_ctrl(fe
, 0);
12123 switch (p
->delivery_system
) {
12125 standard
= DRX_STANDARD_8VSB
;
12127 case SYS_DVBC_ANNEX_B
:
12128 standard
= DRX_STANDARD_ITU_B
;
12130 switch (p
->modulation
) {
12132 constellation
= DRX_CONSTELLATION_QAM64
;
12135 constellation
= DRX_CONSTELLATION_QAM256
;
12138 constellation
= DRX_CONSTELLATION_AUTO
;
12145 /* Set the standard (will be powered up if necessary */
12146 result
= ctrl_set_standard(demod
, &standard
);
12148 pr_err("Failed to set standard! result=%02x\n",
12153 /* set channel parameters */
12154 channel
= def_channel
;
12155 channel
.frequency
= p
->frequency
/ 1000;
12156 channel
.bandwidth
= DRX_BANDWIDTH_6MHZ
;
12157 channel
.constellation
= constellation
;
12159 /* program channel */
12160 result
= ctrl_set_channel(demod
, &channel
);
12162 pr_err("Failed to set channel!\n");
12165 /* Just for giggles, let's shut off the LNA again.... */
12166 drxj_set_lna_state(demod
, false);
12168 /* After set_frontend, except for strength, stats aren't available */
12169 p
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
12174 static int drx39xxj_sleep(struct dvb_frontend
*fe
)
12176 /* power-down the demodulator */
12177 return drx39xxj_set_powerstate(fe
, 0);
12180 static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
12182 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12183 struct drx_demod_instance
*demod
= state
->demod
;
12184 bool i2c_gate_state
;
12188 pr_debug("i2c gate call: enable=%d state=%d\n", enable
,
12189 state
->i2c_gate_open
);
12193 i2c_gate_state
= true;
12195 i2c_gate_state
= false;
12197 if (state
->i2c_gate_open
== enable
) {
12198 /* We're already in the desired state */
12202 result
= ctrl_i2c_bridge(demod
, &i2c_gate_state
);
12204 pr_err("drx39xxj: could not open i2c gate [%d]\n",
12208 state
->i2c_gate_open
= enable
;
12213 static int drx39xxj_init(struct dvb_frontend
*fe
)
12215 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12216 struct drx_demod_instance
*demod
= state
->demod
;
12219 if (fe
->exit
== DVB_FE_DEVICE_RESUME
) {
12220 /* so drxj_open() does what it needs to do */
12221 demod
->my_common_attr
->is_opened
= false;
12222 rc
= drxj_open(demod
);
12224 pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc
);
12226 drx39xxj_set_powerstate(fe
, 1);
12231 static int drx39xxj_set_lna(struct dvb_frontend
*fe
)
12233 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
12234 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12235 struct drx_demod_instance
*demod
= state
->demod
;
12236 struct drxj_data
*ext_attr
= demod
->my_ext_attr
;
12239 if (!ext_attr
->has_lna
) {
12240 pr_err("LNA is not supported on this device!\n");
12246 return drxj_set_lna_state(demod
, c
->lna
);
12249 static int drx39xxj_get_tune_settings(struct dvb_frontend
*fe
,
12250 struct dvb_frontend_tune_settings
*tune
)
12252 tune
->min_delay_ms
= 1000;
12256 static void drx39xxj_release(struct dvb_frontend
*fe
)
12258 struct drx39xxj_state
*state
= fe
->demodulator_priv
;
12259 struct drx_demod_instance
*demod
= state
->demod
;
12261 /* if device is removed don't access it */
12262 if (fe
->exit
!= DVB_FE_DEVICE_REMOVED
)
12265 kfree(demod
->my_ext_attr
);
12266 kfree(demod
->my_common_attr
);
12267 kfree(demod
->my_i2c_dev_addr
);
12268 release_firmware(demod
->firmware
);
12273 static const struct dvb_frontend_ops drx39xxj_ops
;
12275 struct dvb_frontend
*drx39xxj_attach(struct i2c_adapter
*i2c
)
12277 struct drx39xxj_state
*state
= NULL
;
12278 struct i2c_device_addr
*demod_addr
= NULL
;
12279 struct drx_common_attr
*demod_comm_attr
= NULL
;
12280 struct drxj_data
*demod_ext_attr
= NULL
;
12281 struct drx_demod_instance
*demod
= NULL
;
12282 struct dtv_frontend_properties
*p
;
12285 /* allocate memory for the internal state */
12286 state
= kzalloc(sizeof(struct drx39xxj_state
), GFP_KERNEL
);
12290 demod
= kmemdup(&drxj_default_demod_g
,
12291 sizeof(struct drx_demod_instance
), GFP_KERNEL
);
12295 demod_addr
= kmemdup(&drxj_default_addr_g
,
12296 sizeof(struct i2c_device_addr
), GFP_KERNEL
);
12297 if (demod_addr
== NULL
)
12300 demod_comm_attr
= kmemdup(&drxj_default_comm_attr_g
,
12301 sizeof(struct drx_common_attr
), GFP_KERNEL
);
12302 if (demod_comm_attr
== NULL
)
12305 demod_ext_attr
= kmemdup(&drxj_data_g
, sizeof(struct drxj_data
),
12307 if (demod_ext_attr
== NULL
)
12310 /* setup the state */
12312 state
->demod
= demod
;
12314 /* setup the demod data */
12315 demod
->my_i2c_dev_addr
= demod_addr
;
12316 demod
->my_common_attr
= demod_comm_attr
;
12317 demod
->my_i2c_dev_addr
->user_data
= state
;
12318 demod
->my_common_attr
->microcode_file
= DRX39XX_MAIN_FIRMWARE
;
12319 demod
->my_common_attr
->verify_microcode
= true;
12320 demod
->my_common_attr
->intermediate_freq
= 5000;
12321 demod
->my_common_attr
->current_power_mode
= DRX_POWER_DOWN
;
12322 demod
->my_ext_attr
= demod_ext_attr
;
12323 ((struct drxj_data
*)demod_ext_attr
)->uio_sma_tx_mode
= DRX_UIO_MODE_READWRITE
;
12326 result
= drxj_open(demod
);
12328 pr_err("DRX open failed! Aborting\n");
12332 /* create dvb_frontend */
12333 memcpy(&state
->frontend
.ops
, &drx39xxj_ops
,
12334 sizeof(struct dvb_frontend_ops
));
12336 state
->frontend
.demodulator_priv
= state
;
12338 /* Initialize stats - needed for DVBv5 stats to work */
12339 p
= &state
->frontend
.dtv_property_cache
;
12340 p
->strength
.len
= 1;
12341 p
->pre_bit_count
.len
= 1;
12342 p
->pre_bit_error
.len
= 1;
12343 p
->post_bit_count
.len
= 1;
12344 p
->post_bit_error
.len
= 1;
12345 p
->block_count
.len
= 1;
12346 p
->block_error
.len
= 1;
12349 p
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
12350 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12351 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12352 p
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12353 p
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12354 p
->block_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12355 p
->block_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12356 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
12358 return &state
->frontend
;
12361 kfree(demod_ext_attr
);
12362 kfree(demod_comm_attr
);
12369 EXPORT_SYMBOL(drx39xxj_attach
);
12371 static const struct dvb_frontend_ops drx39xxj_ops
= {
12372 .delsys
= { SYS_ATSC
, SYS_DVBC_ANNEX_B
},
12374 .name
= "Micronas DRX39xxj family Frontend",
12375 .frequency_min_hz
= 51 * MHz
,
12376 .frequency_max_hz
= 858 * MHz
,
12377 .frequency_stepsize_hz
= 62500,
12378 .caps
= FE_CAN_QAM_64
| FE_CAN_QAM_256
| FE_CAN_8VSB
12381 .init
= drx39xxj_init
,
12382 .i2c_gate_ctrl
= drx39xxj_i2c_gate_ctrl
,
12383 .sleep
= drx39xxj_sleep
,
12384 .set_frontend
= drx39xxj_set_frontend
,
12385 .get_tune_settings
= drx39xxj_get_tune_settings
,
12386 .read_status
= drx39xxj_read_status
,
12387 .read_ber
= drx39xxj_read_ber
,
12388 .read_signal_strength
= drx39xxj_read_signal_strength
,
12389 .read_snr
= drx39xxj_read_snr
,
12390 .read_ucblocks
= drx39xxj_read_ucblocks
,
12391 .release
= drx39xxj_release
,
12392 .set_lna
= drx39xxj_set_lna
,
12395 MODULE_DESCRIPTION("Micronas DRX39xxj Frontend");
12396 MODULE_AUTHOR("Devin Heitmueller");
12397 MODULE_LICENSE("GPL");
12398 MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE
);