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 "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 adresses directly. This must be READ ONLY to avoid problems.           */
385 /* Writing to the interface adresses is 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 ouput enable        */
660 	false,			/* flag SIF ouput enable         */
661 	DRXJ_SIF_ATTENUATION_0DB,	/* current SIF att setting       */
662 	{			/* qam_rf_agc_cfg */
663 	 DRX_STANDARD_ITU_B,	/* standard            */
664 	 DRX_AGC_CTRL_AUTO,	/* ctrl_mode            */
665 	 0,			/* output_level         */
666 	 0,			/* min_output_level      */
667 	 0xFFFF,		/* max_output_level      */
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 ouput    */
836 	 false,			/* If true, insert RS byte       */
837 	 false,			/* If true, parallel out otherwise serial */
838 	 false,			/* If true, invert DATA signals  */
839 	 false,			/* If true, invert ERR signal    */
840 	 false,			/* If true, invert STR signals   */
841 	 false,			/* If true, invert VAL signals   */
842 	 false,			/* If true, invert CLK signals   */
843 	 true,			/* If true, static MPEG clockrate will
844 				   be used, otherwise clockrate will
845 				   adapt to the bitrate of the TS */
846 	 19392658UL,		/* Maximum bitrate in b/s in case
847 				   static clockrate is selected */
848 	 DRX_MPEG_STR_WIDTH_1	/* MPEG Start width in clock cycles */
849 	 },
850 	/* Initilisations below can be omitted, they require no user input and
851 	   are initialy 0, NULL or false. The compiler will initialize them to these
852 	   values when omitted.  */
853 	false,			/* is_opened */
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 wich tuner is     */
873 	0L,			/* minimum RF input frequency, in kHz  */
874 	0L,			/* maximum RF input frequency, in kHz  */
875 	false,			/* Rf Agc Polarity                     */
876 	false,			/* If Agc Polarity                     */
877 	false,			/* tuner slow mode                     */
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 rewriten 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 Succes
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 Succes
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 Succes
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 Succes
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 			drxj_dap_read_reg16(dev_addr,
2155 					    (DRXJ_HI_ATOMIC_BUF_START + i),
2156 					   &word, 0);
2157 			data[2 * i] = (u8) (word & 0xFF);
2158 			data[(2 * i) + 1] = (u8) (word >> 8);
2159 		}
2160 	}
2161 
2162 	return 0;
2163 
2164 rw_error:
2165 	return rc;
2166 
2167 }
2168 
2169 /*============================================================================*/
2170 
2171 /**
2172 * \fn int drxj_dap_atomic_read_reg32()
2173 * \brief Atomic read of 32 bits words
2174 */
2175 static
2176 int drxj_dap_atomic_read_reg32(struct i2c_device_addr *dev_addr,
2177 				     u32 addr,
2178 				     u32 *data, u32 flags)
2179 {
2180 	u8 buf[sizeof(*data)] = { 0 };
2181 	int rc = -EIO;
2182 	u32 word = 0;
2183 
2184 	if (!data)
2185 		return -EINVAL;
2186 
2187 	rc = drxj_dap_atomic_read_write_block(dev_addr, addr,
2188 					      sizeof(*data), buf, true);
2189 
2190 	if (rc < 0)
2191 		return 0;
2192 
2193 	word = (u32) buf[3];
2194 	word <<= 8;
2195 	word |= (u32) buf[2];
2196 	word <<= 8;
2197 	word |= (u32) buf[1];
2198 	word <<= 8;
2199 	word |= (u32) buf[0];
2200 
2201 	*data = word;
2202 
2203 	return rc;
2204 }
2205 
2206 /*============================================================================*/
2207 
2208 /*============================================================================*/
2209 /*==                        END DRXJ DAP FUNCTIONS                          ==*/
2210 /*============================================================================*/
2211 
2212 /*============================================================================*/
2213 /*============================================================================*/
2214 /*==                      HOST INTERFACE FUNCTIONS                          ==*/
2215 /*============================================================================*/
2216 /*============================================================================*/
2217 
2218 /**
2219 * \fn int hi_cfg_command()
2220 * \brief Configure HI with settings stored in the demod structure.
2221 * \param demod Demodulator.
2222 * \return int.
2223 *
2224 * This routine was created because to much orthogonal settings have
2225 * been put into one HI API function (configure). Especially the I2C bridge
2226 * enable/disable should not need re-configuration of the HI.
2227 *
2228 */
2229 static int hi_cfg_command(const struct drx_demod_instance *demod)
2230 {
2231 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2232 	struct drxj_hi_cmd hi_cmd;
2233 	u16 result = 0;
2234 	int rc;
2235 
2236 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
2237 
2238 	hi_cmd.cmd = SIO_HI_RA_RAM_CMD_CONFIG;
2239 	hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
2240 	hi_cmd.param2 = ext_attr->hi_cfg_timing_div;
2241 	hi_cmd.param3 = ext_attr->hi_cfg_bridge_delay;
2242 	hi_cmd.param4 = ext_attr->hi_cfg_wake_up_key;
2243 	hi_cmd.param5 = ext_attr->hi_cfg_ctrl;
2244 	hi_cmd.param6 = ext_attr->hi_cfg_transmit;
2245 
2246 	rc = hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
2247 	if (rc != 0) {
2248 		pr_err("error %d\n", rc);
2249 		goto rw_error;
2250 	}
2251 
2252 	/* Reset power down flag (set one call only) */
2253 	ext_attr->hi_cfg_ctrl &= (~(SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2254 
2255 	return 0;
2256 
2257 rw_error:
2258 	return rc;
2259 }
2260 
2261 /**
2262 * \fn int hi_command()
2263 * \brief Configure HI with settings stored in the demod structure.
2264 * \param dev_addr I2C address.
2265 * \param cmd HI command.
2266 * \param result HI command result.
2267 * \return int.
2268 *
2269 * Sends command to HI
2270 *
2271 */
2272 static int
2273 hi_command(struct i2c_device_addr *dev_addr, const struct drxj_hi_cmd *cmd, u16 *result)
2274 {
2275 	u16 wait_cmd = 0;
2276 	u16 nr_retries = 0;
2277 	bool powerdown_cmd = false;
2278 	int rc;
2279 
2280 	/* Write parameters */
2281 	switch (cmd->cmd) {
2282 
2283 	case SIO_HI_RA_RAM_CMD_CONFIG:
2284 	case SIO_HI_RA_RAM_CMD_ATOMIC_COPY:
2285 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_6__A, cmd->param6, 0);
2286 		if (rc != 0) {
2287 			pr_err("error %d\n", rc);
2288 			goto rw_error;
2289 		}
2290 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_5__A, cmd->param5, 0);
2291 		if (rc != 0) {
2292 			pr_err("error %d\n", rc);
2293 			goto rw_error;
2294 		}
2295 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_4__A, cmd->param4, 0);
2296 		if (rc != 0) {
2297 			pr_err("error %d\n", rc);
2298 			goto rw_error;
2299 		}
2300 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_3__A, cmd->param3, 0);
2301 		if (rc != 0) {
2302 			pr_err("error %d\n", rc);
2303 			goto rw_error;
2304 		}
2305 		/* fallthrough */
2306 	case SIO_HI_RA_RAM_CMD_BRDCTRL:
2307 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_2__A, cmd->param2, 0);
2308 		if (rc != 0) {
2309 			pr_err("error %d\n", rc);
2310 			goto rw_error;
2311 		}
2312 		rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_1__A, cmd->param1, 0);
2313 		if (rc != 0) {
2314 			pr_err("error %d\n", rc);
2315 			goto rw_error;
2316 		}
2317 		/* fallthrough */
2318 	case SIO_HI_RA_RAM_CMD_NULL:
2319 		/* No parameters */
2320 		break;
2321 
2322 	default:
2323 		return -EINVAL;
2324 		break;
2325 	}
2326 
2327 	/* Write command */
2328 	rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, cmd->cmd, 0);
2329 	if (rc != 0) {
2330 		pr_err("error %d\n", rc);
2331 		goto rw_error;
2332 	}
2333 
2334 	if ((cmd->cmd) == SIO_HI_RA_RAM_CMD_RESET)
2335 		msleep(1);
2336 
2337 	/* Detect power down to ommit reading result */
2338 	powerdown_cmd = (bool) ((cmd->cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
2339 				  (((cmd->
2340 				     param5) & SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M)
2341 				   == SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2342 	if (!powerdown_cmd) {
2343 		/* Wait until command rdy */
2344 		do {
2345 			nr_retries++;
2346 			if (nr_retries > DRXJ_MAX_RETRIES) {
2347 				pr_err("timeout\n");
2348 				goto rw_error;
2349 			}
2350 
2351 			rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, &wait_cmd, 0);
2352 			if (rc != 0) {
2353 				pr_err("error %d\n", rc);
2354 				goto rw_error;
2355 			}
2356 		} while (wait_cmd != 0);
2357 
2358 		/* Read result */
2359 		rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_RES__A, result, 0);
2360 		if (rc != 0) {
2361 			pr_err("error %d\n", rc);
2362 			goto rw_error;
2363 		}
2364 
2365 	}
2366 	/* if ( powerdown_cmd == true ) */
2367 	return 0;
2368 rw_error:
2369 	return rc;
2370 }
2371 
2372 /**
2373 * \fn int init_hi( const struct drx_demod_instance *demod )
2374 * \brief Initialise and configurate HI.
2375 * \param demod pointer to demod data.
2376 * \return int Return status.
2377 * \retval 0 Success.
2378 * \retval -EIO Failure.
2379 *
2380 * Needs to know Psys (System Clock period) and Posc (Osc Clock period)
2381 * Need to store configuration in driver because of the way I2C
2382 * bridging is controlled.
2383 *
2384 */
2385 static int init_hi(const struct drx_demod_instance *demod)
2386 {
2387 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2388 	struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2389 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2390 	int rc;
2391 
2392 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
2393 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
2394 	dev_addr = demod->my_i2c_dev_addr;
2395 
2396 	/* PATCH for bug 5003, HI ucode v3.1.0 */
2397 	rc = drxj_dap_write_reg16(dev_addr, 0x4301D7, 0x801, 0);
2398 	if (rc != 0) {
2399 		pr_err("error %d\n", rc);
2400 		goto rw_error;
2401 	}
2402 
2403 	/* Timing div, 250ns/Psys */
2404 	/* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */
2405 	ext_attr->hi_cfg_timing_div =
2406 	    (u16) ((common_attr->sys_clock_freq / 1000) * HI_I2C_DELAY) / 1000;
2407 	/* Clipping */
2408 	if ((ext_attr->hi_cfg_timing_div) > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
2409 		ext_attr->hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
2410 	/* Bridge delay, uses oscilator clock */
2411 	/* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */
2412 	/* SDA brdige delay */
2413 	ext_attr->hi_cfg_bridge_delay =
2414 	    (u16) ((common_attr->osc_clock_freq / 1000) * HI_I2C_BRIDGE_DELAY) /
2415 	    1000;
2416 	/* Clipping */
2417 	if ((ext_attr->hi_cfg_bridge_delay) > SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M)
2418 		ext_attr->hi_cfg_bridge_delay = SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
2419 	/* SCL bridge delay, same as SDA for now */
2420 	ext_attr->hi_cfg_bridge_delay += ((ext_attr->hi_cfg_bridge_delay) <<
2421 				      SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B);
2422 	/* Wakeup key, setting the read flag (as suggest in the documentation) does
2423 	   not always result into a working solution (barebones worked VI2C failed).
2424 	   Not setting the bit works in all cases . */
2425 	ext_attr->hi_cfg_wake_up_key = DRXJ_WAKE_UP_KEY;
2426 	/* port/bridge/power down ctrl */
2427 	ext_attr->hi_cfg_ctrl = (SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE);
2428 	/* transit mode time out delay and watch dog divider */
2429 	ext_attr->hi_cfg_transmit = SIO_HI_RA_RAM_PAR_6__PRE;
2430 
2431 	rc = hi_cfg_command(demod);
2432 	if (rc != 0) {
2433 		pr_err("error %d\n", rc);
2434 		goto rw_error;
2435 	}
2436 
2437 	return 0;
2438 
2439 rw_error:
2440 	return rc;
2441 }
2442 
2443 /*============================================================================*/
2444 /*==                   END HOST INTERFACE FUNCTIONS                         ==*/
2445 /*============================================================================*/
2446 
2447 /*============================================================================*/
2448 /*============================================================================*/
2449 /*==                        AUXILIARY FUNCTIONS                             ==*/
2450 /*============================================================================*/
2451 /*============================================================================*/
2452 
2453 /**
2454 * \fn int get_device_capabilities()
2455 * \brief Get and store device capabilities.
2456 * \param demod  Pointer to demodulator instance.
2457 * \return int.
2458 * \return 0    Success
2459 * \retval -EIO Failure
2460 *
2461 * Depending on pulldowns on MDx pins the following internals are set:
2462 *  * common_attr->osc_clock_freq
2463 *  * ext_attr->has_lna
2464 *  * ext_attr->has_ntsc
2465 *  * ext_attr->has_btsc
2466 *  * ext_attr->has_oob
2467 *
2468 */
2469 static int get_device_capabilities(struct drx_demod_instance *demod)
2470 {
2471 	struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2472 	struct drxj_data *ext_attr = (struct drxj_data *) NULL;
2473 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2474 	u16 sio_pdr_ohw_cfg = 0;
2475 	u32 sio_top_jtagid_lo = 0;
2476 	u16 bid = 0;
2477 	int rc;
2478 
2479 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
2480 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
2481 	dev_addr = demod->my_i2c_dev_addr;
2482 
2483 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2484 	if (rc != 0) {
2485 		pr_err("error %d\n", rc);
2486 		goto rw_error;
2487 	}
2488 	rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg, 0);
2489 	if (rc != 0) {
2490 		pr_err("error %d\n", rc);
2491 		goto rw_error;
2492 	}
2493 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2494 	if (rc != 0) {
2495 		pr_err("error %d\n", rc);
2496 		goto rw_error;
2497 	}
2498 
2499 	switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
2500 	case 0:
2501 		/* ignore (bypass ?) */
2502 		break;
2503 	case 1:
2504 		/* 27 MHz */
2505 		common_attr->osc_clock_freq = 27000;
2506 		break;
2507 	case 2:
2508 		/* 20.25 MHz */
2509 		common_attr->osc_clock_freq = 20250;
2510 		break;
2511 	case 3:
2512 		/* 4 MHz */
2513 		common_attr->osc_clock_freq = 4000;
2514 		break;
2515 	default:
2516 		return -EIO;
2517 	}
2518 
2519 	/*
2520 	   Determine device capabilities
2521 	   Based on pinning v47
2522 	 */
2523 	rc = drxdap_fasi_read_reg32(dev_addr, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo, 0);
2524 	if (rc != 0) {
2525 		pr_err("error %d\n", rc);
2526 		goto rw_error;
2527 	}
2528 	ext_attr->mfx = (u8) ((sio_top_jtagid_lo >> 29) & 0xF);
2529 
2530 	switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
2531 	case 0x31:
2532 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2533 		if (rc != 0) {
2534 			pr_err("error %d\n", rc);
2535 			goto rw_error;
2536 		}
2537 		rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_UIO_IN_HI__A, &bid, 0);
2538 		if (rc != 0) {
2539 			pr_err("error %d\n", rc);
2540 			goto rw_error;
2541 		}
2542 		bid = (bid >> 10) & 0xf;
2543 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2544 		if (rc != 0) {
2545 			pr_err("error %d\n", rc);
2546 			goto rw_error;
2547 		}
2548 
2549 		ext_attr->has_lna = true;
2550 		ext_attr->has_ntsc = false;
2551 		ext_attr->has_btsc = false;
2552 		ext_attr->has_oob = false;
2553 		ext_attr->has_smatx = true;
2554 		ext_attr->has_smarx = false;
2555 		ext_attr->has_gpio = false;
2556 		ext_attr->has_irqn = false;
2557 		break;
2558 	case 0x33:
2559 		ext_attr->has_lna = false;
2560 		ext_attr->has_ntsc = false;
2561 		ext_attr->has_btsc = false;
2562 		ext_attr->has_oob = false;
2563 		ext_attr->has_smatx = true;
2564 		ext_attr->has_smarx = false;
2565 		ext_attr->has_gpio = false;
2566 		ext_attr->has_irqn = false;
2567 		break;
2568 	case 0x45:
2569 		ext_attr->has_lna = true;
2570 		ext_attr->has_ntsc = true;
2571 		ext_attr->has_btsc = false;
2572 		ext_attr->has_oob = false;
2573 		ext_attr->has_smatx = true;
2574 		ext_attr->has_smarx = true;
2575 		ext_attr->has_gpio = true;
2576 		ext_attr->has_irqn = false;
2577 		break;
2578 	case 0x46:
2579 		ext_attr->has_lna = false;
2580 		ext_attr->has_ntsc = true;
2581 		ext_attr->has_btsc = false;
2582 		ext_attr->has_oob = false;
2583 		ext_attr->has_smatx = true;
2584 		ext_attr->has_smarx = true;
2585 		ext_attr->has_gpio = true;
2586 		ext_attr->has_irqn = false;
2587 		break;
2588 	case 0x41:
2589 		ext_attr->has_lna = true;
2590 		ext_attr->has_ntsc = true;
2591 		ext_attr->has_btsc = true;
2592 		ext_attr->has_oob = false;
2593 		ext_attr->has_smatx = true;
2594 		ext_attr->has_smarx = true;
2595 		ext_attr->has_gpio = true;
2596 		ext_attr->has_irqn = false;
2597 		break;
2598 	case 0x43:
2599 		ext_attr->has_lna = false;
2600 		ext_attr->has_ntsc = true;
2601 		ext_attr->has_btsc = true;
2602 		ext_attr->has_oob = false;
2603 		ext_attr->has_smatx = true;
2604 		ext_attr->has_smarx = true;
2605 		ext_attr->has_gpio = true;
2606 		ext_attr->has_irqn = false;
2607 		break;
2608 	case 0x32:
2609 		ext_attr->has_lna = true;
2610 		ext_attr->has_ntsc = false;
2611 		ext_attr->has_btsc = false;
2612 		ext_attr->has_oob = true;
2613 		ext_attr->has_smatx = true;
2614 		ext_attr->has_smarx = true;
2615 		ext_attr->has_gpio = true;
2616 		ext_attr->has_irqn = true;
2617 		break;
2618 	case 0x34:
2619 		ext_attr->has_lna = false;
2620 		ext_attr->has_ntsc = true;
2621 		ext_attr->has_btsc = true;
2622 		ext_attr->has_oob = true;
2623 		ext_attr->has_smatx = true;
2624 		ext_attr->has_smarx = true;
2625 		ext_attr->has_gpio = true;
2626 		ext_attr->has_irqn = true;
2627 		break;
2628 	case 0x42:
2629 		ext_attr->has_lna = true;
2630 		ext_attr->has_ntsc = true;
2631 		ext_attr->has_btsc = true;
2632 		ext_attr->has_oob = true;
2633 		ext_attr->has_smatx = true;
2634 		ext_attr->has_smarx = true;
2635 		ext_attr->has_gpio = true;
2636 		ext_attr->has_irqn = true;
2637 		break;
2638 	case 0x44:
2639 		ext_attr->has_lna = false;
2640 		ext_attr->has_ntsc = true;
2641 		ext_attr->has_btsc = true;
2642 		ext_attr->has_oob = true;
2643 		ext_attr->has_smatx = true;
2644 		ext_attr->has_smarx = true;
2645 		ext_attr->has_gpio = true;
2646 		ext_attr->has_irqn = true;
2647 		break;
2648 	default:
2649 		/* Unknown device variant */
2650 		return -EIO;
2651 		break;
2652 	}
2653 
2654 	return 0;
2655 rw_error:
2656 	return rc;
2657 }
2658 
2659 /**
2660 * \fn int power_up_device()
2661 * \brief Power up device.
2662 * \param demod  Pointer to demodulator instance.
2663 * \return int.
2664 * \return 0    Success
2665 * \retval -EIO Failure, I2C or max retries reached
2666 *
2667 */
2668 
2669 #ifndef DRXJ_MAX_RETRIES_POWERUP
2670 #define DRXJ_MAX_RETRIES_POWERUP 10
2671 #endif
2672 
2673 static int power_up_device(struct drx_demod_instance *demod)
2674 {
2675 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2676 	u8 data = 0;
2677 	u16 retry_count = 0;
2678 	struct i2c_device_addr wake_up_addr;
2679 
2680 	dev_addr = demod->my_i2c_dev_addr;
2681 	wake_up_addr.i2c_addr = DRXJ_WAKE_UP_KEY;
2682 	wake_up_addr.i2c_dev_id = dev_addr->i2c_dev_id;
2683 	wake_up_addr.user_data = dev_addr->user_data;
2684 	/*
2685 	 * I2C access may fail in this case: no ack
2686 	 * dummy write must be used to wake uop device, dummy read must be used to
2687 	 * reset HI state machine (avoiding actual writes)
2688 	 */
2689 	do {
2690 		data = 0;
2691 		drxbsp_i2c_write_read(&wake_up_addr, 1, &data,
2692 				      (struct i2c_device_addr *)(NULL), 0,
2693 				     (u8 *)(NULL));
2694 		msleep(10);
2695 		retry_count++;
2696 	} while ((drxbsp_i2c_write_read
2697 		  ((struct i2c_device_addr *) (NULL), 0, (u8 *)(NULL), dev_addr, 1,
2698 		   &data)
2699 		  != 0) && (retry_count < DRXJ_MAX_RETRIES_POWERUP));
2700 
2701 	/* Need some recovery time .... */
2702 	msleep(10);
2703 
2704 	if (retry_count == DRXJ_MAX_RETRIES_POWERUP)
2705 		return -EIO;
2706 
2707 	return 0;
2708 }
2709 
2710 /*----------------------------------------------------------------------------*/
2711 /* MPEG Output Configuration Functions - begin                                */
2712 /*----------------------------------------------------------------------------*/
2713 /**
2714 * \fn int ctrl_set_cfg_mpeg_output()
2715 * \brief Set MPEG output configuration of the device.
2716 * \param devmod  Pointer to demodulator instance.
2717 * \param cfg_data Pointer to mpeg output configuaration.
2718 * \return int.
2719 *
2720 *  Configure MPEG output parameters.
2721 *
2722 */
2723 static int
2724 ctrl_set_cfg_mpeg_output(struct drx_demod_instance *demod, struct drx_cfg_mpeg_output *cfg_data)
2725 {
2726 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2727 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2728 	struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2729 	int rc;
2730 	u16 fec_oc_reg_mode = 0;
2731 	u16 fec_oc_reg_ipr_mode = 0;
2732 	u16 fec_oc_reg_ipr_invert = 0;
2733 	u32 max_bit_rate = 0;
2734 	u32 rcn_rate = 0;
2735 	u32 nr_bits = 0;
2736 	u16 sio_pdr_md_cfg = 0;
2737 	/* data mask for the output data byte */
2738 	u16 invert_data_mask =
2739 	    FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2740 	    FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2741 	    FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2742 	    FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2743 
2744 	/* check arguments */
2745 	if ((demod == NULL) || (cfg_data == NULL))
2746 		return -EINVAL;
2747 
2748 	dev_addr = demod->my_i2c_dev_addr;
2749 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
2750 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
2751 
2752 	if (cfg_data->enable_mpeg_output == true) {
2753 		/* quick and dirty patch to set MPEG incase current std is not
2754 		   producing MPEG */
2755 		switch (ext_attr->standard) {
2756 		case DRX_STANDARD_8VSB:
2757 		case DRX_STANDARD_ITU_A:
2758 		case DRX_STANDARD_ITU_B:
2759 		case DRX_STANDARD_ITU_C:
2760 			break;
2761 		default:
2762 			return 0;
2763 		}
2764 
2765 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_OCR_INVERT__A, 0, 0);
2766 		if (rc != 0) {
2767 			pr_err("error %d\n", rc);
2768 			goto rw_error;
2769 		}
2770 		switch (ext_attr->standard) {
2771 		case DRX_STANDARD_8VSB:
2772 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, 7, 0);
2773 			if (rc != 0) {
2774 				pr_err("error %d\n", rc);
2775 				goto rw_error;
2776 			}	/* 2048 bytes fifo ram */
2777 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, 10, 0);
2778 			if (rc != 0) {
2779 				pr_err("error %d\n", rc);
2780 				goto rw_error;
2781 			}
2782 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 10, 0);
2783 			if (rc != 0) {
2784 				pr_err("error %d\n", rc);
2785 				goto rw_error;
2786 			}
2787 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, 5, 0);
2788 			if (rc != 0) {
2789 				pr_err("error %d\n", rc);
2790 				goto rw_error;
2791 			}
2792 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, 7, 0);
2793 			if (rc != 0) {
2794 				pr_err("error %d\n", rc);
2795 				goto rw_error;
2796 			}
2797 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 10, 0);
2798 			if (rc != 0) {
2799 				pr_err("error %d\n", rc);
2800 				goto rw_error;
2801 			}
2802 			/* Low Water Mark for synchronization  */
2803 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 3, 0);
2804 			if (rc != 0) {
2805 				pr_err("error %d\n", rc);
2806 				goto rw_error;
2807 			}
2808 			/* High Water Mark for synchronization */
2809 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 5, 0);
2810 			if (rc != 0) {
2811 				pr_err("error %d\n", rc);
2812 				goto rw_error;
2813 			}
2814 			break;
2815 		case DRX_STANDARD_ITU_A:
2816 		case DRX_STANDARD_ITU_C:
2817 			switch (ext_attr->constellation) {
2818 			case DRX_CONSTELLATION_QAM256:
2819 				nr_bits = 8;
2820 				break;
2821 			case DRX_CONSTELLATION_QAM128:
2822 				nr_bits = 7;
2823 				break;
2824 			case DRX_CONSTELLATION_QAM64:
2825 				nr_bits = 6;
2826 				break;
2827 			case DRX_CONSTELLATION_QAM32:
2828 				nr_bits = 5;
2829 				break;
2830 			case DRX_CONSTELLATION_QAM16:
2831 				nr_bits = 4;
2832 				break;
2833 			default:
2834 				return -EIO;
2835 			}	/* ext_attr->constellation */
2836 			/* max_bit_rate = symbol_rate * nr_bits * coef */
2837 			/* coef = 188/204                          */
2838 			max_bit_rate =
2839 			    (ext_attr->curr_symbol_rate / 8) * nr_bits * 188;
2840 			/* pass through as b/c Annex A/c need following settings */
2841 			/* fall-through */
2842 		case DRX_STANDARD_ITU_B:
2843 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, FEC_OC_FCT_USAGE__PRE, 0);
2844 			if (rc != 0) {
2845 				pr_err("error %d\n", rc);
2846 				goto rw_error;
2847 			}
2848 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, FEC_OC_TMD_CTL_UPD_RATE__PRE, 0);
2849 			if (rc != 0) {
2850 				pr_err("error %d\n", rc);
2851 				goto rw_error;
2852 			}
2853 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 5, 0);
2854 			if (rc != 0) {
2855 				pr_err("error %d\n", rc);
2856 				goto rw_error;
2857 			}
2858 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, FEC_OC_AVR_PARM_A__PRE, 0);
2859 			if (rc != 0) {
2860 				pr_err("error %d\n", rc);
2861 				goto rw_error;
2862 			}
2863 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, FEC_OC_AVR_PARM_B__PRE, 0);
2864 			if (rc != 0) {
2865 				pr_err("error %d\n", rc);
2866 				goto rw_error;
2867 			}
2868 			if (cfg_data->static_clk == true) {
2869 				rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 0xD, 0);
2870 				if (rc != 0) {
2871 					pr_err("error %d\n", rc);
2872 					goto rw_error;
2873 				}
2874 			} else {
2875 				rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, FEC_OC_RCN_GAIN__PRE, 0);
2876 				if (rc != 0) {
2877 					pr_err("error %d\n", rc);
2878 					goto rw_error;
2879 				}
2880 			}
2881 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 2, 0);
2882 			if (rc != 0) {
2883 				pr_err("error %d\n", rc);
2884 				goto rw_error;
2885 			}
2886 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 12, 0);
2887 			if (rc != 0) {
2888 				pr_err("error %d\n", rc);
2889 				goto rw_error;
2890 			}
2891 			break;
2892 		default:
2893 			break;
2894 		}		/* swtich (standard) */
2895 
2896 		/* Check insertion of the Reed-Solomon parity bytes */
2897 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
2898 		if (rc != 0) {
2899 			pr_err("error %d\n", rc);
2900 			goto rw_error;
2901 		}
2902 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode, 0);
2903 		if (rc != 0) {
2904 			pr_err("error %d\n", rc);
2905 			goto rw_error;
2906 		}
2907 		if (cfg_data->insert_rs_byte == true) {
2908 			/* enable parity symbol forward */
2909 			fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
2910 			/* MVAL disable during parity bytes */
2911 			fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2912 			switch (ext_attr->standard) {
2913 			case DRX_STANDARD_8VSB:
2914 				rcn_rate = 0x004854D3;
2915 				break;
2916 			case DRX_STANDARD_ITU_B:
2917 				fec_oc_reg_mode |= FEC_OC_MODE_TRANSPARENT__M;
2918 				switch (ext_attr->constellation) {
2919 				case DRX_CONSTELLATION_QAM256:
2920 					rcn_rate = 0x008945E7;
2921 					break;
2922 				case DRX_CONSTELLATION_QAM64:
2923 					rcn_rate = 0x005F64D4;
2924 					break;
2925 				default:
2926 					return -EIO;
2927 				}
2928 				break;
2929 			case DRX_STANDARD_ITU_A:
2930 			case DRX_STANDARD_ITU_C:
2931 				/* insert_rs_byte = true -> coef = 188/188 -> 1, RS bits are in MPEG output */
2932 				rcn_rate =
2933 				    (frac28
2934 				     (max_bit_rate,
2935 				      (u32) (common_attr->sys_clock_freq / 8))) /
2936 				    188;
2937 				break;
2938 			default:
2939 				return -EIO;
2940 			}	/* ext_attr->standard */
2941 		} else {	/* insert_rs_byte == false */
2942 
2943 			/* disable parity symbol forward */
2944 			fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
2945 			/* MVAL enable during parity bytes */
2946 			fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2947 			switch (ext_attr->standard) {
2948 			case DRX_STANDARD_8VSB:
2949 				rcn_rate = 0x0041605C;
2950 				break;
2951 			case DRX_STANDARD_ITU_B:
2952 				fec_oc_reg_mode &= (~FEC_OC_MODE_TRANSPARENT__M);
2953 				switch (ext_attr->constellation) {
2954 				case DRX_CONSTELLATION_QAM256:
2955 					rcn_rate = 0x0082D6A0;
2956 					break;
2957 				case DRX_CONSTELLATION_QAM64:
2958 					rcn_rate = 0x005AEC1A;
2959 					break;
2960 				default:
2961 					return -EIO;
2962 				}
2963 				break;
2964 			case DRX_STANDARD_ITU_A:
2965 			case DRX_STANDARD_ITU_C:
2966 				/* insert_rs_byte = false -> coef = 188/204, RS bits not in MPEG output */
2967 				rcn_rate =
2968 				    (frac28
2969 				     (max_bit_rate,
2970 				      (u32) (common_attr->sys_clock_freq / 8))) /
2971 				    204;
2972 				break;
2973 			default:
2974 				return -EIO;
2975 			}	/* ext_attr->standard */
2976 		}
2977 
2978 		if (cfg_data->enable_parallel == true) {	/* MPEG data output is parallel -> clear ipr_mode[0] */
2979 			fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2980 		} else {	/* MPEG data output is serial -> set ipr_mode[0] */
2981 			fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
2982 		}
2983 
2984 		/* Control slective inversion of output bits */
2985 		if (cfg_data->invert_data == true)
2986 			fec_oc_reg_ipr_invert |= invert_data_mask;
2987 		else
2988 			fec_oc_reg_ipr_invert &= (~(invert_data_mask));
2989 
2990 		if (cfg_data->invert_err == true)
2991 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
2992 		else
2993 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2994 
2995 		if (cfg_data->invert_str == true)
2996 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
2997 		else
2998 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2999 
3000 		if (cfg_data->invert_val == true)
3001 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
3002 		else
3003 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
3004 
3005 		if (cfg_data->invert_clk == true)
3006 			fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
3007 		else
3008 			fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
3009 
3010 
3011 		if (cfg_data->static_clk == true) {	/* Static mode */
3012 			u32 dto_rate = 0;
3013 			u32 bit_rate = 0;
3014 			u16 fec_oc_dto_burst_len = 0;
3015 			u16 fec_oc_dto_period = 0;
3016 
3017 			fec_oc_dto_burst_len = FEC_OC_DTO_BURST_LEN__PRE;
3018 
3019 			switch (ext_attr->standard) {
3020 			case DRX_STANDARD_8VSB:
3021 				fec_oc_dto_period = 4;
3022 				if (cfg_data->insert_rs_byte == true)
3023 					fec_oc_dto_burst_len = 208;
3024 				break;
3025 			case DRX_STANDARD_ITU_A:
3026 				{
3027 					u32 symbol_rate_th = 6400000;
3028 					if (cfg_data->insert_rs_byte == true) {
3029 						fec_oc_dto_burst_len = 204;
3030 						symbol_rate_th = 5900000;
3031 					}
3032 					if (ext_attr->curr_symbol_rate >=
3033 					    symbol_rate_th) {
3034 						fec_oc_dto_period = 0;
3035 					} else {
3036 						fec_oc_dto_period = 1;
3037 					}
3038 				}
3039 				break;
3040 			case DRX_STANDARD_ITU_B:
3041 				fec_oc_dto_period = 1;
3042 				if (cfg_data->insert_rs_byte == true)
3043 					fec_oc_dto_burst_len = 128;
3044 				break;
3045 			case DRX_STANDARD_ITU_C:
3046 				fec_oc_dto_period = 1;
3047 				if (cfg_data->insert_rs_byte == true)
3048 					fec_oc_dto_burst_len = 204;
3049 				break;
3050 			default:
3051 				return -EIO;
3052 			}
3053 			bit_rate =
3054 			    common_attr->sys_clock_freq * 1000 / (fec_oc_dto_period +
3055 							       2);
3056 			dto_rate =
3057 			    frac28(bit_rate, common_attr->sys_clock_freq * 1000);
3058 			dto_rate >>= 3;
3059 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_HI__A, (u16)((dto_rate >> 16) & FEC_OC_DTO_RATE_HI__M), 0);
3060 			if (rc != 0) {
3061 				pr_err("error %d\n", rc);
3062 				goto rw_error;
3063 			}
3064 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_LO__A, (u16)(dto_rate & FEC_OC_DTO_RATE_LO_RATE_LO__M), 0);
3065 			if (rc != 0) {
3066 				pr_err("error %d\n", rc);
3067 				goto rw_error;
3068 			}
3069 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M | FEC_OC_DTO_MODE_OFFSET_ENABLE__M, 0);
3070 			if (rc != 0) {
3071 				pr_err("error %d\n", rc);
3072 				goto rw_error;
3073 			}
3074 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, FEC_OC_FCT_MODE_RAT_ENA__M | FEC_OC_FCT_MODE_VIRT_ENA__M, 0);
3075 			if (rc != 0) {
3076 				pr_err("error %d\n", rc);
3077 				goto rw_error;
3078 			}
3079 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len, 0);
3080 			if (rc != 0) {
3081 				pr_err("error %d\n", rc);
3082 				goto rw_error;
3083 			}
3084 			if (ext_attr->mpeg_output_clock_rate != DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO)
3085 				fec_oc_dto_period = ext_attr->mpeg_output_clock_rate - 1;
3086 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period, 0);
3087 			if (rc != 0) {
3088 				pr_err("error %d\n", rc);
3089 				goto rw_error;
3090 			}
3091 		} else {	/* Dynamic mode */
3092 
3093 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M, 0);
3094 			if (rc != 0) {
3095 				pr_err("error %d\n", rc);
3096 				goto rw_error;
3097 			}
3098 			rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, 0, 0);
3099 			if (rc != 0) {
3100 				pr_err("error %d\n", rc);
3101 				goto rw_error;
3102 			}
3103 		}
3104 
3105 		rc = drxdap_fasi_write_reg32(dev_addr, FEC_OC_RCN_CTL_RATE_LO__A, rcn_rate, 0);
3106 		if (rc != 0) {
3107 			pr_err("error %d\n", rc);
3108 			goto rw_error;
3109 		}
3110 
3111 		/* Write appropriate registers with requested configuration */
3112 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode, 0);
3113 		if (rc != 0) {
3114 			pr_err("error %d\n", rc);
3115 			goto rw_error;
3116 		}
3117 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode, 0);
3118 		if (rc != 0) {
3119 			pr_err("error %d\n", rc);
3120 			goto rw_error;
3121 		}
3122 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert, 0);
3123 		if (rc != 0) {
3124 			pr_err("error %d\n", rc);
3125 			goto rw_error;
3126 		}
3127 
3128 		/* enabling for both parallel and serial now */
3129 		/*  Write magic word to enable pdr reg write */
3130 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3131 		if (rc != 0) {
3132 			pr_err("error %d\n", rc);
3133 			goto rw_error;
3134 		}
3135 		/*  Set MPEG TS pads to outputmode */
3136 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0013, 0);
3137 		if (rc != 0) {
3138 			pr_err("error %d\n", rc);
3139 			goto rw_error;
3140 		}
3141 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0013, 0);
3142 		if (rc != 0) {
3143 			pr_err("error %d\n", rc);
3144 			goto rw_error;
3145 		}
3146 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, MPEG_OUTPUT_CLK_DRIVE_STRENGTH << SIO_PDR_MCLK_CFG_DRIVE__B | 0x03 << SIO_PDR_MCLK_CFG_MODE__B, 0);
3147 		if (rc != 0) {
3148 			pr_err("error %d\n", rc);
3149 			goto rw_error;
3150 		}
3151 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0013, 0);
3152 		if (rc != 0) {
3153 			pr_err("error %d\n", rc);
3154 			goto rw_error;
3155 		}
3156 		sio_pdr_md_cfg =
3157 		    MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH <<
3158 		    SIO_PDR_MD0_CFG_DRIVE__B | 0x03 << SIO_PDR_MD0_CFG_MODE__B;
3159 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3160 		if (rc != 0) {
3161 			pr_err("error %d\n", rc);
3162 			goto rw_error;
3163 		}
3164 		if (cfg_data->enable_parallel == true) {	/* MPEG data output is parallel -> set MD1 to MD7 to output mode */
3165 			sio_pdr_md_cfg =
3166 			    MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH <<
3167 			    SIO_PDR_MD0_CFG_DRIVE__B | 0x03 <<
3168 			    SIO_PDR_MD0_CFG_MODE__B;
3169 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3170 			if (rc != 0) {
3171 				pr_err("error %d\n", rc);
3172 				goto rw_error;
3173 			}
3174 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, sio_pdr_md_cfg, 0);
3175 			if (rc != 0) {
3176 				pr_err("error %d\n", rc);
3177 				goto rw_error;
3178 			}
3179 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, sio_pdr_md_cfg, 0);
3180 			if (rc != 0) {
3181 				pr_err("error %d\n", rc);
3182 				goto rw_error;
3183 			}
3184 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, sio_pdr_md_cfg, 0);
3185 			if (rc != 0) {
3186 				pr_err("error %d\n", rc);
3187 				goto rw_error;
3188 			}
3189 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, sio_pdr_md_cfg, 0);
3190 			if (rc != 0) {
3191 				pr_err("error %d\n", rc);
3192 				goto rw_error;
3193 			}
3194 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, sio_pdr_md_cfg, 0);
3195 			if (rc != 0) {
3196 				pr_err("error %d\n", rc);
3197 				goto rw_error;
3198 			}
3199 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, sio_pdr_md_cfg, 0);
3200 			if (rc != 0) {
3201 				pr_err("error %d\n", rc);
3202 				goto rw_error;
3203 			}
3204 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, sio_pdr_md_cfg, 0);
3205 			if (rc != 0) {
3206 				pr_err("error %d\n", rc);
3207 				goto rw_error;
3208 			}
3209 		} else {	/* MPEG data output is serial -> set MD1 to MD7 to tri-state */
3210 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3211 			if (rc != 0) {
3212 				pr_err("error %d\n", rc);
3213 				goto rw_error;
3214 			}
3215 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3216 			if (rc != 0) {
3217 				pr_err("error %d\n", rc);
3218 				goto rw_error;
3219 			}
3220 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3221 			if (rc != 0) {
3222 				pr_err("error %d\n", rc);
3223 				goto rw_error;
3224 			}
3225 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3226 			if (rc != 0) {
3227 				pr_err("error %d\n", rc);
3228 				goto rw_error;
3229 			}
3230 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3231 			if (rc != 0) {
3232 				pr_err("error %d\n", rc);
3233 				goto rw_error;
3234 			}
3235 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3236 			if (rc != 0) {
3237 				pr_err("error %d\n", rc);
3238 				goto rw_error;
3239 			}
3240 			rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3241 			if (rc != 0) {
3242 				pr_err("error %d\n", rc);
3243 				goto rw_error;
3244 			}
3245 		}
3246 		/*  Enable Monitor Bus output over MPEG pads and ctl input */
3247 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3248 		if (rc != 0) {
3249 			pr_err("error %d\n", rc);
3250 			goto rw_error;
3251 		}
3252 		/*  Write nomagic word to enable pdr reg write */
3253 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3254 		if (rc != 0) {
3255 			pr_err("error %d\n", rc);
3256 			goto rw_error;
3257 		}
3258 	} else {
3259 		/*  Write magic word to enable pdr reg write */
3260 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3261 		if (rc != 0) {
3262 			pr_err("error %d\n", rc);
3263 			goto rw_error;
3264 		}
3265 		/*  Set MPEG TS pads to inputmode */
3266 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0000, 0);
3267 		if (rc != 0) {
3268 			pr_err("error %d\n", rc);
3269 			goto rw_error;
3270 		}
3271 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0000, 0);
3272 		if (rc != 0) {
3273 			pr_err("error %d\n", rc);
3274 			goto rw_error;
3275 		}
3276 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, 0x0000, 0);
3277 		if (rc != 0) {
3278 			pr_err("error %d\n", rc);
3279 			goto rw_error;
3280 		}
3281 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0000, 0);
3282 		if (rc != 0) {
3283 			pr_err("error %d\n", rc);
3284 			goto rw_error;
3285 		}
3286 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, 0x0000, 0);
3287 		if (rc != 0) {
3288 			pr_err("error %d\n", rc);
3289 			goto rw_error;
3290 		}
3291 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3292 		if (rc != 0) {
3293 			pr_err("error %d\n", rc);
3294 			goto rw_error;
3295 		}
3296 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3297 		if (rc != 0) {
3298 			pr_err("error %d\n", rc);
3299 			goto rw_error;
3300 		}
3301 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3302 		if (rc != 0) {
3303 			pr_err("error %d\n", rc);
3304 			goto rw_error;
3305 		}
3306 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3307 		if (rc != 0) {
3308 			pr_err("error %d\n", rc);
3309 			goto rw_error;
3310 		}
3311 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3312 		if (rc != 0) {
3313 			pr_err("error %d\n", rc);
3314 			goto rw_error;
3315 		}
3316 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3317 		if (rc != 0) {
3318 			pr_err("error %d\n", rc);
3319 			goto rw_error;
3320 		}
3321 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3322 		if (rc != 0) {
3323 			pr_err("error %d\n", rc);
3324 			goto rw_error;
3325 		}
3326 		/* Enable Monitor Bus output over MPEG pads and ctl input */
3327 		rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3328 		if (rc != 0) {
3329 			pr_err("error %d\n", rc);
3330 			goto rw_error;
3331 		}
3332 		/* Write nomagic word to enable pdr reg write */
3333 		rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3334 		if (rc != 0) {
3335 			pr_err("error %d\n", rc);
3336 			goto rw_error;
3337 		}
3338 	}
3339 
3340 	/* save values for restore after re-acquire */
3341 	common_attr->mpeg_cfg.enable_mpeg_output = cfg_data->enable_mpeg_output;
3342 
3343 	return 0;
3344 rw_error:
3345 	return rc;
3346 }
3347 
3348 /*----------------------------------------------------------------------------*/
3349 
3350 
3351 /*----------------------------------------------------------------------------*/
3352 /* MPEG Output Configuration Functions - end                                  */
3353 /*----------------------------------------------------------------------------*/
3354 
3355 /*----------------------------------------------------------------------------*/
3356 /* miscellaneous configurations - begin                           */
3357 /*----------------------------------------------------------------------------*/
3358 
3359 /**
3360 * \fn int set_mpegtei_handling()
3361 * \brief Activate MPEG TEI handling settings.
3362 * \param devmod  Pointer to demodulator instance.
3363 * \return int.
3364 *
3365 * This routine should be called during a set channel of QAM/VSB
3366 *
3367 */
3368 static int set_mpegtei_handling(struct drx_demod_instance *demod)
3369 {
3370 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3371 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3372 	int rc;
3373 	u16 fec_oc_dpr_mode = 0;
3374 	u16 fec_oc_snc_mode = 0;
3375 	u16 fec_oc_ems_mode = 0;
3376 
3377 	dev_addr = demod->my_i2c_dev_addr;
3378 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3379 
3380 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_DPR_MODE__A, &fec_oc_dpr_mode, 0);
3381 	if (rc != 0) {
3382 		pr_err("error %d\n", rc);
3383 		goto rw_error;
3384 	}
3385 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
3386 	if (rc != 0) {
3387 		pr_err("error %d\n", rc);
3388 		goto rw_error;
3389 	}
3390 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_EMS_MODE__A, &fec_oc_ems_mode, 0);
3391 	if (rc != 0) {
3392 		pr_err("error %d\n", rc);
3393 		goto rw_error;
3394 	}
3395 
3396 	/* reset to default, allow TEI bit to be changed */
3397 	fec_oc_dpr_mode &= (~FEC_OC_DPR_MODE_ERR_DISABLE__M);
3398 	fec_oc_snc_mode &= (~(FEC_OC_SNC_MODE_ERROR_CTL__M |
3399 			   FEC_OC_SNC_MODE_CORR_DISABLE__M));
3400 	fec_oc_ems_mode &= (~FEC_OC_EMS_MODE_MODE__M);
3401 
3402 	if (ext_attr->disable_te_ihandling) {
3403 		/* do not change TEI bit */
3404 		fec_oc_dpr_mode |= FEC_OC_DPR_MODE_ERR_DISABLE__M;
3405 		fec_oc_snc_mode |= FEC_OC_SNC_MODE_CORR_DISABLE__M |
3406 		    ((0x2) << (FEC_OC_SNC_MODE_ERROR_CTL__B));
3407 		fec_oc_ems_mode |= ((0x01) << (FEC_OC_EMS_MODE_MODE__B));
3408 	}
3409 
3410 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DPR_MODE__A, fec_oc_dpr_mode, 0);
3411 	if (rc != 0) {
3412 		pr_err("error %d\n", rc);
3413 		goto rw_error;
3414 	}
3415 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode, 0);
3416 	if (rc != 0) {
3417 		pr_err("error %d\n", rc);
3418 		goto rw_error;
3419 	}
3420 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_EMS_MODE__A, fec_oc_ems_mode, 0);
3421 	if (rc != 0) {
3422 		pr_err("error %d\n", rc);
3423 		goto rw_error;
3424 	}
3425 
3426 	return 0;
3427 rw_error:
3428 	return rc;
3429 }
3430 
3431 /*----------------------------------------------------------------------------*/
3432 /**
3433 * \fn int bit_reverse_mpeg_output()
3434 * \brief Set MPEG output bit-endian settings.
3435 * \param devmod  Pointer to demodulator instance.
3436 * \return int.
3437 *
3438 * This routine should be called during a set channel of QAM/VSB
3439 *
3440 */
3441 static int bit_reverse_mpeg_output(struct drx_demod_instance *demod)
3442 {
3443 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3444 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3445 	int rc;
3446 	u16 fec_oc_ipr_mode = 0;
3447 
3448 	dev_addr = demod->my_i2c_dev_addr;
3449 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3450 
3451 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode, 0);
3452 	if (rc != 0) {
3453 		pr_err("error %d\n", rc);
3454 		goto rw_error;
3455 	}
3456 
3457 	/* reset to default (normal bit order) */
3458 	fec_oc_ipr_mode &= (~FEC_OC_IPR_MODE_REVERSE_ORDER__M);
3459 
3460 	if (ext_attr->bit_reverse_mpeg_outout)
3461 		fec_oc_ipr_mode |= FEC_OC_IPR_MODE_REVERSE_ORDER__M;
3462 
3463 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode, 0);
3464 	if (rc != 0) {
3465 		pr_err("error %d\n", rc);
3466 		goto rw_error;
3467 	}
3468 
3469 	return 0;
3470 rw_error:
3471 	return rc;
3472 }
3473 
3474 /*----------------------------------------------------------------------------*/
3475 /**
3476 * \fn int set_mpeg_start_width()
3477 * \brief Set MPEG start width.
3478 * \param devmod  Pointer to demodulator instance.
3479 * \return int.
3480 *
3481 * This routine should be called during a set channel of QAM/VSB
3482 *
3483 */
3484 static int set_mpeg_start_width(struct drx_demod_instance *demod)
3485 {
3486 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3487 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3488 	struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
3489 	int rc;
3490 	u16 fec_oc_comm_mb = 0;
3491 
3492 	dev_addr = demod->my_i2c_dev_addr;
3493 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3494 	common_attr = demod->my_common_attr;
3495 
3496 	if ((common_attr->mpeg_cfg.static_clk == true)
3497 	    && (common_attr->mpeg_cfg.enable_parallel == false)) {
3498 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_COMM_MB__A, &fec_oc_comm_mb, 0);
3499 		if (rc != 0) {
3500 			pr_err("error %d\n", rc);
3501 			goto rw_error;
3502 		}
3503 		fec_oc_comm_mb &= ~FEC_OC_COMM_MB_CTL_ON;
3504 		if (ext_attr->mpeg_start_width == DRXJ_MPEG_START_WIDTH_8CLKCYC)
3505 			fec_oc_comm_mb |= FEC_OC_COMM_MB_CTL_ON;
3506 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_COMM_MB__A, fec_oc_comm_mb, 0);
3507 		if (rc != 0) {
3508 			pr_err("error %d\n", rc);
3509 			goto rw_error;
3510 		}
3511 	}
3512 
3513 	return 0;
3514 rw_error:
3515 	return rc;
3516 }
3517 
3518 /*----------------------------------------------------------------------------*/
3519 /* miscellaneous configurations - end                             */
3520 /*----------------------------------------------------------------------------*/
3521 
3522 /*----------------------------------------------------------------------------*/
3523 /* UIO Configuration Functions - begin                                        */
3524 /*----------------------------------------------------------------------------*/
3525 /**
3526 * \fn int ctrl_set_uio_cfg()
3527 * \brief Configure modus oprandi UIO.
3528 * \param demod Pointer to demodulator instance.
3529 * \param uio_cfg Pointer to a configuration setting for a certain UIO.
3530 * \return int.
3531 */
3532 static int ctrl_set_uio_cfg(struct drx_demod_instance *demod, struct drxuio_cfg *uio_cfg)
3533 {
3534 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3535 	int rc;
3536 
3537 	if ((uio_cfg == NULL) || (demod == NULL))
3538 		return -EINVAL;
3539 
3540 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3541 
3542 	/*  Write magic word to enable pdr reg write               */
3543 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3544 	if (rc != 0) {
3545 		pr_err("error %d\n", rc);
3546 		goto rw_error;
3547 	}
3548 	switch (uio_cfg->uio) {
3549       /*====================================================================*/
3550 	case DRX_UIO1:
3551 		/* DRX_UIO1: SMA_TX UIO-1 */
3552 		if (!ext_attr->has_smatx)
3553 			return -EIO;
3554 		switch (uio_cfg->mode) {
3555 		case DRX_UIO_MODE_FIRMWARE_SMA:	/* falltrough */
3556 		case DRX_UIO_MODE_FIRMWARE_SAW:	/* falltrough */
3557 		case DRX_UIO_MODE_READWRITE:
3558 			ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3559 			break;
3560 		case DRX_UIO_MODE_DISABLE:
3561 			ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3562 			/* pad configuration register is set 0 - input mode */
3563 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0, 0);
3564 			if (rc != 0) {
3565 				pr_err("error %d\n", rc);
3566 				goto rw_error;
3567 			}
3568 			break;
3569 		default:
3570 			return -EINVAL;
3571 		}		/* switch ( uio_cfg->mode ) */
3572 		break;
3573       /*====================================================================*/
3574 	case DRX_UIO2:
3575 		/* DRX_UIO2: SMA_RX UIO-2 */
3576 		if (!ext_attr->has_smarx)
3577 			return -EIO;
3578 		switch (uio_cfg->mode) {
3579 		case DRX_UIO_MODE_FIRMWARE0:	/* falltrough */
3580 		case DRX_UIO_MODE_READWRITE:
3581 			ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3582 			break;
3583 		case DRX_UIO_MODE_DISABLE:
3584 			ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3585 			/* pad configuration register is set 0 - input mode */
3586 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, 0, 0);
3587 			if (rc != 0) {
3588 				pr_err("error %d\n", rc);
3589 				goto rw_error;
3590 			}
3591 			break;
3592 		default:
3593 			return -EINVAL;
3594 			break;
3595 		}		/* switch ( uio_cfg->mode ) */
3596 		break;
3597       /*====================================================================*/
3598 	case DRX_UIO3:
3599 		/* DRX_UIO3: GPIO UIO-3 */
3600 		if (!ext_attr->has_gpio)
3601 			return -EIO;
3602 		switch (uio_cfg->mode) {
3603 		case DRX_UIO_MODE_FIRMWARE0:	/* falltrough */
3604 		case DRX_UIO_MODE_READWRITE:
3605 			ext_attr->uio_gpio_mode = uio_cfg->mode;
3606 			break;
3607 		case DRX_UIO_MODE_DISABLE:
3608 			ext_attr->uio_gpio_mode = uio_cfg->mode;
3609 			/* pad configuration register is set 0 - input mode */
3610 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, 0, 0);
3611 			if (rc != 0) {
3612 				pr_err("error %d\n", rc);
3613 				goto rw_error;
3614 			}
3615 			break;
3616 		default:
3617 			return -EINVAL;
3618 			break;
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:	/* falltrough */
3640 		default:
3641 			return -EINVAL;
3642 			break;
3643 		}		/* switch ( uio_cfg->mode ) */
3644 		break;
3645       /*====================================================================*/
3646 	default:
3647 		return -EINVAL;
3648 	}			/* switch ( uio_cfg->uio ) */
3649 
3650 	/*  Write magic word to disable pdr reg write               */
3651 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3652 	if (rc != 0) {
3653 		pr_err("error %d\n", rc);
3654 		goto rw_error;
3655 	}
3656 
3657 	return 0;
3658 rw_error:
3659 	return rc;
3660 }
3661 
3662 /**
3663 * \fn int ctrl_uio_write()
3664 * \brief Write to a UIO.
3665 * \param demod Pointer to demodulator instance.
3666 * \param uio_data Pointer to data container for a certain UIO.
3667 * \return int.
3668 */
3669 static int
3670 ctrl_uio_write(struct drx_demod_instance *demod, struct drxuio_data *uio_data)
3671 {
3672 	struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3673 	int rc;
3674 	u16 pin_cfg_value = 0;
3675 	u16 value = 0;
3676 
3677 	if ((uio_data == NULL) || (demod == NULL))
3678 		return -EINVAL;
3679 
3680 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3681 
3682 	/*  Write magic word to enable pdr reg write               */
3683 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3684 	if (rc != 0) {
3685 		pr_err("error %d\n", rc);
3686 		goto rw_error;
3687 	}
3688 	switch (uio_data->uio) {
3689       /*====================================================================*/
3690 	case DRX_UIO1:
3691 		/* DRX_UIO1: SMA_TX UIO-1 */
3692 		if (!ext_attr->has_smatx)
3693 			return -EIO;
3694 		if ((ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_READWRITE)
3695 		    && (ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_FIRMWARE_SAW)) {
3696 			return -EIO;
3697 		}
3698 		pin_cfg_value = 0;
3699 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3700 		pin_cfg_value |= 0x0113;
3701 		/* io_pad_cfg_mode output mode is drive always */
3702 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
3703 
3704 		/* write to io pad configuration register - output mode */
3705 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, pin_cfg_value, 0);
3706 		if (rc != 0) {
3707 			pr_err("error %d\n", rc);
3708 			goto rw_error;
3709 		}
3710 
3711 		/* use corresponding bit in io data output registar */
3712 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3713 		if (rc != 0) {
3714 			pr_err("error %d\n", rc);
3715 			goto rw_error;
3716 		}
3717 		if (!uio_data->value)
3718 			value &= 0x7FFF;	/* write zero to 15th bit - 1st UIO */
3719 		else
3720 			value |= 0x8000;	/* write one to 15th bit - 1st UIO */
3721 
3722 		/* write back to io data output register */
3723 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3724 		if (rc != 0) {
3725 			pr_err("error %d\n", rc);
3726 			goto rw_error;
3727 		}
3728 		break;
3729    /*======================================================================*/
3730 	case DRX_UIO2:
3731 		/* DRX_UIO2: SMA_RX UIO-2 */
3732 		if (!ext_attr->has_smarx)
3733 			return -EIO;
3734 		if (ext_attr->uio_sma_rx_mode != DRX_UIO_MODE_READWRITE)
3735 			return -EIO;
3736 
3737 		pin_cfg_value = 0;
3738 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3739 		pin_cfg_value |= 0x0113;
3740 		/* io_pad_cfg_mode output mode is drive always */
3741 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
3742 
3743 		/* write to io pad configuration register - output mode */
3744 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, pin_cfg_value, 0);
3745 		if (rc != 0) {
3746 			pr_err("error %d\n", rc);
3747 			goto rw_error;
3748 		}
3749 
3750 		/* use corresponding bit in io data output registar */
3751 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3752 		if (rc != 0) {
3753 			pr_err("error %d\n", rc);
3754 			goto rw_error;
3755 		}
3756 		if (!uio_data->value)
3757 			value &= 0xBFFF;	/* write zero to 14th bit - 2nd UIO */
3758 		else
3759 			value |= 0x4000;	/* write one to 14th bit - 2nd UIO */
3760 
3761 		/* write back to io data output register */
3762 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3763 		if (rc != 0) {
3764 			pr_err("error %d\n", rc);
3765 			goto rw_error;
3766 		}
3767 		break;
3768    /*====================================================================*/
3769 	case DRX_UIO3:
3770 		/* DRX_UIO3: ASEL UIO-3 */
3771 		if (!ext_attr->has_gpio)
3772 			return -EIO;
3773 		if (ext_attr->uio_gpio_mode != DRX_UIO_MODE_READWRITE)
3774 			return -EIO;
3775 
3776 		pin_cfg_value = 0;
3777 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3778 		pin_cfg_value |= 0x0113;
3779 		/* io_pad_cfg_mode output mode is drive always */
3780 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
3781 
3782 		/* write to io pad configuration register - output mode */
3783 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, pin_cfg_value, 0);
3784 		if (rc != 0) {
3785 			pr_err("error %d\n", rc);
3786 			goto rw_error;
3787 		}
3788 
3789 		/* use corresponding bit in io data output registar */
3790 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, &value, 0);
3791 		if (rc != 0) {
3792 			pr_err("error %d\n", rc);
3793 			goto rw_error;
3794 		}
3795 		if (!uio_data->value)
3796 			value &= 0xFFFB;	/* write zero to 2nd bit - 3rd UIO */
3797 		else
3798 			value |= 0x0004;	/* write one to 2nd bit - 3rd UIO */
3799 
3800 		/* write back to io data output register */
3801 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, value, 0);
3802 		if (rc != 0) {
3803 			pr_err("error %d\n", rc);
3804 			goto rw_error;
3805 		}
3806 		break;
3807    /*=====================================================================*/
3808 	case DRX_UIO4:
3809 		/* DRX_UIO4: IRQN UIO-4 */
3810 		if (!ext_attr->has_irqn)
3811 			return -EIO;
3812 
3813 		if (ext_attr->uio_irqn_mode != DRX_UIO_MODE_READWRITE)
3814 			return -EIO;
3815 
3816 		pin_cfg_value = 0;
3817 		/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3818 		pin_cfg_value |= 0x0113;
3819 		/* io_pad_cfg_mode output mode is drive always */
3820 		/* io_pad_cfg_drive is set to power 2 (23 mA) */
3821 
3822 		/* write to io pad configuration register - output mode */
3823 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, pin_cfg_value, 0);
3824 		if (rc != 0) {
3825 			pr_err("error %d\n", rc);
3826 			goto rw_error;
3827 		}
3828 
3829 		/* use corresponding bit in io data output registar */
3830 		rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3831 		if (rc != 0) {
3832 			pr_err("error %d\n", rc);
3833 			goto rw_error;
3834 		}
3835 		if (uio_data->value == false)
3836 			value &= 0xEFFF;	/* write zero to 12th bit - 4th UIO */
3837 		else
3838 			value |= 0x1000;	/* write one to 12th bit - 4th UIO */
3839 
3840 		/* write back to io data output register */
3841 		rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3842 		if (rc != 0) {
3843 			pr_err("error %d\n", rc);
3844 			goto rw_error;
3845 		}
3846 		break;
3847       /*=====================================================================*/
3848 	default:
3849 		return -EINVAL;
3850 	}			/* switch ( uio_data->uio ) */
3851 
3852 	/*  Write magic word to disable pdr reg write               */
3853 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3854 	if (rc != 0) {
3855 		pr_err("error %d\n", rc);
3856 		goto rw_error;
3857 	}
3858 
3859 	return 0;
3860 rw_error:
3861 	return rc;
3862 }
3863 
3864 /*---------------------------------------------------------------------------*/
3865 /* UIO Configuration Functions - end                                         */
3866 /*---------------------------------------------------------------------------*/
3867 
3868 /*----------------------------------------------------------------------------*/
3869 /* I2C Bridge Functions - begin                                               */
3870 /*----------------------------------------------------------------------------*/
3871 /**
3872 * \fn int ctrl_i2c_bridge()
3873 * \brief Open or close the I2C switch to tuner.
3874 * \param demod Pointer to demodulator instance.
3875 * \param bridge_closed Pointer to bool indication if bridge is closed not.
3876 * \return int.
3877 
3878 */
3879 static int
3880 ctrl_i2c_bridge(struct drx_demod_instance *demod, bool *bridge_closed)
3881 {
3882 	struct drxj_hi_cmd hi_cmd;
3883 	u16 result = 0;
3884 
3885 	/* check arguments */
3886 	if (bridge_closed == NULL)
3887 		return -EINVAL;
3888 
3889 	hi_cmd.cmd = SIO_HI_RA_RAM_CMD_BRDCTRL;
3890 	hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
3891 	if (*bridge_closed)
3892 		hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED;
3893 	else
3894 		hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN;
3895 
3896 	return hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
3897 }
3898 
3899 /*----------------------------------------------------------------------------*/
3900 /* I2C Bridge Functions - end                                                 */
3901 /*----------------------------------------------------------------------------*/
3902 
3903 /*----------------------------------------------------------------------------*/
3904 /* Smart antenna Functions - begin                                            */
3905 /*----------------------------------------------------------------------------*/
3906 /**
3907 * \fn int smart_ant_init()
3908 * \brief Initialize Smart Antenna.
3909 * \param pointer to struct drx_demod_instance.
3910 * \return int.
3911 *
3912 */
3913 static int smart_ant_init(struct drx_demod_instance *demod)
3914 {
3915 	struct drxj_data *ext_attr = NULL;
3916 	struct i2c_device_addr *dev_addr = NULL;
3917 	struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SMA };
3918 	int rc;
3919 	u16 data = 0;
3920 
3921 	dev_addr = demod->my_i2c_dev_addr;
3922 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
3923 
3924 	/*  Write magic word to enable pdr reg write               */
3925 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3926 	if (rc != 0) {
3927 		pr_err("error %d\n", rc);
3928 		goto rw_error;
3929 	}
3930 	/* init smart antenna */
3931 	rc = drxj_dap_read_reg16(dev_addr, SIO_SA_TX_COMMAND__A, &data, 0);
3932 	if (rc != 0) {
3933 		pr_err("error %d\n", rc);
3934 		goto rw_error;
3935 	}
3936 	if (ext_attr->smart_ant_inverted) {
3937 		rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data | SIO_SA_TX_COMMAND_TX_INVERT__M) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
3938 		if (rc != 0) {
3939 			pr_err("error %d\n", rc);
3940 			goto rw_error;
3941 		}
3942 	} else {
3943 		rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data & (~SIO_SA_TX_COMMAND_TX_INVERT__M)) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
3944 		if (rc != 0) {
3945 			pr_err("error %d\n", rc);
3946 			goto rw_error;
3947 		}
3948 	}
3949 
3950 	/* config SMA_TX pin to smart antenna mode */
3951 	rc = ctrl_set_uio_cfg(demod, &uio_cfg);
3952 	if (rc != 0) {
3953 		pr_err("error %d\n", rc);
3954 		goto rw_error;
3955 	}
3956 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0x13, 0);
3957 	if (rc != 0) {
3958 		pr_err("error %d\n", rc);
3959 		goto rw_error;
3960 	}
3961 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_GPIO_FNC__A, 0x03, 0);
3962 	if (rc != 0) {
3963 		pr_err("error %d\n", rc);
3964 		goto rw_error;
3965 	}
3966 
3967 	/*  Write magic word to disable pdr reg write               */
3968 	rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3969 	if (rc != 0) {
3970 		pr_err("error %d\n", rc);
3971 		goto rw_error;
3972 	}
3973 
3974 	return 0;
3975 rw_error:
3976 	return rc;
3977 }
3978 
3979 static int scu_command(struct i2c_device_addr *dev_addr, struct drxjscu_cmd *cmd)
3980 {
3981 	int rc;
3982 	u16 cur_cmd = 0;
3983 	unsigned long timeout;
3984 
3985 	/* Check param */
3986 	if (cmd == NULL)
3987 		return -EINVAL;
3988 
3989 	/* Wait until SCU command interface is ready to receive command */
3990 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
3991 	if (rc != 0) {
3992 		pr_err("error %d\n", rc);
3993 		goto rw_error;
3994 	}
3995 	if (cur_cmd != DRX_SCU_READY)
3996 		return -EIO;
3997 
3998 	switch (cmd->parameter_len) {
3999 	case 5:
4000 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_4__A, *(cmd->parameter + 4), 0);
4001 		if (rc != 0) {
4002 			pr_err("error %d\n", rc);
4003 			goto rw_error;
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 		}	/* fallthrough */
4011 	case 3:
4012 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_2__A, *(cmd->parameter + 2), 0);
4013 		if (rc != 0) {
4014 			pr_err("error %d\n", rc);
4015 			goto rw_error;
4016 		}	/* fallthrough */
4017 	case 2:
4018 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_1__A, *(cmd->parameter + 1), 0);
4019 		if (rc != 0) {
4020 			pr_err("error %d\n", rc);
4021 			goto rw_error;
4022 		}	/* fallthrough */
4023 	case 1:
4024 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_0__A, *(cmd->parameter + 0), 0);
4025 		if (rc != 0) {
4026 			pr_err("error %d\n", rc);
4027 			goto rw_error;
4028 		}	/* fallthrough */
4029 	case 0:
4030 		/* do nothing */
4031 		break;
4032 	default:
4033 		/* this number of parameters is not supported */
4034 		return -EIO;
4035 	}
4036 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_COMMAND__A, cmd->command, 0);
4037 	if (rc != 0) {
4038 		pr_err("error %d\n", rc);
4039 		goto rw_error;
4040 	}
4041 
4042 	/* Wait until SCU has processed command */
4043 	timeout = jiffies + msecs_to_jiffies(DRXJ_MAX_WAITTIME);
4044 	while (time_is_after_jiffies(timeout)) {
4045 		rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
4046 		if (rc != 0) {
4047 			pr_err("error %d\n", rc);
4048 			goto rw_error;
4049 		}
4050 		if (cur_cmd == DRX_SCU_READY)
4051 			break;
4052 		usleep_range(1000, 2000);
4053 	}
4054 
4055 	if (cur_cmd != DRX_SCU_READY)
4056 		return -EIO;
4057 
4058 	/* read results */
4059 	if ((cmd->result_len > 0) && (cmd->result != NULL)) {
4060 		s16 err;
4061 
4062 		switch (cmd->result_len) {
4063 		case 4:
4064 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_3__A, cmd->result + 3, 0);
4065 			if (rc != 0) {
4066 				pr_err("error %d\n", rc);
4067 				goto rw_error;
4068 			}	/* fallthrough */
4069 		case 3:
4070 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_2__A, cmd->result + 2, 0);
4071 			if (rc != 0) {
4072 				pr_err("error %d\n", rc);
4073 				goto rw_error;
4074 			}	/* fallthrough */
4075 		case 2:
4076 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_1__A, cmd->result + 1, 0);
4077 			if (rc != 0) {
4078 				pr_err("error %d\n", rc);
4079 				goto rw_error;
4080 			}	/* fallthrough */
4081 		case 1:
4082 			rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_0__A, cmd->result + 0, 0);
4083 			if (rc != 0) {
4084 				pr_err("error %d\n", rc);
4085 				goto rw_error;
4086 			}	/* fallthrough */
4087 		case 0:
4088 			/* do nothing */
4089 			break;
4090 		default:
4091 			/* this number of parameters is not supported */
4092 			return -EIO;
4093 		}
4094 
4095 		/* Check if an error was reported by SCU */
4096 		err = cmd->result[0];
4097 
4098 		/* check a few fixed error codes */
4099 		if ((err == (s16) SCU_RAM_PARAM_0_RESULT_UNKSTD)
4100 		    || (err == (s16) SCU_RAM_PARAM_0_RESULT_UNKCMD)
4101 		    || (err == (s16) SCU_RAM_PARAM_0_RESULT_INVPAR)
4102 		    || (err == (s16) SCU_RAM_PARAM_0_RESULT_SIZE)
4103 		    ) {
4104 			return -EINVAL;
4105 		}
4106 		/* here it is assumed that negative means error, and positive no error */
4107 		else if (err < 0)
4108 			return -EIO;
4109 		else
4110 			return 0;
4111 	}
4112 
4113 	return 0;
4114 
4115 rw_error:
4116 	return rc;
4117 }
4118 
4119 /**
4120 * \fn int DRXJ_DAP_SCUAtomicReadWriteBlock()
4121 * \brief Basic access routine for SCU atomic read or write access
4122 * \param dev_addr  pointer to i2c dev address
4123 * \param addr     destination/source address
4124 * \param datasize size of data buffer in bytes
4125 * \param data     pointer to data buffer
4126 * \return int
4127 * \retval 0 Succes
4128 * \retval -EIO Timeout, I2C error, illegal bank
4129 *
4130 */
4131 #define ADDR_AT_SCU_SPACE(x) ((x - 0x82E000) * 2)
4132 static
4133 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 */
4134 					      u8 *data, bool read_flag)
4135 {
4136 	struct drxjscu_cmd scu_cmd;
4137 	int rc;
4138 	u16 set_param_parameters[18];
4139 	u16 cmd_result[15];
4140 
4141 	/* Parameter check */
4142 	if (!data || !dev_addr || (datasize % 2) || ((datasize / 2) > 16))
4143 		return -EINVAL;
4144 
4145 	set_param_parameters[1] = (u16) ADDR_AT_SCU_SPACE(addr);
4146 	if (read_flag) {		/* read */
4147 		set_param_parameters[0] = ((~(0x0080)) & datasize);
4148 		scu_cmd.parameter_len = 2;
4149 		scu_cmd.result_len = datasize / 2 + 2;
4150 	} else {
4151 		int i = 0;
4152 
4153 		set_param_parameters[0] = 0x0080 | datasize;
4154 		for (i = 0; i < (datasize / 2); i++) {
4155 			set_param_parameters[i + 2] =
4156 			    (data[2 * i] | (data[(2 * i) + 1] << 8));
4157 		}
4158 		scu_cmd.parameter_len = datasize / 2 + 2;
4159 		scu_cmd.result_len = 1;
4160 	}
4161 
4162 	scu_cmd.command =
4163 	    SCU_RAM_COMMAND_STANDARD_TOP |
4164 	    SCU_RAM_COMMAND_CMD_AUX_SCU_ATOMIC_ACCESS;
4165 	scu_cmd.result = cmd_result;
4166 	scu_cmd.parameter = set_param_parameters;
4167 	rc = scu_command(dev_addr, &scu_cmd);
4168 	if (rc != 0) {
4169 		pr_err("error %d\n", rc);
4170 		goto rw_error;
4171 	}
4172 
4173 	if (read_flag) {
4174 		int i = 0;
4175 		/* read data from buffer */
4176 		for (i = 0; i < (datasize / 2); i++) {
4177 			data[2 * i] = (u8) (scu_cmd.result[i + 2] & 0xFF);
4178 			data[(2 * i) + 1] = (u8) (scu_cmd.result[i + 2] >> 8);
4179 		}
4180 	}
4181 
4182 	return 0;
4183 
4184 rw_error:
4185 	return rc;
4186 
4187 }
4188 
4189 /*============================================================================*/
4190 
4191 /**
4192 * \fn int DRXJ_DAP_AtomicReadReg16()
4193 * \brief Atomic read of 16 bits words
4194 */
4195 static
4196 int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr *dev_addr,
4197 					 u32 addr,
4198 					 u16 *data, u32 flags)
4199 {
4200 	u8 buf[2] = { 0 };
4201 	int rc = -EIO;
4202 	u16 word = 0;
4203 
4204 	if (!data)
4205 		return -EINVAL;
4206 
4207 	rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, true);
4208 	if (rc < 0)
4209 		return rc;
4210 
4211 	word = (u16) (buf[0] + (buf[1] << 8));
4212 
4213 	*data = word;
4214 
4215 	return rc;
4216 }
4217 
4218 /*============================================================================*/
4219 /**
4220 * \fn int drxj_dap_scu_atomic_write_reg16()
4221 * \brief Atomic read of 16 bits words
4222 */
4223 static
4224 int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr *dev_addr,
4225 					  u32 addr,
4226 					  u16 data, u32 flags)
4227 {
4228 	u8 buf[2];
4229 	int rc = -EIO;
4230 
4231 	buf[0] = (u8) (data & 0xff);
4232 	buf[1] = (u8) ((data >> 8) & 0xff);
4233 
4234 	rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, false);
4235 
4236 	return rc;
4237 }
4238 
4239 /* -------------------------------------------------------------------------- */
4240 /**
4241 * \brief Measure result of ADC synchronisation
4242 * \param demod demod instance
4243 * \param count (returned) count
4244 * \return int.
4245 * \retval 0    Success
4246 * \retval -EIO Failure: I2C error
4247 *
4248 */
4249 static int adc_sync_measurement(struct drx_demod_instance *demod, u16 *count)
4250 {
4251 	struct i2c_device_addr *dev_addr = NULL;
4252 	int rc;
4253 	u16 data = 0;
4254 
4255 	dev_addr = demod->my_i2c_dev_addr;
4256 
4257 	/* Start measurement */
4258 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE, 0);
4259 	if (rc != 0) {
4260 		pr_err("error %d\n", rc);
4261 		goto rw_error;
4262 	}
4263 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_START_LOCK__A, 1, 0);
4264 	if (rc != 0) {
4265 		pr_err("error %d\n", rc);
4266 		goto rw_error;
4267 	}
4268 
4269 	/* Wait at least 3*128*(1/sysclk) <<< 1 millisec */
4270 	msleep(1);
4271 
4272 	*count = 0;
4273 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE0__A, &data, 0);
4274 	if (rc != 0) {
4275 		pr_err("error %d\n", rc);
4276 		goto rw_error;
4277 	}
4278 	if (data == 127)
4279 		*count = *count + 1;
4280 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE1__A, &data, 0);
4281 	if (rc != 0) {
4282 		pr_err("error %d\n", rc);
4283 		goto rw_error;
4284 	}
4285 	if (data == 127)
4286 		*count = *count + 1;
4287 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE2__A, &data, 0);
4288 	if (rc != 0) {
4289 		pr_err("error %d\n", rc);
4290 		goto rw_error;
4291 	}
4292 	if (data == 127)
4293 		*count = *count + 1;
4294 
4295 	return 0;
4296 rw_error:
4297 	return rc;
4298 }
4299 
4300 /**
4301 * \brief Synchronize analog and digital clock domains
4302 * \param demod demod instance
4303 * \return int.
4304 * \retval 0    Success
4305 * \retval -EIO Failure: I2C error or failure to synchronize
4306 *
4307 * An IQM reset will also reset the results of this synchronization.
4308 * After an IQM reset this routine needs to be called again.
4309 *
4310 */
4311 
4312 static int adc_synchronization(struct drx_demod_instance *demod)
4313 {
4314 	struct i2c_device_addr *dev_addr = NULL;
4315 	int rc;
4316 	u16 count = 0;
4317 
4318 	dev_addr = demod->my_i2c_dev_addr;
4319 
4320 	rc = adc_sync_measurement(demod, &count);
4321 	if (rc != 0) {
4322 		pr_err("error %d\n", rc);
4323 		goto rw_error;
4324 	}
4325 
4326 	if (count == 1) {
4327 		/* Try sampling on a different edge */
4328 		u16 clk_neg = 0;
4329 
4330 		rc = drxj_dap_read_reg16(dev_addr, IQM_AF_CLKNEG__A, &clk_neg, 0);
4331 		if (rc != 0) {
4332 			pr_err("error %d\n", rc);
4333 			goto rw_error;
4334 		}
4335 
4336 		clk_neg ^= IQM_AF_CLKNEG_CLKNEGDATA__M;
4337 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLKNEG__A, clk_neg, 0);
4338 		if (rc != 0) {
4339 			pr_err("error %d\n", rc);
4340 			goto rw_error;
4341 		}
4342 
4343 		rc = adc_sync_measurement(demod, &count);
4344 		if (rc != 0) {
4345 			pr_err("error %d\n", rc);
4346 			goto rw_error;
4347 		}
4348 	}
4349 
4350 	/* TODO: implement fallback scenarios */
4351 	if (count < 2)
4352 		return -EIO;
4353 
4354 	return 0;
4355 rw_error:
4356 	return rc;
4357 }
4358 
4359 /*============================================================================*/
4360 /*==                      END AUXILIARY FUNCTIONS                           ==*/
4361 /*============================================================================*/
4362 
4363 /*============================================================================*/
4364 /*============================================================================*/
4365 /*==                8VSB & QAM COMMON DATAPATH FUNCTIONS                    ==*/
4366 /*============================================================================*/
4367 /*============================================================================*/
4368 /**
4369 * \fn int init_agc ()
4370 * \brief Initialize AGC for all standards.
4371 * \param demod instance of demodulator.
4372 * \param channel pointer to channel data.
4373 * \return int.
4374 */
4375 static int init_agc(struct drx_demod_instance *demod)
4376 {
4377 	struct i2c_device_addr *dev_addr = NULL;
4378 	struct drx_common_attr *common_attr = NULL;
4379 	struct drxj_data *ext_attr = NULL;
4380 	struct drxj_cfg_agc *p_agc_rf_settings = NULL;
4381 	struct drxj_cfg_agc *p_agc_if_settings = NULL;
4382 	int rc;
4383 	u16 ingain_tgt_max = 0;
4384 	u16 clp_dir_to = 0;
4385 	u16 sns_sum_max = 0;
4386 	u16 clp_sum_max = 0;
4387 	u16 sns_dir_to = 0;
4388 	u16 ki_innergain_min = 0;
4389 	u16 agc_ki = 0;
4390 	u16 ki_max = 0;
4391 	u16 if_iaccu_hi_tgt_min = 0;
4392 	u16 data = 0;
4393 	u16 agc_ki_dgain = 0;
4394 	u16 ki_min = 0;
4395 	u16 clp_ctrl_mode = 0;
4396 	u16 agc_rf = 0;
4397 	u16 agc_if = 0;
4398 
4399 	dev_addr = demod->my_i2c_dev_addr;
4400 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
4401 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
4402 
4403 	switch (ext_attr->standard) {
4404 	case DRX_STANDARD_8VSB:
4405 		clp_sum_max = 1023;
4406 		clp_dir_to = (u16) (-9);
4407 		sns_sum_max = 1023;
4408 		sns_dir_to = (u16) (-9);
4409 		ki_innergain_min = (u16) (-32768);
4410 		ki_max = 0x032C;
4411 		agc_ki_dgain = 0xC;
4412 		if_iaccu_hi_tgt_min = 2047;
4413 		ki_min = 0x0117;
4414 		ingain_tgt_max = 16383;
4415 		clp_ctrl_mode = 0;
4416 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4417 		if (rc != 0) {
4418 			pr_err("error %d\n", rc);
4419 			goto rw_error;
4420 		}
4421 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4422 		if (rc != 0) {
4423 			pr_err("error %d\n", rc);
4424 			goto rw_error;
4425 		}
4426 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4427 		if (rc != 0) {
4428 			pr_err("error %d\n", rc);
4429 			goto rw_error;
4430 		}
4431 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4432 		if (rc != 0) {
4433 			pr_err("error %d\n", rc);
4434 			goto rw_error;
4435 		}
4436 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4437 		if (rc != 0) {
4438 			pr_err("error %d\n", rc);
4439 			goto rw_error;
4440 		}
4441 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4442 		if (rc != 0) {
4443 			pr_err("error %d\n", rc);
4444 			goto rw_error;
4445 		}
4446 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4447 		if (rc != 0) {
4448 			pr_err("error %d\n", rc);
4449 			goto rw_error;
4450 		}
4451 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4452 		if (rc != 0) {
4453 			pr_err("error %d\n", rc);
4454 			goto rw_error;
4455 		}
4456 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4457 		if (rc != 0) {
4458 			pr_err("error %d\n", rc);
4459 			goto rw_error;
4460 		}
4461 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4462 		if (rc != 0) {
4463 			pr_err("error %d\n", rc);
4464 			goto rw_error;
4465 		}
4466 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, 1024, 0);
4467 		if (rc != 0) {
4468 			pr_err("error %d\n", rc);
4469 			goto rw_error;
4470 		}
4471 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_VSB_AGC_POW_TGT__A, 22600, 0);
4472 		if (rc != 0) {
4473 			pr_err("error %d\n", rc);
4474 			goto rw_error;
4475 		}
4476 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, 13200, 0);
4477 		if (rc != 0) {
4478 			pr_err("error %d\n", rc);
4479 			goto rw_error;
4480 		}
4481 		p_agc_if_settings = &(ext_attr->vsb_if_agc_cfg);
4482 		p_agc_rf_settings = &(ext_attr->vsb_rf_agc_cfg);
4483 		break;
4484 #ifndef DRXJ_VSB_ONLY
4485 	case DRX_STANDARD_ITU_A:
4486 	case DRX_STANDARD_ITU_C:
4487 	case DRX_STANDARD_ITU_B:
4488 		ingain_tgt_max = 5119;
4489 		clp_sum_max = 1023;
4490 		clp_dir_to = (u16) (-5);
4491 		sns_sum_max = 127;
4492 		sns_dir_to = (u16) (-3);
4493 		ki_innergain_min = 0;
4494 		ki_max = 0x0657;
4495 		if_iaccu_hi_tgt_min = 2047;
4496 		agc_ki_dgain = 0x7;
4497 		ki_min = 0x0117;
4498 		clp_ctrl_mode = 0;
4499 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4500 		if (rc != 0) {
4501 			pr_err("error %d\n", rc);
4502 			goto rw_error;
4503 		}
4504 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4505 		if (rc != 0) {
4506 			pr_err("error %d\n", rc);
4507 			goto rw_error;
4508 		}
4509 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4510 		if (rc != 0) {
4511 			pr_err("error %d\n", rc);
4512 			goto rw_error;
4513 		}
4514 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4515 		if (rc != 0) {
4516 			pr_err("error %d\n", rc);
4517 			goto rw_error;
4518 		}
4519 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4520 		if (rc != 0) {
4521 			pr_err("error %d\n", rc);
4522 			goto rw_error;
4523 		}
4524 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4525 		if (rc != 0) {
4526 			pr_err("error %d\n", rc);
4527 			goto rw_error;
4528 		}
4529 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4530 		if (rc != 0) {
4531 			pr_err("error %d\n", rc);
4532 			goto rw_error;
4533 		}
4534 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4535 		if (rc != 0) {
4536 			pr_err("error %d\n", rc);
4537 			goto rw_error;
4538 		}
4539 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4540 		if (rc != 0) {
4541 			pr_err("error %d\n", rc);
4542 			goto rw_error;
4543 		}
4544 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4545 		if (rc != 0) {
4546 			pr_err("error %d\n", rc);
4547 			goto rw_error;
4548 		}
4549 		p_agc_if_settings = &(ext_attr->qam_if_agc_cfg);
4550 		p_agc_rf_settings = &(ext_attr->qam_rf_agc_cfg);
4551 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, p_agc_if_settings->top, 0);
4552 		if (rc != 0) {
4553 			pr_err("error %d\n", rc);
4554 			goto rw_error;
4555 		}
4556 
4557 		rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &agc_ki, 0);
4558 		if (rc != 0) {
4559 			pr_err("error %d\n", rc);
4560 			goto rw_error;
4561 		}
4562 		agc_ki &= 0xf000;
4563 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, agc_ki, 0);
4564 		if (rc != 0) {
4565 			pr_err("error %d\n", rc);
4566 			goto rw_error;
4567 		}
4568 		break;
4569 #endif
4570 	default:
4571 		return -EINVAL;
4572 	}
4573 
4574 	/* for new AGC interface */
4575 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_if_settings->top, 0);
4576 	if (rc != 0) {
4577 		pr_err("error %d\n", rc);
4578 		goto rw_error;
4579 	}
4580 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, p_agc_if_settings->top, 0);
4581 	if (rc != 0) {
4582 		pr_err("error %d\n", rc);
4583 		goto rw_error;
4584 	}	/* Gain fed from inner to outer AGC */
4585 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max, 0);
4586 	if (rc != 0) {
4587 		pr_err("error %d\n", rc);
4588 		goto rw_error;
4589 	}
4590 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, if_iaccu_hi_tgt_min, 0);
4591 	if (rc != 0) {
4592 		pr_err("error %d\n", rc);
4593 		goto rw_error;
4594 	}
4595 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI__A, 0, 0);
4596 	if (rc != 0) {
4597 		pr_err("error %d\n", rc);
4598 		goto rw_error;
4599 	}	/* set to p_agc_settings->top before */
4600 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_LO__A, 0, 0);
4601 	if (rc != 0) {
4602 		pr_err("error %d\n", rc);
4603 		goto rw_error;
4604 	}
4605 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, 0, 0);
4606 	if (rc != 0) {
4607 		pr_err("error %d\n", rc);
4608 		goto rw_error;
4609 	}
4610 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_LO__A, 0, 0);
4611 	if (rc != 0) {
4612 		pr_err("error %d\n", rc);
4613 		goto rw_error;
4614 	}
4615 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_MAX__A, 32767, 0);
4616 	if (rc != 0) {
4617 		pr_err("error %d\n", rc);
4618 		goto rw_error;
4619 	}
4620 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max, 0);
4621 	if (rc != 0) {
4622 		pr_err("error %d\n", rc);
4623 		goto rw_error;
4624 	}
4625 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max, 0);
4626 	if (rc != 0) {
4627 		pr_err("error %d\n", rc);
4628 		goto rw_error;
4629 	}
4630 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, ki_innergain_min, 0);
4631 	if (rc != 0) {
4632 		pr_err("error %d\n", rc);
4633 		goto rw_error;
4634 	}
4635 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50, 0);
4636 	if (rc != 0) {
4637 		pr_err("error %d\n", rc);
4638 		goto rw_error;
4639 	}
4640 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_CYCLEN__A, 500, 0);
4641 	if (rc != 0) {
4642 		pr_err("error %d\n", rc);
4643 		goto rw_error;
4644 	}
4645 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCLEN__A, 500, 0);
4646 	if (rc != 0) {
4647 		pr_err("error %d\n", rc);
4648 		goto rw_error;
4649 	}
4650 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20, 0);
4651 	if (rc != 0) {
4652 		pr_err("error %d\n", rc);
4653 		goto rw_error;
4654 	}
4655 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MIN__A, ki_min, 0);
4656 	if (rc != 0) {
4657 		pr_err("error %d\n", rc);
4658 		goto rw_error;
4659 	}
4660 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAX__A, ki_max, 0);
4661 	if (rc != 0) {
4662 		pr_err("error %d\n", rc);
4663 		goto rw_error;
4664 	}
4665 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_RED__A, 0, 0);
4666 	if (rc != 0) {
4667 		pr_err("error %d\n", rc);
4668 		goto rw_error;
4669 	}
4670 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MIN__A, 8, 0);
4671 	if (rc != 0) {
4672 		pr_err("error %d\n", rc);
4673 		goto rw_error;
4674 	}
4675 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCLEN__A, 500, 0);
4676 	if (rc != 0) {
4677 		pr_err("error %d\n", rc);
4678 		goto rw_error;
4679 	}
4680 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to, 0);
4681 	if (rc != 0) {
4682 		pr_err("error %d\n", rc);
4683 		goto rw_error;
4684 	}
4685 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MIN__A, 8, 0);
4686 	if (rc != 0) {
4687 		pr_err("error %d\n", rc);
4688 		goto rw_error;
4689 	}
4690 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to, 0);
4691 	if (rc != 0) {
4692 		pr_err("error %d\n", rc);
4693 		goto rw_error;
4694 	}
4695 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, 50, 0);
4696 	if (rc != 0) {
4697 		pr_err("error %d\n", rc);
4698 		goto rw_error;
4699 	}
4700 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode, 0);
4701 	if (rc != 0) {
4702 		pr_err("error %d\n", rc);
4703 		goto rw_error;
4704 	}
4705 
4706 	agc_rf = 0x800 + p_agc_rf_settings->cut_off_current;
4707 	if (common_attr->tuner_rf_agc_pol == true)
4708 		agc_rf = 0x87ff - agc_rf;
4709 
4710 	agc_if = 0x800;
4711 	if (common_attr->tuner_if_agc_pol == true)
4712 		agc_rf = 0x87ff - agc_rf;
4713 
4714 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_RF__A, agc_rf, 0);
4715 	if (rc != 0) {
4716 		pr_err("error %d\n", rc);
4717 		goto rw_error;
4718 	}
4719 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_IF__A, agc_if, 0);
4720 	if (rc != 0) {
4721 		pr_err("error %d\n", rc);
4722 		goto rw_error;
4723 	}
4724 
4725 	/* Set/restore Ki DGAIN factor */
4726 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4727 	if (rc != 0) {
4728 		pr_err("error %d\n", rc);
4729 		goto rw_error;
4730 	}
4731 	data &= ~SCU_RAM_AGC_KI_DGAIN__M;
4732 	data |= (agc_ki_dgain << SCU_RAM_AGC_KI_DGAIN__B);
4733 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4734 	if (rc != 0) {
4735 		pr_err("error %d\n", rc);
4736 		goto rw_error;
4737 	}
4738 
4739 	return 0;
4740 rw_error:
4741 	return rc;
4742 }
4743 
4744 /**
4745 * \fn int set_frequency ()
4746 * \brief Set frequency shift.
4747 * \param demod instance of demodulator.
4748 * \param channel pointer to channel data.
4749 * \param tuner_freq_offset residual frequency from tuner.
4750 * \return int.
4751 */
4752 static int
4753 set_frequency(struct drx_demod_instance *demod,
4754 	      struct drx_channel *channel, s32 tuner_freq_offset)
4755 {
4756 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
4757 	struct drxj_data *ext_attr = demod->my_ext_attr;
4758 	int rc;
4759 	s32 sampling_frequency = 0;
4760 	s32 frequency_shift = 0;
4761 	s32 if_freq_actual = 0;
4762 	s32 rf_freq_residual = -1 * tuner_freq_offset;
4763 	s32 adc_freq = 0;
4764 	s32 intermediate_freq = 0;
4765 	u32 iqm_fs_rate_ofs = 0;
4766 	bool adc_flip = true;
4767 	bool select_pos_image = false;
4768 	bool rf_mirror;
4769 	bool tuner_mirror;
4770 	bool image_to_select = true;
4771 	s32 fm_frequency_shift = 0;
4772 
4773 	rf_mirror = (ext_attr->mirror == DRX_MIRROR_YES) ? true : false;
4774 	tuner_mirror = demod->my_common_attr->mirror_freq_spect ? false : true;
4775 	/*
4776 	   Program frequency shifter
4777 	   No need to account for mirroring on RF
4778 	 */
4779 	switch (ext_attr->standard) {
4780 	case DRX_STANDARD_ITU_A:
4781 	case DRX_STANDARD_ITU_C:
4782 	case DRX_STANDARD_PAL_SECAM_LP:
4783 	case DRX_STANDARD_8VSB:
4784 		select_pos_image = true;
4785 		break;
4786 	case DRX_STANDARD_FM:
4787 		/* After IQM FS sound carrier must appear at 4 Mhz in spect.
4788 		   Sound carrier is already 3Mhz above centre frequency due
4789 		   to tuner setting so now add an extra shift of 1MHz... */
4790 		fm_frequency_shift = 1000;
4791 		/*fall through */
4792 	case DRX_STANDARD_ITU_B:
4793 	case DRX_STANDARD_NTSC:
4794 	case DRX_STANDARD_PAL_SECAM_BG:
4795 	case DRX_STANDARD_PAL_SECAM_DK:
4796 	case DRX_STANDARD_PAL_SECAM_I:
4797 	case DRX_STANDARD_PAL_SECAM_L:
4798 		select_pos_image = false;
4799 		break;
4800 	default:
4801 		return -EINVAL;
4802 	}
4803 	intermediate_freq = demod->my_common_attr->intermediate_freq;
4804 	sampling_frequency = demod->my_common_attr->sys_clock_freq / 3;
4805 	if (tuner_mirror)
4806 		if_freq_actual = intermediate_freq + rf_freq_residual + fm_frequency_shift;
4807 	else
4808 		if_freq_actual = intermediate_freq - rf_freq_residual - fm_frequency_shift;
4809 	if (if_freq_actual > sampling_frequency / 2) {
4810 		/* adc mirrors */
4811 		adc_freq = sampling_frequency - if_freq_actual;
4812 		adc_flip = true;
4813 	} else {
4814 		/* adc doesn't mirror */
4815 		adc_freq = if_freq_actual;
4816 		adc_flip = false;
4817 	}
4818 
4819 	frequency_shift = adc_freq;
4820 	image_to_select =
4821 	    (bool) (rf_mirror ^ tuner_mirror ^ adc_flip ^ select_pos_image);
4822 	iqm_fs_rate_ofs = frac28(frequency_shift, sampling_frequency);
4823 
4824 	if (image_to_select)
4825 		iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
4826 
4827 	/* Program frequency shifter with tuner offset compensation */
4828 	/* frequency_shift += tuner_freq_offset; TODO */
4829 	rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
4830 	if (rc != 0) {
4831 		pr_err("error %d\n", rc);
4832 		goto rw_error;
4833 	}
4834 	ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
4835 	ext_attr->pos_image = (bool) (rf_mirror ^ tuner_mirror ^ select_pos_image);
4836 
4837 	return 0;
4838 rw_error:
4839 	return rc;
4840 }
4841 
4842 /**
4843 * \fn int get_acc_pkt_err()
4844 * \brief Retrieve signal strength for VSB and QAM.
4845 * \param demod Pointer to demod instance
4846 * \param packet_err Pointer to packet error
4847 * \return int.
4848 * \retval 0 sig_strength contains valid data.
4849 * \retval -EINVAL sig_strength is NULL.
4850 * \retval -EIO Erroneous data, sig_strength contains invalid data.
4851 */
4852 #ifdef DRXJ_SIGNAL_ACCUM_ERR
4853 static int get_acc_pkt_err(struct drx_demod_instance *demod, u16 *packet_err)
4854 {
4855 	int rc;
4856 	static u16 pkt_err;
4857 	static u16 last_pkt_err;
4858 	u16 data = 0;
4859 	struct drxj_data *ext_attr = NULL;
4860 	struct i2c_device_addr *dev_addr = NULL;
4861 
4862 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
4863 	dev_addr = demod->my_i2c_dev_addr;
4864 
4865 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, &data, 0);
4866 	if (rc != 0) {
4867 		pr_err("error %d\n", rc);
4868 		goto rw_error;
4869 	}
4870 	if (ext_attr->reset_pkt_err_acc) {
4871 		last_pkt_err = data;
4872 		pkt_err = 0;
4873 		ext_attr->reset_pkt_err_acc = false;
4874 	}
4875 
4876 	if (data < last_pkt_err) {
4877 		pkt_err += 0xffff - last_pkt_err;
4878 		pkt_err += data;
4879 	} else {
4880 		pkt_err += (data - last_pkt_err);
4881 	}
4882 	*packet_err = pkt_err;
4883 	last_pkt_err = data;
4884 
4885 	return 0;
4886 rw_error:
4887 	return rc;
4888 }
4889 #endif
4890 
4891 
4892 /*============================================================================*/
4893 
4894 /**
4895 * \fn int set_agc_rf ()
4896 * \brief Configure RF AGC
4897 * \param demod instance of demodulator.
4898 * \param agc_settings AGC configuration structure
4899 * \return int.
4900 */
4901 static int
4902 set_agc_rf(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
4903 {
4904 	struct i2c_device_addr *dev_addr = NULL;
4905 	struct drxj_data *ext_attr = NULL;
4906 	struct drxj_cfg_agc *p_agc_settings = NULL;
4907 	struct drx_common_attr *common_attr = NULL;
4908 	int rc;
4909 	drx_write_reg16func_t scu_wr16 = NULL;
4910 	drx_read_reg16func_t scu_rr16 = NULL;
4911 
4912 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
4913 	dev_addr = demod->my_i2c_dev_addr;
4914 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
4915 
4916 	if (atomic) {
4917 		scu_rr16 = drxj_dap_scu_atomic_read_reg16;
4918 		scu_wr16 = drxj_dap_scu_atomic_write_reg16;
4919 	} else {
4920 		scu_rr16 = drxj_dap_read_reg16;
4921 		scu_wr16 = drxj_dap_write_reg16;
4922 	}
4923 
4924 	/* Configure AGC only if standard is currently active */
4925 	if ((ext_attr->standard == agc_settings->standard) ||
4926 	    (DRXJ_ISQAMSTD(ext_attr->standard) &&
4927 	     DRXJ_ISQAMSTD(agc_settings->standard)) ||
4928 	    (DRXJ_ISATVSTD(ext_attr->standard) &&
4929 	     DRXJ_ISATVSTD(agc_settings->standard))) {
4930 		u16 data = 0;
4931 
4932 		switch (agc_settings->ctrl_mode) {
4933 		case DRX_AGC_CTRL_AUTO:
4934 
4935 			/* Enable RF AGC DAC */
4936 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
4937 			if (rc != 0) {
4938 				pr_err("error %d\n", rc);
4939 				goto rw_error;
4940 			}
4941 			data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
4942 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
4943 			if (rc != 0) {
4944 				pr_err("error %d\n", rc);
4945 				goto rw_error;
4946 			}
4947 
4948 			/* Enable SCU RF AGC loop */
4949 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4950 			if (rc != 0) {
4951 				pr_err("error %d\n", rc);
4952 				goto rw_error;
4953 			}
4954 			data &= ~SCU_RAM_AGC_KI_RF__M;
4955 			if (ext_attr->standard == DRX_STANDARD_8VSB)
4956 				data |= (2 << SCU_RAM_AGC_KI_RF__B);
4957 			else if (DRXJ_ISQAMSTD(ext_attr->standard))
4958 				data |= (5 << SCU_RAM_AGC_KI_RF__B);
4959 			else
4960 				data |= (4 << SCU_RAM_AGC_KI_RF__B);
4961 
4962 			if (common_attr->tuner_rf_agc_pol)
4963 				data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
4964 			else
4965 				data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
4966 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4967 			if (rc != 0) {
4968 				pr_err("error %d\n", rc);
4969 				goto rw_error;
4970 			}
4971 
4972 			/* Set speed ( using complementary reduction value ) */
4973 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
4974 			if (rc != 0) {
4975 				pr_err("error %d\n", rc);
4976 				goto rw_error;
4977 			}
4978 			data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
4979 			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);
4980 			if (rc != 0) {
4981 				pr_err("error %d\n", rc);
4982 				goto rw_error;
4983 			}
4984 
4985 			if (agc_settings->standard == DRX_STANDARD_8VSB)
4986 				p_agc_settings = &(ext_attr->vsb_if_agc_cfg);
4987 			else if (DRXJ_ISQAMSTD(agc_settings->standard))
4988 				p_agc_settings = &(ext_attr->qam_if_agc_cfg);
4989 			else if (DRXJ_ISATVSTD(agc_settings->standard))
4990 				p_agc_settings = &(ext_attr->atv_if_agc_cfg);
4991 			else
4992 				return -EINVAL;
4993 
4994 			/* Set TOP, only if IF-AGC is in AUTO mode */
4995 			if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
4996 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->top, 0);
4997 				if (rc != 0) {
4998 					pr_err("error %d\n", rc);
4999 					goto rw_error;
5000 				}
5001 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, agc_settings->top, 0);
5002 				if (rc != 0) {
5003 					pr_err("error %d\n", rc);
5004 					goto rw_error;
5005 				}
5006 			}
5007 
5008 			/* Cut-Off current */
5009 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI_CO__A, agc_settings->cut_off_current, 0);
5010 			if (rc != 0) {
5011 				pr_err("error %d\n", rc);
5012 				goto rw_error;
5013 			}
5014 			break;
5015 		case DRX_AGC_CTRL_USER:
5016 
5017 			/* Enable RF AGC DAC */
5018 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5019 			if (rc != 0) {
5020 				pr_err("error %d\n", rc);
5021 				goto rw_error;
5022 			}
5023 			data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
5024 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5025 			if (rc != 0) {
5026 				pr_err("error %d\n", rc);
5027 				goto rw_error;
5028 			}
5029 
5030 			/* Disable SCU RF AGC loop */
5031 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5032 			if (rc != 0) {
5033 				pr_err("error %d\n", rc);
5034 				goto rw_error;
5035 			}
5036 			data &= ~SCU_RAM_AGC_KI_RF__M;
5037 			if (common_attr->tuner_rf_agc_pol)
5038 				data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
5039 			else
5040 				data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
5041 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5042 			if (rc != 0) {
5043 				pr_err("error %d\n", rc);
5044 				goto rw_error;
5045 			}
5046 
5047 			/* Write value to output pin */
5048 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, agc_settings->output_level, 0);
5049 			if (rc != 0) {
5050 				pr_err("error %d\n", rc);
5051 				goto rw_error;
5052 			}
5053 			break;
5054 		case DRX_AGC_CTRL_OFF:
5055 
5056 			/* Disable RF AGC DAC */
5057 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5058 			if (rc != 0) {
5059 				pr_err("error %d\n", rc);
5060 				goto rw_error;
5061 			}
5062 			data &= (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE);
5063 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5064 			if (rc != 0) {
5065 				pr_err("error %d\n", rc);
5066 				goto rw_error;
5067 			}
5068 
5069 			/* Disable SCU RF AGC loop */
5070 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5071 			if (rc != 0) {
5072 				pr_err("error %d\n", rc);
5073 				goto rw_error;
5074 			}
5075 			data &= ~SCU_RAM_AGC_KI_RF__M;
5076 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5077 			if (rc != 0) {
5078 				pr_err("error %d\n", rc);
5079 				goto rw_error;
5080 			}
5081 			break;
5082 		default:
5083 			return -EINVAL;
5084 		}		/* switch ( agcsettings->ctrl_mode ) */
5085 	}
5086 
5087 	/* Store rf agc settings */
5088 	switch (agc_settings->standard) {
5089 	case DRX_STANDARD_8VSB:
5090 		ext_attr->vsb_rf_agc_cfg = *agc_settings;
5091 		break;
5092 #ifndef DRXJ_VSB_ONLY
5093 	case DRX_STANDARD_ITU_A:
5094 	case DRX_STANDARD_ITU_B:
5095 	case DRX_STANDARD_ITU_C:
5096 		ext_attr->qam_rf_agc_cfg = *agc_settings;
5097 		break;
5098 #endif
5099 	default:
5100 		return -EIO;
5101 	}
5102 
5103 	return 0;
5104 rw_error:
5105 	return rc;
5106 }
5107 
5108 /**
5109 * \fn int set_agc_if ()
5110 * \brief Configure If AGC
5111 * \param demod instance of demodulator.
5112 * \param agc_settings AGC configuration structure
5113 * \return int.
5114 */
5115 static int
5116 set_agc_if(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
5117 {
5118 	struct i2c_device_addr *dev_addr = NULL;
5119 	struct drxj_data *ext_attr = NULL;
5120 	struct drxj_cfg_agc *p_agc_settings = NULL;
5121 	struct drx_common_attr *common_attr = NULL;
5122 	drx_write_reg16func_t scu_wr16 = NULL;
5123 	drx_read_reg16func_t scu_rr16 = NULL;
5124 	int rc;
5125 
5126 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
5127 	dev_addr = demod->my_i2c_dev_addr;
5128 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
5129 
5130 	if (atomic) {
5131 		scu_rr16 = drxj_dap_scu_atomic_read_reg16;
5132 		scu_wr16 = drxj_dap_scu_atomic_write_reg16;
5133 	} else {
5134 		scu_rr16 = drxj_dap_read_reg16;
5135 		scu_wr16 = drxj_dap_write_reg16;
5136 	}
5137 
5138 	/* Configure AGC only if standard is currently active */
5139 	if ((ext_attr->standard == agc_settings->standard) ||
5140 	    (DRXJ_ISQAMSTD(ext_attr->standard) &&
5141 	     DRXJ_ISQAMSTD(agc_settings->standard)) ||
5142 	    (DRXJ_ISATVSTD(ext_attr->standard) &&
5143 	     DRXJ_ISATVSTD(agc_settings->standard))) {
5144 		u16 data = 0;
5145 
5146 		switch (agc_settings->ctrl_mode) {
5147 		case DRX_AGC_CTRL_AUTO:
5148 			/* Enable IF AGC DAC */
5149 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5150 			if (rc != 0) {
5151 				pr_err("error %d\n", rc);
5152 				goto rw_error;
5153 			}
5154 			data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5155 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5156 			if (rc != 0) {
5157 				pr_err("error %d\n", rc);
5158 				goto rw_error;
5159 			}
5160 
5161 			/* Enable SCU IF AGC loop */
5162 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5163 			if (rc != 0) {
5164 				pr_err("error %d\n", rc);
5165 				goto rw_error;
5166 			}
5167 			data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5168 			data &= ~SCU_RAM_AGC_KI_IF__M;
5169 			if (ext_attr->standard == DRX_STANDARD_8VSB)
5170 				data |= (3 << SCU_RAM_AGC_KI_IF__B);
5171 			else if (DRXJ_ISQAMSTD(ext_attr->standard))
5172 				data |= (6 << SCU_RAM_AGC_KI_IF__B);
5173 			else
5174 				data |= (5 << SCU_RAM_AGC_KI_IF__B);
5175 
5176 			if (common_attr->tuner_if_agc_pol)
5177 				data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5178 			else
5179 				data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5180 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5181 			if (rc != 0) {
5182 				pr_err("error %d\n", rc);
5183 				goto rw_error;
5184 			}
5185 
5186 			/* Set speed (using complementary reduction value) */
5187 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
5188 			if (rc != 0) {
5189 				pr_err("error %d\n", rc);
5190 				goto rw_error;
5191 			}
5192 			data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
5193 			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);
5194 			if (rc != 0) {
5195 				pr_err("error %d\n", rc);
5196 				goto rw_error;
5197 			}
5198 
5199 			if (agc_settings->standard == DRX_STANDARD_8VSB)
5200 				p_agc_settings = &(ext_attr->vsb_rf_agc_cfg);
5201 			else if (DRXJ_ISQAMSTD(agc_settings->standard))
5202 				p_agc_settings = &(ext_attr->qam_rf_agc_cfg);
5203 			else if (DRXJ_ISATVSTD(agc_settings->standard))
5204 				p_agc_settings = &(ext_attr->atv_rf_agc_cfg);
5205 			else
5206 				return -EINVAL;
5207 
5208 			/* Restore TOP */
5209 			if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
5210 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, p_agc_settings->top, 0);
5211 				if (rc != 0) {
5212 					pr_err("error %d\n", rc);
5213 					goto rw_error;
5214 				}
5215 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, p_agc_settings->top, 0);
5216 				if (rc != 0) {
5217 					pr_err("error %d\n", rc);
5218 					goto rw_error;
5219 				}
5220 			} else {
5221 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, 0, 0);
5222 				if (rc != 0) {
5223 					pr_err("error %d\n", rc);
5224 					goto rw_error;
5225 				}
5226 				rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, 0, 0);
5227 				if (rc != 0) {
5228 					pr_err("error %d\n", rc);
5229 					goto rw_error;
5230 				}
5231 			}
5232 			break;
5233 
5234 		case DRX_AGC_CTRL_USER:
5235 
5236 			/* Enable IF AGC DAC */
5237 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5238 			if (rc != 0) {
5239 				pr_err("error %d\n", rc);
5240 				goto rw_error;
5241 			}
5242 			data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5243 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5244 			if (rc != 0) {
5245 				pr_err("error %d\n", rc);
5246 				goto rw_error;
5247 			}
5248 
5249 			/* Disable SCU IF AGC loop */
5250 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5251 			if (rc != 0) {
5252 				pr_err("error %d\n", rc);
5253 				goto rw_error;
5254 			}
5255 			data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5256 			data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5257 			if (common_attr->tuner_if_agc_pol)
5258 				data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5259 			else
5260 				data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5261 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5262 			if (rc != 0) {
5263 				pr_err("error %d\n", rc);
5264 				goto rw_error;
5265 			}
5266 
5267 			/* Write value to output pin */
5268 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->output_level, 0);
5269 			if (rc != 0) {
5270 				pr_err("error %d\n", rc);
5271 				goto rw_error;
5272 			}
5273 			break;
5274 
5275 		case DRX_AGC_CTRL_OFF:
5276 
5277 			/* Disable If AGC DAC */
5278 			rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5279 			if (rc != 0) {
5280 				pr_err("error %d\n", rc);
5281 				goto rw_error;
5282 			}
5283 			data &= (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE);
5284 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5285 			if (rc != 0) {
5286 				pr_err("error %d\n", rc);
5287 				goto rw_error;
5288 			}
5289 
5290 			/* Disable SCU IF AGC loop */
5291 			rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5292 			if (rc != 0) {
5293 				pr_err("error %d\n", rc);
5294 				goto rw_error;
5295 			}
5296 			data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5297 			data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5298 			rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5299 			if (rc != 0) {
5300 				pr_err("error %d\n", rc);
5301 				goto rw_error;
5302 			}
5303 			break;
5304 		default:
5305 			return -EINVAL;
5306 		}		/* switch ( agcsettings->ctrl_mode ) */
5307 
5308 		/* always set the top to support configurations without if-loop */
5309 		rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, agc_settings->top, 0);
5310 		if (rc != 0) {
5311 			pr_err("error %d\n", rc);
5312 			goto rw_error;
5313 		}
5314 	}
5315 
5316 	/* Store if agc settings */
5317 	switch (agc_settings->standard) {
5318 	case DRX_STANDARD_8VSB:
5319 		ext_attr->vsb_if_agc_cfg = *agc_settings;
5320 		break;
5321 #ifndef DRXJ_VSB_ONLY
5322 	case DRX_STANDARD_ITU_A:
5323 	case DRX_STANDARD_ITU_B:
5324 	case DRX_STANDARD_ITU_C:
5325 		ext_attr->qam_if_agc_cfg = *agc_settings;
5326 		break;
5327 #endif
5328 	default:
5329 		return -EIO;
5330 	}
5331 
5332 	return 0;
5333 rw_error:
5334 	return rc;
5335 }
5336 
5337 /**
5338 * \fn int set_iqm_af ()
5339 * \brief Configure IQM AF registers
5340 * \param demod instance of demodulator.
5341 * \param active
5342 * \return int.
5343 */
5344 static int set_iqm_af(struct drx_demod_instance *demod, bool active)
5345 {
5346 	u16 data = 0;
5347 	struct i2c_device_addr *dev_addr = NULL;
5348 	int rc;
5349 
5350 	dev_addr = demod->my_i2c_dev_addr;
5351 
5352 	/* Configure IQM */
5353 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5354 	if (rc != 0) {
5355 		pr_err("error %d\n", rc);
5356 		goto rw_error;
5357 	}
5358 	if (!active)
5359 		data &= ((~IQM_AF_STDBY_STDBY_ADC_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_AMP_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_PD_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE));
5360 	else
5361 		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);
5362 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5363 	if (rc != 0) {
5364 		pr_err("error %d\n", rc);
5365 		goto rw_error;
5366 	}
5367 
5368 	return 0;
5369 rw_error:
5370 	return rc;
5371 }
5372 
5373 /*============================================================================*/
5374 /*==              END 8VSB & QAM COMMON DATAPATH FUNCTIONS                  ==*/
5375 /*============================================================================*/
5376 
5377 /*============================================================================*/
5378 /*============================================================================*/
5379 /*==                       8VSB DATAPATH FUNCTIONS                          ==*/
5380 /*============================================================================*/
5381 /*============================================================================*/
5382 
5383 /**
5384 * \fn int power_down_vsb ()
5385 * \brief Powr down QAM related blocks.
5386 * \param demod instance of demodulator.
5387 * \param channel pointer to channel data.
5388 * \return int.
5389 */
5390 static int power_down_vsb(struct drx_demod_instance *demod, bool primary)
5391 {
5392 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
5393 	struct drxjscu_cmd cmd_scu = { /* command     */ 0,
5394 		/* parameter_len */ 0,
5395 		/* result_len    */ 0,
5396 		/* *parameter   */ NULL,
5397 		/* *result      */ NULL
5398 	};
5399 	struct drx_cfg_mpeg_output cfg_mpeg_output;
5400 	int rc;
5401 	u16 cmd_result = 0;
5402 
5403 	/*
5404 	   STOP demodulator
5405 	   reset of FEC and VSB HW
5406 	 */
5407 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
5408 	    SCU_RAM_COMMAND_CMD_DEMOD_STOP;
5409 	cmd_scu.parameter_len = 0;
5410 	cmd_scu.result_len = 1;
5411 	cmd_scu.parameter = NULL;
5412 	cmd_scu.result = &cmd_result;
5413 	rc = scu_command(dev_addr, &cmd_scu);
5414 	if (rc != 0) {
5415 		pr_err("error %d\n", rc);
5416 		goto rw_error;
5417 	}
5418 
5419 	/* stop all comm_exec */
5420 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5421 	if (rc != 0) {
5422 		pr_err("error %d\n", rc);
5423 		goto rw_error;
5424 	}
5425 	rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5426 	if (rc != 0) {
5427 		pr_err("error %d\n", rc);
5428 		goto rw_error;
5429 	}
5430 	if (primary) {
5431 		rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
5432 		if (rc != 0) {
5433 			pr_err("error %d\n", rc);
5434 			goto rw_error;
5435 		}
5436 		rc = set_iqm_af(demod, false);
5437 		if (rc != 0) {
5438 			pr_err("error %d\n", rc);
5439 			goto rw_error;
5440 		}
5441 	} else {
5442 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5443 		if (rc != 0) {
5444 			pr_err("error %d\n", rc);
5445 			goto rw_error;
5446 		}
5447 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5448 		if (rc != 0) {
5449 			pr_err("error %d\n", rc);
5450 			goto rw_error;
5451 		}
5452 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5453 		if (rc != 0) {
5454 			pr_err("error %d\n", rc);
5455 			goto rw_error;
5456 		}
5457 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5458 		if (rc != 0) {
5459 			pr_err("error %d\n", rc);
5460 			goto rw_error;
5461 		}
5462 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5463 		if (rc != 0) {
5464 			pr_err("error %d\n", rc);
5465 			goto rw_error;
5466 		}
5467 	}
5468 
5469 	cfg_mpeg_output.enable_mpeg_output = false;
5470 	rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
5471 	if (rc != 0) {
5472 		pr_err("error %d\n", rc);
5473 		goto rw_error;
5474 	}
5475 
5476 	return 0;
5477 rw_error:
5478 	return rc;
5479 }
5480 
5481 /**
5482 * \fn int set_vsb_leak_n_gain ()
5483 * \brief Set ATSC demod.
5484 * \param demod instance of demodulator.
5485 * \return int.
5486 */
5487 static int set_vsb_leak_n_gain(struct drx_demod_instance *demod)
5488 {
5489 	struct i2c_device_addr *dev_addr = NULL;
5490 	int rc;
5491 
5492 	const u8 vsb_ffe_leak_gain_ram0[] = {
5493 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO1  */
5494 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO2  */
5495 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO3  */
5496 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO4  */
5497 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO5  */
5498 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO6  */
5499 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO7  */
5500 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO8  */
5501 		DRXJ_16TO8(0xf),	/* FFETRAINLKRATIO9  */
5502 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO10  */
5503 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO11 */
5504 		DRXJ_16TO8(0x8),	/* FFETRAINLKRATIO12 */
5505 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO1 */
5506 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO2 */
5507 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO3 */
5508 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO4 */
5509 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO5 */
5510 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO6 */
5511 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO7 */
5512 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO8 */
5513 		DRXJ_16TO8(0x20),	/* FFERCA1TRAINLKRATIO9 */
5514 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO10 */
5515 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO11 */
5516 		DRXJ_16TO8(0x10),	/* FFERCA1TRAINLKRATIO12 */
5517 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO1 */
5518 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO2 */
5519 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO3 */
5520 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO4 */
5521 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO5 */
5522 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO6 */
5523 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO7 */
5524 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO8 */
5525 		DRXJ_16TO8(0x20),	/* FFERCA1DATALKRATIO9 */
5526 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO10 */
5527 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO11 */
5528 		DRXJ_16TO8(0x10),	/* FFERCA1DATALKRATIO12 */
5529 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO1 */
5530 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO2 */
5531 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO3 */
5532 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO4 */
5533 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO5 */
5534 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO6 */
5535 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO7 */
5536 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO8 */
5537 		DRXJ_16TO8(0x20),	/* FFERCA2TRAINLKRATIO9 */
5538 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO10 */
5539 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO11 */
5540 		DRXJ_16TO8(0x10),	/* FFERCA2TRAINLKRATIO12 */
5541 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO1 */
5542 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO2 */
5543 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO3 */
5544 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO4 */
5545 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO5 */
5546 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO6 */
5547 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO7 */
5548 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO8 */
5549 		DRXJ_16TO8(0x20),	/* FFERCA2DATALKRATIO9 */
5550 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO10 */
5551 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO11 */
5552 		DRXJ_16TO8(0x10),	/* FFERCA2DATALKRATIO12 */
5553 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO1 */
5554 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO2 */
5555 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO3 */
5556 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO4 */
5557 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO5 */
5558 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO6 */
5559 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO7 */
5560 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO8 */
5561 		DRXJ_16TO8(0x0e),	/* FFEDDM1TRAINLKRATIO9 */
5562 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO10 */
5563 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO11 */
5564 		DRXJ_16TO8(0x07),	/* FFEDDM1TRAINLKRATIO12 */
5565 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO1 */
5566 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO2 */
5567 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO3 */
5568 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO4 */
5569 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO5 */
5570 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO6 */
5571 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO7 */
5572 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO8 */
5573 		DRXJ_16TO8(0x0e),	/* FFEDDM1DATALKRATIO9 */
5574 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO10 */
5575 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO11 */
5576 		DRXJ_16TO8(0x07),	/* FFEDDM1DATALKRATIO12 */
5577 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO1 */
5578 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO2 */
5579 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO3 */
5580 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO4 */
5581 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO5 */
5582 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO6 */
5583 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO7 */
5584 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO8 */
5585 		DRXJ_16TO8(0x0c),	/* FFEDDM2TRAINLKRATIO9 */
5586 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO10 */
5587 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO11 */
5588 		DRXJ_16TO8(0x06),	/* FFEDDM2TRAINLKRATIO12 */
5589 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO1 */
5590 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO2 */
5591 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO3 */
5592 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO4 */
5593 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO5 */
5594 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO6 */
5595 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO7 */
5596 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO8 */
5597 		DRXJ_16TO8(0x0c),	/* FFEDDM2DATALKRATIO9 */
5598 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO10 */
5599 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO11 */
5600 		DRXJ_16TO8(0x06),	/* FFEDDM2DATALKRATIO12 */
5601 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN1 */
5602 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN2 */
5603 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN3 */
5604 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN4 */
5605 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN5 */
5606 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN6 */
5607 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN7 */
5608 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN8 */
5609 		DRXJ_16TO8(0x4040),	/* FIRTRAINGAIN9 */
5610 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN10 */
5611 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN11 */
5612 		DRXJ_16TO8(0x2020),	/* FIRTRAINGAIN12 */
5613 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN1 */
5614 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN2 */
5615 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN3 */
5616 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN4 */
5617 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN5 */
5618 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN6 */
5619 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN7 */
5620 		DRXJ_16TO8(0x1010)	/* FIRRCA1GAIN8 */
5621 	};
5622 
5623 	const u8 vsb_ffe_leak_gain_ram1[] = {
5624 		DRXJ_16TO8(0x1010),	/* FIRRCA1GAIN9 */
5625 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN10 */
5626 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN11 */
5627 		DRXJ_16TO8(0x0808),	/* FIRRCA1GAIN12 */
5628 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN1 */
5629 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN2 */
5630 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN3 */
5631 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN4 */
5632 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN5 */
5633 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN6 */
5634 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN7 */
5635 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN8 */
5636 		DRXJ_16TO8(0x1010),	/* FIRRCA2GAIN9 */
5637 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN10 */
5638 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN11 */
5639 		DRXJ_16TO8(0x0808),	/* FIRRCA2GAIN12 */
5640 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN1 */
5641 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN2 */
5642 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN3 */
5643 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN4 */
5644 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN5 */
5645 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN6 */
5646 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN7 */
5647 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN8 */
5648 		DRXJ_16TO8(0x0606),	/* FIRDDM1GAIN9 */
5649 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN10 */
5650 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN11 */
5651 		DRXJ_16TO8(0x0303),	/* FIRDDM1GAIN12 */
5652 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN1 */
5653 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN2 */
5654 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN3 */
5655 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN4 */
5656 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN5 */
5657 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN6 */
5658 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN7 */
5659 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN8 */
5660 		DRXJ_16TO8(0x0505),	/* FIRDDM2GAIN9 */
5661 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN10 */
5662 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN11 */
5663 		DRXJ_16TO8(0x0303),	/* FIRDDM2GAIN12 */
5664 		DRXJ_16TO8(0x001f),	/* DFETRAINLKRATIO */
5665 		DRXJ_16TO8(0x01ff),	/* DFERCA1TRAINLKRATIO */
5666 		DRXJ_16TO8(0x01ff),	/* DFERCA1DATALKRATIO */
5667 		DRXJ_16TO8(0x004f),	/* DFERCA2TRAINLKRATIO */
5668 		DRXJ_16TO8(0x004f),	/* DFERCA2DATALKRATIO */
5669 		DRXJ_16TO8(0x01ff),	/* DFEDDM1TRAINLKRATIO */
5670 		DRXJ_16TO8(0x01ff),	/* DFEDDM1DATALKRATIO */
5671 		DRXJ_16TO8(0x0352),	/* DFEDDM2TRAINLKRATIO */
5672 		DRXJ_16TO8(0x0352),	/* DFEDDM2DATALKRATIO */
5673 		DRXJ_16TO8(0x0000),	/* DFETRAINGAIN */
5674 		DRXJ_16TO8(0x2020),	/* DFERCA1GAIN */
5675 		DRXJ_16TO8(0x1010),	/* DFERCA2GAIN */
5676 		DRXJ_16TO8(0x1818),	/* DFEDDM1GAIN */
5677 		DRXJ_16TO8(0x1212)	/* DFEDDM2GAIN */
5678 	};
5679 
5680 	dev_addr = demod->my_i2c_dev_addr;
5681 	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);
5682 	if (rc != 0) {
5683 		pr_err("error %d\n", rc);
5684 		goto rw_error;
5685 	}
5686 	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);
5687 	if (rc != 0) {
5688 		pr_err("error %d\n", rc);
5689 		goto rw_error;
5690 	}
5691 
5692 	return 0;
5693 rw_error:
5694 	return rc;
5695 }
5696 
5697 /**
5698 * \fn int set_vsb()
5699 * \brief Set 8VSB demod.
5700 * \param demod instance of demodulator.
5701 * \return int.
5702 *
5703 */
5704 static int set_vsb(struct drx_demod_instance *demod)
5705 {
5706 	struct i2c_device_addr *dev_addr = NULL;
5707 	int rc;
5708 	struct drx_common_attr *common_attr = NULL;
5709 	struct drxjscu_cmd cmd_scu;
5710 	struct drxj_data *ext_attr = NULL;
5711 	u16 cmd_result = 0;
5712 	u16 cmd_param = 0;
5713 	const u8 vsb_taps_re[] = {
5714 		DRXJ_16TO8(-2),	/* re0  */
5715 		DRXJ_16TO8(4),	/* re1  */
5716 		DRXJ_16TO8(1),	/* re2  */
5717 		DRXJ_16TO8(-4),	/* re3  */
5718 		DRXJ_16TO8(1),	/* re4  */
5719 		DRXJ_16TO8(4),	/* re5  */
5720 		DRXJ_16TO8(-3),	/* re6  */
5721 		DRXJ_16TO8(-3),	/* re7  */
5722 		DRXJ_16TO8(6),	/* re8  */
5723 		DRXJ_16TO8(1),	/* re9  */
5724 		DRXJ_16TO8(-9),	/* re10 */
5725 		DRXJ_16TO8(3),	/* re11 */
5726 		DRXJ_16TO8(12),	/* re12 */
5727 		DRXJ_16TO8(-9),	/* re13 */
5728 		DRXJ_16TO8(-15),	/* re14 */
5729 		DRXJ_16TO8(17),	/* re15 */
5730 		DRXJ_16TO8(19),	/* re16 */
5731 		DRXJ_16TO8(-29),	/* re17 */
5732 		DRXJ_16TO8(-22),	/* re18 */
5733 		DRXJ_16TO8(45),	/* re19 */
5734 		DRXJ_16TO8(25),	/* re20 */
5735 		DRXJ_16TO8(-70),	/* re21 */
5736 		DRXJ_16TO8(-28),	/* re22 */
5737 		DRXJ_16TO8(111),	/* re23 */
5738 		DRXJ_16TO8(30),	/* re24 */
5739 		DRXJ_16TO8(-201),	/* re25 */
5740 		DRXJ_16TO8(-31),	/* re26 */
5741 		DRXJ_16TO8(629)	/* re27 */
5742 	};
5743 
5744 	dev_addr = demod->my_i2c_dev_addr;
5745 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
5746 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
5747 
5748 	/* stop all comm_exec */
5749 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5750 	if (rc != 0) {
5751 		pr_err("error %d\n", rc);
5752 		goto rw_error;
5753 	}
5754 	rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5755 	if (rc != 0) {
5756 		pr_err("error %d\n", rc);
5757 		goto rw_error;
5758 	}
5759 	rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5760 	if (rc != 0) {
5761 		pr_err("error %d\n", rc);
5762 		goto rw_error;
5763 	}
5764 	rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5765 	if (rc != 0) {
5766 		pr_err("error %d\n", rc);
5767 		goto rw_error;
5768 	}
5769 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5770 	if (rc != 0) {
5771 		pr_err("error %d\n", rc);
5772 		goto rw_error;
5773 	}
5774 	rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5775 	if (rc != 0) {
5776 		pr_err("error %d\n", rc);
5777 		goto rw_error;
5778 	}
5779 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5780 	if (rc != 0) {
5781 		pr_err("error %d\n", rc);
5782 		goto rw_error;
5783 	}
5784 
5785 	/* reset demodulator */
5786 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
5787 	    | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
5788 	cmd_scu.parameter_len = 0;
5789 	cmd_scu.result_len = 1;
5790 	cmd_scu.parameter = NULL;
5791 	cmd_scu.result = &cmd_result;
5792 	rc = scu_command(dev_addr, &cmd_scu);
5793 	if (rc != 0) {
5794 		pr_err("error %d\n", rc);
5795 		goto rw_error;
5796 	}
5797 
5798 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_DCF_BYPASS__A, 1, 0);
5799 	if (rc != 0) {
5800 		pr_err("error %d\n", rc);
5801 		goto rw_error;
5802 	}
5803 	rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, IQM_FS_ADJ_SEL_B_VSB, 0);
5804 	if (rc != 0) {
5805 		pr_err("error %d\n", rc);
5806 		goto rw_error;
5807 	}
5808 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, IQM_RC_ADJ_SEL_B_VSB, 0);
5809 	if (rc != 0) {
5810 		pr_err("error %d\n", rc);
5811 		goto rw_error;
5812 	}
5813 	ext_attr->iqm_rc_rate_ofs = 0x00AD0D79;
5814 	rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, ext_attr->iqm_rc_rate_ofs, 0);
5815 	if (rc != 0) {
5816 		pr_err("error %d\n", rc);
5817 		goto rw_error;
5818 	}
5819 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CFAGC_GAINSHIFT__A, 4, 0);
5820 	if (rc != 0) {
5821 		pr_err("error %d\n", rc);
5822 		goto rw_error;
5823 	}
5824 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 1, 0);
5825 	if (rc != 0) {
5826 		pr_err("error %d\n", rc);
5827 		goto rw_error;
5828 	}
5829 
5830 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_CROUT_ENA__A, 1, 0);
5831 	if (rc != 0) {
5832 		pr_err("error %d\n", rc);
5833 		goto rw_error;
5834 	}
5835 	rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, 28, 0);
5836 	if (rc != 0) {
5837 		pr_err("error %d\n", rc);
5838 		goto rw_error;
5839 	}
5840 	rc = drxj_dap_write_reg16(dev_addr, IQM_RT_ACTIVE__A, 0, 0);
5841 	if (rc != 0) {
5842 		pr_err("error %d\n", rc);
5843 		goto rw_error;
5844 	}
5845 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
5846 	if (rc != 0) {
5847 		pr_err("error %d\n", rc);
5848 		goto rw_error;
5849 	}
5850 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
5851 	if (rc != 0) {
5852 		pr_err("error %d\n", rc);
5853 		goto rw_error;
5854 	}
5855 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_VSB__M, 0);
5856 	if (rc != 0) {
5857 		pr_err("error %d\n", rc);
5858 		goto rw_error;
5859 	}
5860 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE__A, 1393, 0);
5861 	if (rc != 0) {
5862 		pr_err("error %d\n", rc);
5863 		goto rw_error;
5864 	}
5865 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
5866 	if (rc != 0) {
5867 		pr_err("error %d\n", rc);
5868 		goto rw_error;
5869 	}
5870 	rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
5871 	if (rc != 0) {
5872 		pr_err("error %d\n", rc);
5873 		goto rw_error;
5874 	}
5875 
5876 	rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5877 	if (rc != 0) {
5878 		pr_err("error %d\n", rc);
5879 		goto rw_error;
5880 	}
5881 	rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5882 	if (rc != 0) {
5883 		pr_err("error %d\n", rc);
5884 		goto rw_error;
5885 	}
5886 
5887 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BNTHRESH__A, 330, 0);
5888 	if (rc != 0) {
5889 		pr_err("error %d\n", rc);
5890 		goto rw_error;
5891 	}	/* set higher threshold */
5892 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CLPLASTNUM__A, 90, 0);
5893 	if (rc != 0) {
5894 		pr_err("error %d\n", rc);
5895 		goto rw_error;
5896 	}	/* burst detection on   */
5897 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA1__A, 0x0042, 0);
5898 	if (rc != 0) {
5899 		pr_err("error %d\n", rc);
5900 		goto rw_error;
5901 	}	/* drop thresholds by 1 dB */
5902 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA2__A, 0x0053, 0);
5903 	if (rc != 0) {
5904 		pr_err("error %d\n", rc);
5905 		goto rw_error;
5906 	}	/* drop thresholds by 2 dB */
5907 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_EQCTRL__A, 0x1, 0);
5908 	if (rc != 0) {
5909 		pr_err("error %d\n", rc);
5910 		goto rw_error;
5911 	}	/* cma on               */
5912 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
5913 	if (rc != 0) {
5914 		pr_err("error %d\n", rc);
5915 		goto rw_error;
5916 	}	/* GPIO               */
5917 
5918 	/* Initialize the FEC Subsystem */
5919 	rc = drxj_dap_write_reg16(dev_addr, FEC_TOP_ANNEX__A, FEC_TOP_ANNEX_D, 0);
5920 	if (rc != 0) {
5921 		pr_err("error %d\n", rc);
5922 		goto rw_error;
5923 	}
5924 	{
5925 		u16 fec_oc_snc_mode = 0;
5926 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
5927 		if (rc != 0) {
5928 			pr_err("error %d\n", rc);
5929 			goto rw_error;
5930 		}
5931 		/* output data even when not locked */
5932 		rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode | FEC_OC_SNC_MODE_UNLOCK_ENABLE__M, 0);
5933 		if (rc != 0) {
5934 			pr_err("error %d\n", rc);
5935 			goto rw_error;
5936 		}
5937 	}
5938 
5939 	/* set clip */
5940 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
5941 	if (rc != 0) {
5942 		pr_err("error %d\n", rc);
5943 		goto rw_error;
5944 	}
5945 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 470, 0);
5946 	if (rc != 0) {
5947 		pr_err("error %d\n", rc);
5948 		goto rw_error;
5949 	}
5950 	rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
5951 	if (rc != 0) {
5952 		pr_err("error %d\n", rc);
5953 		goto rw_error;
5954 	}
5955 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0xD4, 0);
5956 	if (rc != 0) {
5957 		pr_err("error %d\n", rc);
5958 		goto rw_error;
5959 	}
5960 	/* no transparent, no A&C framing; parity is set in mpegoutput */
5961 	{
5962 		u16 fec_oc_reg_mode = 0;
5963 		rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
5964 		if (rc != 0) {
5965 			pr_err("error %d\n", rc);
5966 			goto rw_error;
5967 		}
5968 		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);
5969 		if (rc != 0) {
5970 			pr_err("error %d\n", rc);
5971 			goto rw_error;
5972 		}
5973 	}
5974 
5975 	rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_LO__A, 0, 0);
5976 	if (rc != 0) {
5977 		pr_err("error %d\n", rc);
5978 		goto rw_error;
5979 	}	/* timeout counter for restarting */
5980 	rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_HI__A, 3, 0);
5981 	if (rc != 0) {
5982 		pr_err("error %d\n", rc);
5983 		goto rw_error;
5984 	}
5985 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MODE__A, 0, 0);
5986 	if (rc != 0) {
5987 		pr_err("error %d\n", rc);
5988 		goto rw_error;
5989 	}	/* bypass disabled */
5990 	/* initialize RS packet error measurement parameters */
5991 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, FEC_RS_MEASUREMENT_PERIOD, 0);
5992 	if (rc != 0) {
5993 		pr_err("error %d\n", rc);
5994 		goto rw_error;
5995 	}
5996 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, FEC_RS_MEASUREMENT_PRESCALE, 0);
5997 	if (rc != 0) {
5998 		pr_err("error %d\n", rc);
5999 		goto rw_error;
6000 	}
6001 
6002 	/* init measurement period of MER/SER */
6003 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_MEASUREMENT_PERIOD__A, VSB_TOP_MEASUREMENT_PERIOD, 0);
6004 	if (rc != 0) {
6005 		pr_err("error %d\n", rc);
6006 		goto rw_error;
6007 	}
6008 	rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6009 	if (rc != 0) {
6010 		pr_err("error %d\n", rc);
6011 		goto rw_error;
6012 	}
6013 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6014 	if (rc != 0) {
6015 		pr_err("error %d\n", rc);
6016 		goto rw_error;
6017 	}
6018 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6019 	if (rc != 0) {
6020 		pr_err("error %d\n", rc);
6021 		goto rw_error;
6022 	}
6023 
6024 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CKGN1TRK__A, 128, 0);
6025 	if (rc != 0) {
6026 		pr_err("error %d\n", rc);
6027 		goto rw_error;
6028 	}
6029 	/* B-Input to ADC, PGA+filter in standby */
6030 	if (!ext_attr->has_lna) {
6031 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
6032 		if (rc != 0) {
6033 			pr_err("error %d\n", rc);
6034 			goto rw_error;
6035 		}
6036 	}
6037 
6038 	/* turn on IQMAF. It has to be in front of setAgc**() */
6039 	rc = set_iqm_af(demod, true);
6040 	if (rc != 0) {
6041 		pr_err("error %d\n", rc);
6042 		goto rw_error;
6043 	}
6044 	rc = adc_synchronization(demod);
6045 	if (rc != 0) {
6046 		pr_err("error %d\n", rc);
6047 		goto rw_error;
6048 	}
6049 
6050 	rc = init_agc(demod);
6051 	if (rc != 0) {
6052 		pr_err("error %d\n", rc);
6053 		goto rw_error;
6054 	}
6055 	rc = set_agc_if(demod, &(ext_attr->vsb_if_agc_cfg), false);
6056 	if (rc != 0) {
6057 		pr_err("error %d\n", rc);
6058 		goto rw_error;
6059 	}
6060 	rc = set_agc_rf(demod, &(ext_attr->vsb_rf_agc_cfg), false);
6061 	if (rc != 0) {
6062 		pr_err("error %d\n", rc);
6063 		goto rw_error;
6064 	}
6065 	{
6066 		/* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
6067 		   of only the gain */
6068 		struct drxj_cfg_afe_gain vsb_pga_cfg = { DRX_STANDARD_8VSB, 0 };
6069 
6070 		vsb_pga_cfg.gain = ext_attr->vsb_pga_cfg;
6071 		rc = ctrl_set_cfg_afe_gain(demod, &vsb_pga_cfg);
6072 		if (rc != 0) {
6073 			pr_err("error %d\n", rc);
6074 			goto rw_error;
6075 		}
6076 	}
6077 	rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->vsb_pre_saw_cfg));
6078 	if (rc != 0) {
6079 		pr_err("error %d\n", rc);
6080 		goto rw_error;
6081 	}
6082 
6083 	/* Mpeg output has to be in front of FEC active */
6084 	rc = set_mpegtei_handling(demod);
6085 	if (rc != 0) {
6086 		pr_err("error %d\n", rc);
6087 		goto rw_error;
6088 	}
6089 	rc = bit_reverse_mpeg_output(demod);
6090 	if (rc != 0) {
6091 		pr_err("error %d\n", rc);
6092 		goto rw_error;
6093 	}
6094 	rc = set_mpeg_start_width(demod);
6095 	if (rc != 0) {
6096 		pr_err("error %d\n", rc);
6097 		goto rw_error;
6098 	}
6099 	{
6100 		/* TODO: move to set_standard after hardware reset value problem is solved */
6101 		/* Configure initial MPEG output */
6102 		struct drx_cfg_mpeg_output cfg_mpeg_output;
6103 
6104 		memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6105 		cfg_mpeg_output.enable_mpeg_output = true;
6106 
6107 		rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6108 		if (rc != 0) {
6109 			pr_err("error %d\n", rc);
6110 			goto rw_error;
6111 		}
6112 	}
6113 
6114 	/* TBD: what parameters should be set */
6115 	cmd_param = 0x00;	/* Default mode AGC on, etc */
6116 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6117 	    | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
6118 	cmd_scu.parameter_len = 1;
6119 	cmd_scu.result_len = 1;
6120 	cmd_scu.parameter = &cmd_param;
6121 	cmd_scu.result = &cmd_result;
6122 	rc = scu_command(dev_addr, &cmd_scu);
6123 	if (rc != 0) {
6124 		pr_err("error %d\n", rc);
6125 		goto rw_error;
6126 	}
6127 
6128 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEAGC_GAINSHIFT__A, 0x0004, 0);
6129 	if (rc != 0) {
6130 		pr_err("error %d\n", rc);
6131 		goto rw_error;
6132 	}
6133 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0x00D2, 0);
6134 	if (rc != 0) {
6135 		pr_err("error %d\n", rc);
6136 		goto rw_error;
6137 	}
6138 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SYSSMTRNCTRL__A, VSB_TOP_SYSSMTRNCTRL__PRE | VSB_TOP_SYSSMTRNCTRL_NCOTIMEOUTCNTEN__M, 0);
6139 	if (rc != 0) {
6140 		pr_err("error %d\n", rc);
6141 		goto rw_error;
6142 	}
6143 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEDETCTRL__A, 0x142, 0);
6144 	if (rc != 0) {
6145 		pr_err("error %d\n", rc);
6146 		goto rw_error;
6147 	}
6148 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_LBAGCREFLVL__A, 640, 0);
6149 	if (rc != 0) {
6150 		pr_err("error %d\n", rc);
6151 		goto rw_error;
6152 	}
6153 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1ACQ__A, 4, 0);
6154 	if (rc != 0) {
6155 		pr_err("error %d\n", rc);
6156 		goto rw_error;
6157 	}
6158 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 2, 0);
6159 	if (rc != 0) {
6160 		pr_err("error %d\n", rc);
6161 		goto rw_error;
6162 	}
6163 	rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN2TRK__A, 3, 0);
6164 	if (rc != 0) {
6165 		pr_err("error %d\n", rc);
6166 		goto rw_error;
6167 	}
6168 
6169 	/* start demodulator */
6170 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6171 	    | SCU_RAM_COMMAND_CMD_DEMOD_START;
6172 	cmd_scu.parameter_len = 0;
6173 	cmd_scu.result_len = 1;
6174 	cmd_scu.parameter = NULL;
6175 	cmd_scu.result = &cmd_result;
6176 	rc = scu_command(dev_addr, &cmd_scu);
6177 	if (rc != 0) {
6178 		pr_err("error %d\n", rc);
6179 		goto rw_error;
6180 	}
6181 
6182 	rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
6183 	if (rc != 0) {
6184 		pr_err("error %d\n", rc);
6185 		goto rw_error;
6186 	}
6187 	rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_ACTIVE, 0);
6188 	if (rc != 0) {
6189 		pr_err("error %d\n", rc);
6190 		goto rw_error;
6191 	}
6192 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
6193 	if (rc != 0) {
6194 		pr_err("error %d\n", rc);
6195 		goto rw_error;
6196 	}
6197 
6198 	return 0;
6199 rw_error:
6200 	return rc;
6201 }
6202 
6203 /**
6204 * \fn static short get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *PckErrs)
6205 * \brief Get the values of packet error in 8VSB mode
6206 * \return Error code
6207 */
6208 static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr,
6209 				   u32 *pck_errs, u32 *pck_count)
6210 {
6211 	int rc;
6212 	u16 data = 0;
6213 	u16 period = 0;
6214 	u16 prescale = 0;
6215 	u16 packet_errors_mant = 0;
6216 	u16 packet_errors_exp = 0;
6217 
6218 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &data, 0);
6219 	if (rc != 0) {
6220 		pr_err("error %d\n", rc);
6221 		goto rw_error;
6222 	}
6223 	packet_errors_mant = data & FEC_RS_NR_FAILURES_FIXED_MANT__M;
6224 	packet_errors_exp = (data & FEC_RS_NR_FAILURES_EXP__M)
6225 	    >> FEC_RS_NR_FAILURES_EXP__B;
6226 	period = FEC_RS_MEASUREMENT_PERIOD;
6227 	prescale = FEC_RS_MEASUREMENT_PRESCALE;
6228 	/* packet error rate = (error packet number) per second */
6229 	/* 77.3 us is time for per packet */
6230 	if (period * prescale == 0) {
6231 		pr_err("error: period and/or prescale is zero!\n");
6232 		return -EIO;
6233 	}
6234 	*pck_errs = packet_errors_mant * (1 << packet_errors_exp);
6235 	*pck_count = period * prescale * 77;
6236 
6237 	return 0;
6238 rw_error:
6239 	return rc;
6240 }
6241 
6242 /**
6243 * \fn static short GetVSBBer(struct i2c_device_addr *dev_addr, u32 *ber)
6244 * \brief Get the values of ber in VSB mode
6245 * \return Error code
6246 */
6247 static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr,
6248 				    u32 *ber, u32 *cnt)
6249 {
6250 	int rc;
6251 	u16 data = 0;
6252 	u16 period = 0;
6253 	u16 prescale = 0;
6254 	u16 bit_errors_mant = 0;
6255 	u16 bit_errors_exp = 0;
6256 
6257 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &data, 0);
6258 	if (rc != 0) {
6259 		pr_err("error %d\n", rc);
6260 		goto rw_error;
6261 	}
6262 	period = FEC_RS_MEASUREMENT_PERIOD;
6263 	prescale = FEC_RS_MEASUREMENT_PRESCALE;
6264 
6265 	bit_errors_mant = data & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M;
6266 	bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M)
6267 	    >> FEC_RS_NR_BIT_ERRORS_EXP__B;
6268 
6269 	*cnt = period * prescale * 207 * ((bit_errors_exp > 2) ? 1 : 8);
6270 
6271 	if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700)
6272 		*ber = (*cnt) * 26570;
6273 	else {
6274 		if (period * prescale == 0) {
6275 			pr_err("error: period and/or prescale is zero!\n");
6276 			return -EIO;
6277 		}
6278 		*ber = bit_errors_mant << ((bit_errors_exp > 2) ?
6279 			(bit_errors_exp - 3) : bit_errors_exp);
6280 	}
6281 
6282 	return 0;
6283 rw_error:
6284 	return rc;
6285 }
6286 
6287 /**
6288 * \fn static short get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
6289 * \brief Get the values of ber in VSB mode
6290 * \return Error code
6291 */
6292 static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr,
6293 				   u32 *ber, u32 *cnt)
6294 {
6295 	u16 data = 0;
6296 	int rc;
6297 
6298 	rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0);
6299 	if (rc != 0) {
6300 		pr_err("error %d\n", rc);
6301 		return -EIO;
6302 	}
6303 	*ber = data;
6304 	*cnt = VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT;
6305 
6306 	return 0;
6307 }
6308 
6309 /**
6310 * \fn static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6311 * \brief Get the values of MER
6312 * \return Error code
6313 */
6314 static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6315 {
6316 	int rc;
6317 	u16 data_hi = 0;
6318 
6319 	rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_ERR_ENERGY_H__A, &data_hi, 0);
6320 	if (rc != 0) {
6321 		pr_err("error %d\n", rc);
6322 		goto rw_error;
6323 	}
6324 	*mer =
6325 	    (u16) (log1_times100(21504) - log1_times100((data_hi << 6) / 52));
6326 
6327 	return 0;
6328 rw_error:
6329 	return rc;
6330 }
6331 
6332 
6333 /*============================================================================*/
6334 /*==                     END 8VSB DATAPATH FUNCTIONS                        ==*/
6335 /*============================================================================*/
6336 
6337 /*============================================================================*/
6338 /*============================================================================*/
6339 /*==                       QAM DATAPATH FUNCTIONS                           ==*/
6340 /*============================================================================*/
6341 /*============================================================================*/
6342 
6343 /**
6344 * \fn int power_down_qam ()
6345 * \brief Powr down QAM related blocks.
6346 * \param demod instance of demodulator.
6347 * \param channel pointer to channel data.
6348 * \return int.
6349 */
6350 static int power_down_qam(struct drx_demod_instance *demod, bool primary)
6351 {
6352 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
6353 		/* parameter_len */ 0,
6354 		/* result_len    */ 0,
6355 		/* *parameter   */ NULL,
6356 		/* *result      */ NULL
6357 	};
6358 	int rc;
6359 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6360 	struct drx_cfg_mpeg_output cfg_mpeg_output;
6361 	struct drx_common_attr *common_attr = demod->my_common_attr;
6362 	u16 cmd_result = 0;
6363 
6364 	/*
6365 	   STOP demodulator
6366 	   resets IQM, QAM and FEC HW blocks
6367 	 */
6368 	/* stop all comm_exec */
6369 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
6370 	if (rc != 0) {
6371 		pr_err("error %d\n", rc);
6372 		goto rw_error;
6373 	}
6374 	rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
6375 	if (rc != 0) {
6376 		pr_err("error %d\n", rc);
6377 		goto rw_error;
6378 	}
6379 
6380 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
6381 	    SCU_RAM_COMMAND_CMD_DEMOD_STOP;
6382 	cmd_scu.parameter_len = 0;
6383 	cmd_scu.result_len = 1;
6384 	cmd_scu.parameter = NULL;
6385 	cmd_scu.result = &cmd_result;
6386 	rc = scu_command(dev_addr, &cmd_scu);
6387 	if (rc != 0) {
6388 		pr_err("error %d\n", rc);
6389 		goto rw_error;
6390 	}
6391 
6392 	if (primary) {
6393 		rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
6394 		if (rc != 0) {
6395 			pr_err("error %d\n", rc);
6396 			goto rw_error;
6397 		}
6398 		rc = set_iqm_af(demod, false);
6399 		if (rc != 0) {
6400 			pr_err("error %d\n", rc);
6401 			goto rw_error;
6402 		}
6403 	} else {
6404 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
6405 		if (rc != 0) {
6406 			pr_err("error %d\n", rc);
6407 			goto rw_error;
6408 		}
6409 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
6410 		if (rc != 0) {
6411 			pr_err("error %d\n", rc);
6412 			goto rw_error;
6413 		}
6414 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
6415 		if (rc != 0) {
6416 			pr_err("error %d\n", rc);
6417 			goto rw_error;
6418 		}
6419 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
6420 		if (rc != 0) {
6421 			pr_err("error %d\n", rc);
6422 			goto rw_error;
6423 		}
6424 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
6425 		if (rc != 0) {
6426 			pr_err("error %d\n", rc);
6427 			goto rw_error;
6428 		}
6429 	}
6430 
6431 	memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6432 	cfg_mpeg_output.enable_mpeg_output = false;
6433 
6434 	rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6435 	if (rc != 0) {
6436 		pr_err("error %d\n", rc);
6437 		goto rw_error;
6438 	}
6439 
6440 	return 0;
6441 rw_error:
6442 	return rc;
6443 }
6444 
6445 /*============================================================================*/
6446 
6447 /**
6448 * \fn int set_qam_measurement ()
6449 * \brief Setup of the QAM Measuremnt intervals for signal quality
6450 * \param demod instance of demod.
6451 * \param constellation current constellation.
6452 * \return int.
6453 *
6454 *  NOTE:
6455 *  Take into account that for certain settings the errorcounters can overflow.
6456 *  The implementation does not check this.
6457 *
6458 *  TODO: overriding the ext_attr->fec_bits_desired by constellation dependent
6459 *  constants to get a measurement period of approx. 1 sec. Remove fec_bits_desired
6460 *  field ?
6461 *
6462 */
6463 #ifndef DRXJ_VSB_ONLY
6464 static int
6465 set_qam_measurement(struct drx_demod_instance *demod,
6466 		    enum drx_modulation constellation, u32 symbol_rate)
6467 {
6468 	struct i2c_device_addr *dev_addr = NULL;	/* device address for I2C writes */
6469 	struct drxj_data *ext_attr = NULL;	/* Global data container for DRXJ specific data */
6470 	int rc;
6471 	u32 fec_bits_desired = 0;	/* BER accounting period */
6472 	u16 fec_rs_plen = 0;	/* defines RS BER measurement period */
6473 	u16 fec_rs_prescale = 0;	/* ReedSolomon Measurement Prescale */
6474 	u32 fec_rs_period = 0;	/* Value for corresponding I2C register */
6475 	u32 fec_rs_bit_cnt = 0;	/* Actual precise amount of bits */
6476 	u32 fec_oc_snc_fail_period = 0;	/* Value for corresponding I2C register */
6477 	u32 qam_vd_period = 0;	/* Value for corresponding I2C register */
6478 	u32 qam_vd_bit_cnt = 0;	/* Actual precise amount of bits */
6479 	u16 fec_vd_plen = 0;	/* no of trellis symbols: VD SER measur period */
6480 	u16 qam_vd_prescale = 0;	/* Viterbi Measurement Prescale */
6481 
6482 	dev_addr = demod->my_i2c_dev_addr;
6483 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
6484 
6485 	fec_bits_desired = ext_attr->fec_bits_desired;
6486 	fec_rs_prescale = ext_attr->fec_rs_prescale;
6487 
6488 	switch (constellation) {
6489 	case DRX_CONSTELLATION_QAM16:
6490 		fec_bits_desired = 4 * symbol_rate;
6491 		break;
6492 	case DRX_CONSTELLATION_QAM32:
6493 		fec_bits_desired = 5 * symbol_rate;
6494 		break;
6495 	case DRX_CONSTELLATION_QAM64:
6496 		fec_bits_desired = 6 * symbol_rate;
6497 		break;
6498 	case DRX_CONSTELLATION_QAM128:
6499 		fec_bits_desired = 7 * symbol_rate;
6500 		break;
6501 	case DRX_CONSTELLATION_QAM256:
6502 		fec_bits_desired = 8 * symbol_rate;
6503 		break;
6504 	default:
6505 		return -EINVAL;
6506 	}
6507 
6508 	/* Parameters for Reed-Solomon Decoder */
6509 	/* fecrs_period = (int)ceil(FEC_BITS_DESIRED/(fecrs_prescale*plen)) */
6510 	/* rs_bit_cnt   = fecrs_period*fecrs_prescale*plen                  */
6511 	/*     result is within 32 bit arithmetic ->                        */
6512 	/*     no need for mult or frac functions                           */
6513 
6514 	/* TODO: use constant instead of calculation and remove the fec_rs_plen in ext_attr */
6515 	switch (ext_attr->standard) {
6516 	case DRX_STANDARD_ITU_A:
6517 	case DRX_STANDARD_ITU_C:
6518 		fec_rs_plen = 204 * 8;
6519 		break;
6520 	case DRX_STANDARD_ITU_B:
6521 		fec_rs_plen = 128 * 7;
6522 		break;
6523 	default:
6524 		return -EINVAL;
6525 	}
6526 
6527 	ext_attr->fec_rs_plen = fec_rs_plen;	/* for getSigQual */
6528 	fec_rs_bit_cnt = fec_rs_prescale * fec_rs_plen;	/* temp storage   */
6529 	if (fec_rs_bit_cnt == 0) {
6530 		pr_err("error: fec_rs_bit_cnt is zero!\n");
6531 		return -EIO;
6532 	}
6533 	fec_rs_period = fec_bits_desired / fec_rs_bit_cnt + 1;	/* ceil */
6534 	if (ext_attr->standard != DRX_STANDARD_ITU_B)
6535 		fec_oc_snc_fail_period = fec_rs_period;
6536 
6537 	/* limit to max 16 bit value (I2C register width) if needed */
6538 	if (fec_rs_period > 0xFFFF)
6539 		fec_rs_period = 0xFFFF;
6540 
6541 	/* write corresponding registers */
6542 	switch (ext_attr->standard) {
6543 	case DRX_STANDARD_ITU_A:
6544 	case DRX_STANDARD_ITU_C:
6545 		break;
6546 	case DRX_STANDARD_ITU_B:
6547 		switch (constellation) {
6548 		case DRX_CONSTELLATION_QAM64:
6549 			fec_rs_period = 31581;
6550 			fec_oc_snc_fail_period = 17932;
6551 			break;
6552 		case DRX_CONSTELLATION_QAM256:
6553 			fec_rs_period = 45446;
6554 			fec_oc_snc_fail_period = 25805;
6555 			break;
6556 		default:
6557 			return -EINVAL;
6558 		}
6559 		break;
6560 	default:
6561 		return -EINVAL;
6562 	}
6563 
6564 	rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, (u16)fec_oc_snc_fail_period, 0);
6565 	if (rc != 0) {
6566 		pr_err("error %d\n", rc);
6567 		goto rw_error;
6568 	}
6569 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, (u16)fec_rs_period, 0);
6570 	if (rc != 0) {
6571 		pr_err("error %d\n", rc);
6572 		goto rw_error;
6573 	}
6574 	rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, fec_rs_prescale, 0);
6575 	if (rc != 0) {
6576 		pr_err("error %d\n", rc);
6577 		goto rw_error;
6578 	}
6579 	ext_attr->fec_rs_period = (u16) fec_rs_period;
6580 	ext_attr->fec_rs_prescale = fec_rs_prescale;
6581 	rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6582 	if (rc != 0) {
6583 		pr_err("error %d\n", rc);
6584 		goto rw_error;
6585 	}
6586 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6587 	if (rc != 0) {
6588 		pr_err("error %d\n", rc);
6589 		goto rw_error;
6590 	}
6591 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6592 	if (rc != 0) {
6593 		pr_err("error %d\n", rc);
6594 		goto rw_error;
6595 	}
6596 
6597 	if (ext_attr->standard == DRX_STANDARD_ITU_B) {
6598 		/* Parameters for Viterbi Decoder */
6599 		/* qamvd_period = (int)ceil(FEC_BITS_DESIRED/                      */
6600 		/*                    (qamvd_prescale*plen*(qam_constellation+1))) */
6601 		/* vd_bit_cnt   = qamvd_period*qamvd_prescale*plen                 */
6602 		/*     result is within 32 bit arithmetic ->                       */
6603 		/*     no need for mult or frac functions                          */
6604 
6605 		/* a(8 bit) * b(8 bit) = 16 bit result => mult32 not needed */
6606 		fec_vd_plen = ext_attr->fec_vd_plen;
6607 		qam_vd_prescale = ext_attr->qam_vd_prescale;
6608 		qam_vd_bit_cnt = qam_vd_prescale * fec_vd_plen;	/* temp storage */
6609 
6610 		switch (constellation) {
6611 		case DRX_CONSTELLATION_QAM64:
6612 			/* a(16 bit) * b(4 bit) = 20 bit result => mult32 not needed */
6613 			qam_vd_period =
6614 			    qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM64 + 1)
6615 			    * (QAM_TOP_CONSTELLATION_QAM64 + 1);
6616 			break;
6617 		case DRX_CONSTELLATION_QAM256:
6618 			/* a(16 bit) * b(5 bit) = 21 bit result => mult32 not needed */
6619 			qam_vd_period =
6620 			    qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM256 + 1)
6621 			    * (QAM_TOP_CONSTELLATION_QAM256 + 1);
6622 			break;
6623 		default:
6624 			return -EINVAL;
6625 		}
6626 		if (qam_vd_period == 0) {
6627 			pr_err("error: qam_vd_period is zero!\n");
6628 			return -EIO;
6629 		}
6630 		qam_vd_period = fec_bits_desired / qam_vd_period;
6631 		/* limit to max 16 bit value (I2C register width) if needed */
6632 		if (qam_vd_period > 0xFFFF)
6633 			qam_vd_period = 0xFFFF;
6634 
6635 		/* a(16 bit) * b(16 bit) = 32 bit result => mult32 not needed */
6636 		qam_vd_bit_cnt *= qam_vd_period;
6637 
6638 		rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PERIOD__A, (u16)qam_vd_period, 0);
6639 		if (rc != 0) {
6640 			pr_err("error %d\n", rc);
6641 			goto rw_error;
6642 		}
6643 		rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PRESCALE__A, qam_vd_prescale, 0);
6644 		if (rc != 0) {
6645 			pr_err("error %d\n", rc);
6646 			goto rw_error;
6647 		}
6648 		ext_attr->qam_vd_period = (u16) qam_vd_period;
6649 		ext_attr->qam_vd_prescale = qam_vd_prescale;
6650 	}
6651 
6652 	return 0;
6653 rw_error:
6654 	return rc;
6655 }
6656 
6657 /*============================================================================*/
6658 
6659 /**
6660 * \fn int set_qam16 ()
6661 * \brief QAM16 specific setup
6662 * \param demod instance of demod.
6663 * \return int.
6664 */
6665 static int set_qam16(struct drx_demod_instance *demod)
6666 {
6667 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6668 	int rc;
6669 	const u8 qam_dq_qual_fun[] = {
6670 		DRXJ_16TO8(2),	/* fun0  */
6671 		DRXJ_16TO8(2),	/* fun1  */
6672 		DRXJ_16TO8(2),	/* fun2  */
6673 		DRXJ_16TO8(2),	/* fun3  */
6674 		DRXJ_16TO8(3),	/* fun4  */
6675 		DRXJ_16TO8(3),	/* fun5  */
6676 	};
6677 	const u8 qam_eq_cma_rad[] = {
6678 		DRXJ_16TO8(13517),	/* RAD0  */
6679 		DRXJ_16TO8(13517),	/* RAD1  */
6680 		DRXJ_16TO8(13517),	/* RAD2  */
6681 		DRXJ_16TO8(13517),	/* RAD3  */
6682 		DRXJ_16TO8(13517),	/* RAD4  */
6683 		DRXJ_16TO8(13517),	/* RAD5  */
6684 	};
6685 
6686 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6687 	if (rc != 0) {
6688 		pr_err("error %d\n", rc);
6689 		goto rw_error;
6690 	}
6691 	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);
6692 	if (rc != 0) {
6693 		pr_err("error %d\n", rc);
6694 		goto rw_error;
6695 	}
6696 
6697 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 140, 0);
6698 	if (rc != 0) {
6699 		pr_err("error %d\n", rc);
6700 		goto rw_error;
6701 	}
6702 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6703 	if (rc != 0) {
6704 		pr_err("error %d\n", rc);
6705 		goto rw_error;
6706 	}
6707 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 120, 0);
6708 	if (rc != 0) {
6709 		pr_err("error %d\n", rc);
6710 		goto rw_error;
6711 	}
6712 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 230, 0);
6713 	if (rc != 0) {
6714 		pr_err("error %d\n", rc);
6715 		goto rw_error;
6716 	}
6717 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 95, 0);
6718 	if (rc != 0) {
6719 		pr_err("error %d\n", rc);
6720 		goto rw_error;
6721 	}
6722 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 105, 0);
6723 	if (rc != 0) {
6724 		pr_err("error %d\n", rc);
6725 		goto rw_error;
6726 	}
6727 
6728 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6729 	if (rc != 0) {
6730 		pr_err("error %d\n", rc);
6731 		goto rw_error;
6732 	}
6733 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6734 	if (rc != 0) {
6735 		pr_err("error %d\n", rc);
6736 		goto rw_error;
6737 	}
6738 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6739 	if (rc != 0) {
6740 		pr_err("error %d\n", rc);
6741 		goto rw_error;
6742 	}
6743 
6744 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 16, 0);
6745 	if (rc != 0) {
6746 		pr_err("error %d\n", rc);
6747 		goto rw_error;
6748 	}
6749 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 220, 0);
6750 	if (rc != 0) {
6751 		pr_err("error %d\n", rc);
6752 		goto rw_error;
6753 	}
6754 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 25, 0);
6755 	if (rc != 0) {
6756 		pr_err("error %d\n", rc);
6757 		goto rw_error;
6758 	}
6759 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 6, 0);
6760 	if (rc != 0) {
6761 		pr_err("error %d\n", rc);
6762 		goto rw_error;
6763 	}
6764 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-24), 0);
6765 	if (rc != 0) {
6766 		pr_err("error %d\n", rc);
6767 		goto rw_error;
6768 	}
6769 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-65), 0);
6770 	if (rc != 0) {
6771 		pr_err("error %d\n", rc);
6772 		goto rw_error;
6773 	}
6774 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-127), 0);
6775 	if (rc != 0) {
6776 		pr_err("error %d\n", rc);
6777 		goto rw_error;
6778 	}
6779 
6780 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
6781 	if (rc != 0) {
6782 		pr_err("error %d\n", rc);
6783 		goto rw_error;
6784 	}
6785 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
6786 	if (rc != 0) {
6787 		pr_err("error %d\n", rc);
6788 		goto rw_error;
6789 	}
6790 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
6791 	if (rc != 0) {
6792 		pr_err("error %d\n", rc);
6793 		goto rw_error;
6794 	}
6795 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
6796 	if (rc != 0) {
6797 		pr_err("error %d\n", rc);
6798 		goto rw_error;
6799 	}
6800 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
6801 	if (rc != 0) {
6802 		pr_err("error %d\n", rc);
6803 		goto rw_error;
6804 	}
6805 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
6806 	if (rc != 0) {
6807 		pr_err("error %d\n", rc);
6808 		goto rw_error;
6809 	}
6810 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
6811 	if (rc != 0) {
6812 		pr_err("error %d\n", rc);
6813 		goto rw_error;
6814 	}
6815 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
6816 	if (rc != 0) {
6817 		pr_err("error %d\n", rc);
6818 		goto rw_error;
6819 	}
6820 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
6821 	if (rc != 0) {
6822 		pr_err("error %d\n", rc);
6823 		goto rw_error;
6824 	}
6825 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
6826 	if (rc != 0) {
6827 		pr_err("error %d\n", rc);
6828 		goto rw_error;
6829 	}
6830 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
6831 	if (rc != 0) {
6832 		pr_err("error %d\n", rc);
6833 		goto rw_error;
6834 	}
6835 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
6836 	if (rc != 0) {
6837 		pr_err("error %d\n", rc);
6838 		goto rw_error;
6839 	}
6840 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
6841 	if (rc != 0) {
6842 		pr_err("error %d\n", rc);
6843 		goto rw_error;
6844 	}
6845 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
6846 	if (rc != 0) {
6847 		pr_err("error %d\n", rc);
6848 		goto rw_error;
6849 	}
6850 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
6851 	if (rc != 0) {
6852 		pr_err("error %d\n", rc);
6853 		goto rw_error;
6854 	}
6855 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
6856 	if (rc != 0) {
6857 		pr_err("error %d\n", rc);
6858 		goto rw_error;
6859 	}
6860 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 240, 0);
6861 	if (rc != 0) {
6862 		pr_err("error %d\n", rc);
6863 		goto rw_error;
6864 	}
6865 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
6866 	if (rc != 0) {
6867 		pr_err("error %d\n", rc);
6868 		goto rw_error;
6869 	}
6870 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
6871 	if (rc != 0) {
6872 		pr_err("error %d\n", rc);
6873 		goto rw_error;
6874 	}
6875 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
6876 	if (rc != 0) {
6877 		pr_err("error %d\n", rc);
6878 		goto rw_error;
6879 	}
6880 
6881 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 40960, 0);
6882 	if (rc != 0) {
6883 		pr_err("error %d\n", rc);
6884 		goto rw_error;
6885 	}
6886 
6887 	return 0;
6888 rw_error:
6889 	return rc;
6890 }
6891 
6892 /*============================================================================*/
6893 
6894 /**
6895 * \fn int set_qam32 ()
6896 * \brief QAM32 specific setup
6897 * \param demod instance of demod.
6898 * \return int.
6899 */
6900 static int set_qam32(struct drx_demod_instance *demod)
6901 {
6902 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6903 	int rc;
6904 	const u8 qam_dq_qual_fun[] = {
6905 		DRXJ_16TO8(3),	/* fun0  */
6906 		DRXJ_16TO8(3),	/* fun1  */
6907 		DRXJ_16TO8(3),	/* fun2  */
6908 		DRXJ_16TO8(3),	/* fun3  */
6909 		DRXJ_16TO8(4),	/* fun4  */
6910 		DRXJ_16TO8(4),	/* fun5  */
6911 	};
6912 	const u8 qam_eq_cma_rad[] = {
6913 		DRXJ_16TO8(6707),	/* RAD0  */
6914 		DRXJ_16TO8(6707),	/* RAD1  */
6915 		DRXJ_16TO8(6707),	/* RAD2  */
6916 		DRXJ_16TO8(6707),	/* RAD3  */
6917 		DRXJ_16TO8(6707),	/* RAD4  */
6918 		DRXJ_16TO8(6707),	/* RAD5  */
6919 	};
6920 
6921 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6922 	if (rc != 0) {
6923 		pr_err("error %d\n", rc);
6924 		goto rw_error;
6925 	}
6926 	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);
6927 	if (rc != 0) {
6928 		pr_err("error %d\n", rc);
6929 		goto rw_error;
6930 	}
6931 
6932 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 90, 0);
6933 	if (rc != 0) {
6934 		pr_err("error %d\n", rc);
6935 		goto rw_error;
6936 	}
6937 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6938 	if (rc != 0) {
6939 		pr_err("error %d\n", rc);
6940 		goto rw_error;
6941 	}
6942 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
6943 	if (rc != 0) {
6944 		pr_err("error %d\n", rc);
6945 		goto rw_error;
6946 	}
6947 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 170, 0);
6948 	if (rc != 0) {
6949 		pr_err("error %d\n", rc);
6950 		goto rw_error;
6951 	}
6952 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
6953 	if (rc != 0) {
6954 		pr_err("error %d\n", rc);
6955 		goto rw_error;
6956 	}
6957 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
6958 	if (rc != 0) {
6959 		pr_err("error %d\n", rc);
6960 		goto rw_error;
6961 	}
6962 
6963 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6964 	if (rc != 0) {
6965 		pr_err("error %d\n", rc);
6966 		goto rw_error;
6967 	}
6968 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6969 	if (rc != 0) {
6970 		pr_err("error %d\n", rc);
6971 		goto rw_error;
6972 	}
6973 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6974 	if (rc != 0) {
6975 		pr_err("error %d\n", rc);
6976 		goto rw_error;
6977 	}
6978 
6979 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
6980 	if (rc != 0) {
6981 		pr_err("error %d\n", rc);
6982 		goto rw_error;
6983 	}
6984 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 140, 0);
6985 	if (rc != 0) {
6986 		pr_err("error %d\n", rc);
6987 		goto rw_error;
6988 	}
6989 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16)(-8), 0);
6990 	if (rc != 0) {
6991 		pr_err("error %d\n", rc);
6992 		goto rw_error;
6993 	}
6994 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16)(-16), 0);
6995 	if (rc != 0) {
6996 		pr_err("error %d\n", rc);
6997 		goto rw_error;
6998 	}
6999 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-26), 0);
7000 	if (rc != 0) {
7001 		pr_err("error %d\n", rc);
7002 		goto rw_error;
7003 	}
7004 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-56), 0);
7005 	if (rc != 0) {
7006 		pr_err("error %d\n", rc);
7007 		goto rw_error;
7008 	}
7009 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-86), 0);
7010 	if (rc != 0) {
7011 		pr_err("error %d\n", rc);
7012 		goto rw_error;
7013 	}
7014 
7015 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7016 	if (rc != 0) {
7017 		pr_err("error %d\n", rc);
7018 		goto rw_error;
7019 	}
7020 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7021 	if (rc != 0) {
7022 		pr_err("error %d\n", rc);
7023 		goto rw_error;
7024 	}
7025 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7026 	if (rc != 0) {
7027 		pr_err("error %d\n", rc);
7028 		goto rw_error;
7029 	}
7030 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
7031 	if (rc != 0) {
7032 		pr_err("error %d\n", rc);
7033 		goto rw_error;
7034 	}
7035 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7036 	if (rc != 0) {
7037 		pr_err("error %d\n", rc);
7038 		goto rw_error;
7039 	}
7040 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7041 	if (rc != 0) {
7042 		pr_err("error %d\n", rc);
7043 		goto rw_error;
7044 	}
7045 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
7046 	if (rc != 0) {
7047 		pr_err("error %d\n", rc);
7048 		goto rw_error;
7049 	}
7050 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
7051 	if (rc != 0) {
7052 		pr_err("error %d\n", rc);
7053 		goto rw_error;
7054 	}
7055 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7056 	if (rc != 0) {
7057 		pr_err("error %d\n", rc);
7058 		goto rw_error;
7059 	}
7060 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7061 	if (rc != 0) {
7062 		pr_err("error %d\n", rc);
7063 		goto rw_error;
7064 	}
7065 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7066 	if (rc != 0) {
7067 		pr_err("error %d\n", rc);
7068 		goto rw_error;
7069 	}
7070 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7071 	if (rc != 0) {
7072 		pr_err("error %d\n", rc);
7073 		goto rw_error;
7074 	}
7075 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7076 	if (rc != 0) {
7077 		pr_err("error %d\n", rc);
7078 		goto rw_error;
7079 	}
7080 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7081 	if (rc != 0) {
7082 		pr_err("error %d\n", rc);
7083 		goto rw_error;
7084 	}
7085 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7086 	if (rc != 0) {
7087 		pr_err("error %d\n", rc);
7088 		goto rw_error;
7089 	}
7090 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
7091 	if (rc != 0) {
7092 		pr_err("error %d\n", rc);
7093 		goto rw_error;
7094 	}
7095 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 176, 0);
7096 	if (rc != 0) {
7097 		pr_err("error %d\n", rc);
7098 		goto rw_error;
7099 	}
7100 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7101 	if (rc != 0) {
7102 		pr_err("error %d\n", rc);
7103 		goto rw_error;
7104 	}
7105 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7106 	if (rc != 0) {
7107 		pr_err("error %d\n", rc);
7108 		goto rw_error;
7109 	}
7110 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 8, 0);
7111 	if (rc != 0) {
7112 		pr_err("error %d\n", rc);
7113 		goto rw_error;
7114 	}
7115 
7116 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20480, 0);
7117 	if (rc != 0) {
7118 		pr_err("error %d\n", rc);
7119 		goto rw_error;
7120 	}
7121 
7122 	return 0;
7123 rw_error:
7124 	return rc;
7125 }
7126 
7127 /*============================================================================*/
7128 
7129 /**
7130 * \fn int set_qam64 ()
7131 * \brief QAM64 specific setup
7132 * \param demod instance of demod.
7133 * \return int.
7134 */
7135 static int set_qam64(struct drx_demod_instance *demod)
7136 {
7137 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7138 	int rc;
7139 	const u8 qam_dq_qual_fun[] = {	/* this is hw reset value. no necessary to re-write */
7140 		DRXJ_16TO8(4),	/* fun0  */
7141 		DRXJ_16TO8(4),	/* fun1  */
7142 		DRXJ_16TO8(4),	/* fun2  */
7143 		DRXJ_16TO8(4),	/* fun3  */
7144 		DRXJ_16TO8(6),	/* fun4  */
7145 		DRXJ_16TO8(6),	/* fun5  */
7146 	};
7147 	const u8 qam_eq_cma_rad[] = {
7148 		DRXJ_16TO8(13336),	/* RAD0  */
7149 		DRXJ_16TO8(12618),	/* RAD1  */
7150 		DRXJ_16TO8(11988),	/* RAD2  */
7151 		DRXJ_16TO8(13809),	/* RAD3  */
7152 		DRXJ_16TO8(13809),	/* RAD4  */
7153 		DRXJ_16TO8(15609),	/* RAD5  */
7154 	};
7155 
7156 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7157 	if (rc != 0) {
7158 		pr_err("error %d\n", rc);
7159 		goto rw_error;
7160 	}
7161 	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);
7162 	if (rc != 0) {
7163 		pr_err("error %d\n", rc);
7164 		goto rw_error;
7165 	}
7166 
7167 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 105, 0);
7168 	if (rc != 0) {
7169 		pr_err("error %d\n", rc);
7170 		goto rw_error;
7171 	}
7172 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7173 	if (rc != 0) {
7174 		pr_err("error %d\n", rc);
7175 		goto rw_error;
7176 	}
7177 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7178 	if (rc != 0) {
7179 		pr_err("error %d\n", rc);
7180 		goto rw_error;
7181 	}
7182 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 195, 0);
7183 	if (rc != 0) {
7184 		pr_err("error %d\n", rc);
7185 		goto rw_error;
7186 	}
7187 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7188 	if (rc != 0) {
7189 		pr_err("error %d\n", rc);
7190 		goto rw_error;
7191 	}
7192 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 84, 0);
7193 	if (rc != 0) {
7194 		pr_err("error %d\n", rc);
7195 		goto rw_error;
7196 	}
7197 
7198 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7199 	if (rc != 0) {
7200 		pr_err("error %d\n", rc);
7201 		goto rw_error;
7202 	}
7203 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7204 	if (rc != 0) {
7205 		pr_err("error %d\n", rc);
7206 		goto rw_error;
7207 	}
7208 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7209 	if (rc != 0) {
7210 		pr_err("error %d\n", rc);
7211 		goto rw_error;
7212 	}
7213 
7214 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
7215 	if (rc != 0) {
7216 		pr_err("error %d\n", rc);
7217 		goto rw_error;
7218 	}
7219 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 141, 0);
7220 	if (rc != 0) {
7221 		pr_err("error %d\n", rc);
7222 		goto rw_error;
7223 	}
7224 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 7, 0);
7225 	if (rc != 0) {
7226 		pr_err("error %d\n", rc);
7227 		goto rw_error;
7228 	}
7229 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 0, 0);
7230 	if (rc != 0) {
7231 		pr_err("error %d\n", rc);
7232 		goto rw_error;
7233 	}
7234 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-15), 0);
7235 	if (rc != 0) {
7236 		pr_err("error %d\n", rc);
7237 		goto rw_error;
7238 	}
7239 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-45), 0);
7240 	if (rc != 0) {
7241 		pr_err("error %d\n", rc);
7242 		goto rw_error;
7243 	}
7244 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-80), 0);
7245 	if (rc != 0) {
7246 		pr_err("error %d\n", rc);
7247 		goto rw_error;
7248 	}
7249 
7250 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7251 	if (rc != 0) {
7252 		pr_err("error %d\n", rc);
7253 		goto rw_error;
7254 	}
7255 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7256 	if (rc != 0) {
7257 		pr_err("error %d\n", rc);
7258 		goto rw_error;
7259 	}
7260 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7261 	if (rc != 0) {
7262 		pr_err("error %d\n", rc);
7263 		goto rw_error;
7264 	}
7265 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30, 0);
7266 	if (rc != 0) {
7267 		pr_err("error %d\n", rc);
7268 		goto rw_error;
7269 	}
7270 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7271 	if (rc != 0) {
7272 		pr_err("error %d\n", rc);
7273 		goto rw_error;
7274 	}
7275 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7276 	if (rc != 0) {
7277 		pr_err("error %d\n", rc);
7278 		goto rw_error;
7279 	}
7280 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 15, 0);
7281 	if (rc != 0) {
7282 		pr_err("error %d\n", rc);
7283 		goto rw_error;
7284 	}
7285 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7286 	if (rc != 0) {
7287 		pr_err("error %d\n", rc);
7288 		goto rw_error;
7289 	}
7290 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7291 	if (rc != 0) {
7292 		pr_err("error %d\n", rc);
7293 		goto rw_error;
7294 	}
7295 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7296 	if (rc != 0) {
7297 		pr_err("error %d\n", rc);
7298 		goto rw_error;
7299 	}
7300 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7301 	if (rc != 0) {
7302 		pr_err("error %d\n", rc);
7303 		goto rw_error;
7304 	}
7305 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7306 	if (rc != 0) {
7307 		pr_err("error %d\n", rc);
7308 		goto rw_error;
7309 	}
7310 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7311 	if (rc != 0) {
7312 		pr_err("error %d\n", rc);
7313 		goto rw_error;
7314 	}
7315 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7316 	if (rc != 0) {
7317 		pr_err("error %d\n", rc);
7318 		goto rw_error;
7319 	}
7320 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7321 	if (rc != 0) {
7322 		pr_err("error %d\n", rc);
7323 		goto rw_error;
7324 	}
7325 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
7326 	if (rc != 0) {
7327 		pr_err("error %d\n", rc);
7328 		goto rw_error;
7329 	}
7330 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 160, 0);
7331 	if (rc != 0) {
7332 		pr_err("error %d\n", rc);
7333 		goto rw_error;
7334 	}
7335 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7336 	if (rc != 0) {
7337 		pr_err("error %d\n", rc);
7338 		goto rw_error;
7339 	}
7340 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7341 	if (rc != 0) {
7342 		pr_err("error %d\n", rc);
7343 		goto rw_error;
7344 	}
7345 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
7346 	if (rc != 0) {
7347 		pr_err("error %d\n", rc);
7348 		goto rw_error;
7349 	}
7350 
7351 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43008, 0);
7352 	if (rc != 0) {
7353 		pr_err("error %d\n", rc);
7354 		goto rw_error;
7355 	}
7356 
7357 	return 0;
7358 rw_error:
7359 	return rc;
7360 }
7361 
7362 /*============================================================================*/
7363 
7364 /**
7365 * \fn int set_qam128 ()
7366 * \brief QAM128 specific setup
7367 * \param demod: instance of demod.
7368 * \return int.
7369 */
7370 static int set_qam128(struct drx_demod_instance *demod)
7371 {
7372 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7373 	int rc;
7374 	const u8 qam_dq_qual_fun[] = {
7375 		DRXJ_16TO8(6),	/* fun0  */
7376 		DRXJ_16TO8(6),	/* fun1  */
7377 		DRXJ_16TO8(6),	/* fun2  */
7378 		DRXJ_16TO8(6),	/* fun3  */
7379 		DRXJ_16TO8(9),	/* fun4  */
7380 		DRXJ_16TO8(9),	/* fun5  */
7381 	};
7382 	const u8 qam_eq_cma_rad[] = {
7383 		DRXJ_16TO8(6164),	/* RAD0  */
7384 		DRXJ_16TO8(6598),	/* RAD1  */
7385 		DRXJ_16TO8(6394),	/* RAD2  */
7386 		DRXJ_16TO8(6409),	/* RAD3  */
7387 		DRXJ_16TO8(6656),	/* RAD4  */
7388 		DRXJ_16TO8(7238),	/* RAD5  */
7389 	};
7390 
7391 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7392 	if (rc != 0) {
7393 		pr_err("error %d\n", rc);
7394 		goto rw_error;
7395 	}
7396 	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);
7397 	if (rc != 0) {
7398 		pr_err("error %d\n", rc);
7399 		goto rw_error;
7400 	}
7401 
7402 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
7403 	if (rc != 0) {
7404 		pr_err("error %d\n", rc);
7405 		goto rw_error;
7406 	}
7407 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7408 	if (rc != 0) {
7409 		pr_err("error %d\n", rc);
7410 		goto rw_error;
7411 	}
7412 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7413 	if (rc != 0) {
7414 		pr_err("error %d\n", rc);
7415 		goto rw_error;
7416 	}
7417 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 140, 0);
7418 	if (rc != 0) {
7419 		pr_err("error %d\n", rc);
7420 		goto rw_error;
7421 	}
7422 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7423 	if (rc != 0) {
7424 		pr_err("error %d\n", rc);
7425 		goto rw_error;
7426 	}
7427 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
7428 	if (rc != 0) {
7429 		pr_err("error %d\n", rc);
7430 		goto rw_error;
7431 	}
7432 
7433 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7434 	if (rc != 0) {
7435 		pr_err("error %d\n", rc);
7436 		goto rw_error;
7437 	}
7438 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7439 	if (rc != 0) {
7440 		pr_err("error %d\n", rc);
7441 		goto rw_error;
7442 	}
7443 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7444 	if (rc != 0) {
7445 		pr_err("error %d\n", rc);
7446 		goto rw_error;
7447 	}
7448 
7449 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
7450 	if (rc != 0) {
7451 		pr_err("error %d\n", rc);
7452 		goto rw_error;
7453 	}
7454 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 65, 0);
7455 	if (rc != 0) {
7456 		pr_err("error %d\n", rc);
7457 		goto rw_error;
7458 	}
7459 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 5, 0);
7460 	if (rc != 0) {
7461 		pr_err("error %d\n", rc);
7462 		goto rw_error;
7463 	}
7464 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 3, 0);
7465 	if (rc != 0) {
7466 		pr_err("error %d\n", rc);
7467 		goto rw_error;
7468 	}
7469 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-1), 0);
7470 	if (rc != 0) {
7471 		pr_err("error %d\n", rc);
7472 		goto rw_error;
7473 	}
7474 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 12, 0);
7475 	if (rc != 0) {
7476 		pr_err("error %d\n", rc);
7477 		goto rw_error;
7478 	}
7479 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-23), 0);
7480 	if (rc != 0) {
7481 		pr_err("error %d\n", rc);
7482 		goto rw_error;
7483 	}
7484 
7485 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7486 	if (rc != 0) {
7487 		pr_err("error %d\n", rc);
7488 		goto rw_error;
7489 	}
7490 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7491 	if (rc != 0) {
7492 		pr_err("error %d\n", rc);
7493 		goto rw_error;
7494 	}
7495 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7496 	if (rc != 0) {
7497 		pr_err("error %d\n", rc);
7498 		goto rw_error;
7499 	}
7500 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40, 0);
7501 	if (rc != 0) {
7502 		pr_err("error %d\n", rc);
7503 		goto rw_error;
7504 	}
7505 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7506 	if (rc != 0) {
7507 		pr_err("error %d\n", rc);
7508 		goto rw_error;
7509 	}
7510 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7511 	if (rc != 0) {
7512 		pr_err("error %d\n", rc);
7513 		goto rw_error;
7514 	}
7515 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20, 0);
7516 	if (rc != 0) {
7517 		pr_err("error %d\n", rc);
7518 		goto rw_error;
7519 	}
7520 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7521 	if (rc != 0) {
7522 		pr_err("error %d\n", rc);
7523 		goto rw_error;
7524 	}
7525 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7526 	if (rc != 0) {
7527 		pr_err("error %d\n", rc);
7528 		goto rw_error;
7529 	}
7530 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7531 	if (rc != 0) {
7532 		pr_err("error %d\n", rc);
7533 		goto rw_error;
7534 	}
7535 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7536 	if (rc != 0) {
7537 		pr_err("error %d\n", rc);
7538 		goto rw_error;
7539 	}
7540 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7541 	if (rc != 0) {
7542 		pr_err("error %d\n", rc);
7543 		goto rw_error;
7544 	}
7545 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7546 	if (rc != 0) {
7547 		pr_err("error %d\n", rc);
7548 		goto rw_error;
7549 	}
7550 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7551 	if (rc != 0) {
7552 		pr_err("error %d\n", rc);
7553 		goto rw_error;
7554 	}
7555 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7556 	if (rc != 0) {
7557 		pr_err("error %d\n", rc);
7558 		goto rw_error;
7559 	}
7560 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
7561 	if (rc != 0) {
7562 		pr_err("error %d\n", rc);
7563 		goto rw_error;
7564 	}
7565 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 144, 0);
7566 	if (rc != 0) {
7567 		pr_err("error %d\n", rc);
7568 		goto rw_error;
7569 	}
7570 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7571 	if (rc != 0) {
7572 		pr_err("error %d\n", rc);
7573 		goto rw_error;
7574 	}
7575 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7576 	if (rc != 0) {
7577 		pr_err("error %d\n", rc);
7578 		goto rw_error;
7579 	}
7580 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7581 	if (rc != 0) {
7582 		pr_err("error %d\n", rc);
7583 		goto rw_error;
7584 	}
7585 
7586 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20992, 0);
7587 	if (rc != 0) {
7588 		pr_err("error %d\n", rc);
7589 		goto rw_error;
7590 	}
7591 
7592 	return 0;
7593 rw_error:
7594 	return rc;
7595 }
7596 
7597 /*============================================================================*/
7598 
7599 /**
7600 * \fn int set_qam256 ()
7601 * \brief QAM256 specific setup
7602 * \param demod: instance of demod.
7603 * \return int.
7604 */
7605 static int set_qam256(struct drx_demod_instance *demod)
7606 {
7607 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7608 	int rc;
7609 	const u8 qam_dq_qual_fun[] = {
7610 		DRXJ_16TO8(8),	/* fun0  */
7611 		DRXJ_16TO8(8),	/* fun1  */
7612 		DRXJ_16TO8(8),	/* fun2  */
7613 		DRXJ_16TO8(8),	/* fun3  */
7614 		DRXJ_16TO8(12),	/* fun4  */
7615 		DRXJ_16TO8(12),	/* fun5  */
7616 	};
7617 	const u8 qam_eq_cma_rad[] = {
7618 		DRXJ_16TO8(12345),	/* RAD0  */
7619 		DRXJ_16TO8(12345),	/* RAD1  */
7620 		DRXJ_16TO8(13626),	/* RAD2  */
7621 		DRXJ_16TO8(12931),	/* RAD3  */
7622 		DRXJ_16TO8(14719),	/* RAD4  */
7623 		DRXJ_16TO8(15356),	/* RAD5  */
7624 	};
7625 
7626 	rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7627 	if (rc != 0) {
7628 		pr_err("error %d\n", rc);
7629 		goto rw_error;
7630 	}
7631 	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);
7632 	if (rc != 0) {
7633 		pr_err("error %d\n", rc);
7634 		goto rw_error;
7635 	}
7636 
7637 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
7638 	if (rc != 0) {
7639 		pr_err("error %d\n", rc);
7640 		goto rw_error;
7641 	}
7642 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7643 	if (rc != 0) {
7644 		pr_err("error %d\n", rc);
7645 		goto rw_error;
7646 	}
7647 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7648 	if (rc != 0) {
7649 		pr_err("error %d\n", rc);
7650 		goto rw_error;
7651 	}
7652 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 150, 0);
7653 	if (rc != 0) {
7654 		pr_err("error %d\n", rc);
7655 		goto rw_error;
7656 	}
7657 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7658 	if (rc != 0) {
7659 		pr_err("error %d\n", rc);
7660 		goto rw_error;
7661 	}
7662 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 110, 0);
7663 	if (rc != 0) {
7664 		pr_err("error %d\n", rc);
7665 		goto rw_error;
7666 	}
7667 
7668 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7669 	if (rc != 0) {
7670 		pr_err("error %d\n", rc);
7671 		goto rw_error;
7672 	}
7673 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 16, 0);
7674 	if (rc != 0) {
7675 		pr_err("error %d\n", rc);
7676 		goto rw_error;
7677 	}
7678 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7679 	if (rc != 0) {
7680 		pr_err("error %d\n", rc);
7681 		goto rw_error;
7682 	}
7683 
7684 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
7685 	if (rc != 0) {
7686 		pr_err("error %d\n", rc);
7687 		goto rw_error;
7688 	}
7689 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 74, 0);
7690 	if (rc != 0) {
7691 		pr_err("error %d\n", rc);
7692 		goto rw_error;
7693 	}
7694 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 18, 0);
7695 	if (rc != 0) {
7696 		pr_err("error %d\n", rc);
7697 		goto rw_error;
7698 	}
7699 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 13, 0);
7700 	if (rc != 0) {
7701 		pr_err("error %d\n", rc);
7702 		goto rw_error;
7703 	}
7704 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, 7, 0);
7705 	if (rc != 0) {
7706 		pr_err("error %d\n", rc);
7707 		goto rw_error;
7708 	}
7709 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 0, 0);
7710 	if (rc != 0) {
7711 		pr_err("error %d\n", rc);
7712 		goto rw_error;
7713 	}
7714 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-8), 0);
7715 	if (rc != 0) {
7716 		pr_err("error %d\n", rc);
7717 		goto rw_error;
7718 	}
7719 
7720 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7721 	if (rc != 0) {
7722 		pr_err("error %d\n", rc);
7723 		goto rw_error;
7724 	}
7725 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7726 	if (rc != 0) {
7727 		pr_err("error %d\n", rc);
7728 		goto rw_error;
7729 	}
7730 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7731 	if (rc != 0) {
7732 		pr_err("error %d\n", rc);
7733 		goto rw_error;
7734 	}
7735 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50, 0);
7736 	if (rc != 0) {
7737 		pr_err("error %d\n", rc);
7738 		goto rw_error;
7739 	}
7740 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7741 	if (rc != 0) {
7742 		pr_err("error %d\n", rc);
7743 		goto rw_error;
7744 	}
7745 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7746 	if (rc != 0) {
7747 		pr_err("error %d\n", rc);
7748 		goto rw_error;
7749 	}
7750 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 25, 0);
7751 	if (rc != 0) {
7752 		pr_err("error %d\n", rc);
7753 		goto rw_error;
7754 	}
7755 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7756 	if (rc != 0) {
7757 		pr_err("error %d\n", rc);
7758 		goto rw_error;
7759 	}
7760 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7761 	if (rc != 0) {
7762 		pr_err("error %d\n", rc);
7763 		goto rw_error;
7764 	}
7765 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7766 	if (rc != 0) {
7767 		pr_err("error %d\n", rc);
7768 		goto rw_error;
7769 	}
7770 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7771 	if (rc != 0) {
7772 		pr_err("error %d\n", rc);
7773 		goto rw_error;
7774 	}
7775 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7776 	if (rc != 0) {
7777 		pr_err("error %d\n", rc);
7778 		goto rw_error;
7779 	}
7780 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7781 	if (rc != 0) {
7782 		pr_err("error %d\n", rc);
7783 		goto rw_error;
7784 	}
7785 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7786 	if (rc != 0) {
7787 		pr_err("error %d\n", rc);
7788 		goto rw_error;
7789 	}
7790 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7791 	if (rc != 0) {
7792 		pr_err("error %d\n", rc);
7793 		goto rw_error;
7794 	}
7795 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
7796 	if (rc != 0) {
7797 		pr_err("error %d\n", rc);
7798 		goto rw_error;
7799 	}
7800 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 80, 0);
7801 	if (rc != 0) {
7802 		pr_err("error %d\n", rc);
7803 		goto rw_error;
7804 	}
7805 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7806 	if (rc != 0) {
7807 		pr_err("error %d\n", rc);
7808 		goto rw_error;
7809 	}
7810 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7811 	if (rc != 0) {
7812 		pr_err("error %d\n", rc);
7813 		goto rw_error;
7814 	}
7815 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7816 	if (rc != 0) {
7817 		pr_err("error %d\n", rc);
7818 		goto rw_error;
7819 	}
7820 
7821 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43520, 0);
7822 	if (rc != 0) {
7823 		pr_err("error %d\n", rc);
7824 		goto rw_error;
7825 	}
7826 
7827 	return 0;
7828 rw_error:
7829 	return rc;
7830 }
7831 
7832 /*============================================================================*/
7833 #define QAM_SET_OP_ALL 0x1
7834 #define QAM_SET_OP_CONSTELLATION 0x2
7835 #define QAM_SET_OP_SPECTRUM 0X4
7836 
7837 /**
7838 * \fn int set_qam ()
7839 * \brief Set QAM demod.
7840 * \param demod:   instance of demod.
7841 * \param channel: pointer to channel data.
7842 * \return int.
7843 */
7844 static int
7845 set_qam(struct drx_demod_instance *demod,
7846 	struct drx_channel *channel, s32 tuner_freq_offset, u32 op)
7847 {
7848 	struct i2c_device_addr *dev_addr = NULL;
7849 	struct drxj_data *ext_attr = NULL;
7850 	struct drx_common_attr *common_attr = NULL;
7851 	int rc;
7852 	u32 adc_frequency = 0;
7853 	u32 iqm_rc_rate = 0;
7854 	u16 cmd_result = 0;
7855 	u16 lc_symbol_freq = 0;
7856 	u16 iqm_rc_stretch = 0;
7857 	u16 set_env_parameters = 0;
7858 	u16 set_param_parameters[2] = { 0 };
7859 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
7860 		/* parameter_len */ 0,
7861 		/* result_len    */ 0,
7862 		/* parameter    */ NULL,
7863 		/* result       */ NULL
7864 	};
7865 	const u8 qam_a_taps[] = {
7866 		DRXJ_16TO8(-1),	/* re0  */
7867 		DRXJ_16TO8(1),	/* re1  */
7868 		DRXJ_16TO8(1),	/* re2  */
7869 		DRXJ_16TO8(-1),	/* re3  */
7870 		DRXJ_16TO8(-1),	/* re4  */
7871 		DRXJ_16TO8(2),	/* re5  */
7872 		DRXJ_16TO8(1),	/* re6  */
7873 		DRXJ_16TO8(-2),	/* re7  */
7874 		DRXJ_16TO8(0),	/* re8  */
7875 		DRXJ_16TO8(3),	/* re9  */
7876 		DRXJ_16TO8(-1),	/* re10 */
7877 		DRXJ_16TO8(-3),	/* re11 */
7878 		DRXJ_16TO8(4),	/* re12 */
7879 		DRXJ_16TO8(1),	/* re13 */
7880 		DRXJ_16TO8(-8),	/* re14 */
7881 		DRXJ_16TO8(4),	/* re15 */
7882 		DRXJ_16TO8(13),	/* re16 */
7883 		DRXJ_16TO8(-13),	/* re17 */
7884 		DRXJ_16TO8(-19),	/* re18 */
7885 		DRXJ_16TO8(28),	/* re19 */
7886 		DRXJ_16TO8(25),	/* re20 */
7887 		DRXJ_16TO8(-53),	/* re21 */
7888 		DRXJ_16TO8(-31),	/* re22 */
7889 		DRXJ_16TO8(96),	/* re23 */
7890 		DRXJ_16TO8(37),	/* re24 */
7891 		DRXJ_16TO8(-190),	/* re25 */
7892 		DRXJ_16TO8(-40),	/* re26 */
7893 		DRXJ_16TO8(619)	/* re27 */
7894 	};
7895 	const u8 qam_b64_taps[] = {
7896 		DRXJ_16TO8(0),	/* re0  */
7897 		DRXJ_16TO8(-2),	/* re1  */
7898 		DRXJ_16TO8(1),	/* re2  */
7899 		DRXJ_16TO8(2),	/* re3  */
7900 		DRXJ_16TO8(-2),	/* re4  */
7901 		DRXJ_16TO8(0),	/* re5  */
7902 		DRXJ_16TO8(4),	/* re6  */
7903 		DRXJ_16TO8(-2),	/* re7  */
7904 		DRXJ_16TO8(-4),	/* re8  */
7905 		DRXJ_16TO8(4),	/* re9  */
7906 		DRXJ_16TO8(3),	/* re10 */
7907 		DRXJ_16TO8(-6),	/* re11 */
7908 		DRXJ_16TO8(0),	/* re12 */
7909 		DRXJ_16TO8(6),	/* re13 */
7910 		DRXJ_16TO8(-5),	/* re14 */
7911 		DRXJ_16TO8(-3),	/* re15 */
7912 		DRXJ_16TO8(11),	/* re16 */
7913 		DRXJ_16TO8(-4),	/* re17 */
7914 		DRXJ_16TO8(-19),	/* re18 */
7915 		DRXJ_16TO8(19),	/* re19 */
7916 		DRXJ_16TO8(28),	/* re20 */
7917 		DRXJ_16TO8(-45),	/* re21 */
7918 		DRXJ_16TO8(-36),	/* re22 */
7919 		DRXJ_16TO8(90),	/* re23 */
7920 		DRXJ_16TO8(42),	/* re24 */
7921 		DRXJ_16TO8(-185),	/* re25 */
7922 		DRXJ_16TO8(-46),	/* re26 */
7923 		DRXJ_16TO8(614)	/* re27 */
7924 	};
7925 	const u8 qam_b256_taps[] = {
7926 		DRXJ_16TO8(-2),	/* re0  */
7927 		DRXJ_16TO8(4),	/* re1  */
7928 		DRXJ_16TO8(1),	/* re2  */
7929 		DRXJ_16TO8(-4),	/* re3  */
7930 		DRXJ_16TO8(0),	/* re4  */
7931 		DRXJ_16TO8(4),	/* re5  */
7932 		DRXJ_16TO8(-2),	/* re6  */
7933 		DRXJ_16TO8(-4),	/* re7  */
7934 		DRXJ_16TO8(5),	/* re8  */
7935 		DRXJ_16TO8(2),	/* re9  */
7936 		DRXJ_16TO8(-8),	/* re10 */
7937 		DRXJ_16TO8(2),	/* re11 */
7938 		DRXJ_16TO8(11),	/* re12 */
7939 		DRXJ_16TO8(-8),	/* re13 */
7940 		DRXJ_16TO8(-15),	/* re14 */
7941 		DRXJ_16TO8(16),	/* re15 */
7942 		DRXJ_16TO8(19),	/* re16 */
7943 		DRXJ_16TO8(-27),	/* re17 */
7944 		DRXJ_16TO8(-22),	/* re18 */
7945 		DRXJ_16TO8(44),	/* re19 */
7946 		DRXJ_16TO8(26),	/* re20 */
7947 		DRXJ_16TO8(-69),	/* re21 */
7948 		DRXJ_16TO8(-28),	/* re22 */
7949 		DRXJ_16TO8(110),	/* re23 */
7950 		DRXJ_16TO8(31),	/* re24 */
7951 		DRXJ_16TO8(-201),	/* re25 */
7952 		DRXJ_16TO8(-32),	/* re26 */
7953 		DRXJ_16TO8(628)	/* re27 */
7954 	};
7955 	const u8 qam_c_taps[] = {
7956 		DRXJ_16TO8(-3),	/* re0  */
7957 		DRXJ_16TO8(3),	/* re1  */
7958 		DRXJ_16TO8(2),	/* re2  */
7959 		DRXJ_16TO8(-4),	/* re3  */
7960 		DRXJ_16TO8(0),	/* re4  */
7961 		DRXJ_16TO8(4),	/* re5  */
7962 		DRXJ_16TO8(-1),	/* re6  */
7963 		DRXJ_16TO8(-4),	/* re7  */
7964 		DRXJ_16TO8(3),	/* re8  */
7965 		DRXJ_16TO8(3),	/* re9  */
7966 		DRXJ_16TO8(-5),	/* re10 */
7967 		DRXJ_16TO8(0),	/* re11 */
7968 		DRXJ_16TO8(9),	/* re12 */
7969 		DRXJ_16TO8(-4),	/* re13 */
7970 		DRXJ_16TO8(-12),	/* re14 */
7971 		DRXJ_16TO8(10),	/* re15 */
7972 		DRXJ_16TO8(16),	/* re16 */
7973 		DRXJ_16TO8(-21),	/* re17 */
7974 		DRXJ_16TO8(-20),	/* re18 */
7975 		DRXJ_16TO8(37),	/* re19 */
7976 		DRXJ_16TO8(25),	/* re20 */
7977 		DRXJ_16TO8(-62),	/* re21 */
7978 		DRXJ_16TO8(-28),	/* re22 */
7979 		DRXJ_16TO8(105),	/* re23 */
7980 		DRXJ_16TO8(31),	/* re24 */
7981 		DRXJ_16TO8(-197),	/* re25 */
7982 		DRXJ_16TO8(-33),	/* re26 */
7983 		DRXJ_16TO8(626)	/* re27 */
7984 	};
7985 
7986 	dev_addr = demod->my_i2c_dev_addr;
7987 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
7988 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
7989 
7990 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
7991 		if (ext_attr->standard == DRX_STANDARD_ITU_B) {
7992 			switch (channel->constellation) {
7993 			case DRX_CONSTELLATION_QAM256:
7994 				iqm_rc_rate = 0x00AE3562;
7995 				lc_symbol_freq =
7996 				    QAM_LC_SYMBOL_FREQ_FREQ_QAM_B_256;
7997 				channel->symbolrate = 5360537;
7998 				iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_256;
7999 				break;
8000 			case DRX_CONSTELLATION_QAM64:
8001 				iqm_rc_rate = 0x00C05A0E;
8002 				lc_symbol_freq = 409;
8003 				channel->symbolrate = 5056941;
8004 				iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_64;
8005 				break;
8006 			default:
8007 				return -EINVAL;
8008 			}
8009 		} else {
8010 			adc_frequency = (common_attr->sys_clock_freq * 1000) / 3;
8011 			if (channel->symbolrate == 0) {
8012 				pr_err("error: channel symbolrate is zero!\n");
8013 				return -EIO;
8014 			}
8015 			iqm_rc_rate =
8016 			    (adc_frequency / channel->symbolrate) * (1 << 21) +
8017 			    (frac28
8018 			     ((adc_frequency % channel->symbolrate),
8019 			      channel->symbolrate) >> 7) - (1 << 23);
8020 			lc_symbol_freq =
8021 			    (u16) (frac28
8022 				     (channel->symbolrate +
8023 				      (adc_frequency >> 13),
8024 				      adc_frequency) >> 16);
8025 			if (lc_symbol_freq > 511)
8026 				lc_symbol_freq = 511;
8027 
8028 			iqm_rc_stretch = 21;
8029 		}
8030 
8031 		if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8032 			set_env_parameters = QAM_TOP_ANNEX_A;	/* annex             */
8033 			set_param_parameters[0] = channel->constellation;	/* constellation     */
8034 			set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;	/* interleave mode   */
8035 		} else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8036 			set_env_parameters = QAM_TOP_ANNEX_B;	/* annex             */
8037 			set_param_parameters[0] = channel->constellation;	/* constellation     */
8038 			set_param_parameters[1] = channel->interleavemode;	/* interleave mode   */
8039 		} else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8040 			set_env_parameters = QAM_TOP_ANNEX_C;	/* annex             */
8041 			set_param_parameters[0] = channel->constellation;	/* constellation     */
8042 			set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;	/* interleave mode   */
8043 		} else {
8044 			return -EINVAL;
8045 		}
8046 	}
8047 
8048 	if (op & QAM_SET_OP_ALL) {
8049 		/*
8050 		   STEP 1: reset demodulator
8051 		   resets IQM, QAM and FEC HW blocks
8052 		   resets SCU variables
8053 		 */
8054 		/* stop all comm_exec */
8055 		rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
8056 		if (rc != 0) {
8057 			pr_err("error %d\n", rc);
8058 			goto rw_error;
8059 		}
8060 		rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
8061 		if (rc != 0) {
8062 			pr_err("error %d\n", rc);
8063 			goto rw_error;
8064 		}
8065 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
8066 		if (rc != 0) {
8067 			pr_err("error %d\n", rc);
8068 			goto rw_error;
8069 		}
8070 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
8071 		if (rc != 0) {
8072 			pr_err("error %d\n", rc);
8073 			goto rw_error;
8074 		}
8075 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
8076 		if (rc != 0) {
8077 			pr_err("error %d\n", rc);
8078 			goto rw_error;
8079 		}
8080 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
8081 		if (rc != 0) {
8082 			pr_err("error %d\n", rc);
8083 			goto rw_error;
8084 		}
8085 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
8086 		if (rc != 0) {
8087 			pr_err("error %d\n", rc);
8088 			goto rw_error;
8089 		}
8090 
8091 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8092 		    SCU_RAM_COMMAND_CMD_DEMOD_RESET;
8093 		cmd_scu.parameter_len = 0;
8094 		cmd_scu.result_len = 1;
8095 		cmd_scu.parameter = NULL;
8096 		cmd_scu.result = &cmd_result;
8097 		rc = scu_command(dev_addr, &cmd_scu);
8098 		if (rc != 0) {
8099 			pr_err("error %d\n", rc);
8100 			goto rw_error;
8101 		}
8102 	}
8103 
8104 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8105 		/*
8106 		   STEP 2: configure demodulator
8107 		   -set env
8108 		   -set params (resets IQM,QAM,FEC HW; initializes some SCU variables )
8109 		 */
8110 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8111 		    SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
8112 		cmd_scu.parameter_len = 1;
8113 		cmd_scu.result_len = 1;
8114 		cmd_scu.parameter = &set_env_parameters;
8115 		cmd_scu.result = &cmd_result;
8116 		rc = scu_command(dev_addr, &cmd_scu);
8117 		if (rc != 0) {
8118 			pr_err("error %d\n", rc);
8119 			goto rw_error;
8120 		}
8121 
8122 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8123 		    SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
8124 		cmd_scu.parameter_len = 2;
8125 		cmd_scu.result_len = 1;
8126 		cmd_scu.parameter = set_param_parameters;
8127 		cmd_scu.result = &cmd_result;
8128 		rc = scu_command(dev_addr, &cmd_scu);
8129 		if (rc != 0) {
8130 			pr_err("error %d\n", rc);
8131 			goto rw_error;
8132 		}
8133 		/* set symbol rate */
8134 		rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate, 0);
8135 		if (rc != 0) {
8136 			pr_err("error %d\n", rc);
8137 			goto rw_error;
8138 		}
8139 		ext_attr->iqm_rc_rate_ofs = iqm_rc_rate;
8140 		rc = set_qam_measurement(demod, channel->constellation, channel->symbolrate);
8141 		if (rc != 0) {
8142 			pr_err("error %d\n", rc);
8143 			goto rw_error;
8144 		}
8145 	}
8146 	/* STEP 3: enable the system in a mode where the ADC provides valid signal
8147 	   setup constellation independent registers */
8148 	/* from qam_cmd.py script (qam_driver_b) */
8149 	/* TODO: remove re-writes of HW reset values */
8150 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_SPECTRUM)) {
8151 		rc = set_frequency(demod, channel, tuner_freq_offset);
8152 		if (rc != 0) {
8153 			pr_err("error %d\n", rc);
8154 			goto rw_error;
8155 		}
8156 	}
8157 
8158 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8159 
8160 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_SYMBOL_FREQ__A, lc_symbol_freq, 0);
8161 		if (rc != 0) {
8162 			pr_err("error %d\n", rc);
8163 			goto rw_error;
8164 		}
8165 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, iqm_rc_stretch, 0);
8166 		if (rc != 0) {
8167 			pr_err("error %d\n", rc);
8168 			goto rw_error;
8169 		}
8170 	}
8171 
8172 	if (op & QAM_SET_OP_ALL) {
8173 		if (!ext_attr->has_lna) {
8174 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
8175 			if (rc != 0) {
8176 				pr_err("error %d\n", rc);
8177 				goto rw_error;
8178 			}
8179 		}
8180 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
8181 		if (rc != 0) {
8182 			pr_err("error %d\n", rc);
8183 			goto rw_error;
8184 		}
8185 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
8186 		if (rc != 0) {
8187 			pr_err("error %d\n", rc);
8188 			goto rw_error;
8189 		}
8190 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_QAM__M, 0);
8191 		if (rc != 0) {
8192 			pr_err("error %d\n", rc);
8193 			goto rw_error;
8194 		}
8195 
8196 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_WR_RSV_0__A, 0x5f, 0);
8197 		if (rc != 0) {
8198 			pr_err("error %d\n", rc);
8199 			goto rw_error;
8200 		}	/* scu temporary shut down agc */
8201 
8202 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SYNC_SEL__A, 3, 0);
8203 		if (rc != 0) {
8204 			pr_err("error %d\n", rc);
8205 			goto rw_error;
8206 		}
8207 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
8208 		if (rc != 0) {
8209 			pr_err("error %d\n", rc);
8210 			goto rw_error;
8211 		}
8212 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 448, 0);
8213 		if (rc != 0) {
8214 			pr_err("error %d\n", rc);
8215 			goto rw_error;
8216 		}
8217 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
8218 		if (rc != 0) {
8219 			pr_err("error %d\n", rc);
8220 			goto rw_error;
8221 		}
8222 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, 4, 0);
8223 		if (rc != 0) {
8224 			pr_err("error %d\n", rc);
8225 			goto rw_error;
8226 		}
8227 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, 0x10, 0);
8228 		if (rc != 0) {
8229 			pr_err("error %d\n", rc);
8230 			goto rw_error;
8231 		}
8232 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, 11, 0);
8233 		if (rc != 0) {
8234 			pr_err("error %d\n", rc);
8235 			goto rw_error;
8236 		}
8237 
8238 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
8239 		if (rc != 0) {
8240 			pr_err("error %d\n", rc);
8241 			goto rw_error;
8242 		}
8243 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE, 0);
8244 		if (rc != 0) {
8245 			pr_err("error %d\n", rc);
8246 			goto rw_error;
8247 		}	/*! reset default val ! */
8248 
8249 		rc = drxj_dap_write_reg16(dev_addr, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE, 0);
8250 		if (rc != 0) {
8251 			pr_err("error %d\n", rc);
8252 			goto rw_error;
8253 		}	/*! reset default val ! */
8254 		if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8255 			rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, QAM_SY_SYNC_LWM__PRE, 0);
8256 			if (rc != 0) {
8257 				pr_err("error %d\n", rc);
8258 				goto rw_error;
8259 			}	/*! reset default val ! */
8260 			rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, QAM_SY_SYNC_AWM__PRE, 0);
8261 			if (rc != 0) {
8262 				pr_err("error %d\n", rc);
8263 				goto rw_error;
8264 			}	/*! reset default val ! */
8265 			rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8266 			if (rc != 0) {
8267 				pr_err("error %d\n", rc);
8268 				goto rw_error;
8269 			}	/*! reset default val ! */
8270 		} else {
8271 			switch (channel->constellation) {
8272 			case DRX_CONSTELLATION_QAM16:
8273 			case DRX_CONSTELLATION_QAM64:
8274 			case DRX_CONSTELLATION_QAM256:
8275 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8276 				if (rc != 0) {
8277 					pr_err("error %d\n", rc);
8278 					goto rw_error;
8279 				}
8280 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x04, 0);
8281 				if (rc != 0) {
8282 					pr_err("error %d\n", rc);
8283 					goto rw_error;
8284 				}
8285 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8286 				if (rc != 0) {
8287 					pr_err("error %d\n", rc);
8288 					goto rw_error;
8289 				}	/*! reset default val ! */
8290 				break;
8291 			case DRX_CONSTELLATION_QAM32:
8292 			case DRX_CONSTELLATION_QAM128:
8293 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8294 				if (rc != 0) {
8295 					pr_err("error %d\n", rc);
8296 					goto rw_error;
8297 				}
8298 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x05, 0);
8299 				if (rc != 0) {
8300 					pr_err("error %d\n", rc);
8301 					goto rw_error;
8302 				}
8303 				rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, 0x06, 0);
8304 				if (rc != 0) {
8305 					pr_err("error %d\n", rc);
8306 					goto rw_error;
8307 				}
8308 				break;
8309 			default:
8310 				return -EIO;
8311 			}	/* switch */
8312 		}
8313 
8314 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, QAM_LC_MODE__PRE, 0);
8315 		if (rc != 0) {
8316 			pr_err("error %d\n", rc);
8317 			goto rw_error;
8318 		}	/*! reset default val ! */
8319 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_RATE_LIMIT__A, 3, 0);
8320 		if (rc != 0) {
8321 			pr_err("error %d\n", rc);
8322 			goto rw_error;
8323 		}
8324 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORP__A, 4, 0);
8325 		if (rc != 0) {
8326 			pr_err("error %d\n", rc);
8327 			goto rw_error;
8328 		}
8329 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORI__A, 4, 0);
8330 		if (rc != 0) {
8331 			pr_err("error %d\n", rc);
8332 			goto rw_error;
8333 		}
8334 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, 7, 0);
8335 		if (rc != 0) {
8336 			pr_err("error %d\n", rc);
8337 			goto rw_error;
8338 		}
8339 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB0__A, 1, 0);
8340 		if (rc != 0) {
8341 			pr_err("error %d\n", rc);
8342 			goto rw_error;
8343 		}
8344 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB1__A, 1, 0);
8345 		if (rc != 0) {
8346 			pr_err("error %d\n", rc);
8347 			goto rw_error;
8348 		}
8349 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB2__A, 1, 0);
8350 		if (rc != 0) {
8351 			pr_err("error %d\n", rc);
8352 			goto rw_error;
8353 		}
8354 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB3__A, 1, 0);
8355 		if (rc != 0) {
8356 			pr_err("error %d\n", rc);
8357 			goto rw_error;
8358 		}
8359 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB4__A, 2, 0);
8360 		if (rc != 0) {
8361 			pr_err("error %d\n", rc);
8362 			goto rw_error;
8363 		}
8364 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB5__A, 2, 0);
8365 		if (rc != 0) {
8366 			pr_err("error %d\n", rc);
8367 			goto rw_error;
8368 		}
8369 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB6__A, 2, 0);
8370 		if (rc != 0) {
8371 			pr_err("error %d\n", rc);
8372 			goto rw_error;
8373 		}
8374 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB8__A, 2, 0);
8375 		if (rc != 0) {
8376 			pr_err("error %d\n", rc);
8377 			goto rw_error;
8378 		}
8379 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB9__A, 2, 0);
8380 		if (rc != 0) {
8381 			pr_err("error %d\n", rc);
8382 			goto rw_error;
8383 		}
8384 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB10__A, 2, 0);
8385 		if (rc != 0) {
8386 			pr_err("error %d\n", rc);
8387 			goto rw_error;
8388 		}
8389 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB12__A, 2, 0);
8390 		if (rc != 0) {
8391 			pr_err("error %d\n", rc);
8392 			goto rw_error;
8393 		}
8394 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB15__A, 3, 0);
8395 		if (rc != 0) {
8396 			pr_err("error %d\n", rc);
8397 			goto rw_error;
8398 		}
8399 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB16__A, 3, 0);
8400 		if (rc != 0) {
8401 			pr_err("error %d\n", rc);
8402 			goto rw_error;
8403 		}
8404 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB20__A, 4, 0);
8405 		if (rc != 0) {
8406 			pr_err("error %d\n", rc);
8407 			goto rw_error;
8408 		}
8409 		rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB25__A, 4, 0);
8410 		if (rc != 0) {
8411 			pr_err("error %d\n", rc);
8412 			goto rw_error;
8413 		}
8414 
8415 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, 1, 0);
8416 		if (rc != 0) {
8417 			pr_err("error %d\n", rc);
8418 			goto rw_error;
8419 		}
8420 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, 1, 0);
8421 		if (rc != 0) {
8422 			pr_err("error %d\n", rc);
8423 			goto rw_error;
8424 		}
8425 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_ADJ_SEL__A, 1, 0);
8426 		if (rc != 0) {
8427 			pr_err("error %d\n", rc);
8428 			goto rw_error;
8429 		}
8430 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 0, 0);
8431 		if (rc != 0) {
8432 			pr_err("error %d\n", rc);
8433 			goto rw_error;
8434 		}
8435 		rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
8436 		if (rc != 0) {
8437 			pr_err("error %d\n", rc);
8438 			goto rw_error;
8439 		}
8440 
8441 		/* No more resets of the IQM, current standard correctly set =>
8442 		   now AGCs can be configured. */
8443 		/* turn on IQMAF. It has to be in front of setAgc**() */
8444 		rc = set_iqm_af(demod, true);
8445 		if (rc != 0) {
8446 			pr_err("error %d\n", rc);
8447 			goto rw_error;
8448 		}
8449 		rc = adc_synchronization(demod);
8450 		if (rc != 0) {
8451 			pr_err("error %d\n", rc);
8452 			goto rw_error;
8453 		}
8454 
8455 		rc = init_agc(demod);
8456 		if (rc != 0) {
8457 			pr_err("error %d\n", rc);
8458 			goto rw_error;
8459 		}
8460 		rc = set_agc_if(demod, &(ext_attr->qam_if_agc_cfg), false);
8461 		if (rc != 0) {
8462 			pr_err("error %d\n", rc);
8463 			goto rw_error;
8464 		}
8465 		rc = set_agc_rf(demod, &(ext_attr->qam_rf_agc_cfg), false);
8466 		if (rc != 0) {
8467 			pr_err("error %d\n", rc);
8468 			goto rw_error;
8469 		}
8470 		{
8471 			/* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
8472 			   of only the gain */
8473 			struct drxj_cfg_afe_gain qam_pga_cfg = { DRX_STANDARD_ITU_B, 0 };
8474 
8475 			qam_pga_cfg.gain = ext_attr->qam_pga_cfg;
8476 			rc = ctrl_set_cfg_afe_gain(demod, &qam_pga_cfg);
8477 			if (rc != 0) {
8478 				pr_err("error %d\n", rc);
8479 				goto rw_error;
8480 			}
8481 		}
8482 		rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->qam_pre_saw_cfg));
8483 		if (rc != 0) {
8484 			pr_err("error %d\n", rc);
8485 			goto rw_error;
8486 		}
8487 	}
8488 
8489 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8490 		if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8491 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8492 			if (rc != 0) {
8493 				pr_err("error %d\n", rc);
8494 				goto rw_error;
8495 			}
8496 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8497 			if (rc != 0) {
8498 				pr_err("error %d\n", rc);
8499 				goto rw_error;
8500 			}
8501 		} else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8502 			switch (channel->constellation) {
8503 			case DRX_CONSTELLATION_QAM64:
8504 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8505 				if (rc != 0) {
8506 					pr_err("error %d\n", rc);
8507 					goto rw_error;
8508 				}
8509 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8510 				if (rc != 0) {
8511 					pr_err("error %d\n", rc);
8512 					goto rw_error;
8513 				}
8514 				break;
8515 			case DRX_CONSTELLATION_QAM256:
8516 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8517 				if (rc != 0) {
8518 					pr_err("error %d\n", rc);
8519 					goto rw_error;
8520 				}
8521 				rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8522 				if (rc != 0) {
8523 					pr_err("error %d\n", rc);
8524 					goto rw_error;
8525 				}
8526 				break;
8527 			default:
8528 				return -EIO;
8529 			}
8530 		} else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8531 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8532 			if (rc != 0) {
8533 				pr_err("error %d\n", rc);
8534 				goto rw_error;
8535 			}
8536 			rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8537 			if (rc != 0) {
8538 				pr_err("error %d\n", rc);
8539 				goto rw_error;
8540 			}
8541 		}
8542 
8543 		/* SETP 4: constellation specific setup */
8544 		switch (channel->constellation) {
8545 		case DRX_CONSTELLATION_QAM16:
8546 			rc = set_qam16(demod);
8547 			if (rc != 0) {
8548 				pr_err("error %d\n", rc);
8549 				goto rw_error;
8550 			}
8551 			break;
8552 		case DRX_CONSTELLATION_QAM32:
8553 			rc = set_qam32(demod);
8554 			if (rc != 0) {
8555 				pr_err("error %d\n", rc);
8556 				goto rw_error;
8557 			}
8558 			break;
8559 		case DRX_CONSTELLATION_QAM64:
8560 			rc = set_qam64(demod);
8561 			if (rc != 0) {
8562 				pr_err("error %d\n", rc);
8563 				goto rw_error;
8564 			}
8565 			break;
8566 		case DRX_CONSTELLATION_QAM128:
8567 			rc = set_qam128(demod);
8568 			if (rc != 0) {
8569 				pr_err("error %d\n", rc);
8570 				goto rw_error;
8571 			}
8572 			break;
8573 		case DRX_CONSTELLATION_QAM256:
8574 			rc = set_qam256(demod);
8575 			if (rc != 0) {
8576 				pr_err("error %d\n", rc);
8577 				goto rw_error;
8578 			}
8579 			break;
8580 		default:
8581 			return -EIO;
8582 		}		/* switch */
8583 	}
8584 
8585 	if ((op & QAM_SET_OP_ALL)) {
8586 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
8587 		if (rc != 0) {
8588 			pr_err("error %d\n", rc);
8589 			goto rw_error;
8590 		}
8591 
8592 		/* Mpeg output has to be in front of FEC active */
8593 		rc = set_mpegtei_handling(demod);
8594 		if (rc != 0) {
8595 			pr_err("error %d\n", rc);
8596 			goto rw_error;
8597 		}
8598 		rc = bit_reverse_mpeg_output(demod);
8599 		if (rc != 0) {
8600 			pr_err("error %d\n", rc);
8601 			goto rw_error;
8602 		}
8603 		rc = set_mpeg_start_width(demod);
8604 		if (rc != 0) {
8605 			pr_err("error %d\n", rc);
8606 			goto rw_error;
8607 		}
8608 		{
8609 			/* TODO: move to set_standard after hardware reset value problem is solved */
8610 			/* Configure initial MPEG output */
8611 			struct drx_cfg_mpeg_output cfg_mpeg_output;
8612 
8613 			memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
8614 			cfg_mpeg_output.enable_mpeg_output = true;
8615 
8616 			rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
8617 			if (rc != 0) {
8618 				pr_err("error %d\n", rc);
8619 				goto rw_error;
8620 			}
8621 		}
8622 	}
8623 
8624 	if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8625 
8626 		/* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
8627 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8628 		    SCU_RAM_COMMAND_CMD_DEMOD_START;
8629 		cmd_scu.parameter_len = 0;
8630 		cmd_scu.result_len = 1;
8631 		cmd_scu.parameter = NULL;
8632 		cmd_scu.result = &cmd_result;
8633 		rc = scu_command(dev_addr, &cmd_scu);
8634 		if (rc != 0) {
8635 			pr_err("error %d\n", rc);
8636 			goto rw_error;
8637 		}
8638 	}
8639 
8640 	rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
8641 	if (rc != 0) {
8642 		pr_err("error %d\n", rc);
8643 		goto rw_error;
8644 	}
8645 	rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE, 0);
8646 	if (rc != 0) {
8647 		pr_err("error %d\n", rc);
8648 		goto rw_error;
8649 	}
8650 	rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
8651 	if (rc != 0) {
8652 		pr_err("error %d\n", rc);
8653 		goto rw_error;
8654 	}
8655 
8656 	return 0;
8657 rw_error:
8658 	return rc;
8659 }
8660 
8661 /*============================================================================*/
8662 static int ctrl_get_qam_sig_quality(struct drx_demod_instance *demod);
8663 
8664 static int qam_flip_spec(struct drx_demod_instance *demod, struct drx_channel *channel)
8665 {
8666 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8667 	struct drxj_data *ext_attr = demod->my_ext_attr;
8668 	int rc;
8669 	u32 iqm_fs_rate_ofs = 0;
8670 	u32 iqm_fs_rate_lo = 0;
8671 	u16 qam_ctl_ena = 0;
8672 	u16 data = 0;
8673 	u16 equ_mode = 0;
8674 	u16 fsm_state = 0;
8675 	int i = 0;
8676 	int ofsofs = 0;
8677 
8678 	/* Silence the controlling of lc, equ, and the acquisition state machine */
8679 	rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, &qam_ctl_ena, 0);
8680 	if (rc != 0) {
8681 		pr_err("error %d\n", rc);
8682 		goto rw_error;
8683 	}
8684 	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);
8685 	if (rc != 0) {
8686 		pr_err("error %d\n", rc);
8687 		goto rw_error;
8688 	}
8689 
8690 	/* freeze the frequency control loop */
8691 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF__A, 0, 0);
8692 	if (rc != 0) {
8693 		pr_err("error %d\n", rc);
8694 		goto rw_error;
8695 	}
8696 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF1__A, 0, 0);
8697 	if (rc != 0) {
8698 		pr_err("error %d\n", rc);
8699 		goto rw_error;
8700 	}
8701 
8702 	rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, &iqm_fs_rate_ofs, 0);
8703 	if (rc != 0) {
8704 		pr_err("error %d\n", rc);
8705 		goto rw_error;
8706 	}
8707 	rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_LO__A, &iqm_fs_rate_lo, 0);
8708 	if (rc != 0) {
8709 		pr_err("error %d\n", rc);
8710 		goto rw_error;
8711 	}
8712 	ofsofs = iqm_fs_rate_lo - iqm_fs_rate_ofs;
8713 	iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
8714 	iqm_fs_rate_ofs -= 2 * ofsofs;
8715 
8716 	/* freeze dq/fq updating */
8717 	rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8718 	if (rc != 0) {
8719 		pr_err("error %d\n", rc);
8720 		goto rw_error;
8721 	}
8722 	data = (data & 0xfff9);
8723 	rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8724 	if (rc != 0) {
8725 		pr_err("error %d\n", rc);
8726 		goto rw_error;
8727 	}
8728 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8729 	if (rc != 0) {
8730 		pr_err("error %d\n", rc);
8731 		goto rw_error;
8732 	}
8733 
8734 	/* lc_cp / _ci / _ca */
8735 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CI__A, 0, 0);
8736 	if (rc != 0) {
8737 		pr_err("error %d\n", rc);
8738 		goto rw_error;
8739 	}
8740 	rc = drxj_dap_write_reg16(dev_addr, QAM_LC_EP__A, 0, 0);
8741 	if (rc != 0) {
8742 		pr_err("error %d\n", rc);
8743 		goto rw_error;
8744 	}
8745 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_LA_FACTOR__A, 0, 0);
8746 	if (rc != 0) {
8747 		pr_err("error %d\n", rc);
8748 		goto rw_error;
8749 	}
8750 
8751 	/* flip the spec */
8752 	rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
8753 	if (rc != 0) {
8754 		pr_err("error %d\n", rc);
8755 		goto rw_error;
8756 	}
8757 	ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
8758 	ext_attr->pos_image = (ext_attr->pos_image) ? false : true;
8759 
8760 	/* freeze dq/fq updating */
8761 	rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8762 	if (rc != 0) {
8763 		pr_err("error %d\n", rc);
8764 		goto rw_error;
8765 	}
8766 	equ_mode = data;
8767 	data = (data & 0xfff9);
8768 	rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8769 	if (rc != 0) {
8770 		pr_err("error %d\n", rc);
8771 		goto rw_error;
8772 	}
8773 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8774 	if (rc != 0) {
8775 		pr_err("error %d\n", rc);
8776 		goto rw_error;
8777 	}
8778 
8779 	for (i = 0; i < 28; i++) {
8780 		rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8781 		if (rc != 0) {
8782 			pr_err("error %d\n", rc);
8783 			goto rw_error;
8784 		}
8785 		rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8786 		if (rc != 0) {
8787 			pr_err("error %d\n", rc);
8788 			goto rw_error;
8789 		}
8790 	}
8791 
8792 	for (i = 0; i < 24; i++) {
8793 		rc = drxj_dap_read_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8794 		if (rc != 0) {
8795 			pr_err("error %d\n", rc);
8796 			goto rw_error;
8797 		}
8798 		rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8799 		if (rc != 0) {
8800 			pr_err("error %d\n", rc);
8801 			goto rw_error;
8802 		}
8803 	}
8804 
8805 	data = equ_mode;
8806 	rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8807 	if (rc != 0) {
8808 		pr_err("error %d\n", rc);
8809 		goto rw_error;
8810 	}
8811 	rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8812 	if (rc != 0) {
8813 		pr_err("error %d\n", rc);
8814 		goto rw_error;
8815 	}
8816 
8817 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE_TGT__A, 4, 0);
8818 	if (rc != 0) {
8819 		pr_err("error %d\n", rc);
8820 		goto rw_error;
8821 	}
8822 
8823 	i = 0;
8824 	while ((fsm_state != 4) && (i++ < 100)) {
8825 		rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE__A, &fsm_state, 0);
8826 		if (rc != 0) {
8827 			pr_err("error %d\n", rc);
8828 			goto rw_error;
8829 		}
8830 	}
8831 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, (qam_ctl_ena | 0x0016), 0);
8832 	if (rc != 0) {
8833 		pr_err("error %d\n", rc);
8834 		goto rw_error;
8835 	}
8836 
8837 	return 0;
8838 rw_error:
8839 	return rc;
8840 
8841 }
8842 
8843 #define  NO_LOCK        0x0
8844 #define  DEMOD_LOCKED   0x1
8845 #define  SYNC_FLIPPED   0x2
8846 #define  SPEC_MIRRORED  0x4
8847 /**
8848 * \fn int qam64auto ()
8849 * \brief auto do sync pattern switching and mirroring.
8850 * \param demod:   instance of demod.
8851 * \param channel: pointer to channel data.
8852 * \param tuner_freq_offset: tuner frequency offset.
8853 * \param lock_status: pointer to lock status.
8854 * \return int.
8855 */
8856 static int
8857 qam64auto(struct drx_demod_instance *demod,
8858 	  struct drx_channel *channel,
8859 	  s32 tuner_freq_offset, enum drx_lock_status *lock_status)
8860 {
8861 	struct drxj_data *ext_attr = demod->my_ext_attr;
8862 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8863 	struct drx39xxj_state *state = dev_addr->user_data;
8864 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
8865 	int rc;
8866 	u32 lck_state = NO_LOCK;
8867 	u32 start_time = 0;
8868 	u32 d_locked_time = 0;
8869 	u32 timeout_ofs = 0;
8870 	u16 data = 0;
8871 
8872 	/* external attributes for storing acquired channel constellation */
8873 	*lock_status = DRX_NOT_LOCKED;
8874 	start_time = jiffies_to_msecs(jiffies);
8875 	lck_state = NO_LOCK;
8876 	do {
8877 		rc = ctrl_lock_status(demod, lock_status);
8878 		if (rc != 0) {
8879 			pr_err("error %d\n", rc);
8880 			goto rw_error;
8881 		}
8882 
8883 		switch (lck_state) {
8884 		case NO_LOCK:
8885 			if (*lock_status == DRXJ_DEMOD_LOCK) {
8886 				rc = ctrl_get_qam_sig_quality(demod);
8887 				if (rc != 0) {
8888 					pr_err("error %d\n", rc);
8889 					goto rw_error;
8890 				}
8891 				if (p->cnr.stat[0].svalue > 20800) {
8892 					lck_state = DEMOD_LOCKED;
8893 					/* some delay to see if fec_lock possible TODO find the right value */
8894 					timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;	/* see something, waiting longer */
8895 					d_locked_time = jiffies_to_msecs(jiffies);
8896 				}
8897 			}
8898 			break;
8899 		case DEMOD_LOCKED:
8900 			if ((*lock_status == DRXJ_DEMOD_LOCK) &&	/* still demod_lock in 150ms */
8901 			    ((jiffies_to_msecs(jiffies) - d_locked_time) >
8902 			     DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8903 				rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8904 				if (rc != 0) {
8905 					pr_err("error %d\n", rc);
8906 					goto rw_error;
8907 				}
8908 				rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8909 				if (rc != 0) {
8910 					pr_err("error %d\n", rc);
8911 					goto rw_error;
8912 				}
8913 				lck_state = SYNC_FLIPPED;
8914 				msleep(10);
8915 			}
8916 			break;
8917 		case SYNC_FLIPPED:
8918 			if (*lock_status == DRXJ_DEMOD_LOCK) {
8919 				if (channel->mirror == DRX_MIRROR_AUTO) {
8920 					/* flip sync pattern back */
8921 					rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8922 					if (rc != 0) {
8923 						pr_err("error %d\n", rc);
8924 						goto rw_error;
8925 					}
8926 					rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data & 0xFFFE, 0);
8927 					if (rc != 0) {
8928 						pr_err("error %d\n", rc);
8929 						goto rw_error;
8930 					}
8931 					/* flip spectrum */
8932 					ext_attr->mirror = DRX_MIRROR_YES;
8933 					rc = qam_flip_spec(demod, channel);
8934 					if (rc != 0) {
8935 						pr_err("error %d\n", rc);
8936 						goto rw_error;
8937 					}
8938 					lck_state = SPEC_MIRRORED;
8939 					/* reset timer TODO: still need 500ms? */
8940 					start_time = d_locked_time =
8941 					    jiffies_to_msecs(jiffies);
8942 					timeout_ofs = 0;
8943 				} else {	/* no need to wait lock */
8944 
8945 					start_time =
8946 					    jiffies_to_msecs(jiffies) -
8947 					    DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8948 				}
8949 			}
8950 			break;
8951 		case SPEC_MIRRORED:
8952 			if ((*lock_status == DRXJ_DEMOD_LOCK) &&	/* still demod_lock in 150ms */
8953 			    ((jiffies_to_msecs(jiffies) - d_locked_time) >
8954 			     DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8955 				rc = ctrl_get_qam_sig_quality(demod);
8956 				if (rc != 0) {
8957 					pr_err("error %d\n", rc);
8958 					goto rw_error;
8959 				}
8960 				if (p->cnr.stat[0].svalue > 20800) {
8961 					rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8962 					if (rc != 0) {
8963 						pr_err("error %d\n", rc);
8964 						goto rw_error;
8965 					}
8966 					rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8967 					if (rc != 0) {
8968 						pr_err("error %d\n", rc);
8969 						goto rw_error;
8970 					}
8971 					/* no need to wait lock */
8972 					start_time =
8973 					    jiffies_to_msecs(jiffies) -
8974 					    DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8975 				}
8976 			}
8977 			break;
8978 		default:
8979 			break;
8980 		}
8981 		msleep(10);
8982 	} while
8983 	    ((*lock_status != DRX_LOCKED) &&
8984 	     (*lock_status != DRX_NEVER_LOCK) &&
8985 	     ((jiffies_to_msecs(jiffies) - start_time) <
8986 	      (DRXJ_QAM_MAX_WAITTIME + timeout_ofs))
8987 	    );
8988 	/* Returning control to apllication ... */
8989 
8990 	return 0;
8991 rw_error:
8992 	return rc;
8993 }
8994 
8995 /**
8996 * \fn int qam256auto ()
8997 * \brief auto do sync pattern switching and mirroring.
8998 * \param demod:   instance of demod.
8999 * \param channel: pointer to channel data.
9000 * \param tuner_freq_offset: tuner frequency offset.
9001 * \param lock_status: pointer to lock status.
9002 * \return int.
9003 */
9004 static int
9005 qam256auto(struct drx_demod_instance *demod,
9006 	   struct drx_channel *channel,
9007 	   s32 tuner_freq_offset, enum drx_lock_status *lock_status)
9008 {
9009 	struct drxj_data *ext_attr = demod->my_ext_attr;
9010 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9011 	struct drx39xxj_state *state = dev_addr->user_data;
9012 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9013 	int rc;
9014 	u32 lck_state = NO_LOCK;
9015 	u32 start_time = 0;
9016 	u32 d_locked_time = 0;
9017 	u32 timeout_ofs = DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
9018 
9019 	/* external attributes for storing acquired channel constellation */
9020 	*lock_status = DRX_NOT_LOCKED;
9021 	start_time = jiffies_to_msecs(jiffies);
9022 	lck_state = NO_LOCK;
9023 	do {
9024 		rc = ctrl_lock_status(demod, lock_status);
9025 		if (rc != 0) {
9026 			pr_err("error %d\n", rc);
9027 			goto rw_error;
9028 		}
9029 		switch (lck_state) {
9030 		case NO_LOCK:
9031 			if (*lock_status == DRXJ_DEMOD_LOCK) {
9032 				rc = ctrl_get_qam_sig_quality(demod);
9033 				if (rc != 0) {
9034 					pr_err("error %d\n", rc);
9035 					goto rw_error;
9036 				}
9037 				if (p->cnr.stat[0].svalue > 26800) {
9038 					lck_state = DEMOD_LOCKED;
9039 					timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;	/* see something, wait longer */
9040 					d_locked_time = jiffies_to_msecs(jiffies);
9041 				}
9042 			}
9043 			break;
9044 		case DEMOD_LOCKED:
9045 			if (*lock_status == DRXJ_DEMOD_LOCK) {
9046 				if ((channel->mirror == DRX_MIRROR_AUTO) &&
9047 				    ((jiffies_to_msecs(jiffies) - d_locked_time) >
9048 				     DRXJ_QAM_FEC_LOCK_WAITTIME)) {
9049 					ext_attr->mirror = DRX_MIRROR_YES;
9050 					rc = qam_flip_spec(demod, channel);
9051 					if (rc != 0) {
9052 						pr_err("error %d\n", rc);
9053 						goto rw_error;
9054 					}
9055 					lck_state = SPEC_MIRRORED;
9056 					/* reset timer TODO: still need 300ms? */
9057 					start_time = jiffies_to_msecs(jiffies);
9058 					timeout_ofs = -DRXJ_QAM_MAX_WAITTIME / 2;
9059 				}
9060 			}
9061 			break;
9062 		case SPEC_MIRRORED:
9063 			break;
9064 		default:
9065 			break;
9066 		}
9067 		msleep(10);
9068 	} while
9069 	    ((*lock_status < DRX_LOCKED) &&
9070 	     (*lock_status != DRX_NEVER_LOCK) &&
9071 	     ((jiffies_to_msecs(jiffies) - start_time) <
9072 	      (DRXJ_QAM_MAX_WAITTIME + timeout_ofs)));
9073 
9074 	return 0;
9075 rw_error:
9076 	return rc;
9077 }
9078 
9079 /**
9080 * \fn int set_qam_channel ()
9081 * \brief Set QAM channel according to the requested constellation.
9082 * \param demod:   instance of demod.
9083 * \param channel: pointer to channel data.
9084 * \return int.
9085 */
9086 static int
9087 set_qam_channel(struct drx_demod_instance *demod,
9088 	       struct drx_channel *channel, s32 tuner_freq_offset)
9089 {
9090 	struct drxj_data *ext_attr = NULL;
9091 	int rc;
9092 	enum drx_lock_status lock_status = DRX_NOT_LOCKED;
9093 	bool auto_flag = false;
9094 
9095 	/* external attributes for storing acquired channel constellation */
9096 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
9097 
9098 	/* set QAM channel constellation */
9099 	switch (channel->constellation) {
9100 	case DRX_CONSTELLATION_QAM16:
9101 	case DRX_CONSTELLATION_QAM32:
9102 	case DRX_CONSTELLATION_QAM128:
9103 		return -EINVAL;
9104 	case DRX_CONSTELLATION_QAM64:
9105 	case DRX_CONSTELLATION_QAM256:
9106 		if (ext_attr->standard != DRX_STANDARD_ITU_B)
9107 			return -EINVAL;
9108 
9109 		ext_attr->constellation = channel->constellation;
9110 		if (channel->mirror == DRX_MIRROR_AUTO)
9111 			ext_attr->mirror = DRX_MIRROR_NO;
9112 		else
9113 			ext_attr->mirror = channel->mirror;
9114 
9115 		rc = set_qam(demod, channel, tuner_freq_offset, QAM_SET_OP_ALL);
9116 		if (rc != 0) {
9117 			pr_err("error %d\n", rc);
9118 			goto rw_error;
9119 		}
9120 
9121 		if (channel->constellation == DRX_CONSTELLATION_QAM64)
9122 			rc = qam64auto(demod, channel, tuner_freq_offset,
9123 				       &lock_status);
9124 		else
9125 			rc = qam256auto(demod, channel, tuner_freq_offset,
9126 					&lock_status);
9127 		if (rc != 0) {
9128 			pr_err("error %d\n", rc);
9129 			goto rw_error;
9130 		}
9131 		break;
9132 	case DRX_CONSTELLATION_AUTO:	/* for channel scan */
9133 		if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9134 			u16 qam_ctl_ena = 0;
9135 
9136 			auto_flag = true;
9137 
9138 			/* try to lock default QAM constellation: QAM256 */
9139 			channel->constellation = DRX_CONSTELLATION_QAM256;
9140 			ext_attr->constellation = DRX_CONSTELLATION_QAM256;
9141 			if (channel->mirror == DRX_MIRROR_AUTO)
9142 				ext_attr->mirror = DRX_MIRROR_NO;
9143 			else
9144 				ext_attr->mirror = channel->mirror;
9145 			rc = set_qam(demod, channel, tuner_freq_offset,
9146 				     QAM_SET_OP_ALL);
9147 			if (rc != 0) {
9148 				pr_err("error %d\n", rc);
9149 				goto rw_error;
9150 			}
9151 			rc = qam256auto(demod, channel, tuner_freq_offset,
9152 					&lock_status);
9153 			if (rc != 0) {
9154 				pr_err("error %d\n", rc);
9155 				goto rw_error;
9156 			}
9157 
9158 			if (lock_status >= DRX_LOCKED) {
9159 				channel->constellation = DRX_CONSTELLATION_AUTO;
9160 				break;
9161 			}
9162 
9163 			/* QAM254 not locked. Try QAM64 constellation */
9164 			channel->constellation = DRX_CONSTELLATION_QAM64;
9165 			ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9166 			if (channel->mirror == DRX_MIRROR_AUTO)
9167 				ext_attr->mirror = DRX_MIRROR_NO;
9168 			else
9169 				ext_attr->mirror = channel->mirror;
9170 
9171 			rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9172 						     SCU_RAM_QAM_CTL_ENA__A,
9173 						     &qam_ctl_ena, 0);
9174 			if (rc != 0) {
9175 				pr_err("error %d\n", rc);
9176 				goto rw_error;
9177 			}
9178 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9179 						      SCU_RAM_QAM_CTL_ENA__A,
9180 						      qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9181 			if (rc != 0) {
9182 				pr_err("error %d\n", rc);
9183 				goto rw_error;
9184 			}
9185 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9186 						      SCU_RAM_QAM_FSM_STATE_TGT__A,
9187 						      0x2, 0);
9188 			if (rc != 0) {
9189 				pr_err("error %d\n", rc);
9190 				goto rw_error;
9191 			}	/* force to rate hunting */
9192 
9193 			rc = set_qam(demod, channel, tuner_freq_offset,
9194 				     QAM_SET_OP_CONSTELLATION);
9195 			if (rc != 0) {
9196 				pr_err("error %d\n", rc);
9197 				goto rw_error;
9198 			}
9199 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9200 						      SCU_RAM_QAM_CTL_ENA__A,
9201 						      qam_ctl_ena, 0);
9202 			if (rc != 0) {
9203 				pr_err("error %d\n", rc);
9204 				goto rw_error;
9205 			}
9206 
9207 			rc = qam64auto(demod, channel, tuner_freq_offset,
9208 				       &lock_status);
9209 			if (rc != 0) {
9210 				pr_err("error %d\n", rc);
9211 				goto rw_error;
9212 			}
9213 
9214 			channel->constellation = DRX_CONSTELLATION_AUTO;
9215 		} else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
9216 			u16 qam_ctl_ena = 0;
9217 
9218 			channel->constellation = DRX_CONSTELLATION_QAM64;
9219 			ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9220 			auto_flag = true;
9221 
9222 			if (channel->mirror == DRX_MIRROR_AUTO)
9223 				ext_attr->mirror = DRX_MIRROR_NO;
9224 			else
9225 				ext_attr->mirror = channel->mirror;
9226 			rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9227 						     SCU_RAM_QAM_CTL_ENA__A,
9228 						     &qam_ctl_ena, 0);
9229 			if (rc != 0) {
9230 				pr_err("error %d\n", rc);
9231 				goto rw_error;
9232 			}
9233 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9234 						      SCU_RAM_QAM_CTL_ENA__A,
9235 						      qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9236 			if (rc != 0) {
9237 				pr_err("error %d\n", rc);
9238 				goto rw_error;
9239 			}
9240 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9241 						      SCU_RAM_QAM_FSM_STATE_TGT__A,
9242 						      0x2, 0);
9243 			if (rc != 0) {
9244 				pr_err("error %d\n", rc);
9245 				goto rw_error;
9246 			}	/* force to rate hunting */
9247 
9248 			rc = set_qam(demod, channel, tuner_freq_offset,
9249 				     QAM_SET_OP_CONSTELLATION);
9250 			if (rc != 0) {
9251 				pr_err("error %d\n", rc);
9252 				goto rw_error;
9253 			}
9254 			rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9255 						      SCU_RAM_QAM_CTL_ENA__A,
9256 						      qam_ctl_ena, 0);
9257 			if (rc != 0) {
9258 				pr_err("error %d\n", rc);
9259 				goto rw_error;
9260 			}
9261 			rc = qam64auto(demod, channel, tuner_freq_offset,
9262 				       &lock_status);
9263 			if (rc != 0) {
9264 				pr_err("error %d\n", rc);
9265 				goto rw_error;
9266 			}
9267 			channel->constellation = DRX_CONSTELLATION_AUTO;
9268 		} else {
9269 			return -EINVAL;
9270 		}
9271 		break;
9272 	default:
9273 		return -EINVAL;
9274 	}
9275 
9276 	return 0;
9277 rw_error:
9278 	/* restore starting value */
9279 	if (auto_flag)
9280 		channel->constellation = DRX_CONSTELLATION_AUTO;
9281 	return rc;
9282 }
9283 
9284 /*============================================================================*/
9285 
9286 /**
9287 * \fn static short get_qamrs_err_count(struct i2c_device_addr *dev_addr)
9288 * \brief Get RS error count in QAM mode (used for post RS BER calculation)
9289 * \return Error code
9290 *
9291 * precondition: measurement period & measurement prescale must be set
9292 *
9293 */
9294 static int
9295 get_qamrs_err_count(struct i2c_device_addr *dev_addr,
9296 		    struct drxjrs_errors *rs_errors)
9297 {
9298 	int rc;
9299 	u16 nr_bit_errors = 0,
9300 	    nr_symbol_errors = 0,
9301 	    nr_packet_errors = 0, nr_failures = 0, nr_snc_par_fail_count = 0;
9302 
9303 	/* check arguments */
9304 	if (dev_addr == NULL)
9305 		return -EINVAL;
9306 
9307 	/* all reported errors are received in the  */
9308 	/* most recently finished measurment period */
9309 	/*   no of pre RS bit errors */
9310 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &nr_bit_errors, 0);
9311 	if (rc != 0) {
9312 		pr_err("error %d\n", rc);
9313 		goto rw_error;
9314 	}
9315 	/*   no of symbol errors      */
9316 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_SYMBOL_ERRORS__A, &nr_symbol_errors, 0);
9317 	if (rc != 0) {
9318 		pr_err("error %d\n", rc);
9319 		goto rw_error;
9320 	}
9321 	/*   no of packet errors      */
9322 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_PACKET_ERRORS__A, &nr_packet_errors, 0);
9323 	if (rc != 0) {
9324 		pr_err("error %d\n", rc);
9325 		goto rw_error;
9326 	}
9327 	/*   no of failures to decode */
9328 	rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &nr_failures, 0);
9329 	if (rc != 0) {
9330 		pr_err("error %d\n", rc);
9331 		goto rw_error;
9332 	}
9333 	/*   no of post RS bit erros  */
9334 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_COUNT__A, &nr_snc_par_fail_count, 0);
9335 	if (rc != 0) {
9336 		pr_err("error %d\n", rc);
9337 		goto rw_error;
9338 	}
9339 	/* TODO: NOTE */
9340 	/* These register values are fetched in non-atomic fashion           */
9341 	/* It is possible that the read values contain unrelated information */
9342 
9343 	rs_errors->nr_bit_errors = nr_bit_errors & FEC_RS_NR_BIT_ERRORS__M;
9344 	rs_errors->nr_symbol_errors = nr_symbol_errors & FEC_RS_NR_SYMBOL_ERRORS__M;
9345 	rs_errors->nr_packet_errors = nr_packet_errors & FEC_RS_NR_PACKET_ERRORS__M;
9346 	rs_errors->nr_failures = nr_failures & FEC_RS_NR_FAILURES__M;
9347 	rs_errors->nr_snc_par_fail_count =
9348 	    nr_snc_par_fail_count & FEC_OC_SNC_FAIL_COUNT__M;
9349 
9350 	return 0;
9351 rw_error:
9352 	return rc;
9353 }
9354 
9355 /*============================================================================*/
9356 
9357 /**
9358  * \fn int get_sig_strength()
9359  * \brief Retrieve signal strength for VSB and QAM.
9360  * \param demod Pointer to demod instance
9361  * \param u16-t Pointer to signal strength data; range 0, .. , 100.
9362  * \return int.
9363  * \retval 0 sig_strength contains valid data.
9364  * \retval -EINVAL sig_strength is NULL.
9365  * \retval -EIO Erroneous data, sig_strength contains invalid data.
9366  */
9367 #define DRXJ_AGC_TOP    0x2800
9368 #define DRXJ_AGC_SNS    0x1600
9369 #define DRXJ_RFAGC_MAX  0x3fff
9370 #define DRXJ_RFAGC_MIN  0x800
9371 
9372 static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
9373 {
9374 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9375 	int rc;
9376 	u16 rf_gain = 0;
9377 	u16 if_gain = 0;
9378 	u16 if_agc_sns = 0;
9379 	u16 if_agc_top = 0;
9380 	u16 rf_agc_max = 0;
9381 	u16 rf_agc_min = 0;
9382 
9383 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_IF__A, &if_gain, 0);
9384 	if (rc != 0) {
9385 		pr_err("error %d\n", rc);
9386 		goto rw_error;
9387 	}
9388 	if_gain &= IQM_AF_AGC_IF__M;
9389 	rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_RF__A, &rf_gain, 0);
9390 	if (rc != 0) {
9391 		pr_err("error %d\n", rc);
9392 		goto rw_error;
9393 	}
9394 	rf_gain &= IQM_AF_AGC_RF__M;
9395 
9396 	if_agc_sns = DRXJ_AGC_SNS;
9397 	if_agc_top = DRXJ_AGC_TOP;
9398 	rf_agc_max = DRXJ_RFAGC_MAX;
9399 	rf_agc_min = DRXJ_RFAGC_MIN;
9400 
9401 	if (if_gain > if_agc_top) {
9402 		if (rf_gain > rf_agc_max)
9403 			*sig_strength = 100;
9404 		else if (rf_gain > rf_agc_min) {
9405 			if (rf_agc_max == rf_agc_min) {
9406 				pr_err("error: rf_agc_max == rf_agc_min\n");
9407 				return -EIO;
9408 			}
9409 			*sig_strength =
9410 			75 + 25 * (rf_gain - rf_agc_min) / (rf_agc_max -
9411 								rf_agc_min);
9412 		} else
9413 			*sig_strength = 75;
9414 	} else if (if_gain > if_agc_sns) {
9415 		if (if_agc_top == if_agc_sns) {
9416 			pr_err("error: if_agc_top == if_agc_sns\n");
9417 			return -EIO;
9418 		}
9419 		*sig_strength =
9420 		20 + 55 * (if_gain - if_agc_sns) / (if_agc_top - if_agc_sns);
9421 	} else {
9422 		if (!if_agc_sns) {
9423 			pr_err("error: if_agc_sns is zero!\n");
9424 			return -EIO;
9425 		}
9426 		*sig_strength = (20 * if_gain / if_agc_sns);
9427 	}
9428 
9429 	if (*sig_strength <= 7)
9430 		*sig_strength = 0;
9431 
9432 	return 0;
9433 rw_error:
9434 	return rc;
9435 }
9436 
9437 /**
9438 * \fn int ctrl_get_qam_sig_quality()
9439 * \brief Retrieve QAM signal quality from device.
9440 * \param devmod Pointer to demodulator instance.
9441 * \param sig_quality Pointer to signal quality data.
9442 * \return int.
9443 * \retval 0 sig_quality contains valid data.
9444 * \retval -EINVAL sig_quality is NULL.
9445 * \retval -EIO Erroneous data, sig_quality contains invalid data.
9446 
9447 *  Pre-condition: Device must be started and in lock.
9448 */
9449 static int
9450 ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
9451 {
9452 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9453 	struct drxj_data *ext_attr = demod->my_ext_attr;
9454 	struct drx39xxj_state *state = dev_addr->user_data;
9455 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9456 	struct drxjrs_errors measuredrs_errors = { 0, 0, 0, 0, 0 };
9457 	enum drx_modulation constellation = ext_attr->constellation;
9458 	int rc;
9459 
9460 	u32 pre_bit_err_rs = 0;	/* pre RedSolomon Bit Error Rate */
9461 	u32 post_bit_err_rs = 0;	/* post RedSolomon Bit Error Rate */
9462 	u32 pkt_errs = 0;	/* no of packet errors in RS */
9463 	u16 qam_sl_err_power = 0;	/* accumulated error between raw and sliced symbols */
9464 	u16 qsym_err_vd = 0;	/* quadrature symbol errors in QAM_VD */
9465 	u16 fec_oc_period = 0;	/* SNC sync failure measurement period */
9466 	u16 fec_rs_prescale = 0;	/* ReedSolomon Measurement Prescale */
9467 	u16 fec_rs_period = 0;	/* Value for corresponding I2C register */
9468 	/* calculation constants */
9469 	u32 rs_bit_cnt = 0;	/* RedSolomon Bit Count */
9470 	u32 qam_sl_sig_power = 0;	/* used for MER, depends of QAM constellation */
9471 	/* intermediate results */
9472 	u32 e = 0;		/* exponent value used for QAM BER/SER */
9473 	u32 m = 0;		/* mantisa value used for QAM BER/SER */
9474 	u32 ber_cnt = 0;	/* BER count */
9475 	/* signal quality info */
9476 	u32 qam_sl_mer = 0;	/* QAM MER */
9477 	u32 qam_pre_rs_ber = 0;	/* Pre RedSolomon BER */
9478 	u32 qam_post_rs_ber = 0;	/* Post RedSolomon BER */
9479 	u32 qam_vd_ser = 0;	/* ViterbiDecoder SER */
9480 	u16 qam_vd_prescale = 0;	/* Viterbi Measurement Prescale */
9481 	u16 qam_vd_period = 0;	/* Viterbi Measurement period */
9482 	u32 vd_bit_cnt = 0;	/* ViterbiDecoder Bit Count */
9483 
9484 	p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9485 
9486 	/* read the physical registers */
9487 	/*   Get the RS error data */
9488 	rc = get_qamrs_err_count(dev_addr, &measuredrs_errors);
9489 	if (rc != 0) {
9490 		pr_err("error %d\n", rc);
9491 		goto rw_error;
9492 	}
9493 	/* get the register value needed for MER */
9494 	rc = drxj_dap_read_reg16(dev_addr, QAM_SL_ERR_POWER__A, &qam_sl_err_power, 0);
9495 	if (rc != 0) {
9496 		pr_err("error %d\n", rc);
9497 		goto rw_error;
9498 	}
9499 	/* get the register value needed for post RS BER */
9500 	rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, &fec_oc_period, 0);
9501 	if (rc != 0) {
9502 		pr_err("error %d\n", rc);
9503 		goto rw_error;
9504 	}
9505 
9506 	/* get constants needed for signal quality calculation */
9507 	fec_rs_period = ext_attr->fec_rs_period;
9508 	fec_rs_prescale = ext_attr->fec_rs_prescale;
9509 	rs_bit_cnt = fec_rs_period * fec_rs_prescale * ext_attr->fec_rs_plen;
9510 	qam_vd_period = ext_attr->qam_vd_period;
9511 	qam_vd_prescale = ext_attr->qam_vd_prescale;
9512 	vd_bit_cnt = qam_vd_period * qam_vd_prescale * ext_attr->fec_vd_plen;
9513 
9514 	/* DRXJ_QAM_SL_SIG_POWER_QAMxxx  * 4     */
9515 	switch (constellation) {
9516 	case DRX_CONSTELLATION_QAM16:
9517 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM16 << 2;
9518 		break;
9519 	case DRX_CONSTELLATION_QAM32:
9520 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM32 << 2;
9521 		break;
9522 	case DRX_CONSTELLATION_QAM64:
9523 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM64 << 2;
9524 		break;
9525 	case DRX_CONSTELLATION_QAM128:
9526 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM128 << 2;
9527 		break;
9528 	case DRX_CONSTELLATION_QAM256:
9529 		qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM256 << 2;
9530 		break;
9531 	default:
9532 		return -EIO;
9533 	}
9534 
9535 	/* ------------------------------ */
9536 	/* MER Calculation                */
9537 	/* ------------------------------ */
9538 	/* MER is good if it is above 27.5 for QAM256 or 21.5 for QAM64 */
9539 
9540 	/* 10.0*log10(qam_sl_sig_power * 4.0 / qam_sl_err_power); */
9541 	if (qam_sl_err_power == 0)
9542 		qam_sl_mer = 0;
9543 	else
9544 		qam_sl_mer = log1_times100(qam_sl_sig_power) - log1_times100((u32)qam_sl_err_power);
9545 
9546 	/* ----------------------------------------- */
9547 	/* Pre Viterbi Symbol Error Rate Calculation */
9548 	/* ----------------------------------------- */
9549 	/* pre viterbi SER is good if it is below 0.025 */
9550 
9551 	/* get the register value */
9552 	/*   no of quadrature symbol errors */
9553 	rc = drxj_dap_read_reg16(dev_addr, QAM_VD_NR_QSYM_ERRORS__A, &qsym_err_vd, 0);
9554 	if (rc != 0) {
9555 		pr_err("error %d\n", rc);
9556 		goto rw_error;
9557 	}
9558 	/* Extract the Exponent and the Mantisa  */
9559 	/* of number of quadrature symbol errors */
9560 	e = (qsym_err_vd & QAM_VD_NR_QSYM_ERRORS_EXP__M) >>
9561 	    QAM_VD_NR_QSYM_ERRORS_EXP__B;
9562 	m = (qsym_err_vd & QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__M) >>
9563 	    QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B;
9564 
9565 	if ((m << e) >> 3 > 549752)
9566 		qam_vd_ser = 500000 * vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9567 	else
9568 		qam_vd_ser = m << ((e > 2) ? (e - 3) : e);
9569 
9570 	/* --------------------------------------- */
9571 	/* pre and post RedSolomon BER Calculation */
9572 	/* --------------------------------------- */
9573 	/* pre RS BER is good if it is below 3.5e-4 */
9574 
9575 	/* get the register values */
9576 	pre_bit_err_rs = (u32) measuredrs_errors.nr_bit_errors;
9577 	pkt_errs = post_bit_err_rs = (u32) measuredrs_errors.nr_snc_par_fail_count;
9578 
9579 	/* Extract the Exponent and the Mantisa of the */
9580 	/* pre Reed-Solomon bit error count            */
9581 	e = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_EXP__M) >>
9582 	    FEC_RS_NR_BIT_ERRORS_EXP__B;
9583 	m = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M) >>
9584 	    FEC_RS_NR_BIT_ERRORS_FIXED_MANT__B;
9585 
9586 	ber_cnt = m << e;
9587 
9588 	/*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */
9589 	if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0)
9590 		qam_pre_rs_ber = 500000 * rs_bit_cnt >> e;
9591 	else
9592 		qam_pre_rs_ber = ber_cnt;
9593 
9594 	/* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) /  */
9595 	/*               (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A)  */
9596 	/*
9597 	   => c = (1000000*100*11.17)/1504 =
9598 	   post RS BER = (( c* FEC_OC_SNC_FAIL_COUNT__A) /
9599 	   (100 * FEC_OC_SNC_FAIL_PERIOD__A)
9600 	   *100 and /100 is for more precision.
9601 	   => (20 bits * 12 bits) /(16 bits * 7 bits)  => safe in 32 bits computation
9602 
9603 	   Precision errors still possible.
9604 	 */
9605 	if (!fec_oc_period) {
9606 		qam_post_rs_ber = 0xFFFFFFFF;
9607 	} else {
9608 		e = post_bit_err_rs * 742686;
9609 		m = fec_oc_period * 100;
9610 		qam_post_rs_ber = e / m;
9611 	}
9612 
9613 	/* fill signal quality data structure */
9614 	p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9615 	p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9616 	p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9617 	p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9618 	p->block_error.stat[0].scale = FE_SCALE_COUNTER;
9619 	p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
9620 
9621 	p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100;
9622 	if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9623 		p->pre_bit_error.stat[0].uvalue += qam_vd_ser;
9624 		p->pre_bit_count.stat[0].uvalue += vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9625 	} else {
9626 		p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber;
9627 		p->pre_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9628 	}
9629 
9630 	p->post_bit_error.stat[0].uvalue += qam_post_rs_ber;
9631 	p->post_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9632 
9633 	p->block_error.stat[0].uvalue += pkt_errs;
9634 
9635 #ifdef DRXJ_SIGNAL_ACCUM_ERR
9636 	rc = get_acc_pkt_err(demod, &sig_quality->packet_error);
9637 	if (rc != 0) {
9638 		pr_err("error %d\n", rc);
9639 		goto rw_error;
9640 	}
9641 #endif
9642 
9643 	return 0;
9644 rw_error:
9645 	p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9646 	p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9647 	p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9648 	p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9649 	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9650 	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9651 
9652 	return rc;
9653 }
9654 
9655 #endif /* #ifndef DRXJ_VSB_ONLY */
9656 
9657 /*============================================================================*/
9658 /*==                     END QAM DATAPATH FUNCTIONS                         ==*/
9659 /*============================================================================*/
9660 
9661 /*============================================================================*/
9662 /*============================================================================*/
9663 /*==                       ATV DATAPATH FUNCTIONS                           ==*/
9664 /*============================================================================*/
9665 /*============================================================================*/
9666 
9667 /*
9668    Implementation notes.
9669 
9670    NTSC/FM AGCs
9671 
9672       Four AGCs are used for NTSC:
9673       (1) RF (used to attenuate the input signal in case of to much power)
9674       (2) IF (used to attenuate the input signal in case of to much power)
9675       (3) Video AGC (used to amplify the output signal in case input to low)
9676       (4) SIF AGC (used to amplify the output signal in case input to low)
9677 
9678       Video AGC is coupled to RF and IF. SIF AGC is not coupled. It is assumed
9679       that the coupling between Video AGC and the RF and IF AGCs also works in
9680       favor of the SIF AGC.
9681 
9682       Three AGCs are used for FM:
9683       (1) RF (used to attenuate the input signal in case of to much power)
9684       (2) IF (used to attenuate the input signal in case of to much power)
9685       (3) SIF AGC (used to amplify the output signal in case input to low)
9686 
9687       The SIF AGC is now coupled to the RF/IF AGCs.
9688       The SIF AGC is needed for both SIF ouput and the internal SIF signal to
9689       the AUD block.
9690 
9691       RF and IF AGCs DACs are part of AFE, Video and SIF AGC DACs are part of
9692       the ATV block. The AGC control algorithms are all implemented in
9693       microcode.
9694 
9695    ATV SETTINGS
9696 
9697       (Shadow settings will not be used for now, they will be implemented
9698        later on because of the schedule)
9699 
9700       Several HW/SCU "settings" can be used for ATV. The standard selection
9701       will reset most of these settings. To avoid that the end user apllication
9702       has to perform these settings each time the ATV or FM standards is
9703       selected the driver will shadow these settings. This enables the end user
9704       to perform the settings only once after a drx_open(). The driver must
9705       write the shadow settings to HW/SCU incase:
9706 	 ( setstandard FM/ATV) ||
9707 	 ( settings have changed && FM/ATV standard is active)
9708       The shadow settings will be stored in the device specific data container.
9709       A set of flags will be defined to flag changes in shadow settings.
9710       A routine will be implemented to write all changed shadow settings to
9711       HW/SCU.
9712 
9713       The "settings" will consist of: AGC settings, filter settings etc.
9714 
9715       Disadvantage of use of shadow settings:
9716       Direct changes in HW/SCU registers will not be reflected in the
9717       shadow settings and these changes will be overwritten during a next
9718       update. This can happen during evaluation. This will not be a problem
9719       for normal customer usage.
9720 */
9721 /* -------------------------------------------------------------------------- */
9722 
9723 /**
9724 * \fn int power_down_atv ()
9725 * \brief Power down ATV.
9726 * \param demod instance of demodulator
9727 * \param standard either NTSC or FM (sub strandard for ATV )
9728 * \return int.
9729 *
9730 *  Stops and thus resets ATV and IQM block
9731 *  SIF and CVBS ADC are powered down
9732 *  Calls audio power down
9733 */
9734 static int
9735 power_down_atv(struct drx_demod_instance *demod, enum drx_standard standard, bool primary)
9736 {
9737 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9738 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
9739 		/* parameter_len */ 0,
9740 		/* result_len    */ 0,
9741 		/* *parameter   */ NULL,
9742 		/* *result      */ NULL
9743 	};
9744 	int rc;
9745 	u16 cmd_result = 0;
9746 
9747 	/* ATV NTSC */
9748 
9749 	/* Stop ATV SCU (will reset ATV and IQM hardware */
9750 	cmd_scu.command = SCU_RAM_COMMAND_STANDARD_ATV |
9751 	    SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9752 	cmd_scu.parameter_len = 0;
9753 	cmd_scu.result_len = 1;
9754 	cmd_scu.parameter = NULL;
9755 	cmd_scu.result = &cmd_result;
9756 	rc = scu_command(dev_addr, &cmd_scu);
9757 	if (rc != 0) {
9758 		pr_err("error %d\n", rc);
9759 		goto rw_error;
9760 	}
9761 	/* Disable ATV outputs (ATV reset enables CVBS, undo this) */
9762 	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);
9763 	if (rc != 0) {
9764 		pr_err("error %d\n", rc);
9765 		goto rw_error;
9766 	}
9767 
9768 	rc = drxj_dap_write_reg16(dev_addr, ATV_COMM_EXEC__A, ATV_COMM_EXEC_STOP, 0);
9769 	if (rc != 0) {
9770 		pr_err("error %d\n", rc);
9771 		goto rw_error;
9772 	}
9773 	if (primary) {
9774 		rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
9775 		if (rc != 0) {
9776 			pr_err("error %d\n", rc);
9777 			goto rw_error;
9778 		}
9779 		rc = set_iqm_af(demod, false);
9780 		if (rc != 0) {
9781 			pr_err("error %d\n", rc);
9782 			goto rw_error;
9783 		}
9784 	} else {
9785 		rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
9786 		if (rc != 0) {
9787 			pr_err("error %d\n", rc);
9788 			goto rw_error;
9789 		}
9790 		rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
9791 		if (rc != 0) {
9792 			pr_err("error %d\n", rc);
9793 			goto rw_error;
9794 		}
9795 		rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
9796 		if (rc != 0) {
9797 			pr_err("error %d\n", rc);
9798 			goto rw_error;
9799 		}
9800 		rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
9801 		if (rc != 0) {
9802 			pr_err("error %d\n", rc);
9803 			goto rw_error;
9804 		}
9805 		rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
9806 		if (rc != 0) {
9807 			pr_err("error %d\n", rc);
9808 			goto rw_error;
9809 		}
9810 	}
9811 	rc = power_down_aud(demod);
9812 	if (rc != 0) {
9813 		pr_err("error %d\n", rc);
9814 		goto rw_error;
9815 	}
9816 
9817 	return 0;
9818 rw_error:
9819 	return rc;
9820 }
9821 
9822 /*============================================================================*/
9823 
9824 /**
9825 * \brief Power up AUD.
9826 * \param demod instance of demodulator
9827 * \return int.
9828 *
9829 */
9830 static int power_down_aud(struct drx_demod_instance *demod)
9831 {
9832 	struct i2c_device_addr *dev_addr = NULL;
9833 	struct drxj_data *ext_attr = NULL;
9834 	int rc;
9835 
9836 	dev_addr = (struct i2c_device_addr *)demod->my_i2c_dev_addr;
9837 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
9838 
9839 	rc = drxj_dap_write_reg16(dev_addr, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP, 0);
9840 	if (rc != 0) {
9841 		pr_err("error %d\n", rc);
9842 		goto rw_error;
9843 	}
9844 
9845 	ext_attr->aud_data.audio_is_active = false;
9846 
9847 	return 0;
9848 rw_error:
9849 	return rc;
9850 }
9851 
9852 /**
9853 * \fn int set_orx_nsu_aox()
9854 * \brief Configure OrxNsuAox for OOB
9855 * \param demod instance of demodulator.
9856 * \param active
9857 * \return int.
9858 */
9859 static int set_orx_nsu_aox(struct drx_demod_instance *demod, bool active)
9860 {
9861 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9862 	int rc;
9863 	u16 data = 0;
9864 
9865 	/* Configure NSU_AOX */
9866 	rc = drxj_dap_read_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, &data, 0);
9867 	if (rc != 0) {
9868 		pr_err("error %d\n", rc);
9869 		goto rw_error;
9870 	}
9871 	if (!active)
9872 		data &= ((~ORX_NSU_AOX_STDBY_W_STDBYADC_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYAMP_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYBIAS_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYPLL_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYPD_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_IF_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_RF_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYFLT_A2_ON));
9873 	else
9874 		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);
9875 	rc = drxj_dap_write_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 
9881 	return 0;
9882 rw_error:
9883 	return rc;
9884 }
9885 
9886 /**
9887 * \fn int ctrl_set_oob()
9888 * \brief Set OOB channel to be used.
9889 * \param demod instance of demodulator
9890 * \param oob_param OOB parameters for channel setting.
9891 * \frequency should be in KHz
9892 * \return int.
9893 *
9894 * Accepts  only. Returns error otherwise.
9895 * Demapper value is written after scu_command START
9896 * because START command causes COMM_EXEC transition
9897 * from 0 to 1 which causes all registers to be
9898 * overwritten with initial value
9899 *
9900 */
9901 
9902 /* Nyquist filter impulse response */
9903 #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 */
9904 #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 */
9905 #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) */
9906 
9907 /* Coefficients for the nyquist fitler (total: 27 taps) */
9908 #define NYQFILTERLEN 27
9909 
9910 static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_param)
9911 {
9912 	int rc;
9913 	s32 freq = 0;	/* KHz */
9914 	struct i2c_device_addr *dev_addr = NULL;
9915 	struct drxj_data *ext_attr = NULL;
9916 	u16 i = 0;
9917 	bool mirror_freq_spect_oob = false;
9918 	u16 trk_filter_value = 0;
9919 	struct drxjscu_cmd scu_cmd;
9920 	u16 set_param_parameters[3];
9921 	u16 cmd_result[2] = { 0, 0 };
9922 	s16 nyquist_coeffs[4][(NYQFILTERLEN + 1) / 2] = {
9923 		IMPULSE_COSINE_ALPHA_0_3,	/* Target Mode 0 */
9924 		IMPULSE_COSINE_ALPHA_0_3,	/* Target Mode 1 */
9925 		IMPULSE_COSINE_ALPHA_0_5,	/* Target Mode 2 */
9926 		IMPULSE_COSINE_ALPHA_RO_0_5	/* Target Mode 3 */
9927 	};
9928 	u8 mode_val[4] = { 2, 2, 0, 1 };
9929 	u8 pfi_coeffs[4][6] = {
9930 		{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) */
9931 		{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) */
9932 		{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) */
9933 		{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) */
9934 	};
9935 	u16 mode_index;
9936 
9937 	dev_addr = demod->my_i2c_dev_addr;
9938 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
9939 	mirror_freq_spect_oob = ext_attr->mirror_freq_spect_oob;
9940 
9941 	/* Check parameters */
9942 	if (oob_param == NULL) {
9943 		/* power off oob module  */
9944 		scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
9945 		    | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9946 		scu_cmd.parameter_len = 0;
9947 		scu_cmd.result_len = 1;
9948 		scu_cmd.result = cmd_result;
9949 		rc = scu_command(dev_addr, &scu_cmd);
9950 		if (rc != 0) {
9951 			pr_err("error %d\n", rc);
9952 			goto rw_error;
9953 		}
9954 		rc = set_orx_nsu_aox(demod, false);
9955 		if (rc != 0) {
9956 			pr_err("error %d\n", rc);
9957 			goto rw_error;
9958 		}
9959 		rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
9960 		if (rc != 0) {
9961 			pr_err("error %d\n", rc);
9962 			goto rw_error;
9963 		}
9964 
9965 		ext_attr->oob_power_on = false;
9966 		return 0;
9967 	}
9968 
9969 	freq = oob_param->frequency;
9970 	if ((freq < 70000) || (freq > 130000))
9971 		return -EIO;
9972 	freq = (freq - 50000) / 50;
9973 
9974 	{
9975 		u16 index = 0;
9976 		u16 remainder = 0;
9977 		u16 *trk_filtercfg = ext_attr->oob_trk_filter_cfg;
9978 
9979 		index = (u16) ((freq - 400) / 200);
9980 		remainder = (u16) ((freq - 400) % 200);
9981 		trk_filter_value =
9982 		    trk_filtercfg[index] - (trk_filtercfg[index] -
9983 					   trk_filtercfg[index +
9984 							1]) / 10 * remainder /
9985 		    20;
9986 	}
9987 
9988    /*********/
9989 	/* Stop  */
9990    /*********/
9991 	rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
9992 	if (rc != 0) {
9993 		pr_err("error %d\n", rc);
9994 		goto rw_error;
9995 	}
9996 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
9997 	    | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9998 	scu_cmd.parameter_len = 0;
9999 	scu_cmd.result_len = 1;
10000 	scu_cmd.result = cmd_result;
10001 	rc = scu_command(dev_addr, &scu_cmd);
10002 	if (rc != 0) {
10003 		pr_err("error %d\n", rc);
10004 		goto rw_error;
10005 	}
10006    /*********/
10007 	/* Reset */
10008    /*********/
10009 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10010 	    | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
10011 	scu_cmd.parameter_len = 0;
10012 	scu_cmd.result_len = 1;
10013 	scu_cmd.result = cmd_result;
10014 	rc = scu_command(dev_addr, &scu_cmd);
10015 	if (rc != 0) {
10016 		pr_err("error %d\n", rc);
10017 		goto rw_error;
10018 	}
10019    /***********/
10020 	/* SET_ENV */
10021    /***********/
10022 	/* set frequency, spectrum inversion and data rate */
10023 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10024 	    | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
10025 	scu_cmd.parameter_len = 3;
10026 	/* 1-data rate;2-frequency */
10027 	switch (oob_param->standard) {
10028 	case DRX_OOB_MODE_A:
10029 		if (
10030 			   /* signal is transmitted inverted */
10031 			   ((oob_param->spectrum_inverted == true) &&
10032 			    /* and tuner is not mirroring the signal */
10033 			    (!mirror_freq_spect_oob)) |
10034 			   /* or */
10035 			   /* signal is transmitted noninverted */
10036 			   ((oob_param->spectrum_inverted == false) &&
10037 			    /* and tuner is mirroring the signal */
10038 			    (mirror_freq_spect_oob))
10039 		    )
10040 			set_param_parameters[0] =
10041 			    SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_INVSPEC;
10042 		else
10043 			set_param_parameters[0] =
10044 			    SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_REGSPEC;
10045 		break;
10046 	case DRX_OOB_MODE_B_GRADE_A:
10047 		if (
10048 			   /* signal is transmitted inverted */
10049 			   ((oob_param->spectrum_inverted == true) &&
10050 			    /* and tuner is not mirroring the signal */
10051 			    (!mirror_freq_spect_oob)) |
10052 			   /* or */
10053 			   /* signal is transmitted noninverted */
10054 			   ((oob_param->spectrum_inverted == false) &&
10055 			    /* and tuner is mirroring the signal */
10056 			    (mirror_freq_spect_oob))
10057 		    )
10058 			set_param_parameters[0] =
10059 			    SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_INVSPEC;
10060 		else
10061 			set_param_parameters[0] =
10062 			    SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_REGSPEC;
10063 		break;
10064 	case DRX_OOB_MODE_B_GRADE_B:
10065 	default:
10066 		if (
10067 			   /* signal is transmitted inverted */
10068 			   ((oob_param->spectrum_inverted == true) &&
10069 			    /* and tuner is not mirroring the signal */
10070 			    (!mirror_freq_spect_oob)) |
10071 			   /* or */
10072 			   /* signal is transmitted noninverted */
10073 			   ((oob_param->spectrum_inverted == false) &&
10074 			    /* and tuner is mirroring the signal */
10075 			    (mirror_freq_spect_oob))
10076 		    )
10077 			set_param_parameters[0] =
10078 			    SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_INVSPEC;
10079 		else
10080 			set_param_parameters[0] =
10081 			    SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_REGSPEC;
10082 		break;
10083 	}
10084 	set_param_parameters[1] = (u16) (freq & 0xFFFF);
10085 	set_param_parameters[2] = trk_filter_value;
10086 	scu_cmd.parameter = set_param_parameters;
10087 	scu_cmd.result_len = 1;
10088 	scu_cmd.result = cmd_result;
10089 	mode_index = mode_val[(set_param_parameters[0] & 0xC0) >> 6];
10090 	rc = scu_command(dev_addr, &scu_cmd);
10091 	if (rc != 0) {
10092 		pr_err("error %d\n", rc);
10093 		goto rw_error;
10094 	}
10095 
10096 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
10097 	if (rc != 0) {
10098 		pr_err("error %d\n", rc);
10099 		goto rw_error;
10100 	}	/*  Write magic word to enable pdr reg write  */
10101 	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);
10102 	if (rc != 0) {
10103 		pr_err("error %d\n", rc);
10104 		goto rw_error;
10105 	}
10106 	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);
10107 	if (rc != 0) {
10108 		pr_err("error %d\n", rc);
10109 		goto rw_error;
10110 	}
10111 	rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
10112 	if (rc != 0) {
10113 		pr_err("error %d\n", rc);
10114 		goto rw_error;
10115 	}	/*  Write magic word to disable pdr reg write */
10116 
10117 	rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_COMM_KEY__A, 0, 0);
10118 	if (rc != 0) {
10119 		pr_err("error %d\n", rc);
10120 		goto rw_error;
10121 	}
10122 	rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_LEN_W__A, 16000, 0);
10123 	if (rc != 0) {
10124 		pr_err("error %d\n", rc);
10125 		goto rw_error;
10126 	}
10127 	rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_THR_W__A, 40, 0);
10128 	if (rc != 0) {
10129 		pr_err("error %d\n", rc);
10130 		goto rw_error;
10131 	}
10132 
10133 	/* ddc */
10134 	rc = drxj_dap_write_reg16(dev_addr, ORX_DDC_OFO_SET_W__A, ORX_DDC_OFO_SET_W__PRE, 0);
10135 	if (rc != 0) {
10136 		pr_err("error %d\n", rc);
10137 		goto rw_error;
10138 	}
10139 
10140 	/* nsu */
10141 	rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_LOPOW_W__A, ext_attr->oob_lo_pow, 0);
10142 	if (rc != 0) {
10143 		pr_err("error %d\n", rc);
10144 		goto rw_error;
10145 	}
10146 
10147 	/* initialization for target mode */
10148 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TARGET_MODE__A, SCU_RAM_ORX_TARGET_MODE_2048KBPS_SQRT, 0);
10149 	if (rc != 0) {
10150 		pr_err("error %d\n", rc);
10151 		goto rw_error;
10152 	}
10153 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FREQ_GAIN_CORR__A, SCU_RAM_ORX_FREQ_GAIN_CORR_2048KBPS, 0);
10154 	if (rc != 0) {
10155 		pr_err("error %d\n", rc);
10156 		goto rw_error;
10157 	}
10158 
10159 	/* Reset bits for timing and freq. recovery */
10160 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CPH__A, 0x0001, 0);
10161 	if (rc != 0) {
10162 		pr_err("error %d\n", rc);
10163 		goto rw_error;
10164 	}
10165 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CTI__A, 0x0002, 0);
10166 	if (rc != 0) {
10167 		pr_err("error %d\n", rc);
10168 		goto rw_error;
10169 	}
10170 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRN__A, 0x0004, 0);
10171 	if (rc != 0) {
10172 		pr_err("error %d\n", rc);
10173 		goto rw_error;
10174 	}
10175 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRP__A, 0x0008, 0);
10176 	if (rc != 0) {
10177 		pr_err("error %d\n", rc);
10178 		goto rw_error;
10179 	}
10180 
10181 	/* AGN_LOCK = {2048>>3, -2048, 8, -8, 0, 1}; */
10182 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TH__A, 2048 >> 3, 0);
10183 	if (rc != 0) {
10184 		pr_err("error %d\n", rc);
10185 		goto rw_error;
10186 	}
10187 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TOTH__A, (u16)(-2048), 0);
10188 	if (rc != 0) {
10189 		pr_err("error %d\n", rc);
10190 		goto rw_error;
10191 	}
10192 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_ONLOCK_TTH__A, 8, 0);
10193 	if (rc != 0) {
10194 		pr_err("error %d\n", rc);
10195 		goto rw_error;
10196 	}
10197 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_UNLOCK_TTH__A, (u16)(-8), 0);
10198 	if (rc != 0) {
10199 		pr_err("error %d\n", rc);
10200 		goto rw_error;
10201 	}
10202 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_MASK__A, 1, 0);
10203 	if (rc != 0) {
10204 		pr_err("error %d\n", rc);
10205 		goto rw_error;
10206 	}
10207 
10208 	/* DGN_LOCK = {10, -2048, 8, -8, 0, 1<<1}; */
10209 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TH__A, 10, 0);
10210 	if (rc != 0) {
10211 		pr_err("error %d\n", rc);
10212 		goto rw_error;
10213 	}
10214 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TOTH__A, (u16)(-2048), 0);
10215 	if (rc != 0) {
10216 		pr_err("error %d\n", rc);
10217 		goto rw_error;
10218 	}
10219 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_ONLOCK_TTH__A, 8, 0);
10220 	if (rc != 0) {
10221 		pr_err("error %d\n", rc);
10222 		goto rw_error;
10223 	}
10224 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_UNLOCK_TTH__A, (u16)(-8), 0);
10225 	if (rc != 0) {
10226 		pr_err("error %d\n", rc);
10227 		goto rw_error;
10228 	}
10229 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_MASK__A, 1 << 1, 0);
10230 	if (rc != 0) {
10231 		pr_err("error %d\n", rc);
10232 		goto rw_error;
10233 	}
10234 
10235 	/* FRQ_LOCK = {15,-2048, 8, -8, 0, 1<<2}; */
10236 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TH__A, 17, 0);
10237 	if (rc != 0) {
10238 		pr_err("error %d\n", rc);
10239 		goto rw_error;
10240 	}
10241 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TOTH__A, (u16)(-2048), 0);
10242 	if (rc != 0) {
10243 		pr_err("error %d\n", rc);
10244 		goto rw_error;
10245 	}
10246 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_ONLOCK_TTH__A, 8, 0);
10247 	if (rc != 0) {
10248 		pr_err("error %d\n", rc);
10249 		goto rw_error;
10250 	}
10251 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_UNLOCK_TTH__A, (u16)(-8), 0);
10252 	if (rc != 0) {
10253 		pr_err("error %d\n", rc);
10254 		goto rw_error;
10255 	}
10256 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_MASK__A, 1 << 2, 0);
10257 	if (rc != 0) {
10258 		pr_err("error %d\n", rc);
10259 		goto rw_error;
10260 	}
10261 
10262 	/* PHA_LOCK = {5000, -2048, 8, -8, 0, 1<<3}; */
10263 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TH__A, 3000, 0);
10264 	if (rc != 0) {
10265 		pr_err("error %d\n", rc);
10266 		goto rw_error;
10267 	}
10268 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TOTH__A, (u16)(-2048), 0);
10269 	if (rc != 0) {
10270 		pr_err("error %d\n", rc);
10271 		goto rw_error;
10272 	}
10273 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_ONLOCK_TTH__A, 8, 0);
10274 	if (rc != 0) {
10275 		pr_err("error %d\n", rc);
10276 		goto rw_error;
10277 	}
10278 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_UNLOCK_TTH__A, (u16)(-8), 0);
10279 	if (rc != 0) {
10280 		pr_err("error %d\n", rc);
10281 		goto rw_error;
10282 	}
10283 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_MASK__A, 1 << 3, 0);
10284 	if (rc != 0) {
10285 		pr_err("error %d\n", rc);
10286 		goto rw_error;
10287 	}
10288 
10289 	/* TIM_LOCK = {300,      -2048, 8, -8, 0, 1<<4}; */
10290 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TH__A, 400, 0);
10291 	if (rc != 0) {
10292 		pr_err("error %d\n", rc);
10293 		goto rw_error;
10294 	}
10295 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TOTH__A, (u16)(-2048), 0);
10296 	if (rc != 0) {
10297 		pr_err("error %d\n", rc);
10298 		goto rw_error;
10299 	}
10300 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_ONLOCK_TTH__A, 8, 0);
10301 	if (rc != 0) {
10302 		pr_err("error %d\n", rc);
10303 		goto rw_error;
10304 	}
10305 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_UNLOCK_TTH__A, (u16)(-8), 0);
10306 	if (rc != 0) {
10307 		pr_err("error %d\n", rc);
10308 		goto rw_error;
10309 	}
10310 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_MASK__A, 1 << 4, 0);
10311 	if (rc != 0) {
10312 		pr_err("error %d\n", rc);
10313 		goto rw_error;
10314 	}
10315 
10316 	/* EQU_LOCK = {20,      -2048, 8, -8, 0, 1<<5}; */
10317 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TH__A, 20, 0);
10318 	if (rc != 0) {
10319 		pr_err("error %d\n", rc);
10320 		goto rw_error;
10321 	}
10322 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TOTH__A, (u16)(-2048), 0);
10323 	if (rc != 0) {
10324 		pr_err("error %d\n", rc);
10325 		goto rw_error;
10326 	}
10327 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_ONLOCK_TTH__A, 4, 0);
10328 	if (rc != 0) {
10329 		pr_err("error %d\n", rc);
10330 		goto rw_error;
10331 	}
10332 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_UNLOCK_TTH__A, (u16)(-4), 0);
10333 	if (rc != 0) {
10334 		pr_err("error %d\n", rc);
10335 		goto rw_error;
10336 	}
10337 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_MASK__A, 1 << 5, 0);
10338 	if (rc != 0) {
10339 		pr_err("error %d\n", rc);
10340 		goto rw_error;
10341 	}
10342 
10343 	/* PRE-Filter coefficients (PFI) */
10344 	rc = drxdap_fasi_write_block(dev_addr, ORX_FWP_PFI_A_W__A, sizeof(pfi_coeffs[mode_index]), ((u8 *)pfi_coeffs[mode_index]), 0);
10345 	if (rc != 0) {
10346 		pr_err("error %d\n", rc);
10347 		goto rw_error;
10348 	}
10349 	rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_MDE_W__A, mode_index, 0);
10350 	if (rc != 0) {
10351 		pr_err("error %d\n", rc);
10352 		goto rw_error;
10353 	}
10354 
10355 	/* NYQUIST-Filter coefficients (NYQ) */
10356 	for (i = 0; i < (NYQFILTERLEN + 1) / 2; i++) {
10357 		rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, i, 0);
10358 		if (rc != 0) {
10359 			pr_err("error %d\n", rc);
10360 			goto rw_error;
10361 		}
10362 		rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_COF_RW__A, nyquist_coeffs[mode_index][i], 0);
10363 		if (rc != 0) {
10364 			pr_err("error %d\n", rc);
10365 			goto rw_error;
10366 		}
10367 	}
10368 	rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, 31, 0);
10369 	if (rc != 0) {
10370 		pr_err("error %d\n", rc);
10371 		goto rw_error;
10372 	}
10373 	rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_ACTIVE, 0);
10374 	if (rc != 0) {
10375 		pr_err("error %d\n", rc);
10376 		goto rw_error;
10377 	}
10378 	/*********/
10379 	/* Start */
10380 	/*********/
10381 	scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10382 	    | SCU_RAM_COMMAND_CMD_DEMOD_START;
10383 	scu_cmd.parameter_len = 0;
10384 	scu_cmd.result_len = 1;
10385 	scu_cmd.result = cmd_result;
10386 	rc = scu_command(dev_addr, &scu_cmd);
10387 	if (rc != 0) {
10388 		pr_err("error %d\n", rc);
10389 		goto rw_error;
10390 	}
10391 
10392 	rc = set_orx_nsu_aox(demod, true);
10393 	if (rc != 0) {
10394 		pr_err("error %d\n", rc);
10395 		goto rw_error;
10396 	}
10397 	rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STHR_W__A, ext_attr->oob_pre_saw, 0);
10398 	if (rc != 0) {
10399 		pr_err("error %d\n", rc);
10400 		goto rw_error;
10401 	}
10402 
10403 	ext_attr->oob_power_on = true;
10404 
10405 	return 0;
10406 rw_error:
10407 	return rc;
10408 }
10409 
10410 /*============================================================================*/
10411 /*==                     END OOB DATAPATH FUNCTIONS                         ==*/
10412 /*============================================================================*/
10413 
10414 /*=============================================================================
10415   ===== MC command related functions ==========================================
10416   ===========================================================================*/
10417 
10418 /*=============================================================================
10419   ===== ctrl_set_channel() ==========================================================
10420   ===========================================================================*/
10421 /**
10422 * \fn int ctrl_set_channel()
10423 * \brief Select a new transmission channel.
10424 * \param demod instance of demod.
10425 * \param channel Pointer to channel data.
10426 * \return int.
10427 *
10428 * In case the tuner module is not used and in case of NTSC/FM the pogrammer
10429 * must tune the tuner to the centre frequency of the NTSC/FM channel.
10430 *
10431 */
10432 static int
10433 ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel)
10434 {
10435 	int rc;
10436 	s32 tuner_freq_offset = 0;
10437 	struct drxj_data *ext_attr = NULL;
10438 	struct i2c_device_addr *dev_addr = NULL;
10439 	enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10440 #ifndef DRXJ_VSB_ONLY
10441 	u32 min_symbol_rate = 0;
10442 	u32 max_symbol_rate = 0;
10443 	int bandwidth_temp = 0;
10444 	int bandwidth = 0;
10445 #endif
10446    /*== check arguments ======================================================*/
10447 	if ((demod == NULL) || (channel == NULL))
10448 		return -EINVAL;
10449 
10450 	dev_addr = demod->my_i2c_dev_addr;
10451 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
10452 	standard = ext_attr->standard;
10453 
10454 	/* check valid standards */
10455 	switch (standard) {
10456 	case DRX_STANDARD_8VSB:
10457 #ifndef DRXJ_VSB_ONLY
10458 	case DRX_STANDARD_ITU_A:
10459 	case DRX_STANDARD_ITU_B:
10460 	case DRX_STANDARD_ITU_C:
10461 #endif /* DRXJ_VSB_ONLY */
10462 		break;
10463 	case DRX_STANDARD_UNKNOWN:
10464 	default:
10465 		return -EINVAL;
10466 	}
10467 
10468 	/* check bandwidth QAM annex B, NTSC and 8VSB */
10469 	if ((standard == DRX_STANDARD_ITU_B) ||
10470 	    (standard == DRX_STANDARD_8VSB) ||
10471 	    (standard == DRX_STANDARD_NTSC)) {
10472 		switch (channel->bandwidth) {
10473 		case DRX_BANDWIDTH_6MHZ:
10474 		case DRX_BANDWIDTH_UNKNOWN:	/* fall through */
10475 			channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10476 			break;
10477 		case DRX_BANDWIDTH_8MHZ:	/* fall through */
10478 		case DRX_BANDWIDTH_7MHZ:	/* fall through */
10479 		default:
10480 			return -EINVAL;
10481 		}
10482 	}
10483 
10484 	/* For QAM annex A and annex C:
10485 	   -check symbolrate and constellation
10486 	   -derive bandwidth from symbolrate (input bandwidth is ignored)
10487 	 */
10488 #ifndef DRXJ_VSB_ONLY
10489 	if ((standard == DRX_STANDARD_ITU_A) ||
10490 	    (standard == DRX_STANDARD_ITU_C)) {
10491 		struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SAW };
10492 		int bw_rolloff_factor = 0;
10493 
10494 		bw_rolloff_factor = (standard == DRX_STANDARD_ITU_A) ? 115 : 113;
10495 		min_symbol_rate = DRXJ_QAM_SYMBOLRATE_MIN;
10496 		max_symbol_rate = DRXJ_QAM_SYMBOLRATE_MAX;
10497 		/* config SMA_TX pin to SAW switch mode */
10498 		rc = ctrl_set_uio_cfg(demod, &uio_cfg);
10499 		if (rc != 0) {
10500 			pr_err("error %d\n", rc);
10501 			goto rw_error;
10502 		}
10503 
10504 		if (channel->symbolrate < min_symbol_rate ||
10505 		    channel->symbolrate > max_symbol_rate) {
10506 			return -EINVAL;
10507 		}
10508 
10509 		switch (channel->constellation) {
10510 		case DRX_CONSTELLATION_QAM16:	/* fall through */
10511 		case DRX_CONSTELLATION_QAM32:	/* fall through */
10512 		case DRX_CONSTELLATION_QAM64:	/* fall through */
10513 		case DRX_CONSTELLATION_QAM128:	/* fall through */
10514 		case DRX_CONSTELLATION_QAM256:
10515 			bandwidth_temp = channel->symbolrate * bw_rolloff_factor;
10516 			bandwidth = bandwidth_temp / 100;
10517 
10518 			if ((bandwidth_temp % 100) >= 50)
10519 				bandwidth++;
10520 
10521 			if (bandwidth <= 6100000) {
10522 				channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10523 			} else if ((bandwidth > 6100000)
10524 				   && (bandwidth <= 7100000)) {
10525 				channel->bandwidth = DRX_BANDWIDTH_7MHZ;
10526 			} else if (bandwidth > 7100000) {
10527 				channel->bandwidth = DRX_BANDWIDTH_8MHZ;
10528 			}
10529 			break;
10530 		default:
10531 			return -EINVAL;
10532 		}
10533 	}
10534 
10535 	/* For QAM annex B:
10536 	   -check constellation
10537 	 */
10538 	if (standard == DRX_STANDARD_ITU_B) {
10539 		switch (channel->constellation) {
10540 		case DRX_CONSTELLATION_AUTO:
10541 		case DRX_CONSTELLATION_QAM256:
10542 		case DRX_CONSTELLATION_QAM64:
10543 			break;
10544 		default:
10545 			return -EINVAL;
10546 		}
10547 
10548 		switch (channel->interleavemode) {
10549 		case DRX_INTERLEAVEMODE_I128_J1:
10550 		case DRX_INTERLEAVEMODE_I128_J1_V2:
10551 		case DRX_INTERLEAVEMODE_I128_J2:
10552 		case DRX_INTERLEAVEMODE_I64_J2:
10553 		case DRX_INTERLEAVEMODE_I128_J3:
10554 		case DRX_INTERLEAVEMODE_I32_J4:
10555 		case DRX_INTERLEAVEMODE_I128_J4:
10556 		case DRX_INTERLEAVEMODE_I16_J8:
10557 		case DRX_INTERLEAVEMODE_I128_J5:
10558 		case DRX_INTERLEAVEMODE_I8_J16:
10559 		case DRX_INTERLEAVEMODE_I128_J6:
10560 		case DRX_INTERLEAVEMODE_I128_J7:
10561 		case DRX_INTERLEAVEMODE_I128_J8:
10562 		case DRX_INTERLEAVEMODE_I12_J17:
10563 		case DRX_INTERLEAVEMODE_I5_J4:
10564 		case DRX_INTERLEAVEMODE_B52_M240:
10565 		case DRX_INTERLEAVEMODE_B52_M720:
10566 		case DRX_INTERLEAVEMODE_UNKNOWN:
10567 		case DRX_INTERLEAVEMODE_AUTO:
10568 			break;
10569 		default:
10570 			return -EINVAL;
10571 		}
10572 	}
10573 
10574 	if ((ext_attr->uio_sma_tx_mode) == DRX_UIO_MODE_FIRMWARE_SAW) {
10575 		/* SAW SW, user UIO is used for switchable SAW */
10576 		struct drxuio_data uio1 = { DRX_UIO1, false };
10577 
10578 		switch (channel->bandwidth) {
10579 		case DRX_BANDWIDTH_8MHZ:
10580 			uio1.value = true;
10581 			break;
10582 		case DRX_BANDWIDTH_7MHZ:
10583 			uio1.value = false;
10584 			break;
10585 		case DRX_BANDWIDTH_6MHZ:
10586 			uio1.value = false;
10587 			break;
10588 		case DRX_BANDWIDTH_UNKNOWN:
10589 		default:
10590 			return -EINVAL;
10591 		}
10592 
10593 		rc = ctrl_uio_write(demod, &uio1);
10594 		if (rc != 0) {
10595 			pr_err("error %d\n", rc);
10596 			goto rw_error;
10597 		}
10598 	}
10599 #endif /* DRXJ_VSB_ONLY */
10600 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
10601 	if (rc != 0) {
10602 		pr_err("error %d\n", rc);
10603 		goto rw_error;
10604 	}
10605 
10606 	tuner_freq_offset = 0;
10607 
10608    /*== Setup demod for specific standard ====================================*/
10609 	switch (standard) {
10610 	case DRX_STANDARD_8VSB:
10611 		if (channel->mirror == DRX_MIRROR_AUTO)
10612 			ext_attr->mirror = DRX_MIRROR_NO;
10613 		else
10614 			ext_attr->mirror = channel->mirror;
10615 		rc = set_vsb(demod);
10616 		if (rc != 0) {
10617 			pr_err("error %d\n", rc);
10618 			goto rw_error;
10619 		}
10620 		rc = set_frequency(demod, channel, tuner_freq_offset);
10621 		if (rc != 0) {
10622 			pr_err("error %d\n", rc);
10623 			goto rw_error;
10624 		}
10625 		break;
10626 #ifndef DRXJ_VSB_ONLY
10627 	case DRX_STANDARD_ITU_A:	/* fallthrough */
10628 	case DRX_STANDARD_ITU_B:	/* fallthrough */
10629 	case DRX_STANDARD_ITU_C:
10630 		rc = set_qam_channel(demod, channel, tuner_freq_offset);
10631 		if (rc != 0) {
10632 			pr_err("error %d\n", rc);
10633 			goto rw_error;
10634 		}
10635 		break;
10636 #endif
10637 	case DRX_STANDARD_UNKNOWN:
10638 	default:
10639 		return -EIO;
10640 	}
10641 
10642 	/* flag the packet error counter reset */
10643 	ext_attr->reset_pkt_err_acc = true;
10644 
10645 	return 0;
10646 rw_error:
10647 	return rc;
10648 }
10649 
10650 /*=============================================================================
10651   ===== SigQuality() ==========================================================
10652   ===========================================================================*/
10653 
10654 /**
10655 * \fn int ctrl_sig_quality()
10656 * \brief Retrieve signal quality form device.
10657 * \param devmod Pointer to demodulator instance.
10658 * \param sig_quality Pointer to signal quality data.
10659 * \return int.
10660 * \retval 0 sig_quality contains valid data.
10661 * \retval -EINVAL sig_quality is NULL.
10662 * \retval -EIO Erroneous data, sig_quality contains invalid data.
10663 
10664 */
10665 static int
10666 ctrl_sig_quality(struct drx_demod_instance *demod,
10667 		 enum drx_lock_status lock_status)
10668 {
10669 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
10670 	struct drxj_data *ext_attr = demod->my_ext_attr;
10671 	struct drx39xxj_state *state = dev_addr->user_data;
10672 	struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
10673 	enum drx_standard standard = ext_attr->standard;
10674 	int rc;
10675 	u32 ber, cnt, err, pkt;
10676 	u16 mer, strength = 0;
10677 
10678 	rc = get_sig_strength(demod, &strength);
10679 	if (rc < 0) {
10680 		pr_err("error getting signal strength %d\n", rc);
10681 		p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10682 	} else {
10683 		p->strength.stat[0].scale = FE_SCALE_RELATIVE;
10684 		p->strength.stat[0].uvalue = 65535UL *  strength/ 100;
10685 	}
10686 
10687 	switch (standard) {
10688 	case DRX_STANDARD_8VSB:
10689 #ifdef DRXJ_SIGNAL_ACCUM_ERR
10690 		rc = get_acc_pkt_err(demod, &pkt);
10691 		if (rc != 0) {
10692 			pr_err("error %d\n", rc);
10693 			goto rw_error;
10694 		}
10695 #endif
10696 		if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) {
10697 			p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10698 			p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10699 			p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10700 			p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10701 			p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10702 			p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10703 			p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10704 		} else {
10705 			rc = get_vsb_post_rs_pck_err(dev_addr, &err, &pkt);
10706 			if (rc != 0) {
10707 				pr_err("error %d getting UCB\n", rc);
10708 				p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10709 			} else {
10710 				p->block_error.stat[0].scale = FE_SCALE_COUNTER;
10711 				p->block_error.stat[0].uvalue += err;
10712 				p->block_count.stat[0].scale = FE_SCALE_COUNTER;
10713 				p->block_count.stat[0].uvalue += pkt;
10714 			}
10715 
10716 			/* PostViterbi is compute in steps of 10^(-6) */
10717 			rc = get_vs_bpre_viterbi_ber(dev_addr, &ber, &cnt);
10718 			if (rc != 0) {
10719 				pr_err("error %d getting pre-ber\n", rc);
10720 				p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10721 			} else {
10722 				p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10723 				p->pre_bit_error.stat[0].uvalue += ber;
10724 				p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10725 				p->pre_bit_count.stat[0].uvalue += cnt;
10726 			}
10727 
10728 			rc = get_vs_bpost_viterbi_ber(dev_addr, &ber, &cnt);
10729 			if (rc != 0) {
10730 				pr_err("error %d getting post-ber\n", rc);
10731 				p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10732 			} else {
10733 				p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10734 				p->post_bit_error.stat[0].uvalue += ber;
10735 				p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10736 				p->post_bit_count.stat[0].uvalue += cnt;
10737 			}
10738 			rc = get_vsbmer(dev_addr, &mer);
10739 			if (rc != 0) {
10740 				pr_err("error %d getting MER\n", rc);
10741 				p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10742 			} else {
10743 				p->cnr.stat[0].svalue = mer * 100;
10744 				p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
10745 			}
10746 		}
10747 		break;
10748 #ifndef DRXJ_VSB_ONLY
10749 	case DRX_STANDARD_ITU_A:
10750 	case DRX_STANDARD_ITU_B:
10751 	case DRX_STANDARD_ITU_C:
10752 		rc = ctrl_get_qam_sig_quality(demod);
10753 		if (rc != 0) {
10754 			pr_err("error %d\n", rc);
10755 			goto rw_error;
10756 		}
10757 		break;
10758 #endif
10759 	default:
10760 		return -EIO;
10761 	}
10762 
10763 	return 0;
10764 rw_error:
10765 	return rc;
10766 }
10767 
10768 /*============================================================================*/
10769 
10770 /**
10771 * \fn int ctrl_lock_status()
10772 * \brief Retrieve lock status .
10773 * \param dev_addr Pointer to demodulator device address.
10774 * \param lock_stat Pointer to lock status structure.
10775 * \return int.
10776 *
10777 */
10778 static int
10779 ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat)
10780 {
10781 	enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10782 	struct drxj_data *ext_attr = NULL;
10783 	struct i2c_device_addr *dev_addr = NULL;
10784 	struct drxjscu_cmd cmd_scu = { /* command      */ 0,
10785 		/* parameter_len */ 0,
10786 		/* result_len    */ 0,
10787 		/* *parameter   */ NULL,
10788 		/* *result      */ NULL
10789 	};
10790 	int rc;
10791 	u16 cmd_result[2] = { 0, 0 };
10792 	u16 demod_lock = SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_DEMOD_LOCKED;
10793 
10794 	/* check arguments */
10795 	if ((demod == NULL) || (lock_stat == NULL))
10796 		return -EINVAL;
10797 
10798 	dev_addr = demod->my_i2c_dev_addr;
10799 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
10800 	standard = ext_attr->standard;
10801 
10802 	*lock_stat = DRX_NOT_LOCKED;
10803 
10804 	/* define the SCU command code */
10805 	switch (standard) {
10806 	case DRX_STANDARD_8VSB:
10807 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
10808 		    SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10809 		demod_lock |= 0x6;
10810 		break;
10811 #ifndef DRXJ_VSB_ONLY
10812 	case DRX_STANDARD_ITU_A:
10813 	case DRX_STANDARD_ITU_B:
10814 	case DRX_STANDARD_ITU_C:
10815 		cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
10816 		    SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10817 		break;
10818 #endif
10819 	case DRX_STANDARD_UNKNOWN:	/* fallthrough */
10820 	default:
10821 		return -EIO;
10822 	}
10823 
10824 	/* define the SCU command parameters and execute the command */
10825 	cmd_scu.parameter_len = 0;
10826 	cmd_scu.result_len = 2;
10827 	cmd_scu.parameter = NULL;
10828 	cmd_scu.result = cmd_result;
10829 	rc = scu_command(dev_addr, &cmd_scu);
10830 	if (rc != 0) {
10831 		pr_err("error %d\n", rc);
10832 		goto rw_error;
10833 	}
10834 
10835 	/* set the lock status */
10836 	if (cmd_scu.result[1] < demod_lock) {
10837 		/* 0x0000 NOT LOCKED */
10838 		*lock_stat = DRX_NOT_LOCKED;
10839 	} else if (cmd_scu.result[1] < SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_LOCKED) {
10840 		*lock_stat = DRXJ_DEMOD_LOCK;
10841 	} else if (cmd_scu.result[1] <
10842 		   SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_NEVER_LOCK) {
10843 		/* 0x8000 DEMOD + FEC LOCKED (system lock) */
10844 		*lock_stat = DRX_LOCKED;
10845 	} else {
10846 		/* 0xC000 NEVER LOCKED */
10847 		/* (system will never be able to lock to the signal) */
10848 		*lock_stat = DRX_NEVER_LOCK;
10849 	}
10850 
10851 	return 0;
10852 rw_error:
10853 	return rc;
10854 }
10855 
10856 /*============================================================================*/
10857 
10858 /**
10859 * \fn int ctrl_set_standard()
10860 * \brief Set modulation standard to be used.
10861 * \param standard Modulation standard.
10862 * \return int.
10863 *
10864 * Setup stuff for the desired demodulation standard.
10865 * Disable and power down the previous selected demodulation standard
10866 *
10867 */
10868 static int
10869 ctrl_set_standard(struct drx_demod_instance *demod, enum drx_standard *standard)
10870 {
10871 	struct drxj_data *ext_attr = NULL;
10872 	int rc;
10873 	enum drx_standard prev_standard;
10874 
10875 	/* check arguments */
10876 	if ((standard == NULL) || (demod == NULL))
10877 		return -EINVAL;
10878 
10879 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
10880 	prev_standard = ext_attr->standard;
10881 
10882 	/*
10883 	   Stop and power down previous standard
10884 	 */
10885 	switch (prev_standard) {
10886 #ifndef DRXJ_VSB_ONLY
10887 	case DRX_STANDARD_ITU_A:	/* fallthrough */
10888 	case DRX_STANDARD_ITU_B:	/* fallthrough */
10889 	case DRX_STANDARD_ITU_C:
10890 		rc = power_down_qam(demod, false);
10891 		if (rc != 0) {
10892 			pr_err("error %d\n", rc);
10893 			goto rw_error;
10894 		}
10895 		break;
10896 #endif
10897 	case DRX_STANDARD_8VSB:
10898 		rc = power_down_vsb(demod, false);
10899 		if (rc != 0) {
10900 			pr_err("error %d\n", rc);
10901 			goto rw_error;
10902 		}
10903 		break;
10904 	case DRX_STANDARD_UNKNOWN:
10905 		/* Do nothing */
10906 		break;
10907 	case DRX_STANDARD_AUTO:	/* fallthrough */
10908 	default:
10909 		return -EINVAL;
10910 	}
10911 
10912 	/*
10913 	   Initialize channel independent registers
10914 	   Power up new standard
10915 	 */
10916 	ext_attr->standard = *standard;
10917 
10918 	switch (*standard) {
10919 #ifndef DRXJ_VSB_ONLY
10920 	case DRX_STANDARD_ITU_A:	/* fallthrough */
10921 	case DRX_STANDARD_ITU_B:	/* fallthrough */
10922 	case DRX_STANDARD_ITU_C:
10923 		do {
10924 			u16 dummy;
10925 			rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SCU_RAM_VERSION_HI__A, &dummy, 0);
10926 			if (rc != 0) {
10927 				pr_err("error %d\n", rc);
10928 				goto rw_error;
10929 			}
10930 		} while (0);
10931 		break;
10932 #endif
10933 	case DRX_STANDARD_8VSB:
10934 		rc = set_vsb_leak_n_gain(demod);
10935 		if (rc != 0) {
10936 			pr_err("error %d\n", rc);
10937 			goto rw_error;
10938 		}
10939 		break;
10940 	default:
10941 		ext_attr->standard = DRX_STANDARD_UNKNOWN;
10942 		return -EINVAL;
10943 		break;
10944 	}
10945 
10946 	return 0;
10947 rw_error:
10948 	/* Don't know what the standard is now ... try again */
10949 	ext_attr->standard = DRX_STANDARD_UNKNOWN;
10950 	return rc;
10951 }
10952 
10953 /*============================================================================*/
10954 
10955 static void drxj_reset_mode(struct drxj_data *ext_attr)
10956 {
10957 	/* Initialize default AFE configuration for QAM */
10958 	if (ext_attr->has_lna) {
10959 		/* IF AGC off, PGA active */
10960 #ifndef DRXJ_VSB_ONLY
10961 		ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10962 		ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10963 		ext_attr->qam_pga_cfg = 140 + (11 * 13);
10964 #endif
10965 		ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10966 		ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10967 		ext_attr->vsb_pga_cfg = 140 + (11 * 13);
10968 	} else {
10969 		/* IF AGC on, PGA not active */
10970 #ifndef DRXJ_VSB_ONLY
10971 		ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10972 		ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10973 		ext_attr->qam_if_agc_cfg.min_output_level = 0;
10974 		ext_attr->qam_if_agc_cfg.max_output_level = 0x7FFF;
10975 		ext_attr->qam_if_agc_cfg.speed = 3;
10976 		ext_attr->qam_if_agc_cfg.top = 1297;
10977 		ext_attr->qam_pga_cfg = 140;
10978 #endif
10979 		ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10980 		ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10981 		ext_attr->vsb_if_agc_cfg.min_output_level = 0;
10982 		ext_attr->vsb_if_agc_cfg.max_output_level = 0x7FFF;
10983 		ext_attr->vsb_if_agc_cfg.speed = 3;
10984 		ext_attr->vsb_if_agc_cfg.top = 1024;
10985 		ext_attr->vsb_pga_cfg = 140;
10986 	}
10987 	/* TODO: remove min_output_level and max_output_level for both QAM and VSB after */
10988 	/* mc has not used them */
10989 #ifndef DRXJ_VSB_ONLY
10990 	ext_attr->qam_rf_agc_cfg.standard = DRX_STANDARD_ITU_B;
10991 	ext_attr->qam_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10992 	ext_attr->qam_rf_agc_cfg.min_output_level = 0;
10993 	ext_attr->qam_rf_agc_cfg.max_output_level = 0x7FFF;
10994 	ext_attr->qam_rf_agc_cfg.speed = 3;
10995 	ext_attr->qam_rf_agc_cfg.top = 9500;
10996 	ext_attr->qam_rf_agc_cfg.cut_off_current = 4000;
10997 	ext_attr->qam_pre_saw_cfg.standard = DRX_STANDARD_ITU_B;
10998 	ext_attr->qam_pre_saw_cfg.reference = 0x07;
10999 	ext_attr->qam_pre_saw_cfg.use_pre_saw = true;
11000 #endif
11001 	/* Initialize default AFE configuration for VSB */
11002 	ext_attr->vsb_rf_agc_cfg.standard = DRX_STANDARD_8VSB;
11003 	ext_attr->vsb_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
11004 	ext_attr->vsb_rf_agc_cfg.min_output_level = 0;
11005 	ext_attr->vsb_rf_agc_cfg.max_output_level = 0x7FFF;
11006 	ext_attr->vsb_rf_agc_cfg.speed = 3;
11007 	ext_attr->vsb_rf_agc_cfg.top = 9500;
11008 	ext_attr->vsb_rf_agc_cfg.cut_off_current = 4000;
11009 	ext_attr->vsb_pre_saw_cfg.standard = DRX_STANDARD_8VSB;
11010 	ext_attr->vsb_pre_saw_cfg.reference = 0x07;
11011 	ext_attr->vsb_pre_saw_cfg.use_pre_saw = true;
11012 }
11013 
11014 /**
11015 * \fn int ctrl_power_mode()
11016 * \brief Set the power mode of the device to the specified power mode
11017 * \param demod Pointer to demodulator instance.
11018 * \param mode  Pointer to new power mode.
11019 * \return int.
11020 * \retval 0          Success
11021 * \retval -EIO       I2C error or other failure
11022 * \retval -EINVAL Invalid mode argument.
11023 *
11024 *
11025 */
11026 static int
11027 ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode)
11028 {
11029 	struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
11030 	struct drxj_data *ext_attr = (struct drxj_data *) NULL;
11031 	struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)NULL;
11032 	int rc;
11033 	u16 sio_cc_pwd_mode = 0;
11034 
11035 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
11036 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
11037 	dev_addr = demod->my_i2c_dev_addr;
11038 
11039 	/* Check arguments */
11040 	if (mode == NULL)
11041 		return -EINVAL;
11042 
11043 	/* If already in requested power mode, do nothing */
11044 	if (common_attr->current_power_mode == *mode)
11045 		return 0;
11046 
11047 	switch (*mode) {
11048 	case DRX_POWER_UP:
11049 	case DRXJ_POWER_DOWN_MAIN_PATH:
11050 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
11051 		break;
11052 	case DRXJ_POWER_DOWN_CORE:
11053 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
11054 		break;
11055 	case DRXJ_POWER_DOWN_PLL:
11056 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
11057 		break;
11058 	case DRX_POWER_DOWN:
11059 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
11060 		break;
11061 	default:
11062 		/* Unknow sleep mode */
11063 		return -EINVAL;
11064 		break;
11065 	}
11066 
11067 	/* Check if device needs to be powered up */
11068 	if ((common_attr->current_power_mode != DRX_POWER_UP)) {
11069 		rc = power_up_device(demod);
11070 		if (rc != 0) {
11071 			pr_err("error %d\n", rc);
11072 			goto rw_error;
11073 		}
11074 	}
11075 
11076 	if ((*mode == DRX_POWER_UP)) {
11077 		/* Restore analog & pin configuration */
11078 
11079 		/* Initialize default AFE configuration for VSB */
11080 		drxj_reset_mode(ext_attr);
11081 	} else {
11082 		/* Power down to requested mode */
11083 		/* Backup some register settings */
11084 		/* Set pins with possible pull-ups connected to them in input mode */
11085 		/* Analog power down */
11086 		/* ADC power down */
11087 		/* Power down device */
11088 		/* stop all comm_exec */
11089 		/*
11090 		   Stop and power down previous standard
11091 		 */
11092 
11093 		switch (ext_attr->standard) {
11094 		case DRX_STANDARD_ITU_A:
11095 		case DRX_STANDARD_ITU_B:
11096 		case DRX_STANDARD_ITU_C:
11097 			rc = power_down_qam(demod, true);
11098 			if (rc != 0) {
11099 				pr_err("error %d\n", rc);
11100 				goto rw_error;
11101 			}
11102 			break;
11103 		case DRX_STANDARD_8VSB:
11104 			rc = power_down_vsb(demod, true);
11105 			if (rc != 0) {
11106 				pr_err("error %d\n", rc);
11107 				goto rw_error;
11108 			}
11109 			break;
11110 		case DRX_STANDARD_PAL_SECAM_BG:	/* fallthrough */
11111 		case DRX_STANDARD_PAL_SECAM_DK:	/* fallthrough */
11112 		case DRX_STANDARD_PAL_SECAM_I:	/* fallthrough */
11113 		case DRX_STANDARD_PAL_SECAM_L:	/* fallthrough */
11114 		case DRX_STANDARD_PAL_SECAM_LP:	/* fallthrough */
11115 		case DRX_STANDARD_NTSC:	/* fallthrough */
11116 		case DRX_STANDARD_FM:
11117 			rc = power_down_atv(demod, ext_attr->standard, true);
11118 			if (rc != 0) {
11119 				pr_err("error %d\n", rc);
11120 				goto rw_error;
11121 			}
11122 			break;
11123 		case DRX_STANDARD_UNKNOWN:
11124 			/* Do nothing */
11125 			break;
11126 		case DRX_STANDARD_AUTO:	/* fallthrough */
11127 		default:
11128 			return -EIO;
11129 		}
11130 		ext_attr->standard = DRX_STANDARD_UNKNOWN;
11131 	}
11132 
11133 	if (*mode != DRXJ_POWER_DOWN_MAIN_PATH) {
11134 		rc = drxj_dap_write_reg16(dev_addr, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode, 0);
11135 		if (rc != 0) {
11136 			pr_err("error %d\n", rc);
11137 			goto rw_error;
11138 		}
11139 		rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11140 		if (rc != 0) {
11141 			pr_err("error %d\n", rc);
11142 			goto rw_error;
11143 		}
11144 
11145 		if ((*mode != DRX_POWER_UP)) {
11146 			/* Initialize HI, wakeup key especially before put IC to sleep */
11147 			rc = init_hi(demod);
11148 			if (rc != 0) {
11149 				pr_err("error %d\n", rc);
11150 				goto rw_error;
11151 			}
11152 
11153 			ext_attr->hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
11154 			rc = hi_cfg_command(demod);
11155 			if (rc != 0) {
11156 				pr_err("error %d\n", rc);
11157 				goto rw_error;
11158 			}
11159 		}
11160 	}
11161 
11162 	common_attr->current_power_mode = *mode;
11163 
11164 	return 0;
11165 rw_error:
11166 	return rc;
11167 }
11168 
11169 /*============================================================================*/
11170 /*== CTRL Set/Get Config related functions ===================================*/
11171 /*============================================================================*/
11172 
11173 /**
11174 * \fn int ctrl_set_cfg_pre_saw()
11175 * \brief Set Pre-saw reference.
11176 * \param demod demod instance
11177 * \param u16 *
11178 * \return int.
11179 *
11180 * Check arguments
11181 * Dispatch handling to standard specific function.
11182 *
11183 */
11184 static int
11185 ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw)
11186 {
11187 	struct i2c_device_addr *dev_addr = NULL;
11188 	struct drxj_data *ext_attr = NULL;
11189 	int rc;
11190 
11191 	dev_addr = demod->my_i2c_dev_addr;
11192 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
11193 
11194 	/* check arguments */
11195 	if ((pre_saw == NULL) || (pre_saw->reference > IQM_AF_PDREF__M)
11196 	    ) {
11197 		return -EINVAL;
11198 	}
11199 
11200 	/* Only if standard is currently active */
11201 	if ((ext_attr->standard == pre_saw->standard) ||
11202 	    (DRXJ_ISQAMSTD(ext_attr->standard) &&
11203 	     DRXJ_ISQAMSTD(pre_saw->standard)) ||
11204 	    (DRXJ_ISATVSTD(ext_attr->standard) &&
11205 	     DRXJ_ISATVSTD(pre_saw->standard))) {
11206 		rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, pre_saw->reference, 0);
11207 		if (rc != 0) {
11208 			pr_err("error %d\n", rc);
11209 			goto rw_error;
11210 		}
11211 	}
11212 
11213 	/* Store pre-saw settings */
11214 	switch (pre_saw->standard) {
11215 	case DRX_STANDARD_8VSB:
11216 		ext_attr->vsb_pre_saw_cfg = *pre_saw;
11217 		break;
11218 #ifndef DRXJ_VSB_ONLY
11219 	case DRX_STANDARD_ITU_A:	/* fallthrough */
11220 	case DRX_STANDARD_ITU_B:	/* fallthrough */
11221 	case DRX_STANDARD_ITU_C:
11222 		ext_attr->qam_pre_saw_cfg = *pre_saw;
11223 		break;
11224 #endif
11225 	default:
11226 		return -EINVAL;
11227 	}
11228 
11229 	return 0;
11230 rw_error:
11231 	return rc;
11232 }
11233 
11234 /*============================================================================*/
11235 
11236 /**
11237 * \fn int ctrl_set_cfg_afe_gain()
11238 * \brief Set AFE Gain.
11239 * \param demod demod instance
11240 * \param u16 *
11241 * \return int.
11242 *
11243 * Check arguments
11244 * Dispatch handling to standard specific function.
11245 *
11246 */
11247 static int
11248 ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain)
11249 {
11250 	struct i2c_device_addr *dev_addr = NULL;
11251 	struct drxj_data *ext_attr = NULL;
11252 	int rc;
11253 	u8 gain = 0;
11254 
11255 	/* check arguments */
11256 	if (afe_gain == NULL)
11257 		return -EINVAL;
11258 
11259 	dev_addr = demod->my_i2c_dev_addr;
11260 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
11261 
11262 	switch (afe_gain->standard) {
11263 	case DRX_STANDARD_8VSB:	/* fallthrough */
11264 #ifndef DRXJ_VSB_ONLY
11265 	case DRX_STANDARD_ITU_A:	/* fallthrough */
11266 	case DRX_STANDARD_ITU_B:	/* fallthrough */
11267 	case DRX_STANDARD_ITU_C:
11268 #endif
11269 		/* Do nothing */
11270 		break;
11271 	default:
11272 		return -EINVAL;
11273 	}
11274 
11275 	/* TODO PGA gain is also written by microcode (at least by QAM and VSB)
11276 	   So I (PJ) think interface requires choice between auto, user mode */
11277 
11278 	if (afe_gain->gain >= 329)
11279 		gain = 15;
11280 	else if (afe_gain->gain <= 147)
11281 		gain = 0;
11282 	else
11283 		gain = (afe_gain->gain - 140 + 6) / 13;
11284 
11285 	/* Only if standard is currently active */
11286 	if (ext_attr->standard == afe_gain->standard) {
11287 			rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, gain, 0);
11288 			if (rc != 0) {
11289 				pr_err("error %d\n", rc);
11290 				goto rw_error;
11291 			}
11292 		}
11293 
11294 	/* Store AFE Gain settings */
11295 	switch (afe_gain->standard) {
11296 	case DRX_STANDARD_8VSB:
11297 		ext_attr->vsb_pga_cfg = gain * 13 + 140;
11298 		break;
11299 #ifndef DRXJ_VSB_ONLY
11300 	case DRX_STANDARD_ITU_A:	/* fallthrough */
11301 	case DRX_STANDARD_ITU_B:	/* fallthrough */
11302 	case DRX_STANDARD_ITU_C:
11303 		ext_attr->qam_pga_cfg = gain * 13 + 140;
11304 		break;
11305 #endif
11306 	default:
11307 		return -EIO;
11308 	}
11309 
11310 	return 0;
11311 rw_error:
11312 	return rc;
11313 }
11314 
11315 /*============================================================================*/
11316 
11317 
11318 /*=============================================================================
11319 ===== EXPORTED FUNCTIONS ====================================================*/
11320 
11321 static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11322 		       struct drxu_code_info *mc_info,
11323 		       enum drxu_code_action action);
11324 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state);
11325 
11326 /**
11327 * \fn drxj_open()
11328 * \brief Open the demod instance, configure device, configure drxdriver
11329 * \return Status_t Return status.
11330 *
11331 * drxj_open() can be called with a NULL ucode image => no ucode upload.
11332 * This means that drxj_open() must NOT contain SCU commands or, in general,
11333 * rely on SCU or AUD ucode to be present.
11334 *
11335 */
11336 
11337 static int drxj_open(struct drx_demod_instance *demod)
11338 {
11339 	struct i2c_device_addr *dev_addr = NULL;
11340 	struct drxj_data *ext_attr = NULL;
11341 	struct drx_common_attr *common_attr = NULL;
11342 	u32 driver_version = 0;
11343 	struct drxu_code_info ucode_info;
11344 	struct drx_cfg_mpeg_output cfg_mpeg_output;
11345 	int rc;
11346 	enum drx_power_mode power_mode = DRX_POWER_UP;
11347 
11348 	if ((demod == NULL) ||
11349 	    (demod->my_common_attr == NULL) ||
11350 	    (demod->my_ext_attr == NULL) ||
11351 	    (demod->my_i2c_dev_addr == NULL) ||
11352 	    (demod->my_common_attr->is_opened)) {
11353 		return -EINVAL;
11354 	}
11355 
11356 	/* Check arguments */
11357 	if (demod->my_ext_attr == NULL)
11358 		return -EINVAL;
11359 
11360 	dev_addr = demod->my_i2c_dev_addr;
11361 	ext_attr = (struct drxj_data *) demod->my_ext_attr;
11362 	common_attr = (struct drx_common_attr *) demod->my_common_attr;
11363 
11364 	rc = ctrl_power_mode(demod, &power_mode);
11365 	if (rc != 0) {
11366 		pr_err("error %d\n", rc);
11367 		goto rw_error;
11368 	}
11369 	if (power_mode != DRX_POWER_UP) {
11370 		rc = -EINVAL;
11371 		pr_err("failed to powerup device\n");
11372 		goto rw_error;
11373 	}
11374 
11375 	/* has to be in front of setIqmAf and setOrxNsuAox */
11376 	rc = get_device_capabilities(demod);
11377 	if (rc != 0) {
11378 		pr_err("error %d\n", rc);
11379 		goto rw_error;
11380 	}
11381 
11382 	/*
11383 	 * Soft reset of sys- and osc-clockdomain
11384 	 *
11385 	 * HACK: On windows, it writes a 0x07 here, instead of just 0x03.
11386 	 * As we didn't load the firmware here yet, we should do the same.
11387 	 * Btw, this is coherent with DRX-K, where we send reset codes
11388 	 * for modulation (OFTM, in DRX-k), SYS and OSC clock domains.
11389 	 */
11390 	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);
11391 	if (rc != 0) {
11392 		pr_err("error %d\n", rc);
11393 		goto rw_error;
11394 	}
11395 	rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11396 	if (rc != 0) {
11397 		pr_err("error %d\n", rc);
11398 		goto rw_error;
11399 	}
11400 	msleep(1);
11401 
11402 	/* TODO first make sure that everything keeps working before enabling this */
11403 	/* PowerDownAnalogBlocks() */
11404 	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);
11405 	if (rc != 0) {
11406 		pr_err("error %d\n", rc);
11407 		goto rw_error;
11408 	}
11409 
11410 	rc = set_iqm_af(demod, false);
11411 	if (rc != 0) {
11412 		pr_err("error %d\n", rc);
11413 		goto rw_error;
11414 	}
11415 	rc = set_orx_nsu_aox(demod, false);
11416 	if (rc != 0) {
11417 		pr_err("error %d\n", rc);
11418 		goto rw_error;
11419 	}
11420 
11421 	rc = init_hi(demod);
11422 	if (rc != 0) {
11423 		pr_err("error %d\n", rc);
11424 		goto rw_error;
11425 	}
11426 
11427 	/* disable mpegoutput pins */
11428 	memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
11429 	cfg_mpeg_output.enable_mpeg_output = false;
11430 
11431 	rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
11432 	if (rc != 0) {
11433 		pr_err("error %d\n", rc);
11434 		goto rw_error;
11435 	}
11436 	/* Stop AUD Inform SetAudio it will need to do all setting */
11437 	rc = power_down_aud(demod);
11438 	if (rc != 0) {
11439 		pr_err("error %d\n", rc);
11440 		goto rw_error;
11441 	}
11442 	/* Stop SCU */
11443 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP, 0);
11444 	if (rc != 0) {
11445 		pr_err("error %d\n", rc);
11446 		goto rw_error;
11447 	}
11448 
11449 	/* Upload microcode */
11450 	if (common_attr->microcode_file != NULL) {
11451 		/* Dirty trick to use common ucode upload & verify,
11452 		   pretend device is already open */
11453 		common_attr->is_opened = true;
11454 		ucode_info.mc_file = common_attr->microcode_file;
11455 
11456 		if (DRX_ISPOWERDOWNMODE(demod->my_common_attr->current_power_mode)) {
11457 			pr_err("Should powerup before loading the firmware.");
11458 			return -EINVAL;
11459 		}
11460 
11461 		rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_UPLOAD);
11462 		if (rc != 0) {
11463 			pr_err("error %d while uploading the firmware\n", rc);
11464 			goto rw_error;
11465 		}
11466 		if (common_attr->verify_microcode == true) {
11467 			rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_VERIFY);
11468 			if (rc != 0) {
11469 				pr_err("error %d while verifying the firmware\n",
11470 				       rc);
11471 				goto rw_error;
11472 			}
11473 		}
11474 		common_attr->is_opened = false;
11475 	}
11476 
11477 	/* Run SCU for a little while to initialize microcode version numbers */
11478 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11479 	if (rc != 0) {
11480 		pr_err("error %d\n", rc);
11481 		goto rw_error;
11482 	}
11483 
11484 	/* Initialize scan timeout */
11485 	common_attr->scan_demod_lock_timeout = DRXJ_SCAN_TIMEOUT;
11486 	common_attr->scan_desired_lock = DRX_LOCKED;
11487 
11488 	drxj_reset_mode(ext_attr);
11489 	ext_attr->standard = DRX_STANDARD_UNKNOWN;
11490 
11491 	rc = smart_ant_init(demod);
11492 	if (rc != 0) {
11493 		pr_err("error %d\n", rc);
11494 		goto rw_error;
11495 	}
11496 
11497 	/* Stamp driver version number in SCU data RAM in BCD code
11498 	   Done to enable field application engineers to retrieve drxdriver version
11499 	   via I2C from SCU RAM
11500 	 */
11501 	driver_version = (VERSION_MAJOR / 100) % 10;
11502 	driver_version <<= 4;
11503 	driver_version += (VERSION_MAJOR / 10) % 10;
11504 	driver_version <<= 4;
11505 	driver_version += (VERSION_MAJOR % 10);
11506 	driver_version <<= 4;
11507 	driver_version += (VERSION_MINOR % 10);
11508 	driver_version <<= 4;
11509 	driver_version += (VERSION_PATCH / 1000) % 10;
11510 	driver_version <<= 4;
11511 	driver_version += (VERSION_PATCH / 100) % 10;
11512 	driver_version <<= 4;
11513 	driver_version += (VERSION_PATCH / 10) % 10;
11514 	driver_version <<= 4;
11515 	driver_version += (VERSION_PATCH % 10);
11516 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_HI__A, (u16)(driver_version >> 16), 0);
11517 	if (rc != 0) {
11518 		pr_err("error %d\n", rc);
11519 		goto rw_error;
11520 	}
11521 	rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_LO__A, (u16)(driver_version & 0xFFFF), 0);
11522 	if (rc != 0) {
11523 		pr_err("error %d\n", rc);
11524 		goto rw_error;
11525 	}
11526 
11527 	rc = ctrl_set_oob(demod, NULL);
11528 	if (rc != 0) {
11529 		pr_err("error %d\n", rc);
11530 		goto rw_error;
11531 	}
11532 
11533 	/* refresh the audio data structure with default */
11534 	ext_attr->aud_data = drxj_default_aud_data_g;
11535 
11536 	demod->my_common_attr->is_opened = true;
11537 	drxj_set_lna_state(demod, false);
11538 	return 0;
11539 rw_error:
11540 	common_attr->is_opened = false;
11541 	return rc;
11542 }
11543 
11544 /*============================================================================*/
11545 /**
11546 * \fn drxj_close()
11547 * \brief Close the demod instance, power down the device
11548 * \return Status_t Return status.
11549 *
11550 */
11551 static int drxj_close(struct drx_demod_instance *demod)
11552 {
11553 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11554 	int rc;
11555 	enum drx_power_mode power_mode = DRX_POWER_UP;
11556 
11557 	if ((demod->my_common_attr == NULL) ||
11558 	    (demod->my_ext_attr == NULL) ||
11559 	    (demod->my_i2c_dev_addr == NULL) ||
11560 	    (!demod->my_common_attr->is_opened)) {
11561 		return -EINVAL;
11562 	}
11563 
11564 	/* power up */
11565 	rc = ctrl_power_mode(demod, &power_mode);
11566 	if (rc != 0) {
11567 		pr_err("error %d\n", rc);
11568 		goto rw_error;
11569 	}
11570 
11571 	rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11572 	if (rc != 0) {
11573 		pr_err("error %d\n", rc);
11574 		goto rw_error;
11575 	}
11576 	power_mode = DRX_POWER_DOWN;
11577 	rc = ctrl_power_mode(demod, &power_mode);
11578 	if (rc != 0) {
11579 		pr_err("error %d\n", rc);
11580 		goto rw_error;
11581 	}
11582 
11583 	DRX_ATTR_ISOPENED(demod) = false;
11584 
11585 	return 0;
11586 rw_error:
11587 	DRX_ATTR_ISOPENED(demod) = false;
11588 
11589 	return rc;
11590 }
11591 
11592 /*
11593  * Microcode related functions
11594  */
11595 
11596 /**
11597  * drx_u_code_compute_crc	- Compute CRC of block of microcode data.
11598  * @block_data: Pointer to microcode data.
11599  * @nr_words:   Size of microcode block (number of 16 bits words).
11600  *
11601  * returns The computed CRC residue.
11602  */
11603 static u16 drx_u_code_compute_crc(u8 *block_data, u16 nr_words)
11604 {
11605 	u16 i = 0;
11606 	u16 j = 0;
11607 	u32 crc_word = 0;
11608 	u32 carry = 0;
11609 
11610 	while (i < nr_words) {
11611 		crc_word |= (u32)be16_to_cpu(*(__be16 *)(block_data));
11612 		for (j = 0; j < 16; j++) {
11613 			crc_word <<= 1;
11614 			if (carry != 0)
11615 				crc_word ^= 0x80050000UL;
11616 			carry = crc_word & 0x80000000UL;
11617 		}
11618 		i++;
11619 		block_data += (sizeof(u16));
11620 	}
11621 	return (u16)(crc_word >> 16);
11622 }
11623 
11624 /**
11625  * drx_check_firmware - checks if the loaded firmware is valid
11626  *
11627  * @demod:	demod structure
11628  * @mc_data:	pointer to the start of the firmware
11629  * @size:	firmware size
11630  */
11631 static int drx_check_firmware(struct drx_demod_instance *demod, u8 *mc_data,
11632 			  unsigned size)
11633 {
11634 	struct drxu_code_block_hdr block_hdr;
11635 	int i;
11636 	unsigned count = 2 * sizeof(u16);
11637 	u32 mc_dev_type, mc_version, mc_base_version;
11638 	u16 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data + sizeof(u16)));
11639 
11640 	/*
11641 	 * Scan microcode blocks first for version info
11642 	 * and firmware check
11643 	 */
11644 
11645 	/* Clear version block */
11646 	DRX_ATTR_MCRECORD(demod).aux_type = 0;
11647 	DRX_ATTR_MCRECORD(demod).mc_dev_type = 0;
11648 	DRX_ATTR_MCRECORD(demod).mc_version = 0;
11649 	DRX_ATTR_MCRECORD(demod).mc_base_version = 0;
11650 
11651 	for (i = 0; i < mc_nr_of_blks; i++) {
11652 		if (count + 3 * sizeof(u16) + sizeof(u32) > size)
11653 			goto eof;
11654 
11655 		/* Process block header */
11656 		block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data + count));
11657 		count += sizeof(u32);
11658 		block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data + count));
11659 		count += sizeof(u16);
11660 		block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data + count));
11661 		count += sizeof(u16);
11662 		block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data + count));
11663 		count += sizeof(u16);
11664 
11665 		pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11666 			count, block_hdr.addr, block_hdr.size, block_hdr.flags,
11667 			block_hdr.CRC);
11668 
11669 		if (block_hdr.flags & 0x8) {
11670 			u8 *auxblk = ((void *)mc_data) + block_hdr.addr;
11671 			u16 auxtype;
11672 
11673 			if (block_hdr.addr + sizeof(u16) > size)
11674 				goto eof;
11675 
11676 			auxtype = be16_to_cpu(*(__be16 *)(auxblk));
11677 
11678 			/* Aux block. Check type */
11679 			if (DRX_ISMCVERTYPE(auxtype)) {
11680 				if (block_hdr.addr + 2 * sizeof(u16) + 2 * sizeof (u32) > size)
11681 					goto eof;
11682 
11683 				auxblk += sizeof(u16);
11684 				mc_dev_type = be32_to_cpu(*(__be32 *)(auxblk));
11685 				auxblk += sizeof(u32);
11686 				mc_version = be32_to_cpu(*(__be32 *)(auxblk));
11687 				auxblk += sizeof(u32);
11688 				mc_base_version = be32_to_cpu(*(__be32 *)(auxblk));
11689 
11690 				DRX_ATTR_MCRECORD(demod).aux_type = auxtype;
11691 				DRX_ATTR_MCRECORD(demod).mc_dev_type = mc_dev_type;
11692 				DRX_ATTR_MCRECORD(demod).mc_version = mc_version;
11693 				DRX_ATTR_MCRECORD(demod).mc_base_version = mc_base_version;
11694 
11695 				pr_info("Firmware dev %x, ver %x, base ver %x\n",
11696 					mc_dev_type, mc_version, mc_base_version);
11697 
11698 			}
11699 		} else if (count + block_hdr.size * sizeof(u16) > size)
11700 			goto eof;
11701 
11702 		count += block_hdr.size * sizeof(u16);
11703 	}
11704 	return 0;
11705 eof:
11706 	pr_err("Firmware is truncated at pos %u/%u\n", count, size);
11707 	return -EINVAL;
11708 }
11709 
11710 /**
11711  * drx_ctrl_u_code - Handle microcode upload or verify.
11712  * @dev_addr: Address of device.
11713  * @mc_info:  Pointer to information about microcode data.
11714  * @action:  Either UCODE_UPLOAD or UCODE_VERIFY
11715  *
11716  * This function returns:
11717  *	0:
11718  *		- In case of UCODE_UPLOAD: code is successfully uploaded.
11719  *               - In case of UCODE_VERIFY: image on device is equal to
11720  *		  image provided to this control function.
11721  *	-EIO:
11722  *		- In case of UCODE_UPLOAD: I2C error.
11723  *		- In case of UCODE_VERIFY: I2C error or image on device
11724  *		  is not equal to image provided to this control function.
11725  * 	-EINVAL:
11726  *		- Invalid arguments.
11727  *		- Provided image is corrupt
11728  */
11729 static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11730 		       struct drxu_code_info *mc_info,
11731 		       enum drxu_code_action action)
11732 {
11733 	struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11734 	int rc;
11735 	u16 i = 0;
11736 	u16 mc_nr_of_blks = 0;
11737 	u16 mc_magic_word = 0;
11738 	const u8 *mc_data_init = NULL;
11739 	u8 *mc_data = NULL;
11740 	unsigned size;
11741 	char *mc_file;
11742 
11743 	/* Check arguments */
11744 	if (!mc_info || !mc_info->mc_file)
11745 		return -EINVAL;
11746 
11747 	mc_file = mc_info->mc_file;
11748 
11749 	if (!demod->firmware) {
11750 		const struct firmware *fw = NULL;
11751 
11752 		rc = request_firmware(&fw, mc_file, demod->i2c->dev.parent);
11753 		if (rc < 0) {
11754 			pr_err("Couldn't read firmware %s\n", mc_file);
11755 			return rc;
11756 		}
11757 		demod->firmware = fw;
11758 
11759 		if (demod->firmware->size < 2 * sizeof(u16)) {
11760 			rc = -EINVAL;
11761 			pr_err("Firmware is too short!\n");
11762 			goto release;
11763 		}
11764 
11765 		pr_info("Firmware %s, size %zu\n",
11766 			mc_file, demod->firmware->size);
11767 	}
11768 
11769 	mc_data_init = demod->firmware->data;
11770 	size = demod->firmware->size;
11771 
11772 	mc_data = (void *)mc_data_init;
11773 	/* Check data */
11774 	mc_magic_word = be16_to_cpu(*(__be16 *)(mc_data));
11775 	mc_data += sizeof(u16);
11776 	mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data));
11777 	mc_data += sizeof(u16);
11778 
11779 	if ((mc_magic_word != DRX_UCODE_MAGIC_WORD) || (mc_nr_of_blks == 0)) {
11780 		rc = -EINVAL;
11781 		pr_err("Firmware magic word doesn't match\n");
11782 		goto release;
11783 	}
11784 
11785 	if (action == UCODE_UPLOAD) {
11786 		rc = drx_check_firmware(demod, (u8 *)mc_data_init, size);
11787 		if (rc)
11788 			goto release;
11789 		pr_info("Uploading firmware %s\n", mc_file);
11790 	} else {
11791 		pr_info("Verifying if firmware upload was ok.\n");
11792 	}
11793 
11794 	/* Process microcode blocks */
11795 	for (i = 0; i < mc_nr_of_blks; i++) {
11796 		struct drxu_code_block_hdr block_hdr;
11797 		u16 mc_block_nr_bytes = 0;
11798 
11799 		/* Process block header */
11800 		block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data));
11801 		mc_data += sizeof(u32);
11802 		block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data));
11803 		mc_data += sizeof(u16);
11804 		block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data));
11805 		mc_data += sizeof(u16);
11806 		block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data));
11807 		mc_data += sizeof(u16);
11808 
11809 		pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11810 			(unsigned)(mc_data - mc_data_init), block_hdr.addr,
11811 			 block_hdr.size, block_hdr.flags, block_hdr.CRC);
11812 
11813 		/* Check block header on:
11814 		   - data larger than 64Kb
11815 		   - if CRC enabled check CRC
11816 		 */
11817 		if ((block_hdr.size > 0x7FFF) ||
11818 		    (((block_hdr.flags & DRX_UCODE_CRC_FLAG) != 0) &&
11819 		     (block_hdr.CRC != drx_u_code_compute_crc(mc_data, block_hdr.size)))
11820 		    ) {
11821 			/* Wrong data ! */
11822 			rc = -EINVAL;
11823 			pr_err("firmware CRC is wrong\n");
11824 			goto release;
11825 		}
11826 
11827 		if (!block_hdr.size)
11828 			continue;
11829 
11830 		mc_block_nr_bytes = block_hdr.size * ((u16) sizeof(u16));
11831 
11832 		/* Perform the desired action */
11833 		switch (action) {
11834 		case UCODE_UPLOAD:	/* Upload microcode */
11835 			if (drxdap_fasi_write_block(dev_addr,
11836 							block_hdr.addr,
11837 							mc_block_nr_bytes,
11838 							mc_data, 0x0000)) {
11839 				rc = -EIO;
11840 				pr_err("error writing firmware at pos %u\n",
11841 				       (unsigned)(mc_data - mc_data_init));
11842 				goto release;
11843 			}
11844 			break;
11845 		case UCODE_VERIFY: {	/* Verify uploaded microcode */
11846 			int result = 0;
11847 			u8 mc_data_buffer[DRX_UCODE_MAX_BUF_SIZE];
11848 			u32 bytes_to_comp = 0;
11849 			u32 bytes_left = mc_block_nr_bytes;
11850 			u32 curr_addr = block_hdr.addr;
11851 			u8 *curr_ptr = mc_data;
11852 
11853 			while (bytes_left != 0) {
11854 				if (bytes_left > DRX_UCODE_MAX_BUF_SIZE)
11855 					bytes_to_comp = DRX_UCODE_MAX_BUF_SIZE;
11856 				else
11857 					bytes_to_comp = bytes_left;
11858 
11859 				if (drxdap_fasi_read_block(dev_addr,
11860 						    curr_addr,
11861 						    (u16)bytes_to_comp,
11862 						    (u8 *)mc_data_buffer,
11863 						    0x0000)) {
11864 					pr_err("error reading firmware at pos %u\n",
11865 					       (unsigned)(mc_data - mc_data_init));
11866 					return -EIO;
11867 				}
11868 
11869 				result = memcmp(curr_ptr, mc_data_buffer,
11870 						bytes_to_comp);
11871 
11872 				if (result) {
11873 					pr_err("error verifying firmware at pos %u\n",
11874 					       (unsigned)(mc_data - mc_data_init));
11875 					return -EIO;
11876 				}
11877 
11878 				curr_addr += ((dr_xaddr_t)(bytes_to_comp / 2));
11879 				curr_ptr =&(curr_ptr[bytes_to_comp]);
11880 				bytes_left -=((u32) bytes_to_comp);
11881 			}
11882 			break;
11883 		}
11884 		default:
11885 			return -EINVAL;
11886 			break;
11887 
11888 		}
11889 		mc_data += mc_block_nr_bytes;
11890 	}
11891 
11892 	return 0;
11893 
11894 release:
11895 	release_firmware(demod->firmware);
11896 	demod->firmware = NULL;
11897 
11898 	return rc;
11899 }
11900 
11901 /* caller is expected to check if lna is supported before enabling */
11902 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state)
11903 {
11904 	struct drxuio_cfg uio_cfg;
11905 	struct drxuio_data uio_data;
11906 	int result;
11907 
11908 	uio_cfg.uio = DRX_UIO1;
11909 	uio_cfg.mode = DRX_UIO_MODE_READWRITE;
11910 	/* Configure user-I/O #3: enable read/write */
11911 	result = ctrl_set_uio_cfg(demod, &uio_cfg);
11912 	if (result) {
11913 		pr_err("Failed to setup LNA GPIO!\n");
11914 		return result;
11915 	}
11916 
11917 	uio_data.uio = DRX_UIO1;
11918 	uio_data.value = state;
11919 	result = ctrl_uio_write(demod, &uio_data);
11920 	if (result != 0) {
11921 		pr_err("Failed to %sable LNA!\n",
11922 		       state ? "en" : "dis");
11923 		return result;
11924 	}
11925 	return 0;
11926 }
11927 
11928 /*
11929  * The Linux DVB Driver for Micronas DRX39xx family (drx3933j)
11930  *
11931  * Written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
11932  */
11933 
11934 static int drx39xxj_set_powerstate(struct dvb_frontend *fe, int enable)
11935 {
11936 	struct drx39xxj_state *state = fe->demodulator_priv;
11937 	struct drx_demod_instance *demod = state->demod;
11938 	int result;
11939 	enum drx_power_mode power_mode;
11940 
11941 	if (enable)
11942 		power_mode = DRX_POWER_UP;
11943 	else
11944 		power_mode = DRX_POWER_DOWN;
11945 
11946 	result = ctrl_power_mode(demod, &power_mode);
11947 	if (result != 0) {
11948 		pr_err("Power state change failed\n");
11949 		return 0;
11950 	}
11951 
11952 	return 0;
11953 }
11954 
11955 static int drx39xxj_read_status(struct dvb_frontend *fe, enum fe_status *status)
11956 {
11957 	struct drx39xxj_state *state = fe->demodulator_priv;
11958 	struct drx_demod_instance *demod = state->demod;
11959 	int result;
11960 	enum drx_lock_status lock_status;
11961 
11962 	*status = 0;
11963 
11964 	result = ctrl_lock_status(demod, &lock_status);
11965 	if (result != 0) {
11966 		pr_err("drx39xxj: could not get lock status!\n");
11967 		*status = 0;
11968 	}
11969 
11970 	switch (lock_status) {
11971 	case DRX_NEVER_LOCK:
11972 		*status = 0;
11973 		pr_err("drx says NEVER_LOCK\n");
11974 		break;
11975 	case DRX_NOT_LOCKED:
11976 		*status = 0;
11977 		break;
11978 	case DRX_LOCK_STATE_1:
11979 	case DRX_LOCK_STATE_2:
11980 	case DRX_LOCK_STATE_3:
11981 	case DRX_LOCK_STATE_4:
11982 	case DRX_LOCK_STATE_5:
11983 	case DRX_LOCK_STATE_6:
11984 	case DRX_LOCK_STATE_7:
11985 	case DRX_LOCK_STATE_8:
11986 	case DRX_LOCK_STATE_9:
11987 		*status = FE_HAS_SIGNAL
11988 		    | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC;
11989 		break;
11990 	case DRX_LOCKED:
11991 		*status = FE_HAS_SIGNAL
11992 		    | FE_HAS_CARRIER
11993 		    | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
11994 		break;
11995 	default:
11996 		pr_err("Lock state unknown %d\n", lock_status);
11997 	}
11998 	ctrl_sig_quality(demod, lock_status);
11999 
12000 	return 0;
12001 }
12002 
12003 static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber)
12004 {
12005 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12006 
12007 	if (p->pre_bit_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12008 		*ber = 0;
12009 		return 0;
12010 	}
12011 
12012 	if (!p->pre_bit_count.stat[0].uvalue) {
12013 		if (!p->pre_bit_error.stat[0].uvalue)
12014 			*ber = 0;
12015 		else
12016 			*ber = 1000000;
12017 	} else {
12018 		*ber = frac_times1e6(p->pre_bit_error.stat[0].uvalue,
12019 				     p->pre_bit_count.stat[0].uvalue);
12020 	}
12021 	return 0;
12022 }
12023 
12024 static int drx39xxj_read_signal_strength(struct dvb_frontend *fe,
12025 					 u16 *strength)
12026 {
12027 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12028 
12029 	if (p->strength.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12030 		*strength = 0;
12031 		return 0;
12032 	}
12033 
12034 	*strength = p->strength.stat[0].uvalue;
12035 	return 0;
12036 }
12037 
12038 static int drx39xxj_read_snr(struct dvb_frontend *fe, u16 *snr)
12039 {
12040 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12041 	u64 tmp64;
12042 
12043 	if (p->cnr.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12044 		*snr = 0;
12045 		return 0;
12046 	}
12047 
12048 	tmp64 = p->cnr.stat[0].svalue;
12049 	do_div(tmp64, 10);
12050 	*snr = tmp64;
12051 	return 0;
12052 }
12053 
12054 static int drx39xxj_read_ucblocks(struct dvb_frontend *fe, u32 *ucb)
12055 {
12056 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12057 
12058 	if (p->block_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12059 		*ucb = 0;
12060 		return 0;
12061 	}
12062 
12063 	*ucb = p->block_error.stat[0].uvalue;
12064 	return 0;
12065 }
12066 
12067 static int drx39xxj_set_frontend(struct dvb_frontend *fe)
12068 {
12069 #ifdef DJH_DEBUG
12070 	int i;
12071 #endif
12072 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12073 	struct drx39xxj_state *state = fe->demodulator_priv;
12074 	struct drx_demod_instance *demod = state->demod;
12075 	enum drx_standard standard = DRX_STANDARD_8VSB;
12076 	struct drx_channel channel;
12077 	int result;
12078 	static const struct drx_channel def_channel = {
12079 		/* frequency      */ 0,
12080 		/* bandwidth      */ DRX_BANDWIDTH_6MHZ,
12081 		/* mirror         */ DRX_MIRROR_NO,
12082 		/* constellation  */ DRX_CONSTELLATION_AUTO,
12083 		/* hierarchy      */ DRX_HIERARCHY_UNKNOWN,
12084 		/* priority       */ DRX_PRIORITY_UNKNOWN,
12085 		/* coderate       */ DRX_CODERATE_UNKNOWN,
12086 		/* guard          */ DRX_GUARD_UNKNOWN,
12087 		/* fftmode        */ DRX_FFTMODE_UNKNOWN,
12088 		/* classification */ DRX_CLASSIFICATION_AUTO,
12089 		/* symbolrate     */ 5057000,
12090 		/* interleavemode */ DRX_INTERLEAVEMODE_UNKNOWN,
12091 		/* ldpc           */ DRX_LDPC_UNKNOWN,
12092 		/* carrier        */ DRX_CARRIER_UNKNOWN,
12093 		/* frame mode     */ DRX_FRAMEMODE_UNKNOWN
12094 	};
12095 	u32 constellation = DRX_CONSTELLATION_AUTO;
12096 
12097 	/* Bring the demod out of sleep */
12098 	drx39xxj_set_powerstate(fe, 1);
12099 
12100 	if (fe->ops.tuner_ops.set_params) {
12101 		u32 int_freq;
12102 
12103 		if (fe->ops.i2c_gate_ctrl)
12104 			fe->ops.i2c_gate_ctrl(fe, 1);
12105 
12106 		/* Set tuner to desired frequency and standard */
12107 		fe->ops.tuner_ops.set_params(fe);
12108 
12109 		/* Use the tuner's IF */
12110 		if (fe->ops.tuner_ops.get_if_frequency) {
12111 			fe->ops.tuner_ops.get_if_frequency(fe, &int_freq);
12112 			demod->my_common_attr->intermediate_freq = int_freq / 1000;
12113 		}
12114 
12115 		if (fe->ops.i2c_gate_ctrl)
12116 			fe->ops.i2c_gate_ctrl(fe, 0);
12117 	}
12118 
12119 	switch (p->delivery_system) {
12120 	case SYS_ATSC:
12121 		standard = DRX_STANDARD_8VSB;
12122 		break;
12123 	case SYS_DVBC_ANNEX_B:
12124 		standard = DRX_STANDARD_ITU_B;
12125 
12126 		switch (p->modulation) {
12127 		case QAM_64:
12128 			constellation = DRX_CONSTELLATION_QAM64;
12129 			break;
12130 		case QAM_256:
12131 			constellation = DRX_CONSTELLATION_QAM256;
12132 			break;
12133 		default:
12134 			constellation = DRX_CONSTELLATION_AUTO;
12135 			break;
12136 		}
12137 		break;
12138 	default:
12139 		return -EINVAL;
12140 	}
12141 	/* Set the standard (will be powered up if necessary */
12142 	result = ctrl_set_standard(demod, &standard);
12143 	if (result != 0) {
12144 		pr_err("Failed to set standard! result=%02x\n",
12145 			result);
12146 		return -EINVAL;
12147 	}
12148 
12149 	/* set channel parameters */
12150 	channel = def_channel;
12151 	channel.frequency = p->frequency / 1000;
12152 	channel.bandwidth = DRX_BANDWIDTH_6MHZ;
12153 	channel.constellation = constellation;
12154 
12155 	/* program channel */
12156 	result = ctrl_set_channel(demod, &channel);
12157 	if (result != 0) {
12158 		pr_err("Failed to set channel!\n");
12159 		return -EINVAL;
12160 	}
12161 	/* Just for giggles, let's shut off the LNA again.... */
12162 	drxj_set_lna_state(demod, false);
12163 
12164 	/* After set_frontend, except for strength, stats aren't available */
12165 	p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12166 
12167 	return 0;
12168 }
12169 
12170 static int drx39xxj_sleep(struct dvb_frontend *fe)
12171 {
12172 	/* power-down the demodulator */
12173 	return drx39xxj_set_powerstate(fe, 0);
12174 }
12175 
12176 static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
12177 {
12178 	struct drx39xxj_state *state = fe->demodulator_priv;
12179 	struct drx_demod_instance *demod = state->demod;
12180 	bool i2c_gate_state;
12181 	int result;
12182 
12183 #ifdef DJH_DEBUG
12184 	pr_debug("i2c gate call: enable=%d state=%d\n", enable,
12185 	       state->i2c_gate_open);
12186 #endif
12187 
12188 	if (enable)
12189 		i2c_gate_state = true;
12190 	else
12191 		i2c_gate_state = false;
12192 
12193 	if (state->i2c_gate_open == enable) {
12194 		/* We're already in the desired state */
12195 		return 0;
12196 	}
12197 
12198 	result = ctrl_i2c_bridge(demod, &i2c_gate_state);
12199 	if (result != 0) {
12200 		pr_err("drx39xxj: could not open i2c gate [%d]\n",
12201 		       result);
12202 		dump_stack();
12203 	} else {
12204 		state->i2c_gate_open = enable;
12205 	}
12206 	return 0;
12207 }
12208 
12209 static int drx39xxj_init(struct dvb_frontend *fe)
12210 {
12211 	struct drx39xxj_state *state = fe->demodulator_priv;
12212 	struct drx_demod_instance *demod = state->demod;
12213 	int rc = 0;
12214 
12215 	if (fe->exit == DVB_FE_DEVICE_RESUME) {
12216 		/* so drxj_open() does what it needs to do */
12217 		demod->my_common_attr->is_opened = false;
12218 		rc = drxj_open(demod);
12219 		if (rc != 0)
12220 			pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc);
12221 	} else
12222 		drx39xxj_set_powerstate(fe, 1);
12223 
12224 	return rc;
12225 }
12226 
12227 static int drx39xxj_set_lna(struct dvb_frontend *fe)
12228 {
12229 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
12230 	struct drx39xxj_state *state = fe->demodulator_priv;
12231 	struct drx_demod_instance *demod = state->demod;
12232 	struct drxj_data *ext_attr = demod->my_ext_attr;
12233 
12234 	if (c->lna) {
12235 		if (!ext_attr->has_lna) {
12236 			pr_err("LNA is not supported on this device!\n");
12237 			return -EINVAL;
12238 
12239 		}
12240 	}
12241 
12242 	return drxj_set_lna_state(demod, c->lna);
12243 }
12244 
12245 static int drx39xxj_get_tune_settings(struct dvb_frontend *fe,
12246 				      struct dvb_frontend_tune_settings *tune)
12247 {
12248 	tune->min_delay_ms = 1000;
12249 	return 0;
12250 }
12251 
12252 static void drx39xxj_release(struct dvb_frontend *fe)
12253 {
12254 	struct drx39xxj_state *state = fe->demodulator_priv;
12255 	struct drx_demod_instance *demod = state->demod;
12256 
12257 	/* if device is removed don't access it */
12258 	if (fe->exit != DVB_FE_DEVICE_REMOVED)
12259 		drxj_close(demod);
12260 
12261 	kfree(demod->my_ext_attr);
12262 	kfree(demod->my_common_attr);
12263 	kfree(demod->my_i2c_dev_addr);
12264 	release_firmware(demod->firmware);
12265 	kfree(demod);
12266 	kfree(state);
12267 }
12268 
12269 static const struct dvb_frontend_ops drx39xxj_ops;
12270 
12271 struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
12272 {
12273 	struct drx39xxj_state *state = NULL;
12274 	struct i2c_device_addr *demod_addr = NULL;
12275 	struct drx_common_attr *demod_comm_attr = NULL;
12276 	struct drxj_data *demod_ext_attr = NULL;
12277 	struct drx_demod_instance *demod = NULL;
12278 	struct dtv_frontend_properties *p;
12279 	int result;
12280 
12281 	/* allocate memory for the internal state */
12282 	state = kzalloc(sizeof(struct drx39xxj_state), GFP_KERNEL);
12283 	if (state == NULL)
12284 		goto error;
12285 
12286 	demod = kmalloc(sizeof(struct drx_demod_instance), GFP_KERNEL);
12287 	if (demod == NULL)
12288 		goto error;
12289 
12290 	demod_addr = kmemdup(&drxj_default_addr_g,
12291 			     sizeof(struct i2c_device_addr), GFP_KERNEL);
12292 	if (demod_addr == NULL)
12293 		goto error;
12294 
12295 	demod_comm_attr = kmemdup(&drxj_default_comm_attr_g,
12296 				  sizeof(struct drx_common_attr), GFP_KERNEL);
12297 	if (demod_comm_attr == NULL)
12298 		goto error;
12299 
12300 	demod_ext_attr = kmemdup(&drxj_data_g, sizeof(struct drxj_data),
12301 				 GFP_KERNEL);
12302 	if (demod_ext_attr == NULL)
12303 		goto error;
12304 
12305 	/* setup the state */
12306 	state->i2c = i2c;
12307 	state->demod = demod;
12308 
12309 	/* setup the demod data */
12310 	memcpy(demod, &drxj_default_demod_g, sizeof(struct drx_demod_instance));
12311 
12312 	demod->my_i2c_dev_addr = demod_addr;
12313 	demod->my_common_attr = demod_comm_attr;
12314 	demod->my_i2c_dev_addr->user_data = state;
12315 	demod->my_common_attr->microcode_file = DRX39XX_MAIN_FIRMWARE;
12316 	demod->my_common_attr->verify_microcode = true;
12317 	demod->my_common_attr->intermediate_freq = 5000;
12318 	demod->my_common_attr->current_power_mode = DRX_POWER_DOWN;
12319 	demod->my_ext_attr = demod_ext_attr;
12320 	((struct drxj_data *)demod_ext_attr)->uio_sma_tx_mode = DRX_UIO_MODE_READWRITE;
12321 	demod->i2c = i2c;
12322 
12323 	result = drxj_open(demod);
12324 	if (result != 0) {
12325 		pr_err("DRX open failed!  Aborting\n");
12326 		goto error;
12327 	}
12328 
12329 	/* create dvb_frontend */
12330 	memcpy(&state->frontend.ops, &drx39xxj_ops,
12331 	       sizeof(struct dvb_frontend_ops));
12332 
12333 	state->frontend.demodulator_priv = state;
12334 
12335 	/* Initialize stats - needed for DVBv5 stats to work */
12336 	p = &state->frontend.dtv_property_cache;
12337 	p->strength.len = 1;
12338 	p->pre_bit_count.len = 1;
12339 	p->pre_bit_error.len = 1;
12340 	p->post_bit_count.len = 1;
12341 	p->post_bit_error.len = 1;
12342 	p->block_count.len = 1;
12343 	p->block_error.len = 1;
12344 	p->cnr.len = 1;
12345 
12346 	p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12347 	p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12348 	p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12349 	p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12350 	p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12351 	p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12352 	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12353 	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12354 
12355 	return &state->frontend;
12356 
12357 error:
12358 	kfree(demod_ext_attr);
12359 	kfree(demod_comm_attr);
12360 	kfree(demod_addr);
12361 	kfree(demod);
12362 	kfree(state);
12363 
12364 	return NULL;
12365 }
12366 EXPORT_SYMBOL(drx39xxj_attach);
12367 
12368 static const struct dvb_frontend_ops drx39xxj_ops = {
12369 	.delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
12370 	.info = {
12371 		 .name = "Micronas DRX39xxj family Frontend",
12372 		 .frequency_stepsize = 62500,
12373 		 .frequency_min = 51000000,
12374 		 .frequency_max = 858000000,
12375 		 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
12376 	},
12377 
12378 	.init = drx39xxj_init,
12379 	.i2c_gate_ctrl = drx39xxj_i2c_gate_ctrl,
12380 	.sleep = drx39xxj_sleep,
12381 	.set_frontend = drx39xxj_set_frontend,
12382 	.get_tune_settings = drx39xxj_get_tune_settings,
12383 	.read_status = drx39xxj_read_status,
12384 	.read_ber = drx39xxj_read_ber,
12385 	.read_signal_strength = drx39xxj_read_signal_strength,
12386 	.read_snr = drx39xxj_read_snr,
12387 	.read_ucblocks = drx39xxj_read_ucblocks,
12388 	.release = drx39xxj_release,
12389 	.set_lna = drx39xxj_set_lna,
12390 };
12391 
12392 MODULE_DESCRIPTION("Micronas DRX39xxj Frontend");
12393 MODULE_AUTHOR("Devin Heitmueller");
12394 MODULE_LICENSE("GPL");
12395 MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE);
12396