1 /*
2   Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc.
3   All rights reserved.
4 
5   Redistribution and use in source and binary forms, with or without
6   modification, are permitted provided that the following conditions are met:
7 
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
16 	permission.
17 
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.
29 
30   DRXJ specific implementation of DRX driver
31   authors: Dragan Savic, Milos Nikolic, Mihajlo Katona, Tao Ding, Paul Janssen
32 
33   The Linux DVB Driver for Micronas DRX39xx family (drx3933j) was
34   written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
35 
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.
40 
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
44 
45   GNU General Public License for more details.
46 
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.
50 */
51 
52 /*-----------------------------------------------------------------------------
53 INCLUDE FILES
54 ----------------------------------------------------------------------------*/
55 
56 #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
57 
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>
63 
64 #include <media/dvb_frontend.h>
65 #include "drx39xxj.h"
66 
67 #include "drxj.h"
68 #include "drxj_map.h"
69 
70 /*============================================================================*/
71 /*=== DEFINES ================================================================*/
72 /*============================================================================*/
73 
74 #define DRX39XX_MAIN_FIRMWARE "dvb-fe-drxj-mc-1.0.8.fw"
75 
76 /*
77 * \brief Maximum u32 value.
78 */
79 #ifndef MAX_U32
80 #define MAX_U32  ((u32) (0xFFFFFFFFL))
81 #endif
82 
83 /* Customer configurable hardware settings, etc */
84 #ifndef MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
85 #define MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
86 #endif
87 
88 #ifndef MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
89 #define MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
90 #endif
91 
92 #ifndef MPEG_OUTPUT_CLK_DRIVE_STRENGTH
93 #define MPEG_OUTPUT_CLK_DRIVE_STRENGTH 0x06
94 #endif
95 
96 #ifndef OOB_CRX_DRIVE_STRENGTH
97 #define OOB_CRX_DRIVE_STRENGTH 0x02
98 #endif
99 
100 #ifndef OOB_DRX_DRIVE_STRENGTH
101 #define OOB_DRX_DRIVE_STRENGTH 0x02
102 #endif
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 *********************************/
192 
193 #include "drx_driver_version.h"
194 
195 /* #define DRX_DEBUG */
196 #ifdef DRX_DEBUG
197 #include <stdio.h>
198 #endif
199 
200 /*-----------------------------------------------------------------------------
201 ENUMS
202 ----------------------------------------------------------------------------*/
203 
204 /*-----------------------------------------------------------------------------
205 DEFINES
206 ----------------------------------------------------------------------------*/
207 #ifndef DRXJ_WAKE_UP_KEY
208 #define DRXJ_WAKE_UP_KEY (demod->my_i2c_dev_addr->i2c_addr)
209 #endif
210 
211 /*
212 * \def DRXJ_DEF_I2C_ADDR
213 * \brief Default I2C address of a demodulator instance.
214 */
215 #define DRXJ_DEF_I2C_ADDR (0x52)
216 
217 /*
218 * \def DRXJ_DEF_DEMOD_DEV_ID
219 * \brief Default device identifier of a demodultor instance.
220 */
221 #define DRXJ_DEF_DEMOD_DEV_ID      (1)
222 
223 /*
224 * \def DRXJ_SCAN_TIMEOUT
225 * \brief Timeout value for waiting on demod lock during channel scan (millisec).
226 */
227 #define DRXJ_SCAN_TIMEOUT    1000
228 
229 /*
230 * \def HI_I2C_DELAY
231 * \brief HI timing delay for I2C timing (in nano seconds)
232 *
233 *  Used to compute HI_CFG_DIV
234 */
235 #define HI_I2C_DELAY    42
236 
237 /*
238 * \def HI_I2C_BRIDGE_DELAY
239 * \brief HI timing delay for I2C timing (in nano seconds)
240 *
241 *  Used to compute HI_CFG_BDL
242 */
243 #define HI_I2C_BRIDGE_DELAY   750
244 
245 /*
246 * \brief Time Window for MER and SER Measurement in Units of Segment duration.
247 */
248 #define VSB_TOP_MEASUREMENT_PERIOD  64
249 #define SYMBOLS_PER_SEGMENT         832
250 
251 /*
252 * \brief bit rate and segment rate constants used for SER and BER.
253 */
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
263 /*
264 * \brief Min supported symbolrates.
265 */
266 #ifndef DRXJ_QAM_SYMBOLRATE_MIN
267 #define DRXJ_QAM_SYMBOLRATE_MIN          (520000)
268 #endif
269 
270 /*
271 * \brief Max supported symbolrates.
272 */
273 #ifndef DRXJ_QAM_SYMBOLRATE_MAX
274 #define DRXJ_QAM_SYMBOLRATE_MAX         (7233000)
275 #endif
276 
277 /*
278 * \def DRXJ_QAM_MAX_WAITTIME
279 * \brief Maximal wait time for QAM auto constellation in ms
280 */
281 #ifndef DRXJ_QAM_MAX_WAITTIME
282 #define DRXJ_QAM_MAX_WAITTIME 900
283 #endif
284 
285 #ifndef DRXJ_QAM_FEC_LOCK_WAITTIME
286 #define DRXJ_QAM_FEC_LOCK_WAITTIME 150
287 #endif
288 
289 #ifndef DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
290 #define DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME 200
291 #endif
292 
293 /*
294 * \def SCU status and results
295 * \brief SCU
296 */
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 */
301 
302 /*
303 * \def DRX_AUD_MAX_DEVIATION
304 * \brief Needed for calculation of prescale feature in AUD
305 */
306 #ifndef DRXJ_AUD_MAX_FM_DEVIATION
307 #define DRXJ_AUD_MAX_FM_DEVIATION  100	/* kHz */
308 #endif
309 
310 /*
311 * \brief Needed for calculation of NICAM prescale feature in AUD
312 */
313 #ifndef DRXJ_AUD_MAX_NICAM_PRESCALE
314 #define DRXJ_AUD_MAX_NICAM_PRESCALE  (9)	/* dB */
315 #endif
316 
317 /*
318 * \brief Needed for calculation of NICAM prescale feature in AUD
319 */
320 #ifndef DRXJ_AUD_MAX_WAITTIME
321 #define DRXJ_AUD_MAX_WAITTIME  250	/* ms */
322 #endif
323 
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)
330 
331 /* UIO define */
332 #define DRX_UIO_MODE_FIRMWARE_SMA DRX_UIO_MODE_FIRMWARE0
333 #define DRX_UIO_MODE_FIRMWARE_SAW DRX_UIO_MODE_FIRMWARE1
334 
335 /*
336  * MICROCODE RELATED DEFINES
337  */
338 
339 /* Magic word for checking correct Endianness of microcode data */
340 #define DRX_UCODE_MAGIC_WORD         ((((u16)'H')<<8)+((u16)'L'))
341 
342 /* CRC flag in ucode header, flags field. */
343 #define DRX_UCODE_CRC_FLAG           (0x0001)
344 
345 /*
346  * Maximum size of buffer used to verify the microcode.
347  * Must be an even number
348  */
349 #define DRX_UCODE_MAX_BUF_SIZE       (DRXDAP_MAX_RCHUNKSIZE)
350 
351 #if DRX_UCODE_MAX_BUF_SIZE & 1
352 #error DRX_UCODE_MAX_BUF_SIZE must be an even number
353 #endif
354 
355 /*
356  * Power mode macros
357  */
358 
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))
368 
369 /* Pin safe mode macro */
370 #define DRXJ_PIN_SAFE_MODE 0x0000
371 /*============================================================================*/
372 /*=== GLOBAL VARIABLEs =======================================================*/
373 /*============================================================================*/
374 /*
375 */
376 
377 /*
378 * \brief Temporary register definitions.
379 *        (register definitions that are not yet available in register master)
380 */
381 
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     */
386 /* locations                                                                 */
387 /*****************************************************************************/
388 /*
389 * \brief RAM location of MODUS registers
390 */
391 #define AUD_DEM_RAM_MODUS_HI__A              0x10204A3
392 #define AUD_DEM_RAM_MODUS_HI__M              0xF000
393 
394 #define AUD_DEM_RAM_MODUS_LO__A              0x10204A4
395 #define AUD_DEM_RAM_MODUS_LO__M              0x0FFF
396 
397 /*
398 * \brief RAM location of I2S config registers
399 */
400 #define AUD_DEM_RAM_I2S_CONFIG1__A           0x10204B1
401 #define AUD_DEM_RAM_I2S_CONFIG2__A           0x10204B2
402 
403 /*
404 * \brief RAM location of DCO config registers
405 */
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
410 
411 /*
412 * \brief RAM location of Threshold registers
413 */
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
417 
418 /*
419 * \brief RAM location of Carrier Threshold registers
420 */
421 #define AUD_DEM_RAM_CM_A_THRSHLD__A          0x10204AF
422 #define AUD_DEM_RAM_CM_B_THRSHLD__A          0x10204B0
423 
424 /*
425 * \brief FM Matrix register fix
426 */
427 #ifdef AUD_DEM_WR_FM_MATRIX__A
428 #undef  AUD_DEM_WR_FM_MATRIX__A
429 #endif
430 #define AUD_DEM_WR_FM_MATRIX__A              0x105006F
431 
432 /*============================================================================*/
433 /*
434 * \brief Defines required for audio
435 */
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
445 
446 /*
447 * \brief Needed for calculation of prescale feature in AUD
448 */
449 #ifndef DRX_AUD_MAX_FM_DEVIATION
450 #define DRX_AUD_MAX_FM_DEVIATION  (100)	/* kHz */
451 #endif
452 
453 /*
454 * \brief Needed for calculation of NICAM prescale feature in AUD
455 */
456 #ifndef DRX_AUD_MAX_NICAM_PRESCALE
457 #define DRX_AUD_MAX_NICAM_PRESCALE  (9)	/* dB */
458 #endif
459 
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
466 
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
471 
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
476 
477 /*============================================================================*/
478 /*=== REGISTER ACCESS MACROS =================================================*/
479 /*============================================================================*/
480 
481 /*
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)
486 */
487 #define DRXJ_16TO8(x) ((u8) (((u16)x) & 0xFF)), \
488 		       ((u8)((((u16)x)>>8)&0xFF))
489 /*
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.
493 */
494 #define DRXJ_8TO16(x) ((u16) (x[0] | (x[1] << 8)))
495 
496 /*============================================================================*/
497 /*=== MISC DEFINES ===========================================================*/
498 /*============================================================================*/
499 
500 /*============================================================================*/
501 /*=== HI COMMAND RELATED DEFINES =============================================*/
502 /*============================================================================*/
503 
504 /*
505 * \brief General maximum number of retries for ucode command interfaces
506 */
507 #define DRXJ_MAX_RETRIES (100)
508 
509 /*============================================================================*/
510 /*=== STANDARD RELATED MACROS ================================================*/
511 /*============================================================================*/
512 
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))
520 
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))
525 
526 /*-----------------------------------------------------------------------------
527 GLOBAL VARIABLES
528 ----------------------------------------------------------------------------*/
529 /*
530  * DRXJ DAP structures
531  */
532 
533 static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
534 				      u32 addr,
535 				      u16 datasize,
536 				      u8 *data, u32 flags);
537 
538 
539 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
540 						 u32 waddr,
541 						 u32 raddr,
542 						 u16 wdata, u16 *rdata);
543 
544 static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
545 				      u32 addr,
546 				      u16 *data, u32 flags);
547 
548 static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
549 				      u32 addr,
550 				      u32 *data, u32 flags);
551 
552 static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
553 				       u32 addr,
554 				       u16 datasize,
555 				       u8 *data, u32 flags);
556 
557 static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
558 				       u32 addr,
559 				       u16 data, u32 flags);
560 
561 static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
562 				       u32 addr,
563 				       u32 data, u32 flags);
564 
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... */
575 
576 	/* tuner settings */
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                     */
584 
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    */
589 	5,			/* fec_vd_plen         */
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    */
597 
598 	/* HI configuration */
599 	0,			/* hi_cfg_timing_div    */
600 	0,			/* hi_cfg_bridge_delay  */
601 	0,			/* hi_cfg_wake_up_key    */
602 	0,			/* hi_cfg_ctrl         */
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       */
609 	/* FS setting */
610 	0UL,			/* iqm_fs_rate_ofs      */
611 	false,			/* pos_image          */
612 	/* RC setting */
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      */
621 
622 	/* ATV configuration */
623 	0UL,			/* flags cfg changes */
624 	/* shadow of ATV_TOP_EQU0__A */
625 	{-5,
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 */
633 	{-50,
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 */
641 	{210,
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 */
649 	{-160,
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      */
668 	 0x0000,		/* speed               */
669 	 0x0000,		/* top                 */
670 	 0x0000			/* c.o.c.              */
671 	 },
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      */
678 	 0x0000,		/* speed               */
679 	 0x0000,		/* top    (don't care) */
680 	 0x0000			/* c.o.c. (don't care) */
681 	 },
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 */
688 	 0x0000,		/* speed          */
689 	 0x0000,		/* top    (don't care) */
690 	 0x0000			/* c.o.c. (don't care) */
691 	 },
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 */
698 	 0x0000,		/* speed          */
699 	 0x0000,		/* top    (don't care) */
700 	 0x0000			/* c.o.c. (don't care) */
701 	 },
702 	0,			/* qam_pga_cfg */
703 	0,			/* vsb_pga_cfg */
704 	{			/* qam_pre_saw_cfg */
705 	 DRX_STANDARD_ITU_B,	/* standard  */
706 	 0,			/* reference */
707 	 false			/* use_pre_saw */
708 	 },
709 	{			/* vsb_pre_saw_cfg */
710 	 DRX_STANDARD_8VSB,	/* standard  */
711 	 0,			/* reference */
712 	 false			/* use_pre_saw */
713 	 },
714 
715 	/* Version information */
716 #ifndef _CH_
717 	{
718 	 "01234567890",		/* human readable version microcode             */
719 	 "01234567890"		/* human readable version device specific code  */
720 	 },
721 	{
722 	 {			/* struct drx_version for microcode                   */
723 	  DRX_MODULE_UNKNOWN,
724 	  (char *)(NULL),
725 	  0,
726 	  0,
727 	  0,
728 	  (char *)(NULL)
729 	  },
730 	 {			/* struct drx_version for device specific code */
731 	  DRX_MODULE_UNKNOWN,
732 	  (char *)(NULL),
733 	  0,
734 	  0,
735 	  0,
736 	  (char *)(NULL)
737 	  }
738 	 },
739 	{
740 	 {			/* struct drx_version_list for microcode */
741 	  (struct drx_version *) (NULL),
742 	  (struct drx_version_list *) (NULL)
743 	  },
744 	 {			/* struct drx_version_list for device specific code */
745 	  (struct drx_version *) (NULL),
746 	  (struct drx_version_list *) (NULL)
747 	  }
748 	 },
749 #endif
750 	false,			/* smart_ant_inverted */
751 	/* Tracking filter setting for OOB  */
752 	{
753 	 12000,
754 	 9300,
755 	 6600,
756 	 5280,
757 	 3700,
758 	 3000,
759 	 2000,
760 	 0},
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 */
767 
768 	/* Pre SAW & Agc configuration for ATV */
769 	{
770 	 DRX_STANDARD_NTSC,	/* standard     */
771 	 7,			/* reference    */
772 	 true			/* use_pre_saw    */
773 	 },
774 	{			/* ATV RF-AGC */
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.) */
780 	 3,			/* speed                 */
781 	 9500,			/* top                   */
782 	 4000			/* cut-off current       */
783 	 },
784 	{			/* ATV IF-AGC */
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.) */
790 	 3,			/* speed                 */
791 	 2400,			/* top                   */
792 	 0			/* c.o.c.         (d.c.) */
793 	 },
794 	140,			/* ATV PGA config */
795 	0,			/* curr_symbol_rate */
796 
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 */
802 
803 	4,			/* oob_pre_saw            */
804 	DRXJ_OOB_LO_POW_MINUS10DB,	/* oob_lo_pow             */
805 	{
806 	 false			/* aud_data, only first member */
807 	 },
808 };
809 
810 /*
811 * \var drxj_default_addr_g
812 * \brief Default I2C address and device identifier.
813 */
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 */
817 };
818 
819 /*
820 * \var drxj_default_comm_attr_g
821 * \brief Default common attributes of a drxj demodulator instance.
822 */
823 static struct drx_common_attr drxj_default_comm_attr_g = {
824 	NULL,			/* ucode file           */
825 	true,			/* ucode verify switch  */
826 	{0},			/* version record       */
827 
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            */
833 	{
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 */
849 	 },
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 */
854 
855 	/* SCAN */
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               */
866 	false,
867 
868 	/* Power management */
869 	DRX_POWER_UP,
870 
871 	/* Tuner */
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                     */
878 
879 	{			/* current channel (all 0)             */
880 	 0UL			/* channel.frequency */
881 	 },
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 */
887 	0			/* mfx */
888 };
889 
890 /*
891 * \var drxj_default_demod_g
892 * \brief Default drxj demodulator instance.
893 */
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 */
898 };
899 
900 /*
901 * \brief Default audio data structure for DRK demodulator instance.
902 *
903 * This structure is DRXK specific.
904 *
905 */
906 static struct drx_aud_data drxj_default_aud_data_g = {
907 	false,			/* audio_is_active */
908 	DRX_AUD_STANDARD_AUTO,	/* audio_standard  */
909 
910 	/* i2sdata */
911 	{
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         */
918 	 },
919 	/* volume            */
920 	{
921 	 true,			/* mute;          */
922 	 0,			/* volume         */
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  */
929 	 },
930 	DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_ON,	/* auto_sound */
931 	/*  ass_thresholds */
932 	{
933 	 440,			/* A2    */
934 	 12,			/* BTSC  */
935 	 700,			/* NICAM */
936 	 },
937 	/* carrier */
938 	{
939 	 /* a */
940 	 {
941 	  42,			/* thres */
942 	  DRX_NO_CARRIER_NOISE,	/* opt   */
943 	  0,			/* shift */
944 	  0			/* dco   */
945 	  },
946 	 /* b */
947 	 {
948 	  42,			/* thres */
949 	  DRX_NO_CARRIER_MUTE,	/* opt   */
950 	  0,			/* shift */
951 	  0			/* dco   */
952 	  },
953 
954 	 },
955 	/* mixer */
956 	{
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  */
960 	 },
961 	DRX_AUD_DEVIATION_NORMAL,	/* deviation */
962 	DRX_AUD_AVSYNC_OFF,	/* av_sync */
963 
964 	/* prescale */
965 	{
966 	 DRX_AUD_MAX_FM_DEVIATION,	/* fm_deviation */
967 	 DRX_AUD_MAX_NICAM_PRESCALE	/* nicam_gain */
968 	 },
969 	DRX_AUD_FM_DEEMPH_75US,	/* deemph */
970 	DRX_BTSC_STEREO,	/* btsc_detect */
971 	0,			/* rds_data_counter */
972 	false			/* rds_data_present */
973 };
974 
975 /*-----------------------------------------------------------------------------
976 STRUCTURES
977 ----------------------------------------------------------------------------*/
978 struct drxjeq_stat {
979 	u16 eq_mse;
980 	u8 eq_mode;
981 	u8 eq_ctrl;
982 	u8 eq_stat;
983 };
984 
985 /* HI command */
986 struct drxj_hi_cmd {
987 	u16 cmd;
988 	u16 param1;
989 	u16 param2;
990 	u16 param3;
991 	u16 param4;
992 	u16 param5;
993 	u16 param6;
994 };
995 
996 /*============================================================================*/
997 /*=== MICROCODE RELATED STRUCTURES ===========================================*/
998 /*============================================================================*/
999 
1000 /*
1001  * struct drxu_code_block_hdr - Structure of the microcode block headers
1002  *
1003  * @addr:	Destination address of the data in this block
1004  * @size:	Size of the block data following this header counted in
1005  *		16 bits words
1006  * @CRC:	CRC value of the data block, only valid if CRC flag is
1007  *		set.
1008  */
1009 struct drxu_code_block_hdr {
1010 	u32 addr;
1011 	u16 size;
1012 	u16 flags;
1013 	u16 CRC;
1014 };
1015 
1016 /*-----------------------------------------------------------------------------
1017 FUNCTIONS
1018 ----------------------------------------------------------------------------*/
1019 /* Some prototypes */
1020 static int
1021 hi_command(struct i2c_device_addr *dev_addr,
1022 	   const struct drxj_hi_cmd *cmd, u16 *result);
1023 
1024 static int
1025 ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat);
1026 
1027 static int
1028 ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode);
1029 
1030 static int power_down_aud(struct drx_demod_instance *demod);
1031 
1032 static int
1033 ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw);
1034 
1035 static int
1036 ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain);
1037 
1038 /*============================================================================*/
1039 /*============================================================================*/
1040 /*==                          HELPER FUNCTIONS                              ==*/
1041 /*============================================================================*/
1042 /*============================================================================*/
1043 
1044 
1045 /*============================================================================*/
1046 
1047 /*
1048 * \fn u32 frac28(u32 N, u32 D)
1049 * \brief Compute: (1<<28)*N/D
1050 * \param N 32 bits
1051 * \param D 32 bits
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.
1055 
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.
1060 
1061 * Usage condition: ((1<<28)*n)/d < ((1<<32)-1) => (n/d) < 15.999
1062 
1063 * N: 0...(1<<28)-1 = 268435454
1064 * D: 0...(1<<28)-1
1065 * Q: 0...(1<<32)-1
1066 */
1067 static u32 frac28(u32 N, u32 D)
1068 {
1069 	int i = 0;
1070 	u32 Q1 = 0;
1071 	u32 R0 = 0;
1072 
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 */
1076 
1077 	/* division using radix 16, 7 nibbles in the result */
1078 	for (i = 0; i < 7; i++) {
1079 		Q1 = (Q1 << 4) | R0 / D;
1080 		R0 = (R0 % D) << 4;
1081 	}
1082 	/* rounding */
1083 	if ((R0 >> 3) >= D)
1084 		Q1++;
1085 
1086 	return Q1;
1087 }
1088 
1089 /*
1090 * \fn u32 log1_times100( u32 x)
1091 * \brief Compute: 100*log10(x)
1092 * \param x 32 bits
1093 * \return 100*log10(x)
1094 *
1095 * 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
1101 *
1102 * where y = 2^k and 1<= (x/y) < 2
1103 */
1104 
1105 static u32 log1_times100(u32 x)
1106 {
1107 	static const u8 scale = 15;
1108 	static const u8 index_width = 5;
1109 	/*
1110 	   log2lut[n] = (1<<scale) * 200 * log2( 1.0 + ( (1.0/(1<<INDEXWIDTH)) * n ))
1111 	   0 <= n < ((1<<INDEXWIDTH)+1)
1112 	 */
1113 
1114 	static const u32 log2lut[] = {
1115 		0,		/* 0.000000 */
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 */
1148 	};
1149 
1150 	u8 i = 0;
1151 	u32 y = 0;
1152 	u32 d = 0;
1153 	u32 k = 0;
1154 	u32 r = 0;
1155 
1156 	if (x == 0)
1157 		return 0;
1158 
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))
1164 				break;
1165 			x <<= 1;
1166 		}
1167 	} else {
1168 		for (k = scale; k < 31; k++) {
1169 			if ((x & (((u32) (-1)) << (scale + 1))) == 0)
1170 				break;
1171 			x >>= 1;
1172 		}
1173 	}
1174 	/*
1175 	   Now x has binary point between bit[scale] and bit[scale-1]
1176 	   and 1.0 <= x < 2.0 */
1177 
1178 	/* correction for division: log(x) = log(x/y)+log(y) */
1179 	y = k * ((((u32) 1) << scale) * 200);
1180 
1181 	/* remove integer part */
1182 	x &= ((((u32) 1) << scale) - 1);
1183 	/* get index */
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 ! */
1188 	y += log2lut[i] +
1189 	    ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - index_width));
1190 	/* Conver to log10() */
1191 	y /= 108853;		/* (log2(10) << scale) */
1192 	r = (y >> 1);
1193 	/* rounding */
1194 	if (y & ((u32)1))
1195 		r++;
1196 
1197 	return r;
1198 
1199 }
1200 
1201 /*
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.
1206 * \return u32
1207 * \retval ((N/D) * 1000000), 32 bits
1208 *
1209 * No check on D=0!
1210 */
1211 static u32 frac_times1e6(u32 N, u32 D)
1212 {
1213 	u32 remainder = 0;
1214 	u32 frac = 0;
1215 
1216 	/*
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.
1222 	 */
1223 	frac = (((u32) N) * (1000000 >> 4)) / D;
1224 	frac <<= 4;
1225 	remainder = (((u32) N) * (1000000 >> 4)) % D;
1226 	remainder <<= 4;
1227 	frac += remainder / D;
1228 	remainder = remainder % D;
1229 	if ((remainder * 2) > D)
1230 		frac++;
1231 
1232 	return frac;
1233 }
1234 
1235 /*============================================================================*/
1236 
1237 
1238 /*
1239 * \brief Values for NICAM prescaler gain. Computed from dB to integer
1240 *        and rounded. For calc used formula: 16*10^(prescaleGain[dB]/20).
1241 *
1242 */
1243 #if 0
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
1250 };
1251 #endif
1252 
1253 /*============================================================================*/
1254 /*==                        END HELPER FUNCTIONS                            ==*/
1255 /*============================================================================*/
1256 
1257 /*============================================================================*/
1258 /*============================================================================*/
1259 /*==                      DRXJ DAP FUNCTIONS                                ==*/
1260 /*============================================================================*/
1261 /*============================================================================*/
1262 
1263 /*
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.
1270 
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.
1275 
1276    TODO: check ignoring single/multimaster is ok for AUD access ?
1277 */
1278 
1279 #define DRXJ_ISAUDWRITE(addr) (((((addr)>>16)&1) == 1) ? true : false)
1280 #define DRXJ_DAP_AUDTRIF_TIMEOUT 80	/* millisec */
1281 /*============================================================================*/
1282 
1283 /*
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.
1286 * \param addr
1287 * \return bool
1288 * \retval true  Yes, handled by audio token ring interface
1289 * \retval false No, not handled by audio token ring interface
1290 *
1291 */
1292 static
1293 bool is_handled_by_aud_tr_if(u32 addr)
1294 {
1295 	bool retval = false;
1296 
1297 	if ((DRXDAP_FASI_ADDR2BLOCK(addr) == 4) &&
1298 	    (DRXDAP_FASI_ADDR2BANK(addr) > 1) &&
1299 	    (DRXDAP_FASI_ADDR2BANK(addr) < 6)) {
1300 		retval = true;
1301 	}
1302 
1303 	return retval;
1304 }
1305 
1306 /*============================================================================*/
1307 
1308 int drxbsp_i2c_write_read(struct i2c_device_addr *w_dev_addr,
1309 				 u16 w_count,
1310 				 u8 *wData,
1311 				 struct i2c_device_addr *r_dev_addr,
1312 				 u16 r_count, u8 *r_data)
1313 {
1314 	struct drx39xxj_state *state;
1315 	struct i2c_msg msg[2];
1316 	unsigned int num_msgs;
1317 
1318 	if (w_dev_addr == NULL) {
1319 		/* Read only */
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;
1325 		num_msgs = 1;
1326 	} else if (r_dev_addr == NULL) {
1327 		/* Write only */
1328 		state = w_dev_addr->user_data;
1329 		msg[0].addr = w_dev_addr->i2c_addr >> 1;
1330 		msg[0].flags = 0;
1331 		msg[0].buf = wData;
1332 		msg[0].len = w_count;
1333 		num_msgs = 1;
1334 	} else {
1335 		/* Both write and read */
1336 		state = w_dev_addr->user_data;
1337 		msg[0].addr = w_dev_addr->i2c_addr >> 1;
1338 		msg[0].flags = 0;
1339 		msg[0].buf = wData;
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;
1345 		num_msgs = 2;
1346 	}
1347 
1348 	if (state->i2c == NULL) {
1349 		pr_err("i2c was zero, aborting\n");
1350 		return 0;
1351 	}
1352 	if (i2c_transfer(state->i2c, msg, num_msgs) != num_msgs) {
1353 		pr_warn("drx3933: I2C write/read failed\n");
1354 		return -EREMOTEIO;
1355 	}
1356 
1357 #ifdef DJH_DEBUG
1358 	if (w_dev_addr == NULL || r_dev_addr == NULL)
1359 		return 0;
1360 
1361 	state = w_dev_addr->user_data;
1362 
1363 	if (state->i2c == NULL)
1364 		return 0;
1365 
1366 	msg[0].addr = w_dev_addr->i2c_addr;
1367 	msg[0].flags = 0;
1368 	msg[0].buf = wData;
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;
1374 	num_msgs = 2;
1375 
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);
1378 
1379 	if (i2c_transfer(state->i2c, msg, 2) != 2) {
1380 		pr_warn("drx3933: I2C write/read failed\n");
1381 		return -EREMOTEIO;
1382 	}
1383 #endif
1384 	return 0;
1385 }
1386 
1387 /*============================================================================*/
1388 
1389 /*****************************
1390 *
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
1397 *
1398 * Read block data from chip address. Because the chip is word oriented,
1399 * the number of bytes to read must be even.
1400 *
1401 * Make sure that the buffer to receive the data is large enough.
1402 *
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.
1406 *
1407 * Output:
1408 * - 0     if reading was successful
1409 *                  in that case: data read is in *data.
1410 * - -EIO  if anything went wrong
1411 *
1412 ******************************/
1413 
1414 static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
1415 					 u32 addr,
1416 					 u16 datasize,
1417 					 u8 *data, u32 flags)
1418 {
1419 	u8 buf[4];
1420 	u16 bufx;
1421 	int rc;
1422 	u16 overhead_size = 0;
1423 
1424 	/* Check parameters ******************************************************* */
1425 	if (dev_addr == NULL)
1426 		return -EINVAL;
1427 
1428 	overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
1429 	    (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
1430 
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)) {
1436 		return -EINVAL;
1437 	}
1438 
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;
1443 #endif
1444 
1445 	/* Read block from I2C **************************************************** */
1446 	do {
1447 		u16 todo = (datasize < DRXDAP_MAX_RCHUNKSIZE ?
1448 			      datasize : DRXDAP_MAX_RCHUNKSIZE);
1449 
1450 		bufx = 0;
1451 
1452 		addr &= ~DRXDAP_FASI_FLAGS;
1453 		addr |= flags;
1454 
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)) {
1458 #endif
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);
1464 #endif
1465 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1466 		} else {
1467 #endif
1468 #if (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)
1469 			buf[bufx++] = (u8) ((addr << 1) & 0xFF);
1470 			buf[bufx++] =
1471 			    (u8) (((addr >> 16) & 0x0F) |
1472 				    ((addr >> 18) & 0xF0));
1473 #endif
1474 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1475 		}
1476 #endif
1477 
1478 #if DRXDAP_SINGLE_MASTER
1479 		/*
1480 		 * In single master mode, split the read and write actions.
1481 		 * No special action is needed for write chunks here.
1482 		 */
1483 		rc = drxbsp_i2c_write_read(dev_addr, bufx, buf,
1484 					   NULL, 0, NULL);
1485 		if (rc == 0)
1486 			rc = drxbsp_i2c_write_read(NULL, 0, NULL, dev_addr, todo, data);
1487 #else
1488 		/* In multi master mode, do everything in one RW action */
1489 		rc = drxbsp_i2c_write_read(dev_addr, bufx, buf, dev_addr, todo,
1490 					  data);
1491 #endif
1492 		data += todo;
1493 		addr += (todo >> 1);
1494 		datasize -= todo;
1495 	} while (datasize && rc == 0);
1496 
1497 	return rc;
1498 }
1499 
1500 
1501 /*****************************
1502 *
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
1508 *
1509 * Read one 16-bit register or memory location. The data received back is
1510 * converted back to the target platform's endianness.
1511 *
1512 * Output:
1513 * - 0     if reading was successful
1514 *                  in that case: read data is at *data
1515 * - -EIO  if anything went wrong
1516 *
1517 ******************************/
1518 
1519 static int drxdap_fasi_read_reg16(struct i2c_device_addr *dev_addr,
1520 					 u32 addr,
1521 					 u16 *data, u32 flags)
1522 {
1523 	u8 buf[sizeof(*data)];
1524 	int rc;
1525 
1526 	if (!data)
1527 		return -EINVAL;
1528 
1529 	rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags);
1530 	*data = buf[0] + (((u16) buf[1]) << 8);
1531 	return rc;
1532 }
1533 
1534 /*****************************
1535 *
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
1541 *
1542 * Read one 32-bit register or memory location. The data received back is
1543 * converted back to the target platform's endianness.
1544 *
1545 * Output:
1546 * - 0     if reading was successful
1547 *                  in that case: read data is at *data
1548 * - -EIO  if anything went wrong
1549 *
1550 ******************************/
1551 
1552 static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
1553 					 u32 addr,
1554 					 u32 *data, u32 flags)
1555 {
1556 	u8 buf[sizeof(*data)];
1557 	int rc;
1558 
1559 	if (!data)
1560 		return -EINVAL;
1561 
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);
1566 	return rc;
1567 }
1568 
1569 /*****************************
1570 *
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
1577 *
1578 * Write block data to chip address. Because the chip is word oriented,
1579 * the number of bytes to write must be even.
1580 *
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.
1584 *
1585 * Output:
1586 * - 0     if writing was successful
1587 * - -EIO  if anything went wrong
1588 *
1589 ******************************/
1590 
1591 static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
1592 					  u32 addr,
1593 					  u16 datasize,
1594 					  u8 *data, u32 flags)
1595 {
1596 	u8 buf[DRXDAP_MAX_WCHUNKSIZE];
1597 	int st = -EIO;
1598 	int first_err = 0;
1599 	u16 overhead_size = 0;
1600 	u16 block_size = 0;
1601 
1602 	/* Check parameters ******************************************************* */
1603 	if (dev_addr == NULL)
1604 		return -EINVAL;
1605 
1606 	overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
1607 	    (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
1608 
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))
1614 		return -EINVAL;
1615 
1616 	flags &= DRXDAP_FASI_FLAGS;
1617 	flags &= ~DRXDAP_FASI_MODEFLAGS;
1618 #if DRXDAP_SINGLE_MASTER
1619 	flags |= DRXDAP_FASI_SINGLE_MASTER;
1620 #endif
1621 
1622 	/* Write block to I2C ***************************************************** */
1623 	block_size = ((DRXDAP_MAX_WCHUNKSIZE) - overhead_size) & ~1;
1624 	do {
1625 		u16 todo = 0;
1626 		u16 bufx = 0;
1627 
1628 		/* Buffer device address */
1629 		addr &= ~DRXDAP_FASI_FLAGS;
1630 		addr |= 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)) {
1634 #endif
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);
1640 #endif
1641 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1642 		} else {
1643 #endif
1644 #if ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1)
1645 			buf[bufx++] = (u8) ((addr << 1) & 0xFF);
1646 			buf[bufx++] =
1647 			    (u8) (((addr >> 16) & 0x0F) |
1648 				    ((addr >> 18) & 0xF0));
1649 #endif
1650 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1651 		}
1652 #endif
1653 
1654 		/*
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
1660 		   expects an address.
1661 		 */
1662 		todo = (block_size < datasize ? block_size : datasize);
1663 		if (todo == 0) {
1664 			u16 overhead_size_i2c_addr = 0;
1665 			u16 data_block_size = 0;
1666 
1667 			overhead_size_i2c_addr =
1668 			    (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1);
1669 			data_block_size =
1670 			    (DRXDAP_MAX_WCHUNKSIZE - overhead_size_i2c_addr) & ~1;
1671 
1672 			/* write device address */
1673 			st = drxbsp_i2c_write_read(dev_addr,
1674 						  (u16) (bufx),
1675 						  buf,
1676 						  (struct i2c_device_addr *)(NULL),
1677 						  0, (u8 *)(NULL));
1678 
1679 			if ((st != 0) && (first_err == 0)) {
1680 				/* at the end, return the first error encountered */
1681 				first_err = st;
1682 			}
1683 			bufx = 0;
1684 			todo =
1685 			    (data_block_size <
1686 			     datasize ? data_block_size : datasize);
1687 		}
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),
1692 					  buf,
1693 					  (struct i2c_device_addr *)(NULL),
1694 					  0, (u8 *)(NULL));
1695 
1696 		if ((st != 0) && (first_err == 0)) {
1697 			/* at the end, return the first error encountered */
1698 			first_err = st;
1699 		}
1700 		datasize -= todo;
1701 		data += todo;
1702 		addr += (todo >> 1);
1703 	} while (datasize);
1704 
1705 	return first_err;
1706 }
1707 
1708 /*****************************
1709 *
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
1715 *
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.
1718 *
1719 * Output:
1720 * - 0     if writing was successful
1721 * - -EIO  if anything went wrong
1722 *
1723 ******************************/
1724 
1725 static int drxdap_fasi_write_reg16(struct i2c_device_addr *dev_addr,
1726 					  u32 addr,
1727 					  u16 data, u32 flags)
1728 {
1729 	u8 buf[sizeof(data)];
1730 
1731 	buf[0] = (u8) ((data >> 0) & 0xFF);
1732 	buf[1] = (u8) ((data >> 8) & 0xFF);
1733 
1734 	return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
1735 }
1736 
1737 /*****************************
1738 *
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
1745 *
1746 * Write 16-bit data, then read back the original contents of that location.
1747 * Requires long addressing format to be allowed.
1748 *
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.
1751 *
1752 * WARNING: This function is only guaranteed to work if there is one
1753 * master on the I2C bus.
1754 *
1755 * Output:
1756 * - 0     if reading was successful
1757 *                  in that case: read back data is at *rdata
1758 * - -EIO  if anything went wrong
1759 *
1760 ******************************/
1761 
1762 static int drxdap_fasi_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
1763 						    u32 waddr,
1764 						    u32 raddr,
1765 						    u16 wdata, u16 *rdata)
1766 {
1767 	int rc = -EIO;
1768 
1769 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1770 	if (rdata == NULL)
1771 		return -EINVAL;
1772 
1773 	rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata, DRXDAP_FASI_RMW);
1774 	if (rc == 0)
1775 		rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata, 0);
1776 #endif
1777 
1778 	return rc;
1779 }
1780 
1781 /*****************************
1782 *
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
1788 *
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.
1791 *
1792 * Output:
1793 * - 0     if writing was successful
1794 * - -EIO  if anything went wrong
1795 *
1796 ******************************/
1797 
1798 static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
1799 					  u32 addr,
1800 					  u32 data, u32 flags)
1801 {
1802 	u8 buf[sizeof(data)];
1803 
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);
1808 
1809 	return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
1810 }
1811 
1812 /*============================================================================*/
1813 
1814 /*
1815 * \fn int drxj_dap_rm_write_reg16short
1816 * \brief Read modify write 16 bits audio register using short format only.
1817 * \param dev_addr
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
1822 * \return int
1823 * \retval 0 Success
1824 * \retval -EIO Timeout, I2C error, illegal bank
1825 *
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.
1829 *
1830 */
1831 
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,
1836 					      u32 waddr,
1837 					      u32 raddr,
1838 					      u16 wdata, u16 *rdata)
1839 {
1840 	int rc;
1841 
1842 	if (rdata == NULL)
1843 		return -EINVAL;
1844 
1845 	/* Set RMW flag */
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,
1849 					      0x0000);
1850 	if (rc == 0) {
1851 		/* Write new data: triggers RMW */
1852 		rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata,
1853 						      0x0000);
1854 	}
1855 	if (rc == 0) {
1856 		/* Read old data */
1857 		rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata,
1858 						     0x0000);
1859 	}
1860 	if (rc == 0) {
1861 		/* Reset RMW flag */
1862 		rc = drxdap_fasi_write_reg16(dev_addr,
1863 						      SIO_HI_RA_RAM_S0_FLG_ACC__A,
1864 						      0, 0x0000);
1865 	}
1866 
1867 	return rc;
1868 }
1869 #endif
1870 
1871 /*============================================================================*/
1872 
1873 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
1874 						 u32 waddr,
1875 						 u32 raddr,
1876 						 u16 wdata, u16 *rdata)
1877 {
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,
1883 							  waddr,
1884 							  raddr, wdata, rdata);
1885 #else
1886 	return drxj_dap_rm_write_reg16short(dev_addr, waddr, raddr, wdata, rdata);
1887 #endif
1888 }
1889 
1890 
1891 /*============================================================================*/
1892 
1893 /*
1894 * \fn int drxj_dap_read_aud_reg16
1895 * \brief Read 16 bits audio register
1896 * \param dev_addr
1897 * \param addr
1898 * \param data
1899 * \return int
1900 * \retval 0 Success
1901 * \retval -EIO Timeout, I2C error, illegal bank
1902 *
1903 * 16 bits register read access via audio token ring interface.
1904 *
1905 */
1906 static int drxj_dap_read_aud_reg16(struct i2c_device_addr *dev_addr,
1907 					 u32 addr, u16 *data)
1908 {
1909 	u32 start_timer = 0;
1910 	u32 current_timer = 0;
1911 	u32 delta_timer = 0;
1912 	u16 tr_status = 0;
1913 	int stat = -EIO;
1914 
1915 	/* No read possible for bank 3, return with error */
1916 	if (DRXDAP_FASI_ADDR2BANK(addr) == 3) {
1917 		stat = -EINVAL;
1918 	} else {
1919 		const u32 write_bit = ((dr_xaddr_t) 1) << 16;
1920 
1921 		/* Force reset write bit */
1922 		addr &= (~write_bit);
1923 
1924 		/* Set up read */
1925 		start_timer = jiffies_to_msecs(jiffies);
1926 		do {
1927 			/* RMW to aud TR IF until request is granted or timeout */
1928 			stat = drxj_dap_read_modify_write_reg16(dev_addr,
1929 							     addr,
1930 							     SIO_HI_RA_RAM_S0_RMWBUF__A,
1931 							     0x0000, &tr_status);
1932 
1933 			if (stat != 0)
1934 				break;
1935 
1936 			current_timer = jiffies_to_msecs(jiffies);
1937 			delta_timer = current_timer - start_timer;
1938 			if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
1939 				stat = -EIO;
1940 				break;
1941 			}
1942 
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 ) */
1948 
1949 	/* Wait for read ready status or timeout */
1950 	if (stat == 0) {
1951 		start_timer = jiffies_to_msecs(jiffies);
1952 
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,
1956 						  AUD_TOP_TR_CTR__A,
1957 						  &tr_status, 0x0000);
1958 			if (stat != 0)
1959 				break;
1960 
1961 			current_timer = jiffies_to_msecs(jiffies);
1962 			delta_timer = current_timer - start_timer;
1963 			if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
1964 				stat = -EIO;
1965 				break;
1966 			}
1967 		}		/* while ( ... ) */
1968 	}
1969 
1970 	/* Read value */
1971 	if (stat == 0)
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,
1975 						     0x0000, data);
1976 	return stat;
1977 }
1978 
1979 /*============================================================================*/
1980 
1981 static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
1982 				      u32 addr,
1983 				      u16 *data, u32 flags)
1984 {
1985 	int stat = -EIO;
1986 
1987 	/* Check param */
1988 	if ((dev_addr == NULL) || (data == NULL))
1989 		return -EINVAL;
1990 
1991 	if (is_handled_by_aud_tr_if(addr))
1992 		stat = drxj_dap_read_aud_reg16(dev_addr, addr, data);
1993 	else
1994 		stat = drxdap_fasi_read_reg16(dev_addr, addr, data, flags);
1995 
1996 	return stat;
1997 }
1998 /*============================================================================*/
1999 
2000 /*
2001 * \fn int drxj_dap_write_aud_reg16
2002 * \brief Write 16 bits audio register
2003 * \param dev_addr
2004 * \param addr
2005 * \param data
2006 * \return int
2007 * \retval 0 Success
2008 * \retval -EIO Timeout, I2C error, illegal bank
2009 *
2010 * 16 bits register write access via audio token ring interface.
2011 *
2012 */
2013 static int drxj_dap_write_aud_reg16(struct i2c_device_addr *dev_addr,
2014 					  u32 addr, u16 data)
2015 {
2016 	int stat = -EIO;
2017 
2018 	/* No write possible for bank 2, return with error */
2019 	if (DRXDAP_FASI_ADDR2BANK(addr) == 2) {
2020 		stat = -EINVAL;
2021 	} else {
2022 		u32 start_timer = 0;
2023 		u32 current_timer = 0;
2024 		u32 delta_timer = 0;
2025 		u16 tr_status = 0;
2026 		const u32 write_bit = ((dr_xaddr_t) 1) << 16;
2027 
2028 		/* Force write bit */
2029 		addr |= write_bit;
2030 		start_timer = jiffies_to_msecs(jiffies);
2031 		do {
2032 			/* RMW to aud TR IF until request is granted or timeout */
2033 			stat = drxj_dap_read_modify_write_reg16(dev_addr,
2034 							     addr,
2035 							     SIO_HI_RA_RAM_S0_RMWBUF__A,
2036 							     data, &tr_status);
2037 			if (stat != 0)
2038 				break;
2039 
2040 			current_timer = jiffies_to_msecs(jiffies);
2041 			delta_timer = current_timer - start_timer;
2042 			if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
2043 				stat = -EIO;
2044 				break;
2045 			}
2046 
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));
2051 
2052 	}			/* if ( DRXDAP_FASI_ADDR2BANK(addr)!=2 ) */
2053 
2054 	return stat;
2055 }
2056 
2057 /*============================================================================*/
2058 
2059 static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
2060 				       u32 addr,
2061 				       u16 data, u32 flags)
2062 {
2063 	int stat = -EIO;
2064 
2065 	/* Check param */
2066 	if (dev_addr == NULL)
2067 		return -EINVAL;
2068 
2069 	if (is_handled_by_aud_tr_if(addr))
2070 		stat = drxj_dap_write_aud_reg16(dev_addr, addr, data);
2071 	else
2072 		stat = drxdap_fasi_write_reg16(dev_addr,
2073 							    addr, data, flags);
2074 
2075 	return stat;
2076 }
2077 
2078 /*============================================================================*/
2079 
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
2083 
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
2088 
2089 /*
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
2096 * \return int
2097 * \retval 0 Success
2098 * \retval -EIO Timeout, I2C error, illegal bank
2099 *
2100 */
2101 static
2102 int drxj_dap_atomic_read_write_block(struct i2c_device_addr *dev_addr,
2103 					  u32 addr,
2104 					  u16 datasize,
2105 					  u8 *data, bool read_flag)
2106 {
2107 	struct drxj_hi_cmd hi_cmd;
2108 	int rc;
2109 	u16 word;
2110 	u16 dummy = 0;
2111 	u16 i = 0;
2112 
2113 	/* Parameter check */
2114 	if (!data || !dev_addr || ((datasize % 2)) || ((datasize / 2) > 8))
2115 		return -EINVAL;
2116 
2117 	/* Set up HI parameters to read or write n bytes */
2118 	hi_cmd.cmd = SIO_HI_RA_RAM_CMD_ATOMIC_COPY;
2119 	hi_cmd.param1 =
2120 	    (u16) ((DRXDAP_FASI_ADDR2BLOCK(DRXJ_HI_ATOMIC_BUF_START) << 6) +
2121 		     DRXDAP_FASI_ADDR2BANK(DRXJ_HI_ATOMIC_BUF_START));
2122 	hi_cmd.param2 =
2123 	    (u16) DRXDAP_FASI_ADDR2OFFSET(DRXJ_HI_ATOMIC_BUF_START);
2124 	hi_cmd.param3 = (u16) ((datasize / 2) - 1);
2125 	if (!read_flag)
2126 		hi_cmd.param3 |= DRXJ_HI_ATOMIC_WRITE;
2127 	else
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);
2132 
2133 	if (!read_flag) {
2134 		/* write data to buffer */
2135 		for (i = 0; i < (datasize / 2); i++) {
2136 
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),
2141 					    word, 0);
2142 		}
2143 	}
2144 
2145 	rc = hi_command(dev_addr, &hi_cmd, &dummy);
2146 	if (rc != 0) {
2147 		pr_err("error %d\n", rc);
2148 		goto rw_error;
2149 	}
2150 
2151 	if (read_flag) {
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),
2156 						 &word, 0);
2157 			if (rc) {
2158 				pr_err("error %d\n", rc);
2159 				goto rw_error;
2160 			}
2161 			data[2 * i] = (u8) (word & 0xFF);
2162 			data[(2 * i) + 1] = (u8) (word >> 8);
2163 		}
2164 	}
2165 
2166 	return 0;
2167 
2168 rw_error:
2169 	return rc;
2170 
2171 }
2172 
2173 /*============================================================================*/
2174 
2175 /*
2176 * \fn int drxj_dap_atomic_read_reg32()
2177 * \brief Atomic read of 32 bits words
2178 */
2179 static
2180 int drxj_dap_atomic_read_reg32(struct i2c_device_addr *dev_addr,
2181 				     u32 addr,
2182 				     u32 *data, u32 flags)
2183 {
2184 	u8 buf[sizeof(*data)] = { 0 };
2185 	int rc;
2186 	u32 word = 0;
2187 
2188 	if (!data)
2189 		return -EINVAL;
2190 
2191 	rc = drxj_dap_atomic_read_write_block(dev_addr, addr,
2192 					      sizeof(*data), buf, true);
2193 
2194 	if (rc < 0)
2195 		return 0;
2196 
2197 	word = (u32) buf[3];
2198 	word <<= 8;
2199 	word |= (u32) buf[2];
2200 	word <<= 8;
2201 	word |= (u32) buf[1];
2202 	word <<= 8;
2203 	word |= (u32) buf[0];
2204 
2205 	*data = word;
2206 
2207 	return rc;
2208 }
2209 
2210 /*============================================================================*/
2211 
2212 /*============================================================================*/
2213 /*==                        END DRXJ DAP FUNCTIONS                          ==*/
2214 /*============================================================================*/
2215 
2216 /*============================================================================*/
2217 /*============================================================================*/
2218 /*==                      HOST INTERFACE FUNCTIONS                          ==*/
2219 /*============================================================================*/
2220 /*============================================================================*/
2221 
2222 /*
2223 * \fn int hi_cfg_command()
2224 * \brief Configure HI with settings stored in the demod structure.
2225 * \param demod Demodulator.
2226 * \return int.
2227 *
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.
2231 *
2232 */
2233 static int hi_cfg_command(const struct drx_demod_instance *demod)
2234 {
2235 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2236 	struct drxj_hi_cmd hi_cmd;
2237 	u16 result = 0;
2238 	int rc;
2239 
2240 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
2241 
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;
2249 
2250 	rc = hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
2251 	if (rc != 0) {
2252 		pr_err("error %d\n", rc);
2253 		goto rw_error;
2254 	}
2255 
2256 	/* Reset power down flag (set one call only) */
2257 	ext_attr->hi_cfg_ctrl &= (~(SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2258 
2259 	return 0;
2260 
2261 rw_error:
2262 	return rc;
2263 }
2264 
2265 /*
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.
2271 * \return int.
2272 *
2273 * Sends command to HI
2274 *
2275 */
2276 static int
2277 hi_command(struct i2c_device_addr *dev_addr, const struct drxj_hi_cmd *cmd, u16 *result)
2278 {
2279 	u16 wait_cmd = 0;
2280 	u16 nr_retries = 0;
2281 	bool powerdown_cmd = false;
2282 	int rc;
2283 
2284 	/* Write parameters */
2285 	switch (cmd->cmd) {
2286 
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);
2290 		if (rc != 0) {
2291 			pr_err("error %d\n", rc);
2292 			goto rw_error;
2293 		}
2294 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_5__A, cmd->param5, 0);
2295 		if (rc != 0) {
2296 			pr_err("error %d\n", rc);
2297 			goto rw_error;
2298 		}
2299 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_4__A, cmd->param4, 0);
2300 		if (rc != 0) {
2301 			pr_err("error %d\n", rc);
2302 			goto rw_error;
2303 		}
2304 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_3__A, cmd->param3, 0);
2305 		if (rc != 0) {
2306 			pr_err("error %d\n", rc);
2307 			goto rw_error;
2308 		}
2309 		fallthrough;
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);
2312 		if (rc != 0) {
2313 			pr_err("error %d\n", rc);
2314 			goto rw_error;
2315 		}
2316 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_1__A, cmd->param1, 0);
2317 		if (rc != 0) {
2318 			pr_err("error %d\n", rc);
2319 			goto rw_error;
2320 		}
2321 		fallthrough;
2322 	case SIO_HI_RA_RAM_CMD_NULL:
2323 		/* No parameters */
2324 		break;
2325 
2326 	default:
2327 		return -EINVAL;
2328 	}
2329 
2330 	/* Write command */
2331 	rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, cmd->cmd, 0);
2332 	if (rc != 0) {
2333 		pr_err("error %d\n", rc);
2334 		goto rw_error;
2335 	}
2336 
2337 	if ((cmd->cmd) == SIO_HI_RA_RAM_CMD_RESET)
2338 		msleep(1);
2339 
2340 	/* Detect power down to omit reading result */
2341 	powerdown_cmd = (bool) ((cmd->cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
2342 				  (((cmd->
2343 				     param5) & SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M)
2344 				   == SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2345 	if (!powerdown_cmd) {
2346 		/* Wait until command rdy */
2347 		do {
2348 			nr_retries++;
2349 			if (nr_retries > DRXJ_MAX_RETRIES) {
2350 				pr_err("timeout\n");
2351 				goto rw_error;
2352 			}
2353 
2354 			rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, &wait_cmd, 0);
2355 			if (rc != 0) {
2356 				pr_err("error %d\n", rc);
2357 				goto rw_error;
2358 			}
2359 		} while (wait_cmd != 0);
2360 
2361 		/* Read result */
2362 		rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_RES__A, result, 0);
2363 		if (rc != 0) {
2364 			pr_err("error %d\n", rc);
2365 			goto rw_error;
2366 		}
2367 
2368 	}
2369 	/* if ( powerdown_cmd == true ) */
2370 	return 0;
2371 rw_error:
2372 	return rc;
2373 }
2374 
2375 /*
2376 * \fn int init_hi( const struct drx_demod_instance *demod )
2377 * \brief Initialise and configurate HI.
2378 * \param demod pointer to demod data.
2379 * \return int Return status.
2380 * \retval 0 Success.
2381 * \retval -EIO Failure.
2382 *
2383 * Needs to know Psys (System Clock period) and Posc (Osc Clock period)
2384 * Need to store configuration in driver because of the way I2C
2385 * bridging is controlled.
2386 *
2387 */
2388 static int init_hi(const struct drx_demod_instance *demod)
2389 {
2390 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2391 	struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2392 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2393 	int rc;
2394 
2395 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
2396 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
2397 	dev_addr = demod->my_i2c_dev_addr;
2398 
2399 	/* PATCH for bug 5003, HI ucode v3.1.0 */
2400 	rc = drxj_dap_write_reg16(dev_addr, 0x4301D7, 0x801, 0);
2401 	if (rc != 0) {
2402 		pr_err("error %d\n", rc);
2403 		goto rw_error;
2404 	}
2405 
2406 	/* Timing div, 250ns/Psys */
2407 	/* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */
2408 	ext_attr->hi_cfg_timing_div =
2409 	    (u16) ((common_attr->sys_clock_freq / 1000) * HI_I2C_DELAY) / 1000;
2410 	/* Clipping */
2411 	if ((ext_attr->hi_cfg_timing_div) > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
2412 		ext_attr->hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
2413 	/* Bridge delay, uses oscilator clock */
2414 	/* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */
2415 	/* SDA brdige delay */
2416 	ext_attr->hi_cfg_bridge_delay =
2417 	    (u16) ((common_attr->osc_clock_freq / 1000) * HI_I2C_BRIDGE_DELAY) /
2418 	    1000;
2419 	/* Clipping */
2420 	if ((ext_attr->hi_cfg_bridge_delay) > SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M)
2421 		ext_attr->hi_cfg_bridge_delay = SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
2422 	/* SCL bridge delay, same as SDA for now */
2423 	ext_attr->hi_cfg_bridge_delay += ((ext_attr->hi_cfg_bridge_delay) <<
2424 				      SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B);
2425 	/* Wakeup key, setting the read flag (as suggest in the documentation) does
2426 	   not always result into a working solution (barebones worked VI2C failed).
2427 	   Not setting the bit works in all cases . */
2428 	ext_attr->hi_cfg_wake_up_key = DRXJ_WAKE_UP_KEY;
2429 	/* port/bridge/power down ctrl */
2430 	ext_attr->hi_cfg_ctrl = (SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE);
2431 	/* transit mode time out delay and watch dog divider */
2432 	ext_attr->hi_cfg_transmit = SIO_HI_RA_RAM_PAR_6__PRE;
2433 
2434 	rc = hi_cfg_command(demod);
2435 	if (rc != 0) {
2436 		pr_err("error %d\n", rc);
2437 		goto rw_error;
2438 	}
2439 
2440 	return 0;
2441 
2442 rw_error:
2443 	return rc;
2444 }
2445 
2446 /*============================================================================*/
2447 /*==                   END HOST INTERFACE FUNCTIONS                         ==*/
2448 /*============================================================================*/
2449 
2450 /*============================================================================*/
2451 /*============================================================================*/
2452 /*==                        AUXILIARY FUNCTIONS                             ==*/
2453 /*============================================================================*/
2454 /*============================================================================*/
2455 
2456 /*
2457 * \fn int get_device_capabilities()
2458 * \brief Get and store device capabilities.
2459 * \param demod  Pointer to demodulator instance.
2460 * \return int.
2461 * \return 0    Success
2462 * \retval -EIO Failure
2463 *
2464 * Depending on pulldowns on MDx pins the following internals are set:
2465 *  * common_attr->osc_clock_freq
2466 *  * ext_attr->has_lna
2467 *  * ext_attr->has_ntsc
2468 *  * ext_attr->has_btsc
2469 *  * ext_attr->has_oob
2470 *
2471 */
2472 static int get_device_capabilities(struct drx_demod_instance *demod)
2473 {
2474 	struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2475 	struct drxj_data *ext_attr = (struct drxj_data *) NULL;
2476 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2477 	u16 sio_pdr_ohw_cfg = 0;
2478 	u32 sio_top_jtagid_lo = 0;
2479 	u16 bid = 0;
2480 	int rc;
2481 
2482 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
2483 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
2484 	dev_addr = demod->my_i2c_dev_addr;
2485 
2486 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2487 	if (rc != 0) {
2488 		pr_err("error %d\n", rc);
2489 		goto rw_error;
2490 	}
2491 	rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg, 0);
2492 	if (rc != 0) {
2493 		pr_err("error %d\n", rc);
2494 		goto rw_error;
2495 	}
2496 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2497 	if (rc != 0) {
2498 		pr_err("error %d\n", rc);
2499 		goto rw_error;
2500 	}
2501 
2502 	switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
2503 	case 0:
2504 		/* ignore (bypass ?) */
2505 		break;
2506 	case 1:
2507 		/* 27 MHz */
2508 		common_attr->osc_clock_freq = 27000;
2509 		break;
2510 	case 2:
2511 		/* 20.25 MHz */
2512 		common_attr->osc_clock_freq = 20250;
2513 		break;
2514 	case 3:
2515 		/* 4 MHz */
2516 		common_attr->osc_clock_freq = 4000;
2517 		break;
2518 	default:
2519 		return -EIO;
2520 	}
2521 
2522 	/*
2523 	   Determine device capabilities
2524 	   Based on pinning v47
2525 	 */
2526 	rc = drxdap_fasi_read_reg32(dev_addr, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo, 0);
2527 	if (rc != 0) {
2528 		pr_err("error %d\n", rc);
2529 		goto rw_error;
2530 	}
2531 	ext_attr->mfx = (u8) ((sio_top_jtagid_lo >> 29) & 0xF);
2532 
2533 	switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
2534 	case 0x31:
2535 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2536 		if (rc != 0) {
2537 			pr_err("error %d\n", rc);
2538 			goto rw_error;
2539 		}
2540 		rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_UIO_IN_HI__A, &bid, 0);
2541 		if (rc != 0) {
2542 			pr_err("error %d\n", rc);
2543 			goto rw_error;
2544 		}
2545 		bid = (bid >> 10) & 0xf;
2546 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2547 		if (rc != 0) {
2548 			pr_err("error %d\n", rc);
2549 			goto rw_error;
2550 		}
2551 
2552 		ext_attr->has_lna = true;
2553 		ext_attr->has_ntsc = false;
2554 		ext_attr->has_btsc = false;
2555 		ext_attr->has_oob = false;
2556 		ext_attr->has_smatx = true;
2557 		ext_attr->has_smarx = false;
2558 		ext_attr->has_gpio = false;
2559 		ext_attr->has_irqn = false;
2560 		break;
2561 	case 0x33:
2562 		ext_attr->has_lna = false;
2563 		ext_attr->has_ntsc = false;
2564 		ext_attr->has_btsc = false;
2565 		ext_attr->has_oob = false;
2566 		ext_attr->has_smatx = true;
2567 		ext_attr->has_smarx = false;
2568 		ext_attr->has_gpio = false;
2569 		ext_attr->has_irqn = false;
2570 		break;
2571 	case 0x45:
2572 		ext_attr->has_lna = true;
2573 		ext_attr->has_ntsc = true;
2574 		ext_attr->has_btsc = false;
2575 		ext_attr->has_oob = false;
2576 		ext_attr->has_smatx = true;
2577 		ext_attr->has_smarx = true;
2578 		ext_attr->has_gpio = true;
2579 		ext_attr->has_irqn = false;
2580 		break;
2581 	case 0x46:
2582 		ext_attr->has_lna = false;
2583 		ext_attr->has_ntsc = true;
2584 		ext_attr->has_btsc = false;
2585 		ext_attr->has_oob = false;
2586 		ext_attr->has_smatx = true;
2587 		ext_attr->has_smarx = true;
2588 		ext_attr->has_gpio = true;
2589 		ext_attr->has_irqn = false;
2590 		break;
2591 	case 0x41:
2592 		ext_attr->has_lna = true;
2593 		ext_attr->has_ntsc = true;
2594 		ext_attr->has_btsc = true;
2595 		ext_attr->has_oob = false;
2596 		ext_attr->has_smatx = true;
2597 		ext_attr->has_smarx = true;
2598 		ext_attr->has_gpio = true;
2599 		ext_attr->has_irqn = false;
2600 		break;
2601 	case 0x43:
2602 		ext_attr->has_lna = false;
2603 		ext_attr->has_ntsc = true;
2604 		ext_attr->has_btsc = true;
2605 		ext_attr->has_oob = false;
2606 		ext_attr->has_smatx = true;
2607 		ext_attr->has_smarx = true;
2608 		ext_attr->has_gpio = true;
2609 		ext_attr->has_irqn = false;
2610 		break;
2611 	case 0x32:
2612 		ext_attr->has_lna = true;
2613 		ext_attr->has_ntsc = false;
2614 		ext_attr->has_btsc = false;
2615 		ext_attr->has_oob = true;
2616 		ext_attr->has_smatx = true;
2617 		ext_attr->has_smarx = true;
2618 		ext_attr->has_gpio = true;
2619 		ext_attr->has_irqn = true;
2620 		break;
2621 	case 0x34:
2622 		ext_attr->has_lna = false;
2623 		ext_attr->has_ntsc = true;
2624 		ext_attr->has_btsc = true;
2625 		ext_attr->has_oob = true;
2626 		ext_attr->has_smatx = true;
2627 		ext_attr->has_smarx = true;
2628 		ext_attr->has_gpio = true;
2629 		ext_attr->has_irqn = true;
2630 		break;
2631 	case 0x42:
2632 		ext_attr->has_lna = true;
2633 		ext_attr->has_ntsc = true;
2634 		ext_attr->has_btsc = true;
2635 		ext_attr->has_oob = true;
2636 		ext_attr->has_smatx = true;
2637 		ext_attr->has_smarx = true;
2638 		ext_attr->has_gpio = true;
2639 		ext_attr->has_irqn = true;
2640 		break;
2641 	case 0x44:
2642 		ext_attr->has_lna = false;
2643 		ext_attr->has_ntsc = true;
2644 		ext_attr->has_btsc = true;
2645 		ext_attr->has_oob = true;
2646 		ext_attr->has_smatx = true;
2647 		ext_attr->has_smarx = true;
2648 		ext_attr->has_gpio = true;
2649 		ext_attr->has_irqn = true;
2650 		break;
2651 	default:
2652 		/* Unknown device variant */
2653 		return -EIO;
2654 		break;
2655 	}
2656 
2657 	return 0;
2658 rw_error:
2659 	return rc;
2660 }
2661 
2662 /*
2663 * \fn int power_up_device()
2664 * \brief Power up device.
2665 * \param demod  Pointer to demodulator instance.
2666 * \return int.
2667 * \return 0    Success
2668 * \retval -EIO Failure, I2C or max retries reached
2669 *
2670 */
2671 
2672 #ifndef DRXJ_MAX_RETRIES_POWERUP
2673 #define DRXJ_MAX_RETRIES_POWERUP 10
2674 #endif
2675 
2676 static int power_up_device(struct drx_demod_instance *demod)
2677 {
2678 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2679 	u8 data = 0;
2680 	u16 retry_count = 0;
2681 	struct i2c_device_addr wake_up_addr;
2682 
2683 	dev_addr = demod->my_i2c_dev_addr;
2684 	wake_up_addr.i2c_addr = DRXJ_WAKE_UP_KEY;
2685 	wake_up_addr.i2c_dev_id = dev_addr->i2c_dev_id;
2686 	wake_up_addr.user_data = dev_addr->user_data;
2687 	/*
2688 	 * I2C access may fail in this case: no ack
2689 	 * dummy write must be used to wake uop device, dummy read must be used to
2690 	 * reset HI state machine (avoiding actual writes)
2691 	 */
2692 	do {
2693 		data = 0;
2694 		drxbsp_i2c_write_read(&wake_up_addr, 1, &data,
2695 				      (struct i2c_device_addr *)(NULL), 0,
2696 				     (u8 *)(NULL));
2697 		msleep(10);
2698 		retry_count++;
2699 	} while ((drxbsp_i2c_write_read
2700 		  ((struct i2c_device_addr *) (NULL), 0, (u8 *)(NULL), dev_addr, 1,
2701 		   &data)
2702 		  != 0) && (retry_count < DRXJ_MAX_RETRIES_POWERUP));
2703 
2704 	/* Need some recovery time .... */
2705 	msleep(10);
2706 
2707 	if (retry_count == DRXJ_MAX_RETRIES_POWERUP)
2708 		return -EIO;
2709 
2710 	return 0;
2711 }
2712 
2713 /*----------------------------------------------------------------------------*/
2714 /* MPEG Output Configuration Functions - begin                                */
2715 /*----------------------------------------------------------------------------*/
2716 /*
2717 * \fn int ctrl_set_cfg_mpeg_output()
2718 * \brief Set MPEG output configuration of the device.
2719 * \param devmod  Pointer to demodulator instance.
2720 * \param cfg_data Pointer to mpeg output configuaration.
2721 * \return int.
2722 *
2723 *  Configure MPEG output parameters.
2724 *
2725 */
2726 static int
2727 ctrl_set_cfg_mpeg_output(struct drx_demod_instance *demod, struct drx_cfg_mpeg_output *cfg_data)
2728 {
2729 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2730 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2731 	struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2732 	int rc;
2733 	u16 fec_oc_reg_mode = 0;
2734 	u16 fec_oc_reg_ipr_mode = 0;
2735 	u16 fec_oc_reg_ipr_invert = 0;
2736 	u32 max_bit_rate = 0;
2737 	u32 rcn_rate = 0;
2738 	u32 nr_bits = 0;
2739 	u16 sio_pdr_md_cfg = 0;
2740 	/* data mask for the output data byte */
2741 	u16 invert_data_mask =
2742 	    FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2743 	    FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2744 	    FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2745 	    FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2746 
2747 	/* check arguments */
2748 	if ((demod == NULL) || (cfg_data == NULL))
2749 		return -EINVAL;
2750 
2751 	dev_addr = demod->my_i2c_dev_addr;
2752 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
2753 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
2754 
2755 	if (cfg_data->enable_mpeg_output == true) {
2756 		/* quick and dirty patch to set MPEG in case current std is not
2757 		   producing MPEG */
2758 		switch (ext_attr->standard) {
2759 		case DRX_STANDARD_8VSB:
2760 		case DRX_STANDARD_ITU_A:
2761 		case DRX_STANDARD_ITU_B:
2762 		case DRX_STANDARD_ITU_C:
2763 			break;
2764 		default:
2765 			return 0;
2766 		}
2767 
2768 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_OCR_INVERT__A, 0, 0);
2769 		if (rc != 0) {
2770 			pr_err("error %d\n", rc);
2771 			goto rw_error;
2772 		}
2773 		switch (ext_attr->standard) {
2774 		case DRX_STANDARD_8VSB:
2775 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, 7, 0);
2776 			if (rc != 0) {
2777 				pr_err("error %d\n", rc);
2778 				goto rw_error;
2779 			}	/* 2048 bytes fifo ram */
2780 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, 10, 0);
2781 			if (rc != 0) {
2782 				pr_err("error %d\n", rc);
2783 				goto rw_error;
2784 			}
2785 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 10, 0);
2786 			if (rc != 0) {
2787 				pr_err("error %d\n", rc);
2788 				goto rw_error;
2789 			}
2790 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, 5, 0);
2791 			if (rc != 0) {
2792 				pr_err("error %d\n", rc);
2793 				goto rw_error;
2794 			}
2795 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, 7, 0);
2796 			if (rc != 0) {
2797 				pr_err("error %d\n", rc);
2798 				goto rw_error;
2799 			}
2800 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 10, 0);
2801 			if (rc != 0) {
2802 				pr_err("error %d\n", rc);
2803 				goto rw_error;
2804 			}
2805 			/* Low Water Mark for synchronization  */
2806 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 3, 0);
2807 			if (rc != 0) {
2808 				pr_err("error %d\n", rc);
2809 				goto rw_error;
2810 			}
2811 			/* High Water Mark for synchronization */
2812 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 5, 0);
2813 			if (rc != 0) {
2814 				pr_err("error %d\n", rc);
2815 				goto rw_error;
2816 			}
2817 			break;
2818 		case DRX_STANDARD_ITU_A:
2819 		case DRX_STANDARD_ITU_C:
2820 			switch (ext_attr->constellation) {
2821 			case DRX_CONSTELLATION_QAM256:
2822 				nr_bits = 8;
2823 				break;
2824 			case DRX_CONSTELLATION_QAM128:
2825 				nr_bits = 7;
2826 				break;
2827 			case DRX_CONSTELLATION_QAM64:
2828 				nr_bits = 6;
2829 				break;
2830 			case DRX_CONSTELLATION_QAM32:
2831 				nr_bits = 5;
2832 				break;
2833 			case DRX_CONSTELLATION_QAM16:
2834 				nr_bits = 4;
2835 				break;
2836 			default:
2837 				return -EIO;
2838 			}	/* ext_attr->constellation */
2839 			/* max_bit_rate = symbol_rate * nr_bits * coef */
2840 			/* coef = 188/204                          */
2841 			max_bit_rate =
2842 			    (ext_attr->curr_symbol_rate / 8) * nr_bits * 188;
2843 			fallthrough;	/* as b/c Annex A/C need following settings */
2844 		case DRX_STANDARD_ITU_B:
2845 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, FEC_OC_FCT_USAGE__PRE, 0);
2846 			if (rc != 0) {
2847 				pr_err("error %d\n", rc);
2848 				goto rw_error;
2849 			}
2850 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, FEC_OC_TMD_CTL_UPD_RATE__PRE, 0);
2851 			if (rc != 0) {
2852 				pr_err("error %d\n", rc);
2853 				goto rw_error;
2854 			}
2855 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 5, 0);
2856 			if (rc != 0) {
2857 				pr_err("error %d\n", rc);
2858 				goto rw_error;
2859 			}
2860 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, FEC_OC_AVR_PARM_A__PRE, 0);
2861 			if (rc != 0) {
2862 				pr_err("error %d\n", rc);
2863 				goto rw_error;
2864 			}
2865 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, FEC_OC_AVR_PARM_B__PRE, 0);
2866 			if (rc != 0) {
2867 				pr_err("error %d\n", rc);
2868 				goto rw_error;
2869 			}
2870 			if (cfg_data->static_clk == true) {
2871 				rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 0xD, 0);
2872 				if (rc != 0) {
2873 					pr_err("error %d\n", rc);
2874 					goto rw_error;
2875 				}
2876 			} else {
2877 				rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, FEC_OC_RCN_GAIN__PRE, 0);
2878 				if (rc != 0) {
2879 					pr_err("error %d\n", rc);
2880 					goto rw_error;
2881 				}
2882 			}
2883 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 2, 0);
2884 			if (rc != 0) {
2885 				pr_err("error %d\n", rc);
2886 				goto rw_error;
2887 			}
2888 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 12, 0);
2889 			if (rc != 0) {
2890 				pr_err("error %d\n", rc);
2891 				goto rw_error;
2892 			}
2893 			break;
2894 		default:
2895 			break;
2896 		}		/* switch (standard) */
2897 
2898 		/* Check insertion of the Reed-Solomon parity bytes */
2899 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
2900 		if (rc != 0) {
2901 			pr_err("error %d\n", rc);
2902 			goto rw_error;
2903 		}
2904 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode, 0);
2905 		if (rc != 0) {
2906 			pr_err("error %d\n", rc);
2907 			goto rw_error;
2908 		}
2909 		if (cfg_data->insert_rs_byte == true) {
2910 			/* enable parity symbol forward */
2911 			fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
2912 			/* MVAL disable during parity bytes */
2913 			fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2914 			switch (ext_attr->standard) {
2915 			case DRX_STANDARD_8VSB:
2916 				rcn_rate = 0x004854D3;
2917 				break;
2918 			case DRX_STANDARD_ITU_B:
2919 				fec_oc_reg_mode |= FEC_OC_MODE_TRANSPARENT__M;
2920 				switch (ext_attr->constellation) {
2921 				case DRX_CONSTELLATION_QAM256:
2922 					rcn_rate = 0x008945E7;
2923 					break;
2924 				case DRX_CONSTELLATION_QAM64:
2925 					rcn_rate = 0x005F64D4;
2926 					break;
2927 				default:
2928 					return -EIO;
2929 				}
2930 				break;
2931 			case DRX_STANDARD_ITU_A:
2932 			case DRX_STANDARD_ITU_C:
2933 				/* insert_rs_byte = true -> coef = 188/188 -> 1, RS bits are in MPEG output */
2934 				rcn_rate =
2935 				    (frac28
2936 				     (max_bit_rate,
2937 				      (u32) (common_attr->sys_clock_freq / 8))) /
2938 				    188;
2939 				break;
2940 			default:
2941 				return -EIO;
2942 			}	/* ext_attr->standard */
2943 		} else {	/* insert_rs_byte == false */
2944 
2945 			/* disable parity symbol forward */
2946 			fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
2947 			/* MVAL enable during parity bytes */
2948 			fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2949 			switch (ext_attr->standard) {
2950 			case DRX_STANDARD_8VSB:
2951 				rcn_rate = 0x0041605C;
2952 				break;
2953 			case DRX_STANDARD_ITU_B:
2954 				fec_oc_reg_mode &= (~FEC_OC_MODE_TRANSPARENT__M);
2955 				switch (ext_attr->constellation) {
2956 				case DRX_CONSTELLATION_QAM256:
2957 					rcn_rate = 0x0082D6A0;
2958 					break;
2959 				case DRX_CONSTELLATION_QAM64:
2960 					rcn_rate = 0x005AEC1A;
2961 					break;
2962 				default:
2963 					return -EIO;
2964 				}
2965 				break;
2966 			case DRX_STANDARD_ITU_A:
2967 			case DRX_STANDARD_ITU_C:
2968 				/* insert_rs_byte = false -> coef = 188/204, RS bits not in MPEG output */
2969 				rcn_rate =
2970 				    (frac28
2971 				     (max_bit_rate,
2972 				      (u32) (common_attr->sys_clock_freq / 8))) /
2973 				    204;
2974 				break;
2975 			default:
2976 				return -EIO;
2977 			}	/* ext_attr->standard */
2978 		}
2979 
2980 		if (cfg_data->enable_parallel == true) {	/* MPEG data output is parallel -> clear ipr_mode[0] */
2981 			fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2982 		} else {	/* MPEG data output is serial -> set ipr_mode[0] */
2983 			fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
2984 		}
2985 
2986 		/* Control slective inversion of output bits */
2987 		if (cfg_data->invert_data == true)
2988 			fec_oc_reg_ipr_invert |= invert_data_mask;
2989 		else
2990 			fec_oc_reg_ipr_invert &= (~(invert_data_mask));
2991 
2992 		if (cfg_data->invert_err == true)
2993 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
2994 		else
2995 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2996 
2997 		if (cfg_data->invert_str == true)
2998 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
2999 		else
3000 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
3001 
3002 		if (cfg_data->invert_val == true)
3003 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
3004 		else
3005 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
3006 
3007 		if (cfg_data->invert_clk == true)
3008 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
3009 		else
3010 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
3011 
3012 
3013 		if (cfg_data->static_clk == true) {	/* Static mode */
3014 			u32 dto_rate = 0;
3015 			u32 bit_rate = 0;
3016 			u16 fec_oc_dto_burst_len = 0;
3017 			u16 fec_oc_dto_period = 0;
3018 
3019 			fec_oc_dto_burst_len = FEC_OC_DTO_BURST_LEN__PRE;
3020 
3021 			switch (ext_attr->standard) {
3022 			case DRX_STANDARD_8VSB:
3023 				fec_oc_dto_period = 4;
3024 				if (cfg_data->insert_rs_byte == true)
3025 					fec_oc_dto_burst_len = 208;
3026 				break;
3027 			case DRX_STANDARD_ITU_A:
3028 				{
3029 					u32 symbol_rate_th = 6400000;
3030 					if (cfg_data->insert_rs_byte == true) {
3031 						fec_oc_dto_burst_len = 204;
3032 						symbol_rate_th = 5900000;
3033 					}
3034 					if (ext_attr->curr_symbol_rate >=
3035 					    symbol_rate_th) {
3036 						fec_oc_dto_period = 0;
3037 					} else {
3038 						fec_oc_dto_period = 1;
3039 					}
3040 				}
3041 				break;
3042 			case DRX_STANDARD_ITU_B:
3043 				fec_oc_dto_period = 1;
3044 				if (cfg_data->insert_rs_byte == true)
3045 					fec_oc_dto_burst_len = 128;
3046 				break;
3047 			case DRX_STANDARD_ITU_C:
3048 				fec_oc_dto_period = 1;
3049 				if (cfg_data->insert_rs_byte == true)
3050 					fec_oc_dto_burst_len = 204;
3051 				break;
3052 			default:
3053 				return -EIO;
3054 			}
3055 			bit_rate =
3056 			    common_attr->sys_clock_freq * 1000 / (fec_oc_dto_period +
3057 							       2);
3058 			dto_rate =
3059 			    frac28(bit_rate, common_attr->sys_clock_freq * 1000);
3060 			dto_rate >>= 3;
3061 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_HI__A, (u16)((dto_rate >> 16) & FEC_OC_DTO_RATE_HI__M), 0);
3062 			if (rc != 0) {
3063 				pr_err("error %d\n", rc);
3064 				goto rw_error;
3065 			}
3066 			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);
3067 			if (rc != 0) {
3068 				pr_err("error %d\n", rc);
3069 				goto rw_error;
3070 			}
3071 			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);
3072 			if (rc != 0) {
3073 				pr_err("error %d\n", rc);
3074 				goto rw_error;
3075 			}
3076 			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);
3077 			if (rc != 0) {
3078 				pr_err("error %d\n", rc);
3079 				goto rw_error;
3080 			}
3081 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len, 0);
3082 			if (rc != 0) {
3083 				pr_err("error %d\n", rc);
3084 				goto rw_error;
3085 			}
3086 			if (ext_attr->mpeg_output_clock_rate != DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO)
3087 				fec_oc_dto_period = ext_attr->mpeg_output_clock_rate - 1;
3088 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period, 0);
3089 			if (rc != 0) {
3090 				pr_err("error %d\n", rc);
3091 				goto rw_error;
3092 			}
3093 		} else {	/* Dynamic mode */
3094 
3095 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M, 0);
3096 			if (rc != 0) {
3097 				pr_err("error %d\n", rc);
3098 				goto rw_error;
3099 			}
3100 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, 0, 0);
3101 			if (rc != 0) {
3102 				pr_err("error %d\n", rc);
3103 				goto rw_error;
3104 			}
3105 		}
3106 
3107 		rc = drxdap_fasi_write_reg32(dev_addr, FEC_OC_RCN_CTL_RATE_LO__A, rcn_rate, 0);
3108 		if (rc != 0) {
3109 			pr_err("error %d\n", rc);
3110 			goto rw_error;
3111 		}
3112 
3113 		/* Write appropriate registers with requested configuration */
3114 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode, 0);
3115 		if (rc != 0) {
3116 			pr_err("error %d\n", rc);
3117 			goto rw_error;
3118 		}
3119 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode, 0);
3120 		if (rc != 0) {
3121 			pr_err("error %d\n", rc);
3122 			goto rw_error;
3123 		}
3124 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert, 0);
3125 		if (rc != 0) {
3126 			pr_err("error %d\n", rc);
3127 			goto rw_error;
3128 		}
3129 
3130 		/* enabling for both parallel and serial now */
3131 		/*  Write magic word to enable pdr reg write */
3132 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3133 		if (rc != 0) {
3134 			pr_err("error %d\n", rc);
3135 			goto rw_error;
3136 		}
3137 		/*  Set MPEG TS pads to outputmode */
3138 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0013, 0);
3139 		if (rc != 0) {
3140 			pr_err("error %d\n", rc);
3141 			goto rw_error;
3142 		}
3143 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0013, 0);
3144 		if (rc != 0) {
3145 			pr_err("error %d\n", rc);
3146 			goto rw_error;
3147 		}
3148 		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);
3149 		if (rc != 0) {
3150 			pr_err("error %d\n", rc);
3151 			goto rw_error;
3152 		}
3153 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0013, 0);
3154 		if (rc != 0) {
3155 			pr_err("error %d\n", rc);
3156 			goto rw_error;
3157 		}
3158 		sio_pdr_md_cfg =
3159 		    MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH <<
3160 		    SIO_PDR_MD0_CFG_DRIVE__B | 0x03 << SIO_PDR_MD0_CFG_MODE__B;
3161 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3162 		if (rc != 0) {
3163 			pr_err("error %d\n", rc);
3164 			goto rw_error;
3165 		}
3166 		if (cfg_data->enable_parallel == true) {	/* MPEG data output is parallel -> set MD1 to MD7 to output mode */
3167 			sio_pdr_md_cfg =
3168 			    MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH <<
3169 			    SIO_PDR_MD0_CFG_DRIVE__B | 0x03 <<
3170 			    SIO_PDR_MD0_CFG_MODE__B;
3171 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3172 			if (rc != 0) {
3173 				pr_err("error %d\n", rc);
3174 				goto rw_error;
3175 			}
3176 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, sio_pdr_md_cfg, 0);
3177 			if (rc != 0) {
3178 				pr_err("error %d\n", rc);
3179 				goto rw_error;
3180 			}
3181 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, sio_pdr_md_cfg, 0);
3182 			if (rc != 0) {
3183 				pr_err("error %d\n", rc);
3184 				goto rw_error;
3185 			}
3186 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, sio_pdr_md_cfg, 0);
3187 			if (rc != 0) {
3188 				pr_err("error %d\n", rc);
3189 				goto rw_error;
3190 			}
3191 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, sio_pdr_md_cfg, 0);
3192 			if (rc != 0) {
3193 				pr_err("error %d\n", rc);
3194 				goto rw_error;
3195 			}
3196 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, sio_pdr_md_cfg, 0);
3197 			if (rc != 0) {
3198 				pr_err("error %d\n", rc);
3199 				goto rw_error;
3200 			}
3201 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, sio_pdr_md_cfg, 0);
3202 			if (rc != 0) {
3203 				pr_err("error %d\n", rc);
3204 				goto rw_error;
3205 			}
3206 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, sio_pdr_md_cfg, 0);
3207 			if (rc != 0) {
3208 				pr_err("error %d\n", rc);
3209 				goto rw_error;
3210 			}
3211 		} else {	/* MPEG data output is serial -> set MD1 to MD7 to tri-state */
3212 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3213 			if (rc != 0) {
3214 				pr_err("error %d\n", rc);
3215 				goto rw_error;
3216 			}
3217 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3218 			if (rc != 0) {
3219 				pr_err("error %d\n", rc);
3220 				goto rw_error;
3221 			}
3222 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3223 			if (rc != 0) {
3224 				pr_err("error %d\n", rc);
3225 				goto rw_error;
3226 			}
3227 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3228 			if (rc != 0) {
3229 				pr_err("error %d\n", rc);
3230 				goto rw_error;
3231 			}
3232 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3233 			if (rc != 0) {
3234 				pr_err("error %d\n", rc);
3235 				goto rw_error;
3236 			}
3237 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3238 			if (rc != 0) {
3239 				pr_err("error %d\n", rc);
3240 				goto rw_error;
3241 			}
3242 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3243 			if (rc != 0) {
3244 				pr_err("error %d\n", rc);
3245 				goto rw_error;
3246 			}
3247 		}
3248 		/*  Enable Monitor Bus output over MPEG pads and ctl input */
3249 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3250 		if (rc != 0) {
3251 			pr_err("error %d\n", rc);
3252 			goto rw_error;
3253 		}
3254 		/*  Write nomagic word to enable pdr reg write */
3255 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3256 		if (rc != 0) {
3257 			pr_err("error %d\n", rc);
3258 			goto rw_error;
3259 		}
3260 	} else {
3261 		/*  Write magic word to enable pdr reg write */
3262 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3263 		if (rc != 0) {
3264 			pr_err("error %d\n", rc);
3265 			goto rw_error;
3266 		}
3267 		/*  Set MPEG TS pads to inputmode */
3268 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0000, 0);
3269 		if (rc != 0) {
3270 			pr_err("error %d\n", rc);
3271 			goto rw_error;
3272 		}
3273 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0000, 0);
3274 		if (rc != 0) {
3275 			pr_err("error %d\n", rc);
3276 			goto rw_error;
3277 		}
3278 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, 0x0000, 0);
3279 		if (rc != 0) {
3280 			pr_err("error %d\n", rc);
3281 			goto rw_error;
3282 		}
3283 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0000, 0);
3284 		if (rc != 0) {
3285 			pr_err("error %d\n", rc);
3286 			goto rw_error;
3287 		}
3288 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, 0x0000, 0);
3289 		if (rc != 0) {
3290 			pr_err("error %d\n", rc);
3291 			goto rw_error;
3292 		}
3293 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3294 		if (rc != 0) {
3295 			pr_err("error %d\n", rc);
3296 			goto rw_error;
3297 		}
3298 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3299 		if (rc != 0) {
3300 			pr_err("error %d\n", rc);
3301 			goto rw_error;
3302 		}
3303 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3304 		if (rc != 0) {
3305 			pr_err("error %d\n", rc);
3306 			goto rw_error;
3307 		}
3308 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3309 		if (rc != 0) {
3310 			pr_err("error %d\n", rc);
3311 			goto rw_error;
3312 		}
3313 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3314 		if (rc != 0) {
3315 			pr_err("error %d\n", rc);
3316 			goto rw_error;
3317 		}
3318 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3319 		if (rc != 0) {
3320 			pr_err("error %d\n", rc);
3321 			goto rw_error;
3322 		}
3323 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3324 		if (rc != 0) {
3325 			pr_err("error %d\n", rc);
3326 			goto rw_error;
3327 		}
3328 		/* Enable Monitor Bus output over MPEG pads and ctl input */
3329 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3330 		if (rc != 0) {
3331 			pr_err("error %d\n", rc);
3332 			goto rw_error;
3333 		}
3334 		/* Write nomagic word to enable pdr reg write */
3335 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3336 		if (rc != 0) {
3337 			pr_err("error %d\n", rc);
3338 			goto rw_error;
3339 		}
3340 	}
3341 
3342 	/* save values for restore after re-acquire */
3343 	common_attr->mpeg_cfg.enable_mpeg_output = cfg_data->enable_mpeg_output;
3344 
3345 	return 0;
3346 rw_error:
3347 	return rc;
3348 }
3349 
3350 /*----------------------------------------------------------------------------*/
3351 
3352 
3353 /*----------------------------------------------------------------------------*/
3354 /* MPEG Output Configuration Functions - end                                  */
3355 /*----------------------------------------------------------------------------*/
3356 
3357 /*----------------------------------------------------------------------------*/
3358 /* miscellaneous configurations - begin                           */
3359 /*----------------------------------------------------------------------------*/
3360 
3361 /*
3362 * \fn int set_mpegtei_handling()
3363 * \brief Activate MPEG TEI handling settings.
3364 * \param devmod  Pointer to demodulator instance.
3365 * \return int.
3366 *
3367 * This routine should be called during a set channel of QAM/VSB
3368 *
3369 */
3370 static int set_mpegtei_handling(struct drx_demod_instance *demod)
3371 {
3372 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3373 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3374 	int rc;
3375 	u16 fec_oc_dpr_mode = 0;
3376 	u16 fec_oc_snc_mode = 0;
3377 	u16 fec_oc_ems_mode = 0;
3378 
3379 	dev_addr = demod->my_i2c_dev_addr;
3380 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3381 
3382 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_DPR_MODE__A, &fec_oc_dpr_mode, 0);
3383 	if (rc != 0) {
3384 		pr_err("error %d\n", rc);
3385 		goto rw_error;
3386 	}
3387 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
3388 	if (rc != 0) {
3389 		pr_err("error %d\n", rc);
3390 		goto rw_error;
3391 	}
3392 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_EMS_MODE__A, &fec_oc_ems_mode, 0);
3393 	if (rc != 0) {
3394 		pr_err("error %d\n", rc);
3395 		goto rw_error;
3396 	}
3397 
3398 	/* reset to default, allow TEI bit to be changed */
3399 	fec_oc_dpr_mode &= (~FEC_OC_DPR_MODE_ERR_DISABLE__M);
3400 	fec_oc_snc_mode &= (~(FEC_OC_SNC_MODE_ERROR_CTL__M |
3401 			   FEC_OC_SNC_MODE_CORR_DISABLE__M));
3402 	fec_oc_ems_mode &= (~FEC_OC_EMS_MODE_MODE__M);
3403 
3404 	if (ext_attr->disable_te_ihandling) {
3405 		/* do not change TEI bit */
3406 		fec_oc_dpr_mode |= FEC_OC_DPR_MODE_ERR_DISABLE__M;
3407 		fec_oc_snc_mode |= FEC_OC_SNC_MODE_CORR_DISABLE__M |
3408 		    ((0x2) << (FEC_OC_SNC_MODE_ERROR_CTL__B));
3409 		fec_oc_ems_mode |= ((0x01) << (FEC_OC_EMS_MODE_MODE__B));
3410 	}
3411 
3412 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DPR_MODE__A, fec_oc_dpr_mode, 0);
3413 	if (rc != 0) {
3414 		pr_err("error %d\n", rc);
3415 		goto rw_error;
3416 	}
3417 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode, 0);
3418 	if (rc != 0) {
3419 		pr_err("error %d\n", rc);
3420 		goto rw_error;
3421 	}
3422 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_EMS_MODE__A, fec_oc_ems_mode, 0);
3423 	if (rc != 0) {
3424 		pr_err("error %d\n", rc);
3425 		goto rw_error;
3426 	}
3427 
3428 	return 0;
3429 rw_error:
3430 	return rc;
3431 }
3432 
3433 /*----------------------------------------------------------------------------*/
3434 /*
3435 * \fn int bit_reverse_mpeg_output()
3436 * \brief Set MPEG output bit-endian settings.
3437 * \param devmod  Pointer to demodulator instance.
3438 * \return int.
3439 *
3440 * This routine should be called during a set channel of QAM/VSB
3441 *
3442 */
3443 static int bit_reverse_mpeg_output(struct drx_demod_instance *demod)
3444 {
3445 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3446 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3447 	int rc;
3448 	u16 fec_oc_ipr_mode = 0;
3449 
3450 	dev_addr = demod->my_i2c_dev_addr;
3451 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3452 
3453 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode, 0);
3454 	if (rc != 0) {
3455 		pr_err("error %d\n", rc);
3456 		goto rw_error;
3457 	}
3458 
3459 	/* reset to default (normal bit order) */
3460 	fec_oc_ipr_mode &= (~FEC_OC_IPR_MODE_REVERSE_ORDER__M);
3461 
3462 	if (ext_attr->bit_reverse_mpeg_outout)
3463 		fec_oc_ipr_mode |= FEC_OC_IPR_MODE_REVERSE_ORDER__M;
3464 
3465 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode, 0);
3466 	if (rc != 0) {
3467 		pr_err("error %d\n", rc);
3468 		goto rw_error;
3469 	}
3470 
3471 	return 0;
3472 rw_error:
3473 	return rc;
3474 }
3475 
3476 /*----------------------------------------------------------------------------*/
3477 /*
3478 * \fn int set_mpeg_start_width()
3479 * \brief Set MPEG start width.
3480 * \param devmod  Pointer to demodulator instance.
3481 * \return int.
3482 *
3483 * This routine should be called during a set channel of QAM/VSB
3484 *
3485 */
3486 static int set_mpeg_start_width(struct drx_demod_instance *demod)
3487 {
3488 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3489 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3490 	struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
3491 	int rc;
3492 	u16 fec_oc_comm_mb = 0;
3493 
3494 	dev_addr = demod->my_i2c_dev_addr;
3495 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3496 	common_attr = demod->my_common_attr;
3497 
3498 	if ((common_attr->mpeg_cfg.static_clk == true)
3499 	    && (common_attr->mpeg_cfg.enable_parallel == false)) {
3500 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_COMM_MB__A, &fec_oc_comm_mb, 0);
3501 		if (rc != 0) {
3502 			pr_err("error %d\n", rc);
3503 			goto rw_error;
3504 		}
3505 		fec_oc_comm_mb &= ~FEC_OC_COMM_MB_CTL_ON;
3506 		if (ext_attr->mpeg_start_width == DRXJ_MPEG_START_WIDTH_8CLKCYC)
3507 			fec_oc_comm_mb |= FEC_OC_COMM_MB_CTL_ON;
3508 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_COMM_MB__A, fec_oc_comm_mb, 0);
3509 		if (rc != 0) {
3510 			pr_err("error %d\n", rc);
3511 			goto rw_error;
3512 		}
3513 	}
3514 
3515 	return 0;
3516 rw_error:
3517 	return rc;
3518 }
3519 
3520 /*----------------------------------------------------------------------------*/
3521 /* miscellaneous configurations - end                             */
3522 /*----------------------------------------------------------------------------*/
3523 
3524 /*----------------------------------------------------------------------------*/
3525 /* UIO Configuration Functions - begin                                        */
3526 /*----------------------------------------------------------------------------*/
3527 /*
3528 * \fn int ctrl_set_uio_cfg()
3529 * \brief Configure modus oprandi UIO.
3530 * \param demod Pointer to demodulator instance.
3531 * \param uio_cfg Pointer to a configuration setting for a certain UIO.
3532 * \return int.
3533 */
3534 static int ctrl_set_uio_cfg(struct drx_demod_instance *demod, struct drxuio_cfg *uio_cfg)
3535 {
3536 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3537 	int rc;
3538 
3539 	if ((uio_cfg == NULL) || (demod == NULL))
3540 		return -EINVAL;
3541 
3542 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3543 
3544 	/*  Write magic word to enable pdr reg write               */
3545 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3546 	if (rc != 0) {
3547 		pr_err("error %d\n", rc);
3548 		goto rw_error;
3549 	}
3550 	switch (uio_cfg->uio) {
3551       /*====================================================================*/
3552 	case DRX_UIO1:
3553 		/* DRX_UIO1: SMA_TX UIO-1 */
3554 		if (!ext_attr->has_smatx)
3555 			return -EIO;
3556 		switch (uio_cfg->mode) {
3557 		case DRX_UIO_MODE_FIRMWARE_SMA:
3558 		case DRX_UIO_MODE_FIRMWARE_SAW:
3559 		case DRX_UIO_MODE_READWRITE:
3560 			ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3561 			break;
3562 		case DRX_UIO_MODE_DISABLE:
3563 			ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3564 			/* pad configuration register is set 0 - input mode */
3565 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0, 0);
3566 			if (rc != 0) {
3567 				pr_err("error %d\n", rc);
3568 				goto rw_error;
3569 			}
3570 			break;
3571 		default:
3572 			return -EINVAL;
3573 		}		/* switch ( uio_cfg->mode ) */
3574 		break;
3575       /*====================================================================*/
3576 	case DRX_UIO2:
3577 		/* DRX_UIO2: SMA_RX UIO-2 */
3578 		if (!ext_attr->has_smarx)
3579 			return -EIO;
3580 		switch (uio_cfg->mode) {
3581 		case DRX_UIO_MODE_FIRMWARE0:
3582 		case DRX_UIO_MODE_READWRITE:
3583 			ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3584 			break;
3585 		case DRX_UIO_MODE_DISABLE:
3586 			ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3587 			/* pad configuration register is set 0 - input mode */
3588 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, 0, 0);
3589 			if (rc != 0) {
3590 				pr_err("error %d\n", rc);
3591 				goto rw_error;
3592 			}
3593 			break;
3594 		default:
3595 			return -EINVAL;
3596 		}		/* switch ( uio_cfg->mode ) */
3597 		break;
3598       /*====================================================================*/
3599 	case DRX_UIO3:
3600 		/* DRX_UIO3: GPIO UIO-3 */
3601 		if (!ext_attr->has_gpio)
3602 			return -EIO;
3603 		switch (uio_cfg->mode) {
3604 		case DRX_UIO_MODE_FIRMWARE0:
3605 		case DRX_UIO_MODE_READWRITE:
3606 			ext_attr->uio_gpio_mode = uio_cfg->mode;
3607 			break;
3608 		case DRX_UIO_MODE_DISABLE:
3609 			ext_attr->uio_gpio_mode = uio_cfg->mode;
3610 			/* pad configuration register is set 0 - input mode */
3611 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, 0, 0);
3612 			if (rc != 0) {
3613 				pr_err("error %d\n", rc);
3614 				goto rw_error;
3615 			}
3616 			break;
3617 		default:
3618 			return -EINVAL;
3619 		}		/* switch ( uio_cfg->mode ) */
3620 		break;
3621       /*====================================================================*/
3622 	case DRX_UIO4:
3623 		/* DRX_UIO4: IRQN UIO-4 */
3624 		if (!ext_attr->has_irqn)
3625 			return -EIO;
3626 		switch (uio_cfg->mode) {
3627 		case DRX_UIO_MODE_READWRITE:
3628 			ext_attr->uio_irqn_mode = uio_cfg->mode;
3629 			break;
3630 		case DRX_UIO_MODE_DISABLE:
3631 			/* pad configuration register is set 0 - input mode */
3632 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, 0, 0);
3633 			if (rc != 0) {
3634 				pr_err("error %d\n", rc);
3635 				goto rw_error;
3636 			}
3637 			ext_attr->uio_irqn_mode = uio_cfg->mode;
3638 			break;
3639 		case DRX_UIO_MODE_FIRMWARE0:
3640 		default:
3641 			return -EINVAL;
3642 		}		/* switch ( uio_cfg->mode ) */
3643 		break;
3644       /*====================================================================*/
3645 	default:
3646 		return -EINVAL;
3647 	}			/* switch ( uio_cfg->uio ) */
3648 
3649 	/*  Write magic word to disable pdr reg write               */
3650 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3651 	if (rc != 0) {
3652 		pr_err("error %d\n", rc);
3653 		goto rw_error;
3654 	}
3655 
3656 	return 0;
3657 rw_error:
3658 	return rc;
3659 }
3660 
3661 /*
3662 * \fn int ctrl_uio_write()
3663 * \brief Write to a UIO.
3664 * \param demod Pointer to demodulator instance.
3665 * \param uio_data Pointer to data container for a certain UIO.
3666 * \return int.
3667 */
3668 static int
3669 ctrl_uio_write(struct drx_demod_instance *demod, struct drxuio_data *uio_data)
3670 {
3671 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3672 	int rc;
3673 	u16 pin_cfg_value = 0;
3674 	u16 value = 0;
3675 
3676 	if ((uio_data == NULL) || (demod == NULL))
3677 		return -EINVAL;
3678 
3679 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3680 
3681 	/*  Write magic word to enable pdr reg write               */
3682 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3683 	if (rc != 0) {
3684 		pr_err("error %d\n", rc);
3685 		goto rw_error;
3686 	}
3687 	switch (uio_data->uio) {
3688       /*====================================================================*/
3689 	case DRX_UIO1:
3690 		/* DRX_UIO1: SMA_TX UIO-1 */
3691 		if (!ext_attr->has_smatx)
3692 			return -EIO;
3693 		if ((ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_READWRITE)
3694 		    && (ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_FIRMWARE_SAW)) {
3695 			return -EIO;
3696 		}
3697 		pin_cfg_value = 0;
3698 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3699 		pin_cfg_value |= 0x0113;
3700 		/* io_pad_cfg_mode output mode is drive always */
3701 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
3702 
3703 		/* write to io pad configuration register - output mode */
3704 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, pin_cfg_value, 0);
3705 		if (rc != 0) {
3706 			pr_err("error %d\n", rc);
3707 			goto rw_error;
3708 		}
3709 
3710 		/* use corresponding bit in io data output registar */
3711 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3712 		if (rc != 0) {
3713 			pr_err("error %d\n", rc);
3714 			goto rw_error;
3715 		}
3716 		if (!uio_data->value)
3717 			value &= 0x7FFF;	/* write zero to 15th bit - 1st UIO */
3718 		else
3719 			value |= 0x8000;	/* write one to 15th bit - 1st UIO */
3720 
3721 		/* write back to io data output register */
3722 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3723 		if (rc != 0) {
3724 			pr_err("error %d\n", rc);
3725 			goto rw_error;
3726 		}
3727 		break;
3728    /*======================================================================*/
3729 	case DRX_UIO2:
3730 		/* DRX_UIO2: SMA_RX UIO-2 */
3731 		if (!ext_attr->has_smarx)
3732 			return -EIO;
3733 		if (ext_attr->uio_sma_rx_mode != DRX_UIO_MODE_READWRITE)
3734 			return -EIO;
3735 
3736 		pin_cfg_value = 0;
3737 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3738 		pin_cfg_value |= 0x0113;
3739 		/* io_pad_cfg_mode output mode is drive always */
3740 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
3741 
3742 		/* write to io pad configuration register - output mode */
3743 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, pin_cfg_value, 0);
3744 		if (rc != 0) {
3745 			pr_err("error %d\n", rc);
3746 			goto rw_error;
3747 		}
3748 
3749 		/* use corresponding bit in io data output registar */
3750 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3751 		if (rc != 0) {
3752 			pr_err("error %d\n", rc);
3753 			goto rw_error;
3754 		}
3755 		if (!uio_data->value)
3756 			value &= 0xBFFF;	/* write zero to 14th bit - 2nd UIO */
3757 		else
3758 			value |= 0x4000;	/* write one to 14th bit - 2nd UIO */
3759 
3760 		/* write back to io data output register */
3761 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3762 		if (rc != 0) {
3763 			pr_err("error %d\n", rc);
3764 			goto rw_error;
3765 		}
3766 		break;
3767    /*====================================================================*/
3768 	case DRX_UIO3:
3769 		/* DRX_UIO3: ASEL UIO-3 */
3770 		if (!ext_attr->has_gpio)
3771 			return -EIO;
3772 		if (ext_attr->uio_gpio_mode != DRX_UIO_MODE_READWRITE)
3773 			return -EIO;
3774 
3775 		pin_cfg_value = 0;
3776 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3777 		pin_cfg_value |= 0x0113;
3778 		/* io_pad_cfg_mode output mode is drive always */
3779 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
3780 
3781 		/* write to io pad configuration register - output mode */
3782 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, pin_cfg_value, 0);
3783 		if (rc != 0) {
3784 			pr_err("error %d\n", rc);
3785 			goto rw_error;
3786 		}
3787 
3788 		/* use corresponding bit in io data output registar */
3789 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, &value, 0);
3790 		if (rc != 0) {
3791 			pr_err("error %d\n", rc);
3792 			goto rw_error;
3793 		}
3794 		if (!uio_data->value)
3795 			value &= 0xFFFB;	/* write zero to 2nd bit - 3rd UIO */
3796 		else
3797 			value |= 0x0004;	/* write one to 2nd bit - 3rd UIO */
3798 
3799 		/* write back to io data output register */
3800 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, value, 0);
3801 		if (rc != 0) {
3802 			pr_err("error %d\n", rc);
3803 			goto rw_error;
3804 		}
3805 		break;
3806    /*=====================================================================*/
3807 	case DRX_UIO4:
3808 		/* DRX_UIO4: IRQN UIO-4 */
3809 		if (!ext_attr->has_irqn)
3810 			return -EIO;
3811 
3812 		if (ext_attr->uio_irqn_mode != DRX_UIO_MODE_READWRITE)
3813 			return -EIO;
3814 
3815 		pin_cfg_value = 0;
3816 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3817 		pin_cfg_value |= 0x0113;
3818 		/* io_pad_cfg_mode output mode is drive always */
3819 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
3820 
3821 		/* write to io pad configuration register - output mode */
3822 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, pin_cfg_value, 0);
3823 		if (rc != 0) {
3824 			pr_err("error %d\n", rc);
3825 			goto rw_error;
3826 		}
3827 
3828 		/* use corresponding bit in io data output registar */
3829 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3830 		if (rc != 0) {
3831 			pr_err("error %d\n", rc);
3832 			goto rw_error;
3833 		}
3834 		if (uio_data->value == false)
3835 			value &= 0xEFFF;	/* write zero to 12th bit - 4th UIO */
3836 		else
3837 			value |= 0x1000;	/* write one to 12th bit - 4th UIO */
3838 
3839 		/* write back to io data output register */
3840 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3841 		if (rc != 0) {
3842 			pr_err("error %d\n", rc);
3843 			goto rw_error;
3844 		}
3845 		break;
3846       /*=====================================================================*/
3847 	default:
3848 		return -EINVAL;
3849 	}			/* switch ( uio_data->uio ) */
3850 
3851 	/*  Write magic word to disable pdr reg write               */
3852 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3853 	if (rc != 0) {
3854 		pr_err("error %d\n", rc);
3855 		goto rw_error;
3856 	}
3857 
3858 	return 0;
3859 rw_error:
3860 	return rc;
3861 }
3862 
3863 /*---------------------------------------------------------------------------*/
3864 /* UIO Configuration Functions - end                                         */
3865 /*---------------------------------------------------------------------------*/
3866 
3867 /*----------------------------------------------------------------------------*/
3868 /* I2C Bridge Functions - begin                                               */
3869 /*----------------------------------------------------------------------------*/
3870 /*
3871 * \fn int ctrl_i2c_bridge()
3872 * \brief Open or close the I2C switch to tuner.
3873 * \param demod Pointer to demodulator instance.
3874 * \param bridge_closed Pointer to bool indication if bridge is closed not.
3875 * \return int.
3876 
3877 */
3878 static int
3879 ctrl_i2c_bridge(struct drx_demod_instance *demod, bool *bridge_closed)
3880 {
3881 	struct drxj_hi_cmd hi_cmd;
3882 	u16 result = 0;
3883 
3884 	/* check arguments */
3885 	if (bridge_closed == NULL)
3886 		return -EINVAL;
3887 
3888 	hi_cmd.cmd = SIO_HI_RA_RAM_CMD_BRDCTRL;
3889 	hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
3890 	if (*bridge_closed)
3891 		hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED;
3892 	else
3893 		hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN;
3894 
3895 	return hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
3896 }
3897 
3898 /*----------------------------------------------------------------------------*/
3899 /* I2C Bridge Functions - end                                                 */
3900 /*----------------------------------------------------------------------------*/
3901 
3902 /*----------------------------------------------------------------------------*/
3903 /* Smart antenna Functions - begin                                            */
3904 /*----------------------------------------------------------------------------*/
3905 /*
3906 * \fn int smart_ant_init()
3907 * \brief Initialize Smart Antenna.
3908 * \param pointer to struct drx_demod_instance.
3909 * \return int.
3910 *
3911 */
3912 static int smart_ant_init(struct drx_demod_instance *demod)
3913 {
3914 	struct drxj_data *ext_attr = NULL;
3915 	struct i2c_device_addr *dev_addr = NULL;
3916 	struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SMA };
3917 	int rc;
3918 	u16 data = 0;
3919 
3920 	dev_addr = demod->my_i2c_dev_addr;
3921 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3922 
3923 	/*  Write magic word to enable pdr reg write               */
3924 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3925 	if (rc != 0) {
3926 		pr_err("error %d\n", rc);
3927 		goto rw_error;
3928 	}
3929 	/* init smart antenna */
3930 	rc = drxj_dap_read_reg16(dev_addr, SIO_SA_TX_COMMAND__A, &data, 0);
3931 	if (rc != 0) {
3932 		pr_err("error %d\n", rc);
3933 		goto rw_error;
3934 	}
3935 	if (ext_attr->smart_ant_inverted) {
3936 		rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data | SIO_SA_TX_COMMAND_TX_INVERT__M) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
3937 		if (rc != 0) {
3938 			pr_err("error %d\n", rc);
3939 			goto rw_error;
3940 		}
3941 	} else {
3942 		rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data & (~SIO_SA_TX_COMMAND_TX_INVERT__M)) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
3943 		if (rc != 0) {
3944 			pr_err("error %d\n", rc);
3945 			goto rw_error;
3946 		}
3947 	}
3948 
3949 	/* config SMA_TX pin to smart antenna mode */
3950 	rc = ctrl_set_uio_cfg(demod, &uio_cfg);
3951 	if (rc != 0) {
3952 		pr_err("error %d\n", rc);
3953 		goto rw_error;
3954 	}
3955 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0x13, 0);
3956 	if (rc != 0) {
3957 		pr_err("error %d\n", rc);
3958 		goto rw_error;
3959 	}
3960 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_GPIO_FNC__A, 0x03, 0);
3961 	if (rc != 0) {
3962 		pr_err("error %d\n", rc);
3963 		goto rw_error;
3964 	}
3965 
3966 	/*  Write magic word to disable pdr reg write               */
3967 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3968 	if (rc != 0) {
3969 		pr_err("error %d\n", rc);
3970 		goto rw_error;
3971 	}
3972 
3973 	return 0;
3974 rw_error:
3975 	return rc;
3976 }
3977 
3978 static int scu_command(struct i2c_device_addr *dev_addr, struct drxjscu_cmd *cmd)
3979 {
3980 	int rc;
3981 	u16 cur_cmd = 0;
3982 	unsigned long timeout;
3983 
3984 	/* Check param */
3985 	if (cmd == NULL)
3986 		return -EINVAL;
3987 
3988 	/* Wait until SCU command interface is ready to receive command */
3989 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
3990 	if (rc != 0) {
3991 		pr_err("error %d\n", rc);
3992 		goto rw_error;
3993 	}
3994 	if (cur_cmd != DRX_SCU_READY)
3995 		return -EIO;
3996 
3997 	switch (cmd->parameter_len) {
3998 	case 5:
3999 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_4__A, *(cmd->parameter + 4), 0);
4000 		if (rc != 0) {
4001 			pr_err("error %d\n", rc);
4002 			goto rw_error;
4003 		}
4004 		fallthrough;
4005 	case 4:
4006 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_3__A, *(cmd->parameter + 3), 0);
4007 		if (rc != 0) {
4008 			pr_err("error %d\n", rc);
4009 			goto rw_error;
4010 		}
4011 		fallthrough;
4012 	case 3:
4013 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_2__A, *(cmd->parameter + 2), 0);
4014 		if (rc != 0) {
4015 			pr_err("error %d\n", rc);
4016 			goto rw_error;
4017 		}
4018 		fallthrough;
4019 	case 2:
4020 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_1__A, *(cmd->parameter + 1), 0);
4021 		if (rc != 0) {
4022 			pr_err("error %d\n", rc);
4023 			goto rw_error;
4024 		}
4025 		fallthrough;
4026 	case 1:
4027 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_0__A, *(cmd->parameter + 0), 0);
4028 		if (rc != 0) {
4029 			pr_err("error %d\n", rc);
4030 			goto rw_error;
4031 		}
4032 		fallthrough;
4033 	case 0:
4034 		/* do nothing */
4035 		break;
4036 	default:
4037 		/* this number of parameters is not supported */
4038 		return -EIO;
4039 	}
4040 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_COMMAND__A, cmd->command, 0);
4041 	if (rc != 0) {
4042 		pr_err("error %d\n", rc);
4043 		goto rw_error;
4044 	}
4045 
4046 	/* Wait until SCU has processed command */
4047 	timeout = jiffies + msecs_to_jiffies(DRXJ_MAX_WAITTIME);
4048 	while (time_is_after_jiffies(timeout)) {
4049 		rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
4050 		if (rc != 0) {
4051 			pr_err("error %d\n", rc);
4052 			goto rw_error;
4053 		}
4054 		if (cur_cmd == DRX_SCU_READY)
4055 			break;
4056 		usleep_range(1000, 2000);
4057 	}
4058 
4059 	if (cur_cmd != DRX_SCU_READY)
4060 		return -EIO;
4061 
4062 	/* read results */
4063 	if ((cmd->result_len > 0) && (cmd->result != NULL)) {
4064 		s16 err;
4065 
4066 		switch (cmd->result_len) {
4067 		case 4:
4068 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_3__A, cmd->result + 3, 0);
4069 			if (rc != 0) {
4070 				pr_err("error %d\n", rc);
4071 				goto rw_error;
4072 			}
4073 			fallthrough;
4074 		case 3:
4075 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_2__A, cmd->result + 2, 0);
4076 			if (rc != 0) {
4077 				pr_err("error %d\n", rc);
4078 				goto rw_error;
4079 			}
4080 			fallthrough;
4081 		case 2:
4082 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_1__A, cmd->result + 1, 0);
4083 			if (rc != 0) {
4084 				pr_err("error %d\n", rc);
4085 				goto rw_error;
4086 			}
4087 			fallthrough;
4088 		case 1:
4089 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_0__A, cmd->result + 0, 0);
4090 			if (rc != 0) {
4091 				pr_err("error %d\n", rc);
4092 				goto rw_error;
4093 			}
4094 			fallthrough;
4095 		case 0:
4096 			/* do nothing */
4097 			break;
4098 		default:
4099 			/* this number of parameters is not supported */
4100 			return -EIO;
4101 		}
4102 
4103 		/* Check if an error was reported by SCU */
4104 		err = cmd->result[0];
4105 
4106 		/* check a few fixed error codes */
4107 		if ((err == (s16) SCU_RAM_PARAM_0_RESULT_UNKSTD)
4108 		    || (err == (s16) SCU_RAM_PARAM_0_RESULT_UNKCMD)
4109 		    || (err == (s16) SCU_RAM_PARAM_0_RESULT_INVPAR)
4110 		    || (err == (s16) SCU_RAM_PARAM_0_RESULT_SIZE)
4111 		    ) {
4112 			return -EINVAL;
4113 		}
4114 		/* here it is assumed that negative means error, and positive no error */
4115 		else if (err < 0)
4116 			return -EIO;
4117 		else
4118 			return 0;
4119 	}
4120 
4121 	return 0;
4122 
4123 rw_error:
4124 	return rc;
4125 }
4126 
4127 /*
4128 * \fn int DRXJ_DAP_SCUAtomicReadWriteBlock()
4129 * \brief Basic access routine for SCU atomic read or write access
4130 * \param dev_addr  pointer to i2c dev address
4131 * \param addr     destination/source address
4132 * \param datasize size of data buffer in bytes
4133 * \param data     pointer to data buffer
4134 * \return int
4135 * \retval 0 Success
4136 * \retval -EIO Timeout, I2C error, illegal bank
4137 *
4138 */
4139 #define ADDR_AT_SCU_SPACE(x) ((x - 0x82E000) * 2)
4140 static
4141 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 */
4142 					      u8 *data, bool read_flag)
4143 {
4144 	struct drxjscu_cmd scu_cmd;
4145 	int rc;
4146 	u16 set_param_parameters[18];
4147 	u16 cmd_result[15];
4148 
4149 	/* Parameter check */
4150 	if (!data || !dev_addr || (datasize % 2) || ((datasize / 2) > 16))
4151 		return -EINVAL;
4152 
4153 	set_param_parameters[1] = (u16) ADDR_AT_SCU_SPACE(addr);
4154 	if (read_flag) {		/* read */
4155 		set_param_parameters[0] = ((~(0x0080)) & datasize);
4156 		scu_cmd.parameter_len = 2;
4157 		scu_cmd.result_len = datasize / 2 + 2;
4158 	} else {
4159 		int i = 0;
4160 
4161 		set_param_parameters[0] = 0x0080 | datasize;
4162 		for (i = 0; i < (datasize / 2); i++) {
4163 			set_param_parameters[i + 2] =
4164 			    (data[2 * i] | (data[(2 * i) + 1] << 8));
4165 		}
4166 		scu_cmd.parameter_len = datasize / 2 + 2;
4167 		scu_cmd.result_len = 1;
4168 	}
4169 
4170 	scu_cmd.command =
4171 	    SCU_RAM_COMMAND_STANDARD_TOP |
4172 	    SCU_RAM_COMMAND_CMD_AUX_SCU_ATOMIC_ACCESS;
4173 	scu_cmd.result = cmd_result;
4174 	scu_cmd.parameter = set_param_parameters;
4175 	rc = scu_command(dev_addr, &scu_cmd);
4176 	if (rc != 0) {
4177 		pr_err("error %d\n", rc);
4178 		goto rw_error;
4179 	}
4180 
4181 	if (read_flag) {
4182 		int i = 0;
4183 		/* read data from buffer */
4184 		for (i = 0; i < (datasize / 2); i++) {
4185 			data[2 * i] = (u8) (scu_cmd.result[i + 2] & 0xFF);
4186 			data[(2 * i) + 1] = (u8) (scu_cmd.result[i + 2] >> 8);
4187 		}
4188 	}
4189 
4190 	return 0;
4191 
4192 rw_error:
4193 	return rc;
4194 
4195 }
4196 
4197 /*============================================================================*/
4198 
4199 /*
4200 * \fn int DRXJ_DAP_AtomicReadReg16()
4201 * \brief Atomic read of 16 bits words
4202 */
4203 static
4204 int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr *dev_addr,
4205 					 u32 addr,
4206 					 u16 *data, u32 flags)
4207 {
4208 	u8 buf[2] = { 0 };
4209 	int rc;
4210 	u16 word = 0;
4211 
4212 	if (!data)
4213 		return -EINVAL;
4214 
4215 	rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, true);
4216 	if (rc < 0)
4217 		return rc;
4218 
4219 	word = (u16) (buf[0] + (buf[1] << 8));
4220 
4221 	*data = word;
4222 
4223 	return rc;
4224 }
4225 
4226 /*============================================================================*/
4227 /*
4228 * \fn int drxj_dap_scu_atomic_write_reg16()
4229 * \brief Atomic read of 16 bits words
4230 */
4231 static
4232 int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr *dev_addr,
4233 					  u32 addr,
4234 					  u16 data, u32 flags)
4235 {
4236 	u8 buf[2];
4237 	int rc;
4238 
4239 	buf[0] = (u8) (data & 0xff);
4240 	buf[1] = (u8) ((data >> 8) & 0xff);
4241 
4242 	rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, false);
4243 
4244 	return rc;
4245 }
4246 
4247 /* -------------------------------------------------------------------------- */
4248 /*
4249 * \brief Measure result of ADC synchronisation
4250 * \param demod demod instance
4251 * \param count (returned) count
4252 * \return int.
4253 * \retval 0    Success
4254 * \retval -EIO Failure: I2C error
4255 *
4256 */
4257 static int adc_sync_measurement(struct drx_demod_instance *demod, u16 *count)
4258 {
4259 	struct i2c_device_addr *dev_addr = NULL;
4260 	int rc;
4261 	u16 data = 0;
4262 
4263 	dev_addr = demod->my_i2c_dev_addr;
4264 
4265 	/* Start measurement */
4266 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE, 0);
4267 	if (rc != 0) {
4268 		pr_err("error %d\n", rc);
4269 		goto rw_error;
4270 	}
4271 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_START_LOCK__A, 1, 0);
4272 	if (rc != 0) {
4273 		pr_err("error %d\n", rc);
4274 		goto rw_error;
4275 	}
4276 
4277 	/* Wait at least 3*128*(1/sysclk) <<< 1 millisec */
4278 	msleep(1);
4279 
4280 	*count = 0;
4281 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE0__A, &data, 0);
4282 	if (rc != 0) {
4283 		pr_err("error %d\n", rc);
4284 		goto rw_error;
4285 	}
4286 	if (data == 127)
4287 		*count = *count + 1;
4288 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE1__A, &data, 0);
4289 	if (rc != 0) {
4290 		pr_err("error %d\n", rc);
4291 		goto rw_error;
4292 	}
4293 	if (data == 127)
4294 		*count = *count + 1;
4295 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE2__A, &data, 0);
4296 	if (rc != 0) {
4297 		pr_err("error %d\n", rc);
4298 		goto rw_error;
4299 	}
4300 	if (data == 127)
4301 		*count = *count + 1;
4302 
4303 	return 0;
4304 rw_error:
4305 	return rc;
4306 }
4307 
4308 /*
4309 * \brief Synchronize analog and digital clock domains
4310 * \param demod demod instance
4311 * \return int.
4312 * \retval 0    Success
4313 * \retval -EIO Failure: I2C error or failure to synchronize
4314 *
4315 * An IQM reset will also reset the results of this synchronization.
4316 * After an IQM reset this routine needs to be called again.
4317 *
4318 */
4319 
4320 static int adc_synchronization(struct drx_demod_instance *demod)
4321 {
4322 	struct i2c_device_addr *dev_addr = NULL;
4323 	int rc;
4324 	u16 count = 0;
4325 
4326 	dev_addr = demod->my_i2c_dev_addr;
4327 
4328 	rc = adc_sync_measurement(demod, &count);
4329 	if (rc != 0) {
4330 		pr_err("error %d\n", rc);
4331 		goto rw_error;
4332 	}
4333 
4334 	if (count == 1) {
4335 		/* Try sampling on a different edge */
4336 		u16 clk_neg = 0;
4337 
4338 		rc = drxj_dap_read_reg16(dev_addr, IQM_AF_CLKNEG__A, &clk_neg, 0);
4339 		if (rc != 0) {
4340 			pr_err("error %d\n", rc);
4341 			goto rw_error;
4342 		}
4343 
4344 		clk_neg ^= IQM_AF_CLKNEG_CLKNEGDATA__M;
4345 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLKNEG__A, clk_neg, 0);
4346 		if (rc != 0) {
4347 			pr_err("error %d\n", rc);
4348 			goto rw_error;
4349 		}
4350 
4351 		rc = adc_sync_measurement(demod, &count);
4352 		if (rc != 0) {
4353 			pr_err("error %d\n", rc);
4354 			goto rw_error;
4355 		}
4356 	}
4357 
4358 	/* TODO: implement fallback scenarios */
4359 	if (count < 2)
4360 		return -EIO;
4361 
4362 	return 0;
4363 rw_error:
4364 	return rc;
4365 }
4366 
4367 /*============================================================================*/
4368 /*==                      END AUXILIARY FUNCTIONS                           ==*/
4369 /*============================================================================*/
4370 
4371 /*============================================================================*/
4372 /*============================================================================*/
4373 /*==                8VSB & QAM COMMON DATAPATH FUNCTIONS                    ==*/
4374 /*============================================================================*/
4375 /*============================================================================*/
4376 /*
4377 * \fn int init_agc ()
4378 * \brief Initialize AGC for all standards.
4379 * \param demod instance of demodulator.
4380 * \param channel pointer to channel data.
4381 * \return int.
4382 */
4383 static int init_agc(struct drx_demod_instance *demod)
4384 {
4385 	struct i2c_device_addr *dev_addr = NULL;
4386 	struct drx_common_attr *common_attr = NULL;
4387 	struct drxj_data *ext_attr = NULL;
4388 	struct drxj_cfg_agc *p_agc_rf_settings = NULL;
4389 	struct drxj_cfg_agc *p_agc_if_settings = NULL;
4390 	int rc;
4391 	u16 ingain_tgt_max = 0;
4392 	u16 clp_dir_to = 0;
4393 	u16 sns_sum_max = 0;
4394 	u16 clp_sum_max = 0;
4395 	u16 sns_dir_to = 0;
4396 	u16 ki_innergain_min = 0;
4397 	u16 agc_ki = 0;
4398 	u16 ki_max = 0;
4399 	u16 if_iaccu_hi_tgt_min = 0;
4400 	u16 data = 0;
4401 	u16 agc_ki_dgain = 0;
4402 	u16 ki_min = 0;
4403 	u16 clp_ctrl_mode = 0;
4404 	u16 agc_rf = 0;
4405 	u16 agc_if = 0;
4406 
4407 	dev_addr = demod->my_i2c_dev_addr;
4408 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
4409 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
4410 
4411 	switch (ext_attr->standard) {
4412 	case DRX_STANDARD_8VSB:
4413 		clp_sum_max = 1023;
4414 		clp_dir_to = (u16) (-9);
4415 		sns_sum_max = 1023;
4416 		sns_dir_to = (u16) (-9);
4417 		ki_innergain_min = (u16) (-32768);
4418 		ki_max = 0x032C;
4419 		agc_ki_dgain = 0xC;
4420 		if_iaccu_hi_tgt_min = 2047;
4421 		ki_min = 0x0117;
4422 		ingain_tgt_max = 16383;
4423 		clp_ctrl_mode = 0;
4424 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4425 		if (rc != 0) {
4426 			pr_err("error %d\n", rc);
4427 			goto rw_error;
4428 		}
4429 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4430 		if (rc != 0) {
4431 			pr_err("error %d\n", rc);
4432 			goto rw_error;
4433 		}
4434 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4435 		if (rc != 0) {
4436 			pr_err("error %d\n", rc);
4437 			goto rw_error;
4438 		}
4439 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4440 		if (rc != 0) {
4441 			pr_err("error %d\n", rc);
4442 			goto rw_error;
4443 		}
4444 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4445 		if (rc != 0) {
4446 			pr_err("error %d\n", rc);
4447 			goto rw_error;
4448 		}
4449 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4450 		if (rc != 0) {
4451 			pr_err("error %d\n", rc);
4452 			goto rw_error;
4453 		}
4454 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4455 		if (rc != 0) {
4456 			pr_err("error %d\n", rc);
4457 			goto rw_error;
4458 		}
4459 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4460 		if (rc != 0) {
4461 			pr_err("error %d\n", rc);
4462 			goto rw_error;
4463 		}
4464 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4465 		if (rc != 0) {
4466 			pr_err("error %d\n", rc);
4467 			goto rw_error;
4468 		}
4469 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4470 		if (rc != 0) {
4471 			pr_err("error %d\n", rc);
4472 			goto rw_error;
4473 		}
4474 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, 1024, 0);
4475 		if (rc != 0) {
4476 			pr_err("error %d\n", rc);
4477 			goto rw_error;
4478 		}
4479 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_VSB_AGC_POW_TGT__A, 22600, 0);
4480 		if (rc != 0) {
4481 			pr_err("error %d\n", rc);
4482 			goto rw_error;
4483 		}
4484 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, 13200, 0);
4485 		if (rc != 0) {
4486 			pr_err("error %d\n", rc);
4487 			goto rw_error;
4488 		}
4489 		p_agc_if_settings = &(ext_attr->vsb_if_agc_cfg);
4490 		p_agc_rf_settings = &(ext_attr->vsb_rf_agc_cfg);
4491 		break;
4492 #ifndef DRXJ_VSB_ONLY
4493 	case DRX_STANDARD_ITU_A:
4494 	case DRX_STANDARD_ITU_C:
4495 	case DRX_STANDARD_ITU_B:
4496 		ingain_tgt_max = 5119;
4497 		clp_sum_max = 1023;
4498 		clp_dir_to = (u16) (-5);
4499 		sns_sum_max = 127;
4500 		sns_dir_to = (u16) (-3);
4501 		ki_innergain_min = 0;
4502 		ki_max = 0x0657;
4503 		if_iaccu_hi_tgt_min = 2047;
4504 		agc_ki_dgain = 0x7;
4505 		ki_min = 0x0117;
4506 		clp_ctrl_mode = 0;
4507 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4508 		if (rc != 0) {
4509 			pr_err("error %d\n", rc);
4510 			goto rw_error;
4511 		}
4512 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4513 		if (rc != 0) {
4514 			pr_err("error %d\n", rc);
4515 			goto rw_error;
4516 		}
4517 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4518 		if (rc != 0) {
4519 			pr_err("error %d\n", rc);
4520 			goto rw_error;
4521 		}
4522 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4523 		if (rc != 0) {
4524 			pr_err("error %d\n", rc);
4525 			goto rw_error;
4526 		}
4527 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4528 		if (rc != 0) {
4529 			pr_err("error %d\n", rc);
4530 			goto rw_error;
4531 		}
4532 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4533 		if (rc != 0) {
4534 			pr_err("error %d\n", rc);
4535 			goto rw_error;
4536 		}
4537 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4538 		if (rc != 0) {
4539 			pr_err("error %d\n", rc);
4540 			goto rw_error;
4541 		}
4542 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4543 		if (rc != 0) {
4544 			pr_err("error %d\n", rc);
4545 			goto rw_error;
4546 		}
4547 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4548 		if (rc != 0) {
4549 			pr_err("error %d\n", rc);
4550 			goto rw_error;
4551 		}
4552 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4553 		if (rc != 0) {
4554 			pr_err("error %d\n", rc);
4555 			goto rw_error;
4556 		}
4557 		p_agc_if_settings = &(ext_attr->qam_if_agc_cfg);
4558 		p_agc_rf_settings = &(ext_attr->qam_rf_agc_cfg);
4559 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, p_agc_if_settings->top, 0);
4560 		if (rc != 0) {
4561 			pr_err("error %d\n", rc);
4562 			goto rw_error;
4563 		}
4564 
4565 		rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &agc_ki, 0);
4566 		if (rc != 0) {
4567 			pr_err("error %d\n", rc);
4568 			goto rw_error;
4569 		}
4570 		agc_ki &= 0xf000;
4571 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, agc_ki, 0);
4572 		if (rc != 0) {
4573 			pr_err("error %d\n", rc);
4574 			goto rw_error;
4575 		}
4576 		break;
4577 #endif
4578 	default:
4579 		return -EINVAL;
4580 	}
4581 
4582 	/* for new AGC interface */
4583 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_if_settings->top, 0);
4584 	if (rc != 0) {
4585 		pr_err("error %d\n", rc);
4586 		goto rw_error;
4587 	}
4588 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, p_agc_if_settings->top, 0);
4589 	if (rc != 0) {
4590 		pr_err("error %d\n", rc);
4591 		goto rw_error;
4592 	}	/* Gain fed from inner to outer AGC */
4593 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max, 0);
4594 	if (rc != 0) {
4595 		pr_err("error %d\n", rc);
4596 		goto rw_error;
4597 	}
4598 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, if_iaccu_hi_tgt_min, 0);
4599 	if (rc != 0) {
4600 		pr_err("error %d\n", rc);
4601 		goto rw_error;
4602 	}
4603 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI__A, 0, 0);
4604 	if (rc != 0) {
4605 		pr_err("error %d\n", rc);
4606 		goto rw_error;
4607 	}	/* set to p_agc_settings->top before */
4608 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_LO__A, 0, 0);
4609 	if (rc != 0) {
4610 		pr_err("error %d\n", rc);
4611 		goto rw_error;
4612 	}
4613 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, 0, 0);
4614 	if (rc != 0) {
4615 		pr_err("error %d\n", rc);
4616 		goto rw_error;
4617 	}
4618 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_LO__A, 0, 0);
4619 	if (rc != 0) {
4620 		pr_err("error %d\n", rc);
4621 		goto rw_error;
4622 	}
4623 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_MAX__A, 32767, 0);
4624 	if (rc != 0) {
4625 		pr_err("error %d\n", rc);
4626 		goto rw_error;
4627 	}
4628 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max, 0);
4629 	if (rc != 0) {
4630 		pr_err("error %d\n", rc);
4631 		goto rw_error;
4632 	}
4633 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max, 0);
4634 	if (rc != 0) {
4635 		pr_err("error %d\n", rc);
4636 		goto rw_error;
4637 	}
4638 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, ki_innergain_min, 0);
4639 	if (rc != 0) {
4640 		pr_err("error %d\n", rc);
4641 		goto rw_error;
4642 	}
4643 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50, 0);
4644 	if (rc != 0) {
4645 		pr_err("error %d\n", rc);
4646 		goto rw_error;
4647 	}
4648 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_CYCLEN__A, 500, 0);
4649 	if (rc != 0) {
4650 		pr_err("error %d\n", rc);
4651 		goto rw_error;
4652 	}
4653 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCLEN__A, 500, 0);
4654 	if (rc != 0) {
4655 		pr_err("error %d\n", rc);
4656 		goto rw_error;
4657 	}
4658 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20, 0);
4659 	if (rc != 0) {
4660 		pr_err("error %d\n", rc);
4661 		goto rw_error;
4662 	}
4663 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MIN__A, ki_min, 0);
4664 	if (rc != 0) {
4665 		pr_err("error %d\n", rc);
4666 		goto rw_error;
4667 	}
4668 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAX__A, ki_max, 0);
4669 	if (rc != 0) {
4670 		pr_err("error %d\n", rc);
4671 		goto rw_error;
4672 	}
4673 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_RED__A, 0, 0);
4674 	if (rc != 0) {
4675 		pr_err("error %d\n", rc);
4676 		goto rw_error;
4677 	}
4678 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MIN__A, 8, 0);
4679 	if (rc != 0) {
4680 		pr_err("error %d\n", rc);
4681 		goto rw_error;
4682 	}
4683 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCLEN__A, 500, 0);
4684 	if (rc != 0) {
4685 		pr_err("error %d\n", rc);
4686 		goto rw_error;
4687 	}
4688 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to, 0);
4689 	if (rc != 0) {
4690 		pr_err("error %d\n", rc);
4691 		goto rw_error;
4692 	}
4693 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MIN__A, 8, 0);
4694 	if (rc != 0) {
4695 		pr_err("error %d\n", rc);
4696 		goto rw_error;
4697 	}
4698 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to, 0);
4699 	if (rc != 0) {
4700 		pr_err("error %d\n", rc);
4701 		goto rw_error;
4702 	}
4703 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, 50, 0);
4704 	if (rc != 0) {
4705 		pr_err("error %d\n", rc);
4706 		goto rw_error;
4707 	}
4708 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode, 0);
4709 	if (rc != 0) {
4710 		pr_err("error %d\n", rc);
4711 		goto rw_error;
4712 	}
4713 
4714 	agc_rf = 0x800 + p_agc_rf_settings->cut_off_current;
4715 	if (common_attr->tuner_rf_agc_pol == true)
4716 		agc_rf = 0x87ff - agc_rf;
4717 
4718 	agc_if = 0x800;
4719 	if (common_attr->tuner_if_agc_pol == true)
4720 		agc_rf = 0x87ff - agc_rf;
4721 
4722 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_RF__A, agc_rf, 0);
4723 	if (rc != 0) {
4724 		pr_err("error %d\n", rc);
4725 		goto rw_error;
4726 	}
4727 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_IF__A, agc_if, 0);
4728 	if (rc != 0) {
4729 		pr_err("error %d\n", rc);
4730 		goto rw_error;
4731 	}
4732 
4733 	/* Set/restore Ki DGAIN factor */
4734 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4735 	if (rc != 0) {
4736 		pr_err("error %d\n", rc);
4737 		goto rw_error;
4738 	}
4739 	data &= ~SCU_RAM_AGC_KI_DGAIN__M;
4740 	data |= (agc_ki_dgain << SCU_RAM_AGC_KI_DGAIN__B);
4741 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4742 	if (rc != 0) {
4743 		pr_err("error %d\n", rc);
4744 		goto rw_error;
4745 	}
4746 
4747 	return 0;
4748 rw_error:
4749 	return rc;
4750 }
4751 
4752 /*
4753 * \fn int set_frequency ()
4754 * \brief Set frequency shift.
4755 * \param demod instance of demodulator.
4756 * \param channel pointer to channel data.
4757 * \param tuner_freq_offset residual frequency from tuner.
4758 * \return int.
4759 */
4760 static int
4761 set_frequency(struct drx_demod_instance *demod,
4762 	      struct drx_channel *channel, s32 tuner_freq_offset)
4763 {
4764 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
4765 	struct drxj_data *ext_attr = demod->my_ext_attr;
4766 	int rc;
4767 	s32 sampling_frequency = 0;
4768 	s32 frequency_shift = 0;
4769 	s32 if_freq_actual = 0;
4770 	s32 rf_freq_residual = -1 * tuner_freq_offset;
4771 	s32 adc_freq = 0;
4772 	s32 intermediate_freq = 0;
4773 	u32 iqm_fs_rate_ofs = 0;
4774 	bool adc_flip = true;
4775 	bool select_pos_image = false;
4776 	bool rf_mirror;
4777 	bool tuner_mirror;
4778 	bool image_to_select = true;
4779 	s32 fm_frequency_shift = 0;
4780 
4781 	rf_mirror = (ext_attr->mirror == DRX_MIRROR_YES) ? true : false;
4782 	tuner_mirror = demod->my_common_attr->mirror_freq_spect ? false : true;
4783 	/*
4784 	   Program frequency shifter
4785 	   No need to account for mirroring on RF
4786 	 */
4787 	switch (ext_attr->standard) {
4788 	case DRX_STANDARD_ITU_A:
4789 	case DRX_STANDARD_ITU_C:
4790 	case DRX_STANDARD_PAL_SECAM_LP:
4791 	case DRX_STANDARD_8VSB:
4792 		select_pos_image = true;
4793 		break;
4794 	case DRX_STANDARD_FM:
4795 		/* After IQM FS sound carrier must appear at 4 Mhz in spect.
4796 		   Sound carrier is already 3Mhz above centre frequency due
4797 		   to tuner setting so now add an extra shift of 1MHz... */
4798 		fm_frequency_shift = 1000;
4799 		fallthrough;
4800 	case DRX_STANDARD_ITU_B:
4801 	case DRX_STANDARD_NTSC:
4802 	case DRX_STANDARD_PAL_SECAM_BG:
4803 	case DRX_STANDARD_PAL_SECAM_DK:
4804 	case DRX_STANDARD_PAL_SECAM_I:
4805 	case DRX_STANDARD_PAL_SECAM_L:
4806 		select_pos_image = false;
4807 		break;
4808 	default:
4809 		return -EINVAL;
4810 	}
4811 	intermediate_freq = demod->my_common_attr->intermediate_freq;
4812 	sampling_frequency = demod->my_common_attr->sys_clock_freq / 3;
4813 	if (tuner_mirror)
4814 		if_freq_actual = intermediate_freq + rf_freq_residual + fm_frequency_shift;
4815 	else
4816 		if_freq_actual = intermediate_freq - rf_freq_residual - fm_frequency_shift;
4817 	if (if_freq_actual > sampling_frequency / 2) {
4818 		/* adc mirrors */
4819 		adc_freq = sampling_frequency - if_freq_actual;
4820 		adc_flip = true;
4821 	} else {
4822 		/* adc doesn't mirror */
4823 		adc_freq = if_freq_actual;
4824 		adc_flip = false;
4825 	}
4826 
4827 	frequency_shift = adc_freq;
4828 	image_to_select =
4829 	    (bool) (rf_mirror ^ tuner_mirror ^ adc_flip ^ select_pos_image);
4830 	iqm_fs_rate_ofs = frac28(frequency_shift, sampling_frequency);
4831 
4832 	if (image_to_select)
4833 		iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
4834 
4835 	/* Program frequency shifter with tuner offset compensation */
4836 	/* frequency_shift += tuner_freq_offset; TODO */
4837 	rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
4838 	if (rc != 0) {
4839 		pr_err("error %d\n", rc);
4840 		goto rw_error;
4841 	}
4842 	ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
4843 	ext_attr->pos_image = (bool) (rf_mirror ^ tuner_mirror ^ select_pos_image);
4844 
4845 	return 0;
4846 rw_error:
4847 	return rc;
4848 }
4849 
4850 /*
4851 * \fn int get_acc_pkt_err()
4852 * \brief Retrieve signal strength for VSB and QAM.
4853 * \param demod Pointer to demod instance
4854 * \param packet_err Pointer to packet error
4855 * \return int.
4856 * \retval 0 sig_strength contains valid data.
4857 * \retval -EINVAL sig_strength is NULL.
4858 * \retval -EIO Erroneous data, sig_strength contains invalid data.
4859 */
4860 #ifdef DRXJ_SIGNAL_ACCUM_ERR
4861 static int get_acc_pkt_err(struct drx_demod_instance *demod, u16 *packet_err)
4862 {
4863 	int rc;
4864 	static u16 pkt_err;
4865 	static u16 last_pkt_err;
4866 	u16 data = 0;
4867 	struct drxj_data *ext_attr = NULL;
4868 	struct i2c_device_addr *dev_addr = NULL;
4869 
4870 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
4871 	dev_addr = demod->my_i2c_dev_addr;
4872 
4873 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, &data, 0);
4874 	if (rc != 0) {
4875 		pr_err("error %d\n", rc);
4876 		goto rw_error;
4877 	}
4878 	if (ext_attr->reset_pkt_err_acc) {
4879 		last_pkt_err = data;
4880 		pkt_err = 0;
4881 		ext_attr->reset_pkt_err_acc = false;
4882 	}
4883 
4884 	if (data < last_pkt_err) {
4885 		pkt_err += 0xffff - last_pkt_err;
4886 		pkt_err += data;
4887 	} else {
4888 		pkt_err += (data - last_pkt_err);
4889 	}
4890 	*packet_err = pkt_err;
4891 	last_pkt_err = data;
4892 
4893 	return 0;
4894 rw_error:
4895 	return rc;
4896 }
4897 #endif
4898 
4899 
4900 /*============================================================================*/
4901 
4902 /*
4903 * \fn int set_agc_rf ()
4904 * \brief Configure RF AGC
4905 * \param demod instance of demodulator.
4906 * \param agc_settings AGC configuration structure
4907 * \return int.
4908 */
4909 static int
4910 set_agc_rf(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
4911 {
4912 	struct i2c_device_addr *dev_addr = NULL;
4913 	struct drxj_data *ext_attr = NULL;
4914 	struct drxj_cfg_agc *p_agc_settings = NULL;
4915 	struct drx_common_attr *common_attr = NULL;
4916 	int rc;
4917 	drx_write_reg16func_t scu_wr16 = NULL;
4918 	drx_read_reg16func_t scu_rr16 = NULL;
4919 
4920 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
4921 	dev_addr = demod->my_i2c_dev_addr;
4922 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
4923 
4924 	if (atomic) {
4925 		scu_rr16 = drxj_dap_scu_atomic_read_reg16;
4926 		scu_wr16 = drxj_dap_scu_atomic_write_reg16;
4927 	} else {
4928 		scu_rr16 = drxj_dap_read_reg16;
4929 		scu_wr16 = drxj_dap_write_reg16;
4930 	}
4931 
4932 	/* Configure AGC only if standard is currently active */
4933 	if ((ext_attr->standard == agc_settings->standard) ||
4934 	    (DRXJ_ISQAMSTD(ext_attr->standard) &&
4935 	     DRXJ_ISQAMSTD(agc_settings->standard)) ||
4936 	    (DRXJ_ISATVSTD(ext_attr->standard) &&
4937 	     DRXJ_ISATVSTD(agc_settings->standard))) {
4938 		u16 data = 0;
4939 
4940 		switch (agc_settings->ctrl_mode) {
4941 		case DRX_AGC_CTRL_AUTO:
4942 
4943 			/* Enable RF AGC DAC */
4944 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
4945 			if (rc != 0) {
4946 				pr_err("error %d\n", rc);
4947 				goto rw_error;
4948 			}
4949 			data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
4950 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
4951 			if (rc != 0) {
4952 				pr_err("error %d\n", rc);
4953 				goto rw_error;
4954 			}
4955 
4956 			/* Enable SCU RF AGC loop */
4957 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4958 			if (rc != 0) {
4959 				pr_err("error %d\n", rc);
4960 				goto rw_error;
4961 			}
4962 			data &= ~SCU_RAM_AGC_KI_RF__M;
4963 			if (ext_attr->standard == DRX_STANDARD_8VSB)
4964 				data |= (2 << SCU_RAM_AGC_KI_RF__B);
4965 			else if (DRXJ_ISQAMSTD(ext_attr->standard))
4966 				data |= (5 << SCU_RAM_AGC_KI_RF__B);
4967 			else
4968 				data |= (4 << SCU_RAM_AGC_KI_RF__B);
4969 
4970 			if (common_attr->tuner_rf_agc_pol)
4971 				data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
4972 			else
4973 				data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
4974 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4975 			if (rc != 0) {
4976 				pr_err("error %d\n", rc);
4977 				goto rw_error;
4978 			}
4979 
4980 			/* Set speed ( using complementary reduction value ) */
4981 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
4982 			if (rc != 0) {
4983 				pr_err("error %d\n", rc);
4984 				goto rw_error;
4985 			}
4986 			data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
4987 			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);
4988 			if (rc != 0) {
4989 				pr_err("error %d\n", rc);
4990 				goto rw_error;
4991 			}
4992 
4993 			if (agc_settings->standard == DRX_STANDARD_8VSB)
4994 				p_agc_settings = &(ext_attr->vsb_if_agc_cfg);
4995 			else if (DRXJ_ISQAMSTD(agc_settings->standard))
4996 				p_agc_settings = &(ext_attr->qam_if_agc_cfg);
4997 			else if (DRXJ_ISATVSTD(agc_settings->standard))
4998 				p_agc_settings = &(ext_attr->atv_if_agc_cfg);
4999 			else
5000 				return -EINVAL;
5001 
5002 			/* Set TOP, only if IF-AGC is in AUTO mode */
5003 			if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
5004 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->top, 0);
5005 				if (rc != 0) {
5006 					pr_err("error %d\n", rc);
5007 					goto rw_error;
5008 				}
5009 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, agc_settings->top, 0);
5010 				if (rc != 0) {
5011 					pr_err("error %d\n", rc);
5012 					goto rw_error;
5013 				}
5014 			}
5015 
5016 			/* Cut-Off current */
5017 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI_CO__A, agc_settings->cut_off_current, 0);
5018 			if (rc != 0) {
5019 				pr_err("error %d\n", rc);
5020 				goto rw_error;
5021 			}
5022 			break;
5023 		case DRX_AGC_CTRL_USER:
5024 
5025 			/* Enable RF AGC DAC */
5026 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5027 			if (rc != 0) {
5028 				pr_err("error %d\n", rc);
5029 				goto rw_error;
5030 			}
5031 			data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
5032 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5033 			if (rc != 0) {
5034 				pr_err("error %d\n", rc);
5035 				goto rw_error;
5036 			}
5037 
5038 			/* Disable SCU RF AGC loop */
5039 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5040 			if (rc != 0) {
5041 				pr_err("error %d\n", rc);
5042 				goto rw_error;
5043 			}
5044 			data &= ~SCU_RAM_AGC_KI_RF__M;
5045 			if (common_attr->tuner_rf_agc_pol)
5046 				data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
5047 			else
5048 				data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
5049 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5050 			if (rc != 0) {
5051 				pr_err("error %d\n", rc);
5052 				goto rw_error;
5053 			}
5054 
5055 			/* Write value to output pin */
5056 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, agc_settings->output_level, 0);
5057 			if (rc != 0) {
5058 				pr_err("error %d\n", rc);
5059 				goto rw_error;
5060 			}
5061 			break;
5062 		case DRX_AGC_CTRL_OFF:
5063 
5064 			/* Disable RF AGC DAC */
5065 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5066 			if (rc != 0) {
5067 				pr_err("error %d\n", rc);
5068 				goto rw_error;
5069 			}
5070 			data &= (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE);
5071 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5072 			if (rc != 0) {
5073 				pr_err("error %d\n", rc);
5074 				goto rw_error;
5075 			}
5076 
5077 			/* Disable SCU RF AGC loop */
5078 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5079 			if (rc != 0) {
5080 				pr_err("error %d\n", rc);
5081 				goto rw_error;
5082 			}
5083 			data &= ~SCU_RAM_AGC_KI_RF__M;
5084 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5085 			if (rc != 0) {
5086 				pr_err("error %d\n", rc);
5087 				goto rw_error;
5088 			}
5089 			break;
5090 		default:
5091 			return -EINVAL;
5092 		}		/* switch ( agcsettings->ctrl_mode ) */
5093 	}
5094 
5095 	/* Store rf agc settings */
5096 	switch (agc_settings->standard) {
5097 	case DRX_STANDARD_8VSB:
5098 		ext_attr->vsb_rf_agc_cfg = *agc_settings;
5099 		break;
5100 #ifndef DRXJ_VSB_ONLY
5101 	case DRX_STANDARD_ITU_A:
5102 	case DRX_STANDARD_ITU_B:
5103 	case DRX_STANDARD_ITU_C:
5104 		ext_attr->qam_rf_agc_cfg = *agc_settings;
5105 		break;
5106 #endif
5107 	default:
5108 		return -EIO;
5109 	}
5110 
5111 	return 0;
5112 rw_error:
5113 	return rc;
5114 }
5115 
5116 /*
5117 * \fn int set_agc_if ()
5118 * \brief Configure If AGC
5119 * \param demod instance of demodulator.
5120 * \param agc_settings AGC configuration structure
5121 * \return int.
5122 */
5123 static int
5124 set_agc_if(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
5125 {
5126 	struct i2c_device_addr *dev_addr = NULL;
5127 	struct drxj_data *ext_attr = NULL;
5128 	struct drxj_cfg_agc *p_agc_settings = NULL;
5129 	struct drx_common_attr *common_attr = NULL;
5130 	drx_write_reg16func_t scu_wr16 = NULL;
5131 	drx_read_reg16func_t scu_rr16 = NULL;
5132 	int rc;
5133 
5134 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
5135 	dev_addr = demod->my_i2c_dev_addr;
5136 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
5137 
5138 	if (atomic) {
5139 		scu_rr16 = drxj_dap_scu_atomic_read_reg16;
5140 		scu_wr16 = drxj_dap_scu_atomic_write_reg16;
5141 	} else {
5142 		scu_rr16 = drxj_dap_read_reg16;
5143 		scu_wr16 = drxj_dap_write_reg16;
5144 	}
5145 
5146 	/* Configure AGC only if standard is currently active */
5147 	if ((ext_attr->standard == agc_settings->standard) ||
5148 	    (DRXJ_ISQAMSTD(ext_attr->standard) &&
5149 	     DRXJ_ISQAMSTD(agc_settings->standard)) ||
5150 	    (DRXJ_ISATVSTD(ext_attr->standard) &&
5151 	     DRXJ_ISATVSTD(agc_settings->standard))) {
5152 		u16 data = 0;
5153 
5154 		switch (agc_settings->ctrl_mode) {
5155 		case DRX_AGC_CTRL_AUTO:
5156 			/* Enable IF AGC DAC */
5157 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5158 			if (rc != 0) {
5159 				pr_err("error %d\n", rc);
5160 				goto rw_error;
5161 			}
5162 			data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5163 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5164 			if (rc != 0) {
5165 				pr_err("error %d\n", rc);
5166 				goto rw_error;
5167 			}
5168 
5169 			/* Enable SCU IF AGC loop */
5170 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5171 			if (rc != 0) {
5172 				pr_err("error %d\n", rc);
5173 				goto rw_error;
5174 			}
5175 			data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5176 			data &= ~SCU_RAM_AGC_KI_IF__M;
5177 			if (ext_attr->standard == DRX_STANDARD_8VSB)
5178 				data |= (3 << SCU_RAM_AGC_KI_IF__B);
5179 			else if (DRXJ_ISQAMSTD(ext_attr->standard))
5180 				data |= (6 << SCU_RAM_AGC_KI_IF__B);
5181 			else
5182 				data |= (5 << SCU_RAM_AGC_KI_IF__B);
5183 
5184 			if (common_attr->tuner_if_agc_pol)
5185 				data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5186 			else
5187 				data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5188 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5189 			if (rc != 0) {
5190 				pr_err("error %d\n", rc);
5191 				goto rw_error;
5192 			}
5193 
5194 			/* Set speed (using complementary reduction value) */
5195 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
5196 			if (rc != 0) {
5197 				pr_err("error %d\n", rc);
5198 				goto rw_error;
5199 			}
5200 			data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
5201 			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);
5202 			if (rc != 0) {
5203 				pr_err("error %d\n", rc);
5204 				goto rw_error;
5205 			}
5206 
5207 			if (agc_settings->standard == DRX_STANDARD_8VSB)
5208 				p_agc_settings = &(ext_attr->vsb_rf_agc_cfg);
5209 			else if (DRXJ_ISQAMSTD(agc_settings->standard))
5210 				p_agc_settings = &(ext_attr->qam_rf_agc_cfg);
5211 			else if (DRXJ_ISATVSTD(agc_settings->standard))
5212 				p_agc_settings = &(ext_attr->atv_rf_agc_cfg);
5213 			else
5214 				return -EINVAL;
5215 
5216 			/* Restore TOP */
5217 			if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
5218 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, p_agc_settings->top, 0);
5219 				if (rc != 0) {
5220 					pr_err("error %d\n", rc);
5221 					goto rw_error;
5222 				}
5223 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, p_agc_settings->top, 0);
5224 				if (rc != 0) {
5225 					pr_err("error %d\n", rc);
5226 					goto rw_error;
5227 				}
5228 			} else {
5229 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, 0, 0);
5230 				if (rc != 0) {
5231 					pr_err("error %d\n", rc);
5232 					goto rw_error;
5233 				}
5234 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, 0, 0);
5235 				if (rc != 0) {
5236 					pr_err("error %d\n", rc);
5237 					goto rw_error;
5238 				}
5239 			}
5240 			break;
5241 
5242 		case DRX_AGC_CTRL_USER:
5243 
5244 			/* Enable IF AGC DAC */
5245 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5246 			if (rc != 0) {
5247 				pr_err("error %d\n", rc);
5248 				goto rw_error;
5249 			}
5250 			data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5251 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5252 			if (rc != 0) {
5253 				pr_err("error %d\n", rc);
5254 				goto rw_error;
5255 			}
5256 
5257 			/* Disable SCU IF AGC loop */
5258 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5259 			if (rc != 0) {
5260 				pr_err("error %d\n", rc);
5261 				goto rw_error;
5262 			}
5263 			data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5264 			data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5265 			if (common_attr->tuner_if_agc_pol)
5266 				data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5267 			else
5268 				data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5269 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5270 			if (rc != 0) {
5271 				pr_err("error %d\n", rc);
5272 				goto rw_error;
5273 			}
5274 
5275 			/* Write value to output pin */
5276 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->output_level, 0);
5277 			if (rc != 0) {
5278 				pr_err("error %d\n", rc);
5279 				goto rw_error;
5280 			}
5281 			break;
5282 
5283 		case DRX_AGC_CTRL_OFF:
5284 
5285 			/* Disable If AGC DAC */
5286 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5287 			if (rc != 0) {
5288 				pr_err("error %d\n", rc);
5289 				goto rw_error;
5290 			}
5291 			data &= (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE);
5292 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5293 			if (rc != 0) {
5294 				pr_err("error %d\n", rc);
5295 				goto rw_error;
5296 			}
5297 
5298 			/* Disable SCU IF AGC loop */
5299 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5300 			if (rc != 0) {
5301 				pr_err("error %d\n", rc);
5302 				goto rw_error;
5303 			}
5304 			data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5305 			data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5306 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5307 			if (rc != 0) {
5308 				pr_err("error %d\n", rc);
5309 				goto rw_error;
5310 			}
5311 			break;
5312 		default:
5313 			return -EINVAL;
5314 		}		/* switch ( agcsettings->ctrl_mode ) */
5315 
5316 		/* always set the top to support configurations without if-loop */
5317 		rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, agc_settings->top, 0);
5318 		if (rc != 0) {
5319 			pr_err("error %d\n", rc);
5320 			goto rw_error;
5321 		}
5322 	}
5323 
5324 	/* Store if agc settings */
5325 	switch (agc_settings->standard) {
5326 	case DRX_STANDARD_8VSB:
5327 		ext_attr->vsb_if_agc_cfg = *agc_settings;
5328 		break;
5329 #ifndef DRXJ_VSB_ONLY
5330 	case DRX_STANDARD_ITU_A:
5331 	case DRX_STANDARD_ITU_B:
5332 	case DRX_STANDARD_ITU_C:
5333 		ext_attr->qam_if_agc_cfg = *agc_settings;
5334 		break;
5335 #endif
5336 	default:
5337 		return -EIO;
5338 	}
5339 
5340 	return 0;
5341 rw_error:
5342 	return rc;
5343 }
5344 
5345 /*
5346 * \fn int set_iqm_af ()
5347 * \brief Configure IQM AF registers
5348 * \param demod instance of demodulator.
5349 * \param active
5350 * \return int.
5351 */
5352 static int set_iqm_af(struct drx_demod_instance *demod, bool active)
5353 {
5354 	u16 data = 0;
5355 	struct i2c_device_addr *dev_addr = NULL;
5356 	int rc;
5357 
5358 	dev_addr = demod->my_i2c_dev_addr;
5359 
5360 	/* Configure IQM */
5361 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5362 	if (rc != 0) {
5363 		pr_err("error %d\n", rc);
5364 		goto rw_error;
5365 	}
5366 	if (!active)
5367 		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));
5368 	else
5369 		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);
5370 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5371 	if (rc != 0) {
5372 		pr_err("error %d\n", rc);
5373 		goto rw_error;
5374 	}
5375 
5376 	return 0;
5377 rw_error:
5378 	return rc;
5379 }
5380 
5381 /*============================================================================*/
5382 /*==              END 8VSB & QAM COMMON DATAPATH FUNCTIONS                  ==*/
5383 /*============================================================================*/
5384 
5385 /*============================================================================*/
5386 /*============================================================================*/
5387 /*==                       8VSB DATAPATH FUNCTIONS                          ==*/
5388 /*============================================================================*/
5389 /*============================================================================*/
5390 
5391 /*
5392 * \fn int power_down_vsb ()
5393 * \brief Powr down QAM related blocks.
5394 * \param demod instance of demodulator.
5395 * \param channel pointer to channel data.
5396 * \return int.
5397 */
5398 static int power_down_vsb(struct drx_demod_instance *demod, bool primary)
5399 {
5400 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
5401 	struct drxjscu_cmd cmd_scu = { /* command     */ 0,
5402 		/* parameter_len */ 0,
5403 		/* result_len    */ 0,
5404 		/* *parameter   */ NULL,
5405 		/* *result      */ NULL
5406 	};
5407 	struct drx_cfg_mpeg_output cfg_mpeg_output;
5408 	int rc;
5409 	u16 cmd_result = 0;
5410 
5411 	/*
5412 	   STOP demodulator
5413 	   reset of FEC and VSB HW
5414 	 */
5415 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
5416 	    SCU_RAM_COMMAND_CMD_DEMOD_STOP;
5417 	cmd_scu.parameter_len = 0;
5418 	cmd_scu.result_len = 1;
5419 	cmd_scu.parameter = NULL;
5420 	cmd_scu.result = &cmd_result;
5421 	rc = scu_command(dev_addr, &cmd_scu);
5422 	if (rc != 0) {
5423 		pr_err("error %d\n", rc);
5424 		goto rw_error;
5425 	}
5426 
5427 	/* stop all comm_exec */
5428 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5429 	if (rc != 0) {
5430 		pr_err("error %d\n", rc);
5431 		goto rw_error;
5432 	}
5433 	rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5434 	if (rc != 0) {
5435 		pr_err("error %d\n", rc);
5436 		goto rw_error;
5437 	}
5438 	if (primary) {
5439 		rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
5440 		if (rc != 0) {
5441 			pr_err("error %d\n", rc);
5442 			goto rw_error;
5443 		}
5444 		rc = set_iqm_af(demod, false);
5445 		if (rc != 0) {
5446 			pr_err("error %d\n", rc);
5447 			goto rw_error;
5448 		}
5449 	} else {
5450 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5451 		if (rc != 0) {
5452 			pr_err("error %d\n", rc);
5453 			goto rw_error;
5454 		}
5455 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5456 		if (rc != 0) {
5457 			pr_err("error %d\n", rc);
5458 			goto rw_error;
5459 		}
5460 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5461 		if (rc != 0) {
5462 			pr_err("error %d\n", rc);
5463 			goto rw_error;
5464 		}
5465 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5466 		if (rc != 0) {
5467 			pr_err("error %d\n", rc);
5468 			goto rw_error;
5469 		}
5470 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5471 		if (rc != 0) {
5472 			pr_err("error %d\n", rc);
5473 			goto rw_error;
5474 		}
5475 	}
5476 
5477 	cfg_mpeg_output.enable_mpeg_output = false;
5478 	rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
5479 	if (rc != 0) {
5480 		pr_err("error %d\n", rc);
5481 		goto rw_error;
5482 	}
5483 
5484 	return 0;
5485 rw_error:
5486 	return rc;
5487 }
5488 
5489 /*
5490 * \fn int set_vsb_leak_n_gain ()
5491 * \brief Set ATSC demod.
5492 * \param demod instance of demodulator.
5493 * \return int.
5494 */
5495 static int set_vsb_leak_n_gain(struct drx_demod_instance *demod)
5496 {
5497 	struct i2c_device_addr *dev_addr = NULL;
5498 	int rc;
5499 
5500 	static const u8 vsb_ffe_leak_gain_ram0[] = {
5501 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO1  */
5502 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO2  */
5503 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO3  */
5504 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO4  */
5505 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO5  */
5506 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO6  */
5507 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO7  */
5508 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO8  */
5509 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO9  */
5510 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO10  */
5511 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO11 */
5512 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO12 */
5513 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO1 */
5514 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO2 */
5515 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO3 */
5516 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO4 */
5517 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO5 */
5518 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO6 */
5519 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO7 */
5520 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO8 */
5521 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO9 */
5522 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO10 */
5523 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO11 */
5524 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO12 */
5525 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO1 */
5526 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO2 */
5527 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO3 */
5528 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO4 */
5529 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO5 */
5530 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO6 */
5531 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO7 */
5532 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO8 */
5533 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO9 */
5534 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO10 */
5535 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO11 */
5536 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO12 */
5537 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO1 */
5538 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO2 */
5539 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO3 */
5540 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO4 */
5541 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO5 */
5542 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO6 */
5543 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO7 */
5544 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO8 */
5545 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO9 */
5546 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO10 */
5547 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO11 */
5548 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO12 */
5549 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO1 */
5550 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO2 */
5551 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO3 */
5552 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO4 */
5553 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO5 */
5554 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO6 */
5555 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO7 */
5556 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO8 */
5557 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO9 */
5558 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO10 */
5559 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO11 */
5560 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO12 */
5561 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO1 */
5562 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO2 */
5563 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO3 */
5564 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO4 */
5565 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO5 */
5566 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO6 */
5567 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO7 */
5568 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO8 */
5569 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO9 */
5570 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO10 */
5571 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO11 */
5572 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO12 */
5573 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO1 */
5574 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO2 */
5575 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO3 */
5576 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO4 */
5577 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO5 */
5578 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO6 */
5579 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO7 */
5580 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO8 */
5581 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO9 */
5582 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO10 */
5583 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO11 */
5584 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO12 */
5585 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO1 */
5586 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO2 */
5587 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO3 */
5588 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO4 */
5589 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO5 */
5590 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO6 */
5591 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO7 */
5592 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO8 */
5593 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO9 */
5594 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO10 */
5595 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO11 */
5596 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO12 */
5597 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO1 */
5598 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO2 */
5599 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO3 */
5600 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO4 */
5601 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO5 */
5602 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO6 */
5603 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO7 */
5604 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO8 */
5605 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO9 */
5606 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO10 */
5607 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO11 */
5608 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO12 */
5609 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN1 */
5610 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN2 */
5611 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN3 */
5612 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN4 */
5613 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN5 */
5614 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN6 */
5615 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN7 */
5616 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN8 */
5617 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN9 */
5618 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN10 */
5619 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN11 */
5620 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN12 */
5621 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN1 */
5622 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN2 */
5623 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN3 */
5624 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN4 */
5625 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN5 */
5626 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN6 */
5627 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN7 */
5628 		DRXJ_16TO8(0x1010)	/* FIRRCA1GAIN8 */
5629 	};
5630 
5631 	static const u8 vsb_ffe_leak_gain_ram1[] = {
5632 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN9 */
5633 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN10 */
5634 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN11 */
5635 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN12 */
5636 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN1 */
5637 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN2 */
5638 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN3 */
5639 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN4 */
5640 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN5 */
5641 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN6 */
5642 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN7 */
5643 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN8 */
5644 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN9 */
5645 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN10 */
5646 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN11 */
5647 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN12 */
5648 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN1 */
5649 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN2 */
5650 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN3 */
5651 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN4 */
5652 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN5 */
5653 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN6 */
5654 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN7 */
5655 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN8 */
5656 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN9 */
5657 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN10 */
5658 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN11 */
5659 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN12 */
5660 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN1 */
5661 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN2 */
5662 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN3 */
5663 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN4 */
5664 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN5 */
5665 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN6 */
5666 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN7 */
5667 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN8 */
5668 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN9 */
5669 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN10 */
5670 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN11 */
5671 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN12 */
5672 		DRXJ_16TO8(0x001f),	/* DFETRAINLKRATIO */
5673 		DRXJ_16TO8(0x01ff),	/* DFERCA1TRAINLKRATIO */
5674 		DRXJ_16TO8(0x01ff),	/* DFERCA1DATALKRATIO */
5675 		DRXJ_16TO8(0x004f),	/* DFERCA2TRAINLKRATIO */
5676 		DRXJ_16TO8(0x004f),	/* DFERCA2DATALKRATIO */
5677 		DRXJ_16TO8(0x01ff),	/* DFEDDM1TRAINLKRATIO */
5678 		DRXJ_16TO8(0x01ff),	/* DFEDDM1DATALKRATIO */
5679 		DRXJ_16TO8(0x0352),	/* DFEDDM2TRAINLKRATIO */
5680 		DRXJ_16TO8(0x0352),	/* DFEDDM2DATALKRATIO */
5681 		DRXJ_16TO8(0x0000),	/* DFETRAINGAIN */
5682 		DRXJ_16TO8(0x2020),	/* DFERCA1GAIN */
5683 		DRXJ_16TO8(0x1010),	/* DFERCA2GAIN */
5684 		DRXJ_16TO8(0x1818),	/* DFEDDM1GAIN */
5685 		DRXJ_16TO8(0x1212)	/* DFEDDM2GAIN */
5686 	};
5687 
5688 	dev_addr = demod->my_i2c_dev_addr;
5689 	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);
5690 	if (rc != 0) {
5691 		pr_err("error %d\n", rc);
5692 		goto rw_error;
5693 	}
5694 	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);
5695 	if (rc != 0) {
5696 		pr_err("error %d\n", rc);
5697 		goto rw_error;
5698 	}
5699 
5700 	return 0;
5701 rw_error:
5702 	return rc;
5703 }
5704 
5705 /*
5706 * \fn int set_vsb()
5707 * \brief Set 8VSB demod.
5708 * \param demod instance of demodulator.
5709 * \return int.
5710 *
5711 */
5712 static int set_vsb(struct drx_demod_instance *demod)
5713 {
5714 	struct i2c_device_addr *dev_addr = NULL;
5715 	int rc;
5716 	struct drx_common_attr *common_attr = NULL;
5717 	struct drxjscu_cmd cmd_scu;
5718 	struct drxj_data *ext_attr = NULL;
5719 	u16 cmd_result = 0;
5720 	u16 cmd_param = 0;
5721 	static const u8 vsb_taps_re[] = {
5722 		DRXJ_16TO8(-2),	/* re0  */
5723 		DRXJ_16TO8(4),	/* re1  */
5724 		DRXJ_16TO8(1),	/* re2  */
5725 		DRXJ_16TO8(-4),	/* re3  */
5726 		DRXJ_16TO8(1),	/* re4  */
5727 		DRXJ_16TO8(4),	/* re5  */
5728 		DRXJ_16TO8(-3),	/* re6  */
5729 		DRXJ_16TO8(-3),	/* re7  */
5730 		DRXJ_16TO8(6),	/* re8  */
5731 		DRXJ_16TO8(1),	/* re9  */
5732 		DRXJ_16TO8(-9),	/* re10 */
5733 		DRXJ_16TO8(3),	/* re11 */
5734 		DRXJ_16TO8(12),	/* re12 */
5735 		DRXJ_16TO8(-9),	/* re13 */
5736 		DRXJ_16TO8(-15),	/* re14 */
5737 		DRXJ_16TO8(17),	/* re15 */
5738 		DRXJ_16TO8(19),	/* re16 */
5739 		DRXJ_16TO8(-29),	/* re17 */
5740 		DRXJ_16TO8(-22),	/* re18 */
5741 		DRXJ_16TO8(45),	/* re19 */
5742 		DRXJ_16TO8(25),	/* re20 */
5743 		DRXJ_16TO8(-70),	/* re21 */
5744 		DRXJ_16TO8(-28),	/* re22 */
5745 		DRXJ_16TO8(111),	/* re23 */
5746 		DRXJ_16TO8(30),	/* re24 */
5747 		DRXJ_16TO8(-201),	/* re25 */
5748 		DRXJ_16TO8(-31),	/* re26 */
5749 		DRXJ_16TO8(629)	/* re27 */
5750 	};
5751 
5752 	dev_addr = demod->my_i2c_dev_addr;
5753 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
5754 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
5755 
5756 	/* stop all comm_exec */
5757 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5758 	if (rc != 0) {
5759 		pr_err("error %d\n", rc);
5760 		goto rw_error;
5761 	}
5762 	rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5763 	if (rc != 0) {
5764 		pr_err("error %d\n", rc);
5765 		goto rw_error;
5766 	}
5767 	rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5768 	if (rc != 0) {
5769 		pr_err("error %d\n", rc);
5770 		goto rw_error;
5771 	}
5772 	rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5773 	if (rc != 0) {
5774 		pr_err("error %d\n", rc);
5775 		goto rw_error;
5776 	}
5777 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5778 	if (rc != 0) {
5779 		pr_err("error %d\n", rc);
5780 		goto rw_error;
5781 	}
5782 	rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5783 	if (rc != 0) {
5784 		pr_err("error %d\n", rc);
5785 		goto rw_error;
5786 	}
5787 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5788 	if (rc != 0) {
5789 		pr_err("error %d\n", rc);
5790 		goto rw_error;
5791 	}
5792 
5793 	/* reset demodulator */
5794 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
5795 	    | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
5796 	cmd_scu.parameter_len = 0;
5797 	cmd_scu.result_len = 1;
5798 	cmd_scu.parameter = NULL;
5799 	cmd_scu.result = &cmd_result;
5800 	rc = scu_command(dev_addr, &cmd_scu);
5801 	if (rc != 0) {
5802 		pr_err("error %d\n", rc);
5803 		goto rw_error;
5804 	}
5805 
5806 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_DCF_BYPASS__A, 1, 0);
5807 	if (rc != 0) {
5808 		pr_err("error %d\n", rc);
5809 		goto rw_error;
5810 	}
5811 	rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, IQM_FS_ADJ_SEL_B_VSB, 0);
5812 	if (rc != 0) {
5813 		pr_err("error %d\n", rc);
5814 		goto rw_error;
5815 	}
5816 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, IQM_RC_ADJ_SEL_B_VSB, 0);
5817 	if (rc != 0) {
5818 		pr_err("error %d\n", rc);
5819 		goto rw_error;
5820 	}
5821 	ext_attr->iqm_rc_rate_ofs = 0x00AD0D79;
5822 	rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, ext_attr->iqm_rc_rate_ofs, 0);
5823 	if (rc != 0) {
5824 		pr_err("error %d\n", rc);
5825 		goto rw_error;
5826 	}
5827 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CFAGC_GAINSHIFT__A, 4, 0);
5828 	if (rc != 0) {
5829 		pr_err("error %d\n", rc);
5830 		goto rw_error;
5831 	}
5832 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 1, 0);
5833 	if (rc != 0) {
5834 		pr_err("error %d\n", rc);
5835 		goto rw_error;
5836 	}
5837 
5838 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_CROUT_ENA__A, 1, 0);
5839 	if (rc != 0) {
5840 		pr_err("error %d\n", rc);
5841 		goto rw_error;
5842 	}
5843 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, 28, 0);
5844 	if (rc != 0) {
5845 		pr_err("error %d\n", rc);
5846 		goto rw_error;
5847 	}
5848 	rc = drxj_dap_write_reg16(dev_addr, IQM_RT_ACTIVE__A, 0, 0);
5849 	if (rc != 0) {
5850 		pr_err("error %d\n", rc);
5851 		goto rw_error;
5852 	}
5853 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
5854 	if (rc != 0) {
5855 		pr_err("error %d\n", rc);
5856 		goto rw_error;
5857 	}
5858 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
5859 	if (rc != 0) {
5860 		pr_err("error %d\n", rc);
5861 		goto rw_error;
5862 	}
5863 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_VSB__M, 0);
5864 	if (rc != 0) {
5865 		pr_err("error %d\n", rc);
5866 		goto rw_error;
5867 	}
5868 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE__A, 1393, 0);
5869 	if (rc != 0) {
5870 		pr_err("error %d\n", rc);
5871 		goto rw_error;
5872 	}
5873 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
5874 	if (rc != 0) {
5875 		pr_err("error %d\n", rc);
5876 		goto rw_error;
5877 	}
5878 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
5879 	if (rc != 0) {
5880 		pr_err("error %d\n", rc);
5881 		goto rw_error;
5882 	}
5883 
5884 	rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5885 	if (rc != 0) {
5886 		pr_err("error %d\n", rc);
5887 		goto rw_error;
5888 	}
5889 	rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5890 	if (rc != 0) {
5891 		pr_err("error %d\n", rc);
5892 		goto rw_error;
5893 	}
5894 
5895 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BNTHRESH__A, 330, 0);
5896 	if (rc != 0) {
5897 		pr_err("error %d\n", rc);
5898 		goto rw_error;
5899 	}	/* set higher threshold */
5900 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CLPLASTNUM__A, 90, 0);
5901 	if (rc != 0) {
5902 		pr_err("error %d\n", rc);
5903 		goto rw_error;
5904 	}	/* burst detection on   */
5905 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA1__A, 0x0042, 0);
5906 	if (rc != 0) {
5907 		pr_err("error %d\n", rc);
5908 		goto rw_error;
5909 	}	/* drop thresholds by 1 dB */
5910 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA2__A, 0x0053, 0);
5911 	if (rc != 0) {
5912 		pr_err("error %d\n", rc);
5913 		goto rw_error;
5914 	}	/* drop thresholds by 2 dB */
5915 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_EQCTRL__A, 0x1, 0);
5916 	if (rc != 0) {
5917 		pr_err("error %d\n", rc);
5918 		goto rw_error;
5919 	}	/* cma on               */
5920 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
5921 	if (rc != 0) {
5922 		pr_err("error %d\n", rc);
5923 		goto rw_error;
5924 	}	/* GPIO               */
5925 
5926 	/* Initialize the FEC Subsystem */
5927 	rc = drxj_dap_write_reg16(dev_addr, FEC_TOP_ANNEX__A, FEC_TOP_ANNEX_D, 0);
5928 	if (rc != 0) {
5929 		pr_err("error %d\n", rc);
5930 		goto rw_error;
5931 	}
5932 	{
5933 		u16 fec_oc_snc_mode = 0;
5934 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
5935 		if (rc != 0) {
5936 			pr_err("error %d\n", rc);
5937 			goto rw_error;
5938 		}
5939 		/* output data even when not locked */
5940 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode | FEC_OC_SNC_MODE_UNLOCK_ENABLE__M, 0);
5941 		if (rc != 0) {
5942 			pr_err("error %d\n", rc);
5943 			goto rw_error;
5944 		}
5945 	}
5946 
5947 	/* set clip */
5948 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
5949 	if (rc != 0) {
5950 		pr_err("error %d\n", rc);
5951 		goto rw_error;
5952 	}
5953 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 470, 0);
5954 	if (rc != 0) {
5955 		pr_err("error %d\n", rc);
5956 		goto rw_error;
5957 	}
5958 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
5959 	if (rc != 0) {
5960 		pr_err("error %d\n", rc);
5961 		goto rw_error;
5962 	}
5963 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0xD4, 0);
5964 	if (rc != 0) {
5965 		pr_err("error %d\n", rc);
5966 		goto rw_error;
5967 	}
5968 	/* no transparent, no A&C framing; parity is set in mpegoutput */
5969 	{
5970 		u16 fec_oc_reg_mode = 0;
5971 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
5972 		if (rc != 0) {
5973 			pr_err("error %d\n", rc);
5974 			goto rw_error;
5975 		}
5976 		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);
5977 		if (rc != 0) {
5978 			pr_err("error %d\n", rc);
5979 			goto rw_error;
5980 		}
5981 	}
5982 
5983 	rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_LO__A, 0, 0);
5984 	if (rc != 0) {
5985 		pr_err("error %d\n", rc);
5986 		goto rw_error;
5987 	}	/* timeout counter for restarting */
5988 	rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_HI__A, 3, 0);
5989 	if (rc != 0) {
5990 		pr_err("error %d\n", rc);
5991 		goto rw_error;
5992 	}
5993 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MODE__A, 0, 0);
5994 	if (rc != 0) {
5995 		pr_err("error %d\n", rc);
5996 		goto rw_error;
5997 	}	/* bypass disabled */
5998 	/* initialize RS packet error measurement parameters */
5999 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, FEC_RS_MEASUREMENT_PERIOD, 0);
6000 	if (rc != 0) {
6001 		pr_err("error %d\n", rc);
6002 		goto rw_error;
6003 	}
6004 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, FEC_RS_MEASUREMENT_PRESCALE, 0);
6005 	if (rc != 0) {
6006 		pr_err("error %d\n", rc);
6007 		goto rw_error;
6008 	}
6009 
6010 	/* init measurement period of MER/SER */
6011 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_MEASUREMENT_PERIOD__A, VSB_TOP_MEASUREMENT_PERIOD, 0);
6012 	if (rc != 0) {
6013 		pr_err("error %d\n", rc);
6014 		goto rw_error;
6015 	}
6016 	rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6017 	if (rc != 0) {
6018 		pr_err("error %d\n", rc);
6019 		goto rw_error;
6020 	}
6021 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6022 	if (rc != 0) {
6023 		pr_err("error %d\n", rc);
6024 		goto rw_error;
6025 	}
6026 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6027 	if (rc != 0) {
6028 		pr_err("error %d\n", rc);
6029 		goto rw_error;
6030 	}
6031 
6032 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CKGN1TRK__A, 128, 0);
6033 	if (rc != 0) {
6034 		pr_err("error %d\n", rc);
6035 		goto rw_error;
6036 	}
6037 	/* B-Input to ADC, PGA+filter in standby */
6038 	if (!ext_attr->has_lna) {
6039 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
6040 		if (rc != 0) {
6041 			pr_err("error %d\n", rc);
6042 			goto rw_error;
6043 		}
6044 	}
6045 
6046 	/* turn on IQMAF. It has to be in front of setAgc**() */
6047 	rc = set_iqm_af(demod, true);
6048 	if (rc != 0) {
6049 		pr_err("error %d\n", rc);
6050 		goto rw_error;
6051 	}
6052 	rc = adc_synchronization(demod);
6053 	if (rc != 0) {
6054 		pr_err("error %d\n", rc);
6055 		goto rw_error;
6056 	}
6057 
6058 	rc = init_agc(demod);
6059 	if (rc != 0) {
6060 		pr_err("error %d\n", rc);
6061 		goto rw_error;
6062 	}
6063 	rc = set_agc_if(demod, &(ext_attr->vsb_if_agc_cfg), false);
6064 	if (rc != 0) {
6065 		pr_err("error %d\n", rc);
6066 		goto rw_error;
6067 	}
6068 	rc = set_agc_rf(demod, &(ext_attr->vsb_rf_agc_cfg), false);
6069 	if (rc != 0) {
6070 		pr_err("error %d\n", rc);
6071 		goto rw_error;
6072 	}
6073 	{
6074 		/* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
6075 		   of only the gain */
6076 		struct drxj_cfg_afe_gain vsb_pga_cfg = { DRX_STANDARD_8VSB, 0 };
6077 
6078 		vsb_pga_cfg.gain = ext_attr->vsb_pga_cfg;
6079 		rc = ctrl_set_cfg_afe_gain(demod, &vsb_pga_cfg);
6080 		if (rc != 0) {
6081 			pr_err("error %d\n", rc);
6082 			goto rw_error;
6083 		}
6084 	}
6085 	rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->vsb_pre_saw_cfg));
6086 	if (rc != 0) {
6087 		pr_err("error %d\n", rc);
6088 		goto rw_error;
6089 	}
6090 
6091 	/* Mpeg output has to be in front of FEC active */
6092 	rc = set_mpegtei_handling(demod);
6093 	if (rc != 0) {
6094 		pr_err("error %d\n", rc);
6095 		goto rw_error;
6096 	}
6097 	rc = bit_reverse_mpeg_output(demod);
6098 	if (rc != 0) {
6099 		pr_err("error %d\n", rc);
6100 		goto rw_error;
6101 	}
6102 	rc = set_mpeg_start_width(demod);
6103 	if (rc != 0) {
6104 		pr_err("error %d\n", rc);
6105 		goto rw_error;
6106 	}
6107 	{
6108 		/* TODO: move to set_standard after hardware reset value problem is solved */
6109 		/* Configure initial MPEG output */
6110 		struct drx_cfg_mpeg_output cfg_mpeg_output;
6111 
6112 		memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6113 		cfg_mpeg_output.enable_mpeg_output = true;
6114 
6115 		rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6116 		if (rc != 0) {
6117 			pr_err("error %d\n", rc);
6118 			goto rw_error;
6119 		}
6120 	}
6121 
6122 	/* TBD: what parameters should be set */
6123 	cmd_param = 0x00;	/* Default mode AGC on, etc */
6124 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6125 	    | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
6126 	cmd_scu.parameter_len = 1;
6127 	cmd_scu.result_len = 1;
6128 	cmd_scu.parameter = &cmd_param;
6129 	cmd_scu.result = &cmd_result;
6130 	rc = scu_command(dev_addr, &cmd_scu);
6131 	if (rc != 0) {
6132 		pr_err("error %d\n", rc);
6133 		goto rw_error;
6134 	}
6135 
6136 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEAGC_GAINSHIFT__A, 0x0004, 0);
6137 	if (rc != 0) {
6138 		pr_err("error %d\n", rc);
6139 		goto rw_error;
6140 	}
6141 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0x00D2, 0);
6142 	if (rc != 0) {
6143 		pr_err("error %d\n", rc);
6144 		goto rw_error;
6145 	}
6146 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SYSSMTRNCTRL__A, VSB_TOP_SYSSMTRNCTRL__PRE | VSB_TOP_SYSSMTRNCTRL_NCOTIMEOUTCNTEN__M, 0);
6147 	if (rc != 0) {
6148 		pr_err("error %d\n", rc);
6149 		goto rw_error;
6150 	}
6151 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEDETCTRL__A, 0x142, 0);
6152 	if (rc != 0) {
6153 		pr_err("error %d\n", rc);
6154 		goto rw_error;
6155 	}
6156 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_LBAGCREFLVL__A, 640, 0);
6157 	if (rc != 0) {
6158 		pr_err("error %d\n", rc);
6159 		goto rw_error;
6160 	}
6161 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1ACQ__A, 4, 0);
6162 	if (rc != 0) {
6163 		pr_err("error %d\n", rc);
6164 		goto rw_error;
6165 	}
6166 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 2, 0);
6167 	if (rc != 0) {
6168 		pr_err("error %d\n", rc);
6169 		goto rw_error;
6170 	}
6171 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN2TRK__A, 3, 0);
6172 	if (rc != 0) {
6173 		pr_err("error %d\n", rc);
6174 		goto rw_error;
6175 	}
6176 
6177 	/* start demodulator */
6178 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6179 	    | SCU_RAM_COMMAND_CMD_DEMOD_START;
6180 	cmd_scu.parameter_len = 0;
6181 	cmd_scu.result_len = 1;
6182 	cmd_scu.parameter = NULL;
6183 	cmd_scu.result = &cmd_result;
6184 	rc = scu_command(dev_addr, &cmd_scu);
6185 	if (rc != 0) {
6186 		pr_err("error %d\n", rc);
6187 		goto rw_error;
6188 	}
6189 
6190 	rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
6191 	if (rc != 0) {
6192 		pr_err("error %d\n", rc);
6193 		goto rw_error;
6194 	}
6195 	rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_ACTIVE, 0);
6196 	if (rc != 0) {
6197 		pr_err("error %d\n", rc);
6198 		goto rw_error;
6199 	}
6200 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
6201 	if (rc != 0) {
6202 		pr_err("error %d\n", rc);
6203 		goto rw_error;
6204 	}
6205 
6206 	return 0;
6207 rw_error:
6208 	return rc;
6209 }
6210 
6211 /*
6212 * \fn static short get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *PckErrs)
6213 * \brief Get the values of packet error in 8VSB mode
6214 * \return Error code
6215 */
6216 static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr,
6217 				   u32 *pck_errs, u32 *pck_count)
6218 {
6219 	int rc;
6220 	u16 data = 0;
6221 	u16 period = 0;
6222 	u16 prescale = 0;
6223 	u16 packet_errors_mant = 0;
6224 	u16 packet_errors_exp = 0;
6225 
6226 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &data, 0);
6227 	if (rc != 0) {
6228 		pr_err("error %d\n", rc);
6229 		goto rw_error;
6230 	}
6231 	packet_errors_mant = data & FEC_RS_NR_FAILURES_FIXED_MANT__M;
6232 	packet_errors_exp = (data & FEC_RS_NR_FAILURES_EXP__M)
6233 	    >> FEC_RS_NR_FAILURES_EXP__B;
6234 	period = FEC_RS_MEASUREMENT_PERIOD;
6235 	prescale = FEC_RS_MEASUREMENT_PRESCALE;
6236 	/* packet error rate = (error packet number) per second */
6237 	/* 77.3 us is time for per packet */
6238 	if (period * prescale == 0) {
6239 		pr_err("error: period and/or prescale is zero!\n");
6240 		return -EIO;
6241 	}
6242 	*pck_errs = packet_errors_mant * (1 << packet_errors_exp);
6243 	*pck_count = period * prescale * 77;
6244 
6245 	return 0;
6246 rw_error:
6247 	return rc;
6248 }
6249 
6250 /*
6251 * \fn static short GetVSBBer(struct i2c_device_addr *dev_addr, u32 *ber)
6252 * \brief Get the values of ber in VSB mode
6253 * \return Error code
6254 */
6255 static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr,
6256 				    u32 *ber, u32 *cnt)
6257 {
6258 	int rc;
6259 	u16 data = 0;
6260 	u16 period = 0;
6261 	u16 prescale = 0;
6262 	u16 bit_errors_mant = 0;
6263 	u16 bit_errors_exp = 0;
6264 
6265 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &data, 0);
6266 	if (rc != 0) {
6267 		pr_err("error %d\n", rc);
6268 		goto rw_error;
6269 	}
6270 	period = FEC_RS_MEASUREMENT_PERIOD;
6271 	prescale = FEC_RS_MEASUREMENT_PRESCALE;
6272 
6273 	bit_errors_mant = data & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M;
6274 	bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M)
6275 	    >> FEC_RS_NR_BIT_ERRORS_EXP__B;
6276 
6277 	*cnt = period * prescale * 207 * ((bit_errors_exp > 2) ? 1 : 8);
6278 
6279 	if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700)
6280 		*ber = (*cnt) * 26570;
6281 	else {
6282 		if (period * prescale == 0) {
6283 			pr_err("error: period and/or prescale is zero!\n");
6284 			return -EIO;
6285 		}
6286 		*ber = bit_errors_mant << ((bit_errors_exp > 2) ?
6287 			(bit_errors_exp - 3) : bit_errors_exp);
6288 	}
6289 
6290 	return 0;
6291 rw_error:
6292 	return rc;
6293 }
6294 
6295 /*
6296 * \fn static short get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
6297 * \brief Get the values of ber in VSB mode
6298 * \return Error code
6299 */
6300 static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr,
6301 				   u32 *ber, u32 *cnt)
6302 {
6303 	u16 data = 0;
6304 	int rc;
6305 
6306 	rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0);
6307 	if (rc != 0) {
6308 		pr_err("error %d\n", rc);
6309 		return -EIO;
6310 	}
6311 	*ber = data;
6312 	*cnt = VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT;
6313 
6314 	return 0;
6315 }
6316 
6317 /*
6318 * \fn static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6319 * \brief Get the values of MER
6320 * \return Error code
6321 */
6322 static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6323 {
6324 	int rc;
6325 	u16 data_hi = 0;
6326 
6327 	rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_ERR_ENERGY_H__A, &data_hi, 0);
6328 	if (rc != 0) {
6329 		pr_err("error %d\n", rc);
6330 		goto rw_error;
6331 	}
6332 	*mer =
6333 	    (u16) (log1_times100(21504) - log1_times100((data_hi << 6) / 52));
6334 
6335 	return 0;
6336 rw_error:
6337 	return rc;
6338 }
6339 
6340 
6341 /*============================================================================*/
6342 /*==                     END 8VSB DATAPATH FUNCTIONS                        ==*/
6343 /*============================================================================*/
6344 
6345 /*============================================================================*/
6346 /*============================================================================*/
6347 /*==                       QAM DATAPATH FUNCTIONS                           ==*/
6348 /*============================================================================*/
6349 /*============================================================================*/
6350 
6351 /*
6352 * \fn int power_down_qam ()
6353 * \brief Powr down QAM related blocks.
6354 * \param demod instance of demodulator.
6355 * \param channel pointer to channel data.
6356 * \return int.
6357 */
6358 static int power_down_qam(struct drx_demod_instance *demod, bool primary)
6359 {
6360 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
6361 		/* parameter_len */ 0,
6362 		/* result_len    */ 0,
6363 		/* *parameter   */ NULL,
6364 		/* *result      */ NULL
6365 	};
6366 	int rc;
6367 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6368 	struct drx_cfg_mpeg_output cfg_mpeg_output;
6369 	struct drx_common_attr *common_attr = demod->my_common_attr;
6370 	u16 cmd_result = 0;
6371 
6372 	/*
6373 	   STOP demodulator
6374 	   resets IQM, QAM and FEC HW blocks
6375 	 */
6376 	/* stop all comm_exec */
6377 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
6378 	if (rc != 0) {
6379 		pr_err("error %d\n", rc);
6380 		goto rw_error;
6381 	}
6382 	rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
6383 	if (rc != 0) {
6384 		pr_err("error %d\n", rc);
6385 		goto rw_error;
6386 	}
6387 
6388 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
6389 	    SCU_RAM_COMMAND_CMD_DEMOD_STOP;
6390 	cmd_scu.parameter_len = 0;
6391 	cmd_scu.result_len = 1;
6392 	cmd_scu.parameter = NULL;
6393 	cmd_scu.result = &cmd_result;
6394 	rc = scu_command(dev_addr, &cmd_scu);
6395 	if (rc != 0) {
6396 		pr_err("error %d\n", rc);
6397 		goto rw_error;
6398 	}
6399 
6400 	if (primary) {
6401 		rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
6402 		if (rc != 0) {
6403 			pr_err("error %d\n", rc);
6404 			goto rw_error;
6405 		}
6406 		rc = set_iqm_af(demod, false);
6407 		if (rc != 0) {
6408 			pr_err("error %d\n", rc);
6409 			goto rw_error;
6410 		}
6411 	} else {
6412 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
6413 		if (rc != 0) {
6414 			pr_err("error %d\n", rc);
6415 			goto rw_error;
6416 		}
6417 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
6418 		if (rc != 0) {
6419 			pr_err("error %d\n", rc);
6420 			goto rw_error;
6421 		}
6422 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
6423 		if (rc != 0) {
6424 			pr_err("error %d\n", rc);
6425 			goto rw_error;
6426 		}
6427 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
6428 		if (rc != 0) {
6429 			pr_err("error %d\n", rc);
6430 			goto rw_error;
6431 		}
6432 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
6433 		if (rc != 0) {
6434 			pr_err("error %d\n", rc);
6435 			goto rw_error;
6436 		}
6437 	}
6438 
6439 	memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6440 	cfg_mpeg_output.enable_mpeg_output = false;
6441 
6442 	rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6443 	if (rc != 0) {
6444 		pr_err("error %d\n", rc);
6445 		goto rw_error;
6446 	}
6447 
6448 	return 0;
6449 rw_error:
6450 	return rc;
6451 }
6452 
6453 /*============================================================================*/
6454 
6455 /*
6456 * \fn int set_qam_measurement ()
6457 * \brief Setup of the QAM Measuremnt intervals for signal quality
6458 * \param demod instance of demod.
6459 * \param constellation current constellation.
6460 * \return int.
6461 *
6462 *  NOTE:
6463 *  Take into account that for certain settings the errorcounters can overflow.
6464 *  The implementation does not check this.
6465 *
6466 *  TODO: overriding the ext_attr->fec_bits_desired by constellation dependent
6467 *  constants to get a measurement period of approx. 1 sec. Remove fec_bits_desired
6468 *  field ?
6469 *
6470 */
6471 #ifndef DRXJ_VSB_ONLY
6472 static int
6473 set_qam_measurement(struct drx_demod_instance *demod,
6474 		    enum drx_modulation constellation, u32 symbol_rate)
6475 {
6476 	struct i2c_device_addr *dev_addr = NULL;	/* device address for I2C writes */
6477 	struct drxj_data *ext_attr = NULL;	/* Global data container for DRXJ specific data */
6478 	int rc;
6479 	u32 fec_bits_desired = 0;	/* BER accounting period */
6480 	u16 fec_rs_plen = 0;	/* defines RS BER measurement period */
6481 	u16 fec_rs_prescale = 0;	/* ReedSolomon Measurement Prescale */
6482 	u32 fec_rs_period = 0;	/* Value for corresponding I2C register */
6483 	u32 fec_rs_bit_cnt = 0;	/* Actual precise amount of bits */
6484 	u32 fec_oc_snc_fail_period = 0;	/* Value for corresponding I2C register */
6485 	u32 qam_vd_period = 0;	/* Value for corresponding I2C register */
6486 	u32 qam_vd_bit_cnt = 0;	/* Actual precise amount of bits */
6487 	u16 fec_vd_plen = 0;	/* no of trellis symbols: VD SER measur period */
6488 	u16 qam_vd_prescale = 0;	/* Viterbi Measurement Prescale */
6489 
6490 	dev_addr = demod->my_i2c_dev_addr;
6491 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
6492 
6493 	fec_bits_desired = ext_attr->fec_bits_desired;
6494 	fec_rs_prescale = ext_attr->fec_rs_prescale;
6495 
6496 	switch (constellation) {
6497 	case DRX_CONSTELLATION_QAM16:
6498 		fec_bits_desired = 4 * symbol_rate;
6499 		break;
6500 	case DRX_CONSTELLATION_QAM32:
6501 		fec_bits_desired = 5 * symbol_rate;
6502 		break;
6503 	case DRX_CONSTELLATION_QAM64:
6504 		fec_bits_desired = 6 * symbol_rate;
6505 		break;
6506 	case DRX_CONSTELLATION_QAM128:
6507 		fec_bits_desired = 7 * symbol_rate;
6508 		break;
6509 	case DRX_CONSTELLATION_QAM256:
6510 		fec_bits_desired = 8 * symbol_rate;
6511 		break;
6512 	default:
6513 		return -EINVAL;
6514 	}
6515 
6516 	/* Parameters for Reed-Solomon Decoder */
6517 	/* fecrs_period = (int)ceil(FEC_BITS_DESIRED/(fecrs_prescale*plen)) */
6518 	/* rs_bit_cnt   = fecrs_period*fecrs_prescale*plen                  */
6519 	/*     result is within 32 bit arithmetic ->                        */
6520 	/*     no need for mult or frac functions                           */
6521 
6522 	/* TODO: use constant instead of calculation and remove the fec_rs_plen in ext_attr */
6523 	switch (ext_attr->standard) {
6524 	case DRX_STANDARD_ITU_A:
6525 	case DRX_STANDARD_ITU_C:
6526 		fec_rs_plen = 204 * 8;
6527 		break;
6528 	case DRX_STANDARD_ITU_B:
6529 		fec_rs_plen = 128 * 7;
6530 		break;
6531 	default:
6532 		return -EINVAL;
6533 	}
6534 
6535 	ext_attr->fec_rs_plen = fec_rs_plen;	/* for getSigQual */
6536 	fec_rs_bit_cnt = fec_rs_prescale * fec_rs_plen;	/* temp storage   */
6537 	if (fec_rs_bit_cnt == 0) {
6538 		pr_err("error: fec_rs_bit_cnt is zero!\n");
6539 		return -EIO;
6540 	}
6541 	fec_rs_period = fec_bits_desired / fec_rs_bit_cnt + 1;	/* ceil */
6542 	if (ext_attr->standard != DRX_STANDARD_ITU_B)
6543 		fec_oc_snc_fail_period = fec_rs_period;
6544 
6545 	/* limit to max 16 bit value (I2C register width) if needed */
6546 	if (fec_rs_period > 0xFFFF)
6547 		fec_rs_period = 0xFFFF;
6548 
6549 	/* write corresponding registers */
6550 	switch (ext_attr->standard) {
6551 	case DRX_STANDARD_ITU_A:
6552 	case DRX_STANDARD_ITU_C:
6553 		break;
6554 	case DRX_STANDARD_ITU_B:
6555 		switch (constellation) {
6556 		case DRX_CONSTELLATION_QAM64:
6557 			fec_rs_period = 31581;
6558 			fec_oc_snc_fail_period = 17932;
6559 			break;
6560 		case DRX_CONSTELLATION_QAM256:
6561 			fec_rs_period = 45446;
6562 			fec_oc_snc_fail_period = 25805;
6563 			break;
6564 		default:
6565 			return -EINVAL;
6566 		}
6567 		break;
6568 	default:
6569 		return -EINVAL;
6570 	}
6571 
6572 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, (u16)fec_oc_snc_fail_period, 0);
6573 	if (rc != 0) {
6574 		pr_err("error %d\n", rc);
6575 		goto rw_error;
6576 	}
6577 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, (u16)fec_rs_period, 0);
6578 	if (rc != 0) {
6579 		pr_err("error %d\n", rc);
6580 		goto rw_error;
6581 	}
6582 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, fec_rs_prescale, 0);
6583 	if (rc != 0) {
6584 		pr_err("error %d\n", rc);
6585 		goto rw_error;
6586 	}
6587 	ext_attr->fec_rs_period = (u16) fec_rs_period;
6588 	ext_attr->fec_rs_prescale = fec_rs_prescale;
6589 	rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6590 	if (rc != 0) {
6591 		pr_err("error %d\n", rc);
6592 		goto rw_error;
6593 	}
6594 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6595 	if (rc != 0) {
6596 		pr_err("error %d\n", rc);
6597 		goto rw_error;
6598 	}
6599 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6600 	if (rc != 0) {
6601 		pr_err("error %d\n", rc);
6602 		goto rw_error;
6603 	}
6604 
6605 	if (ext_attr->standard == DRX_STANDARD_ITU_B) {
6606 		/* Parameters for Viterbi Decoder */
6607 		/* qamvd_period = (int)ceil(FEC_BITS_DESIRED/                      */
6608 		/*                    (qamvd_prescale*plen*(qam_constellation+1))) */
6609 		/* vd_bit_cnt   = qamvd_period*qamvd_prescale*plen                 */
6610 		/*     result is within 32 bit arithmetic ->                       */
6611 		/*     no need for mult or frac functions                          */
6612 
6613 		/* a(8 bit) * b(8 bit) = 16 bit result => mult32 not needed */
6614 		fec_vd_plen = ext_attr->fec_vd_plen;
6615 		qam_vd_prescale = ext_attr->qam_vd_prescale;
6616 		qam_vd_bit_cnt = qam_vd_prescale * fec_vd_plen;	/* temp storage */
6617 
6618 		switch (constellation) {
6619 		case DRX_CONSTELLATION_QAM64:
6620 			/* a(16 bit) * b(4 bit) = 20 bit result => mult32 not needed */
6621 			qam_vd_period =
6622 			    qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM64 + 1)
6623 			    * (QAM_TOP_CONSTELLATION_QAM64 + 1);
6624 			break;
6625 		case DRX_CONSTELLATION_QAM256:
6626 			/* a(16 bit) * b(5 bit) = 21 bit result => mult32 not needed */
6627 			qam_vd_period =
6628 			    qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM256 + 1)
6629 			    * (QAM_TOP_CONSTELLATION_QAM256 + 1);
6630 			break;
6631 		default:
6632 			return -EINVAL;
6633 		}
6634 		if (qam_vd_period == 0) {
6635 			pr_err("error: qam_vd_period is zero!\n");
6636 			return -EIO;
6637 		}
6638 		qam_vd_period = fec_bits_desired / qam_vd_period;
6639 		/* limit to max 16 bit value (I2C register width) if needed */
6640 		if (qam_vd_period > 0xFFFF)
6641 			qam_vd_period = 0xFFFF;
6642 
6643 		/* a(16 bit) * b(16 bit) = 32 bit result => mult32 not needed */
6644 		qam_vd_bit_cnt *= qam_vd_period;
6645 
6646 		rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PERIOD__A, (u16)qam_vd_period, 0);
6647 		if (rc != 0) {
6648 			pr_err("error %d\n", rc);
6649 			goto rw_error;
6650 		}
6651 		rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PRESCALE__A, qam_vd_prescale, 0);
6652 		if (rc != 0) {
6653 			pr_err("error %d\n", rc);
6654 			goto rw_error;
6655 		}
6656 		ext_attr->qam_vd_period = (u16) qam_vd_period;
6657 		ext_attr->qam_vd_prescale = qam_vd_prescale;
6658 	}
6659 
6660 	return 0;
6661 rw_error:
6662 	return rc;
6663 }
6664 
6665 /*============================================================================*/
6666 
6667 /*
6668 * \fn int set_qam16 ()
6669 * \brief QAM16 specific setup
6670 * \param demod instance of demod.
6671 * \return int.
6672 */
6673 static int set_qam16(struct drx_demod_instance *demod)
6674 {
6675 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6676 	int rc;
6677 	static const u8 qam_dq_qual_fun[] = {
6678 		DRXJ_16TO8(2),	/* fun0  */
6679 		DRXJ_16TO8(2),	/* fun1  */
6680 		DRXJ_16TO8(2),	/* fun2  */
6681 		DRXJ_16TO8(2),	/* fun3  */
6682 		DRXJ_16TO8(3),	/* fun4  */
6683 		DRXJ_16TO8(3),	/* fun5  */
6684 	};
6685 	static const u8 qam_eq_cma_rad[] = {
6686 		DRXJ_16TO8(13517),	/* RAD0  */
6687 		DRXJ_16TO8(13517),	/* RAD1  */
6688 		DRXJ_16TO8(13517),	/* RAD2  */
6689 		DRXJ_16TO8(13517),	/* RAD3  */
6690 		DRXJ_16TO8(13517),	/* RAD4  */
6691 		DRXJ_16TO8(13517),	/* RAD5  */
6692 	};
6693 
6694 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6695 	if (rc != 0) {
6696 		pr_err("error %d\n", rc);
6697 		goto rw_error;
6698 	}
6699 	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);
6700 	if (rc != 0) {
6701 		pr_err("error %d\n", rc);
6702 		goto rw_error;
6703 	}
6704 
6705 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 140, 0);
6706 	if (rc != 0) {
6707 		pr_err("error %d\n", rc);
6708 		goto rw_error;
6709 	}
6710 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6711 	if (rc != 0) {
6712 		pr_err("error %d\n", rc);
6713 		goto rw_error;
6714 	}
6715 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 120, 0);
6716 	if (rc != 0) {
6717 		pr_err("error %d\n", rc);
6718 		goto rw_error;
6719 	}
6720 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 230, 0);
6721 	if (rc != 0) {
6722 		pr_err("error %d\n", rc);
6723 		goto rw_error;
6724 	}
6725 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 95, 0);
6726 	if (rc != 0) {
6727 		pr_err("error %d\n", rc);
6728 		goto rw_error;
6729 	}
6730 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 105, 0);
6731 	if (rc != 0) {
6732 		pr_err("error %d\n", rc);
6733 		goto rw_error;
6734 	}
6735 
6736 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6737 	if (rc != 0) {
6738 		pr_err("error %d\n", rc);
6739 		goto rw_error;
6740 	}
6741 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6742 	if (rc != 0) {
6743 		pr_err("error %d\n", rc);
6744 		goto rw_error;
6745 	}
6746 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6747 	if (rc != 0) {
6748 		pr_err("error %d\n", rc);
6749 		goto rw_error;
6750 	}
6751 
6752 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 16, 0);
6753 	if (rc != 0) {
6754 		pr_err("error %d\n", rc);
6755 		goto rw_error;
6756 	}
6757 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 220, 0);
6758 	if (rc != 0) {
6759 		pr_err("error %d\n", rc);
6760 		goto rw_error;
6761 	}
6762 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 25, 0);
6763 	if (rc != 0) {
6764 		pr_err("error %d\n", rc);
6765 		goto rw_error;
6766 	}
6767 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 6, 0);
6768 	if (rc != 0) {
6769 		pr_err("error %d\n", rc);
6770 		goto rw_error;
6771 	}
6772 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-24), 0);
6773 	if (rc != 0) {
6774 		pr_err("error %d\n", rc);
6775 		goto rw_error;
6776 	}
6777 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-65), 0);
6778 	if (rc != 0) {
6779 		pr_err("error %d\n", rc);
6780 		goto rw_error;
6781 	}
6782 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-127), 0);
6783 	if (rc != 0) {
6784 		pr_err("error %d\n", rc);
6785 		goto rw_error;
6786 	}
6787 
6788 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
6789 	if (rc != 0) {
6790 		pr_err("error %d\n", rc);
6791 		goto rw_error;
6792 	}
6793 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
6794 	if (rc != 0) {
6795 		pr_err("error %d\n", rc);
6796 		goto rw_error;
6797 	}
6798 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
6799 	if (rc != 0) {
6800 		pr_err("error %d\n", rc);
6801 		goto rw_error;
6802 	}
6803 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
6804 	if (rc != 0) {
6805 		pr_err("error %d\n", rc);
6806 		goto rw_error;
6807 	}
6808 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
6809 	if (rc != 0) {
6810 		pr_err("error %d\n", rc);
6811 		goto rw_error;
6812 	}
6813 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
6814 	if (rc != 0) {
6815 		pr_err("error %d\n", rc);
6816 		goto rw_error;
6817 	}
6818 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
6819 	if (rc != 0) {
6820 		pr_err("error %d\n", rc);
6821 		goto rw_error;
6822 	}
6823 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
6824 	if (rc != 0) {
6825 		pr_err("error %d\n", rc);
6826 		goto rw_error;
6827 	}
6828 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
6829 	if (rc != 0) {
6830 		pr_err("error %d\n", rc);
6831 		goto rw_error;
6832 	}
6833 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
6834 	if (rc != 0) {
6835 		pr_err("error %d\n", rc);
6836 		goto rw_error;
6837 	}
6838 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
6839 	if (rc != 0) {
6840 		pr_err("error %d\n", rc);
6841 		goto rw_error;
6842 	}
6843 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
6844 	if (rc != 0) {
6845 		pr_err("error %d\n", rc);
6846 		goto rw_error;
6847 	}
6848 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
6849 	if (rc != 0) {
6850 		pr_err("error %d\n", rc);
6851 		goto rw_error;
6852 	}
6853 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
6854 	if (rc != 0) {
6855 		pr_err("error %d\n", rc);
6856 		goto rw_error;
6857 	}
6858 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
6859 	if (rc != 0) {
6860 		pr_err("error %d\n", rc);
6861 		goto rw_error;
6862 	}
6863 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
6864 	if (rc != 0) {
6865 		pr_err("error %d\n", rc);
6866 		goto rw_error;
6867 	}
6868 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 240, 0);
6869 	if (rc != 0) {
6870 		pr_err("error %d\n", rc);
6871 		goto rw_error;
6872 	}
6873 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
6874 	if (rc != 0) {
6875 		pr_err("error %d\n", rc);
6876 		goto rw_error;
6877 	}
6878 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
6879 	if (rc != 0) {
6880 		pr_err("error %d\n", rc);
6881 		goto rw_error;
6882 	}
6883 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
6884 	if (rc != 0) {
6885 		pr_err("error %d\n", rc);
6886 		goto rw_error;
6887 	}
6888 
6889 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 40960, 0);
6890 	if (rc != 0) {
6891 		pr_err("error %d\n", rc);
6892 		goto rw_error;
6893 	}
6894 
6895 	return 0;
6896 rw_error:
6897 	return rc;
6898 }
6899 
6900 /*============================================================================*/
6901 
6902 /*
6903 * \fn int set_qam32 ()
6904 * \brief QAM32 specific setup
6905 * \param demod instance of demod.
6906 * \return int.
6907 */
6908 static int set_qam32(struct drx_demod_instance *demod)
6909 {
6910 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6911 	int rc;
6912 	static const u8 qam_dq_qual_fun[] = {
6913 		DRXJ_16TO8(3),	/* fun0  */
6914 		DRXJ_16TO8(3),	/* fun1  */
6915 		DRXJ_16TO8(3),	/* fun2  */
6916 		DRXJ_16TO8(3),	/* fun3  */
6917 		DRXJ_16TO8(4),	/* fun4  */
6918 		DRXJ_16TO8(4),	/* fun5  */
6919 	};
6920 	static const u8 qam_eq_cma_rad[] = {
6921 		DRXJ_16TO8(6707),	/* RAD0  */
6922 		DRXJ_16TO8(6707),	/* RAD1  */
6923 		DRXJ_16TO8(6707),	/* RAD2  */
6924 		DRXJ_16TO8(6707),	/* RAD3  */
6925 		DRXJ_16TO8(6707),	/* RAD4  */
6926 		DRXJ_16TO8(6707),	/* RAD5  */
6927 	};
6928 
6929 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6930 	if (rc != 0) {
6931 		pr_err("error %d\n", rc);
6932 		goto rw_error;
6933 	}
6934 	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);
6935 	if (rc != 0) {
6936 		pr_err("error %d\n", rc);
6937 		goto rw_error;
6938 	}
6939 
6940 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 90, 0);
6941 	if (rc != 0) {
6942 		pr_err("error %d\n", rc);
6943 		goto rw_error;
6944 	}
6945 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6946 	if (rc != 0) {
6947 		pr_err("error %d\n", rc);
6948 		goto rw_error;
6949 	}
6950 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
6951 	if (rc != 0) {
6952 		pr_err("error %d\n", rc);
6953 		goto rw_error;
6954 	}
6955 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 170, 0);
6956 	if (rc != 0) {
6957 		pr_err("error %d\n", rc);
6958 		goto rw_error;
6959 	}
6960 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
6961 	if (rc != 0) {
6962 		pr_err("error %d\n", rc);
6963 		goto rw_error;
6964 	}
6965 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
6966 	if (rc != 0) {
6967 		pr_err("error %d\n", rc);
6968 		goto rw_error;
6969 	}
6970 
6971 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6972 	if (rc != 0) {
6973 		pr_err("error %d\n", rc);
6974 		goto rw_error;
6975 	}
6976 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6977 	if (rc != 0) {
6978 		pr_err("error %d\n", rc);
6979 		goto rw_error;
6980 	}
6981 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6982 	if (rc != 0) {
6983 		pr_err("error %d\n", rc);
6984 		goto rw_error;
6985 	}
6986 
6987 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
6988 	if (rc != 0) {
6989 		pr_err("error %d\n", rc);
6990 		goto rw_error;
6991 	}
6992 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 140, 0);
6993 	if (rc != 0) {
6994 		pr_err("error %d\n", rc);
6995 		goto rw_error;
6996 	}
6997 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16)(-8), 0);
6998 	if (rc != 0) {
6999 		pr_err("error %d\n", rc);
7000 		goto rw_error;
7001 	}
7002 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16)(-16), 0);
7003 	if (rc != 0) {
7004 		pr_err("error %d\n", rc);
7005 		goto rw_error;
7006 	}
7007 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-26), 0);
7008 	if (rc != 0) {
7009 		pr_err("error %d\n", rc);
7010 		goto rw_error;
7011 	}
7012 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-56), 0);
7013 	if (rc != 0) {
7014 		pr_err("error %d\n", rc);
7015 		goto rw_error;
7016 	}
7017 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-86), 0);
7018 	if (rc != 0) {
7019 		pr_err("error %d\n", rc);
7020 		goto rw_error;
7021 	}
7022 
7023 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7024 	if (rc != 0) {
7025 		pr_err("error %d\n", rc);
7026 		goto rw_error;
7027 	}
7028 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7029 	if (rc != 0) {
7030 		pr_err("error %d\n", rc);
7031 		goto rw_error;
7032 	}
7033 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7034 	if (rc != 0) {
7035 		pr_err("error %d\n", rc);
7036 		goto rw_error;
7037 	}
7038 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
7039 	if (rc != 0) {
7040 		pr_err("error %d\n", rc);
7041 		goto rw_error;
7042 	}
7043 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7044 	if (rc != 0) {
7045 		pr_err("error %d\n", rc);
7046 		goto rw_error;
7047 	}
7048 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7049 	if (rc != 0) {
7050 		pr_err("error %d\n", rc);
7051 		goto rw_error;
7052 	}
7053 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
7054 	if (rc != 0) {
7055 		pr_err("error %d\n", rc);
7056 		goto rw_error;
7057 	}
7058 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
7059 	if (rc != 0) {
7060 		pr_err("error %d\n", rc);
7061 		goto rw_error;
7062 	}
7063 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7064 	if (rc != 0) {
7065 		pr_err("error %d\n", rc);
7066 		goto rw_error;
7067 	}
7068 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7069 	if (rc != 0) {
7070 		pr_err("error %d\n", rc);
7071 		goto rw_error;
7072 	}
7073 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7074 	if (rc != 0) {
7075 		pr_err("error %d\n", rc);
7076 		goto rw_error;
7077 	}
7078 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7079 	if (rc != 0) {
7080 		pr_err("error %d\n", rc);
7081 		goto rw_error;
7082 	}
7083 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7084 	if (rc != 0) {
7085 		pr_err("error %d\n", rc);
7086 		goto rw_error;
7087 	}
7088 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7089 	if (rc != 0) {
7090 		pr_err("error %d\n", rc);
7091 		goto rw_error;
7092 	}
7093 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7094 	if (rc != 0) {
7095 		pr_err("error %d\n", rc);
7096 		goto rw_error;
7097 	}
7098 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
7099 	if (rc != 0) {
7100 		pr_err("error %d\n", rc);
7101 		goto rw_error;
7102 	}
7103 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 176, 0);
7104 	if (rc != 0) {
7105 		pr_err("error %d\n", rc);
7106 		goto rw_error;
7107 	}
7108 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7109 	if (rc != 0) {
7110 		pr_err("error %d\n", rc);
7111 		goto rw_error;
7112 	}
7113 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7114 	if (rc != 0) {
7115 		pr_err("error %d\n", rc);
7116 		goto rw_error;
7117 	}
7118 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 8, 0);
7119 	if (rc != 0) {
7120 		pr_err("error %d\n", rc);
7121 		goto rw_error;
7122 	}
7123 
7124 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20480, 0);
7125 	if (rc != 0) {
7126 		pr_err("error %d\n", rc);
7127 		goto rw_error;
7128 	}
7129 
7130 	return 0;
7131 rw_error:
7132 	return rc;
7133 }
7134 
7135 /*============================================================================*/
7136 
7137 /*
7138 * \fn int set_qam64 ()
7139 * \brief QAM64 specific setup
7140 * \param demod instance of demod.
7141 * \return int.
7142 */
7143 static int set_qam64(struct drx_demod_instance *demod)
7144 {
7145 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7146 	int rc;
7147 	static const u8 qam_dq_qual_fun[] = {
7148 		/* this is hw reset value. no necessary to re-write */
7149 		DRXJ_16TO8(4),	/* fun0  */
7150 		DRXJ_16TO8(4),	/* fun1  */
7151 		DRXJ_16TO8(4),	/* fun2  */
7152 		DRXJ_16TO8(4),	/* fun3  */
7153 		DRXJ_16TO8(6),	/* fun4  */
7154 		DRXJ_16TO8(6),	/* fun5  */
7155 	};
7156 	static const u8 qam_eq_cma_rad[] = {
7157 		DRXJ_16TO8(13336),	/* RAD0  */
7158 		DRXJ_16TO8(12618),	/* RAD1  */
7159 		DRXJ_16TO8(11988),	/* RAD2  */
7160 		DRXJ_16TO8(13809),	/* RAD3  */
7161 		DRXJ_16TO8(13809),	/* RAD4  */
7162 		DRXJ_16TO8(15609),	/* RAD5  */
7163 	};
7164 
7165 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7166 	if (rc != 0) {
7167 		pr_err("error %d\n", rc);
7168 		goto rw_error;
7169 	}
7170 	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);
7171 	if (rc != 0) {
7172 		pr_err("error %d\n", rc);
7173 		goto rw_error;
7174 	}
7175 
7176 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 105, 0);
7177 	if (rc != 0) {
7178 		pr_err("error %d\n", rc);
7179 		goto rw_error;
7180 	}
7181 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7182 	if (rc != 0) {
7183 		pr_err("error %d\n", rc);
7184 		goto rw_error;
7185 	}
7186 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7187 	if (rc != 0) {
7188 		pr_err("error %d\n", rc);
7189 		goto rw_error;
7190 	}
7191 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 195, 0);
7192 	if (rc != 0) {
7193 		pr_err("error %d\n", rc);
7194 		goto rw_error;
7195 	}
7196 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7197 	if (rc != 0) {
7198 		pr_err("error %d\n", rc);
7199 		goto rw_error;
7200 	}
7201 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 84, 0);
7202 	if (rc != 0) {
7203 		pr_err("error %d\n", rc);
7204 		goto rw_error;
7205 	}
7206 
7207 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7208 	if (rc != 0) {
7209 		pr_err("error %d\n", rc);
7210 		goto rw_error;
7211 	}
7212 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7213 	if (rc != 0) {
7214 		pr_err("error %d\n", rc);
7215 		goto rw_error;
7216 	}
7217 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7218 	if (rc != 0) {
7219 		pr_err("error %d\n", rc);
7220 		goto rw_error;
7221 	}
7222 
7223 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
7224 	if (rc != 0) {
7225 		pr_err("error %d\n", rc);
7226 		goto rw_error;
7227 	}
7228 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 141, 0);
7229 	if (rc != 0) {
7230 		pr_err("error %d\n", rc);
7231 		goto rw_error;
7232 	}
7233 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 7, 0);
7234 	if (rc != 0) {
7235 		pr_err("error %d\n", rc);
7236 		goto rw_error;
7237 	}
7238 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 0, 0);
7239 	if (rc != 0) {
7240 		pr_err("error %d\n", rc);
7241 		goto rw_error;
7242 	}
7243 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-15), 0);
7244 	if (rc != 0) {
7245 		pr_err("error %d\n", rc);
7246 		goto rw_error;
7247 	}
7248 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-45), 0);
7249 	if (rc != 0) {
7250 		pr_err("error %d\n", rc);
7251 		goto rw_error;
7252 	}
7253 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-80), 0);
7254 	if (rc != 0) {
7255 		pr_err("error %d\n", rc);
7256 		goto rw_error;
7257 	}
7258 
7259 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7260 	if (rc != 0) {
7261 		pr_err("error %d\n", rc);
7262 		goto rw_error;
7263 	}
7264 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7265 	if (rc != 0) {
7266 		pr_err("error %d\n", rc);
7267 		goto rw_error;
7268 	}
7269 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7270 	if (rc != 0) {
7271 		pr_err("error %d\n", rc);
7272 		goto rw_error;
7273 	}
7274 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30, 0);
7275 	if (rc != 0) {
7276 		pr_err("error %d\n", rc);
7277 		goto rw_error;
7278 	}
7279 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7280 	if (rc != 0) {
7281 		pr_err("error %d\n", rc);
7282 		goto rw_error;
7283 	}
7284 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7285 	if (rc != 0) {
7286 		pr_err("error %d\n", rc);
7287 		goto rw_error;
7288 	}
7289 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 15, 0);
7290 	if (rc != 0) {
7291 		pr_err("error %d\n", rc);
7292 		goto rw_error;
7293 	}
7294 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7295 	if (rc != 0) {
7296 		pr_err("error %d\n", rc);
7297 		goto rw_error;
7298 	}
7299 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7300 	if (rc != 0) {
7301 		pr_err("error %d\n", rc);
7302 		goto rw_error;
7303 	}
7304 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7305 	if (rc != 0) {
7306 		pr_err("error %d\n", rc);
7307 		goto rw_error;
7308 	}
7309 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7310 	if (rc != 0) {
7311 		pr_err("error %d\n", rc);
7312 		goto rw_error;
7313 	}
7314 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7315 	if (rc != 0) {
7316 		pr_err("error %d\n", rc);
7317 		goto rw_error;
7318 	}
7319 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7320 	if (rc != 0) {
7321 		pr_err("error %d\n", rc);
7322 		goto rw_error;
7323 	}
7324 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7325 	if (rc != 0) {
7326 		pr_err("error %d\n", rc);
7327 		goto rw_error;
7328 	}
7329 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7330 	if (rc != 0) {
7331 		pr_err("error %d\n", rc);
7332 		goto rw_error;
7333 	}
7334 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
7335 	if (rc != 0) {
7336 		pr_err("error %d\n", rc);
7337 		goto rw_error;
7338 	}
7339 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 160, 0);
7340 	if (rc != 0) {
7341 		pr_err("error %d\n", rc);
7342 		goto rw_error;
7343 	}
7344 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7345 	if (rc != 0) {
7346 		pr_err("error %d\n", rc);
7347 		goto rw_error;
7348 	}
7349 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7350 	if (rc != 0) {
7351 		pr_err("error %d\n", rc);
7352 		goto rw_error;
7353 	}
7354 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
7355 	if (rc != 0) {
7356 		pr_err("error %d\n", rc);
7357 		goto rw_error;
7358 	}
7359 
7360 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43008, 0);
7361 	if (rc != 0) {
7362 		pr_err("error %d\n", rc);
7363 		goto rw_error;
7364 	}
7365 
7366 	return 0;
7367 rw_error:
7368 	return rc;
7369 }
7370 
7371 /*============================================================================*/
7372 
7373 /*
7374 * \fn int set_qam128 ()
7375 * \brief QAM128 specific setup
7376 * \param demod: instance of demod.
7377 * \return int.
7378 */
7379 static int set_qam128(struct drx_demod_instance *demod)
7380 {
7381 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7382 	int rc;
7383 	static const u8 qam_dq_qual_fun[] = {
7384 		DRXJ_16TO8(6),	/* fun0  */
7385 		DRXJ_16TO8(6),	/* fun1  */
7386 		DRXJ_16TO8(6),	/* fun2  */
7387 		DRXJ_16TO8(6),	/* fun3  */
7388 		DRXJ_16TO8(9),	/* fun4  */
7389 		DRXJ_16TO8(9),	/* fun5  */
7390 	};
7391 	static const u8 qam_eq_cma_rad[] = {
7392 		DRXJ_16TO8(6164),	/* RAD0  */
7393 		DRXJ_16TO8(6598),	/* RAD1  */
7394 		DRXJ_16TO8(6394),	/* RAD2  */
7395 		DRXJ_16TO8(6409),	/* RAD3  */
7396 		DRXJ_16TO8(6656),	/* RAD4  */
7397 		DRXJ_16TO8(7238),	/* RAD5  */
7398 	};
7399 
7400 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7401 	if (rc != 0) {
7402 		pr_err("error %d\n", rc);
7403 		goto rw_error;
7404 	}
7405 	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);
7406 	if (rc != 0) {
7407 		pr_err("error %d\n", rc);
7408 		goto rw_error;
7409 	}
7410 
7411 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
7412 	if (rc != 0) {
7413 		pr_err("error %d\n", rc);
7414 		goto rw_error;
7415 	}
7416 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7417 	if (rc != 0) {
7418 		pr_err("error %d\n", rc);
7419 		goto rw_error;
7420 	}
7421 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7422 	if (rc != 0) {
7423 		pr_err("error %d\n", rc);
7424 		goto rw_error;
7425 	}
7426 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 140, 0);
7427 	if (rc != 0) {
7428 		pr_err("error %d\n", rc);
7429 		goto rw_error;
7430 	}
7431 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7432 	if (rc != 0) {
7433 		pr_err("error %d\n", rc);
7434 		goto rw_error;
7435 	}
7436 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
7437 	if (rc != 0) {
7438 		pr_err("error %d\n", rc);
7439 		goto rw_error;
7440 	}
7441 
7442 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7443 	if (rc != 0) {
7444 		pr_err("error %d\n", rc);
7445 		goto rw_error;
7446 	}
7447 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7448 	if (rc != 0) {
7449 		pr_err("error %d\n", rc);
7450 		goto rw_error;
7451 	}
7452 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7453 	if (rc != 0) {
7454 		pr_err("error %d\n", rc);
7455 		goto rw_error;
7456 	}
7457 
7458 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
7459 	if (rc != 0) {
7460 		pr_err("error %d\n", rc);
7461 		goto rw_error;
7462 	}
7463 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 65, 0);
7464 	if (rc != 0) {
7465 		pr_err("error %d\n", rc);
7466 		goto rw_error;
7467 	}
7468 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 5, 0);
7469 	if (rc != 0) {
7470 		pr_err("error %d\n", rc);
7471 		goto rw_error;
7472 	}
7473 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 3, 0);
7474 	if (rc != 0) {
7475 		pr_err("error %d\n", rc);
7476 		goto rw_error;
7477 	}
7478 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-1), 0);
7479 	if (rc != 0) {
7480 		pr_err("error %d\n", rc);
7481 		goto rw_error;
7482 	}
7483 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 12, 0);
7484 	if (rc != 0) {
7485 		pr_err("error %d\n", rc);
7486 		goto rw_error;
7487 	}
7488 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-23), 0);
7489 	if (rc != 0) {
7490 		pr_err("error %d\n", rc);
7491 		goto rw_error;
7492 	}
7493 
7494 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7495 	if (rc != 0) {
7496 		pr_err("error %d\n", rc);
7497 		goto rw_error;
7498 	}
7499 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7500 	if (rc != 0) {
7501 		pr_err("error %d\n", rc);
7502 		goto rw_error;
7503 	}
7504 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7505 	if (rc != 0) {
7506 		pr_err("error %d\n", rc);
7507 		goto rw_error;
7508 	}
7509 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40, 0);
7510 	if (rc != 0) {
7511 		pr_err("error %d\n", rc);
7512 		goto rw_error;
7513 	}
7514 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7515 	if (rc != 0) {
7516 		pr_err("error %d\n", rc);
7517 		goto rw_error;
7518 	}
7519 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7520 	if (rc != 0) {
7521 		pr_err("error %d\n", rc);
7522 		goto rw_error;
7523 	}
7524 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20, 0);
7525 	if (rc != 0) {
7526 		pr_err("error %d\n", rc);
7527 		goto rw_error;
7528 	}
7529 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7530 	if (rc != 0) {
7531 		pr_err("error %d\n", rc);
7532 		goto rw_error;
7533 	}
7534 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7535 	if (rc != 0) {
7536 		pr_err("error %d\n", rc);
7537 		goto rw_error;
7538 	}
7539 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7540 	if (rc != 0) {
7541 		pr_err("error %d\n", rc);
7542 		goto rw_error;
7543 	}
7544 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7545 	if (rc != 0) {
7546 		pr_err("error %d\n", rc);
7547 		goto rw_error;
7548 	}
7549 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7550 	if (rc != 0) {
7551 		pr_err("error %d\n", rc);
7552 		goto rw_error;
7553 	}
7554 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7555 	if (rc != 0) {
7556 		pr_err("error %d\n", rc);
7557 		goto rw_error;
7558 	}
7559 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7560 	if (rc != 0) {
7561 		pr_err("error %d\n", rc);
7562 		goto rw_error;
7563 	}
7564 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7565 	if (rc != 0) {
7566 		pr_err("error %d\n", rc);
7567 		goto rw_error;
7568 	}
7569 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
7570 	if (rc != 0) {
7571 		pr_err("error %d\n", rc);
7572 		goto rw_error;
7573 	}
7574 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 144, 0);
7575 	if (rc != 0) {
7576 		pr_err("error %d\n", rc);
7577 		goto rw_error;
7578 	}
7579 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7580 	if (rc != 0) {
7581 		pr_err("error %d\n", rc);
7582 		goto rw_error;
7583 	}
7584 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7585 	if (rc != 0) {
7586 		pr_err("error %d\n", rc);
7587 		goto rw_error;
7588 	}
7589 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7590 	if (rc != 0) {
7591 		pr_err("error %d\n", rc);
7592 		goto rw_error;
7593 	}
7594 
7595 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20992, 0);
7596 	if (rc != 0) {
7597 		pr_err("error %d\n", rc);
7598 		goto rw_error;
7599 	}
7600 
7601 	return 0;
7602 rw_error:
7603 	return rc;
7604 }
7605 
7606 /*============================================================================*/
7607 
7608 /*
7609 * \fn int set_qam256 ()
7610 * \brief QAM256 specific setup
7611 * \param demod: instance of demod.
7612 * \return int.
7613 */
7614 static int set_qam256(struct drx_demod_instance *demod)
7615 {
7616 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7617 	int rc;
7618 	static const u8 qam_dq_qual_fun[] = {
7619 		DRXJ_16TO8(8),	/* fun0  */
7620 		DRXJ_16TO8(8),	/* fun1  */
7621 		DRXJ_16TO8(8),	/* fun2  */
7622 		DRXJ_16TO8(8),	/* fun3  */
7623 		DRXJ_16TO8(12),	/* fun4  */
7624 		DRXJ_16TO8(12),	/* fun5  */
7625 	};
7626 	static const u8 qam_eq_cma_rad[] = {
7627 		DRXJ_16TO8(12345),	/* RAD0  */
7628 		DRXJ_16TO8(12345),	/* RAD1  */
7629 		DRXJ_16TO8(13626),	/* RAD2  */
7630 		DRXJ_16TO8(12931),	/* RAD3  */
7631 		DRXJ_16TO8(14719),	/* RAD4  */
7632 		DRXJ_16TO8(15356),	/* RAD5  */
7633 	};
7634 
7635 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7636 	if (rc != 0) {
7637 		pr_err("error %d\n", rc);
7638 		goto rw_error;
7639 	}
7640 	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);
7641 	if (rc != 0) {
7642 		pr_err("error %d\n", rc);
7643 		goto rw_error;
7644 	}
7645 
7646 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
7647 	if (rc != 0) {
7648 		pr_err("error %d\n", rc);
7649 		goto rw_error;
7650 	}
7651 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7652 	if (rc != 0) {
7653 		pr_err("error %d\n", rc);
7654 		goto rw_error;
7655 	}
7656 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7657 	if (rc != 0) {
7658 		pr_err("error %d\n", rc);
7659 		goto rw_error;
7660 	}
7661 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 150, 0);
7662 	if (rc != 0) {
7663 		pr_err("error %d\n", rc);
7664 		goto rw_error;
7665 	}
7666 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7667 	if (rc != 0) {
7668 		pr_err("error %d\n", rc);
7669 		goto rw_error;
7670 	}
7671 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 110, 0);
7672 	if (rc != 0) {
7673 		pr_err("error %d\n", rc);
7674 		goto rw_error;
7675 	}
7676 
7677 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7678 	if (rc != 0) {
7679 		pr_err("error %d\n", rc);
7680 		goto rw_error;
7681 	}
7682 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 16, 0);
7683 	if (rc != 0) {
7684 		pr_err("error %d\n", rc);
7685 		goto rw_error;
7686 	}
7687 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7688 	if (rc != 0) {
7689 		pr_err("error %d\n", rc);
7690 		goto rw_error;
7691 	}
7692 
7693 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
7694 	if (rc != 0) {
7695 		pr_err("error %d\n", rc);
7696 		goto rw_error;
7697 	}
7698 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 74, 0);
7699 	if (rc != 0) {
7700 		pr_err("error %d\n", rc);
7701 		goto rw_error;
7702 	}
7703 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 18, 0);
7704 	if (rc != 0) {
7705 		pr_err("error %d\n", rc);
7706 		goto rw_error;
7707 	}
7708 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 13, 0);
7709 	if (rc != 0) {
7710 		pr_err("error %d\n", rc);
7711 		goto rw_error;
7712 	}
7713 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, 7, 0);
7714 	if (rc != 0) {
7715 		pr_err("error %d\n", rc);
7716 		goto rw_error;
7717 	}
7718 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 0, 0);
7719 	if (rc != 0) {
7720 		pr_err("error %d\n", rc);
7721 		goto rw_error;
7722 	}
7723 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-8), 0);
7724 	if (rc != 0) {
7725 		pr_err("error %d\n", rc);
7726 		goto rw_error;
7727 	}
7728 
7729 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7730 	if (rc != 0) {
7731 		pr_err("error %d\n", rc);
7732 		goto rw_error;
7733 	}
7734 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7735 	if (rc != 0) {
7736 		pr_err("error %d\n", rc);
7737 		goto rw_error;
7738 	}
7739 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7740 	if (rc != 0) {
7741 		pr_err("error %d\n", rc);
7742 		goto rw_error;
7743 	}
7744 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50, 0);
7745 	if (rc != 0) {
7746 		pr_err("error %d\n", rc);
7747 		goto rw_error;
7748 	}
7749 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7750 	if (rc != 0) {
7751 		pr_err("error %d\n", rc);
7752 		goto rw_error;
7753 	}
7754 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7755 	if (rc != 0) {
7756 		pr_err("error %d\n", rc);
7757 		goto rw_error;
7758 	}
7759 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 25, 0);
7760 	if (rc != 0) {
7761 		pr_err("error %d\n", rc);
7762 		goto rw_error;
7763 	}
7764 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7765 	if (rc != 0) {
7766 		pr_err("error %d\n", rc);
7767 		goto rw_error;
7768 	}
7769 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7770 	if (rc != 0) {
7771 		pr_err("error %d\n", rc);
7772 		goto rw_error;
7773 	}
7774 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7775 	if (rc != 0) {
7776 		pr_err("error %d\n", rc);
7777 		goto rw_error;
7778 	}
7779 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7780 	if (rc != 0) {
7781 		pr_err("error %d\n", rc);
7782 		goto rw_error;
7783 	}
7784 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7785 	if (rc != 0) {
7786 		pr_err("error %d\n", rc);
7787 		goto rw_error;
7788 	}
7789 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7790 	if (rc != 0) {
7791 		pr_err("error %d\n", rc);
7792 		goto rw_error;
7793 	}
7794 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7795 	if (rc != 0) {
7796 		pr_err("error %d\n", rc);
7797 		goto rw_error;
7798 	}
7799 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7800 	if (rc != 0) {
7801 		pr_err("error %d\n", rc);
7802 		goto rw_error;
7803 	}
7804 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
7805 	if (rc != 0) {
7806 		pr_err("error %d\n", rc);
7807 		goto rw_error;
7808 	}
7809 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 80, 0);
7810 	if (rc != 0) {
7811 		pr_err("error %d\n", rc);
7812 		goto rw_error;
7813 	}
7814 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7815 	if (rc != 0) {
7816 		pr_err("error %d\n", rc);
7817 		goto rw_error;
7818 	}
7819 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7820 	if (rc != 0) {
7821 		pr_err("error %d\n", rc);
7822 		goto rw_error;
7823 	}
7824 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7825 	if (rc != 0) {
7826 		pr_err("error %d\n", rc);
7827 		goto rw_error;
7828 	}
7829 
7830 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43520, 0);
7831 	if (rc != 0) {
7832 		pr_err("error %d\n", rc);
7833 		goto rw_error;
7834 	}
7835 
7836 	return 0;
7837 rw_error:
7838 	return rc;
7839 }
7840 
7841 /*============================================================================*/
7842 #define QAM_SET_OP_ALL 0x1
7843 #define QAM_SET_OP_CONSTELLATION 0x2
7844 #define QAM_SET_OP_SPECTRUM 0X4
7845 
7846 /*
7847 * \fn int set_qam ()
7848 * \brief Set QAM demod.
7849 * \param demod:   instance of demod.
7850 * \param channel: pointer to channel data.
7851 * \return int.
7852 */
7853 static int
7854 set_qam(struct drx_demod_instance *demod,
7855 	struct drx_channel *channel, s32 tuner_freq_offset, u32 op)
7856 {
7857 	struct i2c_device_addr *dev_addr = NULL;
7858 	struct drxj_data *ext_attr = NULL;
7859 	struct drx_common_attr *common_attr = NULL;
7860 	int rc;
7861 	u32 adc_frequency = 0;
7862 	u32 iqm_rc_rate = 0;
7863 	u16 cmd_result = 0;
7864 	u16 lc_symbol_freq = 0;
7865 	u16 iqm_rc_stretch = 0;
7866 	u16 set_env_parameters = 0;
7867 	u16 set_param_parameters[2] = { 0 };
7868 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
7869 		/* parameter_len */ 0,
7870 		/* result_len    */ 0,
7871 		/* parameter    */ NULL,
7872 		/* result       */ NULL
7873 	};
7874 	static const u8 qam_a_taps[] = {
7875 		DRXJ_16TO8(-1),	/* re0  */
7876 		DRXJ_16TO8(1),	/* re1  */
7877 		DRXJ_16TO8(1),	/* re2  */
7878 		DRXJ_16TO8(-1),	/* re3  */
7879 		DRXJ_16TO8(-1),	/* re4  */
7880 		DRXJ_16TO8(2),	/* re5  */
7881 		DRXJ_16TO8(1),	/* re6  */
7882 		DRXJ_16TO8(-2),	/* re7  */
7883 		DRXJ_16TO8(0),	/* re8  */
7884 		DRXJ_16TO8(3),	/* re9  */
7885 		DRXJ_16TO8(-1),	/* re10 */
7886 		DRXJ_16TO8(-3),	/* re11 */
7887 		DRXJ_16TO8(4),	/* re12 */
7888 		DRXJ_16TO8(1),	/* re13 */
7889 		DRXJ_16TO8(-8),	/* re14 */
7890 		DRXJ_16TO8(4),	/* re15 */
7891 		DRXJ_16TO8(13),	/* re16 */
7892 		DRXJ_16TO8(-13),	/* re17 */
7893 		DRXJ_16TO8(-19),	/* re18 */
7894 		DRXJ_16TO8(28),	/* re19 */
7895 		DRXJ_16TO8(25),	/* re20 */
7896 		DRXJ_16TO8(-53),	/* re21 */
7897 		DRXJ_16TO8(-31),	/* re22 */
7898 		DRXJ_16TO8(96),	/* re23 */
7899 		DRXJ_16TO8(37),	/* re24 */
7900 		DRXJ_16TO8(-190),	/* re25 */
7901 		DRXJ_16TO8(-40),	/* re26 */
7902 		DRXJ_16TO8(619)	/* re27 */
7903 	};
7904 	static const u8 qam_b64_taps[] = {
7905 		DRXJ_16TO8(0),	/* re0  */
7906 		DRXJ_16TO8(-2),	/* re1  */
7907 		DRXJ_16TO8(1),	/* re2  */
7908 		DRXJ_16TO8(2),	/* re3  */
7909 		DRXJ_16TO8(-2),	/* re4  */
7910 		DRXJ_16TO8(0),	/* re5  */
7911 		DRXJ_16TO8(4),	/* re6  */
7912 		DRXJ_16TO8(-2),	/* re7  */
7913 		DRXJ_16TO8(-4),	/* re8  */
7914 		DRXJ_16TO8(4),	/* re9  */
7915 		DRXJ_16TO8(3),	/* re10 */
7916 		DRXJ_16TO8(-6),	/* re11 */
7917 		DRXJ_16TO8(0),	/* re12 */
7918 		DRXJ_16TO8(6),	/* re13 */
7919 		DRXJ_16TO8(-5),	/* re14 */
7920 		DRXJ_16TO8(-3),	/* re15 */
7921 		DRXJ_16TO8(11),	/* re16 */
7922 		DRXJ_16TO8(-4),	/* re17 */
7923 		DRXJ_16TO8(-19),	/* re18 */
7924 		DRXJ_16TO8(19),	/* re19 */
7925 		DRXJ_16TO8(28),	/* re20 */
7926 		DRXJ_16TO8(-45),	/* re21 */
7927 		DRXJ_16TO8(-36),	/* re22 */
7928 		DRXJ_16TO8(90),	/* re23 */
7929 		DRXJ_16TO8(42),	/* re24 */
7930 		DRXJ_16TO8(-185),	/* re25 */
7931 		DRXJ_16TO8(-46),	/* re26 */
7932 		DRXJ_16TO8(614)	/* re27 */
7933 	};
7934 	static const u8 qam_b256_taps[] = {
7935 		DRXJ_16TO8(-2),	/* re0  */
7936 		DRXJ_16TO8(4),	/* re1  */
7937 		DRXJ_16TO8(1),	/* re2  */
7938 		DRXJ_16TO8(-4),	/* re3  */
7939 		DRXJ_16TO8(0),	/* re4  */
7940 		DRXJ_16TO8(4),	/* re5  */
7941 		DRXJ_16TO8(-2),	/* re6  */
7942 		DRXJ_16TO8(-4),	/* re7  */
7943 		DRXJ_16TO8(5),	/* re8  */
7944 		DRXJ_16TO8(2),	/* re9  */
7945 		DRXJ_16TO8(-8),	/* re10 */
7946 		DRXJ_16TO8(2),	/* re11 */
7947 		DRXJ_16TO8(11),	/* re12 */
7948 		DRXJ_16TO8(-8),	/* re13 */
7949 		DRXJ_16TO8(-15),	/* re14 */
7950 		DRXJ_16TO8(16),	/* re15 */
7951 		DRXJ_16TO8(19),	/* re16 */
7952 		DRXJ_16TO8(-27),	/* re17 */
7953 		DRXJ_16TO8(-22),	/* re18 */
7954 		DRXJ_16TO8(44),	/* re19 */
7955 		DRXJ_16TO8(26),	/* re20 */
7956 		DRXJ_16TO8(-69),	/* re21 */
7957 		DRXJ_16TO8(-28),	/* re22 */
7958 		DRXJ_16TO8(110),	/* re23 */
7959 		DRXJ_16TO8(31),	/* re24 */
7960 		DRXJ_16TO8(-201),	/* re25 */
7961 		DRXJ_16TO8(-32),	/* re26 */
7962 		DRXJ_16TO8(628)	/* re27 */
7963 	};
7964 	static const u8 qam_c_taps[] = {
7965 		DRXJ_16TO8(-3),	/* re0  */
7966 		DRXJ_16TO8(3),	/* re1  */
7967 		DRXJ_16TO8(2),	/* re2  */
7968 		DRXJ_16TO8(-4),	/* re3  */
7969 		DRXJ_16TO8(0),	/* re4  */
7970 		DRXJ_16TO8(4),	/* re5  */
7971 		DRXJ_16TO8(-1),	/* re6  */
7972 		DRXJ_16TO8(-4),	/* re7  */
7973 		DRXJ_16TO8(3),	/* re8  */
7974 		DRXJ_16TO8(3),	/* re9  */
7975 		DRXJ_16TO8(-5),	/* re10 */
7976 		DRXJ_16TO8(0),	/* re11 */
7977 		DRXJ_16TO8(9),	/* re12 */
7978 		DRXJ_16TO8(-4),	/* re13 */
7979 		DRXJ_16TO8(-12),	/* re14 */
7980 		DRXJ_16TO8(10),	/* re15 */
7981 		DRXJ_16TO8(16),	/* re16 */
7982 		DRXJ_16TO8(-21),	/* re17 */
7983 		DRXJ_16TO8(-20),	/* re18 */
7984 		DRXJ_16TO8(37),	/* re19 */
7985 		DRXJ_16TO8(25),	/* re20 */
7986 		DRXJ_16TO8(-62),	/* re21 */
7987 		DRXJ_16TO8(-28),	/* re22 */
7988 		DRXJ_16TO8(105),	/* re23 */
7989 		DRXJ_16TO8(31),	/* re24 */
7990 		DRXJ_16TO8(-197),	/* re25 */
7991 		DRXJ_16TO8(-33),	/* re26 */
7992 		DRXJ_16TO8(626)	/* re27 */
7993 	};
7994 
7995 	dev_addr = demod->my_i2c_dev_addr;
7996 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
7997 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
7998 
7999 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8000 		if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8001 			switch (channel->constellation) {
8002 			case DRX_CONSTELLATION_QAM256:
8003 				iqm_rc_rate = 0x00AE3562;
8004 				lc_symbol_freq =
8005 				    QAM_LC_SYMBOL_FREQ_FREQ_QAM_B_256;
8006 				channel->symbolrate = 5360537;
8007 				iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_256;
8008 				break;
8009 			case DRX_CONSTELLATION_QAM64:
8010 				iqm_rc_rate = 0x00C05A0E;
8011 				lc_symbol_freq = 409;
8012 				channel->symbolrate = 5056941;
8013 				iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_64;
8014 				break;
8015 			default:
8016 				return -EINVAL;
8017 			}
8018 		} else {
8019 			adc_frequency = (common_attr->sys_clock_freq * 1000) / 3;
8020 			if (channel->symbolrate == 0) {
8021 				pr_err("error: channel symbolrate is zero!\n");
8022 				return -EIO;
8023 			}
8024 			iqm_rc_rate =
8025 			    (adc_frequency / channel->symbolrate) * (1 << 21) +
8026 			    (frac28
8027 			     ((adc_frequency % channel->symbolrate),
8028 			      channel->symbolrate) >> 7) - (1 << 23);
8029 			lc_symbol_freq =
8030 			    (u16) (frac28
8031 				     (channel->symbolrate +
8032 				      (adc_frequency >> 13),
8033 				      adc_frequency) >> 16);
8034 			if (lc_symbol_freq > 511)
8035 				lc_symbol_freq = 511;
8036 
8037 			iqm_rc_stretch = 21;
8038 		}
8039 
8040 		if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8041 			set_env_parameters = QAM_TOP_ANNEX_A;	/* annex             */
8042 			set_param_parameters[0] = channel->constellation;	/* constellation     */
8043 			set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;	/* interleave mode   */
8044 		} else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8045 			set_env_parameters = QAM_TOP_ANNEX_B;	/* annex             */
8046 			set_param_parameters[0] = channel->constellation;	/* constellation     */
8047 			set_param_parameters[1] = channel->interleavemode;	/* interleave mode   */
8048 		} else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8049 			set_env_parameters = QAM_TOP_ANNEX_C;	/* annex             */
8050 			set_param_parameters[0] = channel->constellation;	/* constellation     */
8051 			set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;	/* interleave mode   */
8052 		} else {
8053 			return -EINVAL;
8054 		}
8055 	}
8056 
8057 	if (op & QAM_SET_OP_ALL) {
8058 		/*
8059 		   STEP 1: reset demodulator
8060 		   resets IQM, QAM and FEC HW blocks
8061 		   resets SCU variables
8062 		 */
8063 		/* stop all comm_exec */
8064 		rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
8065 		if (rc != 0) {
8066 			pr_err("error %d\n", rc);
8067 			goto rw_error;
8068 		}
8069 		rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
8070 		if (rc != 0) {
8071 			pr_err("error %d\n", rc);
8072 			goto rw_error;
8073 		}
8074 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
8075 		if (rc != 0) {
8076 			pr_err("error %d\n", rc);
8077 			goto rw_error;
8078 		}
8079 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
8080 		if (rc != 0) {
8081 			pr_err("error %d\n", rc);
8082 			goto rw_error;
8083 		}
8084 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
8085 		if (rc != 0) {
8086 			pr_err("error %d\n", rc);
8087 			goto rw_error;
8088 		}
8089 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
8090 		if (rc != 0) {
8091 			pr_err("error %d\n", rc);
8092 			goto rw_error;
8093 		}
8094 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
8095 		if (rc != 0) {
8096 			pr_err("error %d\n", rc);
8097 			goto rw_error;
8098 		}
8099 
8100 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8101 		    SCU_RAM_COMMAND_CMD_DEMOD_RESET;
8102 		cmd_scu.parameter_len = 0;
8103 		cmd_scu.result_len = 1;
8104 		cmd_scu.parameter = NULL;
8105 		cmd_scu.result = &cmd_result;
8106 		rc = scu_command(dev_addr, &cmd_scu);
8107 		if (rc != 0) {
8108 			pr_err("error %d\n", rc);
8109 			goto rw_error;
8110 		}
8111 	}
8112 
8113 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8114 		/*
8115 		   STEP 2: configure demodulator
8116 		   -set env
8117 		   -set params (resets IQM,QAM,FEC HW; initializes some SCU variables )
8118 		 */
8119 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8120 		    SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
8121 		cmd_scu.parameter_len = 1;
8122 		cmd_scu.result_len = 1;
8123 		cmd_scu.parameter = &set_env_parameters;
8124 		cmd_scu.result = &cmd_result;
8125 		rc = scu_command(dev_addr, &cmd_scu);
8126 		if (rc != 0) {
8127 			pr_err("error %d\n", rc);
8128 			goto rw_error;
8129 		}
8130 
8131 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8132 		    SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
8133 		cmd_scu.parameter_len = 2;
8134 		cmd_scu.result_len = 1;
8135 		cmd_scu.parameter = set_param_parameters;
8136 		cmd_scu.result = &cmd_result;
8137 		rc = scu_command(dev_addr, &cmd_scu);
8138 		if (rc != 0) {
8139 			pr_err("error %d\n", rc);
8140 			goto rw_error;
8141 		}
8142 		/* set symbol rate */
8143 		rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate, 0);
8144 		if (rc != 0) {
8145 			pr_err("error %d\n", rc);
8146 			goto rw_error;
8147 		}
8148 		ext_attr->iqm_rc_rate_ofs = iqm_rc_rate;
8149 		rc = set_qam_measurement(demod, channel->constellation, channel->symbolrate);
8150 		if (rc != 0) {
8151 			pr_err("error %d\n", rc);
8152 			goto rw_error;
8153 		}
8154 	}
8155 	/* STEP 3: enable the system in a mode where the ADC provides valid signal
8156 	   setup constellation independent registers */
8157 	/* from qam_cmd.py script (qam_driver_b) */
8158 	/* TODO: remove re-writes of HW reset values */
8159 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_SPECTRUM)) {
8160 		rc = set_frequency(demod, channel, tuner_freq_offset);
8161 		if (rc != 0) {
8162 			pr_err("error %d\n", rc);
8163 			goto rw_error;
8164 		}
8165 	}
8166 
8167 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8168 
8169 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_SYMBOL_FREQ__A, lc_symbol_freq, 0);
8170 		if (rc != 0) {
8171 			pr_err("error %d\n", rc);
8172 			goto rw_error;
8173 		}
8174 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, iqm_rc_stretch, 0);
8175 		if (rc != 0) {
8176 			pr_err("error %d\n", rc);
8177 			goto rw_error;
8178 		}
8179 	}
8180 
8181 	if (op & QAM_SET_OP_ALL) {
8182 		if (!ext_attr->has_lna) {
8183 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
8184 			if (rc != 0) {
8185 				pr_err("error %d\n", rc);
8186 				goto rw_error;
8187 			}
8188 		}
8189 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
8190 		if (rc != 0) {
8191 			pr_err("error %d\n", rc);
8192 			goto rw_error;
8193 		}
8194 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
8195 		if (rc != 0) {
8196 			pr_err("error %d\n", rc);
8197 			goto rw_error;
8198 		}
8199 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_QAM__M, 0);
8200 		if (rc != 0) {
8201 			pr_err("error %d\n", rc);
8202 			goto rw_error;
8203 		}
8204 
8205 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_WR_RSV_0__A, 0x5f, 0);
8206 		if (rc != 0) {
8207 			pr_err("error %d\n", rc);
8208 			goto rw_error;
8209 		}	/* scu temporary shut down agc */
8210 
8211 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SYNC_SEL__A, 3, 0);
8212 		if (rc != 0) {
8213 			pr_err("error %d\n", rc);
8214 			goto rw_error;
8215 		}
8216 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
8217 		if (rc != 0) {
8218 			pr_err("error %d\n", rc);
8219 			goto rw_error;
8220 		}
8221 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 448, 0);
8222 		if (rc != 0) {
8223 			pr_err("error %d\n", rc);
8224 			goto rw_error;
8225 		}
8226 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
8227 		if (rc != 0) {
8228 			pr_err("error %d\n", rc);
8229 			goto rw_error;
8230 		}
8231 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, 4, 0);
8232 		if (rc != 0) {
8233 			pr_err("error %d\n", rc);
8234 			goto rw_error;
8235 		}
8236 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, 0x10, 0);
8237 		if (rc != 0) {
8238 			pr_err("error %d\n", rc);
8239 			goto rw_error;
8240 		}
8241 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, 11, 0);
8242 		if (rc != 0) {
8243 			pr_err("error %d\n", rc);
8244 			goto rw_error;
8245 		}
8246 
8247 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
8248 		if (rc != 0) {
8249 			pr_err("error %d\n", rc);
8250 			goto rw_error;
8251 		}
8252 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE, 0);
8253 		if (rc != 0) {
8254 			pr_err("error %d\n", rc);
8255 			goto rw_error;
8256 		}	/*! reset default val ! */
8257 
8258 		rc = drxj_dap_write_reg16(dev_addr, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE, 0);
8259 		if (rc != 0) {
8260 			pr_err("error %d\n", rc);
8261 			goto rw_error;
8262 		}	/*! reset default val ! */
8263 		if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8264 			rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, QAM_SY_SYNC_LWM__PRE, 0);
8265 			if (rc != 0) {
8266 				pr_err("error %d\n", rc);
8267 				goto rw_error;
8268 			}	/*! reset default val ! */
8269 			rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, QAM_SY_SYNC_AWM__PRE, 0);
8270 			if (rc != 0) {
8271 				pr_err("error %d\n", rc);
8272 				goto rw_error;
8273 			}	/*! reset default val ! */
8274 			rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8275 			if (rc != 0) {
8276 				pr_err("error %d\n", rc);
8277 				goto rw_error;
8278 			}	/*! reset default val ! */
8279 		} else {
8280 			switch (channel->constellation) {
8281 			case DRX_CONSTELLATION_QAM16:
8282 			case DRX_CONSTELLATION_QAM64:
8283 			case DRX_CONSTELLATION_QAM256:
8284 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8285 				if (rc != 0) {
8286 					pr_err("error %d\n", rc);
8287 					goto rw_error;
8288 				}
8289 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x04, 0);
8290 				if (rc != 0) {
8291 					pr_err("error %d\n", rc);
8292 					goto rw_error;
8293 				}
8294 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8295 				if (rc != 0) {
8296 					pr_err("error %d\n", rc);
8297 					goto rw_error;
8298 				}	/*! reset default val ! */
8299 				break;
8300 			case DRX_CONSTELLATION_QAM32:
8301 			case DRX_CONSTELLATION_QAM128:
8302 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8303 				if (rc != 0) {
8304 					pr_err("error %d\n", rc);
8305 					goto rw_error;
8306 				}
8307 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x05, 0);
8308 				if (rc != 0) {
8309 					pr_err("error %d\n", rc);
8310 					goto rw_error;
8311 				}
8312 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, 0x06, 0);
8313 				if (rc != 0) {
8314 					pr_err("error %d\n", rc);
8315 					goto rw_error;
8316 				}
8317 				break;
8318 			default:
8319 				return -EIO;
8320 			}	/* switch */
8321 		}
8322 
8323 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, QAM_LC_MODE__PRE, 0);
8324 		if (rc != 0) {
8325 			pr_err("error %d\n", rc);
8326 			goto rw_error;
8327 		}	/*! reset default val ! */
8328 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_RATE_LIMIT__A, 3, 0);
8329 		if (rc != 0) {
8330 			pr_err("error %d\n", rc);
8331 			goto rw_error;
8332 		}
8333 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORP__A, 4, 0);
8334 		if (rc != 0) {
8335 			pr_err("error %d\n", rc);
8336 			goto rw_error;
8337 		}
8338 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORI__A, 4, 0);
8339 		if (rc != 0) {
8340 			pr_err("error %d\n", rc);
8341 			goto rw_error;
8342 		}
8343 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, 7, 0);
8344 		if (rc != 0) {
8345 			pr_err("error %d\n", rc);
8346 			goto rw_error;
8347 		}
8348 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB0__A, 1, 0);
8349 		if (rc != 0) {
8350 			pr_err("error %d\n", rc);
8351 			goto rw_error;
8352 		}
8353 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB1__A, 1, 0);
8354 		if (rc != 0) {
8355 			pr_err("error %d\n", rc);
8356 			goto rw_error;
8357 		}
8358 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB2__A, 1, 0);
8359 		if (rc != 0) {
8360 			pr_err("error %d\n", rc);
8361 			goto rw_error;
8362 		}
8363 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB3__A, 1, 0);
8364 		if (rc != 0) {
8365 			pr_err("error %d\n", rc);
8366 			goto rw_error;
8367 		}
8368 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB4__A, 2, 0);
8369 		if (rc != 0) {
8370 			pr_err("error %d\n", rc);
8371 			goto rw_error;
8372 		}
8373 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB5__A, 2, 0);
8374 		if (rc != 0) {
8375 			pr_err("error %d\n", rc);
8376 			goto rw_error;
8377 		}
8378 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB6__A, 2, 0);
8379 		if (rc != 0) {
8380 			pr_err("error %d\n", rc);
8381 			goto rw_error;
8382 		}
8383 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB8__A, 2, 0);
8384 		if (rc != 0) {
8385 			pr_err("error %d\n", rc);
8386 			goto rw_error;
8387 		}
8388 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB9__A, 2, 0);
8389 		if (rc != 0) {
8390 			pr_err("error %d\n", rc);
8391 			goto rw_error;
8392 		}
8393 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB10__A, 2, 0);
8394 		if (rc != 0) {
8395 			pr_err("error %d\n", rc);
8396 			goto rw_error;
8397 		}
8398 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB12__A, 2, 0);
8399 		if (rc != 0) {
8400 			pr_err("error %d\n", rc);
8401 			goto rw_error;
8402 		}
8403 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB15__A, 3, 0);
8404 		if (rc != 0) {
8405 			pr_err("error %d\n", rc);
8406 			goto rw_error;
8407 		}
8408 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB16__A, 3, 0);
8409 		if (rc != 0) {
8410 			pr_err("error %d\n", rc);
8411 			goto rw_error;
8412 		}
8413 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB20__A, 4, 0);
8414 		if (rc != 0) {
8415 			pr_err("error %d\n", rc);
8416 			goto rw_error;
8417 		}
8418 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB25__A, 4, 0);
8419 		if (rc != 0) {
8420 			pr_err("error %d\n", rc);
8421 			goto rw_error;
8422 		}
8423 
8424 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, 1, 0);
8425 		if (rc != 0) {
8426 			pr_err("error %d\n", rc);
8427 			goto rw_error;
8428 		}
8429 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, 1, 0);
8430 		if (rc != 0) {
8431 			pr_err("error %d\n", rc);
8432 			goto rw_error;
8433 		}
8434 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_ADJ_SEL__A, 1, 0);
8435 		if (rc != 0) {
8436 			pr_err("error %d\n", rc);
8437 			goto rw_error;
8438 		}
8439 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 0, 0);
8440 		if (rc != 0) {
8441 			pr_err("error %d\n", rc);
8442 			goto rw_error;
8443 		}
8444 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
8445 		if (rc != 0) {
8446 			pr_err("error %d\n", rc);
8447 			goto rw_error;
8448 		}
8449 
8450 		/* No more resets of the IQM, current standard correctly set =>
8451 		   now AGCs can be configured. */
8452 		/* turn on IQMAF. It has to be in front of setAgc**() */
8453 		rc = set_iqm_af(demod, true);
8454 		if (rc != 0) {
8455 			pr_err("error %d\n", rc);
8456 			goto rw_error;
8457 		}
8458 		rc = adc_synchronization(demod);
8459 		if (rc != 0) {
8460 			pr_err("error %d\n", rc);
8461 			goto rw_error;
8462 		}
8463 
8464 		rc = init_agc(demod);
8465 		if (rc != 0) {
8466 			pr_err("error %d\n", rc);
8467 			goto rw_error;
8468 		}
8469 		rc = set_agc_if(demod, &(ext_attr->qam_if_agc_cfg), false);
8470 		if (rc != 0) {
8471 			pr_err("error %d\n", rc);
8472 			goto rw_error;
8473 		}
8474 		rc = set_agc_rf(demod, &(ext_attr->qam_rf_agc_cfg), false);
8475 		if (rc != 0) {
8476 			pr_err("error %d\n", rc);
8477 			goto rw_error;
8478 		}
8479 		{
8480 			/* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
8481 			   of only the gain */
8482 			struct drxj_cfg_afe_gain qam_pga_cfg = { DRX_STANDARD_ITU_B, 0 };
8483 
8484 			qam_pga_cfg.gain = ext_attr->qam_pga_cfg;
8485 			rc = ctrl_set_cfg_afe_gain(demod, &qam_pga_cfg);
8486 			if (rc != 0) {
8487 				pr_err("error %d\n", rc);
8488 				goto rw_error;
8489 			}
8490 		}
8491 		rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->qam_pre_saw_cfg));
8492 		if (rc != 0) {
8493 			pr_err("error %d\n", rc);
8494 			goto rw_error;
8495 		}
8496 	}
8497 
8498 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8499 		if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8500 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8501 			if (rc != 0) {
8502 				pr_err("error %d\n", rc);
8503 				goto rw_error;
8504 			}
8505 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8506 			if (rc != 0) {
8507 				pr_err("error %d\n", rc);
8508 				goto rw_error;
8509 			}
8510 		} else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8511 			switch (channel->constellation) {
8512 			case DRX_CONSTELLATION_QAM64:
8513 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8514 				if (rc != 0) {
8515 					pr_err("error %d\n", rc);
8516 					goto rw_error;
8517 				}
8518 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8519 				if (rc != 0) {
8520 					pr_err("error %d\n", rc);
8521 					goto rw_error;
8522 				}
8523 				break;
8524 			case DRX_CONSTELLATION_QAM256:
8525 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8526 				if (rc != 0) {
8527 					pr_err("error %d\n", rc);
8528 					goto rw_error;
8529 				}
8530 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8531 				if (rc != 0) {
8532 					pr_err("error %d\n", rc);
8533 					goto rw_error;
8534 				}
8535 				break;
8536 			default:
8537 				return -EIO;
8538 			}
8539 		} else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8540 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8541 			if (rc != 0) {
8542 				pr_err("error %d\n", rc);
8543 				goto rw_error;
8544 			}
8545 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8546 			if (rc != 0) {
8547 				pr_err("error %d\n", rc);
8548 				goto rw_error;
8549 			}
8550 		}
8551 
8552 		/* SETP 4: constellation specific setup */
8553 		switch (channel->constellation) {
8554 		case DRX_CONSTELLATION_QAM16:
8555 			rc = set_qam16(demod);
8556 			if (rc != 0) {
8557 				pr_err("error %d\n", rc);
8558 				goto rw_error;
8559 			}
8560 			break;
8561 		case DRX_CONSTELLATION_QAM32:
8562 			rc = set_qam32(demod);
8563 			if (rc != 0) {
8564 				pr_err("error %d\n", rc);
8565 				goto rw_error;
8566 			}
8567 			break;
8568 		case DRX_CONSTELLATION_QAM64:
8569 			rc = set_qam64(demod);
8570 			if (rc != 0) {
8571 				pr_err("error %d\n", rc);
8572 				goto rw_error;
8573 			}
8574 			break;
8575 		case DRX_CONSTELLATION_QAM128:
8576 			rc = set_qam128(demod);
8577 			if (rc != 0) {
8578 				pr_err("error %d\n", rc);
8579 				goto rw_error;
8580 			}
8581 			break;
8582 		case DRX_CONSTELLATION_QAM256:
8583 			rc = set_qam256(demod);
8584 			if (rc != 0) {
8585 				pr_err("error %d\n", rc);
8586 				goto rw_error;
8587 			}
8588 			break;
8589 		default:
8590 			return -EIO;
8591 		}		/* switch */
8592 	}
8593 
8594 	if ((op & QAM_SET_OP_ALL)) {
8595 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
8596 		if (rc != 0) {
8597 			pr_err("error %d\n", rc);
8598 			goto rw_error;
8599 		}
8600 
8601 		/* Mpeg output has to be in front of FEC active */
8602 		rc = set_mpegtei_handling(demod);
8603 		if (rc != 0) {
8604 			pr_err("error %d\n", rc);
8605 			goto rw_error;
8606 		}
8607 		rc = bit_reverse_mpeg_output(demod);
8608 		if (rc != 0) {
8609 			pr_err("error %d\n", rc);
8610 			goto rw_error;
8611 		}
8612 		rc = set_mpeg_start_width(demod);
8613 		if (rc != 0) {
8614 			pr_err("error %d\n", rc);
8615 			goto rw_error;
8616 		}
8617 		{
8618 			/* TODO: move to set_standard after hardware reset value problem is solved */
8619 			/* Configure initial MPEG output */
8620 			struct drx_cfg_mpeg_output cfg_mpeg_output;
8621 
8622 			memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
8623 			cfg_mpeg_output.enable_mpeg_output = true;
8624 
8625 			rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
8626 			if (rc != 0) {
8627 				pr_err("error %d\n", rc);
8628 				goto rw_error;
8629 			}
8630 		}
8631 	}
8632 
8633 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8634 
8635 		/* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
8636 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8637 		    SCU_RAM_COMMAND_CMD_DEMOD_START;
8638 		cmd_scu.parameter_len = 0;
8639 		cmd_scu.result_len = 1;
8640 		cmd_scu.parameter = NULL;
8641 		cmd_scu.result = &cmd_result;
8642 		rc = scu_command(dev_addr, &cmd_scu);
8643 		if (rc != 0) {
8644 			pr_err("error %d\n", rc);
8645 			goto rw_error;
8646 		}
8647 	}
8648 
8649 	rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
8650 	if (rc != 0) {
8651 		pr_err("error %d\n", rc);
8652 		goto rw_error;
8653 	}
8654 	rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE, 0);
8655 	if (rc != 0) {
8656 		pr_err("error %d\n", rc);
8657 		goto rw_error;
8658 	}
8659 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
8660 	if (rc != 0) {
8661 		pr_err("error %d\n", rc);
8662 		goto rw_error;
8663 	}
8664 
8665 	return 0;
8666 rw_error:
8667 	return rc;
8668 }
8669 
8670 /*============================================================================*/
8671 static int ctrl_get_qam_sig_quality(struct drx_demod_instance *demod);
8672 
8673 static int qam_flip_spec(struct drx_demod_instance *demod, struct drx_channel *channel)
8674 {
8675 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8676 	struct drxj_data *ext_attr = demod->my_ext_attr;
8677 	int rc;
8678 	u32 iqm_fs_rate_ofs = 0;
8679 	u32 iqm_fs_rate_lo = 0;
8680 	u16 qam_ctl_ena = 0;
8681 	u16 data = 0;
8682 	u16 equ_mode = 0;
8683 	u16 fsm_state = 0;
8684 	int i = 0;
8685 	int ofsofs = 0;
8686 
8687 	/* Silence the controlling of lc, equ, and the acquisition state machine */
8688 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, &qam_ctl_ena, 0);
8689 	if (rc != 0) {
8690 		pr_err("error %d\n", rc);
8691 		goto rw_error;
8692 	}
8693 	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);
8694 	if (rc != 0) {
8695 		pr_err("error %d\n", rc);
8696 		goto rw_error;
8697 	}
8698 
8699 	/* freeze the frequency control loop */
8700 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF__A, 0, 0);
8701 	if (rc != 0) {
8702 		pr_err("error %d\n", rc);
8703 		goto rw_error;
8704 	}
8705 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF1__A, 0, 0);
8706 	if (rc != 0) {
8707 		pr_err("error %d\n", rc);
8708 		goto rw_error;
8709 	}
8710 
8711 	rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, &iqm_fs_rate_ofs, 0);
8712 	if (rc != 0) {
8713 		pr_err("error %d\n", rc);
8714 		goto rw_error;
8715 	}
8716 	rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_LO__A, &iqm_fs_rate_lo, 0);
8717 	if (rc != 0) {
8718 		pr_err("error %d\n", rc);
8719 		goto rw_error;
8720 	}
8721 	ofsofs = iqm_fs_rate_lo - iqm_fs_rate_ofs;
8722 	iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
8723 	iqm_fs_rate_ofs -= 2 * ofsofs;
8724 
8725 	/* freeze dq/fq updating */
8726 	rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8727 	if (rc != 0) {
8728 		pr_err("error %d\n", rc);
8729 		goto rw_error;
8730 	}
8731 	data = (data & 0xfff9);
8732 	rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8733 	if (rc != 0) {
8734 		pr_err("error %d\n", rc);
8735 		goto rw_error;
8736 	}
8737 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8738 	if (rc != 0) {
8739 		pr_err("error %d\n", rc);
8740 		goto rw_error;
8741 	}
8742 
8743 	/* lc_cp / _ci / _ca */
8744 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CI__A, 0, 0);
8745 	if (rc != 0) {
8746 		pr_err("error %d\n", rc);
8747 		goto rw_error;
8748 	}
8749 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_EP__A, 0, 0);
8750 	if (rc != 0) {
8751 		pr_err("error %d\n", rc);
8752 		goto rw_error;
8753 	}
8754 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_LA_FACTOR__A, 0, 0);
8755 	if (rc != 0) {
8756 		pr_err("error %d\n", rc);
8757 		goto rw_error;
8758 	}
8759 
8760 	/* flip the spec */
8761 	rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
8762 	if (rc != 0) {
8763 		pr_err("error %d\n", rc);
8764 		goto rw_error;
8765 	}
8766 	ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
8767 	ext_attr->pos_image = (ext_attr->pos_image) ? false : true;
8768 
8769 	/* freeze dq/fq updating */
8770 	rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8771 	if (rc != 0) {
8772 		pr_err("error %d\n", rc);
8773 		goto rw_error;
8774 	}
8775 	equ_mode = data;
8776 	data = (data & 0xfff9);
8777 	rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8778 	if (rc != 0) {
8779 		pr_err("error %d\n", rc);
8780 		goto rw_error;
8781 	}
8782 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8783 	if (rc != 0) {
8784 		pr_err("error %d\n", rc);
8785 		goto rw_error;
8786 	}
8787 
8788 	for (i = 0; i < 28; i++) {
8789 		rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8790 		if (rc != 0) {
8791 			pr_err("error %d\n", rc);
8792 			goto rw_error;
8793 		}
8794 		rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8795 		if (rc != 0) {
8796 			pr_err("error %d\n", rc);
8797 			goto rw_error;
8798 		}
8799 	}
8800 
8801 	for (i = 0; i < 24; i++) {
8802 		rc = drxj_dap_read_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8803 		if (rc != 0) {
8804 			pr_err("error %d\n", rc);
8805 			goto rw_error;
8806 		}
8807 		rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8808 		if (rc != 0) {
8809 			pr_err("error %d\n", rc);
8810 			goto rw_error;
8811 		}
8812 	}
8813 
8814 	data = equ_mode;
8815 	rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8816 	if (rc != 0) {
8817 		pr_err("error %d\n", rc);
8818 		goto rw_error;
8819 	}
8820 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8821 	if (rc != 0) {
8822 		pr_err("error %d\n", rc);
8823 		goto rw_error;
8824 	}
8825 
8826 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE_TGT__A, 4, 0);
8827 	if (rc != 0) {
8828 		pr_err("error %d\n", rc);
8829 		goto rw_error;
8830 	}
8831 
8832 	i = 0;
8833 	while ((fsm_state != 4) && (i++ < 100)) {
8834 		rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE__A, &fsm_state, 0);
8835 		if (rc != 0) {
8836 			pr_err("error %d\n", rc);
8837 			goto rw_error;
8838 		}
8839 	}
8840 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, (qam_ctl_ena | 0x0016), 0);
8841 	if (rc != 0) {
8842 		pr_err("error %d\n", rc);
8843 		goto rw_error;
8844 	}
8845 
8846 	return 0;
8847 rw_error:
8848 	return rc;
8849 
8850 }
8851 
8852 #define  NO_LOCK        0x0
8853 #define  DEMOD_LOCKED   0x1
8854 #define  SYNC_FLIPPED   0x2
8855 #define  SPEC_MIRRORED  0x4
8856 /*
8857 * \fn int qam64auto ()
8858 * \brief auto do sync pattern switching and mirroring.
8859 * \param demod:   instance of demod.
8860 * \param channel: pointer to channel data.
8861 * \param tuner_freq_offset: tuner frequency offset.
8862 * \param lock_status: pointer to lock status.
8863 * \return int.
8864 */
8865 static int
8866 qam64auto(struct drx_demod_instance *demod,
8867 	  struct drx_channel *channel,
8868 	  s32 tuner_freq_offset, enum drx_lock_status *lock_status)
8869 {
8870 	struct drxj_data *ext_attr = demod->my_ext_attr;
8871 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8872 	struct drx39xxj_state *state = dev_addr->user_data;
8873 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
8874 	int rc;
8875 	u32 lck_state = NO_LOCK;
8876 	u32 start_time = 0;
8877 	u32 d_locked_time = 0;
8878 	u32 timeout_ofs = 0;
8879 	u16 data = 0;
8880 
8881 	/* external attributes for storing acquired channel constellation */
8882 	*lock_status = DRX_NOT_LOCKED;
8883 	start_time = jiffies_to_msecs(jiffies);
8884 	lck_state = NO_LOCK;
8885 	do {
8886 		rc = ctrl_lock_status(demod, lock_status);
8887 		if (rc != 0) {
8888 			pr_err("error %d\n", rc);
8889 			goto rw_error;
8890 		}
8891 
8892 		switch (lck_state) {
8893 		case NO_LOCK:
8894 			if (*lock_status == DRXJ_DEMOD_LOCK) {
8895 				rc = ctrl_get_qam_sig_quality(demod);
8896 				if (rc != 0) {
8897 					pr_err("error %d\n", rc);
8898 					goto rw_error;
8899 				}
8900 				if (p->cnr.stat[0].svalue > 20800) {
8901 					lck_state = DEMOD_LOCKED;
8902 					/* some delay to see if fec_lock possible TODO find the right value */
8903 					timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;	/* see something, waiting longer */
8904 					d_locked_time = jiffies_to_msecs(jiffies);
8905 				}
8906 			}
8907 			break;
8908 		case DEMOD_LOCKED:
8909 			if ((*lock_status == DRXJ_DEMOD_LOCK) &&	/* still demod_lock in 150ms */
8910 			    ((jiffies_to_msecs(jiffies) - d_locked_time) >
8911 			     DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8912 				rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8913 				if (rc != 0) {
8914 					pr_err("error %d\n", rc);
8915 					goto rw_error;
8916 				}
8917 				rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8918 				if (rc != 0) {
8919 					pr_err("error %d\n", rc);
8920 					goto rw_error;
8921 				}
8922 				lck_state = SYNC_FLIPPED;
8923 				msleep(10);
8924 			}
8925 			break;
8926 		case SYNC_FLIPPED:
8927 			if (*lock_status == DRXJ_DEMOD_LOCK) {
8928 				if (channel->mirror == DRX_MIRROR_AUTO) {
8929 					/* flip sync pattern back */
8930 					rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8931 					if (rc != 0) {
8932 						pr_err("error %d\n", rc);
8933 						goto rw_error;
8934 					}
8935 					rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data & 0xFFFE, 0);
8936 					if (rc != 0) {
8937 						pr_err("error %d\n", rc);
8938 						goto rw_error;
8939 					}
8940 					/* flip spectrum */
8941 					ext_attr->mirror = DRX_MIRROR_YES;
8942 					rc = qam_flip_spec(demod, channel);
8943 					if (rc != 0) {
8944 						pr_err("error %d\n", rc);
8945 						goto rw_error;
8946 					}
8947 					lck_state = SPEC_MIRRORED;
8948 					/* reset timer TODO: still need 500ms? */
8949 					start_time = d_locked_time =
8950 					    jiffies_to_msecs(jiffies);
8951 					timeout_ofs = 0;
8952 				} else {	/* no need to wait lock */
8953 
8954 					start_time =
8955 					    jiffies_to_msecs(jiffies) -
8956 					    DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8957 				}
8958 			}
8959 			break;
8960 		case SPEC_MIRRORED:
8961 			if ((*lock_status == DRXJ_DEMOD_LOCK) &&	/* still demod_lock in 150ms */
8962 			    ((jiffies_to_msecs(jiffies) - d_locked_time) >
8963 			     DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8964 				rc = ctrl_get_qam_sig_quality(demod);
8965 				if (rc != 0) {
8966 					pr_err("error %d\n", rc);
8967 					goto rw_error;
8968 				}
8969 				if (p->cnr.stat[0].svalue > 20800) {
8970 					rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8971 					if (rc != 0) {
8972 						pr_err("error %d\n", rc);
8973 						goto rw_error;
8974 					}
8975 					rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8976 					if (rc != 0) {
8977 						pr_err("error %d\n", rc);
8978 						goto rw_error;
8979 					}
8980 					/* no need to wait lock */
8981 					start_time =
8982 					    jiffies_to_msecs(jiffies) -
8983 					    DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8984 				}
8985 			}
8986 			break;
8987 		default:
8988 			break;
8989 		}
8990 		msleep(10);
8991 	} while
8992 	    ((*lock_status != DRX_LOCKED) &&
8993 	     (*lock_status != DRX_NEVER_LOCK) &&
8994 	     ((jiffies_to_msecs(jiffies) - start_time) <
8995 	      (DRXJ_QAM_MAX_WAITTIME + timeout_ofs))
8996 	    );
8997 	/* Returning control to application ... */
8998 
8999 	return 0;
9000 rw_error:
9001 	return rc;
9002 }
9003 
9004 /*
9005 * \fn int qam256auto ()
9006 * \brief auto do sync pattern switching and mirroring.
9007 * \param demod:   instance of demod.
9008 * \param channel: pointer to channel data.
9009 * \param tuner_freq_offset: tuner frequency offset.
9010 * \param lock_status: pointer to lock status.
9011 * \return int.
9012 */
9013 static int
9014 qam256auto(struct drx_demod_instance *demod,
9015 	   struct drx_channel *channel,
9016 	   s32 tuner_freq_offset, enum drx_lock_status *lock_status)
9017 {
9018 	struct drxj_data *ext_attr = demod->my_ext_attr;
9019 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9020 	struct drx39xxj_state *state = dev_addr->user_data;
9021 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9022 	int rc;
9023 	u32 lck_state = NO_LOCK;
9024 	u32 start_time = 0;
9025 	u32 d_locked_time = 0;
9026 	u32 timeout_ofs = DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
9027 
9028 	/* external attributes for storing acquired channel constellation */
9029 	*lock_status = DRX_NOT_LOCKED;
9030 	start_time = jiffies_to_msecs(jiffies);
9031 	lck_state = NO_LOCK;
9032 	do {
9033 		rc = ctrl_lock_status(demod, lock_status);
9034 		if (rc != 0) {
9035 			pr_err("error %d\n", rc);
9036 			goto rw_error;
9037 		}
9038 		switch (lck_state) {
9039 		case NO_LOCK:
9040 			if (*lock_status == DRXJ_DEMOD_LOCK) {
9041 				rc = ctrl_get_qam_sig_quality(demod);
9042 				if (rc != 0) {
9043 					pr_err("error %d\n", rc);
9044 					goto rw_error;
9045 				}
9046 				if (p->cnr.stat[0].svalue > 26800) {
9047 					lck_state = DEMOD_LOCKED;
9048 					timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;	/* see something, wait longer */
9049 					d_locked_time = jiffies_to_msecs(jiffies);
9050 				}
9051 			}
9052 			break;
9053 		case DEMOD_LOCKED:
9054 			if (*lock_status == DRXJ_DEMOD_LOCK) {
9055 				if ((channel->mirror == DRX_MIRROR_AUTO) &&
9056 				    ((jiffies_to_msecs(jiffies) - d_locked_time) >
9057 				     DRXJ_QAM_FEC_LOCK_WAITTIME)) {
9058 					ext_attr->mirror = DRX_MIRROR_YES;
9059 					rc = qam_flip_spec(demod, channel);
9060 					if (rc != 0) {
9061 						pr_err("error %d\n", rc);
9062 						goto rw_error;
9063 					}
9064 					lck_state = SPEC_MIRRORED;
9065 					/* reset timer TODO: still need 300ms? */
9066 					start_time = jiffies_to_msecs(jiffies);
9067 					timeout_ofs = -DRXJ_QAM_MAX_WAITTIME / 2;
9068 				}
9069 			}
9070 			break;
9071 		case SPEC_MIRRORED:
9072 			break;
9073 		default:
9074 			break;
9075 		}
9076 		msleep(10);
9077 	} while
9078 	    ((*lock_status < DRX_LOCKED) &&
9079 	     (*lock_status != DRX_NEVER_LOCK) &&
9080 	     ((jiffies_to_msecs(jiffies) - start_time) <
9081 	      (DRXJ_QAM_MAX_WAITTIME + timeout_ofs)));
9082 
9083 	return 0;
9084 rw_error:
9085 	return rc;
9086 }
9087 
9088 /*
9089 * \fn int set_qam_channel ()
9090 * \brief Set QAM channel according to the requested constellation.
9091 * \param demod:   instance of demod.
9092 * \param channel: pointer to channel data.
9093 * \return int.
9094 */
9095 static int
9096 set_qam_channel(struct drx_demod_instance *demod,
9097 	       struct drx_channel *channel, s32 tuner_freq_offset)
9098 {
9099 	struct drxj_data *ext_attr = NULL;
9100 	int rc;
9101 	enum drx_lock_status lock_status = DRX_NOT_LOCKED;
9102 	bool auto_flag = false;
9103 
9104 	/* external attributes for storing acquired channel constellation */
9105 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
9106 
9107 	/* set QAM channel constellation */
9108 	switch (channel->constellation) {
9109 	case DRX_CONSTELLATION_QAM16:
9110 	case DRX_CONSTELLATION_QAM32:
9111 	case DRX_CONSTELLATION_QAM128:
9112 		return -EINVAL;
9113 	case DRX_CONSTELLATION_QAM64:
9114 	case DRX_CONSTELLATION_QAM256:
9115 		if (ext_attr->standard != DRX_STANDARD_ITU_B)
9116 			return -EINVAL;
9117 
9118 		ext_attr->constellation = channel->constellation;
9119 		if (channel->mirror == DRX_MIRROR_AUTO)
9120 			ext_attr->mirror = DRX_MIRROR_NO;
9121 		else
9122 			ext_attr->mirror = channel->mirror;
9123 
9124 		rc = set_qam(demod, channel, tuner_freq_offset, QAM_SET_OP_ALL);
9125 		if (rc != 0) {
9126 			pr_err("error %d\n", rc);
9127 			goto rw_error;
9128 		}
9129 
9130 		if (channel->constellation == DRX_CONSTELLATION_QAM64)
9131 			rc = qam64auto(demod, channel, tuner_freq_offset,
9132 				       &lock_status);
9133 		else
9134 			rc = qam256auto(demod, channel, tuner_freq_offset,
9135 					&lock_status);
9136 		if (rc != 0) {
9137 			pr_err("error %d\n", rc);
9138 			goto rw_error;
9139 		}
9140 		break;
9141 	case DRX_CONSTELLATION_AUTO:	/* for channel scan */
9142 		if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9143 			u16 qam_ctl_ena = 0;
9144 
9145 			auto_flag = true;
9146 
9147 			/* try to lock default QAM constellation: QAM256 */
9148 			channel->constellation = DRX_CONSTELLATION_QAM256;
9149 			ext_attr->constellation = DRX_CONSTELLATION_QAM256;
9150 			if (channel->mirror == DRX_MIRROR_AUTO)
9151 				ext_attr->mirror = DRX_MIRROR_NO;
9152 			else
9153 				ext_attr->mirror = channel->mirror;
9154 			rc = set_qam(demod, channel, tuner_freq_offset,
9155 				     QAM_SET_OP_ALL);
9156 			if (rc != 0) {
9157 				pr_err("error %d\n", rc);
9158 				goto rw_error;
9159 			}
9160 			rc = qam256auto(demod, channel, tuner_freq_offset,
9161 					&lock_status);
9162 			if (rc != 0) {
9163 				pr_err("error %d\n", rc);
9164 				goto rw_error;
9165 			}
9166 
9167 			if (lock_status >= DRX_LOCKED) {
9168 				channel->constellation = DRX_CONSTELLATION_AUTO;
9169 				break;
9170 			}
9171 
9172 			/* QAM254 not locked. Try QAM64 constellation */
9173 			channel->constellation = DRX_CONSTELLATION_QAM64;
9174 			ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9175 			if (channel->mirror == DRX_MIRROR_AUTO)
9176 				ext_attr->mirror = DRX_MIRROR_NO;
9177 			else
9178 				ext_attr->mirror = channel->mirror;
9179 
9180 			rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9181 						     SCU_RAM_QAM_CTL_ENA__A,
9182 						     &qam_ctl_ena, 0);
9183 			if (rc != 0) {
9184 				pr_err("error %d\n", rc);
9185 				goto rw_error;
9186 			}
9187 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9188 						      SCU_RAM_QAM_CTL_ENA__A,
9189 						      qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9190 			if (rc != 0) {
9191 				pr_err("error %d\n", rc);
9192 				goto rw_error;
9193 			}
9194 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9195 						      SCU_RAM_QAM_FSM_STATE_TGT__A,
9196 						      0x2, 0);
9197 			if (rc != 0) {
9198 				pr_err("error %d\n", rc);
9199 				goto rw_error;
9200 			}	/* force to rate hunting */
9201 
9202 			rc = set_qam(demod, channel, tuner_freq_offset,
9203 				     QAM_SET_OP_CONSTELLATION);
9204 			if (rc != 0) {
9205 				pr_err("error %d\n", rc);
9206 				goto rw_error;
9207 			}
9208 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9209 						      SCU_RAM_QAM_CTL_ENA__A,
9210 						      qam_ctl_ena, 0);
9211 			if (rc != 0) {
9212 				pr_err("error %d\n", rc);
9213 				goto rw_error;
9214 			}
9215 
9216 			rc = qam64auto(demod, channel, tuner_freq_offset,
9217 				       &lock_status);
9218 			if (rc != 0) {
9219 				pr_err("error %d\n", rc);
9220 				goto rw_error;
9221 			}
9222 
9223 			channel->constellation = DRX_CONSTELLATION_AUTO;
9224 		} else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
9225 			u16 qam_ctl_ena = 0;
9226 
9227 			channel->constellation = DRX_CONSTELLATION_QAM64;
9228 			ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9229 			auto_flag = true;
9230 
9231 			if (channel->mirror == DRX_MIRROR_AUTO)
9232 				ext_attr->mirror = DRX_MIRROR_NO;
9233 			else
9234 				ext_attr->mirror = channel->mirror;
9235 			rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9236 						     SCU_RAM_QAM_CTL_ENA__A,
9237 						     &qam_ctl_ena, 0);
9238 			if (rc != 0) {
9239 				pr_err("error %d\n", rc);
9240 				goto rw_error;
9241 			}
9242 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9243 						      SCU_RAM_QAM_CTL_ENA__A,
9244 						      qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9245 			if (rc != 0) {
9246 				pr_err("error %d\n", rc);
9247 				goto rw_error;
9248 			}
9249 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9250 						      SCU_RAM_QAM_FSM_STATE_TGT__A,
9251 						      0x2, 0);
9252 			if (rc != 0) {
9253 				pr_err("error %d\n", rc);
9254 				goto rw_error;
9255 			}	/* force to rate hunting */
9256 
9257 			rc = set_qam(demod, channel, tuner_freq_offset,
9258 				     QAM_SET_OP_CONSTELLATION);
9259 			if (rc != 0) {
9260 				pr_err("error %d\n", rc);
9261 				goto rw_error;
9262 			}
9263 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9264 						      SCU_RAM_QAM_CTL_ENA__A,
9265 						      qam_ctl_ena, 0);
9266 			if (rc != 0) {
9267 				pr_err("error %d\n", rc);
9268 				goto rw_error;
9269 			}
9270 			rc = qam64auto(demod, channel, tuner_freq_offset,
9271 				       &lock_status);
9272 			if (rc != 0) {
9273 				pr_err("error %d\n", rc);
9274 				goto rw_error;
9275 			}
9276 			channel->constellation = DRX_CONSTELLATION_AUTO;
9277 		} else {
9278 			return -EINVAL;
9279 		}
9280 		break;
9281 	default:
9282 		return -EINVAL;
9283 	}
9284 
9285 	return 0;
9286 rw_error:
9287 	/* restore starting value */
9288 	if (auto_flag)
9289 		channel->constellation = DRX_CONSTELLATION_AUTO;
9290 	return rc;
9291 }
9292 
9293 /*============================================================================*/
9294 
9295 /*
9296 * \fn static short get_qamrs_err_count(struct i2c_device_addr *dev_addr)
9297 * \brief Get RS error count in QAM mode (used for post RS BER calculation)
9298 * \return Error code
9299 *
9300 * precondition: measurement period & measurement prescale must be set
9301 *
9302 */
9303 static int
9304 get_qamrs_err_count(struct i2c_device_addr *dev_addr,
9305 		    struct drxjrs_errors *rs_errors)
9306 {
9307 	int rc;
9308 	u16 nr_bit_errors = 0,
9309 	    nr_symbol_errors = 0,
9310 	    nr_packet_errors = 0, nr_failures = 0, nr_snc_par_fail_count = 0;
9311 
9312 	/* check arguments */
9313 	if (dev_addr == NULL)
9314 		return -EINVAL;
9315 
9316 	/* all reported errors are received in the  */
9317 	/* most recently finished measurement period */
9318 	/*   no of pre RS bit errors */
9319 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &nr_bit_errors, 0);
9320 	if (rc != 0) {
9321 		pr_err("error %d\n", rc);
9322 		goto rw_error;
9323 	}
9324 	/*   no of symbol errors      */
9325 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_SYMBOL_ERRORS__A, &nr_symbol_errors, 0);
9326 	if (rc != 0) {
9327 		pr_err("error %d\n", rc);
9328 		goto rw_error;
9329 	}
9330 	/*   no of packet errors      */
9331 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_PACKET_ERRORS__A, &nr_packet_errors, 0);
9332 	if (rc != 0) {
9333 		pr_err("error %d\n", rc);
9334 		goto rw_error;
9335 	}
9336 	/*   no of failures to decode */
9337 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &nr_failures, 0);
9338 	if (rc != 0) {
9339 		pr_err("error %d\n", rc);
9340 		goto rw_error;
9341 	}
9342 	/*   no of post RS bit erros  */
9343 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_COUNT__A, &nr_snc_par_fail_count, 0);
9344 	if (rc != 0) {
9345 		pr_err("error %d\n", rc);
9346 		goto rw_error;
9347 	}
9348 	/* TODO: NOTE */
9349 	/* These register values are fetched in non-atomic fashion           */
9350 	/* It is possible that the read values contain unrelated information */
9351 
9352 	rs_errors->nr_bit_errors = nr_bit_errors & FEC_RS_NR_BIT_ERRORS__M;
9353 	rs_errors->nr_symbol_errors = nr_symbol_errors & FEC_RS_NR_SYMBOL_ERRORS__M;
9354 	rs_errors->nr_packet_errors = nr_packet_errors & FEC_RS_NR_PACKET_ERRORS__M;
9355 	rs_errors->nr_failures = nr_failures & FEC_RS_NR_FAILURES__M;
9356 	rs_errors->nr_snc_par_fail_count =
9357 	    nr_snc_par_fail_count & FEC_OC_SNC_FAIL_COUNT__M;
9358 
9359 	return 0;
9360 rw_error:
9361 	return rc;
9362 }
9363 
9364 /*============================================================================*/
9365 
9366 /*
9367  * \fn int get_sig_strength()
9368  * \brief Retrieve signal strength for VSB and QAM.
9369  * \param demod Pointer to demod instance
9370  * \param u16-t Pointer to signal strength data; range 0, .. , 100.
9371  * \return int.
9372  * \retval 0 sig_strength contains valid data.
9373  * \retval -EINVAL sig_strength is NULL.
9374  * \retval -EIO Erroneous data, sig_strength contains invalid data.
9375  */
9376 #define DRXJ_AGC_TOP    0x2800
9377 #define DRXJ_AGC_SNS    0x1600
9378 #define DRXJ_RFAGC_MAX  0x3fff
9379 #define DRXJ_RFAGC_MIN  0x800
9380 
9381 static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
9382 {
9383 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9384 	int rc;
9385 	u16 rf_gain = 0;
9386 	u16 if_gain = 0;
9387 	u16 if_agc_sns = 0;
9388 	u16 if_agc_top = 0;
9389 	u16 rf_agc_max = 0;
9390 	u16 rf_agc_min = 0;
9391 
9392 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_IF__A, &if_gain, 0);
9393 	if (rc != 0) {
9394 		pr_err("error %d\n", rc);
9395 		goto rw_error;
9396 	}
9397 	if_gain &= IQM_AF_AGC_IF__M;
9398 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_RF__A, &rf_gain, 0);
9399 	if (rc != 0) {
9400 		pr_err("error %d\n", rc);
9401 		goto rw_error;
9402 	}
9403 	rf_gain &= IQM_AF_AGC_RF__M;
9404 
9405 	if_agc_sns = DRXJ_AGC_SNS;
9406 	if_agc_top = DRXJ_AGC_TOP;
9407 	rf_agc_max = DRXJ_RFAGC_MAX;
9408 	rf_agc_min = DRXJ_RFAGC_MIN;
9409 
9410 	if (if_gain > if_agc_top) {
9411 		if (rf_gain > rf_agc_max)
9412 			*sig_strength = 100;
9413 		else if (rf_gain > rf_agc_min) {
9414 			if (rf_agc_max == rf_agc_min) {
9415 				pr_err("error: rf_agc_max == rf_agc_min\n");
9416 				return -EIO;
9417 			}
9418 			*sig_strength =
9419 			75 + 25 * (rf_gain - rf_agc_min) / (rf_agc_max -
9420 								rf_agc_min);
9421 		} else
9422 			*sig_strength = 75;
9423 	} else if (if_gain > if_agc_sns) {
9424 		if (if_agc_top == if_agc_sns) {
9425 			pr_err("error: if_agc_top == if_agc_sns\n");
9426 			return -EIO;
9427 		}
9428 		*sig_strength =
9429 		20 + 55 * (if_gain - if_agc_sns) / (if_agc_top - if_agc_sns);
9430 	} else {
9431 		if (!if_agc_sns) {
9432 			pr_err("error: if_agc_sns is zero!\n");
9433 			return -EIO;
9434 		}
9435 		*sig_strength = (20 * if_gain / if_agc_sns);
9436 	}
9437 
9438 	if (*sig_strength <= 7)
9439 		*sig_strength = 0;
9440 
9441 	return 0;
9442 rw_error:
9443 	return rc;
9444 }
9445 
9446 /*
9447 * \fn int ctrl_get_qam_sig_quality()
9448 * \brief Retrieve QAM signal quality from device.
9449 * \param devmod Pointer to demodulator instance.
9450 * \param sig_quality Pointer to signal quality data.
9451 * \return int.
9452 * \retval 0 sig_quality contains valid data.
9453 * \retval -EINVAL sig_quality is NULL.
9454 * \retval -EIO Erroneous data, sig_quality contains invalid data.
9455 
9456 *  Pre-condition: Device must be started and in lock.
9457 */
9458 static int
9459 ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
9460 {
9461 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9462 	struct drxj_data *ext_attr = demod->my_ext_attr;
9463 	struct drx39xxj_state *state = dev_addr->user_data;
9464 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9465 	struct drxjrs_errors measuredrs_errors = { 0, 0, 0, 0, 0 };
9466 	enum drx_modulation constellation = ext_attr->constellation;
9467 	int rc;
9468 
9469 	u32 pre_bit_err_rs = 0;	/* pre RedSolomon Bit Error Rate */
9470 	u32 post_bit_err_rs = 0;	/* post RedSolomon Bit Error Rate */
9471 	u32 pkt_errs = 0;	/* no of packet errors in RS */
9472 	u16 qam_sl_err_power = 0;	/* accumulated error between raw and sliced symbols */
9473 	u16 qsym_err_vd = 0;	/* quadrature symbol errors in QAM_VD */
9474 	u16 fec_oc_period = 0;	/* SNC sync failure measurement period */
9475 	u16 fec_rs_prescale = 0;	/* ReedSolomon Measurement Prescale */
9476 	u16 fec_rs_period = 0;	/* Value for corresponding I2C register */
9477 	/* calculation constants */
9478 	u32 rs_bit_cnt = 0;	/* RedSolomon Bit Count */
9479 	u32 qam_sl_sig_power = 0;	/* used for MER, depends of QAM constellation */
9480 	/* intermediate results */
9481 	u32 e = 0;		/* exponent value used for QAM BER/SER */
9482 	u32 m = 0;		/* mantisa value used for QAM BER/SER */
9483 	u32 ber_cnt = 0;	/* BER count */
9484 	/* signal quality info */
9485 	u32 qam_sl_mer = 0;	/* QAM MER */
9486 	u32 qam_pre_rs_ber = 0;	/* Pre RedSolomon BER */
9487 	u32 qam_post_rs_ber = 0;	/* Post RedSolomon BER */
9488 	u32 qam_vd_ser = 0;	/* ViterbiDecoder SER */
9489 	u16 qam_vd_prescale = 0;	/* Viterbi Measurement Prescale */
9490 	u16 qam_vd_period = 0;	/* Viterbi Measurement period */
9491 	u32 vd_bit_cnt = 0;	/* ViterbiDecoder Bit Count */
9492 
9493 	p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9494 
9495 	/* read the physical registers */
9496 	/*   Get the RS error data */
9497 	rc = get_qamrs_err_count(dev_addr, &measuredrs_errors);
9498 	if (rc != 0) {
9499 		pr_err("error %d\n", rc);
9500 		goto rw_error;
9501 	}
9502 	/* get the register value needed for MER */
9503 	rc = drxj_dap_read_reg16(dev_addr, QAM_SL_ERR_POWER__A, &qam_sl_err_power, 0);
9504 	if (rc != 0) {
9505 		pr_err("error %d\n", rc);
9506 		goto rw_error;
9507 	}
9508 	/* get the register value needed for post RS BER */
9509 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, &fec_oc_period, 0);
9510 	if (rc != 0) {
9511 		pr_err("error %d\n", rc);
9512 		goto rw_error;
9513 	}
9514 
9515 	/* get constants needed for signal quality calculation */
9516 	fec_rs_period = ext_attr->fec_rs_period;
9517 	fec_rs_prescale = ext_attr->fec_rs_prescale;
9518 	rs_bit_cnt = fec_rs_period * fec_rs_prescale * ext_attr->fec_rs_plen;
9519 	qam_vd_period = ext_attr->qam_vd_period;
9520 	qam_vd_prescale = ext_attr->qam_vd_prescale;
9521 	vd_bit_cnt = qam_vd_period * qam_vd_prescale * ext_attr->fec_vd_plen;
9522 
9523 	/* DRXJ_QAM_SL_SIG_POWER_QAMxxx  * 4     */
9524 	switch (constellation) {
9525 	case DRX_CONSTELLATION_QAM16:
9526 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM16 << 2;
9527 		break;
9528 	case DRX_CONSTELLATION_QAM32:
9529 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM32 << 2;
9530 		break;
9531 	case DRX_CONSTELLATION_QAM64:
9532 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM64 << 2;
9533 		break;
9534 	case DRX_CONSTELLATION_QAM128:
9535 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM128 << 2;
9536 		break;
9537 	case DRX_CONSTELLATION_QAM256:
9538 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM256 << 2;
9539 		break;
9540 	default:
9541 		return -EIO;
9542 	}
9543 
9544 	/* ------------------------------ */
9545 	/* MER Calculation                */
9546 	/* ------------------------------ */
9547 	/* MER is good if it is above 27.5 for QAM256 or 21.5 for QAM64 */
9548 
9549 	/* 10.0*log10(qam_sl_sig_power * 4.0 / qam_sl_err_power); */
9550 	if (qam_sl_err_power == 0)
9551 		qam_sl_mer = 0;
9552 	else
9553 		qam_sl_mer = log1_times100(qam_sl_sig_power) - log1_times100((u32)qam_sl_err_power);
9554 
9555 	/* ----------------------------------------- */
9556 	/* Pre Viterbi Symbol Error Rate Calculation */
9557 	/* ----------------------------------------- */
9558 	/* pre viterbi SER is good if it is below 0.025 */
9559 
9560 	/* get the register value */
9561 	/*   no of quadrature symbol errors */
9562 	rc = drxj_dap_read_reg16(dev_addr, QAM_VD_NR_QSYM_ERRORS__A, &qsym_err_vd, 0);
9563 	if (rc != 0) {
9564 		pr_err("error %d\n", rc);
9565 		goto rw_error;
9566 	}
9567 	/* Extract the Exponent and the Mantisa  */
9568 	/* of number of quadrature symbol errors */
9569 	e = (qsym_err_vd & QAM_VD_NR_QSYM_ERRORS_EXP__M) >>
9570 	    QAM_VD_NR_QSYM_ERRORS_EXP__B;
9571 	m = (qsym_err_vd & QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__M) >>
9572 	    QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B;
9573 
9574 	if ((m << e) >> 3 > 549752)
9575 		qam_vd_ser = 500000 * vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9576 	else
9577 		qam_vd_ser = m << ((e > 2) ? (e - 3) : e);
9578 
9579 	/* --------------------------------------- */
9580 	/* pre and post RedSolomon BER Calculation */
9581 	/* --------------------------------------- */
9582 	/* pre RS BER is good if it is below 3.5e-4 */
9583 
9584 	/* get the register values */
9585 	pre_bit_err_rs = (u32) measuredrs_errors.nr_bit_errors;
9586 	pkt_errs = post_bit_err_rs = (u32) measuredrs_errors.nr_snc_par_fail_count;
9587 
9588 	/* Extract the Exponent and the Mantisa of the */
9589 	/* pre Reed-Solomon bit error count            */
9590 	e = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_EXP__M) >>
9591 	    FEC_RS_NR_BIT_ERRORS_EXP__B;
9592 	m = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M) >>
9593 	    FEC_RS_NR_BIT_ERRORS_FIXED_MANT__B;
9594 
9595 	ber_cnt = m << e;
9596 
9597 	/*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */
9598 	if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0)
9599 		qam_pre_rs_ber = 500000 * rs_bit_cnt >> e;
9600 	else
9601 		qam_pre_rs_ber = ber_cnt;
9602 
9603 	/* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) /  */
9604 	/*               (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A)  */
9605 	/*
9606 	   => c = (1000000*100*11.17)/1504 =
9607 	   post RS BER = (( c* FEC_OC_SNC_FAIL_COUNT__A) /
9608 	   (100 * FEC_OC_SNC_FAIL_PERIOD__A)
9609 	   *100 and /100 is for more precision.
9610 	   => (20 bits * 12 bits) /(16 bits * 7 bits)  => safe in 32 bits computation
9611 
9612 	   Precision errors still possible.
9613 	 */
9614 	if (!fec_oc_period) {
9615 		qam_post_rs_ber = 0xFFFFFFFF;
9616 	} else {
9617 		e = post_bit_err_rs * 742686;
9618 		m = fec_oc_period * 100;
9619 		qam_post_rs_ber = e / m;
9620 	}
9621 
9622 	/* fill signal quality data structure */
9623 	p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9624 	p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9625 	p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9626 	p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9627 	p->block_error.stat[0].scale = FE_SCALE_COUNTER;
9628 	p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
9629 
9630 	p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100;
9631 	if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9632 		p->pre_bit_error.stat[0].uvalue += qam_vd_ser;
9633 		p->pre_bit_count.stat[0].uvalue += vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9634 	} else {
9635 		p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber;
9636 		p->pre_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9637 	}
9638 
9639 	p->post_bit_error.stat[0].uvalue += qam_post_rs_ber;
9640 	p->post_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9641 
9642 	p->block_error.stat[0].uvalue += pkt_errs;
9643 
9644 #ifdef DRXJ_SIGNAL_ACCUM_ERR
9645 	rc = get_acc_pkt_err(demod, &sig_quality->packet_error);
9646 	if (rc != 0) {
9647 		pr_err("error %d\n", rc);
9648 		goto rw_error;
9649 	}
9650 #endif
9651 
9652 	return 0;
9653 rw_error:
9654 	p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9655 	p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9656 	p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9657 	p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9658 	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9659 	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9660 
9661 	return rc;
9662 }
9663 
9664 #endif /* #ifndef DRXJ_VSB_ONLY */
9665 
9666 /*============================================================================*/
9667 /*==                     END QAM DATAPATH FUNCTIONS                         ==*/
9668 /*============================================================================*/
9669 
9670 /*============================================================================*/
9671 /*============================================================================*/
9672 /*==                       ATV DATAPATH FUNCTIONS                           ==*/
9673 /*============================================================================*/
9674 /*============================================================================*/
9675 
9676 /*
9677    Implementation notes.
9678 
9679    NTSC/FM AGCs
9680 
9681       Four AGCs are used for NTSC:
9682       (1) RF (used to attenuate the input signal in case of to much power)
9683       (2) IF (used to attenuate the input signal in case of to much power)
9684       (3) Video AGC (used to amplify the output signal in case input to low)
9685       (4) SIF AGC (used to amplify the output signal in case input to low)
9686 
9687       Video AGC is coupled to RF and IF. SIF AGC is not coupled. It is assumed
9688       that the coupling between Video AGC and the RF and IF AGCs also works in
9689       favor of the SIF AGC.
9690 
9691       Three AGCs are used for FM:
9692       (1) RF (used to attenuate the input signal in case of to much power)
9693       (2) IF (used to attenuate the input signal in case of to much power)
9694       (3) SIF AGC (used to amplify the output signal in case input to low)
9695 
9696       The SIF AGC is now coupled to the RF/IF AGCs.
9697       The SIF AGC is needed for both SIF output and the internal SIF signal to
9698       the AUD block.
9699 
9700       RF and IF AGCs DACs are part of AFE, Video and SIF AGC DACs are part of
9701       the ATV block. The AGC control algorithms are all implemented in
9702       microcode.
9703 
9704    ATV SETTINGS
9705 
9706       (Shadow settings will not be used for now, they will be implemented
9707        later on because of the schedule)
9708 
9709       Several HW/SCU "settings" can be used for ATV. The standard selection
9710       will reset most of these settings. To avoid that the end user application
9711       has to perform these settings each time the ATV or FM standards is
9712       selected the driver will shadow these settings. This enables the end user
9713       to perform the settings only once after a drx_open(). The driver must
9714       write the shadow settings to HW/SCU in case:
9715 	 ( setstandard FM/ATV) ||
9716 	 ( settings have changed && FM/ATV standard is active)
9717       The shadow settings will be stored in the device specific data container.
9718       A set of flags will be defined to flag changes in shadow settings.
9719       A routine will be implemented to write all changed shadow settings to
9720       HW/SCU.
9721 
9722       The "settings" will consist of: AGC settings, filter settings etc.
9723 
9724       Disadvantage of use of shadow settings:
9725       Direct changes in HW/SCU registers will not be reflected in the
9726       shadow settings and these changes will be overwritten during a next
9727       update. This can happen during evaluation. This will not be a problem
9728       for normal customer usage.
9729 */
9730 /* -------------------------------------------------------------------------- */
9731 
9732 /*
9733 * \fn int power_down_atv ()
9734 * \brief Power down ATV.
9735 * \param demod instance of demodulator
9736 * \param standard either NTSC or FM (sub strandard for ATV )
9737 * \return int.
9738 *
9739 *  Stops and thus resets ATV and IQM block
9740 *  SIF and CVBS ADC are powered down
9741 *  Calls audio power down
9742 */
9743 static int
9744 power_down_atv(struct drx_demod_instance *demod, enum drx_standard standard, bool primary)
9745 {
9746 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9747 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
9748 		/* parameter_len */ 0,
9749 		/* result_len    */ 0,
9750 		/* *parameter   */ NULL,
9751 		/* *result      */ NULL
9752 	};
9753 	int rc;
9754 	u16 cmd_result = 0;
9755 
9756 	/* ATV NTSC */
9757 
9758 	/* Stop ATV SCU (will reset ATV and IQM hardware */
9759 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_ATV |
9760 	    SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9761 	cmd_scu.parameter_len = 0;
9762 	cmd_scu.result_len = 1;
9763 	cmd_scu.parameter = NULL;
9764 	cmd_scu.result = &cmd_result;
9765 	rc = scu_command(dev_addr, &cmd_scu);
9766 	if (rc != 0) {
9767 		pr_err("error %d\n", rc);
9768 		goto rw_error;
9769 	}
9770 	/* Disable ATV outputs (ATV reset enables CVBS, undo this) */
9771 	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);
9772 	if (rc != 0) {
9773 		pr_err("error %d\n", rc);
9774 		goto rw_error;
9775 	}
9776 
9777 	rc = drxj_dap_write_reg16(dev_addr, ATV_COMM_EXEC__A, ATV_COMM_EXEC_STOP, 0);
9778 	if (rc != 0) {
9779 		pr_err("error %d\n", rc);
9780 		goto rw_error;
9781 	}
9782 	if (primary) {
9783 		rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
9784 		if (rc != 0) {
9785 			pr_err("error %d\n", rc);
9786 			goto rw_error;
9787 		}
9788 		rc = set_iqm_af(demod, false);
9789 		if (rc != 0) {
9790 			pr_err("error %d\n", rc);
9791 			goto rw_error;
9792 		}
9793 	} else {
9794 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
9795 		if (rc != 0) {
9796 			pr_err("error %d\n", rc);
9797 			goto rw_error;
9798 		}
9799 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
9800 		if (rc != 0) {
9801 			pr_err("error %d\n", rc);
9802 			goto rw_error;
9803 		}
9804 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
9805 		if (rc != 0) {
9806 			pr_err("error %d\n", rc);
9807 			goto rw_error;
9808 		}
9809 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
9810 		if (rc != 0) {
9811 			pr_err("error %d\n", rc);
9812 			goto rw_error;
9813 		}
9814 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
9815 		if (rc != 0) {
9816 			pr_err("error %d\n", rc);
9817 			goto rw_error;
9818 		}
9819 	}
9820 	rc = power_down_aud(demod);
9821 	if (rc != 0) {
9822 		pr_err("error %d\n", rc);
9823 		goto rw_error;
9824 	}
9825 
9826 	return 0;
9827 rw_error:
9828 	return rc;
9829 }
9830 
9831 /*============================================================================*/
9832 
9833 /*
9834 * \brief Power up AUD.
9835 * \param demod instance of demodulator
9836 * \return int.
9837 *
9838 */
9839 static int power_down_aud(struct drx_demod_instance *demod)
9840 {
9841 	struct i2c_device_addr *dev_addr = NULL;
9842 	struct drxj_data *ext_attr = NULL;
9843 	int rc;
9844 
9845 	dev_addr = (struct i2c_device_addr *)demod->my_i2c_dev_addr;
9846 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
9847 
9848 	rc = drxj_dap_write_reg16(dev_addr, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP, 0);
9849 	if (rc != 0) {
9850 		pr_err("error %d\n", rc);
9851 		goto rw_error;
9852 	}
9853 
9854 	ext_attr->aud_data.audio_is_active = false;
9855 
9856 	return 0;
9857 rw_error:
9858 	return rc;
9859 }
9860 
9861 /*
9862 * \fn int set_orx_nsu_aox()
9863 * \brief Configure OrxNsuAox for OOB
9864 * \param demod instance of demodulator.
9865 * \param active
9866 * \return int.
9867 */
9868 static int set_orx_nsu_aox(struct drx_demod_instance *demod, bool active)
9869 {
9870 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9871 	int rc;
9872 	u16 data = 0;
9873 
9874 	/* Configure NSU_AOX */
9875 	rc = drxj_dap_read_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, &data, 0);
9876 	if (rc != 0) {
9877 		pr_err("error %d\n", rc);
9878 		goto rw_error;
9879 	}
9880 	if (!active)
9881 		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));
9882 	else
9883 		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);
9884 	rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, data, 0);
9885 	if (rc != 0) {
9886 		pr_err("error %d\n", rc);
9887 		goto rw_error;
9888 	}
9889 
9890 	return 0;
9891 rw_error:
9892 	return rc;
9893 }
9894 
9895 /*
9896 * \fn int ctrl_set_oob()
9897 * \brief Set OOB channel to be used.
9898 * \param demod instance of demodulator
9899 * \param oob_param OOB parameters for channel setting.
9900 * \frequency should be in KHz
9901 * \return int.
9902 *
9903 * Accepts  only. Returns error otherwise.
9904 * Demapper value is written after scu_command START
9905 * because START command causes COMM_EXEC transition
9906 * from 0 to 1 which causes all registers to be
9907 * overwritten with initial value
9908 *
9909 */
9910 
9911 /* Nyquist filter impulse response */
9912 #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 */
9913 #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 */
9914 #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) */
9915 
9916 /* Coefficients for the nyquist filter (total: 27 taps) */
9917 #define NYQFILTERLEN 27
9918 
9919 static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_param)
9920 {
9921 	int rc;
9922 	s32 freq = 0;	/* KHz */
9923 	struct i2c_device_addr *dev_addr = NULL;
9924 	struct drxj_data *ext_attr = NULL;
9925 	u16 i = 0;
9926 	bool mirror_freq_spect_oob = false;
9927 	u16 trk_filter_value = 0;
9928 	struct drxjscu_cmd scu_cmd;
9929 	u16 set_param_parameters[3];
9930 	u16 cmd_result[2] = { 0, 0 };
9931 	s16 nyquist_coeffs[4][(NYQFILTERLEN + 1) / 2] = {
9932 		IMPULSE_COSINE_ALPHA_0_3,	/* Target Mode 0 */
9933 		IMPULSE_COSINE_ALPHA_0_3,	/* Target Mode 1 */
9934 		IMPULSE_COSINE_ALPHA_0_5,	/* Target Mode 2 */
9935 		IMPULSE_COSINE_ALPHA_RO_0_5	/* Target Mode 3 */
9936 	};
9937 	u8 mode_val[4] = { 2, 2, 0, 1 };
9938 	u8 pfi_coeffs[4][6] = {
9939 		{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) */
9940 		{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) */
9941 		{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) */
9942 		{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) */
9943 	};
9944 	u16 mode_index;
9945 
9946 	dev_addr = demod->my_i2c_dev_addr;
9947 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
9948 	mirror_freq_spect_oob = ext_attr->mirror_freq_spect_oob;
9949 
9950 	/* Check parameters */
9951 	if (oob_param == NULL) {
9952 		/* power off oob module  */
9953 		scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
9954 		    | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9955 		scu_cmd.parameter_len = 0;
9956 		scu_cmd.result_len = 1;
9957 		scu_cmd.result = cmd_result;
9958 		rc = scu_command(dev_addr, &scu_cmd);
9959 		if (rc != 0) {
9960 			pr_err("error %d\n", rc);
9961 			goto rw_error;
9962 		}
9963 		rc = set_orx_nsu_aox(demod, false);
9964 		if (rc != 0) {
9965 			pr_err("error %d\n", rc);
9966 			goto rw_error;
9967 		}
9968 		rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
9969 		if (rc != 0) {
9970 			pr_err("error %d\n", rc);
9971 			goto rw_error;
9972 		}
9973 
9974 		ext_attr->oob_power_on = false;
9975 		return 0;
9976 	}
9977 
9978 	freq = oob_param->frequency;
9979 	if ((freq < 70000) || (freq > 130000))
9980 		return -EIO;
9981 	freq = (freq - 50000) / 50;
9982 
9983 	{
9984 		u16 index = 0;
9985 		u16 remainder = 0;
9986 		u16 *trk_filtercfg = ext_attr->oob_trk_filter_cfg;
9987 
9988 		index = (u16) ((freq - 400) / 200);
9989 		remainder = (u16) ((freq - 400) % 200);
9990 		trk_filter_value =
9991 		    trk_filtercfg[index] - (trk_filtercfg[index] -
9992 					   trk_filtercfg[index +
9993 							1]) / 10 * remainder /
9994 		    20;
9995 	}
9996 
9997    /********/
9998 	/* Stop  */
9999    /********/
10000 	rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
10001 	if (rc != 0) {
10002 		pr_err("error %d\n", rc);
10003 		goto rw_error;
10004 	}
10005 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10006 	    | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
10007 	scu_cmd.parameter_len = 0;
10008 	scu_cmd.result_len = 1;
10009 	scu_cmd.result = cmd_result;
10010 	rc = scu_command(dev_addr, &scu_cmd);
10011 	if (rc != 0) {
10012 		pr_err("error %d\n", rc);
10013 		goto rw_error;
10014 	}
10015    /********/
10016 	/* Reset */
10017    /********/
10018 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10019 	    | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
10020 	scu_cmd.parameter_len = 0;
10021 	scu_cmd.result_len = 1;
10022 	scu_cmd.result = cmd_result;
10023 	rc = scu_command(dev_addr, &scu_cmd);
10024 	if (rc != 0) {
10025 		pr_err("error %d\n", rc);
10026 		goto rw_error;
10027 	}
10028    /**********/
10029 	/* SET_ENV */
10030    /**********/
10031 	/* set frequency, spectrum inversion and data rate */
10032 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10033 	    | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
10034 	scu_cmd.parameter_len = 3;
10035 	/* 1-data rate;2-frequency */
10036 	switch (oob_param->standard) {
10037 	case DRX_OOB_MODE_A:
10038 		if (
10039 			   /* signal is transmitted inverted */
10040 			   ((oob_param->spectrum_inverted == true) &&
10041 			    /* and tuner is not mirroring the signal */
10042 			    (!mirror_freq_spect_oob)) |
10043 			   /* or */
10044 			   /* signal is transmitted noninverted */
10045 			   ((oob_param->spectrum_inverted == false) &&
10046 			    /* and tuner is mirroring the signal */
10047 			    (mirror_freq_spect_oob))
10048 		    )
10049 			set_param_parameters[0] =
10050 			    SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_INVSPEC;
10051 		else
10052 			set_param_parameters[0] =
10053 			    SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_REGSPEC;
10054 		break;
10055 	case DRX_OOB_MODE_B_GRADE_A:
10056 		if (
10057 			   /* signal is transmitted inverted */
10058 			   ((oob_param->spectrum_inverted == true) &&
10059 			    /* and tuner is not mirroring the signal */
10060 			    (!mirror_freq_spect_oob)) |
10061 			   /* or */
10062 			   /* signal is transmitted noninverted */
10063 			   ((oob_param->spectrum_inverted == false) &&
10064 			    /* and tuner is mirroring the signal */
10065 			    (mirror_freq_spect_oob))
10066 		    )
10067 			set_param_parameters[0] =
10068 			    SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_INVSPEC;
10069 		else
10070 			set_param_parameters[0] =
10071 			    SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_REGSPEC;
10072 		break;
10073 	case DRX_OOB_MODE_B_GRADE_B:
10074 	default:
10075 		if (
10076 			   /* signal is transmitted inverted */
10077 			   ((oob_param->spectrum_inverted == true) &&
10078 			    /* and tuner is not mirroring the signal */
10079 			    (!mirror_freq_spect_oob)) |
10080 			   /* or */
10081 			   /* signal is transmitted noninverted */
10082 			   ((oob_param->spectrum_inverted == false) &&
10083 			    /* and tuner is mirroring the signal */
10084 			    (mirror_freq_spect_oob))
10085 		    )
10086 			set_param_parameters[0] =
10087 			    SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_INVSPEC;
10088 		else
10089 			set_param_parameters[0] =
10090 			    SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_REGSPEC;
10091 		break;
10092 	}
10093 	set_param_parameters[1] = (u16) (freq & 0xFFFF);
10094 	set_param_parameters[2] = trk_filter_value;
10095 	scu_cmd.parameter = set_param_parameters;
10096 	scu_cmd.result_len = 1;
10097 	scu_cmd.result = cmd_result;
10098 	mode_index = mode_val[(set_param_parameters[0] & 0xC0) >> 6];
10099 	rc = scu_command(dev_addr, &scu_cmd);
10100 	if (rc != 0) {
10101 		pr_err("error %d\n", rc);
10102 		goto rw_error;
10103 	}
10104 
10105 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
10106 	if (rc != 0) {
10107 		pr_err("error %d\n", rc);
10108 		goto rw_error;
10109 	}	/*  Write magic word to enable pdr reg write  */
10110 	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);
10111 	if (rc != 0) {
10112 		pr_err("error %d\n", rc);
10113 		goto rw_error;
10114 	}
10115 	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);
10116 	if (rc != 0) {
10117 		pr_err("error %d\n", rc);
10118 		goto rw_error;
10119 	}
10120 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
10121 	if (rc != 0) {
10122 		pr_err("error %d\n", rc);
10123 		goto rw_error;
10124 	}	/*  Write magic word to disable pdr reg write */
10125 
10126 	rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_COMM_KEY__A, 0, 0);
10127 	if (rc != 0) {
10128 		pr_err("error %d\n", rc);
10129 		goto rw_error;
10130 	}
10131 	rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_LEN_W__A, 16000, 0);
10132 	if (rc != 0) {
10133 		pr_err("error %d\n", rc);
10134 		goto rw_error;
10135 	}
10136 	rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_THR_W__A, 40, 0);
10137 	if (rc != 0) {
10138 		pr_err("error %d\n", rc);
10139 		goto rw_error;
10140 	}
10141 
10142 	/* ddc */
10143 	rc = drxj_dap_write_reg16(dev_addr, ORX_DDC_OFO_SET_W__A, ORX_DDC_OFO_SET_W__PRE, 0);
10144 	if (rc != 0) {
10145 		pr_err("error %d\n", rc);
10146 		goto rw_error;
10147 	}
10148 
10149 	/* nsu */
10150 	rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_LOPOW_W__A, ext_attr->oob_lo_pow, 0);
10151 	if (rc != 0) {
10152 		pr_err("error %d\n", rc);
10153 		goto rw_error;
10154 	}
10155 
10156 	/* initialization for target mode */
10157 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TARGET_MODE__A, SCU_RAM_ORX_TARGET_MODE_2048KBPS_SQRT, 0);
10158 	if (rc != 0) {
10159 		pr_err("error %d\n", rc);
10160 		goto rw_error;
10161 	}
10162 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FREQ_GAIN_CORR__A, SCU_RAM_ORX_FREQ_GAIN_CORR_2048KBPS, 0);
10163 	if (rc != 0) {
10164 		pr_err("error %d\n", rc);
10165 		goto rw_error;
10166 	}
10167 
10168 	/* Reset bits for timing and freq. recovery */
10169 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CPH__A, 0x0001, 0);
10170 	if (rc != 0) {
10171 		pr_err("error %d\n", rc);
10172 		goto rw_error;
10173 	}
10174 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CTI__A, 0x0002, 0);
10175 	if (rc != 0) {
10176 		pr_err("error %d\n", rc);
10177 		goto rw_error;
10178 	}
10179 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRN__A, 0x0004, 0);
10180 	if (rc != 0) {
10181 		pr_err("error %d\n", rc);
10182 		goto rw_error;
10183 	}
10184 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRP__A, 0x0008, 0);
10185 	if (rc != 0) {
10186 		pr_err("error %d\n", rc);
10187 		goto rw_error;
10188 	}
10189 
10190 	/* AGN_LOCK = {2048>>3, -2048, 8, -8, 0, 1}; */
10191 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TH__A, 2048 >> 3, 0);
10192 	if (rc != 0) {
10193 		pr_err("error %d\n", rc);
10194 		goto rw_error;
10195 	}
10196 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TOTH__A, (u16)(-2048), 0);
10197 	if (rc != 0) {
10198 		pr_err("error %d\n", rc);
10199 		goto rw_error;
10200 	}
10201 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_ONLOCK_TTH__A, 8, 0);
10202 	if (rc != 0) {
10203 		pr_err("error %d\n", rc);
10204 		goto rw_error;
10205 	}
10206 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_UNLOCK_TTH__A, (u16)(-8), 0);
10207 	if (rc != 0) {
10208 		pr_err("error %d\n", rc);
10209 		goto rw_error;
10210 	}
10211 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_MASK__A, 1, 0);
10212 	if (rc != 0) {
10213 		pr_err("error %d\n", rc);
10214 		goto rw_error;
10215 	}
10216 
10217 	/* DGN_LOCK = {10, -2048, 8, -8, 0, 1<<1}; */
10218 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TH__A, 10, 0);
10219 	if (rc != 0) {
10220 		pr_err("error %d\n", rc);
10221 		goto rw_error;
10222 	}
10223 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TOTH__A, (u16)(-2048), 0);
10224 	if (rc != 0) {
10225 		pr_err("error %d\n", rc);
10226 		goto rw_error;
10227 	}
10228 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_ONLOCK_TTH__A, 8, 0);
10229 	if (rc != 0) {
10230 		pr_err("error %d\n", rc);
10231 		goto rw_error;
10232 	}
10233 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_UNLOCK_TTH__A, (u16)(-8), 0);
10234 	if (rc != 0) {
10235 		pr_err("error %d\n", rc);
10236 		goto rw_error;
10237 	}
10238 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_MASK__A, 1 << 1, 0);
10239 	if (rc != 0) {
10240 		pr_err("error %d\n", rc);
10241 		goto rw_error;
10242 	}
10243 
10244 	/* FRQ_LOCK = {15,-2048, 8, -8, 0, 1<<2}; */
10245 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TH__A, 17, 0);
10246 	if (rc != 0) {
10247 		pr_err("error %d\n", rc);
10248 		goto rw_error;
10249 	}
10250 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TOTH__A, (u16)(-2048), 0);
10251 	if (rc != 0) {
10252 		pr_err("error %d\n", rc);
10253 		goto rw_error;
10254 	}
10255 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_ONLOCK_TTH__A, 8, 0);
10256 	if (rc != 0) {
10257 		pr_err("error %d\n", rc);
10258 		goto rw_error;
10259 	}
10260 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_UNLOCK_TTH__A, (u16)(-8), 0);
10261 	if (rc != 0) {
10262 		pr_err("error %d\n", rc);
10263 		goto rw_error;
10264 	}
10265 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_MASK__A, 1 << 2, 0);
10266 	if (rc != 0) {
10267 		pr_err("error %d\n", rc);
10268 		goto rw_error;
10269 	}
10270 
10271 	/* PHA_LOCK = {5000, -2048, 8, -8, 0, 1<<3}; */
10272 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TH__A, 3000, 0);
10273 	if (rc != 0) {
10274 		pr_err("error %d\n", rc);
10275 		goto rw_error;
10276 	}
10277 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TOTH__A, (u16)(-2048), 0);
10278 	if (rc != 0) {
10279 		pr_err("error %d\n", rc);
10280 		goto rw_error;
10281 	}
10282 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_ONLOCK_TTH__A, 8, 0);
10283 	if (rc != 0) {
10284 		pr_err("error %d\n", rc);
10285 		goto rw_error;
10286 	}
10287 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_UNLOCK_TTH__A, (u16)(-8), 0);
10288 	if (rc != 0) {
10289 		pr_err("error %d\n", rc);
10290 		goto rw_error;
10291 	}
10292 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_MASK__A, 1 << 3, 0);
10293 	if (rc != 0) {
10294 		pr_err("error %d\n", rc);
10295 		goto rw_error;
10296 	}
10297 
10298 	/* TIM_LOCK = {300,      -2048, 8, -8, 0, 1<<4}; */
10299 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TH__A, 400, 0);
10300 	if (rc != 0) {
10301 		pr_err("error %d\n", rc);
10302 		goto rw_error;
10303 	}
10304 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TOTH__A, (u16)(-2048), 0);
10305 	if (rc != 0) {
10306 		pr_err("error %d\n", rc);
10307 		goto rw_error;
10308 	}
10309 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_ONLOCK_TTH__A, 8, 0);
10310 	if (rc != 0) {
10311 		pr_err("error %d\n", rc);
10312 		goto rw_error;
10313 	}
10314 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_UNLOCK_TTH__A, (u16)(-8), 0);
10315 	if (rc != 0) {
10316 		pr_err("error %d\n", rc);
10317 		goto rw_error;
10318 	}
10319 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_MASK__A, 1 << 4, 0);
10320 	if (rc != 0) {
10321 		pr_err("error %d\n", rc);
10322 		goto rw_error;
10323 	}
10324 
10325 	/* EQU_LOCK = {20,      -2048, 8, -8, 0, 1<<5}; */
10326 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TH__A, 20, 0);
10327 	if (rc != 0) {
10328 		pr_err("error %d\n", rc);
10329 		goto rw_error;
10330 	}
10331 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TOTH__A, (u16)(-2048), 0);
10332 	if (rc != 0) {
10333 		pr_err("error %d\n", rc);
10334 		goto rw_error;
10335 	}
10336 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_ONLOCK_TTH__A, 4, 0);
10337 	if (rc != 0) {
10338 		pr_err("error %d\n", rc);
10339 		goto rw_error;
10340 	}
10341 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_UNLOCK_TTH__A, (u16)(-4), 0);
10342 	if (rc != 0) {
10343 		pr_err("error %d\n", rc);
10344 		goto rw_error;
10345 	}
10346 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_MASK__A, 1 << 5, 0);
10347 	if (rc != 0) {
10348 		pr_err("error %d\n", rc);
10349 		goto rw_error;
10350 	}
10351 
10352 	/* PRE-Filter coefficients (PFI) */
10353 	rc = drxdap_fasi_write_block(dev_addr, ORX_FWP_PFI_A_W__A, sizeof(pfi_coeffs[mode_index]), ((u8 *)pfi_coeffs[mode_index]), 0);
10354 	if (rc != 0) {
10355 		pr_err("error %d\n", rc);
10356 		goto rw_error;
10357 	}
10358 	rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_MDE_W__A, mode_index, 0);
10359 	if (rc != 0) {
10360 		pr_err("error %d\n", rc);
10361 		goto rw_error;
10362 	}
10363 
10364 	/* NYQUIST-Filter coefficients (NYQ) */
10365 	for (i = 0; i < (NYQFILTERLEN + 1) / 2; i++) {
10366 		rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, i, 0);
10367 		if (rc != 0) {
10368 			pr_err("error %d\n", rc);
10369 			goto rw_error;
10370 		}
10371 		rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_COF_RW__A, nyquist_coeffs[mode_index][i], 0);
10372 		if (rc != 0) {
10373 			pr_err("error %d\n", rc);
10374 			goto rw_error;
10375 		}
10376 	}
10377 	rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, 31, 0);
10378 	if (rc != 0) {
10379 		pr_err("error %d\n", rc);
10380 		goto rw_error;
10381 	}
10382 	rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_ACTIVE, 0);
10383 	if (rc != 0) {
10384 		pr_err("error %d\n", rc);
10385 		goto rw_error;
10386 	}
10387 	/********/
10388 	/* Start */
10389 	/********/
10390 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10391 	    | SCU_RAM_COMMAND_CMD_DEMOD_START;
10392 	scu_cmd.parameter_len = 0;
10393 	scu_cmd.result_len = 1;
10394 	scu_cmd.result = cmd_result;
10395 	rc = scu_command(dev_addr, &scu_cmd);
10396 	if (rc != 0) {
10397 		pr_err("error %d\n", rc);
10398 		goto rw_error;
10399 	}
10400 
10401 	rc = set_orx_nsu_aox(demod, true);
10402 	if (rc != 0) {
10403 		pr_err("error %d\n", rc);
10404 		goto rw_error;
10405 	}
10406 	rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STHR_W__A, ext_attr->oob_pre_saw, 0);
10407 	if (rc != 0) {
10408 		pr_err("error %d\n", rc);
10409 		goto rw_error;
10410 	}
10411 
10412 	ext_attr->oob_power_on = true;
10413 
10414 	return 0;
10415 rw_error:
10416 	return rc;
10417 }
10418 
10419 /*============================================================================*/
10420 /*==                     END OOB DATAPATH FUNCTIONS                         ==*/
10421 /*============================================================================*/
10422 
10423 /*=============================================================================
10424   ===== MC command related functions ==========================================
10425   ===========================================================================*/
10426 
10427 /*=============================================================================
10428   ===== ctrl_set_channel() ==========================================================
10429   ===========================================================================*/
10430 /*
10431 * \fn int ctrl_set_channel()
10432 * \brief Select a new transmission channel.
10433 * \param demod instance of demod.
10434 * \param channel Pointer to channel data.
10435 * \return int.
10436 *
10437 * In case the tuner module is not used and in case of NTSC/FM the pogrammer
10438 * must tune the tuner to the centre frequency of the NTSC/FM channel.
10439 *
10440 */
10441 static int
10442 ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel)
10443 {
10444 	int rc;
10445 	s32 tuner_freq_offset = 0;
10446 	struct drxj_data *ext_attr = NULL;
10447 	struct i2c_device_addr *dev_addr = NULL;
10448 	enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10449 #ifndef DRXJ_VSB_ONLY
10450 	u32 min_symbol_rate = 0;
10451 	u32 max_symbol_rate = 0;
10452 	int bandwidth_temp = 0;
10453 	int bandwidth = 0;
10454 #endif
10455    /*== check arguments ======================================================*/
10456 	if ((demod == NULL) || (channel == NULL))
10457 		return -EINVAL;
10458 
10459 	dev_addr = demod->my_i2c_dev_addr;
10460 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
10461 	standard = ext_attr->standard;
10462 
10463 	/* check valid standards */
10464 	switch (standard) {
10465 	case DRX_STANDARD_8VSB:
10466 #ifndef DRXJ_VSB_ONLY
10467 	case DRX_STANDARD_ITU_A:
10468 	case DRX_STANDARD_ITU_B:
10469 	case DRX_STANDARD_ITU_C:
10470 #endif /* DRXJ_VSB_ONLY */
10471 		break;
10472 	case DRX_STANDARD_UNKNOWN:
10473 	default:
10474 		return -EINVAL;
10475 	}
10476 
10477 	/* check bandwidth QAM annex B, NTSC and 8VSB */
10478 	if ((standard == DRX_STANDARD_ITU_B) ||
10479 	    (standard == DRX_STANDARD_8VSB) ||
10480 	    (standard == DRX_STANDARD_NTSC)) {
10481 		switch (channel->bandwidth) {
10482 		case DRX_BANDWIDTH_6MHZ:
10483 		case DRX_BANDWIDTH_UNKNOWN:
10484 			channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10485 			break;
10486 		case DRX_BANDWIDTH_8MHZ:
10487 		case DRX_BANDWIDTH_7MHZ:
10488 		default:
10489 			return -EINVAL;
10490 		}
10491 	}
10492 
10493 	/* For QAM annex A and annex C:
10494 	   -check symbolrate and constellation
10495 	   -derive bandwidth from symbolrate (input bandwidth is ignored)
10496 	 */
10497 #ifndef DRXJ_VSB_ONLY
10498 	if ((standard == DRX_STANDARD_ITU_A) ||
10499 	    (standard == DRX_STANDARD_ITU_C)) {
10500 		struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SAW };
10501 		int bw_rolloff_factor = 0;
10502 
10503 		bw_rolloff_factor = (standard == DRX_STANDARD_ITU_A) ? 115 : 113;
10504 		min_symbol_rate = DRXJ_QAM_SYMBOLRATE_MIN;
10505 		max_symbol_rate = DRXJ_QAM_SYMBOLRATE_MAX;
10506 		/* config SMA_TX pin to SAW switch mode */
10507 		rc = ctrl_set_uio_cfg(demod, &uio_cfg);
10508 		if (rc != 0) {
10509 			pr_err("error %d\n", rc);
10510 			goto rw_error;
10511 		}
10512 
10513 		if (channel->symbolrate < min_symbol_rate ||
10514 		    channel->symbolrate > max_symbol_rate) {
10515 			return -EINVAL;
10516 		}
10517 
10518 		switch (channel->constellation) {
10519 		case DRX_CONSTELLATION_QAM16:
10520 		case DRX_CONSTELLATION_QAM32:
10521 		case DRX_CONSTELLATION_QAM64:
10522 		case DRX_CONSTELLATION_QAM128:
10523 		case DRX_CONSTELLATION_QAM256:
10524 			bandwidth_temp = channel->symbolrate * bw_rolloff_factor;
10525 			bandwidth = bandwidth_temp / 100;
10526 
10527 			if ((bandwidth_temp % 100) >= 50)
10528 				bandwidth++;
10529 
10530 			if (bandwidth <= 6100000) {
10531 				channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10532 			} else if ((bandwidth > 6100000)
10533 				   && (bandwidth <= 7100000)) {
10534 				channel->bandwidth = DRX_BANDWIDTH_7MHZ;
10535 			} else if (bandwidth > 7100000) {
10536 				channel->bandwidth = DRX_BANDWIDTH_8MHZ;
10537 			}
10538 			break;
10539 		default:
10540 			return -EINVAL;
10541 		}
10542 	}
10543 
10544 	/* For QAM annex B:
10545 	   -check constellation
10546 	 */
10547 	if (standard == DRX_STANDARD_ITU_B) {
10548 		switch (channel->constellation) {
10549 		case DRX_CONSTELLATION_AUTO:
10550 		case DRX_CONSTELLATION_QAM256:
10551 		case DRX_CONSTELLATION_QAM64:
10552 			break;
10553 		default:
10554 			return -EINVAL;
10555 		}
10556 
10557 		switch (channel->interleavemode) {
10558 		case DRX_INTERLEAVEMODE_I128_J1:
10559 		case DRX_INTERLEAVEMODE_I128_J1_V2:
10560 		case DRX_INTERLEAVEMODE_I128_J2:
10561 		case DRX_INTERLEAVEMODE_I64_J2:
10562 		case DRX_INTERLEAVEMODE_I128_J3:
10563 		case DRX_INTERLEAVEMODE_I32_J4:
10564 		case DRX_INTERLEAVEMODE_I128_J4:
10565 		case DRX_INTERLEAVEMODE_I16_J8:
10566 		case DRX_INTERLEAVEMODE_I128_J5:
10567 		case DRX_INTERLEAVEMODE_I8_J16:
10568 		case DRX_INTERLEAVEMODE_I128_J6:
10569 		case DRX_INTERLEAVEMODE_I128_J7:
10570 		case DRX_INTERLEAVEMODE_I128_J8:
10571 		case DRX_INTERLEAVEMODE_I12_J17:
10572 		case DRX_INTERLEAVEMODE_I5_J4:
10573 		case DRX_INTERLEAVEMODE_B52_M240:
10574 		case DRX_INTERLEAVEMODE_B52_M720:
10575 		case DRX_INTERLEAVEMODE_UNKNOWN:
10576 		case DRX_INTERLEAVEMODE_AUTO:
10577 			break;
10578 		default:
10579 			return -EINVAL;
10580 		}
10581 	}
10582 
10583 	if ((ext_attr->uio_sma_tx_mode) == DRX_UIO_MODE_FIRMWARE_SAW) {
10584 		/* SAW SW, user UIO is used for switchable SAW */
10585 		struct drxuio_data uio1 = { DRX_UIO1, false };
10586 
10587 		switch (channel->bandwidth) {
10588 		case DRX_BANDWIDTH_8MHZ:
10589 			uio1.value = true;
10590 			break;
10591 		case DRX_BANDWIDTH_7MHZ:
10592 			uio1.value = false;
10593 			break;
10594 		case DRX_BANDWIDTH_6MHZ:
10595 			uio1.value = false;
10596 			break;
10597 		case DRX_BANDWIDTH_UNKNOWN:
10598 		default:
10599 			return -EINVAL;
10600 		}
10601 
10602 		rc = ctrl_uio_write(demod, &uio1);
10603 		if (rc != 0) {
10604 			pr_err("error %d\n", rc);
10605 			goto rw_error;
10606 		}
10607 	}
10608 #endif /* DRXJ_VSB_ONLY */
10609 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
10610 	if (rc != 0) {
10611 		pr_err("error %d\n", rc);
10612 		goto rw_error;
10613 	}
10614 
10615 	tuner_freq_offset = 0;
10616 
10617    /*== Setup demod for specific standard ====================================*/
10618 	switch (standard) {
10619 	case DRX_STANDARD_8VSB:
10620 		if (channel->mirror == DRX_MIRROR_AUTO)
10621 			ext_attr->mirror = DRX_MIRROR_NO;
10622 		else
10623 			ext_attr->mirror = channel->mirror;
10624 		rc = set_vsb(demod);
10625 		if (rc != 0) {
10626 			pr_err("error %d\n", rc);
10627 			goto rw_error;
10628 		}
10629 		rc = set_frequency(demod, channel, tuner_freq_offset);
10630 		if (rc != 0) {
10631 			pr_err("error %d\n", rc);
10632 			goto rw_error;
10633 		}
10634 		break;
10635 #ifndef DRXJ_VSB_ONLY
10636 	case DRX_STANDARD_ITU_A:
10637 	case DRX_STANDARD_ITU_B:
10638 	case DRX_STANDARD_ITU_C:
10639 		rc = set_qam_channel(demod, channel, tuner_freq_offset);
10640 		if (rc != 0) {
10641 			pr_err("error %d\n", rc);
10642 			goto rw_error;
10643 		}
10644 		break;
10645 #endif
10646 	case DRX_STANDARD_UNKNOWN:
10647 	default:
10648 		return -EIO;
10649 	}
10650 
10651 	/* flag the packet error counter reset */
10652 	ext_attr->reset_pkt_err_acc = true;
10653 
10654 	return 0;
10655 rw_error:
10656 	return rc;
10657 }
10658 
10659 /*=============================================================================
10660   ===== SigQuality() ==========================================================
10661   ===========================================================================*/
10662 
10663 /*
10664 * \fn int ctrl_sig_quality()
10665 * \brief Retrieve signal quality form device.
10666 * \param devmod Pointer to demodulator instance.
10667 * \param sig_quality Pointer to signal quality data.
10668 * \return int.
10669 * \retval 0 sig_quality contains valid data.
10670 * \retval -EINVAL sig_quality is NULL.
10671 * \retval -EIO Erroneous data, sig_quality contains invalid data.
10672 
10673 */
10674 static int
10675 ctrl_sig_quality(struct drx_demod_instance *demod,
10676 		 enum drx_lock_status lock_status)
10677 {
10678 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
10679 	struct drxj_data *ext_attr = demod->my_ext_attr;
10680 	struct drx39xxj_state *state = dev_addr->user_data;
10681 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
10682 	enum drx_standard standard = ext_attr->standard;
10683 	int rc;
10684 	u32 ber, cnt, err, pkt;
10685 	u16 mer, strength = 0;
10686 
10687 	rc = get_sig_strength(demod, &strength);
10688 	if (rc < 0) {
10689 		pr_err("error getting signal strength %d\n", rc);
10690 		p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10691 	} else {
10692 		p->strength.stat[0].scale = FE_SCALE_RELATIVE;
10693 		p->strength.stat[0].uvalue = 65535UL *  strength/ 100;
10694 	}
10695 
10696 	switch (standard) {
10697 	case DRX_STANDARD_8VSB:
10698 #ifdef DRXJ_SIGNAL_ACCUM_ERR
10699 		rc = get_acc_pkt_err(demod, &pkt);
10700 		if (rc != 0) {
10701 			pr_err("error %d\n", rc);
10702 			goto rw_error;
10703 		}
10704 #endif
10705 		if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) {
10706 			p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10707 			p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10708 			p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10709 			p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10710 			p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10711 			p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10712 			p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10713 		} else {
10714 			rc = get_vsb_post_rs_pck_err(dev_addr, &err, &pkt);
10715 			if (rc != 0) {
10716 				pr_err("error %d getting UCB\n", rc);
10717 				p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10718 			} else {
10719 				p->block_error.stat[0].scale = FE_SCALE_COUNTER;
10720 				p->block_error.stat[0].uvalue += err;
10721 				p->block_count.stat[0].scale = FE_SCALE_COUNTER;
10722 				p->block_count.stat[0].uvalue += pkt;
10723 			}
10724 
10725 			/* PostViterbi is compute in steps of 10^(-6) */
10726 			rc = get_vs_bpre_viterbi_ber(dev_addr, &ber, &cnt);
10727 			if (rc != 0) {
10728 				pr_err("error %d getting pre-ber\n", rc);
10729 				p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10730 			} else {
10731 				p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10732 				p->pre_bit_error.stat[0].uvalue += ber;
10733 				p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10734 				p->pre_bit_count.stat[0].uvalue += cnt;
10735 			}
10736 
10737 			rc = get_vs_bpost_viterbi_ber(dev_addr, &ber, &cnt);
10738 			if (rc != 0) {
10739 				pr_err("error %d getting post-ber\n", rc);
10740 				p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10741 			} else {
10742 				p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10743 				p->post_bit_error.stat[0].uvalue += ber;
10744 				p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10745 				p->post_bit_count.stat[0].uvalue += cnt;
10746 			}
10747 			rc = get_vsbmer(dev_addr, &mer);
10748 			if (rc != 0) {
10749 				pr_err("error %d getting MER\n", rc);
10750 				p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10751 			} else {
10752 				p->cnr.stat[0].svalue = mer * 100;
10753 				p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
10754 			}
10755 		}
10756 		break;
10757 #ifndef DRXJ_VSB_ONLY
10758 	case DRX_STANDARD_ITU_A:
10759 	case DRX_STANDARD_ITU_B:
10760 	case DRX_STANDARD_ITU_C:
10761 		rc = ctrl_get_qam_sig_quality(demod);
10762 		if (rc != 0) {
10763 			pr_err("error %d\n", rc);
10764 			goto rw_error;
10765 		}
10766 		break;
10767 #endif
10768 	default:
10769 		return -EIO;
10770 	}
10771 
10772 	return 0;
10773 rw_error:
10774 	return rc;
10775 }
10776 
10777 /*============================================================================*/
10778 
10779 /*
10780 * \fn int ctrl_lock_status()
10781 * \brief Retrieve lock status .
10782 * \param dev_addr Pointer to demodulator device address.
10783 * \param lock_stat Pointer to lock status structure.
10784 * \return int.
10785 *
10786 */
10787 static int
10788 ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat)
10789 {
10790 	enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10791 	struct drxj_data *ext_attr = NULL;
10792 	struct i2c_device_addr *dev_addr = NULL;
10793 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
10794 		/* parameter_len */ 0,
10795 		/* result_len    */ 0,
10796 		/* *parameter   */ NULL,
10797 		/* *result      */ NULL
10798 	};
10799 	int rc;
10800 	u16 cmd_result[2] = { 0, 0 };
10801 	u16 demod_lock = SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_DEMOD_LOCKED;
10802 
10803 	/* check arguments */
10804 	if ((demod == NULL) || (lock_stat == NULL))
10805 		return -EINVAL;
10806 
10807 	dev_addr = demod->my_i2c_dev_addr;
10808 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
10809 	standard = ext_attr->standard;
10810 
10811 	*lock_stat = DRX_NOT_LOCKED;
10812 
10813 	/* define the SCU command code */
10814 	switch (standard) {
10815 	case DRX_STANDARD_8VSB:
10816 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
10817 		    SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10818 		demod_lock |= 0x6;
10819 		break;
10820 #ifndef DRXJ_VSB_ONLY
10821 	case DRX_STANDARD_ITU_A:
10822 	case DRX_STANDARD_ITU_B:
10823 	case DRX_STANDARD_ITU_C:
10824 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
10825 		    SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10826 		break;
10827 #endif
10828 	case DRX_STANDARD_UNKNOWN:
10829 	default:
10830 		return -EIO;
10831 	}
10832 
10833 	/* define the SCU command parameters and execute the command */
10834 	cmd_scu.parameter_len = 0;
10835 	cmd_scu.result_len = 2;
10836 	cmd_scu.parameter = NULL;
10837 	cmd_scu.result = cmd_result;
10838 	rc = scu_command(dev_addr, &cmd_scu);
10839 	if (rc != 0) {
10840 		pr_err("error %d\n", rc);
10841 		goto rw_error;
10842 	}
10843 
10844 	/* set the lock status */
10845 	if (cmd_scu.result[1] < demod_lock) {
10846 		/* 0x0000 NOT LOCKED */
10847 		*lock_stat = DRX_NOT_LOCKED;
10848 	} else if (cmd_scu.result[1] < SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_LOCKED) {
10849 		*lock_stat = DRXJ_DEMOD_LOCK;
10850 	} else if (cmd_scu.result[1] <
10851 		   SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_NEVER_LOCK) {
10852 		/* 0x8000 DEMOD + FEC LOCKED (system lock) */
10853 		*lock_stat = DRX_LOCKED;
10854 	} else {
10855 		/* 0xC000 NEVER LOCKED */
10856 		/* (system will never be able to lock to the signal) */
10857 		*lock_stat = DRX_NEVER_LOCK;
10858 	}
10859 
10860 	return 0;
10861 rw_error:
10862 	return rc;
10863 }
10864 
10865 /*============================================================================*/
10866 
10867 /*
10868 * \fn int ctrl_set_standard()
10869 * \brief Set modulation standard to be used.
10870 * \param standard Modulation standard.
10871 * \return int.
10872 *
10873 * Setup stuff for the desired demodulation standard.
10874 * Disable and power down the previous selected demodulation standard
10875 *
10876 */
10877 static int
10878 ctrl_set_standard(struct drx_demod_instance *demod, enum drx_standard *standard)
10879 {
10880 	struct drxj_data *ext_attr = NULL;
10881 	int rc;
10882 	enum drx_standard prev_standard;
10883 
10884 	/* check arguments */
10885 	if ((standard == NULL) || (demod == NULL))
10886 		return -EINVAL;
10887 
10888 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
10889 	prev_standard = ext_attr->standard;
10890 
10891 	/*
10892 	   Stop and power down previous standard
10893 	 */
10894 	switch (prev_standard) {
10895 #ifndef DRXJ_VSB_ONLY
10896 	case DRX_STANDARD_ITU_A:
10897 	case DRX_STANDARD_ITU_B:
10898 	case DRX_STANDARD_ITU_C:
10899 		rc = power_down_qam(demod, false);
10900 		if (rc != 0) {
10901 			pr_err("error %d\n", rc);
10902 			goto rw_error;
10903 		}
10904 		break;
10905 #endif
10906 	case DRX_STANDARD_8VSB:
10907 		rc = power_down_vsb(demod, false);
10908 		if (rc != 0) {
10909 			pr_err("error %d\n", rc);
10910 			goto rw_error;
10911 		}
10912 		break;
10913 	case DRX_STANDARD_UNKNOWN:
10914 		/* Do nothing */
10915 		break;
10916 	case DRX_STANDARD_AUTO:
10917 	default:
10918 		return -EINVAL;
10919 	}
10920 
10921 	/*
10922 	   Initialize channel independent registers
10923 	   Power up new standard
10924 	 */
10925 	ext_attr->standard = *standard;
10926 
10927 	switch (*standard) {
10928 #ifndef DRXJ_VSB_ONLY
10929 	case DRX_STANDARD_ITU_A:
10930 	case DRX_STANDARD_ITU_B:
10931 	case DRX_STANDARD_ITU_C:
10932 		do {
10933 			u16 dummy;
10934 			rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SCU_RAM_VERSION_HI__A, &dummy, 0);
10935 			if (rc != 0) {
10936 				pr_err("error %d\n", rc);
10937 				goto rw_error;
10938 			}
10939 		} while (0);
10940 		break;
10941 #endif
10942 	case DRX_STANDARD_8VSB:
10943 		rc = set_vsb_leak_n_gain(demod);
10944 		if (rc != 0) {
10945 			pr_err("error %d\n", rc);
10946 			goto rw_error;
10947 		}
10948 		break;
10949 	default:
10950 		ext_attr->standard = DRX_STANDARD_UNKNOWN;
10951 		return -EINVAL;
10952 	}
10953 
10954 	return 0;
10955 rw_error:
10956 	/* Don't know what the standard is now ... try again */
10957 	ext_attr->standard = DRX_STANDARD_UNKNOWN;
10958 	return rc;
10959 }
10960 
10961 /*============================================================================*/
10962 
10963 static void drxj_reset_mode(struct drxj_data *ext_attr)
10964 {
10965 	/* Initialize default AFE configuration for QAM */
10966 	if (ext_attr->has_lna) {
10967 		/* IF AGC off, PGA active */
10968 #ifndef DRXJ_VSB_ONLY
10969 		ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10970 		ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10971 		ext_attr->qam_pga_cfg = 140 + (11 * 13);
10972 #endif
10973 		ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10974 		ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10975 		ext_attr->vsb_pga_cfg = 140 + (11 * 13);
10976 	} else {
10977 		/* IF AGC on, PGA not active */
10978 #ifndef DRXJ_VSB_ONLY
10979 		ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10980 		ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10981 		ext_attr->qam_if_agc_cfg.min_output_level = 0;
10982 		ext_attr->qam_if_agc_cfg.max_output_level = 0x7FFF;
10983 		ext_attr->qam_if_agc_cfg.speed = 3;
10984 		ext_attr->qam_if_agc_cfg.top = 1297;
10985 		ext_attr->qam_pga_cfg = 140;
10986 #endif
10987 		ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10988 		ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10989 		ext_attr->vsb_if_agc_cfg.min_output_level = 0;
10990 		ext_attr->vsb_if_agc_cfg.max_output_level = 0x7FFF;
10991 		ext_attr->vsb_if_agc_cfg.speed = 3;
10992 		ext_attr->vsb_if_agc_cfg.top = 1024;
10993 		ext_attr->vsb_pga_cfg = 140;
10994 	}
10995 	/* TODO: remove min_output_level and max_output_level for both QAM and VSB after */
10996 	/* mc has not used them */
10997 #ifndef DRXJ_VSB_ONLY
10998 	ext_attr->qam_rf_agc_cfg.standard = DRX_STANDARD_ITU_B;
10999 	ext_attr->qam_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
11000 	ext_attr->qam_rf_agc_cfg.min_output_level = 0;
11001 	ext_attr->qam_rf_agc_cfg.max_output_level = 0x7FFF;
11002 	ext_attr->qam_rf_agc_cfg.speed = 3;
11003 	ext_attr->qam_rf_agc_cfg.top = 9500;
11004 	ext_attr->qam_rf_agc_cfg.cut_off_current = 4000;
11005 	ext_attr->qam_pre_saw_cfg.standard = DRX_STANDARD_ITU_B;
11006 	ext_attr->qam_pre_saw_cfg.reference = 0x07;
11007 	ext_attr->qam_pre_saw_cfg.use_pre_saw = true;
11008 #endif
11009 	/* Initialize default AFE configuration for VSB */
11010 	ext_attr->vsb_rf_agc_cfg.standard = DRX_STANDARD_8VSB;
11011 	ext_attr->vsb_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
11012 	ext_attr->vsb_rf_agc_cfg.min_output_level = 0;
11013 	ext_attr->vsb_rf_agc_cfg.max_output_level = 0x7FFF;
11014 	ext_attr->vsb_rf_agc_cfg.speed = 3;
11015 	ext_attr->vsb_rf_agc_cfg.top = 9500;
11016 	ext_attr->vsb_rf_agc_cfg.cut_off_current = 4000;
11017 	ext_attr->vsb_pre_saw_cfg.standard = DRX_STANDARD_8VSB;
11018 	ext_attr->vsb_pre_saw_cfg.reference = 0x07;
11019 	ext_attr->vsb_pre_saw_cfg.use_pre_saw = true;
11020 }
11021 
11022 /*
11023 * \fn int ctrl_power_mode()
11024 * \brief Set the power mode of the device to the specified power mode
11025 * \param demod Pointer to demodulator instance.
11026 * \param mode  Pointer to new power mode.
11027 * \return int.
11028 * \retval 0          Success
11029 * \retval -EIO       I2C error or other failure
11030 * \retval -EINVAL Invalid mode argument.
11031 *
11032 *
11033 */
11034 static int
11035 ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode)
11036 {
11037 	struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
11038 	struct drxj_data *ext_attr = (struct drxj_data *) NULL;
11039 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)NULL;
11040 	int rc;
11041 	u16 sio_cc_pwd_mode = 0;
11042 
11043 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
11044 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
11045 	dev_addr = demod->my_i2c_dev_addr;
11046 
11047 	/* Check arguments */
11048 	if (mode == NULL)
11049 		return -EINVAL;
11050 
11051 	/* If already in requested power mode, do nothing */
11052 	if (common_attr->current_power_mode == *mode)
11053 		return 0;
11054 
11055 	switch (*mode) {
11056 	case DRX_POWER_UP:
11057 	case DRXJ_POWER_DOWN_MAIN_PATH:
11058 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
11059 		break;
11060 	case DRXJ_POWER_DOWN_CORE:
11061 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
11062 		break;
11063 	case DRXJ_POWER_DOWN_PLL:
11064 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
11065 		break;
11066 	case DRX_POWER_DOWN:
11067 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
11068 		break;
11069 	default:
11070 		/* Unknow sleep mode */
11071 		return -EINVAL;
11072 	}
11073 
11074 	/* Check if device needs to be powered up */
11075 	if ((common_attr->current_power_mode != DRX_POWER_UP)) {
11076 		rc = power_up_device(demod);
11077 		if (rc != 0) {
11078 			pr_err("error %d\n", rc);
11079 			goto rw_error;
11080 		}
11081 	}
11082 
11083 	if (*mode == DRX_POWER_UP) {
11084 		/* Restore analog & pin configuration */
11085 
11086 		/* Initialize default AFE configuration for VSB */
11087 		drxj_reset_mode(ext_attr);
11088 	} else {
11089 		/* Power down to requested mode */
11090 		/* Backup some register settings */
11091 		/* Set pins with possible pull-ups connected to them in input mode */
11092 		/* Analog power down */
11093 		/* ADC power down */
11094 		/* Power down device */
11095 		/* stop all comm_exec */
11096 		/*
11097 		   Stop and power down previous standard
11098 		 */
11099 
11100 		switch (ext_attr->standard) {
11101 		case DRX_STANDARD_ITU_A:
11102 		case DRX_STANDARD_ITU_B:
11103 		case DRX_STANDARD_ITU_C:
11104 			rc = power_down_qam(demod, true);
11105 			if (rc != 0) {
11106 				pr_err("error %d\n", rc);
11107 				goto rw_error;
11108 			}
11109 			break;
11110 		case DRX_STANDARD_8VSB:
11111 			rc = power_down_vsb(demod, true);
11112 			if (rc != 0) {
11113 				pr_err("error %d\n", rc);
11114 				goto rw_error;
11115 			}
11116 			break;
11117 		case DRX_STANDARD_PAL_SECAM_BG:
11118 		case DRX_STANDARD_PAL_SECAM_DK:
11119 		case DRX_STANDARD_PAL_SECAM_I:
11120 		case DRX_STANDARD_PAL_SECAM_L:
11121 		case DRX_STANDARD_PAL_SECAM_LP:
11122 		case DRX_STANDARD_NTSC:
11123 		case DRX_STANDARD_FM:
11124 			rc = power_down_atv(demod, ext_attr->standard, true);
11125 			if (rc != 0) {
11126 				pr_err("error %d\n", rc);
11127 				goto rw_error;
11128 			}
11129 			break;
11130 		case DRX_STANDARD_UNKNOWN:
11131 			/* Do nothing */
11132 			break;
11133 		case DRX_STANDARD_AUTO:
11134 		default:
11135 			return -EIO;
11136 		}
11137 		ext_attr->standard = DRX_STANDARD_UNKNOWN;
11138 	}
11139 
11140 	if (*mode != DRXJ_POWER_DOWN_MAIN_PATH) {
11141 		rc = drxj_dap_write_reg16(dev_addr, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode, 0);
11142 		if (rc != 0) {
11143 			pr_err("error %d\n", rc);
11144 			goto rw_error;
11145 		}
11146 		rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11147 		if (rc != 0) {
11148 			pr_err("error %d\n", rc);
11149 			goto rw_error;
11150 		}
11151 
11152 		if ((*mode != DRX_POWER_UP)) {
11153 			/* Initialize HI, wakeup key especially before put IC to sleep */
11154 			rc = init_hi(demod);
11155 			if (rc != 0) {
11156 				pr_err("error %d\n", rc);
11157 				goto rw_error;
11158 			}
11159 
11160 			ext_attr->hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
11161 			rc = hi_cfg_command(demod);
11162 			if (rc != 0) {
11163 				pr_err("error %d\n", rc);
11164 				goto rw_error;
11165 			}
11166 		}
11167 	}
11168 
11169 	common_attr->current_power_mode = *mode;
11170 
11171 	return 0;
11172 rw_error:
11173 	return rc;
11174 }
11175 
11176 /*============================================================================*/
11177 /*== CTRL Set/Get Config related functions ===================================*/
11178 /*============================================================================*/
11179 
11180 /*
11181 * \fn int ctrl_set_cfg_pre_saw()
11182 * \brief Set Pre-saw reference.
11183 * \param demod demod instance
11184 * \param u16 *
11185 * \return int.
11186 *
11187 * Check arguments
11188 * Dispatch handling to standard specific function.
11189 *
11190 */
11191 static int
11192 ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw)
11193 {
11194 	struct i2c_device_addr *dev_addr = NULL;
11195 	struct drxj_data *ext_attr = NULL;
11196 	int rc;
11197 
11198 	dev_addr = demod->my_i2c_dev_addr;
11199 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
11200 
11201 	/* check arguments */
11202 	if ((pre_saw == NULL) || (pre_saw->reference > IQM_AF_PDREF__M)
11203 	    ) {
11204 		return -EINVAL;
11205 	}
11206 
11207 	/* Only if standard is currently active */
11208 	if ((ext_attr->standard == pre_saw->standard) ||
11209 	    (DRXJ_ISQAMSTD(ext_attr->standard) &&
11210 	     DRXJ_ISQAMSTD(pre_saw->standard)) ||
11211 	    (DRXJ_ISATVSTD(ext_attr->standard) &&
11212 	     DRXJ_ISATVSTD(pre_saw->standard))) {
11213 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, pre_saw->reference, 0);
11214 		if (rc != 0) {
11215 			pr_err("error %d\n", rc);
11216 			goto rw_error;
11217 		}
11218 	}
11219 
11220 	/* Store pre-saw settings */
11221 	switch (pre_saw->standard) {
11222 	case DRX_STANDARD_8VSB:
11223 		ext_attr->vsb_pre_saw_cfg = *pre_saw;
11224 		break;
11225 #ifndef DRXJ_VSB_ONLY
11226 	case DRX_STANDARD_ITU_A:
11227 	case DRX_STANDARD_ITU_B:
11228 	case DRX_STANDARD_ITU_C:
11229 		ext_attr->qam_pre_saw_cfg = *pre_saw;
11230 		break;
11231 #endif
11232 	default:
11233 		return -EINVAL;
11234 	}
11235 
11236 	return 0;
11237 rw_error:
11238 	return rc;
11239 }
11240 
11241 /*============================================================================*/
11242 
11243 /*
11244 * \fn int ctrl_set_cfg_afe_gain()
11245 * \brief Set AFE Gain.
11246 * \param demod demod instance
11247 * \param u16 *
11248 * \return int.
11249 *
11250 * Check arguments
11251 * Dispatch handling to standard specific function.
11252 *
11253 */
11254 static int
11255 ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain)
11256 {
11257 	struct i2c_device_addr *dev_addr = NULL;
11258 	struct drxj_data *ext_attr = NULL;
11259 	int rc;
11260 	u8 gain = 0;
11261 
11262 	/* check arguments */
11263 	if (afe_gain == NULL)
11264 		return -EINVAL;
11265 
11266 	dev_addr = demod->my_i2c_dev_addr;
11267 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
11268 
11269 	switch (afe_gain->standard) {
11270 	case DRX_STANDARD_8VSB:	fallthrough;
11271 #ifndef DRXJ_VSB_ONLY
11272 	case DRX_STANDARD_ITU_A:
11273 	case DRX_STANDARD_ITU_B:
11274 	case DRX_STANDARD_ITU_C:
11275 #endif
11276 		/* Do nothing */
11277 		break;
11278 	default:
11279 		return -EINVAL;
11280 	}
11281 
11282 	/* TODO PGA gain is also written by microcode (at least by QAM and VSB)
11283 	   So I (PJ) think interface requires choice between auto, user mode */
11284 
11285 	if (afe_gain->gain >= 329)
11286 		gain = 15;
11287 	else if (afe_gain->gain <= 147)
11288 		gain = 0;
11289 	else
11290 		gain = (afe_gain->gain - 140 + 6) / 13;
11291 
11292 	/* Only if standard is currently active */
11293 	if (ext_attr->standard == afe_gain->standard) {
11294 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, gain, 0);
11295 			if (rc != 0) {
11296 				pr_err("error %d\n", rc);
11297 				goto rw_error;
11298 			}
11299 		}
11300 
11301 	/* Store AFE Gain settings */
11302 	switch (afe_gain->standard) {
11303 	case DRX_STANDARD_8VSB:
11304 		ext_attr->vsb_pga_cfg = gain * 13 + 140;
11305 		break;
11306 #ifndef DRXJ_VSB_ONLY
11307 	case DRX_STANDARD_ITU_A:
11308 	case DRX_STANDARD_ITU_B:
11309 	case DRX_STANDARD_ITU_C:
11310 		ext_attr->qam_pga_cfg = gain * 13 + 140;
11311 		break;
11312 #endif
11313 	default:
11314 		return -EIO;
11315 	}
11316 
11317 	return 0;
11318 rw_error:
11319 	return rc;
11320 }
11321 
11322 /*============================================================================*/
11323 
11324 
11325 /*=============================================================================
11326 ===== EXPORTED FUNCTIONS ====================================================*/
11327 
11328 static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11329 		       struct drxu_code_info *mc_info,
11330 		       enum drxu_code_action action);
11331 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state);
11332 
11333 /*
11334 * \fn drxj_open()
11335 * \brief Open the demod instance, configure device, configure drxdriver
11336 * \return Status_t Return status.
11337 *
11338 * drxj_open() can be called with a NULL ucode image => no ucode upload.
11339 * This means that drxj_open() must NOT contain SCU commands or, in general,
11340 * rely on SCU or AUD ucode to be present.
11341 *
11342 */
11343 
11344 static int drxj_open(struct drx_demod_instance *demod)
11345 {
11346 	struct i2c_device_addr *dev_addr = NULL;
11347 	struct drxj_data *ext_attr = NULL;
11348 	struct drx_common_attr *common_attr = NULL;
11349 	u32 driver_version = 0;
11350 	struct drxu_code_info ucode_info;
11351 	struct drx_cfg_mpeg_output cfg_mpeg_output;
11352 	int rc;
11353 	enum drx_power_mode power_mode = DRX_POWER_UP;
11354 
11355 	if ((demod == NULL) ||
11356 	    (demod->my_common_attr == NULL) ||
11357 	    (demod->my_ext_attr == NULL) ||
11358 	    (demod->my_i2c_dev_addr == NULL) ||
11359 	    (demod->my_common_attr->is_opened)) {
11360 		return -EINVAL;
11361 	}
11362 
11363 	/* Check arguments */
11364 	if (demod->my_ext_attr == NULL)
11365 		return -EINVAL;
11366 
11367 	dev_addr = demod->my_i2c_dev_addr;
11368 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
11369 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
11370 
11371 	rc = ctrl_power_mode(demod, &power_mode);
11372 	if (rc != 0) {
11373 		pr_err("error %d\n", rc);
11374 		goto rw_error;
11375 	}
11376 	if (power_mode != DRX_POWER_UP) {
11377 		rc = -EINVAL;
11378 		pr_err("failed to powerup device\n");
11379 		goto rw_error;
11380 	}
11381 
11382 	/* has to be in front of setIqmAf and setOrxNsuAox */
11383 	rc = get_device_capabilities(demod);
11384 	if (rc != 0) {
11385 		pr_err("error %d\n", rc);
11386 		goto rw_error;
11387 	}
11388 
11389 	/*
11390 	 * Soft reset of sys- and osc-clockdomain
11391 	 *
11392 	 * HACK: On windows, it writes a 0x07 here, instead of just 0x03.
11393 	 * As we didn't load the firmware here yet, we should do the same.
11394 	 * Btw, this is coherent with DRX-K, where we send reset codes
11395 	 * for modulation (OFTM, in DRX-k), SYS and OSC clock domains.
11396 	 */
11397 	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);
11398 	if (rc != 0) {
11399 		pr_err("error %d\n", rc);
11400 		goto rw_error;
11401 	}
11402 	rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11403 	if (rc != 0) {
11404 		pr_err("error %d\n", rc);
11405 		goto rw_error;
11406 	}
11407 	msleep(1);
11408 
11409 	/* TODO first make sure that everything keeps working before enabling this */
11410 	/* PowerDownAnalogBlocks() */
11411 	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);
11412 	if (rc != 0) {
11413 		pr_err("error %d\n", rc);
11414 		goto rw_error;
11415 	}
11416 
11417 	rc = set_iqm_af(demod, false);
11418 	if (rc != 0) {
11419 		pr_err("error %d\n", rc);
11420 		goto rw_error;
11421 	}
11422 	rc = set_orx_nsu_aox(demod, false);
11423 	if (rc != 0) {
11424 		pr_err("error %d\n", rc);
11425 		goto rw_error;
11426 	}
11427 
11428 	rc = init_hi(demod);
11429 	if (rc != 0) {
11430 		pr_err("error %d\n", rc);
11431 		goto rw_error;
11432 	}
11433 
11434 	/* disable mpegoutput pins */
11435 	memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
11436 	cfg_mpeg_output.enable_mpeg_output = false;
11437 
11438 	rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
11439 	if (rc != 0) {
11440 		pr_err("error %d\n", rc);
11441 		goto rw_error;
11442 	}
11443 	/* Stop AUD Inform SetAudio it will need to do all setting */
11444 	rc = power_down_aud(demod);
11445 	if (rc != 0) {
11446 		pr_err("error %d\n", rc);
11447 		goto rw_error;
11448 	}
11449 	/* Stop SCU */
11450 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP, 0);
11451 	if (rc != 0) {
11452 		pr_err("error %d\n", rc);
11453 		goto rw_error;
11454 	}
11455 
11456 	/* Upload microcode */
11457 	if (common_attr->microcode_file != NULL) {
11458 		/* Dirty trick to use common ucode upload & verify,
11459 		   pretend device is already open */
11460 		common_attr->is_opened = true;
11461 		ucode_info.mc_file = common_attr->microcode_file;
11462 
11463 		if (DRX_ISPOWERDOWNMODE(demod->my_common_attr->current_power_mode)) {
11464 			pr_err("Should powerup before loading the firmware.");
11465 			return -EINVAL;
11466 		}
11467 
11468 		rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_UPLOAD);
11469 		if (rc != 0) {
11470 			pr_err("error %d while uploading the firmware\n", rc);
11471 			goto rw_error;
11472 		}
11473 		if (common_attr->verify_microcode == true) {
11474 			rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_VERIFY);
11475 			if (rc != 0) {
11476 				pr_err("error %d while verifying the firmware\n",
11477 				       rc);
11478 				goto rw_error;
11479 			}
11480 		}
11481 		common_attr->is_opened = false;
11482 	}
11483 
11484 	/* Run SCU for a little while to initialize microcode version numbers */
11485 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11486 	if (rc != 0) {
11487 		pr_err("error %d\n", rc);
11488 		goto rw_error;
11489 	}
11490 
11491 	/* Initialize scan timeout */
11492 	common_attr->scan_demod_lock_timeout = DRXJ_SCAN_TIMEOUT;
11493 	common_attr->scan_desired_lock = DRX_LOCKED;
11494 
11495 	drxj_reset_mode(ext_attr);
11496 	ext_attr->standard = DRX_STANDARD_UNKNOWN;
11497 
11498 	rc = smart_ant_init(demod);
11499 	if (rc != 0) {
11500 		pr_err("error %d\n", rc);
11501 		goto rw_error;
11502 	}
11503 
11504 	/* Stamp driver version number in SCU data RAM in BCD code
11505 	   Done to enable field application engineers to retrieve drxdriver version
11506 	   via I2C from SCU RAM
11507 	 */
11508 	driver_version = (VERSION_MAJOR / 100) % 10;
11509 	driver_version <<= 4;
11510 	driver_version += (VERSION_MAJOR / 10) % 10;
11511 	driver_version <<= 4;
11512 	driver_version += (VERSION_MAJOR % 10);
11513 	driver_version <<= 4;
11514 	driver_version += (VERSION_MINOR % 10);
11515 	driver_version <<= 4;
11516 	driver_version += (VERSION_PATCH / 1000) % 10;
11517 	driver_version <<= 4;
11518 	driver_version += (VERSION_PATCH / 100) % 10;
11519 	driver_version <<= 4;
11520 	driver_version += (VERSION_PATCH / 10) % 10;
11521 	driver_version <<= 4;
11522 	driver_version += (VERSION_PATCH % 10);
11523 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_HI__A, (u16)(driver_version >> 16), 0);
11524 	if (rc != 0) {
11525 		pr_err("error %d\n", rc);
11526 		goto rw_error;
11527 	}
11528 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_LO__A, (u16)(driver_version & 0xFFFF), 0);
11529 	if (rc != 0) {
11530 		pr_err("error %d\n", rc);
11531 		goto rw_error;
11532 	}
11533 
11534 	rc = ctrl_set_oob(demod, NULL);
11535 	if (rc != 0) {
11536 		pr_err("error %d\n", rc);
11537 		goto rw_error;
11538 	}
11539 
11540 	/* refresh the audio data structure with default */
11541 	ext_attr->aud_data = drxj_default_aud_data_g;
11542 
11543 	demod->my_common_attr->is_opened = true;
11544 	drxj_set_lna_state(demod, false);
11545 	return 0;
11546 rw_error:
11547 	common_attr->is_opened = false;
11548 	return rc;
11549 }
11550 
11551 /*============================================================================*/
11552 /*
11553 * \fn drxj_close()
11554 * \brief Close the demod instance, power down the device
11555 * \return Status_t Return status.
11556 *
11557 */
11558 static int drxj_close(struct drx_demod_instance *demod)
11559 {
11560 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11561 	int rc;
11562 	enum drx_power_mode power_mode = DRX_POWER_UP;
11563 
11564 	if ((demod->my_common_attr == NULL) ||
11565 	    (demod->my_ext_attr == NULL) ||
11566 	    (demod->my_i2c_dev_addr == NULL) ||
11567 	    (!demod->my_common_attr->is_opened)) {
11568 		return -EINVAL;
11569 	}
11570 
11571 	/* power up */
11572 	rc = ctrl_power_mode(demod, &power_mode);
11573 	if (rc != 0) {
11574 		pr_err("error %d\n", rc);
11575 		goto rw_error;
11576 	}
11577 
11578 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11579 	if (rc != 0) {
11580 		pr_err("error %d\n", rc);
11581 		goto rw_error;
11582 	}
11583 	power_mode = DRX_POWER_DOWN;
11584 	rc = ctrl_power_mode(demod, &power_mode);
11585 	if (rc != 0) {
11586 		pr_err("error %d\n", rc);
11587 		goto rw_error;
11588 	}
11589 
11590 	DRX_ATTR_ISOPENED(demod) = false;
11591 
11592 	return 0;
11593 rw_error:
11594 	DRX_ATTR_ISOPENED(demod) = false;
11595 
11596 	return rc;
11597 }
11598 
11599 /*
11600  * Microcode related functions
11601  */
11602 
11603 /*
11604  * drx_u_code_compute_crc	- Compute CRC of block of microcode data.
11605  * @block_data: Pointer to microcode data.
11606  * @nr_words:   Size of microcode block (number of 16 bits words).
11607  *
11608  * returns The computed CRC residue.
11609  */
11610 static u16 drx_u_code_compute_crc(u8 *block_data, u16 nr_words)
11611 {
11612 	u16 i = 0;
11613 	u16 j = 0;
11614 	u32 crc_word = 0;
11615 	u32 carry = 0;
11616 
11617 	while (i < nr_words) {
11618 		crc_word |= (u32)be16_to_cpu(*(__be16 *)(block_data));
11619 		for (j = 0; j < 16; j++) {
11620 			crc_word <<= 1;
11621 			if (carry != 0)
11622 				crc_word ^= 0x80050000UL;
11623 			carry = crc_word & 0x80000000UL;
11624 		}
11625 		i++;
11626 		block_data += (sizeof(u16));
11627 	}
11628 	return (u16)(crc_word >> 16);
11629 }
11630 
11631 /*
11632  * drx_check_firmware - checks if the loaded firmware is valid
11633  *
11634  * @demod:	demod structure
11635  * @mc_data:	pointer to the start of the firmware
11636  * @size:	firmware size
11637  */
11638 static int drx_check_firmware(struct drx_demod_instance *demod, u8 *mc_data,
11639 			  unsigned size)
11640 {
11641 	struct drxu_code_block_hdr block_hdr;
11642 	int i;
11643 	unsigned count = 2 * sizeof(u16);
11644 	u32 mc_dev_type, mc_version, mc_base_version;
11645 	u16 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data + sizeof(u16)));
11646 
11647 	/*
11648 	 * Scan microcode blocks first for version info
11649 	 * and firmware check
11650 	 */
11651 
11652 	/* Clear version block */
11653 	DRX_ATTR_MCRECORD(demod).aux_type = 0;
11654 	DRX_ATTR_MCRECORD(demod).mc_dev_type = 0;
11655 	DRX_ATTR_MCRECORD(demod).mc_version = 0;
11656 	DRX_ATTR_MCRECORD(demod).mc_base_version = 0;
11657 
11658 	for (i = 0; i < mc_nr_of_blks; i++) {
11659 		if (count + 3 * sizeof(u16) + sizeof(u32) > size)
11660 			goto eof;
11661 
11662 		/* Process block header */
11663 		block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data + count));
11664 		count += sizeof(u32);
11665 		block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data + count));
11666 		count += sizeof(u16);
11667 		block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data + count));
11668 		count += sizeof(u16);
11669 		block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data + count));
11670 		count += sizeof(u16);
11671 
11672 		pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11673 			count, block_hdr.addr, block_hdr.size, block_hdr.flags,
11674 			block_hdr.CRC);
11675 
11676 		if (block_hdr.flags & 0x8) {
11677 			u8 *auxblk = ((void *)mc_data) + block_hdr.addr;
11678 			u16 auxtype;
11679 
11680 			if (block_hdr.addr + sizeof(u16) > size)
11681 				goto eof;
11682 
11683 			auxtype = be16_to_cpu(*(__be16 *)(auxblk));
11684 
11685 			/* Aux block. Check type */
11686 			if (DRX_ISMCVERTYPE(auxtype)) {
11687 				if (block_hdr.addr + 2 * sizeof(u16) + 2 * sizeof (u32) > size)
11688 					goto eof;
11689 
11690 				auxblk += sizeof(u16);
11691 				mc_dev_type = be32_to_cpu(*(__be32 *)(auxblk));
11692 				auxblk += sizeof(u32);
11693 				mc_version = be32_to_cpu(*(__be32 *)(auxblk));
11694 				auxblk += sizeof(u32);
11695 				mc_base_version = be32_to_cpu(*(__be32 *)(auxblk));
11696 
11697 				DRX_ATTR_MCRECORD(demod).aux_type = auxtype;
11698 				DRX_ATTR_MCRECORD(demod).mc_dev_type = mc_dev_type;
11699 				DRX_ATTR_MCRECORD(demod).mc_version = mc_version;
11700 				DRX_ATTR_MCRECORD(demod).mc_base_version = mc_base_version;
11701 
11702 				pr_info("Firmware dev %x, ver %x, base ver %x\n",
11703 					mc_dev_type, mc_version, mc_base_version);
11704 
11705 			}
11706 		} else if (count + block_hdr.size * sizeof(u16) > size)
11707 			goto eof;
11708 
11709 		count += block_hdr.size * sizeof(u16);
11710 	}
11711 	return 0;
11712 eof:
11713 	pr_err("Firmware is truncated at pos %u/%u\n", count, size);
11714 	return -EINVAL;
11715 }
11716 
11717 /*
11718  * drx_ctrl_u_code - Handle microcode upload or verify.
11719  * @dev_addr: Address of device.
11720  * @mc_info:  Pointer to information about microcode data.
11721  * @action:  Either UCODE_UPLOAD or UCODE_VERIFY
11722  *
11723  * This function returns:
11724  *	0:
11725  *		- In case of UCODE_UPLOAD: code is successfully uploaded.
11726  *               - In case of UCODE_VERIFY: image on device is equal to
11727  *		  image provided to this control function.
11728  *	-EIO:
11729  *		- In case of UCODE_UPLOAD: I2C error.
11730  *		- In case of UCODE_VERIFY: I2C error or image on device
11731  *		  is not equal to image provided to this control function.
11732  *	-EINVAL:
11733  *		- Invalid arguments.
11734  *		- Provided image is corrupt
11735  */
11736 static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11737 		       struct drxu_code_info *mc_info,
11738 		       enum drxu_code_action action)
11739 {
11740 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11741 	int rc;
11742 	u16 i = 0;
11743 	u16 mc_nr_of_blks = 0;
11744 	u16 mc_magic_word = 0;
11745 	const u8 *mc_data_init = NULL;
11746 	u8 *mc_data = NULL;
11747 	unsigned size;
11748 	char *mc_file;
11749 
11750 	/* Check arguments */
11751 	if (!mc_info || !mc_info->mc_file)
11752 		return -EINVAL;
11753 
11754 	mc_file = mc_info->mc_file;
11755 
11756 	if (!demod->firmware) {
11757 		const struct firmware *fw = NULL;
11758 
11759 		rc = request_firmware(&fw, mc_file, demod->i2c->dev.parent);
11760 		if (rc < 0) {
11761 			pr_err("Couldn't read firmware %s\n", mc_file);
11762 			return rc;
11763 		}
11764 		demod->firmware = fw;
11765 
11766 		if (demod->firmware->size < 2 * sizeof(u16)) {
11767 			rc = -EINVAL;
11768 			pr_err("Firmware is too short!\n");
11769 			goto release;
11770 		}
11771 
11772 		pr_info("Firmware %s, size %zu\n",
11773 			mc_file, demod->firmware->size);
11774 	}
11775 
11776 	mc_data_init = demod->firmware->data;
11777 	size = demod->firmware->size;
11778 
11779 	mc_data = (void *)mc_data_init;
11780 	/* Check data */
11781 	mc_magic_word = be16_to_cpu(*(__be16 *)(mc_data));
11782 	mc_data += sizeof(u16);
11783 	mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data));
11784 	mc_data += sizeof(u16);
11785 
11786 	if ((mc_magic_word != DRX_UCODE_MAGIC_WORD) || (mc_nr_of_blks == 0)) {
11787 		rc = -EINVAL;
11788 		pr_err("Firmware magic word doesn't match\n");
11789 		goto release;
11790 	}
11791 
11792 	if (action == UCODE_UPLOAD) {
11793 		rc = drx_check_firmware(demod, (u8 *)mc_data_init, size);
11794 		if (rc)
11795 			goto release;
11796 		pr_info("Uploading firmware %s\n", mc_file);
11797 	} else {
11798 		pr_info("Verifying if firmware upload was ok.\n");
11799 	}
11800 
11801 	/* Process microcode blocks */
11802 	for (i = 0; i < mc_nr_of_blks; i++) {
11803 		struct drxu_code_block_hdr block_hdr;
11804 		u16 mc_block_nr_bytes = 0;
11805 
11806 		/* Process block header */
11807 		block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data));
11808 		mc_data += sizeof(u32);
11809 		block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data));
11810 		mc_data += sizeof(u16);
11811 		block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data));
11812 		mc_data += sizeof(u16);
11813 		block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data));
11814 		mc_data += sizeof(u16);
11815 
11816 		pr_debug("%zd: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11817 			(mc_data - mc_data_init), block_hdr.addr,
11818 			 block_hdr.size, block_hdr.flags, block_hdr.CRC);
11819 
11820 		/* Check block header on:
11821 		   - data larger than 64Kb
11822 		   - if CRC enabled check CRC
11823 		 */
11824 		if ((block_hdr.size > 0x7FFF) ||
11825 		    (((block_hdr.flags & DRX_UCODE_CRC_FLAG) != 0) &&
11826 		     (block_hdr.CRC != drx_u_code_compute_crc(mc_data, block_hdr.size)))
11827 		    ) {
11828 			/* Wrong data ! */
11829 			rc = -EINVAL;
11830 			pr_err("firmware CRC is wrong\n");
11831 			goto release;
11832 		}
11833 
11834 		if (!block_hdr.size)
11835 			continue;
11836 
11837 		mc_block_nr_bytes = block_hdr.size * ((u16) sizeof(u16));
11838 
11839 		/* Perform the desired action */
11840 		switch (action) {
11841 		case UCODE_UPLOAD:	/* Upload microcode */
11842 			if (drxdap_fasi_write_block(dev_addr,
11843 							block_hdr.addr,
11844 							mc_block_nr_bytes,
11845 							mc_data, 0x0000)) {
11846 				rc = -EIO;
11847 				pr_err("error writing firmware at pos %zd\n",
11848 				       mc_data - mc_data_init);
11849 				goto release;
11850 			}
11851 			break;
11852 		case UCODE_VERIFY: {	/* Verify uploaded microcode */
11853 			int result = 0;
11854 			u8 mc_data_buffer[DRX_UCODE_MAX_BUF_SIZE];
11855 			u32 bytes_to_comp = 0;
11856 			u32 bytes_left = mc_block_nr_bytes;
11857 			u32 curr_addr = block_hdr.addr;
11858 			u8 *curr_ptr = mc_data;
11859 
11860 			while (bytes_left != 0) {
11861 				if (bytes_left > DRX_UCODE_MAX_BUF_SIZE)
11862 					bytes_to_comp = DRX_UCODE_MAX_BUF_SIZE;
11863 				else
11864 					bytes_to_comp = bytes_left;
11865 
11866 				if (drxdap_fasi_read_block(dev_addr,
11867 						    curr_addr,
11868 						    (u16)bytes_to_comp,
11869 						    (u8 *)mc_data_buffer,
11870 						    0x0000)) {
11871 					pr_err("error reading firmware at pos %zd\n",
11872 					       mc_data - mc_data_init);
11873 					return -EIO;
11874 				}
11875 
11876 				result = memcmp(curr_ptr, mc_data_buffer,
11877 						bytes_to_comp);
11878 
11879 				if (result) {
11880 					pr_err("error verifying firmware at pos %zd\n",
11881 					       mc_data - mc_data_init);
11882 					return -EIO;
11883 				}
11884 
11885 				curr_addr += ((dr_xaddr_t)(bytes_to_comp / 2));
11886 				curr_ptr =&(curr_ptr[bytes_to_comp]);
11887 				bytes_left -=((u32) bytes_to_comp);
11888 			}
11889 			break;
11890 		}
11891 		default:
11892 			return -EINVAL;
11893 
11894 		}
11895 		mc_data += mc_block_nr_bytes;
11896 	}
11897 
11898 	return 0;
11899 
11900 release:
11901 	release_firmware(demod->firmware);
11902 	demod->firmware = NULL;
11903 
11904 	return rc;
11905 }
11906 
11907 /* caller is expected to check if lna is supported before enabling */
11908 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state)
11909 {
11910 	struct drxuio_cfg uio_cfg;
11911 	struct drxuio_data uio_data;
11912 	int result;
11913 
11914 	uio_cfg.uio = DRX_UIO1;
11915 	uio_cfg.mode = DRX_UIO_MODE_READWRITE;
11916 	/* Configure user-I/O #3: enable read/write */
11917 	result = ctrl_set_uio_cfg(demod, &uio_cfg);
11918 	if (result) {
11919 		pr_err("Failed to setup LNA GPIO!\n");
11920 		return result;
11921 	}
11922 
11923 	uio_data.uio = DRX_UIO1;
11924 	uio_data.value = state;
11925 	result = ctrl_uio_write(demod, &uio_data);
11926 	if (result != 0) {
11927 		pr_err("Failed to %sable LNA!\n",
11928 		       state ? "en" : "dis");
11929 		return result;
11930 	}
11931 	return 0;
11932 }
11933 
11934 /*
11935  * The Linux DVB Driver for Micronas DRX39xx family (drx3933j)
11936  *
11937  * Written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
11938  */
11939 
11940 static int drx39xxj_set_powerstate(struct dvb_frontend *fe, int enable)
11941 {
11942 	struct drx39xxj_state *state = fe->demodulator_priv;
11943 	struct drx_demod_instance *demod = state->demod;
11944 	int result;
11945 	enum drx_power_mode power_mode;
11946 
11947 	if (enable)
11948 		power_mode = DRX_POWER_UP;
11949 	else
11950 		power_mode = DRX_POWER_DOWN;
11951 
11952 	result = ctrl_power_mode(demod, &power_mode);
11953 	if (result != 0) {
11954 		pr_err("Power state change failed\n");
11955 		return 0;
11956 	}
11957 
11958 	return 0;
11959 }
11960 
11961 static int drx39xxj_read_status(struct dvb_frontend *fe, enum fe_status *status)
11962 {
11963 	struct drx39xxj_state *state = fe->demodulator_priv;
11964 	struct drx_demod_instance *demod = state->demod;
11965 	int result;
11966 	enum drx_lock_status lock_status;
11967 
11968 	*status = 0;
11969 
11970 	result = ctrl_lock_status(demod, &lock_status);
11971 	if (result != 0) {
11972 		pr_err("drx39xxj: could not get lock status!\n");
11973 		*status = 0;
11974 	}
11975 
11976 	switch (lock_status) {
11977 	case DRX_NEVER_LOCK:
11978 		*status = 0;
11979 		pr_err("drx says NEVER_LOCK\n");
11980 		break;
11981 	case DRX_NOT_LOCKED:
11982 		*status = 0;
11983 		break;
11984 	case DRX_LOCK_STATE_1:
11985 	case DRX_LOCK_STATE_2:
11986 	case DRX_LOCK_STATE_3:
11987 	case DRX_LOCK_STATE_4:
11988 	case DRX_LOCK_STATE_5:
11989 	case DRX_LOCK_STATE_6:
11990 	case DRX_LOCK_STATE_7:
11991 	case DRX_LOCK_STATE_8:
11992 	case DRX_LOCK_STATE_9:
11993 		*status = FE_HAS_SIGNAL
11994 		    | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC;
11995 		break;
11996 	case DRX_LOCKED:
11997 		*status = FE_HAS_SIGNAL
11998 		    | FE_HAS_CARRIER
11999 		    | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
12000 		break;
12001 	default:
12002 		pr_err("Lock state unknown %d\n", lock_status);
12003 	}
12004 	ctrl_sig_quality(demod, lock_status);
12005 
12006 	return 0;
12007 }
12008 
12009 static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber)
12010 {
12011 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12012 
12013 	if (p->pre_bit_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12014 		*ber = 0;
12015 		return 0;
12016 	}
12017 
12018 	if (!p->pre_bit_count.stat[0].uvalue) {
12019 		if (!p->pre_bit_error.stat[0].uvalue)
12020 			*ber = 0;
12021 		else
12022 			*ber = 1000000;
12023 	} else {
12024 		*ber = frac_times1e6(p->pre_bit_error.stat[0].uvalue,
12025 				     p->pre_bit_count.stat[0].uvalue);
12026 	}
12027 	return 0;
12028 }
12029 
12030 static int drx39xxj_read_signal_strength(struct dvb_frontend *fe,
12031 					 u16 *strength)
12032 {
12033 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12034 
12035 	if (p->strength.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12036 		*strength = 0;
12037 		return 0;
12038 	}
12039 
12040 	*strength = p->strength.stat[0].uvalue;
12041 	return 0;
12042 }
12043 
12044 static int drx39xxj_read_snr(struct dvb_frontend *fe, u16 *snr)
12045 {
12046 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12047 	u64 tmp64;
12048 
12049 	if (p->cnr.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12050 		*snr = 0;
12051 		return 0;
12052 	}
12053 
12054 	tmp64 = p->cnr.stat[0].svalue;
12055 	do_div(tmp64, 10);
12056 	*snr = tmp64;
12057 	return 0;
12058 }
12059 
12060 static int drx39xxj_read_ucblocks(struct dvb_frontend *fe, u32 *ucb)
12061 {
12062 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12063 
12064 	if (p->block_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12065 		*ucb = 0;
12066 		return 0;
12067 	}
12068 
12069 	*ucb = p->block_error.stat[0].uvalue;
12070 	return 0;
12071 }
12072 
12073 static int drx39xxj_set_frontend(struct dvb_frontend *fe)
12074 {
12075 #ifdef DJH_DEBUG
12076 	int i;
12077 #endif
12078 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12079 	struct drx39xxj_state *state = fe->demodulator_priv;
12080 	struct drx_demod_instance *demod = state->demod;
12081 	enum drx_standard standard = DRX_STANDARD_8VSB;
12082 	struct drx_channel channel;
12083 	int result;
12084 	static const struct drx_channel def_channel = {
12085 		/* frequency      */ 0,
12086 		/* bandwidth      */ DRX_BANDWIDTH_6MHZ,
12087 		/* mirror         */ DRX_MIRROR_NO,
12088 		/* constellation  */ DRX_CONSTELLATION_AUTO,
12089 		/* hierarchy      */ DRX_HIERARCHY_UNKNOWN,
12090 		/* priority       */ DRX_PRIORITY_UNKNOWN,
12091 		/* coderate       */ DRX_CODERATE_UNKNOWN,
12092 		/* guard          */ DRX_GUARD_UNKNOWN,
12093 		/* fftmode        */ DRX_FFTMODE_UNKNOWN,
12094 		/* classification */ DRX_CLASSIFICATION_AUTO,
12095 		/* symbolrate     */ 5057000,
12096 		/* interleavemode */ DRX_INTERLEAVEMODE_UNKNOWN,
12097 		/* ldpc           */ DRX_LDPC_UNKNOWN,
12098 		/* carrier        */ DRX_CARRIER_UNKNOWN,
12099 		/* frame mode     */ DRX_FRAMEMODE_UNKNOWN
12100 	};
12101 	u32 constellation = DRX_CONSTELLATION_AUTO;
12102 
12103 	/* Bring the demod out of sleep */
12104 	drx39xxj_set_powerstate(fe, 1);
12105 
12106 	if (fe->ops.tuner_ops.set_params) {
12107 		u32 int_freq;
12108 
12109 		if (fe->ops.i2c_gate_ctrl)
12110 			fe->ops.i2c_gate_ctrl(fe, 1);
12111 
12112 		/* Set tuner to desired frequency and standard */
12113 		fe->ops.tuner_ops.set_params(fe);
12114 
12115 		/* Use the tuner's IF */
12116 		if (fe->ops.tuner_ops.get_if_frequency) {
12117 			fe->ops.tuner_ops.get_if_frequency(fe, &int_freq);
12118 			demod->my_common_attr->intermediate_freq = int_freq / 1000;
12119 		}
12120 
12121 		if (fe->ops.i2c_gate_ctrl)
12122 			fe->ops.i2c_gate_ctrl(fe, 0);
12123 	}
12124 
12125 	switch (p->delivery_system) {
12126 	case SYS_ATSC:
12127 		standard = DRX_STANDARD_8VSB;
12128 		break;
12129 	case SYS_DVBC_ANNEX_B:
12130 		standard = DRX_STANDARD_ITU_B;
12131 
12132 		switch (p->modulation) {
12133 		case QAM_64:
12134 			constellation = DRX_CONSTELLATION_QAM64;
12135 			break;
12136 		case QAM_256:
12137 			constellation = DRX_CONSTELLATION_QAM256;
12138 			break;
12139 		default:
12140 			constellation = DRX_CONSTELLATION_AUTO;
12141 			break;
12142 		}
12143 		break;
12144 	default:
12145 		return -EINVAL;
12146 	}
12147 	/* Set the standard (will be powered up if necessary */
12148 	result = ctrl_set_standard(demod, &standard);
12149 	if (result != 0) {
12150 		pr_err("Failed to set standard! result=%02x\n",
12151 			result);
12152 		return -EINVAL;
12153 	}
12154 
12155 	/* set channel parameters */
12156 	channel = def_channel;
12157 	channel.frequency = p->frequency / 1000;
12158 	channel.bandwidth = DRX_BANDWIDTH_6MHZ;
12159 	channel.constellation = constellation;
12160 
12161 	/* program channel */
12162 	result = ctrl_set_channel(demod, &channel);
12163 	if (result != 0) {
12164 		pr_err("Failed to set channel!\n");
12165 		return -EINVAL;
12166 	}
12167 	/* Just for giggles, let's shut off the LNA again.... */
12168 	drxj_set_lna_state(demod, false);
12169 
12170 	/* After set_frontend, except for strength, stats aren't available */
12171 	p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12172 
12173 	return 0;
12174 }
12175 
12176 static int drx39xxj_sleep(struct dvb_frontend *fe)
12177 {
12178 	/* power-down the demodulator */
12179 	return drx39xxj_set_powerstate(fe, 0);
12180 }
12181 
12182 static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
12183 {
12184 	struct drx39xxj_state *state = fe->demodulator_priv;
12185 	struct drx_demod_instance *demod = state->demod;
12186 	bool i2c_gate_state;
12187 	int result;
12188 
12189 #ifdef DJH_DEBUG
12190 	pr_debug("i2c gate call: enable=%d state=%d\n", enable,
12191 	       state->i2c_gate_open);
12192 #endif
12193 
12194 	if (enable)
12195 		i2c_gate_state = true;
12196 	else
12197 		i2c_gate_state = false;
12198 
12199 	if (state->i2c_gate_open == enable) {
12200 		/* We're already in the desired state */
12201 		return 0;
12202 	}
12203 
12204 	result = ctrl_i2c_bridge(demod, &i2c_gate_state);
12205 	if (result != 0) {
12206 		pr_err("drx39xxj: could not open i2c gate [%d]\n",
12207 		       result);
12208 		dump_stack();
12209 	} else {
12210 		state->i2c_gate_open = enable;
12211 	}
12212 	return 0;
12213 }
12214 
12215 static int drx39xxj_init(struct dvb_frontend *fe)
12216 {
12217 	struct drx39xxj_state *state = fe->demodulator_priv;
12218 	struct drx_demod_instance *demod = state->demod;
12219 	int rc = 0;
12220 
12221 	if (fe->exit == DVB_FE_DEVICE_RESUME) {
12222 		/* so drxj_open() does what it needs to do */
12223 		demod->my_common_attr->is_opened = false;
12224 		rc = drxj_open(demod);
12225 		if (rc != 0)
12226 			pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc);
12227 	} else
12228 		drx39xxj_set_powerstate(fe, 1);
12229 
12230 	return rc;
12231 }
12232 
12233 static int drx39xxj_set_lna(struct dvb_frontend *fe)
12234 {
12235 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
12236 	struct drx39xxj_state *state = fe->demodulator_priv;
12237 	struct drx_demod_instance *demod = state->demod;
12238 	struct drxj_data *ext_attr = demod->my_ext_attr;
12239 
12240 	if (c->lna) {
12241 		if (!ext_attr->has_lna) {
12242 			pr_err("LNA is not supported on this device!\n");
12243 			return -EINVAL;
12244 
12245 		}
12246 	}
12247 
12248 	return drxj_set_lna_state(demod, c->lna);
12249 }
12250 
12251 static int drx39xxj_get_tune_settings(struct dvb_frontend *fe,
12252 				      struct dvb_frontend_tune_settings *tune)
12253 {
12254 	tune->min_delay_ms = 1000;
12255 	return 0;
12256 }
12257 
12258 static void drx39xxj_release(struct dvb_frontend *fe)
12259 {
12260 	struct drx39xxj_state *state = fe->demodulator_priv;
12261 	struct drx_demod_instance *demod = state->demod;
12262 
12263 	/* if device is removed don't access it */
12264 	if (fe->exit != DVB_FE_DEVICE_REMOVED)
12265 		drxj_close(demod);
12266 
12267 	kfree(demod->my_ext_attr);
12268 	kfree(demod->my_common_attr);
12269 	kfree(demod->my_i2c_dev_addr);
12270 	release_firmware(demod->firmware);
12271 	kfree(demod);
12272 	kfree(state);
12273 }
12274 
12275 static const struct dvb_frontend_ops drx39xxj_ops;
12276 
12277 struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
12278 {
12279 	struct drx39xxj_state *state = NULL;
12280 	struct i2c_device_addr *demod_addr = NULL;
12281 	struct drx_common_attr *demod_comm_attr = NULL;
12282 	struct drxj_data *demod_ext_attr = NULL;
12283 	struct drx_demod_instance *demod = NULL;
12284 	struct dtv_frontend_properties *p;
12285 	int result;
12286 
12287 	/* allocate memory for the internal state */
12288 	state = kzalloc(sizeof(struct drx39xxj_state), GFP_KERNEL);
12289 	if (state == NULL)
12290 		goto error;
12291 
12292 	demod = kmemdup(&drxj_default_demod_g,
12293 			sizeof(struct drx_demod_instance), GFP_KERNEL);
12294 	if (demod == NULL)
12295 		goto error;
12296 
12297 	demod_addr = kmemdup(&drxj_default_addr_g,
12298 			     sizeof(struct i2c_device_addr), GFP_KERNEL);
12299 	if (demod_addr == NULL)
12300 		goto error;
12301 
12302 	demod_comm_attr = kmemdup(&drxj_default_comm_attr_g,
12303 				  sizeof(struct drx_common_attr), GFP_KERNEL);
12304 	if (demod_comm_attr == NULL)
12305 		goto error;
12306 
12307 	demod_ext_attr = kmemdup(&drxj_data_g, sizeof(struct drxj_data),
12308 				 GFP_KERNEL);
12309 	if (demod_ext_attr == NULL)
12310 		goto error;
12311 
12312 	/* setup the state */
12313 	state->i2c = i2c;
12314 	state->demod = demod;
12315 
12316 	/* setup the demod data */
12317 	demod->my_i2c_dev_addr = demod_addr;
12318 	demod->my_common_attr = demod_comm_attr;
12319 	demod->my_i2c_dev_addr->user_data = state;
12320 	demod->my_common_attr->microcode_file = DRX39XX_MAIN_FIRMWARE;
12321 	demod->my_common_attr->verify_microcode = true;
12322 	demod->my_common_attr->intermediate_freq = 5000;
12323 	demod->my_common_attr->current_power_mode = DRX_POWER_DOWN;
12324 	demod->my_ext_attr = demod_ext_attr;
12325 	((struct drxj_data *)demod_ext_attr)->uio_sma_tx_mode = DRX_UIO_MODE_READWRITE;
12326 	demod->i2c = i2c;
12327 
12328 	result = drxj_open(demod);
12329 	if (result != 0) {
12330 		pr_err("DRX open failed!  Aborting\n");
12331 		goto error;
12332 	}
12333 
12334 	/* create dvb_frontend */
12335 	memcpy(&state->frontend.ops, &drx39xxj_ops,
12336 	       sizeof(struct dvb_frontend_ops));
12337 
12338 	state->frontend.demodulator_priv = state;
12339 
12340 	/* Initialize stats - needed for DVBv5 stats to work */
12341 	p = &state->frontend.dtv_property_cache;
12342 	p->strength.len = 1;
12343 	p->pre_bit_count.len = 1;
12344 	p->pre_bit_error.len = 1;
12345 	p->post_bit_count.len = 1;
12346 	p->post_bit_error.len = 1;
12347 	p->block_count.len = 1;
12348 	p->block_error.len = 1;
12349 	p->cnr.len = 1;
12350 
12351 	p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12352 	p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12353 	p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12354 	p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12355 	p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12356 	p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12357 	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12358 	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12359 
12360 	return &state->frontend;
12361 
12362 error:
12363 	kfree(demod_ext_attr);
12364 	kfree(demod_comm_attr);
12365 	kfree(demod_addr);
12366 	kfree(demod);
12367 	kfree(state);
12368 
12369 	return NULL;
12370 }
12371 EXPORT_SYMBOL(drx39xxj_attach);
12372 
12373 static const struct dvb_frontend_ops drx39xxj_ops = {
12374 	.delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
12375 	.info = {
12376 		 .name = "Micronas DRX39xxj family Frontend",
12377 		 .frequency_min_hz =  51 * MHz,
12378 		 .frequency_max_hz = 858 * MHz,
12379 		 .frequency_stepsize_hz = 62500,
12380 		 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
12381 	},
12382 
12383 	.init = drx39xxj_init,
12384 	.i2c_gate_ctrl = drx39xxj_i2c_gate_ctrl,
12385 	.sleep = drx39xxj_sleep,
12386 	.set_frontend = drx39xxj_set_frontend,
12387 	.get_tune_settings = drx39xxj_get_tune_settings,
12388 	.read_status = drx39xxj_read_status,
12389 	.read_ber = drx39xxj_read_ber,
12390 	.read_signal_strength = drx39xxj_read_signal_strength,
12391 	.read_snr = drx39xxj_read_snr,
12392 	.read_ucblocks = drx39xxj_read_ucblocks,
12393 	.release = drx39xxj_release,
12394 	.set_lna = drx39xxj_set_lna,
12395 };
12396 
12397 MODULE_DESCRIPTION("Micronas DRX39xxj Frontend");
12398 MODULE_AUTHOR("Devin Heitmueller");
12399 MODULE_LICENSE("GPL");
12400 MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE);
12401