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