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