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