media: fix usage of whitespaces and on indentation
[sfrench/cifs-2.6.git] / 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 <media/dvb_frontend.h>
65 #include "drx39xxj.h"
66
67 #include "drxj.h"
68 #include "drxj_map.h"
69
70 /*============================================================================*/
71 /*=== DEFINES ================================================================*/
72 /*============================================================================*/
73
74 #define DRX39XX_MAIN_FIRMWARE "dvb-fe-drxj-mc-1.0.8.fw"
75
76 /*
77 * \brief Maximum u32 value.
78 */
79 #ifndef MAX_U32
80 #define MAX_U32  ((u32) (0xFFFFFFFFL))
81 #endif
82
83 /* Customer configurable hardware settings, etc */
84 #ifndef MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
85 #define MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
86 #endif
87
88 #ifndef MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
89 #define MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
90 #endif
91
92 #ifndef MPEG_OUTPUT_CLK_DRIVE_STRENGTH
93 #define MPEG_OUTPUT_CLK_DRIVE_STRENGTH 0x06
94 #endif
95
96 #ifndef OOB_CRX_DRIVE_STRENGTH
97 #define OOB_CRX_DRIVE_STRENGTH 0x02
98 #endif
99
100 #ifndef OOB_DRX_DRIVE_STRENGTH
101 #define OOB_DRX_DRIVE_STRENGTH 0x02
102 #endif
103 /*** START DJCOMBO patches to DRXJ registermap constants *********************/
104 /*** registermap 200706071303 from drxj **************************************/
105 #define   ATV_TOP_CR_AMP_TH_FM                                              0x0
106 #define   ATV_TOP_CR_AMP_TH_L                                               0xA
107 #define   ATV_TOP_CR_AMP_TH_LP                                              0xA
108 #define   ATV_TOP_CR_AMP_TH_BG                                              0x8
109 #define   ATV_TOP_CR_AMP_TH_DK                                              0x8
110 #define   ATV_TOP_CR_AMP_TH_I                                               0x8
111 #define     ATV_TOP_CR_CONT_CR_D_MN                                         0x18
112 #define     ATV_TOP_CR_CONT_CR_D_FM                                         0x0
113 #define     ATV_TOP_CR_CONT_CR_D_L                                          0x20
114 #define     ATV_TOP_CR_CONT_CR_D_LP                                         0x20
115 #define     ATV_TOP_CR_CONT_CR_D_BG                                         0x18
116 #define     ATV_TOP_CR_CONT_CR_D_DK                                         0x18
117 #define     ATV_TOP_CR_CONT_CR_D_I                                          0x18
118 #define     ATV_TOP_CR_CONT_CR_I_MN                                         0x80
119 #define     ATV_TOP_CR_CONT_CR_I_FM                                         0x0
120 #define     ATV_TOP_CR_CONT_CR_I_L                                          0x80
121 #define     ATV_TOP_CR_CONT_CR_I_LP                                         0x80
122 #define     ATV_TOP_CR_CONT_CR_I_BG                                         0x80
123 #define     ATV_TOP_CR_CONT_CR_I_DK                                         0x80
124 #define     ATV_TOP_CR_CONT_CR_I_I                                          0x80
125 #define     ATV_TOP_CR_CONT_CR_P_MN                                         0x4
126 #define     ATV_TOP_CR_CONT_CR_P_FM                                         0x0
127 #define     ATV_TOP_CR_CONT_CR_P_L                                          0x4
128 #define     ATV_TOP_CR_CONT_CR_P_LP                                         0x4
129 #define     ATV_TOP_CR_CONT_CR_P_BG                                         0x4
130 #define     ATV_TOP_CR_CONT_CR_P_DK                                         0x4
131 #define     ATV_TOP_CR_CONT_CR_P_I                                          0x4
132 #define   ATV_TOP_CR_OVM_TH_MN                                              0xA0
133 #define   ATV_TOP_CR_OVM_TH_FM                                              0x0
134 #define   ATV_TOP_CR_OVM_TH_L                                               0xA0
135 #define   ATV_TOP_CR_OVM_TH_LP                                              0xA0
136 #define   ATV_TOP_CR_OVM_TH_BG                                              0xA0
137 #define   ATV_TOP_CR_OVM_TH_DK                                              0xA0
138 #define   ATV_TOP_CR_OVM_TH_I                                               0xA0
139 #define     ATV_TOP_EQU0_EQU_C0_FM                                          0x0
140 #define     ATV_TOP_EQU0_EQU_C0_L                                           0x3
141 #define     ATV_TOP_EQU0_EQU_C0_LP                                          0x3
142 #define     ATV_TOP_EQU0_EQU_C0_BG                                          0x7
143 #define     ATV_TOP_EQU0_EQU_C0_DK                                          0x0
144 #define     ATV_TOP_EQU0_EQU_C0_I                                           0x3
145 #define     ATV_TOP_EQU1_EQU_C1_FM                                          0x0
146 #define     ATV_TOP_EQU1_EQU_C1_L                                           0x1F6
147 #define     ATV_TOP_EQU1_EQU_C1_LP                                          0x1F6
148 #define     ATV_TOP_EQU1_EQU_C1_BG                                          0x197
149 #define     ATV_TOP_EQU1_EQU_C1_DK                                          0x198
150 #define     ATV_TOP_EQU1_EQU_C1_I                                           0x1F6
151 #define     ATV_TOP_EQU2_EQU_C2_FM                                          0x0
152 #define     ATV_TOP_EQU2_EQU_C2_L                                           0x28
153 #define     ATV_TOP_EQU2_EQU_C2_LP                                          0x28
154 #define     ATV_TOP_EQU2_EQU_C2_BG                                          0xC5
155 #define     ATV_TOP_EQU2_EQU_C2_DK                                          0xB0
156 #define     ATV_TOP_EQU2_EQU_C2_I                                           0x28
157 #define     ATV_TOP_EQU3_EQU_C3_FM                                          0x0
158 #define     ATV_TOP_EQU3_EQU_C3_L                                           0x192
159 #define     ATV_TOP_EQU3_EQU_C3_LP                                          0x192
160 #define     ATV_TOP_EQU3_EQU_C3_BG                                          0x12E
161 #define     ATV_TOP_EQU3_EQU_C3_DK                                          0x18E
162 #define     ATV_TOP_EQU3_EQU_C3_I                                           0x192
163 #define     ATV_TOP_STD_MODE_MN                                             0x0
164 #define     ATV_TOP_STD_MODE_FM                                             0x1
165 #define     ATV_TOP_STD_MODE_L                                              0x0
166 #define     ATV_TOP_STD_MODE_LP                                             0x0
167 #define     ATV_TOP_STD_MODE_BG                                             0x0
168 #define     ATV_TOP_STD_MODE_DK                                             0x0
169 #define     ATV_TOP_STD_MODE_I                                              0x0
170 #define     ATV_TOP_STD_VID_POL_MN                                          0x0
171 #define     ATV_TOP_STD_VID_POL_FM                                          0x0
172 #define     ATV_TOP_STD_VID_POL_L                                           0x2
173 #define     ATV_TOP_STD_VID_POL_LP                                          0x2
174 #define     ATV_TOP_STD_VID_POL_BG                                          0x0
175 #define     ATV_TOP_STD_VID_POL_DK                                          0x0
176 #define     ATV_TOP_STD_VID_POL_I                                           0x0
177 #define   ATV_TOP_VID_AMP_MN                                                0x380
178 #define   ATV_TOP_VID_AMP_FM                                                0x0
179 #define   ATV_TOP_VID_AMP_L                                                 0xF50
180 #define   ATV_TOP_VID_AMP_LP                                                0xF50
181 #define   ATV_TOP_VID_AMP_BG                                                0x380
182 #define   ATV_TOP_VID_AMP_DK                                                0x394
183 #define   ATV_TOP_VID_AMP_I                                                 0x3D8
184 #define   IQM_CF_OUT_ENA_OFDM__M                                            0x4
185 #define     IQM_FS_ADJ_SEL_B_QAM                                            0x1
186 #define     IQM_FS_ADJ_SEL_B_OFF                                            0x0
187 #define     IQM_FS_ADJ_SEL_B_VSB                                            0x2
188 #define     IQM_RC_ADJ_SEL_B_OFF                                            0x0
189 #define     IQM_RC_ADJ_SEL_B_QAM                                            0x1
190 #define     IQM_RC_ADJ_SEL_B_VSB                                            0x2
191 /*** END DJCOMBO patches to DRXJ registermap *********************************/
192
193 #include "drx_driver_version.h"
194
195 /* #define DRX_DEBUG */
196 #ifdef DRX_DEBUG
197 #include <stdio.h>
198 #endif
199
200 /*-----------------------------------------------------------------------------
201 ENUMS
202 ----------------------------------------------------------------------------*/
203
204 /*-----------------------------------------------------------------------------
205 DEFINES
206 ----------------------------------------------------------------------------*/
207 #ifndef DRXJ_WAKE_UP_KEY
208 #define DRXJ_WAKE_UP_KEY (demod->my_i2c_dev_addr->i2c_addr)
209 #endif
210
211 /*
212 * \def DRXJ_DEF_I2C_ADDR
213 * \brief Default I2C address of a demodulator instance.
214 */
215 #define DRXJ_DEF_I2C_ADDR (0x52)
216
217 /*
218 * \def DRXJ_DEF_DEMOD_DEV_ID
219 * \brief Default device identifier of a demodultor instance.
220 */
221 #define DRXJ_DEF_DEMOD_DEV_ID      (1)
222
223 /*
224 * \def DRXJ_SCAN_TIMEOUT
225 * \brief Timeout value for waiting on demod lock during channel scan (millisec).
226 */
227 #define DRXJ_SCAN_TIMEOUT    1000
228
229 /*
230 * \def HI_I2C_DELAY
231 * \brief HI timing delay for I2C timing (in nano seconds)
232 *
233 *  Used to compute HI_CFG_DIV
234 */
235 #define HI_I2C_DELAY    42
236
237 /*
238 * \def HI_I2C_BRIDGE_DELAY
239 * \brief HI timing delay for I2C timing (in nano seconds)
240 *
241 *  Used to compute HI_CFG_BDL
242 */
243 #define HI_I2C_BRIDGE_DELAY   750
244
245 /*
246 * \brief Time Window for MER and SER Measurement in Units of Segment duration.
247 */
248 #define VSB_TOP_MEASUREMENT_PERIOD  64
249 #define SYMBOLS_PER_SEGMENT         832
250
251 /*
252 * \brief bit rate and segment rate constants used for SER and BER.
253 */
254 /* values taken from the QAM microcode */
255 #define DRXJ_QAM_SL_SIG_POWER_QAM_UNKNOWN 0
256 #define DRXJ_QAM_SL_SIG_POWER_QPSK        32768
257 #define DRXJ_QAM_SL_SIG_POWER_QAM8        24576
258 #define DRXJ_QAM_SL_SIG_POWER_QAM16       40960
259 #define DRXJ_QAM_SL_SIG_POWER_QAM32       20480
260 #define DRXJ_QAM_SL_SIG_POWER_QAM64       43008
261 #define DRXJ_QAM_SL_SIG_POWER_QAM128      20992
262 #define DRXJ_QAM_SL_SIG_POWER_QAM256      43520
263 /*
264 * \brief Min supported symbolrates.
265 */
266 #ifndef DRXJ_QAM_SYMBOLRATE_MIN
267 #define DRXJ_QAM_SYMBOLRATE_MIN          (520000)
268 #endif
269
270 /*
271 * \brief Max supported symbolrates.
272 */
273 #ifndef DRXJ_QAM_SYMBOLRATE_MAX
274 #define DRXJ_QAM_SYMBOLRATE_MAX         (7233000)
275 #endif
276
277 /*
278 * \def DRXJ_QAM_MAX_WAITTIME
279 * \brief Maximal wait time for QAM auto constellation in ms
280 */
281 #ifndef DRXJ_QAM_MAX_WAITTIME
282 #define DRXJ_QAM_MAX_WAITTIME 900
283 #endif
284
285 #ifndef DRXJ_QAM_FEC_LOCK_WAITTIME
286 #define DRXJ_QAM_FEC_LOCK_WAITTIME 150
287 #endif
288
289 #ifndef DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
290 #define DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME 200
291 #endif
292
293 /*
294 * \def SCU status and results
295 * \brief SCU
296 */
297 #define DRX_SCU_READY               0
298 #define DRXJ_MAX_WAITTIME           100 /* ms */
299 #define FEC_RS_MEASUREMENT_PERIOD   12894       /* 1 sec */
300 #define FEC_RS_MEASUREMENT_PRESCALE 1   /* n sec */
301
302 /*
303 * \def DRX_AUD_MAX_DEVIATION
304 * \brief Needed for calculation of prescale feature in AUD
305 */
306 #ifndef DRXJ_AUD_MAX_FM_DEVIATION
307 #define DRXJ_AUD_MAX_FM_DEVIATION  100  /* kHz */
308 #endif
309
310 /*
311 * \brief Needed for calculation of NICAM prescale feature in AUD
312 */
313 #ifndef DRXJ_AUD_MAX_NICAM_PRESCALE
314 #define DRXJ_AUD_MAX_NICAM_PRESCALE  (9)        /* dB */
315 #endif
316
317 /*
318 * \brief Needed for calculation of NICAM prescale feature in AUD
319 */
320 #ifndef DRXJ_AUD_MAX_WAITTIME
321 #define DRXJ_AUD_MAX_WAITTIME  250      /* ms */
322 #endif
323
324 /* ATV config changed flags */
325 #define DRXJ_ATV_CHANGED_COEF          (0x00000001UL)
326 #define DRXJ_ATV_CHANGED_PEAK_FLT      (0x00000008UL)
327 #define DRXJ_ATV_CHANGED_NOISE_FLT     (0x00000010UL)
328 #define DRXJ_ATV_CHANGED_OUTPUT        (0x00000020UL)
329 #define DRXJ_ATV_CHANGED_SIF_ATT       (0x00000040UL)
330
331 /* UIO define */
332 #define DRX_UIO_MODE_FIRMWARE_SMA DRX_UIO_MODE_FIRMWARE0
333 #define DRX_UIO_MODE_FIRMWARE_SAW DRX_UIO_MODE_FIRMWARE1
334
335 /*
336  * MICROCODE RELATED DEFINES
337  */
338
339 /* Magic word for checking correct Endianness of microcode data */
340 #define DRX_UCODE_MAGIC_WORD         ((((u16)'H')<<8)+((u16)'L'))
341
342 /* CRC flag in ucode header, flags field. */
343 #define DRX_UCODE_CRC_FLAG           (0x0001)
344
345 /*
346  * Maximum size of buffer used to verify the microcode.
347  * Must be an even number
348  */
349 #define DRX_UCODE_MAX_BUF_SIZE       (DRXDAP_MAX_RCHUNKSIZE)
350
351 #if DRX_UCODE_MAX_BUF_SIZE & 1
352 #error DRX_UCODE_MAX_BUF_SIZE must be an even number
353 #endif
354
355 /*
356  * Power mode macros
357  */
358
359 #define DRX_ISPOWERDOWNMODE(mode) ((mode == DRX_POWER_MODE_9) || \
360                                        (mode == DRX_POWER_MODE_10) || \
361                                        (mode == DRX_POWER_MODE_11) || \
362                                        (mode == DRX_POWER_MODE_12) || \
363                                        (mode == DRX_POWER_MODE_13) || \
364                                        (mode == DRX_POWER_MODE_14) || \
365                                        (mode == DRX_POWER_MODE_15) || \
366                                        (mode == DRX_POWER_MODE_16) || \
367                                        (mode == DRX_POWER_DOWN))
368
369 /* Pin safe mode macro */
370 #define DRXJ_PIN_SAFE_MODE 0x0000
371 /*============================================================================*/
372 /*=== GLOBAL VARIABLEs =======================================================*/
373 /*============================================================================*/
374 /*
375 */
376
377 /*
378 * \brief Temporary register definitions.
379 *        (register definitions that are not yet available in register master)
380 */
381
382 /*****************************************************************************/
383 /* Audio block 0x103 is write only. To avoid shadowing in driver accessing    */
384 /* RAM adresses directly. This must be READ ONLY to avoid problems.           */
385 /* Writing to the interface adresses is more than only writing the RAM        */
386 /* locations                                                                  */
387 /*****************************************************************************/
388 /*
389 * \brief RAM location of MODUS registers
390 */
391 #define AUD_DEM_RAM_MODUS_HI__A              0x10204A3
392 #define AUD_DEM_RAM_MODUS_HI__M              0xF000
393
394 #define AUD_DEM_RAM_MODUS_LO__A              0x10204A4
395 #define AUD_DEM_RAM_MODUS_LO__M              0x0FFF
396
397 /*
398 * \brief RAM location of I2S config registers
399 */
400 #define AUD_DEM_RAM_I2S_CONFIG1__A           0x10204B1
401 #define AUD_DEM_RAM_I2S_CONFIG2__A           0x10204B2
402
403 /*
404 * \brief RAM location of DCO config registers
405 */
406 #define AUD_DEM_RAM_DCO_B_HI__A              0x1020461
407 #define AUD_DEM_RAM_DCO_B_LO__A              0x1020462
408 #define AUD_DEM_RAM_DCO_A_HI__A              0x1020463
409 #define AUD_DEM_RAM_DCO_A_LO__A              0x1020464
410
411 /*
412 * \brief RAM location of Threshold registers
413 */
414 #define AUD_DEM_RAM_NICAM_THRSHLD__A         0x102045A
415 #define AUD_DEM_RAM_A2_THRSHLD__A            0x10204BB
416 #define AUD_DEM_RAM_BTSC_THRSHLD__A          0x10204A6
417
418 /*
419 * \brief RAM location of Carrier Threshold registers
420 */
421 #define AUD_DEM_RAM_CM_A_THRSHLD__A          0x10204AF
422 #define AUD_DEM_RAM_CM_B_THRSHLD__A          0x10204B0
423
424 /*
425 * \brief FM Matrix register fix
426 */
427 #ifdef AUD_DEM_WR_FM_MATRIX__A
428 #undef  AUD_DEM_WR_FM_MATRIX__A
429 #endif
430 #define AUD_DEM_WR_FM_MATRIX__A              0x105006F
431
432 /*============================================================================*/
433 /*
434 * \brief Defines required for audio
435 */
436 #define AUD_VOLUME_ZERO_DB                      115
437 #define AUD_VOLUME_DB_MIN                       -60
438 #define AUD_VOLUME_DB_MAX                       12
439 #define AUD_CARRIER_STRENGTH_QP_0DB             0x4000
440 #define AUD_CARRIER_STRENGTH_QP_0DB_LOG10T100   421
441 #define AUD_MAX_AVC_REF_LEVEL                   15
442 #define AUD_I2S_FREQUENCY_MAX                   48000UL
443 #define AUD_I2S_FREQUENCY_MIN                   12000UL
444 #define AUD_RDS_ARRAY_SIZE                      18
445
446 /*
447 * \brief Needed for calculation of prescale feature in AUD
448 */
449 #ifndef DRX_AUD_MAX_FM_DEVIATION
450 #define DRX_AUD_MAX_FM_DEVIATION  (100) /* kHz */
451 #endif
452
453 /*
454 * \brief Needed for calculation of NICAM prescale feature in AUD
455 */
456 #ifndef DRX_AUD_MAX_NICAM_PRESCALE
457 #define DRX_AUD_MAX_NICAM_PRESCALE  (9) /* dB */
458 #endif
459
460 /*============================================================================*/
461 /* Values for I2S Master/Slave pin configurations */
462 #define SIO_PDR_I2S_CL_CFG_MODE__MASTER      0x0004
463 #define SIO_PDR_I2S_CL_CFG_DRIVE__MASTER     0x0008
464 #define SIO_PDR_I2S_CL_CFG_MODE__SLAVE       0x0004
465 #define SIO_PDR_I2S_CL_CFG_DRIVE__SLAVE      0x0000
466
467 #define SIO_PDR_I2S_DA_CFG_MODE__MASTER      0x0003
468 #define SIO_PDR_I2S_DA_CFG_DRIVE__MASTER     0x0008
469 #define SIO_PDR_I2S_DA_CFG_MODE__SLAVE       0x0003
470 #define SIO_PDR_I2S_DA_CFG_DRIVE__SLAVE      0x0008
471
472 #define SIO_PDR_I2S_WS_CFG_MODE__MASTER      0x0004
473 #define SIO_PDR_I2S_WS_CFG_DRIVE__MASTER     0x0008
474 #define SIO_PDR_I2S_WS_CFG_MODE__SLAVE       0x0004
475 #define SIO_PDR_I2S_WS_CFG_DRIVE__SLAVE      0x0000
476
477 /*============================================================================*/
478 /*=== REGISTER ACCESS MACROS =================================================*/
479 /*============================================================================*/
480
481 /*
482 * This macro is used to create byte arrays for block writes.
483 * Block writes speed up I2C traffic between host and demod.
484 * The macro takes care of the required byte order in a 16 bits word.
485 * x -> lowbyte(x), highbyte(x)
486 */
487 #define DRXJ_16TO8(x) ((u8) (((u16)x) & 0xFF)), \
488                        ((u8)((((u16)x)>>8)&0xFF))
489 /*
490 * This macro is used to convert byte array to 16 bit register value for block read.
491 * Block read speed up I2C traffic between host and demod.
492 * The macro takes care of the required byte order in a 16 bits word.
493 */
494 #define DRXJ_8TO16(x) ((u16) (x[0] | (x[1] << 8)))
495
496 /*============================================================================*/
497 /*=== MISC DEFINES ===========================================================*/
498 /*============================================================================*/
499
500 /*============================================================================*/
501 /*=== HI COMMAND RELATED DEFINES =============================================*/
502 /*============================================================================*/
503
504 /*
505 * \brief General maximum number of retries for ucode command interfaces
506 */
507 #define DRXJ_MAX_RETRIES (100)
508
509 /*============================================================================*/
510 /*=== STANDARD RELATED MACROS ================================================*/
511 /*============================================================================*/
512
513 #define DRXJ_ISATVSTD(std) ((std == DRX_STANDARD_PAL_SECAM_BG) || \
514                                (std == DRX_STANDARD_PAL_SECAM_DK) || \
515                                (std == DRX_STANDARD_PAL_SECAM_I) || \
516                                (std == DRX_STANDARD_PAL_SECAM_L) || \
517                                (std == DRX_STANDARD_PAL_SECAM_LP) || \
518                                (std == DRX_STANDARD_NTSC) || \
519                                (std == DRX_STANDARD_FM))
520
521 #define DRXJ_ISQAMSTD(std) ((std == DRX_STANDARD_ITU_A) || \
522                                (std == DRX_STANDARD_ITU_B) || \
523                                (std == DRX_STANDARD_ITU_C) || \
524                                (std == DRX_STANDARD_ITU_D))
525
526 /*-----------------------------------------------------------------------------
527 GLOBAL VARIABLES
528 ----------------------------------------------------------------------------*/
529 /*
530  * DRXJ DAP structures
531  */
532
533 static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
534                                       u32 addr,
535                                       u16 datasize,
536                                       u8 *data, u32 flags);
537
538
539 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
540                                                  u32 waddr,
541                                                  u32 raddr,
542                                                  u16 wdata, u16 *rdata);
543
544 static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
545                                       u32 addr,
546                                       u16 *data, u32 flags);
547
548 static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
549                                       u32 addr,
550                                       u32 *data, u32 flags);
551
552 static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
553                                        u32 addr,
554                                        u16 datasize,
555                                        u8 *data, u32 flags);
556
557 static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
558                                        u32 addr,
559                                        u16 data, u32 flags);
560
561 static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
562                                        u32 addr,
563                                        u32 data, u32 flags);
564
565 static struct drxj_data drxj_data_g = {
566         false,                  /* has_lna : true if LNA (aka PGA) present      */
567         false,                  /* has_oob : true if OOB supported              */
568         false,                  /* has_ntsc: true if NTSC supported             */
569         false,                  /* has_btsc: true if BTSC supported             */
570         false,                  /* has_smatx: true if SMA_TX pin is available   */
571         false,                  /* has_smarx: true if SMA_RX pin is available   */
572         false,                  /* has_gpio : true if GPIO pin is available     */
573         false,                  /* has_irqn : true if IRQN pin is available     */
574         0,                      /* mfx A1/A2/A... */
575
576         /* tuner settings */
577         false,                  /* tuner mirrors RF signal    */
578         /* standard/channel settings */
579         DRX_STANDARD_UNKNOWN,   /* current standard           */
580         DRX_CONSTELLATION_AUTO, /* constellation              */
581         0,                      /* frequency in KHz           */
582         DRX_BANDWIDTH_UNKNOWN,  /* curr_bandwidth              */
583         DRX_MIRROR_NO,          /* mirror                     */
584
585         /* signal quality information: */
586         /* default values taken from the QAM Programming guide */
587         /*   fec_bits_desired should not be less than 4000000    */
588         4000000,                /* fec_bits_desired    */
589         5,                      /* fec_vd_plen         */
590         4,                      /* qam_vd_prescale     */
591         0xFFFF,                 /* qamVDPeriod       */
592         204 * 8,                /* fec_rs_plen annex A */
593         1,                      /* fec_rs_prescale     */
594         FEC_RS_MEASUREMENT_PERIOD,      /* fec_rs_period     */
595         true,                   /* reset_pkt_err_acc    */
596         0,                      /* pkt_err_acc_start    */
597
598         /* HI configuration */
599         0,                      /* hi_cfg_timing_div    */
600         0,                      /* hi_cfg_bridge_delay  */
601         0,                      /* hi_cfg_wake_up_key    */
602         0,                      /* hi_cfg_ctrl         */
603         0,                      /* HICfgTimeout      */
604         /* UIO configuration */
605         DRX_UIO_MODE_DISABLE,   /* uio_sma_rx_mode      */
606         DRX_UIO_MODE_DISABLE,   /* uio_sma_tx_mode      */
607         DRX_UIO_MODE_DISABLE,   /* uioASELMode       */
608         DRX_UIO_MODE_DISABLE,   /* uio_irqn_mode       */
609         /* FS setting */
610         0UL,                    /* iqm_fs_rate_ofs      */
611         false,                  /* pos_image          */
612         /* RC setting */
613         0UL,                    /* iqm_rc_rate_ofs      */
614         /* AUD information */
615 /*   false,                  * flagSetAUDdone    */
616 /*   false,                  * detectedRDS       */
617 /*   true,                   * flagASDRequest    */
618 /*   false,                  * flagHDevClear     */
619 /*   false,                  * flagHDevSet       */
620 /*   (u16) 0xFFF,          * rdsLastCount      */
621
622         /* ATV configuration */
623         0UL,                    /* flags cfg changes */
624         /* shadow of ATV_TOP_EQU0__A */
625         {-5,
626          ATV_TOP_EQU0_EQU_C0_FM,
627          ATV_TOP_EQU0_EQU_C0_L,
628          ATV_TOP_EQU0_EQU_C0_LP,
629          ATV_TOP_EQU0_EQU_C0_BG,
630          ATV_TOP_EQU0_EQU_C0_DK,
631          ATV_TOP_EQU0_EQU_C0_I},
632         /* shadow of ATV_TOP_EQU1__A */
633         {-50,
634          ATV_TOP_EQU1_EQU_C1_FM,
635          ATV_TOP_EQU1_EQU_C1_L,
636          ATV_TOP_EQU1_EQU_C1_LP,
637          ATV_TOP_EQU1_EQU_C1_BG,
638          ATV_TOP_EQU1_EQU_C1_DK,
639          ATV_TOP_EQU1_EQU_C1_I},
640         /* shadow of ATV_TOP_EQU2__A */
641         {210,
642          ATV_TOP_EQU2_EQU_C2_FM,
643          ATV_TOP_EQU2_EQU_C2_L,
644          ATV_TOP_EQU2_EQU_C2_LP,
645          ATV_TOP_EQU2_EQU_C2_BG,
646          ATV_TOP_EQU2_EQU_C2_DK,
647          ATV_TOP_EQU2_EQU_C2_I},
648         /* shadow of ATV_TOP_EQU3__A */
649         {-160,
650          ATV_TOP_EQU3_EQU_C3_FM,
651          ATV_TOP_EQU3_EQU_C3_L,
652          ATV_TOP_EQU3_EQU_C3_LP,
653          ATV_TOP_EQU3_EQU_C3_BG,
654          ATV_TOP_EQU3_EQU_C3_DK,
655          ATV_TOP_EQU3_EQU_C3_I},
656         false,                  /* flag: true=bypass             */
657         ATV_TOP_VID_PEAK__PRE,  /* shadow of ATV_TOP_VID_PEAK__A */
658         ATV_TOP_NOISE_TH__PRE,  /* shadow of ATV_TOP_NOISE_TH__A */
659         true,                   /* flag CVBS ouput enable        */
660         false,                  /* flag SIF ouput enable         */
661         DRXJ_SIF_ATTENUATION_0DB,       /* current SIF att setting       */
662         {                       /* qam_rf_agc_cfg */
663          DRX_STANDARD_ITU_B,    /* standard            */
664          DRX_AGC_CTRL_AUTO,     /* ctrl_mode            */
665          0,                     /* output_level         */
666          0,                     /* min_output_level      */
667          0xFFFF,                /* max_output_level      */
668          0x0000,                /* speed               */
669          0x0000,                /* top                 */
670          0x0000                 /* c.o.c.              */
671          },
672         {                       /* qam_if_agc_cfg */
673          DRX_STANDARD_ITU_B,    /* standard            */
674          DRX_AGC_CTRL_AUTO,     /* ctrl_mode            */
675          0,                     /* output_level         */
676          0,                     /* min_output_level      */
677          0xFFFF,                /* max_output_level      */
678          0x0000,                /* speed               */
679          0x0000,                /* top    (don't care) */
680          0x0000                 /* c.o.c. (don't care) */
681          },
682         {                       /* vsb_rf_agc_cfg */
683          DRX_STANDARD_8VSB,     /* standard       */
684          DRX_AGC_CTRL_AUTO,     /* ctrl_mode       */
685          0,                     /* output_level    */
686          0,                     /* min_output_level */
687          0xFFFF,                /* max_output_level */
688          0x0000,                /* speed          */
689          0x0000,                /* top    (don't care) */
690          0x0000                 /* c.o.c. (don't care) */
691          },
692         {                       /* vsb_if_agc_cfg */
693          DRX_STANDARD_8VSB,     /* standard       */
694          DRX_AGC_CTRL_AUTO,     /* ctrl_mode       */
695          0,                     /* output_level    */
696          0,                     /* min_output_level */
697          0xFFFF,                /* max_output_level */
698          0x0000,                /* speed          */
699          0x0000,                /* top    (don't care) */
700          0x0000                 /* c.o.c. (don't care) */
701          },
702         0,                      /* qam_pga_cfg */
703         0,                      /* vsb_pga_cfg */
704         {                       /* qam_pre_saw_cfg */
705          DRX_STANDARD_ITU_B,    /* standard  */
706          0,                     /* reference */
707          false                  /* use_pre_saw */
708          },
709         {                       /* vsb_pre_saw_cfg */
710          DRX_STANDARD_8VSB,     /* standard  */
711          0,                     /* reference */
712          false                  /* use_pre_saw */
713          },
714
715         /* Version information */
716 #ifndef _CH_
717         {
718          "01234567890",         /* human readable version microcode             */
719          "01234567890"          /* human readable version device specific code  */
720          },
721         {
722          {                      /* struct drx_version for microcode                   */
723           DRX_MODULE_UNKNOWN,
724           (char *)(NULL),
725           0,
726           0,
727           0,
728           (char *)(NULL)
729           },
730          {                      /* struct drx_version for device specific code */
731           DRX_MODULE_UNKNOWN,
732           (char *)(NULL),
733           0,
734           0,
735           0,
736           (char *)(NULL)
737           }
738          },
739         {
740          {                      /* struct drx_version_list for microcode */
741           (struct drx_version *) (NULL),
742           (struct drx_version_list *) (NULL)
743           },
744          {                      /* struct drx_version_list for device specific code */
745           (struct drx_version *) (NULL),
746           (struct drx_version_list *) (NULL)
747           }
748          },
749 #endif
750         false,                  /* smart_ant_inverted */
751         /* Tracking filter setting for OOB  */
752         {
753          12000,
754          9300,
755          6600,
756          5280,
757          3700,
758          3000,
759          2000,
760          0},
761         false,                  /* oob_power_on           */
762         0,                      /* mpeg_ts_static_bitrate  */
763         false,                  /* disable_te_ihandling   */
764         false,                  /* bit_reverse_mpeg_outout */
765         DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO,        /* mpeg_output_clock_rate */
766         DRXJ_MPEG_START_WIDTH_1CLKCYC,  /* mpeg_start_width */
767
768         /* Pre SAW & Agc configuration for ATV */
769         {
770          DRX_STANDARD_NTSC,     /* standard     */
771          7,                     /* reference    */
772          true                   /* use_pre_saw    */
773          },
774         {                       /* ATV RF-AGC */
775          DRX_STANDARD_NTSC,     /* standard              */
776          DRX_AGC_CTRL_AUTO,     /* ctrl_mode              */
777          0,                     /* output_level           */
778          0,                     /* min_output_level (d.c.) */
779          0,                     /* max_output_level (d.c.) */
780          3,                     /* speed                 */
781          9500,                  /* top                   */
782          4000                   /* cut-off current       */
783          },
784         {                       /* ATV IF-AGC */
785          DRX_STANDARD_NTSC,     /* standard              */
786          DRX_AGC_CTRL_AUTO,     /* ctrl_mode              */
787          0,                     /* output_level           */
788          0,                     /* min_output_level (d.c.) */
789          0,                     /* max_output_level (d.c.) */
790          3,                     /* speed                 */
791          2400,                  /* top                   */
792          0                      /* c.o.c.         (d.c.) */
793          },
794         140,                    /* ATV PGA config */
795         0,                      /* curr_symbol_rate */
796
797         false,                  /* pdr_safe_mode     */
798         SIO_PDR_GPIO_CFG__PRE,  /* pdr_safe_restore_val_gpio  */
799         SIO_PDR_VSYNC_CFG__PRE, /* pdr_safe_restore_val_v_sync */
800         SIO_PDR_SMA_RX_CFG__PRE,        /* pdr_safe_restore_val_sma_rx */
801         SIO_PDR_SMA_TX_CFG__PRE,        /* pdr_safe_restore_val_sma_tx */
802
803         4,                      /* oob_pre_saw            */
804         DRXJ_OOB_LO_POW_MINUS10DB,      /* oob_lo_pow             */
805         {
806          false                  /* aud_data, only first member */
807          },
808 };
809
810 /*
811 * \var drxj_default_addr_g
812 * \brief Default I2C address and device identifier.
813 */
814 static struct i2c_device_addr drxj_default_addr_g = {
815         DRXJ_DEF_I2C_ADDR,      /* i2c address */
816         DRXJ_DEF_DEMOD_DEV_ID   /* device id */
817 };
818
819 /*
820 * \var drxj_default_comm_attr_g
821 * \brief Default common attributes of a drxj demodulator instance.
822 */
823 static struct drx_common_attr drxj_default_comm_attr_g = {
824         NULL,                   /* ucode file           */
825         true,                   /* ucode verify switch  */
826         {0},                    /* version record       */
827
828         44000,                  /* IF in kHz in case no tuner instance is used  */
829         (151875 - 0),           /* system clock frequency in kHz                */
830         0,                      /* oscillator frequency kHz                     */
831         0,                      /* oscillator deviation in ppm, signed          */
832         false,                  /* If true mirror frequency spectrum            */
833         {
834          /* MPEG output configuration */
835          true,                  /* If true, enable MPEG ouput    */
836          false,                 /* If true, insert RS byte       */
837          false,                 /* If true, parallel out otherwise serial */
838          false,                 /* If true, invert DATA signals  */
839          false,                 /* If true, invert ERR signal    */
840          false,                 /* If true, invert STR signals   */
841          false,                 /* If true, invert VAL signals   */
842          false,                 /* If true, invert CLK signals   */
843          true,                  /* If true, static MPEG clockrate will
844                                    be used, otherwise clockrate will
845                                    adapt to the bitrate of the TS */
846          19392658UL,            /* Maximum bitrate in b/s in case
847                                    static clockrate is selected */
848          DRX_MPEG_STR_WIDTH_1   /* MPEG Start width in clock cycles */
849          },
850         /* Initilisations below can be omitted, they require no user input and
851            are initialy 0, NULL or false. The compiler will initialize them to these
852            values when omitted.  */
853         false,                  /* is_opened */
854
855         /* SCAN */
856         NULL,                   /* no scan params yet               */
857         0,                      /* current scan index               */
858         0,                      /* next scan frequency              */
859         false,                  /* scan ready flag                  */
860         0,                      /* max channels to scan             */
861         0,                      /* nr of channels scanned           */
862         NULL,                   /* default scan function            */
863         NULL,                   /* default context pointer          */
864         0,                      /* millisec to wait for demod lock  */
865         DRXJ_DEMOD_LOCK,        /* desired lock               */
866         false,
867
868         /* Power management */
869         DRX_POWER_UP,
870
871         /* Tuner */
872         1,                      /* nr of I2C port to wich tuner is     */
873         0L,                     /* minimum RF input frequency, in kHz  */
874         0L,                     /* maximum RF input frequency, in kHz  */
875         false,                  /* Rf Agc Polarity                     */
876         false,                  /* If Agc Polarity                     */
877         false,                  /* tuner slow mode                     */
878
879         {                       /* current channel (all 0)             */
880          0UL                    /* channel.frequency */
881          },
882         DRX_STANDARD_UNKNOWN,   /* current standard */
883         DRX_STANDARD_UNKNOWN,   /* previous standard */
884         DRX_STANDARD_UNKNOWN,   /* di_cache_standard   */
885         false,                  /* use_bootloader */
886         0UL,                    /* capabilities */
887         0                       /* mfx */
888 };
889
890 /*
891 * \var drxj_default_demod_g
892 * \brief Default drxj demodulator instance.
893 */
894 static struct drx_demod_instance drxj_default_demod_g = {
895         &drxj_default_addr_g,   /* i2c address & device id */
896         &drxj_default_comm_attr_g,      /* demod common attributes */
897         &drxj_data_g            /* demod device specific attributes */
898 };
899
900 /*
901 * \brief Default audio data structure for DRK demodulator instance.
902 *
903 * This structure is DRXK specific.
904 *
905 */
906 static struct drx_aud_data drxj_default_aud_data_g = {
907         false,                  /* audio_is_active */
908         DRX_AUD_STANDARD_AUTO,  /* audio_standard  */
909
910         /* i2sdata */
911         {
912          false,                 /* output_enable   */
913          48000,                 /* frequency      */
914          DRX_I2S_MODE_MASTER,   /* mode           */
915          DRX_I2S_WORDLENGTH_32, /* word_length     */
916          DRX_I2S_POLARITY_RIGHT,        /* polarity       */
917          DRX_I2S_FORMAT_WS_WITH_DATA    /* format         */
918          },
919         /* volume            */
920         {
921          true,                  /* mute;          */
922          0,                     /* volume         */
923          DRX_AUD_AVC_OFF,       /* avc_mode        */
924          0,                     /* avc_ref_level    */
925          DRX_AUD_AVC_MAX_GAIN_12DB,     /* avc_max_gain     */
926          DRX_AUD_AVC_MAX_ATTEN_24DB,    /* avc_max_atten    */
927          0,                     /* strength_left   */
928          0                      /* strength_right  */
929          },
930         DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_ON, /* auto_sound */
931         /*  ass_thresholds */
932         {
933          440,                   /* A2    */
934          12,                    /* BTSC  */
935          700,                   /* NICAM */
936          },
937         /* carrier */
938         {
939          /* a */
940          {
941           42,                   /* thres */
942           DRX_NO_CARRIER_NOISE, /* opt   */
943           0,                    /* shift */
944           0                     /* dco   */
945           },
946          /* b */
947          {
948           42,                   /* thres */
949           DRX_NO_CARRIER_MUTE,  /* opt   */
950           0,                    /* shift */
951           0                     /* dco   */
952           },
953
954          },
955         /* mixer */
956         {
957          DRX_AUD_SRC_STEREO_OR_A,       /* source_i2s */
958          DRX_AUD_I2S_MATRIX_STEREO,     /* matrix_i2s */
959          DRX_AUD_FM_MATRIX_SOUND_A      /* matrix_fm  */
960          },
961         DRX_AUD_DEVIATION_NORMAL,       /* deviation */
962         DRX_AUD_AVSYNC_OFF,     /* av_sync */
963
964         /* prescale */
965         {
966          DRX_AUD_MAX_FM_DEVIATION,      /* fm_deviation */
967          DRX_AUD_MAX_NICAM_PRESCALE     /* nicam_gain */
968          },
969         DRX_AUD_FM_DEEMPH_75US, /* deemph */
970         DRX_BTSC_STEREO,        /* btsc_detect */
971         0,                      /* rds_data_counter */
972         false                   /* rds_data_present */
973 };
974
975 /*-----------------------------------------------------------------------------
976 STRUCTURES
977 ----------------------------------------------------------------------------*/
978 struct drxjeq_stat {
979         u16 eq_mse;
980         u8 eq_mode;
981         u8 eq_ctrl;
982         u8 eq_stat;
983 };
984
985 /* HI command */
986 struct drxj_hi_cmd {
987         u16 cmd;
988         u16 param1;
989         u16 param2;
990         u16 param3;
991         u16 param4;
992         u16 param5;
993         u16 param6;
994 };
995
996 /*============================================================================*/
997 /*=== MICROCODE RELATED STRUCTURES ===========================================*/
998 /*============================================================================*/
999
1000 /*
1001  * struct drxu_code_block_hdr - Structure of the microcode block headers
1002  *
1003  * @addr:       Destination address of the data in this block
1004  * @size:       Size of the block data following this header counted in
1005  *              16 bits words
1006  * @CRC:        CRC value of the data block, only valid if CRC flag is
1007  *              set.
1008  */
1009 struct drxu_code_block_hdr {
1010         u32 addr;
1011         u16 size;
1012         u16 flags;
1013         u16 CRC;
1014 };
1015
1016 /*-----------------------------------------------------------------------------
1017 FUNCTIONS
1018 ----------------------------------------------------------------------------*/
1019 /* Some prototypes */
1020 static int
1021 hi_command(struct i2c_device_addr *dev_addr,
1022            const struct drxj_hi_cmd *cmd, u16 *result);
1023
1024 static int
1025 ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat);
1026
1027 static int
1028 ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode);
1029
1030 static int power_down_aud(struct drx_demod_instance *demod);
1031
1032 static int
1033 ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw);
1034
1035 static int
1036 ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain);
1037
1038 /*============================================================================*/
1039 /*============================================================================*/
1040 /*==                          HELPER FUNCTIONS                              ==*/
1041 /*============================================================================*/
1042 /*============================================================================*/
1043
1044
1045 /*============================================================================*/
1046
1047 /*
1048 * \fn u32 frac28(u32 N, u32 D)
1049 * \brief Compute: (1<<28)*N/D
1050 * \param N 32 bits
1051 * \param D 32 bits
1052 * \return (1<<28)*N/D
1053 * This function is used to avoid floating-point calculations as they may
1054 * not be present on the target platform.
1055
1056 * frac28 performs an unsigned 28/28 bits division to 32-bit fixed point
1057 * fraction used for setting the Frequency Shifter registers.
1058 * N and D can hold numbers up to width: 28-bits.
1059 * The 4 bits integer part and the 28 bits fractional part are calculated.
1060
1061 * Usage condition: ((1<<28)*n)/d < ((1<<32)-1) => (n/d) < 15.999
1062
1063 * N: 0...(1<<28)-1 = 268435454
1064 * D: 0...(1<<28)-1
1065 * Q: 0...(1<<32)-1
1066 */
1067 static u32 frac28(u32 N, u32 D)
1068 {
1069         int i = 0;
1070         u32 Q1 = 0;
1071         u32 R0 = 0;
1072
1073         R0 = (N % D) << 4;      /* 32-28 == 4 shifts possible at max */
1074         Q1 = N / D;             /* integer part, only the 4 least significant bits
1075                                    will be visible in the result */
1076
1077         /* division using radix 16, 7 nibbles in the result */
1078         for (i = 0; i < 7; i++) {
1079                 Q1 = (Q1 << 4) | R0 / D;
1080                 R0 = (R0 % D) << 4;
1081         }
1082         /* rounding */
1083         if ((R0 >> 3) >= D)
1084                 Q1++;
1085
1086         return Q1;
1087 }
1088
1089 /*
1090 * \fn u32 log1_times100( u32 x)
1091 * \brief Compute: 100*log10(x)
1092 * \param x 32 bits
1093 * \return 100*log10(x)
1094 *
1095 * 100*log10(x)
1096 * = 100*(log2(x)/log2(10)))
1097 * = (100*(2^15)*log2(x))/((2^15)*log2(10))
1098 * = ((200*(2^15)*log2(x))/((2^15)*log2(10)))/2
1099 * = ((200*(2^15)*(log2(x/y)+log2(y)))/((2^15)*log2(10)))/2
1100 * = ((200*(2^15)*log2(x/y))+(200*(2^15)*log2(y)))/((2^15)*log2(10)))/2
1101 *
1102 * where y = 2^k and 1<= (x/y) < 2
1103 */
1104
1105 static u32 log1_times100(u32 x)
1106 {
1107         static const u8 scale = 15;
1108         static const u8 index_width = 5;
1109         /*
1110            log2lut[n] = (1<<scale) * 200 * log2( 1.0 + ( (1.0/(1<<INDEXWIDTH)) * n ))
1111            0 <= n < ((1<<INDEXWIDTH)+1)
1112          */
1113
1114         static const u32 log2lut[] = {
1115                 0,              /* 0.000000 */
1116                 290941,         /* 290941.300628 */
1117                 573196,         /* 573196.476418 */
1118                 847269,         /* 847269.179851 */
1119                 1113620,        /* 1113620.489452 */
1120                 1372674,        /* 1372673.576986 */
1121                 1624818,        /* 1624817.752104 */
1122                 1870412,        /* 1870411.981536 */
1123                 2109788,        /* 2109787.962654 */
1124                 2343253,        /* 2343252.817465 */
1125                 2571091,        /* 2571091.461923 */
1126                 2793569,        /* 2793568.696416 */
1127                 3010931,        /* 3010931.055901 */
1128                 3223408,        /* 3223408.452106 */
1129                 3431216,        /* 3431215.635215 */
1130                 3634553,        /* 3634553.498355 */
1131                 3833610,        /* 3833610.244726 */
1132                 4028562,        /* 4028562.434393 */
1133                 4219576,        /* 4219575.925308 */
1134                 4406807,        /* 4406806.721144 */
1135                 4590402,        /* 4590401.736809 */
1136                 4770499,        /* 4770499.491025 */
1137                 4947231,        /* 4947230.734179 */
1138                 5120719,        /* 5120719.018555 */
1139                 5291081,        /* 5291081.217197 */
1140                 5458428,        /* 5458427.996830 */
1141                 5622864,        /* 5622864.249668 */
1142                 5784489,        /* 5784489.488298 */
1143                 5943398,        /* 5943398.207380 */
1144                 6099680,        /* 6099680.215452 */
1145                 6253421,        /* 6253420.939751 */
1146                 6404702,        /* 6404701.706649 */
1147                 6553600,        /* 6553600.000000 */
1148         };
1149
1150         u8 i = 0;
1151         u32 y = 0;
1152         u32 d = 0;
1153         u32 k = 0;
1154         u32 r = 0;
1155
1156         if (x == 0)
1157                 return 0;
1158
1159         /* Scale x (normalize) */
1160         /* computing y in log(x/y) = log(x) - log(y) */
1161         if ((x & (((u32) (-1)) << (scale + 1))) == 0) {
1162                 for (k = scale; k > 0; k--) {
1163                         if (x & (((u32) 1) << scale))
1164                                 break;
1165                         x <<= 1;
1166                 }
1167         } else {
1168                 for (k = scale; k < 31; k++) {
1169                         if ((x & (((u32) (-1)) << (scale + 1))) == 0)
1170                                 break;
1171                         x >>= 1;
1172                 }
1173         }
1174         /*
1175            Now x has binary point between bit[scale] and bit[scale-1]
1176            and 1.0 <= x < 2.0 */
1177
1178         /* correction for division: log(x) = log(x/y)+log(y) */
1179         y = k * ((((u32) 1) << scale) * 200);
1180
1181         /* remove integer part */
1182         x &= ((((u32) 1) << scale) - 1);
1183         /* get index */
1184         i = (u8) (x >> (scale - index_width));
1185         /* compute delta (x-a) */
1186         d = x & ((((u32) 1) << (scale - index_width)) - 1);
1187         /* compute log, multiplication ( d* (.. )) must be within range ! */
1188         y += log2lut[i] +
1189             ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - index_width));
1190         /* Conver to log10() */
1191         y /= 108853;            /* (log2(10) << scale) */
1192         r = (y >> 1);
1193         /* rounding */
1194         if (y & ((u32)1))
1195                 r++;
1196
1197         return r;
1198
1199 }
1200
1201 /*
1202 * \fn u32 frac_times1e6( u16 N, u32 D)
1203 * \brief Compute: (N/D) * 1000000.
1204 * \param N nominator 16-bits.
1205 * \param D denominator 32-bits.
1206 * \return u32
1207 * \retval ((N/D) * 1000000), 32 bits
1208 *
1209 * No check on D=0!
1210 */
1211 static u32 frac_times1e6(u32 N, u32 D)
1212 {
1213         u32 remainder = 0;
1214         u32 frac = 0;
1215
1216         /*
1217            frac = (N * 1000000) / D
1218            To let it fit in a 32 bits computation:
1219            frac = (N * (1000000 >> 4)) / (D >> 4)
1220            This would result in a problem in case D < 16 (div by 0).
1221            So we do it more elaborate as shown below.
1222          */
1223         frac = (((u32) N) * (1000000 >> 4)) / D;
1224         frac <<= 4;
1225         remainder = (((u32) N) * (1000000 >> 4)) % D;
1226         remainder <<= 4;
1227         frac += remainder / D;
1228         remainder = remainder % D;
1229         if ((remainder * 2) > D)
1230                 frac++;
1231
1232         return frac;
1233 }
1234
1235 /*============================================================================*/
1236
1237
1238 /*
1239 * \brief Values for NICAM prescaler gain. Computed from dB to integer
1240 *        and rounded. For calc used formula: 16*10^(prescaleGain[dB]/20).
1241 *
1242 */
1243 #if 0
1244 /* Currently, unused as we lack support for analog TV */
1245 static const u16 nicam_presc_table_val[43] = {
1246         1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
1247         5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16,
1248         18, 20, 23, 25, 28, 32, 36, 40, 45,
1249         51, 57, 64, 71, 80, 90, 101, 113, 127
1250 };
1251 #endif
1252
1253 /*============================================================================*/
1254 /*==                        END HELPER FUNCTIONS                            ==*/
1255 /*============================================================================*/
1256
1257 /*============================================================================*/
1258 /*============================================================================*/
1259 /*==                      DRXJ DAP FUNCTIONS                                ==*/
1260 /*============================================================================*/
1261 /*============================================================================*/
1262
1263 /*
1264    This layer takes care of some device specific register access protocols:
1265    -conversion to short address format
1266    -access to audio block
1267    This layer is placed between the drx_dap_fasi and the rest of the drxj
1268    specific implementation. This layer can use address map knowledge whereas
1269    dap_fasi may not use memory map knowledge.
1270
1271    * For audio currently only 16 bits read and write register access is
1272      supported. More is not needed. RMW and 32 or 8 bit access on audio
1273      registers will have undefined behaviour. Flags (RMW, CRC reset, broadcast
1274      single/multi master) will be ignored.
1275
1276    TODO: check ignoring single/multimaster is ok for AUD access ?
1277 */
1278
1279 #define DRXJ_ISAUDWRITE(addr) (((((addr)>>16)&1) == 1) ? true : false)
1280 #define DRXJ_DAP_AUDTRIF_TIMEOUT 80     /* millisec */
1281 /*============================================================================*/
1282
1283 /*
1284 * \fn bool is_handled_by_aud_tr_if( u32 addr )
1285 * \brief Check if this address is handled by the audio token ring interface.
1286 * \param addr
1287 * \return bool
1288 * \retval true  Yes, handled by audio token ring interface
1289 * \retval false No, not handled by audio token ring interface
1290 *
1291 */
1292 static
1293 bool is_handled_by_aud_tr_if(u32 addr)
1294 {
1295         bool retval = false;
1296
1297         if ((DRXDAP_FASI_ADDR2BLOCK(addr) == 4) &&
1298             (DRXDAP_FASI_ADDR2BANK(addr) > 1) &&
1299             (DRXDAP_FASI_ADDR2BANK(addr) < 6)) {
1300                 retval = true;
1301         }
1302
1303         return retval;
1304 }
1305
1306 /*============================================================================*/
1307
1308 int drxbsp_i2c_write_read(struct i2c_device_addr *w_dev_addr,
1309                                  u16 w_count,
1310                                  u8 *wData,
1311                                  struct i2c_device_addr *r_dev_addr,
1312                                  u16 r_count, u8 *r_data)
1313 {
1314         struct drx39xxj_state *state;
1315         struct i2c_msg msg[2];
1316         unsigned int num_msgs;
1317
1318         if (w_dev_addr == NULL) {
1319                 /* Read only */
1320                 state = r_dev_addr->user_data;
1321                 msg[0].addr = r_dev_addr->i2c_addr >> 1;
1322                 msg[0].flags = I2C_M_RD;
1323                 msg[0].buf = r_data;
1324                 msg[0].len = r_count;
1325                 num_msgs = 1;
1326         } else if (r_dev_addr == NULL) {
1327                 /* Write only */
1328                 state = w_dev_addr->user_data;
1329                 msg[0].addr = w_dev_addr->i2c_addr >> 1;
1330                 msg[0].flags = 0;
1331                 msg[0].buf = wData;
1332                 msg[0].len = w_count;
1333                 num_msgs = 1;
1334         } else {
1335                 /* Both write and read */
1336                 state = w_dev_addr->user_data;
1337                 msg[0].addr = w_dev_addr->i2c_addr >> 1;
1338                 msg[0].flags = 0;
1339                 msg[0].buf = wData;
1340                 msg[0].len = w_count;
1341                 msg[1].addr = r_dev_addr->i2c_addr >> 1;
1342                 msg[1].flags = I2C_M_RD;
1343                 msg[1].buf = r_data;
1344                 msg[1].len = r_count;
1345                 num_msgs = 2;
1346         }
1347
1348         if (state->i2c == NULL) {
1349                 pr_err("i2c was zero, aborting\n");
1350                 return 0;
1351         }
1352         if (i2c_transfer(state->i2c, msg, num_msgs) != num_msgs) {
1353                 pr_warn("drx3933: I2C write/read failed\n");
1354                 return -EREMOTEIO;
1355         }
1356
1357 #ifdef DJH_DEBUG
1358         if (w_dev_addr == NULL || r_dev_addr == NULL)
1359                 return 0;
1360
1361         state = w_dev_addr->user_data;
1362
1363         if (state->i2c == NULL)
1364                 return 0;
1365
1366         msg[0].addr = w_dev_addr->i2c_addr;
1367         msg[0].flags = 0;
1368         msg[0].buf = wData;
1369         msg[0].len = w_count;
1370         msg[1].addr = r_dev_addr->i2c_addr;
1371         msg[1].flags = I2C_M_RD;
1372         msg[1].buf = r_data;
1373         msg[1].len = r_count;
1374         num_msgs = 2;
1375
1376         pr_debug("drx3933 i2c operation addr=%x i2c=%p, wc=%x rc=%x\n",
1377                w_dev_addr->i2c_addr, state->i2c, w_count, r_count);
1378
1379         if (i2c_transfer(state->i2c, msg, 2) != 2) {
1380                 pr_warn("drx3933: I2C write/read failed\n");
1381                 return -EREMOTEIO;
1382         }
1383 #endif
1384         return 0;
1385 }
1386
1387 /*============================================================================*/
1388
1389 /*****************************
1390 *
1391 * int drxdap_fasi_read_block (
1392 *      struct i2c_device_addr *dev_addr,      -- address of I2C device
1393 *      u32 addr,         -- address of chip register/memory
1394 *      u16            datasize,     -- number of bytes to read
1395 *      u8 *data,         -- data to receive
1396 *      u32 flags)        -- special device flags
1397 *
1398 * Read block data from chip address. Because the chip is word oriented,
1399 * the number of bytes to read must be even.
1400 *
1401 * Make sure that the buffer to receive the data is large enough.
1402 *
1403 * Although this function expects an even number of bytes, it is still byte
1404 * oriented, and the data read back is NOT translated to the endianness of
1405 * the target platform.
1406 *
1407 * Output:
1408 * - 0     if reading was successful
1409 *                  in that case: data read is in *data.
1410 * - -EIO  if anything went wrong
1411 *
1412 ******************************/
1413
1414 static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
1415                                          u32 addr,
1416                                          u16 datasize,
1417                                          u8 *data, u32 flags)
1418 {
1419         u8 buf[4];
1420         u16 bufx;
1421         int rc;
1422         u16 overhead_size = 0;
1423
1424         /* Check parameters ******************************************************* */
1425         if (dev_addr == NULL)
1426                 return -EINVAL;
1427
1428         overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
1429             (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
1430
1431         if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
1432             ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
1433              DRXDAP_FASI_LONG_FORMAT(addr)) ||
1434             (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) ||
1435             ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1)) {
1436                 return -EINVAL;
1437         }
1438
1439         /* ReadModifyWrite & mode flag bits are not allowed */
1440         flags &= (~DRXDAP_FASI_RMW & ~DRXDAP_FASI_MODEFLAGS);
1441 #if DRXDAP_SINGLE_MASTER
1442         flags |= DRXDAP_FASI_SINGLE_MASTER;
1443 #endif
1444
1445         /* Read block from I2C **************************************************** */
1446         do {
1447                 u16 todo = (datasize < DRXDAP_MAX_RCHUNKSIZE ?
1448                               datasize : DRXDAP_MAX_RCHUNKSIZE);
1449
1450                 bufx = 0;
1451
1452                 addr &= ~DRXDAP_FASI_FLAGS;
1453                 addr |= flags;
1454
1455 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1456                 /* short format address preferred but long format otherwise */
1457                 if (DRXDAP_FASI_LONG_FORMAT(addr)) {
1458 #endif
1459 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1460                         buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01);
1461                         buf[bufx++] = (u8) ((addr >> 16) & 0xFF);
1462                         buf[bufx++] = (u8) ((addr >> 24) & 0xFF);
1463                         buf[bufx++] = (u8) ((addr >> 7) & 0xFF);
1464 #endif
1465 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1466                 } else {
1467 #endif
1468 #if (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)
1469                         buf[bufx++] = (u8) ((addr << 1) & 0xFF);
1470                         buf[bufx++] =
1471                             (u8) (((addr >> 16) & 0x0F) |
1472                                     ((addr >> 18) & 0xF0));
1473 #endif
1474 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1475                 }
1476 #endif
1477
1478 #if DRXDAP_SINGLE_MASTER
1479                 /*
1480                  * In single master mode, split the read and write actions.
1481                  * No special action is needed for write chunks here.
1482                  */
1483                 rc = drxbsp_i2c_write_read(dev_addr, bufx, buf,
1484                                            NULL, 0, NULL);
1485                 if (rc == 0)
1486                         rc = drxbsp_i2c_write_read(NULL, 0, NULL, dev_addr, todo, data);
1487 #else
1488                 /* In multi master mode, do everything in one RW action */
1489                 rc = drxbsp_i2c_write_read(dev_addr, bufx, buf, dev_addr, todo,
1490                                           data);
1491 #endif
1492                 data += todo;
1493                 addr += (todo >> 1);
1494                 datasize -= todo;
1495         } while (datasize && rc == 0);
1496
1497         return rc;
1498 }
1499
1500
1501 /*****************************
1502 *
1503 * int drxdap_fasi_read_reg16 (
1504 *     struct i2c_device_addr *dev_addr, -- address of I2C device
1505 *     u32 addr,    -- address of chip register/memory
1506 *     u16 *data,    -- data to receive
1507 *     u32 flags)   -- special device flags
1508 *
1509 * Read one 16-bit register or memory location. The data received back is
1510 * converted back to the target platform's endianness.
1511 *
1512 * Output:
1513 * - 0     if reading was successful
1514 *                  in that case: read data is at *data
1515 * - -EIO  if anything went wrong
1516 *
1517 ******************************/
1518
1519 static int drxdap_fasi_read_reg16(struct i2c_device_addr *dev_addr,
1520                                          u32 addr,
1521                                          u16 *data, u32 flags)
1522 {
1523         u8 buf[sizeof(*data)];
1524         int rc;
1525
1526         if (!data)
1527                 return -EINVAL;
1528
1529         rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags);
1530         *data = buf[0] + (((u16) buf[1]) << 8);
1531         return rc;
1532 }
1533
1534 /*****************************
1535 *
1536 * int drxdap_fasi_read_reg32 (
1537 *     struct i2c_device_addr *dev_addr, -- address of I2C device
1538 *     u32 addr,    -- address of chip register/memory
1539 *     u32 *data,    -- data to receive
1540 *     u32 flags)   -- special device flags
1541 *
1542 * Read one 32-bit register or memory location. The data received back is
1543 * converted back to the target platform's endianness.
1544 *
1545 * Output:
1546 * - 0     if reading was successful
1547 *                  in that case: read data is at *data
1548 * - -EIO  if anything went wrong
1549 *
1550 ******************************/
1551
1552 static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
1553                                          u32 addr,
1554                                          u32 *data, u32 flags)
1555 {
1556         u8 buf[sizeof(*data)];
1557         int rc;
1558
1559         if (!data)
1560                 return -EINVAL;
1561
1562         rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags);
1563         *data = (((u32) buf[0]) << 0) +
1564             (((u32) buf[1]) << 8) +
1565             (((u32) buf[2]) << 16) + (((u32) buf[3]) << 24);
1566         return rc;
1567 }
1568
1569 /*****************************
1570 *
1571 * int drxdap_fasi_write_block (
1572 *      struct i2c_device_addr *dev_addr,    -- address of I2C device
1573 *      u32 addr,       -- address of chip register/memory
1574 *      u16            datasize,   -- number of bytes to read
1575 *      u8 *data,       -- data to receive
1576 *      u32 flags)      -- special device flags
1577 *
1578 * Write block data to chip address. Because the chip is word oriented,
1579 * the number of bytes to write must be even.
1580 *
1581 * Although this function expects an even number of bytes, it is still byte
1582 * oriented, and the data being written is NOT translated from the endianness of
1583 * the target platform.
1584 *
1585 * Output:
1586 * - 0     if writing was successful
1587 * - -EIO  if anything went wrong
1588 *
1589 ******************************/
1590
1591 static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
1592                                           u32 addr,
1593                                           u16 datasize,
1594                                           u8 *data, u32 flags)
1595 {
1596         u8 buf[DRXDAP_MAX_WCHUNKSIZE];
1597         int st = -EIO;
1598         int first_err = 0;
1599         u16 overhead_size = 0;
1600         u16 block_size = 0;
1601
1602         /* Check parameters ******************************************************* */
1603         if (dev_addr == NULL)
1604                 return -EINVAL;
1605
1606         overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
1607             (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
1608
1609         if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
1610             ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
1611              DRXDAP_FASI_LONG_FORMAT(addr)) ||
1612             (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) ||
1613             ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1))
1614                 return -EINVAL;
1615
1616         flags &= DRXDAP_FASI_FLAGS;
1617         flags &= ~DRXDAP_FASI_MODEFLAGS;
1618 #if DRXDAP_SINGLE_MASTER
1619         flags |= DRXDAP_FASI_SINGLE_MASTER;
1620 #endif
1621
1622         /* Write block to I2C ***************************************************** */
1623         block_size = ((DRXDAP_MAX_WCHUNKSIZE) - overhead_size) & ~1;
1624         do {
1625                 u16 todo = 0;
1626                 u16 bufx = 0;
1627
1628                 /* Buffer device address */
1629                 addr &= ~DRXDAP_FASI_FLAGS;
1630                 addr |= flags;
1631 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1632                 /* short format address preferred but long format otherwise */
1633                 if (DRXDAP_FASI_LONG_FORMAT(addr)) {
1634 #endif
1635 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1)
1636                         buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01);
1637                         buf[bufx++] = (u8) ((addr >> 16) & 0xFF);
1638                         buf[bufx++] = (u8) ((addr >> 24) & 0xFF);
1639                         buf[bufx++] = (u8) ((addr >> 7) & 0xFF);
1640 #endif
1641 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1642                 } else {
1643 #endif
1644 #if ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1)
1645                         buf[bufx++] = (u8) ((addr << 1) & 0xFF);
1646                         buf[bufx++] =
1647                             (u8) (((addr >> 16) & 0x0F) |
1648                                     ((addr >> 18) & 0xF0));
1649 #endif
1650 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1651                 }
1652 #endif
1653
1654                 /*
1655                    In single master mode block_size can be 0. In such a case this I2C
1656                    sequense will be visible: (1) write address {i2c addr,
1657                    4 bytes chip address} (2) write data {i2c addr, 4 bytes data }
1658                    (3) write address (4) write data etc...
1659                    Address must be rewriten because HI is reset after data transport and
1660                    expects an address.
1661                  */
1662                 todo = (block_size < datasize ? block_size : datasize);
1663                 if (todo == 0) {
1664                         u16 overhead_size_i2c_addr = 0;
1665                         u16 data_block_size = 0;
1666
1667                         overhead_size_i2c_addr =
1668                             (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1);
1669                         data_block_size =
1670                             (DRXDAP_MAX_WCHUNKSIZE - overhead_size_i2c_addr) & ~1;
1671
1672                         /* write device address */
1673                         st = drxbsp_i2c_write_read(dev_addr,
1674                                                   (u16) (bufx),
1675                                                   buf,
1676                                                   (struct i2c_device_addr *)(NULL),
1677                                                   0, (u8 *)(NULL));
1678
1679                         if ((st != 0) && (first_err == 0)) {
1680                                 /* at the end, return the first error encountered */
1681                                 first_err = st;
1682                         }
1683                         bufx = 0;
1684                         todo =
1685                             (data_block_size <
1686                              datasize ? data_block_size : datasize);
1687                 }
1688                 memcpy(&buf[bufx], data, todo);
1689                 /* write (address if can do and) data */
1690                 st = drxbsp_i2c_write_read(dev_addr,
1691                                           (u16) (bufx + todo),
1692                                           buf,
1693                                           (struct i2c_device_addr *)(NULL),
1694                                           0, (u8 *)(NULL));
1695
1696                 if ((st != 0) && (first_err == 0)) {
1697                         /* at the end, return the first error encountered */
1698                         first_err = st;
1699                 }
1700                 datasize -= todo;
1701                 data += todo;
1702                 addr += (todo >> 1);
1703         } while (datasize);
1704
1705         return first_err;
1706 }
1707
1708 /*****************************
1709 *
1710 * int drxdap_fasi_write_reg16 (
1711 *     struct i2c_device_addr *dev_addr, -- address of I2C device
1712 *     u32 addr,    -- address of chip register/memory
1713 *     u16            data,    -- data to send
1714 *     u32 flags)   -- special device flags
1715 *
1716 * Write one 16-bit register or memory location. The data being written is
1717 * converted from the target platform's endianness to little endian.
1718 *
1719 * Output:
1720 * - 0     if writing was successful
1721 * - -EIO  if anything went wrong
1722 *
1723 ******************************/
1724
1725 static int drxdap_fasi_write_reg16(struct i2c_device_addr *dev_addr,
1726                                           u32 addr,
1727                                           u16 data, u32 flags)
1728 {
1729         u8 buf[sizeof(data)];
1730
1731         buf[0] = (u8) ((data >> 0) & 0xFF);
1732         buf[1] = (u8) ((data >> 8) & 0xFF);
1733
1734         return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
1735 }
1736
1737 /*****************************
1738 *
1739 * int drxdap_fasi_read_modify_write_reg16 (
1740 *      struct i2c_device_addr *dev_addr,   -- address of I2C device
1741 *      u32 waddr,     -- address of chip register/memory
1742 *      u32 raddr,     -- chip address to read back from
1743 *      u16            wdata,     -- data to send
1744 *      u16 *rdata)     -- data to receive back
1745 *
1746 * Write 16-bit data, then read back the original contents of that location.
1747 * Requires long addressing format to be allowed.
1748 *
1749 * Before sending data, the data is converted to little endian. The
1750 * data received back is converted back to the target platform's endianness.
1751 *
1752 * WARNING: This function is only guaranteed to work if there is one
1753 * master on the I2C bus.
1754 *
1755 * Output:
1756 * - 0     if reading was successful
1757 *                  in that case: read back data is at *rdata
1758 * - -EIO  if anything went wrong
1759 *
1760 ******************************/
1761
1762 static int drxdap_fasi_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
1763                                                     u32 waddr,
1764                                                     u32 raddr,
1765                                                     u16 wdata, u16 *rdata)
1766 {
1767         int rc = -EIO;
1768
1769 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1770         if (rdata == NULL)
1771                 return -EINVAL;
1772
1773         rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata, DRXDAP_FASI_RMW);
1774         if (rc == 0)
1775                 rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata, 0);
1776 #endif
1777
1778         return rc;
1779 }
1780
1781 /*****************************
1782 *
1783 * int drxdap_fasi_write_reg32 (
1784 *     struct i2c_device_addr *dev_addr, -- address of I2C device
1785 *     u32 addr,    -- address of chip register/memory
1786 *     u32            data,    -- data to send
1787 *     u32 flags)   -- special device flags
1788 *
1789 * Write one 32-bit register or memory location. The data being written is
1790 * converted from the target platform's endianness to little endian.
1791 *
1792 * Output:
1793 * - 0     if writing was successful
1794 * - -EIO  if anything went wrong
1795 *
1796 ******************************/
1797
1798 static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
1799                                           u32 addr,
1800                                           u32 data, u32 flags)
1801 {
1802         u8 buf[sizeof(data)];
1803
1804         buf[0] = (u8) ((data >> 0) & 0xFF);
1805         buf[1] = (u8) ((data >> 8) & 0xFF);
1806         buf[2] = (u8) ((data >> 16) & 0xFF);
1807         buf[3] = (u8) ((data >> 24) & 0xFF);
1808
1809         return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
1810 }
1811
1812 /*============================================================================*/
1813
1814 /*
1815 * \fn int drxj_dap_rm_write_reg16short
1816 * \brief Read modify write 16 bits audio register using short format only.
1817 * \param dev_addr
1818 * \param waddr    Address to write to
1819 * \param raddr    Address to read from (usually SIO_HI_RA_RAM_S0_RMWBUF__A)
1820 * \param wdata    Data to write
1821 * \param rdata    Buffer for data to read
1822 * \return int
1823 * \retval 0 Succes
1824 * \retval -EIO Timeout, I2C error, illegal bank
1825 *
1826 * 16 bits register read modify write access using short addressing format only.
1827 * Requires knowledge of the registermap, thus device dependent.
1828 * Using DAP FASI directly to avoid endless recursion of RMWs to audio registers.
1829 *
1830 */
1831
1832 /* TODO correct define should be #if ( DRXDAPFASI_SHORT_ADDR_ALLOWED==1 )
1833    See comments drxj_dap_read_modify_write_reg16 */
1834 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 0)
1835 static int drxj_dap_rm_write_reg16short(struct i2c_device_addr *dev_addr,
1836                                               u32 waddr,
1837                                               u32 raddr,
1838                                               u16 wdata, u16 *rdata)
1839 {
1840         int rc;
1841
1842         if (rdata == NULL)
1843                 return -EINVAL;
1844
1845         /* Set RMW flag */
1846         rc = drxdap_fasi_write_reg16(dev_addr,
1847                                               SIO_HI_RA_RAM_S0_FLG_ACC__A,
1848                                               SIO_HI_RA_RAM_S0_FLG_ACC_S0_RWM__M,
1849                                               0x0000);
1850         if (rc == 0) {
1851                 /* Write new data: triggers RMW */
1852                 rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata,
1853                                                       0x0000);
1854         }
1855         if (rc == 0) {
1856                 /* Read old data */
1857                 rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata,
1858                                                      0x0000);
1859         }
1860         if (rc == 0) {
1861                 /* Reset RMW flag */
1862                 rc = drxdap_fasi_write_reg16(dev_addr,
1863                                                       SIO_HI_RA_RAM_S0_FLG_ACC__A,
1864                                                       0, 0x0000);
1865         }
1866
1867         return rc;
1868 }
1869 #endif
1870
1871 /*============================================================================*/
1872
1873 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
1874                                                  u32 waddr,
1875                                                  u32 raddr,
1876                                                  u16 wdata, u16 *rdata)
1877 {
1878         /* TODO: correct short/long addressing format decision,
1879            now long format has higher prio then short because short also
1880            needs virt bnks (not impl yet) for certain audio registers */
1881 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1882         return drxdap_fasi_read_modify_write_reg16(dev_addr,
1883                                                           waddr,
1884                                                           raddr, wdata, rdata);
1885 #else
1886         return drxj_dap_rm_write_reg16short(dev_addr, waddr, raddr, wdata, rdata);
1887 #endif
1888 }
1889
1890
1891 /*============================================================================*/
1892
1893 /*
1894 * \fn int drxj_dap_read_aud_reg16
1895 * \brief Read 16 bits audio register
1896 * \param dev_addr
1897 * \param addr
1898 * \param data
1899 * \return int
1900 * \retval 0 Succes
1901 * \retval -EIO Timeout, I2C error, illegal bank
1902 *
1903 * 16 bits register read access via audio token ring interface.
1904 *
1905 */
1906 static int drxj_dap_read_aud_reg16(struct i2c_device_addr *dev_addr,
1907                                          u32 addr, u16 *data)
1908 {
1909         u32 start_timer = 0;
1910         u32 current_timer = 0;
1911         u32 delta_timer = 0;
1912         u16 tr_status = 0;
1913         int stat = -EIO;
1914
1915         /* No read possible for bank 3, return with error */
1916         if (DRXDAP_FASI_ADDR2BANK(addr) == 3) {
1917                 stat = -EINVAL;
1918         } else {
1919                 const u32 write_bit = ((dr_xaddr_t) 1) << 16;
1920
1921                 /* Force reset write bit */
1922                 addr &= (~write_bit);
1923
1924                 /* Set up read */
1925                 start_timer = jiffies_to_msecs(jiffies);
1926                 do {
1927                         /* RMW to aud TR IF until request is granted or timeout */
1928                         stat = drxj_dap_read_modify_write_reg16(dev_addr,
1929                                                              addr,
1930                                                              SIO_HI_RA_RAM_S0_RMWBUF__A,
1931                                                              0x0000, &tr_status);
1932
1933                         if (stat != 0)
1934                                 break;
1935
1936                         current_timer = jiffies_to_msecs(jiffies);
1937                         delta_timer = current_timer - start_timer;
1938                         if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
1939                                 stat = -EIO;
1940                                 break;
1941                         }
1942
1943                 } while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) ==
1944                           AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) ||
1945                          ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) ==
1946                           AUD_TOP_TR_CTR_FIFO_FULL_FULL));
1947         }                       /* if ( DRXDAP_FASI_ADDR2BANK(addr)!=3 ) */
1948
1949         /* Wait for read ready status or timeout */
1950         if (stat == 0) {
1951                 start_timer = jiffies_to_msecs(jiffies);
1952
1953                 while ((tr_status & AUD_TOP_TR_CTR_FIFO_RD_RDY__M) !=
1954                        AUD_TOP_TR_CTR_FIFO_RD_RDY_READY) {
1955                         stat = drxj_dap_read_reg16(dev_addr,
1956                                                   AUD_TOP_TR_CTR__A,
1957                                                   &tr_status, 0x0000);
1958                         if (stat != 0)
1959                                 break;
1960
1961                         current_timer = jiffies_to_msecs(jiffies);
1962                         delta_timer = current_timer - start_timer;
1963                         if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
1964                                 stat = -EIO;
1965                                 break;
1966                         }
1967                 }               /* while ( ... ) */
1968         }
1969
1970         /* Read value */
1971         if (stat == 0)
1972                 stat = drxj_dap_read_modify_write_reg16(dev_addr,
1973                                                      AUD_TOP_TR_RD_REG__A,
1974                                                      SIO_HI_RA_RAM_S0_RMWBUF__A,
1975                                                      0x0000, data);
1976         return stat;
1977 }
1978
1979 /*============================================================================*/
1980
1981 static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
1982                                       u32 addr,
1983                                       u16 *data, u32 flags)
1984 {
1985         int stat = -EIO;
1986
1987         /* Check param */
1988         if ((dev_addr == NULL) || (data == NULL))
1989                 return -EINVAL;
1990
1991         if (is_handled_by_aud_tr_if(addr))
1992                 stat = drxj_dap_read_aud_reg16(dev_addr, addr, data);
1993         else
1994                 stat = drxdap_fasi_read_reg16(dev_addr, addr, data, flags);
1995
1996         return stat;
1997 }
1998 /*============================================================================*/
1999
2000 /*
2001 * \fn int drxj_dap_write_aud_reg16
2002 * \brief Write 16 bits audio register
2003 * \param dev_addr
2004 * \param addr
2005 * \param data
2006 * \return int
2007 * \retval 0 Succes
2008 * \retval -EIO Timeout, I2C error, illegal bank
2009 *
2010 * 16 bits register write access via audio token ring interface.
2011 *
2012 */
2013 static int drxj_dap_write_aud_reg16(struct i2c_device_addr *dev_addr,
2014                                           u32 addr, u16 data)
2015 {
2016         int stat = -EIO;
2017
2018         /* No write possible for bank 2, return with error */
2019         if (DRXDAP_FASI_ADDR2BANK(addr) == 2) {
2020                 stat = -EINVAL;
2021         } else {
2022                 u32 start_timer = 0;
2023                 u32 current_timer = 0;
2024                 u32 delta_timer = 0;
2025                 u16 tr_status = 0;
2026                 const u32 write_bit = ((dr_xaddr_t) 1) << 16;
2027
2028                 /* Force write bit */
2029                 addr |= write_bit;
2030                 start_timer = jiffies_to_msecs(jiffies);
2031                 do {
2032                         /* RMW to aud TR IF until request is granted or timeout */
2033                         stat = drxj_dap_read_modify_write_reg16(dev_addr,
2034                                                              addr,
2035                                                              SIO_HI_RA_RAM_S0_RMWBUF__A,
2036                                                              data, &tr_status);
2037                         if (stat != 0)
2038                                 break;
2039
2040                         current_timer = jiffies_to_msecs(jiffies);
2041                         delta_timer = current_timer - start_timer;
2042                         if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
2043                                 stat = -EIO;
2044                                 break;
2045                         }
2046
2047                 } while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) ==
2048                           AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) ||
2049                          ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) ==
2050                           AUD_TOP_TR_CTR_FIFO_FULL_FULL));
2051
2052         }                       /* if ( DRXDAP_FASI_ADDR2BANK(addr)!=2 ) */
2053
2054         return stat;
2055 }
2056
2057 /*============================================================================*/
2058
2059 static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
2060                                        u32 addr,
2061                                        u16 data, u32 flags)
2062 {
2063         int stat = -EIO;
2064
2065         /* Check param */
2066         if (dev_addr == NULL)
2067                 return -EINVAL;
2068
2069         if (is_handled_by_aud_tr_if(addr))
2070                 stat = drxj_dap_write_aud_reg16(dev_addr, addr, data);
2071         else
2072                 stat = drxdap_fasi_write_reg16(dev_addr,
2073                                                             addr, data, flags);
2074
2075         return stat;
2076 }
2077
2078 /*============================================================================*/
2079
2080 /* Free data ram in SIO HI */
2081 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2082 #define SIO_HI_RA_RAM_USR_END__A   0x420060
2083
2084 #define DRXJ_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2085 #define DRXJ_HI_ATOMIC_BUF_END   (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2086 #define DRXJ_HI_ATOMIC_READ      SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2087 #define DRXJ_HI_ATOMIC_WRITE     SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2088
2089 /*
2090 * \fn int drxj_dap_atomic_read_write_block()
2091 * \brief Basic access routine for atomic read or write access
2092 * \param dev_addr  pointer to i2c dev address
2093 * \param addr     destination/source address
2094 * \param datasize size of data buffer in bytes
2095 * \param data     pointer to data buffer
2096 * \return int
2097 * \retval 0 Succes
2098 * \retval -EIO Timeout, I2C error, illegal bank
2099 *
2100 */
2101 static
2102 int drxj_dap_atomic_read_write_block(struct i2c_device_addr *dev_addr,
2103                                           u32 addr,
2104                                           u16 datasize,
2105                                           u8 *data, bool read_flag)
2106 {
2107         struct drxj_hi_cmd hi_cmd;
2108         int rc;
2109         u16 word;
2110         u16 dummy = 0;
2111         u16 i = 0;
2112
2113         /* Parameter check */
2114         if (!data || !dev_addr || ((datasize % 2)) || ((datasize / 2) > 8))
2115                 return -EINVAL;
2116
2117         /* Set up HI parameters to read or write n bytes */
2118         hi_cmd.cmd = SIO_HI_RA_RAM_CMD_ATOMIC_COPY;
2119         hi_cmd.param1 =
2120             (u16) ((DRXDAP_FASI_ADDR2BLOCK(DRXJ_HI_ATOMIC_BUF_START) << 6) +
2121                      DRXDAP_FASI_ADDR2BANK(DRXJ_HI_ATOMIC_BUF_START));
2122         hi_cmd.param2 =
2123             (u16) DRXDAP_FASI_ADDR2OFFSET(DRXJ_HI_ATOMIC_BUF_START);
2124         hi_cmd.param3 = (u16) ((datasize / 2) - 1);
2125         if (!read_flag)
2126                 hi_cmd.param3 |= DRXJ_HI_ATOMIC_WRITE;
2127         else
2128                 hi_cmd.param3 |= DRXJ_HI_ATOMIC_READ;
2129         hi_cmd.param4 = (u16) ((DRXDAP_FASI_ADDR2BLOCK(addr) << 6) +
2130                                 DRXDAP_FASI_ADDR2BANK(addr));
2131         hi_cmd.param5 = (u16) DRXDAP_FASI_ADDR2OFFSET(addr);
2132
2133         if (!read_flag) {
2134                 /* write data to buffer */
2135                 for (i = 0; i < (datasize / 2); i++) {
2136
2137                         word = ((u16) data[2 * i]);
2138                         word += (((u16) data[(2 * i) + 1]) << 8);
2139                         drxj_dap_write_reg16(dev_addr,
2140                                              (DRXJ_HI_ATOMIC_BUF_START + i),
2141                                             word, 0);
2142                 }
2143         }
2144
2145         rc = hi_command(dev_addr, &hi_cmd, &dummy);
2146         if (rc != 0) {
2147                 pr_err("error %d\n", rc);
2148                 goto rw_error;
2149         }
2150
2151         if (read_flag) {
2152                 /* read data from buffer */
2153                 for (i = 0; i < (datasize / 2); i++) {
2154                         rc = drxj_dap_read_reg16(dev_addr,
2155                                                  (DRXJ_HI_ATOMIC_BUF_START + i),
2156                                                  &word, 0);
2157                         if (rc) {
2158                                 pr_err("error %d\n", rc);
2159                                 goto rw_error;
2160                         }
2161                         data[2 * i] = (u8) (word & 0xFF);
2162                         data[(2 * i) + 1] = (u8) (word >> 8);
2163                 }
2164         }
2165
2166         return 0;
2167
2168 rw_error:
2169         return rc;
2170
2171 }
2172
2173 /*============================================================================*/
2174
2175 /*
2176 * \fn int drxj_dap_atomic_read_reg32()
2177 * \brief Atomic read of 32 bits words
2178 */
2179 static
2180 int drxj_dap_atomic_read_reg32(struct i2c_device_addr *dev_addr,
2181                                      u32 addr,
2182                                      u32 *data, u32 flags)
2183 {
2184         u8 buf[sizeof(*data)] = { 0 };
2185         int rc = -EIO;
2186         u32 word = 0;
2187
2188         if (!data)
2189                 return -EINVAL;
2190
2191         rc = drxj_dap_atomic_read_write_block(dev_addr, addr,
2192                                               sizeof(*data), buf, true);
2193
2194         if (rc < 0)
2195                 return 0;
2196
2197         word = (u32) buf[3];
2198         word <<= 8;
2199         word |= (u32) buf[2];
2200         word <<= 8;
2201         word |= (u32) buf[1];
2202         word <<= 8;
2203         word |= (u32) buf[0];
2204
2205         *data = word;
2206
2207         return rc;
2208 }
2209
2210 /*============================================================================*/
2211
2212 /*============================================================================*/
2213 /*==                        END DRXJ DAP FUNCTIONS                          ==*/
2214 /*============================================================================*/
2215
2216 /*============================================================================*/
2217 /*============================================================================*/
2218 /*==                      HOST INTERFACE FUNCTIONS                          ==*/
2219 /*============================================================================*/
2220 /*============================================================================*/
2221
2222 /*
2223 * \fn int hi_cfg_command()
2224 * \brief Configure HI with settings stored in the demod structure.
2225 * \param demod Demodulator.
2226 * \return int.
2227 *
2228 * This routine was created because to much orthogonal settings have
2229 * been put into one HI API function (configure). Especially the I2C bridge
2230 * enable/disable should not need re-configuration of the HI.
2231 *
2232 */
2233 static int hi_cfg_command(const struct drx_demod_instance *demod)
2234 {
2235         struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2236         struct drxj_hi_cmd hi_cmd;
2237         u16 result = 0;
2238         int rc;
2239
2240         ext_attr = (struct drxj_data *) demod->my_ext_attr;
2241
2242         hi_cmd.cmd = SIO_HI_RA_RAM_CMD_CONFIG;
2243         hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
2244         hi_cmd.param2 = ext_attr->hi_cfg_timing_div;
2245         hi_cmd.param3 = ext_attr->hi_cfg_bridge_delay;
2246         hi_cmd.param4 = ext_attr->hi_cfg_wake_up_key;
2247         hi_cmd.param5 = ext_attr->hi_cfg_ctrl;
2248         hi_cmd.param6 = ext_attr->hi_cfg_transmit;
2249
2250         rc = hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
2251         if (rc != 0) {
2252                 pr_err("error %d\n", rc);
2253                 goto rw_error;
2254         }
2255
2256         /* Reset power down flag (set one call only) */
2257         ext_attr->hi_cfg_ctrl &= (~(SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2258
2259         return 0;
2260
2261 rw_error:
2262         return rc;
2263 }
2264
2265 /*
2266 * \fn int hi_command()
2267 * \brief Configure HI with settings stored in the demod structure.
2268 * \param dev_addr I2C address.
2269 * \param cmd HI command.
2270 * \param result HI command result.
2271 * \return int.
2272 *
2273 * Sends command to HI
2274 *
2275 */
2276 static int
2277 hi_command(struct i2c_device_addr *dev_addr, const struct drxj_hi_cmd *cmd, u16 *result)
2278 {
2279         u16 wait_cmd = 0;
2280         u16 nr_retries = 0;
2281         bool powerdown_cmd = false;
2282         int rc;
2283
2284         /* Write parameters */
2285         switch (cmd->cmd) {
2286
2287         case SIO_HI_RA_RAM_CMD_CONFIG:
2288         case SIO_HI_RA_RAM_CMD_ATOMIC_COPY:
2289                 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_6__A, cmd->param6, 0);
2290                 if (rc != 0) {
2291                         pr_err("error %d\n", rc);
2292                         goto rw_error;
2293                 }
2294                 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_5__A, cmd->param5, 0);
2295                 if (rc != 0) {
2296                         pr_err("error %d\n", rc);
2297                         goto rw_error;
2298                 }
2299                 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_4__A, cmd->param4, 0);
2300                 if (rc != 0) {
2301                         pr_err("error %d\n", rc);
2302                         goto rw_error;
2303                 }
2304                 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_3__A, cmd->param3, 0);
2305                 if (rc != 0) {
2306                         pr_err("error %d\n", rc);
2307                         goto rw_error;
2308                 }
2309                 /* fallthrough */
2310         case SIO_HI_RA_RAM_CMD_BRDCTRL:
2311                 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_2__A, cmd->param2, 0);
2312                 if (rc != 0) {
2313                         pr_err("error %d\n", rc);
2314                         goto rw_error;
2315                 }
2316                 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_1__A, cmd->param1, 0);
2317                 if (rc != 0) {
2318                         pr_err("error %d\n", rc);
2319                         goto rw_error;
2320                 }
2321                 /* fallthrough */
2322         case SIO_HI_RA_RAM_CMD_NULL:
2323                 /* No parameters */
2324                 break;
2325
2326         default:
2327                 return -EINVAL;
2328                 break;
2329         }
2330
2331         /* Write command */
2332         rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, cmd->cmd, 0);
2333         if (rc != 0) {
2334                 pr_err("error %d\n", rc);
2335                 goto rw_error;
2336         }
2337
2338         if ((cmd->cmd) == SIO_HI_RA_RAM_CMD_RESET)
2339                 msleep(1);
2340
2341         /* Detect power down to ommit reading result */
2342         powerdown_cmd = (bool) ((cmd->cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
2343                                   (((cmd->
2344                                      param5) & SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M)
2345                                    == SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2346         if (!powerdown_cmd) {
2347                 /* Wait until command rdy */
2348                 do {
2349                         nr_retries++;
2350                         if (nr_retries > DRXJ_MAX_RETRIES) {
2351                                 pr_err("timeout\n");
2352                                 goto rw_error;
2353                         }
2354
2355                         rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, &wait_cmd, 0);
2356                         if (rc != 0) {
2357                                 pr_err("error %d\n", rc);
2358                                 goto rw_error;
2359                         }
2360                 } while (wait_cmd != 0);
2361
2362                 /* Read result */
2363                 rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_RES__A, result, 0);
2364                 if (rc != 0) {
2365                         pr_err("error %d\n", rc);
2366                         goto rw_error;
2367                 }
2368
2369         }
2370         /* if ( powerdown_cmd == true ) */
2371         return 0;
2372 rw_error:
2373         return rc;
2374 }
2375
2376 /*
2377 * \fn int init_hi( const struct drx_demod_instance *demod )
2378 * \brief Initialise and configurate HI.
2379 * \param demod pointer to demod data.
2380 * \return int Return status.
2381 * \retval 0 Success.
2382 * \retval -EIO Failure.
2383 *
2384 * Needs to know Psys (System Clock period) and Posc (Osc Clock period)
2385 * Need to store configuration in driver because of the way I2C
2386 * bridging is controlled.
2387 *
2388 */
2389 static int init_hi(const struct drx_demod_instance *demod)
2390 {
2391         struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2392         struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2393         struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2394         int rc;
2395
2396         ext_attr = (struct drxj_data *) demod->my_ext_attr;
2397         common_attr = (struct drx_common_attr *) demod->my_common_attr;
2398         dev_addr = demod->my_i2c_dev_addr;
2399
2400         /* PATCH for bug 5003, HI ucode v3.1.0 */
2401         rc = drxj_dap_write_reg16(dev_addr, 0x4301D7, 0x801, 0);
2402         if (rc != 0) {
2403                 pr_err("error %d\n", rc);
2404                 goto rw_error;
2405         }
2406
2407         /* Timing div, 250ns/Psys */
2408         /* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */
2409         ext_attr->hi_cfg_timing_div =
2410             (u16) ((common_attr->sys_clock_freq / 1000) * HI_I2C_DELAY) / 1000;
2411         /* Clipping */
2412         if ((ext_attr->hi_cfg_timing_div) > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
2413                 ext_attr->hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
2414         /* Bridge delay, uses oscilator clock */
2415         /* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */
2416         /* SDA brdige delay */
2417         ext_attr->hi_cfg_bridge_delay =
2418             (u16) ((common_attr->osc_clock_freq / 1000) * HI_I2C_BRIDGE_DELAY) /
2419             1000;
2420         /* Clipping */
2421         if ((ext_attr->hi_cfg_bridge_delay) > SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M)
2422                 ext_attr->hi_cfg_bridge_delay = SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
2423         /* SCL bridge delay, same as SDA for now */
2424         ext_attr->hi_cfg_bridge_delay += ((ext_attr->hi_cfg_bridge_delay) <<
2425                                       SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B);
2426         /* Wakeup key, setting the read flag (as suggest in the documentation) does
2427            not always result into a working solution (barebones worked VI2C failed).
2428            Not setting the bit works in all cases . */
2429         ext_attr->hi_cfg_wake_up_key = DRXJ_WAKE_UP_KEY;
2430         /* port/bridge/power down ctrl */
2431         ext_attr->hi_cfg_ctrl = (SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE);
2432         /* transit mode time out delay and watch dog divider */
2433         ext_attr->hi_cfg_transmit = SIO_HI_RA_RAM_PAR_6__PRE;
2434
2435         rc = hi_cfg_command(demod);
2436         if (rc != 0) {
2437                 pr_err("error %d\n", rc);
2438                 goto rw_error;
2439         }
2440
2441         return 0;
2442
2443 rw_error:
2444         return rc;
2445 }
2446
2447 /*============================================================================*/
2448 /*==                   END HOST INTERFACE FUNCTIONS                         ==*/
2449 /*============================================================================*/
2450
2451 /*============================================================================*/
2452 /*============================================================================*/
2453 /*==                        AUXILIARY FUNCTIONS                             ==*/
2454 /*============================================================================*/
2455 /*============================================================================*/
2456
2457 /*
2458 * \fn int get_device_capabilities()
2459 * \brief Get and store device capabilities.
2460 * \param demod  Pointer to demodulator instance.
2461 * \return int.
2462 * \return 0    Success
2463 * \retval -EIO Failure
2464 *
2465 * Depending on pulldowns on MDx pins the following internals are set:
2466 *  * common_attr->osc_clock_freq
2467 *  * ext_attr->has_lna
2468 *  * ext_attr->has_ntsc
2469 *  * ext_attr->has_btsc
2470 *  * ext_attr->has_oob
2471 *
2472 */
2473 static int get_device_capabilities(struct drx_demod_instance *demod)
2474 {
2475         struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2476         struct drxj_data *ext_attr = (struct drxj_data *) NULL;
2477         struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2478         u16 sio_pdr_ohw_cfg = 0;
2479         u32 sio_top_jtagid_lo = 0;
2480         u16 bid = 0;
2481         int rc;
2482
2483         common_attr = (struct drx_common_attr *) demod->my_common_attr;
2484         ext_attr = (struct drxj_data *) demod->my_ext_attr;
2485         dev_addr = demod->my_i2c_dev_addr;
2486
2487         rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2488         if (rc != 0) {
2489                 pr_err("error %d\n", rc);
2490                 goto rw_error;
2491         }
2492         rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg, 0);
2493         if (rc != 0) {
2494                 pr_err("error %d\n", rc);
2495                 goto rw_error;
2496         }
2497         rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2498         if (rc != 0) {
2499                 pr_err("error %d\n", rc);
2500                 goto rw_error;
2501         }
2502
2503         switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
2504         case 0:
2505                 /* ignore (bypass ?) */
2506                 break;
2507         case 1:
2508                 /* 27 MHz */
2509                 common_attr->osc_clock_freq = 27000;
2510                 break;
2511         case 2:
2512                 /* 20.25 MHz */
2513                 common_attr->osc_clock_freq = 20250;
2514                 break;
2515         case 3:
2516                 /* 4 MHz */
2517                 common_attr->osc_clock_freq = 4000;
2518                 break;
2519         default:
2520                 return -EIO;
2521         }
2522
2523         /*
2524            Determine device capabilities
2525            Based on pinning v47
2526          */
2527         rc = drxdap_fasi_read_reg32(dev_addr, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo, 0);
2528         if (rc != 0) {
2529                 pr_err("error %d\n", rc);
2530                 goto rw_error;
2531         }
2532         ext_attr->mfx = (u8) ((sio_top_jtagid_lo >> 29) & 0xF);
2533
2534         switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
2535         case 0x31:
2536                 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2537                 if (rc != 0) {
2538                         pr_err("error %d\n", rc);
2539                         goto rw_error;
2540                 }
2541                 rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_UIO_IN_HI__A, &bid, 0);
2542                 if (rc != 0) {
2543                         pr_err("error %d\n", rc);
2544                         goto rw_error;
2545                 }
2546                 bid = (bid >> 10) & 0xf;
2547                 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2548                 if (rc != 0) {
2549                         pr_err("error %d\n", rc);
2550                         goto rw_error;
2551                 }
2552
2553                 ext_attr->has_lna = true;
2554                 ext_attr->has_ntsc = false;
2555                 ext_attr->has_btsc = false;
2556                 ext_attr->has_oob = false;
2557                 ext_attr->has_smatx = true;
2558                 ext_attr->has_smarx = false;
2559                 ext_attr->has_gpio = false;
2560                 ext_attr->has_irqn = false;
2561                 break;
2562         case 0x33:
2563                 ext_attr->has_lna = false;
2564                 ext_attr->has_ntsc = false;
2565                 ext_attr->has_btsc = false;
2566                 ext_attr->has_oob = false;
2567                 ext_attr->has_smatx = true;
2568                 ext_attr->has_smarx = false;
2569                 ext_attr->has_gpio = false;
2570                 ext_attr->has_irqn = false;
2571                 break;
2572         case 0x45:
2573                 ext_attr->has_lna = true;
2574                 ext_attr->has_ntsc = true;
2575                 ext_attr->has_btsc = false;
2576                 ext_attr->has_oob = false;
2577                 ext_attr->has_smatx = true;
2578                 ext_attr->has_smarx = true;
2579                 ext_attr->has_gpio = true;
2580                 ext_attr->has_irqn = false;
2581                 break;
2582         case 0x46:
2583                 ext_attr->has_lna = false;
2584                 ext_attr->has_ntsc = true;
2585                 ext_attr->has_btsc = false;
2586                 ext_attr->has_oob = false;
2587                 ext_attr->has_smatx = true;
2588                 ext_attr->has_smarx = true;
2589                 ext_attr->has_gpio = true;
2590                 ext_attr->has_irqn = false;
2591                 break;
2592         case 0x41:
2593                 ext_attr->has_lna = true;
2594                 ext_attr->has_ntsc = true;
2595                 ext_attr->has_btsc = true;
2596                 ext_attr->has_oob = false;
2597                 ext_attr->has_smatx = true;
2598                 ext_attr->has_smarx = true;
2599                 ext_attr->has_gpio = true;
2600                 ext_attr->has_irqn = false;
2601                 break;
2602         case 0x43:
2603                 ext_attr->has_lna = false;
2604                 ext_attr->has_ntsc = true;
2605                 ext_attr->has_btsc = true;
2606                 ext_attr->has_oob = false;
2607                 ext_attr->has_smatx = true;
2608                 ext_attr->has_smarx = true;
2609                 ext_attr->has_gpio = true;
2610                 ext_attr->has_irqn = false;
2611                 break;
2612         case 0x32:
2613                 ext_attr->has_lna = true;
2614                 ext_attr->has_ntsc = false;
2615                 ext_attr->has_btsc = false;
2616                 ext_attr->has_oob = true;
2617                 ext_attr->has_smatx = true;
2618                 ext_attr->has_smarx = true;
2619                 ext_attr->has_gpio = true;
2620                 ext_attr->has_irqn = true;
2621                 break;
2622         case 0x34:
2623                 ext_attr->has_lna = false;
2624                 ext_attr->has_ntsc = true;
2625                 ext_attr->has_btsc = true;
2626                 ext_attr->has_oob = true;
2627                 ext_attr->has_smatx = true;
2628                 ext_attr->has_smarx = true;
2629                 ext_attr->has_gpio = true;
2630                 ext_attr->has_irqn = true;
2631                 break;
2632         case 0x42:
2633                 ext_attr->has_lna = true;
2634                 ext_attr->has_ntsc = true;
2635                 ext_attr->has_btsc = true;
2636                 ext_attr->has_oob = true;
2637                 ext_attr->has_smatx = true;
2638                 ext_attr->has_smarx = true;
2639                 ext_attr->has_gpio = true;
2640                 ext_attr->has_irqn = true;
2641                 break;
2642         case 0x44:
2643                 ext_attr->has_lna = false;
2644                 ext_attr->has_ntsc = true;
2645                 ext_attr->has_btsc = true;
2646                 ext_attr->has_oob = true;
2647                 ext_attr->has_smatx = true;
2648                 ext_attr->has_smarx = true;
2649                 ext_attr->has_gpio = true;
2650                 ext_attr->has_irqn = true;
2651                 break;
2652         default:
2653                 /* Unknown device variant */
2654                 return -EIO;
2655                 break;
2656         }
2657
2658         return 0;
2659 rw_error:
2660         return rc;
2661 }
2662
2663 /*
2664 * \fn int power_up_device()
2665 * \brief Power up device.
2666 * \param demod  Pointer to demodulator instance.
2667 * \return int.
2668 * \return 0    Success
2669 * \retval -EIO Failure, I2C or max retries reached
2670 *
2671 */
2672
2673 #ifndef DRXJ_MAX_RETRIES_POWERUP
2674 #define DRXJ_MAX_RETRIES_POWERUP 10
2675 #endif
2676
2677 static int power_up_device(struct drx_demod_instance *demod)
2678 {
2679         struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2680         u8 data = 0;
2681         u16 retry_count = 0;
2682         struct i2c_device_addr wake_up_addr;
2683
2684         dev_addr = demod->my_i2c_dev_addr;
2685         wake_up_addr.i2c_addr = DRXJ_WAKE_UP_KEY;
2686         wake_up_addr.i2c_dev_id = dev_addr->i2c_dev_id;
2687         wake_up_addr.user_data = dev_addr->user_data;
2688         /*
2689          * I2C access may fail in this case: no ack
2690          * dummy write must be used to wake uop device, dummy read must be used to
2691          * reset HI state machine (avoiding actual writes)
2692          */
2693         do {
2694                 data = 0;
2695                 drxbsp_i2c_write_read(&wake_up_addr, 1, &data,
2696                                       (struct i2c_device_addr *)(NULL), 0,
2697                                      (u8 *)(NULL));
2698                 msleep(10);
2699                 retry_count++;
2700         } while ((drxbsp_i2c_write_read
2701                   ((struct i2c_device_addr *) (NULL), 0, (u8 *)(NULL), dev_addr, 1,
2702                    &data)
2703                   != 0) && (retry_count < DRXJ_MAX_RETRIES_POWERUP));
2704
2705         /* Need some recovery time .... */
2706         msleep(10);
2707
2708         if (retry_count == DRXJ_MAX_RETRIES_POWERUP)
2709                 return -EIO;
2710
2711         return 0;
2712 }
2713
2714 /*----------------------------------------------------------------------------*/
2715 /* MPEG Output Configuration Functions - begin                                */
2716 /*----------------------------------------------------------------------------*/
2717 /*
2718 * \fn int ctrl_set_cfg_mpeg_output()
2719 * \brief Set MPEG output configuration of the device.
2720 * \param devmod  Pointer to demodulator instance.
2721 * \param cfg_data Pointer to mpeg output configuaration.
2722 * \return int.
2723 *
2724 *  Configure MPEG output parameters.
2725 *
2726 */
2727 static int
2728 ctrl_set_cfg_mpeg_output(struct drx_demod_instance *demod, struct drx_cfg_mpeg_output *cfg_data)
2729 {
2730         struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2731         struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2732         struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2733         int rc;
2734         u16 fec_oc_reg_mode = 0;
2735         u16 fec_oc_reg_ipr_mode = 0;
2736         u16 fec_oc_reg_ipr_invert = 0;
2737         u32 max_bit_rate = 0;
2738         u32 rcn_rate = 0;
2739         u32 nr_bits = 0;
2740         u16 sio_pdr_md_cfg = 0;
2741         /* data mask for the output data byte */
2742         u16 invert_data_mask =
2743             FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2744             FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2745             FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2746             FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2747
2748         /* check arguments */
2749         if ((demod == NULL) || (cfg_data == NULL))
2750                 return -EINVAL;
2751
2752         dev_addr = demod->my_i2c_dev_addr;
2753         ext_attr = (struct drxj_data *) demod->my_ext_attr;
2754         common_attr = (struct drx_common_attr *) demod->my_common_attr;
2755
2756         if (cfg_data->enable_mpeg_output == true) {
2757                 /* quick and dirty patch to set MPEG incase current std is not
2758                    producing MPEG */
2759                 switch (ext_attr->standard) {
2760                 case DRX_STANDARD_8VSB:
2761                 case DRX_STANDARD_ITU_A:
2762                 case DRX_STANDARD_ITU_B:
2763                 case DRX_STANDARD_ITU_C:
2764                         break;
2765                 default:
2766                         return 0;
2767                 }
2768
2769                 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_OCR_INVERT__A, 0, 0);
2770                 if (rc != 0) {
2771                         pr_err("error %d\n", rc);
2772                         goto rw_error;
2773                 }
2774                 switch (ext_attr->standard) {
2775                 case DRX_STANDARD_8VSB:
2776                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, 7, 0);
2777                         if (rc != 0) {
2778                                 pr_err("error %d\n", rc);
2779                                 goto rw_error;
2780                         }       /* 2048 bytes fifo ram */
2781                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, 10, 0);
2782                         if (rc != 0) {
2783                                 pr_err("error %d\n", rc);
2784                                 goto rw_error;
2785                         }
2786                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 10, 0);
2787                         if (rc != 0) {
2788                                 pr_err("error %d\n", rc);
2789                                 goto rw_error;
2790                         }
2791                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, 5, 0);
2792                         if (rc != 0) {
2793                                 pr_err("error %d\n", rc);
2794                                 goto rw_error;
2795                         }
2796                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, 7, 0);
2797                         if (rc != 0) {
2798                                 pr_err("error %d\n", rc);
2799                                 goto rw_error;
2800                         }
2801                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 10, 0);
2802                         if (rc != 0) {
2803                                 pr_err("error %d\n", rc);
2804                                 goto rw_error;
2805                         }
2806                         /* Low Water Mark for synchronization  */
2807                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 3, 0);
2808                         if (rc != 0) {
2809                                 pr_err("error %d\n", rc);
2810                                 goto rw_error;
2811                         }
2812                         /* High Water Mark for synchronization */
2813                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 5, 0);
2814                         if (rc != 0) {
2815                                 pr_err("error %d\n", rc);
2816                                 goto rw_error;
2817                         }
2818                         break;
2819                 case DRX_STANDARD_ITU_A:
2820                 case DRX_STANDARD_ITU_C:
2821                         switch (ext_attr->constellation) {
2822                         case DRX_CONSTELLATION_QAM256:
2823                                 nr_bits = 8;
2824                                 break;
2825                         case DRX_CONSTELLATION_QAM128:
2826                                 nr_bits = 7;
2827                                 break;
2828                         case DRX_CONSTELLATION_QAM64:
2829                                 nr_bits = 6;
2830                                 break;
2831                         case DRX_CONSTELLATION_QAM32:
2832                                 nr_bits = 5;
2833                                 break;
2834                         case DRX_CONSTELLATION_QAM16:
2835                                 nr_bits = 4;
2836                                 break;
2837                         default:
2838                                 return -EIO;
2839                         }       /* ext_attr->constellation */
2840                         /* max_bit_rate = symbol_rate * nr_bits * coef */
2841                         /* coef = 188/204                          */
2842                         max_bit_rate =
2843                             (ext_attr->curr_symbol_rate / 8) * nr_bits * 188;
2844                         /* pass through as b/c Annex A/c need following settings */
2845                         /* fall-through */
2846                 case DRX_STANDARD_ITU_B:
2847                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, FEC_OC_FCT_USAGE__PRE, 0);
2848                         if (rc != 0) {
2849                                 pr_err("error %d\n", rc);
2850                                 goto rw_error;
2851                         }
2852                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, FEC_OC_TMD_CTL_UPD_RATE__PRE, 0);
2853                         if (rc != 0) {
2854                                 pr_err("error %d\n", rc);
2855                                 goto rw_error;
2856                         }
2857                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 5, 0);
2858                         if (rc != 0) {
2859                                 pr_err("error %d\n", rc);
2860                                 goto rw_error;
2861                         }
2862                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, FEC_OC_AVR_PARM_A__PRE, 0);
2863                         if (rc != 0) {
2864                                 pr_err("error %d\n", rc);
2865                                 goto rw_error;
2866                         }
2867                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, FEC_OC_AVR_PARM_B__PRE, 0);
2868                         if (rc != 0) {
2869                                 pr_err("error %d\n", rc);
2870                                 goto rw_error;
2871                         }
2872                         if (cfg_data->static_clk == true) {
2873                                 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 0xD, 0);
2874                                 if (rc != 0) {
2875                                         pr_err("error %d\n", rc);
2876                                         goto rw_error;
2877                                 }
2878                         } else {
2879                                 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, FEC_OC_RCN_GAIN__PRE, 0);
2880                                 if (rc != 0) {
2881                                         pr_err("error %d\n", rc);
2882                                         goto rw_error;
2883                                 }
2884                         }
2885                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 2, 0);
2886                         if (rc != 0) {
2887                                 pr_err("error %d\n", rc);
2888                                 goto rw_error;
2889                         }
2890                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 12, 0);
2891                         if (rc != 0) {
2892                                 pr_err("error %d\n", rc);
2893                                 goto rw_error;
2894                         }
2895                         break;
2896                 default:
2897                         break;
2898                 }               /* swtich (standard) */
2899
2900                 /* Check insertion of the Reed-Solomon parity bytes */
2901                 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
2902                 if (rc != 0) {
2903                         pr_err("error %d\n", rc);
2904                         goto rw_error;
2905                 }
2906                 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode, 0);
2907                 if (rc != 0) {
2908                         pr_err("error %d\n", rc);
2909                         goto rw_error;
2910                 }
2911                 if (cfg_data->insert_rs_byte == true) {
2912                         /* enable parity symbol forward */
2913                         fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
2914                         /* MVAL disable during parity bytes */
2915                         fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2916                         switch (ext_attr->standard) {
2917                         case DRX_STANDARD_8VSB:
2918                                 rcn_rate = 0x004854D3;
2919                                 break;
2920                         case DRX_STANDARD_ITU_B:
2921                                 fec_oc_reg_mode |= FEC_OC_MODE_TRANSPARENT__M;
2922                                 switch (ext_attr->constellation) {
2923                                 case DRX_CONSTELLATION_QAM256:
2924                                         rcn_rate = 0x008945E7;
2925                                         break;
2926                                 case DRX_CONSTELLATION_QAM64:
2927                                         rcn_rate = 0x005F64D4;
2928                                         break;
2929                                 default:
2930                                         return -EIO;
2931                                 }
2932                                 break;
2933                         case DRX_STANDARD_ITU_A:
2934                         case DRX_STANDARD_ITU_C:
2935                                 /* insert_rs_byte = true -> coef = 188/188 -> 1, RS bits are in MPEG output */
2936                                 rcn_rate =
2937                                     (frac28
2938                                      (max_bit_rate,
2939                                       (u32) (common_attr->sys_clock_freq / 8))) /
2940                                     188;
2941                                 break;
2942                         default:
2943                                 return -EIO;
2944                         }       /* ext_attr->standard */
2945                 } else {        /* insert_rs_byte == false */
2946
2947                         /* disable parity symbol forward */
2948                         fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
2949                         /* MVAL enable during parity bytes */
2950                         fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2951                         switch (ext_attr->standard) {
2952                         case DRX_STANDARD_8VSB:
2953                                 rcn_rate = 0x0041605C;
2954                                 break;
2955                         case DRX_STANDARD_ITU_B:
2956                                 fec_oc_reg_mode &= (~FEC_OC_MODE_TRANSPARENT__M);
2957                                 switch (ext_attr->constellation) {
2958                                 case DRX_CONSTELLATION_QAM256:
2959                                         rcn_rate = 0x0082D6A0;
2960                                         break;
2961                                 case DRX_CONSTELLATION_QAM64:
2962                                         rcn_rate = 0x005AEC1A;
2963                                         break;
2964                                 default:
2965                                         return -EIO;
2966                                 }
2967                                 break;
2968                         case DRX_STANDARD_ITU_A:
2969                         case DRX_STANDARD_ITU_C:
2970                                 /* insert_rs_byte = false -> coef = 188/204, RS bits not in MPEG output */
2971                                 rcn_rate =
2972                                     (frac28
2973                                      (max_bit_rate,
2974                                       (u32) (common_attr->sys_clock_freq / 8))) /
2975                                     204;
2976                                 break;
2977                         default:
2978                                 return -EIO;
2979                         }       /* ext_attr->standard */
2980                 }
2981
2982                 if (cfg_data->enable_parallel == true) {        /* MPEG data output is parallel -> clear ipr_mode[0] */
2983                         fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2984                 } else {        /* MPEG data output is serial -> set ipr_mode[0] */
2985                         fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
2986                 }
2987
2988                 /* Control slective inversion of output bits */
2989                 if (cfg_data->invert_data == true)
2990                         fec_oc_reg_ipr_invert |= invert_data_mask;
2991                 else
2992                         fec_oc_reg_ipr_invert &= (~(invert_data_mask));
2993
2994                 if (cfg_data->invert_err == true)
2995                         fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
2996                 else
2997                         fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2998
2999                 if (cfg_data->invert_str == true)
3000                         fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
3001                 else
3002                         fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
3003
3004                 if (cfg_data->invert_val == true)
3005                         fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
3006                 else
3007                         fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
3008
3009                 if (cfg_data->invert_clk == true)
3010                         fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
3011                 else
3012                         fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
3013
3014
3015                 if (cfg_data->static_clk == true) {     /* Static mode */
3016                         u32 dto_rate = 0;
3017                         u32 bit_rate = 0;
3018                         u16 fec_oc_dto_burst_len = 0;
3019                         u16 fec_oc_dto_period = 0;
3020
3021                         fec_oc_dto_burst_len = FEC_OC_DTO_BURST_LEN__PRE;
3022
3023                         switch (ext_attr->standard) {
3024                         case DRX_STANDARD_8VSB:
3025                                 fec_oc_dto_period = 4;
3026                                 if (cfg_data->insert_rs_byte == true)
3027                                         fec_oc_dto_burst_len = 208;
3028                                 break;
3029                         case DRX_STANDARD_ITU_A:
3030                                 {
3031                                         u32 symbol_rate_th = 6400000;
3032                                         if (cfg_data->insert_rs_byte == true) {
3033                                                 fec_oc_dto_burst_len = 204;
3034                                                 symbol_rate_th = 5900000;
3035                                         }
3036                                         if (ext_attr->curr_symbol_rate >=
3037                                             symbol_rate_th) {
3038                                                 fec_oc_dto_period = 0;
3039                                         } else {
3040                                                 fec_oc_dto_period = 1;
3041                                         }
3042                                 }
3043                                 break;
3044                         case DRX_STANDARD_ITU_B:
3045                                 fec_oc_dto_period = 1;
3046                                 if (cfg_data->insert_rs_byte == true)
3047                                         fec_oc_dto_burst_len = 128;
3048                                 break;
3049                         case DRX_STANDARD_ITU_C:
3050                                 fec_oc_dto_period = 1;
3051                                 if (cfg_data->insert_rs_byte == true)
3052                                         fec_oc_dto_burst_len = 204;
3053                                 break;
3054                         default:
3055                                 return -EIO;
3056                         }
3057                         bit_rate =
3058                             common_attr->sys_clock_freq * 1000 / (fec_oc_dto_period +
3059                                                                2);
3060                         dto_rate =
3061                             frac28(bit_rate, common_attr->sys_clock_freq * 1000);
3062                         dto_rate >>= 3;
3063                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_HI__A, (u16)((dto_rate >> 16) & FEC_OC_DTO_RATE_HI__M), 0);
3064                         if (rc != 0) {
3065                                 pr_err("error %d\n", rc);
3066                                 goto rw_error;
3067                         }
3068                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_LO__A, (u16)(dto_rate & FEC_OC_DTO_RATE_LO_RATE_LO__M), 0);
3069                         if (rc != 0) {
3070                                 pr_err("error %d\n", rc);
3071                                 goto rw_error;
3072                         }
3073                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M | FEC_OC_DTO_MODE_OFFSET_ENABLE__M, 0);
3074                         if (rc != 0) {
3075                                 pr_err("error %d\n", rc);
3076                                 goto rw_error;
3077                         }
3078                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, FEC_OC_FCT_MODE_RAT_ENA__M | FEC_OC_FCT_MODE_VIRT_ENA__M, 0);
3079                         if (rc != 0) {
3080                                 pr_err("error %d\n", rc);
3081                                 goto rw_error;
3082                         }
3083                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len, 0);
3084                         if (rc != 0) {
3085                                 pr_err("error %d\n", rc);
3086                                 goto rw_error;
3087                         }
3088                         if (ext_attr->mpeg_output_clock_rate != DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO)
3089                                 fec_oc_dto_period = ext_attr->mpeg_output_clock_rate - 1;
3090                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period, 0);
3091                         if (rc != 0) {
3092                                 pr_err("error %d\n", rc);
3093                                 goto rw_error;
3094                         }
3095                 } else {        /* Dynamic mode */
3096
3097                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M, 0);
3098                         if (rc != 0) {
3099                                 pr_err("error %d\n", rc);
3100                                 goto rw_error;
3101                         }
3102                         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, 0, 0);
3103                         if (rc != 0) {
3104                                 pr_err("error %d\n", rc);
3105                                 goto rw_error;
3106                         }
3107                 }
3108
3109                 rc = drxdap_fasi_write_reg32(dev_addr, FEC_OC_RCN_CTL_RATE_LO__A, rcn_rate, 0);
3110                 if (rc != 0) {
3111                         pr_err("error %d\n", rc);
3112                         goto rw_error;
3113                 }
3114
3115                 /* Write appropriate registers with requested configuration */
3116                 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode, 0);
3117                 if (rc != 0) {
3118                         pr_err("error %d\n", rc);
3119                         goto rw_error;
3120                 }
3121                 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode, 0);
3122                 if (rc != 0) {
3123                         pr_err("error %d\n", rc);
3124                         goto rw_error;
3125                 }
3126                 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert, 0);
3127                 if (rc != 0) {
3128                         pr_err("error %d\n", rc);
3129                         goto rw_error;
3130                 }
3131
3132                 /* enabling for both parallel and serial now */
3133                 /*  Write magic word to enable pdr reg write */
3134                 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3135                 if (rc != 0) {
3136                         pr_err("error %d\n", rc);
3137                         goto rw_error;
3138                 }
3139                 /*  Set MPEG TS pads to outputmode */
3140                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0013, 0);
3141                 if (rc != 0) {
3142                         pr_err("error %d\n", rc);
3143                         goto rw_error;
3144                 }
3145                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0013, 0);
3146                 if (rc != 0) {
3147                         pr_err("error %d\n", rc);
3148                         goto rw_error;
3149                 }
3150                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, MPEG_OUTPUT_CLK_DRIVE_STRENGTH << SIO_PDR_MCLK_CFG_DRIVE__B | 0x03 << SIO_PDR_MCLK_CFG_MODE__B, 0);
3151                 if (rc != 0) {
3152                         pr_err("error %d\n", rc);
3153                         goto rw_error;
3154                 }
3155                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0013, 0);
3156                 if (rc != 0) {
3157                         pr_err("error %d\n", rc);
3158                         goto rw_error;
3159                 }
3160                 sio_pdr_md_cfg =
3161                     MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH <<
3162                     SIO_PDR_MD0_CFG_DRIVE__B | 0x03 << SIO_PDR_MD0_CFG_MODE__B;
3163                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3164                 if (rc != 0) {
3165                         pr_err("error %d\n", rc);
3166                         goto rw_error;
3167                 }
3168                 if (cfg_data->enable_parallel == true) {        /* MPEG data output is parallel -> set MD1 to MD7 to output mode */
3169                         sio_pdr_md_cfg =
3170                             MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH <<
3171                             SIO_PDR_MD0_CFG_DRIVE__B | 0x03 <<
3172                             SIO_PDR_MD0_CFG_MODE__B;
3173                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3174                         if (rc != 0) {
3175                                 pr_err("error %d\n", rc);
3176                                 goto rw_error;
3177                         }
3178                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, sio_pdr_md_cfg, 0);
3179                         if (rc != 0) {
3180                                 pr_err("error %d\n", rc);
3181                                 goto rw_error;
3182                         }
3183                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, sio_pdr_md_cfg, 0);
3184                         if (rc != 0) {
3185                                 pr_err("error %d\n", rc);
3186                                 goto rw_error;
3187                         }
3188                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, sio_pdr_md_cfg, 0);
3189                         if (rc != 0) {
3190                                 pr_err("error %d\n", rc);
3191                                 goto rw_error;
3192                         }
3193                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, sio_pdr_md_cfg, 0);
3194                         if (rc != 0) {
3195                                 pr_err("error %d\n", rc);
3196                                 goto rw_error;
3197                         }
3198                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, sio_pdr_md_cfg, 0);
3199                         if (rc != 0) {
3200                                 pr_err("error %d\n", rc);
3201                                 goto rw_error;
3202                         }
3203                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, sio_pdr_md_cfg, 0);
3204                         if (rc != 0) {
3205                                 pr_err("error %d\n", rc);
3206                                 goto rw_error;
3207                         }
3208                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, sio_pdr_md_cfg, 0);
3209                         if (rc != 0) {
3210                                 pr_err("error %d\n", rc);
3211                                 goto rw_error;
3212                         }
3213                 } else {        /* MPEG data output is serial -> set MD1 to MD7 to tri-state */
3214                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3215                         if (rc != 0) {
3216                                 pr_err("error %d\n", rc);
3217                                 goto rw_error;
3218                         }
3219                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3220                         if (rc != 0) {
3221                                 pr_err("error %d\n", rc);
3222                                 goto rw_error;
3223                         }
3224                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3225                         if (rc != 0) {
3226                                 pr_err("error %d\n", rc);
3227                                 goto rw_error;
3228                         }
3229                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3230                         if (rc != 0) {
3231                                 pr_err("error %d\n", rc);
3232                                 goto rw_error;
3233                         }
3234                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3235                         if (rc != 0) {
3236                                 pr_err("error %d\n", rc);
3237                                 goto rw_error;
3238                         }
3239                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3240                         if (rc != 0) {
3241                                 pr_err("error %d\n", rc);
3242                                 goto rw_error;
3243                         }
3244                         rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3245                         if (rc != 0) {
3246                                 pr_err("error %d\n", rc);
3247                                 goto rw_error;
3248                         }
3249                 }
3250                 /*  Enable Monitor Bus output over MPEG pads and ctl input */
3251                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3252                 if (rc != 0) {
3253                         pr_err("error %d\n", rc);
3254                         goto rw_error;
3255                 }
3256                 /*  Write nomagic word to enable pdr reg write */
3257                 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3258                 if (rc != 0) {
3259                         pr_err("error %d\n", rc);
3260                         goto rw_error;
3261                 }
3262         } else {
3263                 /*  Write magic word to enable pdr reg write */
3264                 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3265                 if (rc != 0) {
3266                         pr_err("error %d\n", rc);
3267                         goto rw_error;
3268                 }
3269                 /*  Set MPEG TS pads to inputmode */
3270                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0000, 0);
3271                 if (rc != 0) {
3272                         pr_err("error %d\n", rc);
3273                         goto rw_error;
3274                 }
3275                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0000, 0);
3276                 if (rc != 0) {
3277                         pr_err("error %d\n", rc);
3278                         goto rw_error;
3279                 }
3280                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, 0x0000, 0);
3281                 if (rc != 0) {
3282                         pr_err("error %d\n", rc);
3283                         goto rw_error;
3284                 }
3285                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0000, 0);
3286                 if (rc != 0) {
3287                         pr_err("error %d\n", rc);
3288                         goto rw_error;
3289                 }
3290                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, 0x0000, 0);
3291                 if (rc != 0) {
3292                         pr_err("error %d\n", rc);
3293                         goto rw_error;
3294                 }
3295                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3296                 if (rc != 0) {
3297                         pr_err("error %d\n", rc);
3298                         goto rw_error;
3299                 }
3300                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3301                 if (rc != 0) {
3302                         pr_err("error %d\n", rc);
3303                         goto rw_error;
3304                 }
3305                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3306                 if (rc != 0) {
3307                         pr_err("error %d\n", rc);
3308                         goto rw_error;
3309                 }
3310                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3311                 if (rc != 0) {
3312                         pr_err("error %d\n", rc);
3313                         goto rw_error;
3314                 }
3315                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3316                 if (rc != 0) {
3317                         pr_err("error %d\n", rc);
3318                         goto rw_error;
3319                 }
3320                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3321                 if (rc != 0) {
3322                         pr_err("error %d\n", rc);
3323                         goto rw_error;
3324                 }
3325                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3326                 if (rc != 0) {
3327                         pr_err("error %d\n", rc);
3328                         goto rw_error;
3329                 }
3330                 /* Enable Monitor Bus output over MPEG pads and ctl input */
3331                 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3332                 if (rc != 0) {
3333                         pr_err("error %d\n", rc);
3334                         goto rw_error;
3335                 }
3336                 /* Write nomagic word to enable pdr reg write */
3337                 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3338                 if (rc != 0) {
3339                         pr_err("error %d\n", rc);
3340                         goto rw_error;
3341                 }
3342         }
3343
3344         /* save values for restore after re-acquire */
3345         common_attr->mpeg_cfg.enable_mpeg_output = cfg_data->enable_mpeg_output;
3346
3347         return 0;
3348 rw_error:
3349         return rc;
3350 }
3351
3352 /*----------------------------------------------------------------------------*/
3353
3354
3355 /*----------------------------------------------------------------------------*/
3356 /* MPEG Output Configuration Functions - end                                  */
3357 /*----------------------------------------------------------------------------*/
3358
3359 /*----------------------------------------------------------------------------*/
3360 /* miscellaneous configurations - begin                           */
3361 /*----------------------------------------------------------------------------*/
3362
3363 /*
3364 * \fn int set_mpegtei_handling()
3365 * \brief Activate MPEG TEI handling settings.
3366 * \param devmod  Pointer to demodulator instance.
3367 * \return int.
3368 *
3369 * This routine should be called during a set channel of QAM/VSB
3370 *
3371 */
3372 static int set_mpegtei_handling(struct drx_demod_instance *demod)
3373 {
3374         struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3375         struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3376         int rc;
3377         u16 fec_oc_dpr_mode = 0;
3378         u16 fec_oc_snc_mode = 0;
3379         u16 fec_oc_ems_mode = 0;
3380
3381         dev_addr = demod->my_i2c_dev_addr;
3382         ext_attr = (struct drxj_data *) demod->my_ext_attr;
3383
3384         rc = drxj_dap_read_reg16(dev_addr, FEC_OC_DPR_MODE__A, &fec_oc_dpr_mode, 0);
3385         if (rc != 0) {
3386                 pr_err("error %d\n", rc);
3387                 goto rw_error;
3388         }
3389         rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
3390         if (rc != 0) {
3391                 pr_err("error %d\n", rc);
3392                 goto rw_error;
3393         }
3394         rc = drxj_dap_read_reg16(dev_addr, FEC_OC_EMS_MODE__A, &fec_oc_ems_mode, 0);
3395         if (rc != 0) {
3396                 pr_err("error %d\n", rc);
3397                 goto rw_error;
3398         }
3399
3400         /* reset to default, allow TEI bit to be changed */
3401         fec_oc_dpr_mode &= (~FEC_OC_DPR_MODE_ERR_DISABLE__M);
3402         fec_oc_snc_mode &= (~(FEC_OC_SNC_MODE_ERROR_CTL__M |
3403                            FEC_OC_SNC_MODE_CORR_DISABLE__M));
3404         fec_oc_ems_mode &= (~FEC_OC_EMS_MODE_MODE__M);
3405
3406         if (ext_attr->disable_te_ihandling) {
3407                 /* do not change TEI bit */
3408                 fec_oc_dpr_mode |= FEC_OC_DPR_MODE_ERR_DISABLE__M;
3409                 fec_oc_snc_mode |= FEC_OC_SNC_MODE_CORR_DISABLE__M |
3410                     ((0x2) << (FEC_OC_SNC_MODE_ERROR_CTL__B));
3411                 fec_oc_ems_mode |= ((0x01) << (FEC_OC_EMS_MODE_MODE__B));
3412         }
3413
3414         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DPR_MODE__A, fec_oc_dpr_mode, 0);
3415         if (rc != 0) {
3416                 pr_err("error %d\n", rc);
3417                 goto rw_error;
3418         }
3419         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode, 0);
3420         if (rc != 0) {
3421                 pr_err("error %d\n", rc);
3422                 goto rw_error;
3423         }
3424         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_EMS_MODE__A, fec_oc_ems_mode, 0);
3425         if (rc != 0) {
3426                 pr_err("error %d\n", rc);
3427                 goto rw_error;
3428         }
3429
3430         return 0;
3431 rw_error:
3432         return rc;
3433 }
3434
3435 /*----------------------------------------------------------------------------*/
3436 /*
3437 * \fn int bit_reverse_mpeg_output()
3438 * \brief Set MPEG output bit-endian settings.
3439 * \param devmod  Pointer to demodulator instance.
3440 * \return int.
3441 *
3442 * This routine should be called during a set channel of QAM/VSB
3443 *
3444 */
3445 static int bit_reverse_mpeg_output(struct drx_demod_instance *demod)
3446 {
3447         struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3448         struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3449         int rc;
3450         u16 fec_oc_ipr_mode = 0;
3451
3452         dev_addr = demod->my_i2c_dev_addr;
3453         ext_attr = (struct drxj_data *) demod->my_ext_attr;
3454
3455         rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode, 0);
3456         if (rc != 0) {
3457                 pr_err("error %d\n", rc);
3458                 goto rw_error;
3459         }
3460
3461         /* reset to default (normal bit order) */
3462         fec_oc_ipr_mode &= (~FEC_OC_IPR_MODE_REVERSE_ORDER__M);
3463
3464         if (ext_attr->bit_reverse_mpeg_outout)
3465                 fec_oc_ipr_mode |= FEC_OC_IPR_MODE_REVERSE_ORDER__M;
3466
3467         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode, 0);
3468         if (rc != 0) {
3469                 pr_err("error %d\n", rc);
3470                 goto rw_error;
3471         }
3472
3473         return 0;
3474 rw_error:
3475         return rc;
3476 }
3477
3478 /*----------------------------------------------------------------------------*/
3479 /*
3480 * \fn int set_mpeg_start_width()
3481 * \brief Set MPEG start width.
3482 * \param devmod  Pointer to demodulator instance.
3483 * \return int.
3484 *
3485 * This routine should be called during a set channel of QAM/VSB
3486 *
3487 */
3488 static int set_mpeg_start_width(struct drx_demod_instance *demod)
3489 {
3490         struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3491         struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3492         struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
3493         int rc;
3494         u16 fec_oc_comm_mb = 0;
3495
3496         dev_addr = demod->my_i2c_dev_addr;
3497         ext_attr = (struct drxj_data *) demod->my_ext_attr;
3498         common_attr = demod->my_common_attr;
3499
3500         if ((common_attr->mpeg_cfg.static_clk == true)
3501             && (common_attr->mpeg_cfg.enable_parallel == false)) {
3502                 rc = drxj_dap_read_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                 fec_oc_comm_mb &= ~FEC_OC_COMM_MB_CTL_ON;
3508                 if (ext_attr->mpeg_start_width == DRXJ_MPEG_START_WIDTH_8CLKCYC)
3509                         fec_oc_comm_mb |= FEC_OC_COMM_MB_CTL_ON;
3510                 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_COMM_MB__A, fec_oc_comm_mb, 0);
3511                 if (rc != 0) {
3512                         pr_err("error %d\n", rc);
3513                         goto rw_error;
3514                 }
3515         }
3516
3517         return 0;
3518 rw_error:
3519         return rc;
3520 }
3521
3522 /*----------------------------------------------------------------------------*/
3523 /* miscellaneous configurations - end                             */
3524 /*----------------------------------------------------------------------------*/
3525
3526 /*----------------------------------------------------------------------------*/
3527 /* UIO Configuration Functions - begin                                        */
3528 /*----------------------------------------------------------------------------*/
3529 /*
3530 * \fn int ctrl_set_uio_cfg()
3531 * \brief Configure modus oprandi UIO.
3532 * \param demod Pointer to demodulator instance.
3533 * \param uio_cfg Pointer to a configuration setting for a certain UIO.
3534 * \return int.
3535 */
3536 static int ctrl_set_uio_cfg(struct drx_demod_instance *demod, struct drxuio_cfg *uio_cfg)
3537 {
3538         struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3539         int rc;
3540
3541         if ((uio_cfg == NULL) || (demod == NULL))
3542                 return -EINVAL;
3543
3544         ext_attr = (struct drxj_data *) demod->my_ext_attr;
3545
3546         /*  Write magic word to enable pdr reg write               */
3547         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3548         if (rc != 0) {
3549                 pr_err("error %d\n", rc);
3550                 goto rw_error;
3551         }
3552         switch (uio_cfg->uio) {
3553       /*====================================================================*/
3554         case DRX_UIO1:
3555                 /* DRX_UIO1: SMA_TX UIO-1 */
3556                 if (!ext_attr->has_smatx)
3557                         return -EIO;
3558                 switch (uio_cfg->mode) {
3559                 case DRX_UIO_MODE_FIRMWARE_SMA: /* falltrough */
3560                 case DRX_UIO_MODE_FIRMWARE_SAW: /* falltrough */
3561                 case DRX_UIO_MODE_READWRITE:
3562                         ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3563                         break;
3564                 case DRX_UIO_MODE_DISABLE:
3565                         ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3566                         /* pad configuration register is set 0 - input mode */
3567                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0, 0);
3568                         if (rc != 0) {
3569                                 pr_err("error %d\n", rc);
3570                                 goto rw_error;
3571                         }
3572                         break;
3573                 default:
3574                         return -EINVAL;
3575                 }               /* switch ( uio_cfg->mode ) */
3576                 break;
3577       /*====================================================================*/
3578         case DRX_UIO2:
3579                 /* DRX_UIO2: SMA_RX UIO-2 */
3580                 if (!ext_attr->has_smarx)
3581                         return -EIO;
3582                 switch (uio_cfg->mode) {
3583                 case DRX_UIO_MODE_FIRMWARE0:    /* falltrough */
3584                 case DRX_UIO_MODE_READWRITE:
3585                         ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3586                         break;
3587                 case DRX_UIO_MODE_DISABLE:
3588                         ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3589                         /* pad configuration register is set 0 - input mode */
3590                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, 0, 0);
3591                         if (rc != 0) {
3592                                 pr_err("error %d\n", rc);
3593                                 goto rw_error;
3594                         }
3595                         break;
3596                 default:
3597                         return -EINVAL;
3598                         break;
3599                 }               /* switch ( uio_cfg->mode ) */
3600                 break;
3601       /*====================================================================*/
3602         case DRX_UIO3:
3603                 /* DRX_UIO3: GPIO UIO-3 */
3604                 if (!ext_attr->has_gpio)
3605                         return -EIO;
3606                 switch (uio_cfg->mode) {
3607                 case DRX_UIO_MODE_FIRMWARE0:    /* falltrough */
3608                 case DRX_UIO_MODE_READWRITE:
3609                         ext_attr->uio_gpio_mode = uio_cfg->mode;
3610                         break;
3611                 case DRX_UIO_MODE_DISABLE:
3612                         ext_attr->uio_gpio_mode = uio_cfg->mode;
3613                         /* pad configuration register is set 0 - input mode */
3614                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, 0, 0);
3615                         if (rc != 0) {
3616                                 pr_err("error %d\n", rc);
3617                                 goto rw_error;
3618                         }
3619                         break;
3620                 default:
3621                         return -EINVAL;
3622                         break;
3623                 }               /* switch ( uio_cfg->mode ) */
3624                 break;
3625       /*====================================================================*/
3626         case DRX_UIO4:
3627                 /* DRX_UIO4: IRQN UIO-4 */
3628                 if (!ext_attr->has_irqn)
3629                         return -EIO;
3630                 switch (uio_cfg->mode) {
3631                 case DRX_UIO_MODE_READWRITE:
3632                         ext_attr->uio_irqn_mode = uio_cfg->mode;
3633                         break;
3634                 case DRX_UIO_MODE_DISABLE:
3635                         /* pad configuration register is set 0 - input mode */
3636                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, 0, 0);
3637                         if (rc != 0) {
3638                                 pr_err("error %d\n", rc);
3639                                 goto rw_error;
3640                         }
3641                         ext_attr->uio_irqn_mode = uio_cfg->mode;
3642                         break;
3643                 case DRX_UIO_MODE_FIRMWARE0:    /* falltrough */
3644                 default:
3645                         return -EINVAL;
3646                         break;
3647                 }               /* switch ( uio_cfg->mode ) */
3648                 break;
3649       /*====================================================================*/
3650         default:
3651                 return -EINVAL;
3652         }                       /* switch ( uio_cfg->uio ) */
3653
3654         /*  Write magic word to disable pdr reg write               */
3655         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3656         if (rc != 0) {
3657                 pr_err("error %d\n", rc);
3658                 goto rw_error;
3659         }
3660
3661         return 0;
3662 rw_error:
3663         return rc;
3664 }
3665
3666 /*
3667 * \fn int ctrl_uio_write()
3668 * \brief Write to a UIO.
3669 * \param demod Pointer to demodulator instance.
3670 * \param uio_data Pointer to data container for a certain UIO.
3671 * \return int.
3672 */
3673 static int
3674 ctrl_uio_write(struct drx_demod_instance *demod, struct drxuio_data *uio_data)
3675 {
3676         struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3677         int rc;
3678         u16 pin_cfg_value = 0;
3679         u16 value = 0;
3680
3681         if ((uio_data == NULL) || (demod == NULL))
3682                 return -EINVAL;
3683
3684         ext_attr = (struct drxj_data *) demod->my_ext_attr;
3685
3686         /*  Write magic word to enable pdr reg write               */
3687         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3688         if (rc != 0) {
3689                 pr_err("error %d\n", rc);
3690                 goto rw_error;
3691         }
3692         switch (uio_data->uio) {
3693       /*====================================================================*/
3694         case DRX_UIO1:
3695                 /* DRX_UIO1: SMA_TX UIO-1 */
3696                 if (!ext_attr->has_smatx)
3697                         return -EIO;
3698                 if ((ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_READWRITE)
3699                     && (ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_FIRMWARE_SAW)) {
3700                         return -EIO;
3701                 }
3702                 pin_cfg_value = 0;
3703                 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3704                 pin_cfg_value |= 0x0113;
3705                 /* io_pad_cfg_mode output mode is drive always */
3706                 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3707
3708                 /* write to io pad configuration register - output mode */
3709                 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, pin_cfg_value, 0);
3710                 if (rc != 0) {
3711                         pr_err("error %d\n", rc);
3712                         goto rw_error;
3713                 }
3714
3715                 /* use corresponding bit in io data output registar */
3716                 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3717                 if (rc != 0) {
3718                         pr_err("error %d\n", rc);
3719                         goto rw_error;
3720                 }
3721                 if (!uio_data->value)
3722                         value &= 0x7FFF;        /* write zero to 15th bit - 1st UIO */
3723                 else
3724                         value |= 0x8000;        /* write one to 15th bit - 1st UIO */
3725
3726                 /* write back to io data output register */
3727                 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3728                 if (rc != 0) {
3729                         pr_err("error %d\n", rc);
3730                         goto rw_error;
3731                 }
3732                 break;
3733    /*======================================================================*/
3734         case DRX_UIO2:
3735                 /* DRX_UIO2: SMA_RX UIO-2 */
3736                 if (!ext_attr->has_smarx)
3737                         return -EIO;
3738                 if (ext_attr->uio_sma_rx_mode != DRX_UIO_MODE_READWRITE)
3739                         return -EIO;
3740
3741                 pin_cfg_value = 0;
3742                 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3743                 pin_cfg_value |= 0x0113;
3744                 /* io_pad_cfg_mode output mode is drive always */
3745                 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3746
3747                 /* write to io pad configuration register - output mode */
3748                 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, pin_cfg_value, 0);
3749                 if (rc != 0) {
3750                         pr_err("error %d\n", rc);
3751                         goto rw_error;
3752                 }
3753
3754                 /* use corresponding bit in io data output registar */
3755                 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3756                 if (rc != 0) {
3757                         pr_err("error %d\n", rc);
3758                         goto rw_error;
3759                 }
3760                 if (!uio_data->value)
3761                         value &= 0xBFFF;        /* write zero to 14th bit - 2nd UIO */
3762                 else
3763                         value |= 0x4000;        /* write one to 14th bit - 2nd UIO */
3764
3765                 /* write back to io data output register */
3766                 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3767                 if (rc != 0) {
3768                         pr_err("error %d\n", rc);
3769                         goto rw_error;
3770                 }
3771                 break;
3772    /*====================================================================*/
3773         case DRX_UIO3:
3774                 /* DRX_UIO3: ASEL UIO-3 */
3775                 if (!ext_attr->has_gpio)
3776                         return -EIO;
3777                 if (ext_attr->uio_gpio_mode != DRX_UIO_MODE_READWRITE)
3778                         return -EIO;
3779
3780                 pin_cfg_value = 0;
3781                 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3782                 pin_cfg_value |= 0x0113;
3783                 /* io_pad_cfg_mode output mode is drive always */
3784                 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3785
3786                 /* write to io pad configuration register - output mode */
3787                 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, pin_cfg_value, 0);
3788                 if (rc != 0) {
3789                         pr_err("error %d\n", rc);
3790                         goto rw_error;
3791                 }
3792
3793                 /* use corresponding bit in io data output registar */
3794                 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, &value, 0);
3795                 if (rc != 0) {
3796                         pr_err("error %d\n", rc);
3797                         goto rw_error;
3798                 }
3799                 if (!uio_data->value)
3800                         value &= 0xFFFB;        /* write zero to 2nd bit - 3rd UIO */
3801                 else
3802                         value |= 0x0004;        /* write one to 2nd bit - 3rd UIO */
3803
3804                 /* write back to io data output register */
3805                 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, value, 0);
3806                 if (rc != 0) {
3807                         pr_err("error %d\n", rc);
3808                         goto rw_error;
3809                 }
3810                 break;
3811    /*=====================================================================*/
3812         case DRX_UIO4:
3813                 /* DRX_UIO4: IRQN UIO-4 */
3814                 if (!ext_attr->has_irqn)
3815                         return -EIO;
3816
3817                 if (ext_attr->uio_irqn_mode != DRX_UIO_MODE_READWRITE)
3818                         return -EIO;
3819
3820                 pin_cfg_value = 0;
3821                 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3822                 pin_cfg_value |= 0x0113;
3823                 /* io_pad_cfg_mode output mode is drive always */
3824                 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3825
3826                 /* write to io pad configuration register - output mode */
3827                 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, pin_cfg_value, 0);
3828                 if (rc != 0) {
3829                         pr_err("error %d\n", rc);
3830                         goto rw_error;
3831                 }
3832
3833                 /* use corresponding bit in io data output registar */
3834                 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3835                 if (rc != 0) {
3836                         pr_err("error %d\n", rc);
3837                         goto rw_error;
3838                 }
3839                 if (uio_data->value == false)
3840                         value &= 0xEFFF;        /* write zero to 12th bit - 4th UIO */
3841                 else
3842                         value |= 0x1000;        /* write one to 12th bit - 4th UIO */
3843
3844                 /* write back to io data output register */
3845                 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3846                 if (rc != 0) {
3847                         pr_err("error %d\n", rc);
3848                         goto rw_error;
3849                 }
3850                 break;
3851       /*=====================================================================*/
3852         default:
3853                 return -EINVAL;
3854         }                       /* switch ( uio_data->uio ) */
3855
3856         /*  Write magic word to disable pdr reg write               */
3857         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3858         if (rc != 0) {
3859                 pr_err("error %d\n", rc);
3860                 goto rw_error;
3861         }
3862
3863         return 0;
3864 rw_error:
3865         return rc;
3866 }
3867
3868 /*---------------------------------------------------------------------------*/
3869 /* UIO Configuration Functions - end                                         */
3870 /*---------------------------------------------------------------------------*/
3871
3872 /*----------------------------------------------------------------------------*/
3873 /* I2C Bridge Functions - begin                                               */
3874 /*----------------------------------------------------------------------------*/
3875 /*
3876 * \fn int ctrl_i2c_bridge()
3877 * \brief Open or close the I2C switch to tuner.
3878 * \param demod Pointer to demodulator instance.
3879 * \param bridge_closed Pointer to bool indication if bridge is closed not.
3880 * \return int.
3881
3882 */
3883 static int
3884 ctrl_i2c_bridge(struct drx_demod_instance *demod, bool *bridge_closed)
3885 {
3886         struct drxj_hi_cmd hi_cmd;
3887         u16 result = 0;
3888
3889         /* check arguments */
3890         if (bridge_closed == NULL)
3891                 return -EINVAL;
3892
3893         hi_cmd.cmd = SIO_HI_RA_RAM_CMD_BRDCTRL;
3894         hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
3895         if (*bridge_closed)
3896                 hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED;
3897         else
3898                 hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN;
3899
3900         return hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
3901 }
3902
3903 /*----------------------------------------------------------------------------*/
3904 /* I2C Bridge Functions - end                                                 */
3905 /*----------------------------------------------------------------------------*/
3906
3907 /*----------------------------------------------------------------------------*/
3908 /* Smart antenna Functions - begin                                            */
3909 /*----------------------------------------------------------------------------*/
3910 /*
3911 * \fn int smart_ant_init()
3912 * \brief Initialize Smart Antenna.
3913 * \param pointer to struct drx_demod_instance.
3914 * \return int.
3915 *
3916 */
3917 static int smart_ant_init(struct drx_demod_instance *demod)
3918 {
3919         struct drxj_data *ext_attr = NULL;
3920         struct i2c_device_addr *dev_addr = NULL;
3921         struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SMA };
3922         int rc;
3923         u16 data = 0;
3924
3925         dev_addr = demod->my_i2c_dev_addr;
3926         ext_attr = (struct drxj_data *) demod->my_ext_attr;
3927
3928         /*  Write magic word to enable pdr reg write               */
3929         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3930         if (rc != 0) {
3931                 pr_err("error %d\n", rc);
3932                 goto rw_error;
3933         }
3934         /* init smart antenna */
3935         rc = drxj_dap_read_reg16(dev_addr, SIO_SA_TX_COMMAND__A, &data, 0);
3936         if (rc != 0) {
3937                 pr_err("error %d\n", rc);
3938                 goto rw_error;
3939         }
3940         if (ext_attr->smart_ant_inverted) {
3941                 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);
3942                 if (rc != 0) {
3943                         pr_err("error %d\n", rc);
3944                         goto rw_error;
3945                 }
3946         } else {
3947                 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);
3948                 if (rc != 0) {
3949                         pr_err("error %d\n", rc);
3950                         goto rw_error;
3951                 }
3952         }
3953
3954         /* config SMA_TX pin to smart antenna mode */
3955         rc = ctrl_set_uio_cfg(demod, &uio_cfg);
3956         if (rc != 0) {
3957                 pr_err("error %d\n", rc);
3958                 goto rw_error;
3959         }
3960         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0x13, 0);
3961         if (rc != 0) {
3962                 pr_err("error %d\n", rc);
3963                 goto rw_error;
3964         }
3965         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_GPIO_FNC__A, 0x03, 0);
3966         if (rc != 0) {
3967                 pr_err("error %d\n", rc);
3968                 goto rw_error;
3969         }
3970
3971         /*  Write magic word to disable pdr reg write               */
3972         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3973         if (rc != 0) {
3974                 pr_err("error %d\n", rc);
3975                 goto rw_error;
3976         }
3977
3978         return 0;
3979 rw_error:
3980         return rc;
3981 }
3982
3983 static int scu_command(struct i2c_device_addr *dev_addr, struct drxjscu_cmd *cmd)
3984 {
3985         int rc;
3986         u16 cur_cmd = 0;
3987         unsigned long timeout;
3988
3989         /* Check param */
3990         if (cmd == NULL)
3991                 return -EINVAL;
3992
3993         /* Wait until SCU command interface is ready to receive command */
3994         rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
3995         if (rc != 0) {
3996                 pr_err("error %d\n", rc);
3997                 goto rw_error;
3998         }
3999         if (cur_cmd != DRX_SCU_READY)
4000                 return -EIO;
4001
4002         switch (cmd->parameter_len) {
4003         case 5:
4004                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_4__A, *(cmd->parameter + 4), 0);
4005                 if (rc != 0) {
4006                         pr_err("error %d\n", rc);
4007                         goto rw_error;
4008                 }       /* fallthrough */
4009         case 4:
4010                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_3__A, *(cmd->parameter + 3), 0);
4011                 if (rc != 0) {
4012                         pr_err("error %d\n", rc);
4013                         goto rw_error;
4014                 }       /* fallthrough */
4015         case 3:
4016                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_2__A, *(cmd->parameter + 2), 0);
4017                 if (rc != 0) {
4018                         pr_err("error %d\n", rc);
4019                         goto rw_error;
4020                 }       /* fallthrough */
4021         case 2:
4022                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_1__A, *(cmd->parameter + 1), 0);
4023                 if (rc != 0) {
4024                         pr_err("error %d\n", rc);
4025                         goto rw_error;
4026                 }       /* fallthrough */
4027         case 1:
4028                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_0__A, *(cmd->parameter + 0), 0);
4029                 if (rc != 0) {
4030                         pr_err("error %d\n", rc);
4031                         goto rw_error;
4032                 }       /* fallthrough */
4033         case 0:
4034                 /* do nothing */
4035                 break;
4036         default:
4037                 /* this number of parameters is not supported */
4038                 return -EIO;
4039         }
4040         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_COMMAND__A, cmd->command, 0);
4041         if (rc != 0) {
4042                 pr_err("error %d\n", rc);
4043                 goto rw_error;
4044         }
4045
4046         /* Wait until SCU has processed command */
4047         timeout = jiffies + msecs_to_jiffies(DRXJ_MAX_WAITTIME);
4048         while (time_is_after_jiffies(timeout)) {
4049                 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
4050                 if (rc != 0) {
4051                         pr_err("error %d\n", rc);
4052                         goto rw_error;
4053                 }
4054                 if (cur_cmd == DRX_SCU_READY)
4055                         break;
4056                 usleep_range(1000, 2000);
4057         }
4058
4059         if (cur_cmd != DRX_SCU_READY)
4060                 return -EIO;
4061
4062         /* read results */
4063         if ((cmd->result_len > 0) && (cmd->result != NULL)) {
4064                 s16 err;
4065
4066                 switch (cmd->result_len) {
4067                 case 4:
4068                         rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_3__A, cmd->result + 3, 0);
4069                         if (rc != 0) {
4070                                 pr_err("error %d\n", rc);
4071                                 goto rw_error;
4072                         }       /* fallthrough */
4073                 case 3:
4074                         rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_2__A, cmd->result + 2, 0);
4075                         if (rc != 0) {
4076                                 pr_err("error %d\n", rc);
4077                                 goto rw_error;
4078                         }       /* fallthrough */
4079                 case 2:
4080                         rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_1__A, cmd->result + 1, 0);
4081                         if (rc != 0) {
4082                                 pr_err("error %d\n", rc);
4083                                 goto rw_error;
4084                         }       /* fallthrough */
4085                 case 1:
4086                         rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_0__A, cmd->result + 0, 0);
4087                         if (rc != 0) {
4088                                 pr_err("error %d\n", rc);
4089                                 goto rw_error;
4090                         }       /* fallthrough */
4091                 case 0:
4092                         /* do nothing */
4093                         break;
4094                 default:
4095                         /* this number of parameters is not supported */
4096                         return -EIO;
4097                 }
4098
4099                 /* Check if an error was reported by SCU */
4100                 err = cmd->result[0];
4101
4102                 /* check a few fixed error codes */
4103                 if ((err == (s16) SCU_RAM_PARAM_0_RESULT_UNKSTD)
4104                     || (err == (s16) SCU_RAM_PARAM_0_RESULT_UNKCMD)
4105                     || (err == (s16) SCU_RAM_PARAM_0_RESULT_INVPAR)
4106                     || (err == (s16) SCU_RAM_PARAM_0_RESULT_SIZE)
4107                     ) {
4108                         return -EINVAL;
4109                 }
4110                 /* here it is assumed that negative means error, and positive no error */
4111                 else if (err < 0)
4112                         return -EIO;
4113                 else
4114                         return 0;
4115         }
4116
4117         return 0;
4118
4119 rw_error:
4120         return rc;
4121 }
4122
4123 /*
4124 * \fn int DRXJ_DAP_SCUAtomicReadWriteBlock()
4125 * \brief Basic access routine for SCU atomic read or write access
4126 * \param dev_addr  pointer to i2c dev address
4127 * \param addr     destination/source address
4128 * \param datasize size of data buffer in bytes
4129 * \param data     pointer to data buffer
4130 * \return int
4131 * \retval 0 Succes
4132 * \retval -EIO Timeout, I2C error, illegal bank
4133 *
4134 */
4135 #define ADDR_AT_SCU_SPACE(x) ((x - 0x82E000) * 2)
4136 static
4137 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 */
4138                                               u8 *data, bool read_flag)
4139 {
4140         struct drxjscu_cmd scu_cmd;
4141         int rc;
4142         u16 set_param_parameters[18];
4143         u16 cmd_result[15];
4144
4145         /* Parameter check */
4146         if (!data || !dev_addr || (datasize % 2) || ((datasize / 2) > 16))
4147                 return -EINVAL;
4148
4149         set_param_parameters[1] = (u16) ADDR_AT_SCU_SPACE(addr);
4150         if (read_flag) {                /* read */
4151                 set_param_parameters[0] = ((~(0x0080)) & datasize);
4152                 scu_cmd.parameter_len = 2;
4153                 scu_cmd.result_len = datasize / 2 + 2;
4154         } else {
4155                 int i = 0;
4156
4157                 set_param_parameters[0] = 0x0080 | datasize;
4158                 for (i = 0; i < (datasize / 2); i++) {
4159                         set_param_parameters[i + 2] =
4160                             (data[2 * i] | (data[(2 * i) + 1] << 8));
4161                 }
4162                 scu_cmd.parameter_len = datasize / 2 + 2;
4163                 scu_cmd.result_len = 1;
4164         }
4165
4166         scu_cmd.command =
4167             SCU_RAM_COMMAND_STANDARD_TOP |
4168             SCU_RAM_COMMAND_CMD_AUX_SCU_ATOMIC_ACCESS;
4169         scu_cmd.result = cmd_result;
4170         scu_cmd.parameter = set_param_parameters;
4171         rc = scu_command(dev_addr, &scu_cmd);
4172         if (rc != 0) {
4173                 pr_err("error %d\n", rc);
4174                 goto rw_error;
4175         }
4176
4177         if (read_flag) {
4178                 int i = 0;
4179                 /* read data from buffer */
4180                 for (i = 0; i < (datasize / 2); i++) {
4181                         data[2 * i] = (u8) (scu_cmd.result[i + 2] & 0xFF);
4182                         data[(2 * i) + 1] = (u8) (scu_cmd.result[i + 2] >> 8);
4183                 }
4184         }
4185
4186         return 0;
4187
4188 rw_error:
4189         return rc;
4190
4191 }
4192
4193 /*============================================================================*/
4194
4195 /*
4196 * \fn int DRXJ_DAP_AtomicReadReg16()
4197 * \brief Atomic read of 16 bits words
4198 */
4199 static
4200 int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr *dev_addr,
4201                                          u32 addr,
4202                                          u16 *data, u32 flags)
4203 {
4204         u8 buf[2] = { 0 };
4205         int rc = -EIO;
4206         u16 word = 0;
4207
4208         if (!data)
4209                 return -EINVAL;
4210
4211         rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, true);
4212         if (rc < 0)
4213                 return rc;
4214
4215         word = (u16) (buf[0] + (buf[1] << 8));
4216
4217         *data = word;
4218
4219         return rc;
4220 }
4221
4222 /*============================================================================*/
4223 /*
4224 * \fn int drxj_dap_scu_atomic_write_reg16()
4225 * \brief Atomic read of 16 bits words
4226 */
4227 static
4228 int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr *dev_addr,
4229                                           u32 addr,
4230                                           u16 data, u32 flags)
4231 {
4232         u8 buf[2];
4233         int rc = -EIO;
4234
4235         buf[0] = (u8) (data & 0xff);
4236         buf[1] = (u8) ((data >> 8) & 0xff);
4237
4238         rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, false);
4239
4240         return rc;
4241 }
4242
4243 /* -------------------------------------------------------------------------- */
4244 /*
4245 * \brief Measure result of ADC synchronisation
4246 * \param demod demod instance
4247 * \param count (returned) count
4248 * \return int.
4249 * \retval 0    Success
4250 * \retval -EIO Failure: I2C error
4251 *
4252 */
4253 static int adc_sync_measurement(struct drx_demod_instance *demod, u16 *count)
4254 {
4255         struct i2c_device_addr *dev_addr = NULL;
4256         int rc;
4257         u16 data = 0;
4258
4259         dev_addr = demod->my_i2c_dev_addr;
4260
4261         /* Start measurement */
4262         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE, 0);
4263         if (rc != 0) {
4264                 pr_err("error %d\n", rc);
4265                 goto rw_error;
4266         }
4267         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_START_LOCK__A, 1, 0);
4268         if (rc != 0) {
4269                 pr_err("error %d\n", rc);
4270                 goto rw_error;
4271         }
4272
4273         /* Wait at least 3*128*(1/sysclk) <<< 1 millisec */
4274         msleep(1);
4275
4276         *count = 0;
4277         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE0__A, &data, 0);
4278         if (rc != 0) {
4279                 pr_err("error %d\n", rc);
4280                 goto rw_error;
4281         }
4282         if (data == 127)
4283                 *count = *count + 1;
4284         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE1__A, &data, 0);
4285         if (rc != 0) {
4286                 pr_err("error %d\n", rc);
4287                 goto rw_error;
4288         }
4289         if (data == 127)
4290                 *count = *count + 1;
4291         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE2__A, &data, 0);
4292         if (rc != 0) {
4293                 pr_err("error %d\n", rc);
4294                 goto rw_error;
4295         }
4296         if (data == 127)
4297                 *count = *count + 1;
4298
4299         return 0;
4300 rw_error:
4301         return rc;
4302 }
4303
4304 /*
4305 * \brief Synchronize analog and digital clock domains
4306 * \param demod demod instance
4307 * \return int.
4308 * \retval 0    Success
4309 * \retval -EIO Failure: I2C error or failure to synchronize
4310 *
4311 * An IQM reset will also reset the results of this synchronization.
4312 * After an IQM reset this routine needs to be called again.
4313 *
4314 */
4315
4316 static int adc_synchronization(struct drx_demod_instance *demod)
4317 {
4318         struct i2c_device_addr *dev_addr = NULL;
4319         int rc;
4320         u16 count = 0;
4321
4322         dev_addr = demod->my_i2c_dev_addr;
4323
4324         rc = adc_sync_measurement(demod, &count);
4325         if (rc != 0) {
4326                 pr_err("error %d\n", rc);
4327                 goto rw_error;
4328         }
4329
4330         if (count == 1) {
4331                 /* Try sampling on a different edge */
4332                 u16 clk_neg = 0;
4333
4334                 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_CLKNEG__A, &clk_neg, 0);
4335                 if (rc != 0) {
4336                         pr_err("error %d\n", rc);
4337                         goto rw_error;
4338                 }
4339
4340                 clk_neg ^= IQM_AF_CLKNEG_CLKNEGDATA__M;
4341                 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLKNEG__A, clk_neg, 0);
4342                 if (rc != 0) {
4343                         pr_err("error %d\n", rc);
4344                         goto rw_error;
4345                 }
4346
4347                 rc = adc_sync_measurement(demod, &count);
4348                 if (rc != 0) {
4349                         pr_err("error %d\n", rc);
4350                         goto rw_error;
4351                 }
4352         }
4353
4354         /* TODO: implement fallback scenarios */
4355         if (count < 2)
4356                 return -EIO;
4357
4358         return 0;
4359 rw_error:
4360         return rc;
4361 }
4362
4363 /*============================================================================*/
4364 /*==                      END AUXILIARY FUNCTIONS                           ==*/
4365 /*============================================================================*/
4366
4367 /*============================================================================*/
4368 /*============================================================================*/
4369 /*==                8VSB & QAM COMMON DATAPATH FUNCTIONS                    ==*/
4370 /*============================================================================*/
4371 /*============================================================================*/
4372 /*
4373 * \fn int init_agc ()
4374 * \brief Initialize AGC for all standards.
4375 * \param demod instance of demodulator.
4376 * \param channel pointer to channel data.
4377 * \return int.
4378 */
4379 static int init_agc(struct drx_demod_instance *demod)
4380 {
4381         struct i2c_device_addr *dev_addr = NULL;
4382         struct drx_common_attr *common_attr = NULL;
4383         struct drxj_data *ext_attr = NULL;
4384         struct drxj_cfg_agc *p_agc_rf_settings = NULL;
4385         struct drxj_cfg_agc *p_agc_if_settings = NULL;
4386         int rc;
4387         u16 ingain_tgt_max = 0;
4388         u16 clp_dir_to = 0;
4389         u16 sns_sum_max = 0;
4390         u16 clp_sum_max = 0;
4391         u16 sns_dir_to = 0;
4392         u16 ki_innergain_min = 0;
4393         u16 agc_ki = 0;
4394         u16 ki_max = 0;
4395         u16 if_iaccu_hi_tgt_min = 0;
4396         u16 data = 0;
4397         u16 agc_ki_dgain = 0;
4398         u16 ki_min = 0;
4399         u16 clp_ctrl_mode = 0;
4400         u16 agc_rf = 0;
4401         u16 agc_if = 0;
4402
4403         dev_addr = demod->my_i2c_dev_addr;
4404         common_attr = (struct drx_common_attr *) demod->my_common_attr;
4405         ext_attr = (struct drxj_data *) demod->my_ext_attr;
4406
4407         switch (ext_attr->standard) {
4408         case DRX_STANDARD_8VSB:
4409                 clp_sum_max = 1023;
4410                 clp_dir_to = (u16) (-9);
4411                 sns_sum_max = 1023;
4412                 sns_dir_to = (u16) (-9);
4413                 ki_innergain_min = (u16) (-32768);
4414                 ki_max = 0x032C;
4415                 agc_ki_dgain = 0xC;
4416                 if_iaccu_hi_tgt_min = 2047;
4417                 ki_min = 0x0117;
4418                 ingain_tgt_max = 16383;
4419                 clp_ctrl_mode = 0;
4420                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4421                 if (rc != 0) {
4422                         pr_err("error %d\n", rc);
4423                         goto rw_error;
4424                 }
4425                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4426                 if (rc != 0) {
4427                         pr_err("error %d\n", rc);
4428                         goto rw_error;
4429                 }
4430                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4431                 if (rc != 0) {
4432                         pr_err("error %d\n", rc);
4433                         goto rw_error;
4434                 }
4435                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4436                 if (rc != 0) {
4437                         pr_err("error %d\n", rc);
4438                         goto rw_error;
4439                 }
4440                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4441                 if (rc != 0) {
4442                         pr_err("error %d\n", rc);
4443                         goto rw_error;
4444                 }
4445                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4446                 if (rc != 0) {
4447                         pr_err("error %d\n", rc);
4448                         goto rw_error;
4449                 }
4450                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4451                 if (rc != 0) {
4452                         pr_err("error %d\n", rc);
4453                         goto rw_error;
4454                 }
4455                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4456                 if (rc != 0) {
4457                         pr_err("error %d\n", rc);
4458                         goto rw_error;
4459                 }
4460                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4461                 if (rc != 0) {
4462                         pr_err("error %d\n", rc);
4463                         goto rw_error;
4464                 }
4465                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4466                 if (rc != 0) {
4467                         pr_err("error %d\n", rc);
4468                         goto rw_error;
4469                 }
4470                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, 1024, 0);
4471                 if (rc != 0) {
4472                         pr_err("error %d\n", rc);
4473                         goto rw_error;
4474                 }
4475                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_VSB_AGC_POW_TGT__A, 22600, 0);
4476                 if (rc != 0) {
4477                         pr_err("error %d\n", rc);
4478                         goto rw_error;
4479                 }
4480                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, 13200, 0);
4481                 if (rc != 0) {
4482                         pr_err("error %d\n", rc);
4483                         goto rw_error;
4484                 }
4485                 p_agc_if_settings = &(ext_attr->vsb_if_agc_cfg);
4486                 p_agc_rf_settings = &(ext_attr->vsb_rf_agc_cfg);
4487                 break;
4488 #ifndef DRXJ_VSB_ONLY
4489         case DRX_STANDARD_ITU_A:
4490         case DRX_STANDARD_ITU_C:
4491         case DRX_STANDARD_ITU_B:
4492                 ingain_tgt_max = 5119;
4493                 clp_sum_max = 1023;
4494                 clp_dir_to = (u16) (-5);
4495                 sns_sum_max = 127;
4496                 sns_dir_to = (u16) (-3);
4497                 ki_innergain_min = 0;
4498                 ki_max = 0x0657;
4499                 if_iaccu_hi_tgt_min = 2047;
4500                 agc_ki_dgain = 0x7;
4501                 ki_min = 0x0117;
4502                 clp_ctrl_mode = 0;
4503                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4504                 if (rc != 0) {
4505                         pr_err("error %d\n", rc);
4506                         goto rw_error;
4507                 }
4508                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4509                 if (rc != 0) {
4510                         pr_err("error %d\n", rc);
4511                         goto rw_error;
4512                 }
4513                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4514                 if (rc != 0) {
4515                         pr_err("error %d\n", rc);
4516                         goto rw_error;
4517                 }
4518                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4519                 if (rc != 0) {
4520                         pr_err("error %d\n", rc);
4521                         goto rw_error;
4522                 }
4523                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4524                 if (rc != 0) {
4525                         pr_err("error %d\n", rc);
4526                         goto rw_error;
4527                 }
4528                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4529                 if (rc != 0) {
4530                         pr_err("error %d\n", rc);
4531                         goto rw_error;
4532                 }
4533                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4534                 if (rc != 0) {
4535                         pr_err("error %d\n", rc);
4536                         goto rw_error;
4537                 }
4538                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4539                 if (rc != 0) {
4540                         pr_err("error %d\n", rc);
4541                         goto rw_error;
4542                 }
4543                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4544                 if (rc != 0) {
4545                         pr_err("error %d\n", rc);
4546                         goto rw_error;
4547                 }
4548                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4549                 if (rc != 0) {
4550                         pr_err("error %d\n", rc);
4551                         goto rw_error;
4552                 }
4553                 p_agc_if_settings = &(ext_attr->qam_if_agc_cfg);
4554                 p_agc_rf_settings = &(ext_attr->qam_rf_agc_cfg);
4555                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, p_agc_if_settings->top, 0);
4556                 if (rc != 0) {
4557                         pr_err("error %d\n", rc);
4558                         goto rw_error;
4559                 }
4560
4561                 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &agc_ki, 0);
4562                 if (rc != 0) {
4563                         pr_err("error %d\n", rc);
4564                         goto rw_error;
4565                 }
4566                 agc_ki &= 0xf000;
4567                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, agc_ki, 0);
4568                 if (rc != 0) {
4569                         pr_err("error %d\n", rc);
4570                         goto rw_error;
4571                 }
4572                 break;
4573 #endif
4574         default:
4575                 return -EINVAL;
4576         }
4577
4578         /* for new AGC interface */
4579         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_if_settings->top, 0);
4580         if (rc != 0) {
4581                 pr_err("error %d\n", rc);
4582                 goto rw_error;
4583         }
4584         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, p_agc_if_settings->top, 0);
4585         if (rc != 0) {
4586                 pr_err("error %d\n", rc);
4587                 goto rw_error;
4588         }       /* Gain fed from inner to outer AGC */
4589         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max, 0);
4590         if (rc != 0) {
4591                 pr_err("error %d\n", rc);
4592                 goto rw_error;
4593         }
4594         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, if_iaccu_hi_tgt_min, 0);
4595         if (rc != 0) {
4596                 pr_err("error %d\n", rc);
4597                 goto rw_error;
4598         }
4599         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI__A, 0, 0);
4600         if (rc != 0) {
4601                 pr_err("error %d\n", rc);
4602                 goto rw_error;
4603         }       /* set to p_agc_settings->top before */
4604         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_LO__A, 0, 0);
4605         if (rc != 0) {
4606                 pr_err("error %d\n", rc);
4607                 goto rw_error;
4608         }
4609         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, 0, 0);
4610         if (rc != 0) {
4611                 pr_err("error %d\n", rc);
4612                 goto rw_error;
4613         }
4614         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_LO__A, 0, 0);
4615         if (rc != 0) {
4616                 pr_err("error %d\n", rc);
4617                 goto rw_error;
4618         }
4619         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_MAX__A, 32767, 0);
4620         if (rc != 0) {
4621                 pr_err("error %d\n", rc);
4622                 goto rw_error;
4623         }
4624         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max, 0);
4625         if (rc != 0) {
4626                 pr_err("error %d\n", rc);
4627                 goto rw_error;
4628         }
4629         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max, 0);
4630         if (rc != 0) {
4631                 pr_err("error %d\n", rc);
4632                 goto rw_error;
4633         }
4634         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, ki_innergain_min, 0);
4635         if (rc != 0) {
4636                 pr_err("error %d\n", rc);
4637                 goto rw_error;
4638         }
4639         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50, 0);
4640         if (rc != 0) {
4641                 pr_err("error %d\n", rc);
4642                 goto rw_error;
4643         }
4644         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_CYCLEN__A, 500, 0);
4645         if (rc != 0) {
4646                 pr_err("error %d\n", rc);
4647                 goto rw_error;
4648         }
4649         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCLEN__A, 500, 0);
4650         if (rc != 0) {
4651                 pr_err("error %d\n", rc);
4652                 goto rw_error;
4653         }
4654         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20, 0);
4655         if (rc != 0) {
4656                 pr_err("error %d\n", rc);
4657                 goto rw_error;
4658         }
4659         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MIN__A, ki_min, 0);
4660         if (rc != 0) {
4661                 pr_err("error %d\n", rc);
4662                 goto rw_error;
4663         }
4664         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAX__A, ki_max, 0);
4665         if (rc != 0) {
4666                 pr_err("error %d\n", rc);
4667                 goto rw_error;
4668         }
4669         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_RED__A, 0, 0);
4670         if (rc != 0) {
4671                 pr_err("error %d\n", rc);
4672                 goto rw_error;
4673         }
4674         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MIN__A, 8, 0);
4675         if (rc != 0) {
4676                 pr_err("error %d\n", rc);
4677                 goto rw_error;
4678         }
4679         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCLEN__A, 500, 0);
4680         if (rc != 0) {
4681                 pr_err("error %d\n", rc);
4682                 goto rw_error;
4683         }
4684         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to, 0);
4685         if (rc != 0) {
4686                 pr_err("error %d\n", rc);
4687                 goto rw_error;
4688         }
4689         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MIN__A, 8, 0);
4690         if (rc != 0) {
4691                 pr_err("error %d\n", rc);
4692                 goto rw_error;
4693         }
4694         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to, 0);
4695         if (rc != 0) {
4696                 pr_err("error %d\n", rc);
4697                 goto rw_error;
4698         }
4699         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, 50, 0);
4700         if (rc != 0) {
4701                 pr_err("error %d\n", rc);
4702                 goto rw_error;
4703         }
4704         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode, 0);
4705         if (rc != 0) {
4706                 pr_err("error %d\n", rc);
4707                 goto rw_error;
4708         }
4709
4710         agc_rf = 0x800 + p_agc_rf_settings->cut_off_current;
4711         if (common_attr->tuner_rf_agc_pol == true)
4712                 agc_rf = 0x87ff - agc_rf;
4713
4714         agc_if = 0x800;
4715         if (common_attr->tuner_if_agc_pol == true)
4716                 agc_rf = 0x87ff - agc_rf;
4717
4718         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_RF__A, agc_rf, 0);
4719         if (rc != 0) {
4720                 pr_err("error %d\n", rc);
4721                 goto rw_error;
4722         }
4723         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_IF__A, agc_if, 0);
4724         if (rc != 0) {
4725                 pr_err("error %d\n", rc);
4726                 goto rw_error;
4727         }
4728
4729         /* Set/restore Ki DGAIN factor */
4730         rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4731         if (rc != 0) {
4732                 pr_err("error %d\n", rc);
4733                 goto rw_error;
4734         }
4735         data &= ~SCU_RAM_AGC_KI_DGAIN__M;
4736         data |= (agc_ki_dgain << SCU_RAM_AGC_KI_DGAIN__B);
4737         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4738         if (rc != 0) {
4739                 pr_err("error %d\n", rc);
4740                 goto rw_error;
4741         }
4742
4743         return 0;
4744 rw_error:
4745         return rc;
4746 }
4747
4748 /*
4749 * \fn int set_frequency ()
4750 * \brief Set frequency shift.
4751 * \param demod instance of demodulator.
4752 * \param channel pointer to channel data.
4753 * \param tuner_freq_offset residual frequency from tuner.
4754 * \return int.
4755 */
4756 static int
4757 set_frequency(struct drx_demod_instance *demod,
4758               struct drx_channel *channel, s32 tuner_freq_offset)
4759 {
4760         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
4761         struct drxj_data *ext_attr = demod->my_ext_attr;
4762         int rc;
4763         s32 sampling_frequency = 0;
4764         s32 frequency_shift = 0;
4765         s32 if_freq_actual = 0;
4766         s32 rf_freq_residual = -1 * tuner_freq_offset;
4767         s32 adc_freq = 0;
4768         s32 intermediate_freq = 0;
4769         u32 iqm_fs_rate_ofs = 0;
4770         bool adc_flip = true;
4771         bool select_pos_image = false;
4772         bool rf_mirror;
4773         bool tuner_mirror;
4774         bool image_to_select = true;
4775         s32 fm_frequency_shift = 0;
4776
4777         rf_mirror = (ext_attr->mirror == DRX_MIRROR_YES) ? true : false;
4778         tuner_mirror = demod->my_common_attr->mirror_freq_spect ? false : true;
4779         /*
4780            Program frequency shifter
4781            No need to account for mirroring on RF
4782          */
4783         switch (ext_attr->standard) {
4784         case DRX_STANDARD_ITU_A:
4785         case DRX_STANDARD_ITU_C:
4786         case DRX_STANDARD_PAL_SECAM_LP:
4787         case DRX_STANDARD_8VSB:
4788                 select_pos_image = true;
4789                 break;
4790         case DRX_STANDARD_FM:
4791                 /* After IQM FS sound carrier must appear at 4 Mhz in spect.
4792                    Sound carrier is already 3Mhz above centre frequency due
4793                    to tuner setting so now add an extra shift of 1MHz... */
4794                 fm_frequency_shift = 1000;
4795                 /*fall through */
4796         case DRX_STANDARD_ITU_B:
4797         case DRX_STANDARD_NTSC:
4798         case DRX_STANDARD_PAL_SECAM_BG:
4799         case DRX_STANDARD_PAL_SECAM_DK:
4800         case DRX_STANDARD_PAL_SECAM_I:
4801         case DRX_STANDARD_PAL_SECAM_L:
4802                 select_pos_image = false;
4803                 break;
4804         default:
4805                 return -EINVAL;
4806         }
4807         intermediate_freq = demod->my_common_attr->intermediate_freq;
4808         sampling_frequency = demod->my_common_attr->sys_clock_freq / 3;
4809         if (tuner_mirror)
4810                 if_freq_actual = intermediate_freq + rf_freq_residual + fm_frequency_shift;
4811         else
4812                 if_freq_actual = intermediate_freq - rf_freq_residual - fm_frequency_shift;
4813         if (if_freq_actual > sampling_frequency / 2) {
4814                 /* adc mirrors */
4815                 adc_freq = sampling_frequency - if_freq_actual;
4816                 adc_flip = true;
4817         } else {
4818                 /* adc doesn't mirror */
4819                 adc_freq = if_freq_actual;
4820                 adc_flip = false;
4821         }
4822
4823         frequency_shift = adc_freq;
4824         image_to_select =
4825             (bool) (rf_mirror ^ tuner_mirror ^ adc_flip ^ select_pos_image);
4826         iqm_fs_rate_ofs = frac28(frequency_shift, sampling_frequency);
4827
4828         if (image_to_select)
4829                 iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
4830
4831         /* Program frequency shifter with tuner offset compensation */
4832         /* frequency_shift += tuner_freq_offset; TODO */
4833         rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
4834         if (rc != 0) {
4835                 pr_err("error %d\n", rc);
4836                 goto rw_error;
4837         }
4838         ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
4839         ext_attr->pos_image = (bool) (rf_mirror ^ tuner_mirror ^ select_pos_image);
4840
4841         return 0;
4842 rw_error:
4843         return rc;
4844 }
4845
4846 /*
4847 * \fn int get_acc_pkt_err()
4848 * \brief Retrieve signal strength for VSB and QAM.
4849 * \param demod Pointer to demod instance
4850 * \param packet_err Pointer to packet error
4851 * \return int.
4852 * \retval 0 sig_strength contains valid data.
4853 * \retval -EINVAL sig_strength is NULL.
4854 * \retval -EIO Erroneous data, sig_strength contains invalid data.
4855 */
4856 #ifdef DRXJ_SIGNAL_ACCUM_ERR
4857 static int get_acc_pkt_err(struct drx_demod_instance *demod, u16 *packet_err)
4858 {
4859         int rc;
4860         static u16 pkt_err;
4861         static u16 last_pkt_err;
4862         u16 data = 0;
4863         struct drxj_data *ext_attr = NULL;
4864         struct i2c_device_addr *dev_addr = NULL;
4865
4866         ext_attr = (struct drxj_data *) demod->my_ext_attr;
4867         dev_addr = demod->my_i2c_dev_addr;
4868
4869         rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, &data, 0);
4870         if (rc != 0) {
4871                 pr_err("error %d\n", rc);
4872                 goto rw_error;
4873         }
4874         if (ext_attr->reset_pkt_err_acc) {
4875                 last_pkt_err = data;
4876                 pkt_err = 0;
4877                 ext_attr->reset_pkt_err_acc = false;
4878         }
4879
4880         if (data < last_pkt_err) {
4881                 pkt_err += 0xffff - last_pkt_err;
4882                 pkt_err += data;
4883         } else {
4884                 pkt_err += (data - last_pkt_err);
4885         }
4886         *packet_err = pkt_err;
4887         last_pkt_err = data;
4888
4889         return 0;
4890 rw_error:
4891         return rc;
4892 }
4893 #endif
4894
4895
4896 /*============================================================================*/
4897
4898 /*
4899 * \fn int set_agc_rf ()
4900 * \brief Configure RF AGC
4901 * \param demod instance of demodulator.
4902 * \param agc_settings AGC configuration structure
4903 * \return int.
4904 */
4905 static int
4906 set_agc_rf(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
4907 {
4908         struct i2c_device_addr *dev_addr = NULL;
4909         struct drxj_data *ext_attr = NULL;
4910         struct drxj_cfg_agc *p_agc_settings = NULL;
4911         struct drx_common_attr *common_attr = NULL;
4912         int rc;
4913         drx_write_reg16func_t scu_wr16 = NULL;
4914         drx_read_reg16func_t scu_rr16 = NULL;
4915
4916         common_attr = (struct drx_common_attr *) demod->my_common_attr;
4917         dev_addr = demod->my_i2c_dev_addr;
4918         ext_attr = (struct drxj_data *) demod->my_ext_attr;
4919
4920         if (atomic) {
4921                 scu_rr16 = drxj_dap_scu_atomic_read_reg16;
4922                 scu_wr16 = drxj_dap_scu_atomic_write_reg16;
4923         } else {
4924                 scu_rr16 = drxj_dap_read_reg16;
4925                 scu_wr16 = drxj_dap_write_reg16;
4926         }
4927
4928         /* Configure AGC only if standard is currently active */
4929         if ((ext_attr->standard == agc_settings->standard) ||
4930             (DRXJ_ISQAMSTD(ext_attr->standard) &&
4931              DRXJ_ISQAMSTD(agc_settings->standard)) ||
4932             (DRXJ_ISATVSTD(ext_attr->standard) &&
4933              DRXJ_ISATVSTD(agc_settings->standard))) {
4934                 u16 data = 0;
4935
4936                 switch (agc_settings->ctrl_mode) {
4937                 case DRX_AGC_CTRL_AUTO:
4938
4939                         /* Enable RF AGC DAC */
4940                         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
4941                         if (rc != 0) {
4942                                 pr_err("error %d\n", rc);
4943                                 goto rw_error;
4944                         }
4945                         data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
4946                         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
4947                         if (rc != 0) {
4948                                 pr_err("error %d\n", rc);
4949                                 goto rw_error;
4950                         }
4951
4952                         /* Enable SCU RF AGC loop */
4953                         rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4954                         if (rc != 0) {
4955                                 pr_err("error %d\n", rc);
4956                                 goto rw_error;
4957                         }
4958                         data &= ~SCU_RAM_AGC_KI_RF__M;
4959                         if (ext_attr->standard == DRX_STANDARD_8VSB)
4960                                 data |= (2 << SCU_RAM_AGC_KI_RF__B);
4961                         else if (DRXJ_ISQAMSTD(ext_attr->standard))
4962                                 data |= (5 << SCU_RAM_AGC_KI_RF__B);
4963                         else
4964                                 data |= (4 << SCU_RAM_AGC_KI_RF__B);
4965
4966                         if (common_attr->tuner_rf_agc_pol)
4967                                 data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
4968                         else
4969                                 data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
4970                         rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4971                         if (rc != 0) {
4972                                 pr_err("error %d\n", rc);
4973                                 goto rw_error;
4974                         }
4975
4976                         /* Set speed ( using complementary reduction value ) */
4977                         rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
4978                         if (rc != 0) {
4979                                 pr_err("error %d\n", rc);
4980                                 goto rw_error;
4981                         }
4982                         data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
4983                         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);
4984                         if (rc != 0) {
4985                                 pr_err("error %d\n", rc);
4986                                 goto rw_error;
4987                         }
4988
4989                         if (agc_settings->standard == DRX_STANDARD_8VSB)
4990                                 p_agc_settings = &(ext_attr->vsb_if_agc_cfg);
4991                         else if (DRXJ_ISQAMSTD(agc_settings->standard))
4992                                 p_agc_settings = &(ext_attr->qam_if_agc_cfg);
4993                         else if (DRXJ_ISATVSTD(agc_settings->standard))
4994                                 p_agc_settings = &(ext_attr->atv_if_agc_cfg);
4995                         else
4996                                 return -EINVAL;
4997
4998                         /* Set TOP, only if IF-AGC is in AUTO mode */
4999                         if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
5000                                 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->top, 0);
5001                                 if (rc != 0) {
5002                                         pr_err("error %d\n", rc);
5003                                         goto rw_error;
5004                                 }
5005                                 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, agc_settings->top, 0);
5006                                 if (rc != 0) {
5007                                         pr_err("error %d\n", rc);
5008                                         goto rw_error;
5009                                 }
5010                         }
5011
5012                         /* Cut-Off current */
5013                         rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI_CO__A, agc_settings->cut_off_current, 0);
5014                         if (rc != 0) {
5015                                 pr_err("error %d\n", rc);
5016                                 goto rw_error;
5017                         }
5018                         break;
5019                 case DRX_AGC_CTRL_USER:
5020
5021                         /* Enable RF AGC DAC */
5022                         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5023                         if (rc != 0) {
5024                                 pr_err("error %d\n", rc);
5025                                 goto rw_error;
5026                         }
5027                         data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
5028                         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5029                         if (rc != 0) {
5030                                 pr_err("error %d\n", rc);
5031                                 goto rw_error;
5032                         }
5033
5034                         /* Disable SCU RF AGC loop */
5035                         rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5036                         if (rc != 0) {
5037                                 pr_err("error %d\n", rc);
5038                                 goto rw_error;
5039                         }
5040                         data &= ~SCU_RAM_AGC_KI_RF__M;
5041                         if (common_attr->tuner_rf_agc_pol)
5042                                 data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
5043                         else
5044                                 data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
5045                         rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5046                         if (rc != 0) {
5047                                 pr_err("error %d\n", rc);
5048                                 goto rw_error;
5049                         }
5050
5051                         /* Write value to output pin */
5052                         rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, agc_settings->output_level, 0);
5053                         if (rc != 0) {
5054                                 pr_err("error %d\n", rc);
5055                                 goto rw_error;
5056                         }
5057                         break;
5058                 case DRX_AGC_CTRL_OFF:
5059
5060                         /* Disable RF AGC DAC */
5061                         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5062                         if (rc != 0) {
5063                                 pr_err("error %d\n", rc);
5064                                 goto rw_error;
5065                         }
5066                         data &= (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE);
5067                         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5068                         if (rc != 0) {
5069                                 pr_err("error %d\n", rc);
5070                                 goto rw_error;
5071                         }
5072
5073                         /* Disable SCU RF AGC loop */
5074                         rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5075                         if (rc != 0) {
5076                                 pr_err("error %d\n", rc);
5077                                 goto rw_error;
5078                         }
5079                         data &= ~SCU_RAM_AGC_KI_RF__M;
5080                         rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5081                         if (rc != 0) {
5082                                 pr_err("error %d\n", rc);
5083                                 goto rw_error;
5084                         }
5085                         break;
5086                 default:
5087                         return -EINVAL;
5088                 }               /* switch ( agcsettings->ctrl_mode ) */
5089         }
5090
5091         /* Store rf agc settings */
5092         switch (agc_settings->standard) {
5093         case DRX_STANDARD_8VSB:
5094                 ext_attr->vsb_rf_agc_cfg = *agc_settings;
5095                 break;
5096 #ifndef DRXJ_VSB_ONLY
5097         case DRX_STANDARD_ITU_A:
5098         case DRX_STANDARD_ITU_B:
5099         case DRX_STANDARD_ITU_C:
5100                 ext_attr->qam_rf_agc_cfg = *agc_settings;
5101                 break;
5102 #endif
5103         default:
5104                 return -EIO;
5105         }
5106
5107         return 0;
5108 rw_error:
5109         return rc;
5110 }
5111
5112 /*
5113 * \fn int set_agc_if ()
5114 * \brief Configure If AGC
5115 * \param demod instance of demodulator.
5116 * \param agc_settings AGC configuration structure
5117 * \return int.
5118 */
5119 static int
5120 set_agc_if(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
5121 {
5122         struct i2c_device_addr *dev_addr = NULL;
5123         struct drxj_data *ext_attr = NULL;
5124         struct drxj_cfg_agc *p_agc_settings = NULL;
5125         struct drx_common_attr *common_attr = NULL;
5126         drx_write_reg16func_t scu_wr16 = NULL;
5127         drx_read_reg16func_t scu_rr16 = NULL;
5128         int rc;
5129
5130         common_attr = (struct drx_common_attr *) demod->my_common_attr;
5131         dev_addr = demod->my_i2c_dev_addr;
5132         ext_attr = (struct drxj_data *) demod->my_ext_attr;
5133
5134         if (atomic) {
5135                 scu_rr16 = drxj_dap_scu_atomic_read_reg16;
5136                 scu_wr16 = drxj_dap_scu_atomic_write_reg16;
5137         } else {
5138                 scu_rr16 = drxj_dap_read_reg16;
5139                 scu_wr16 = drxj_dap_write_reg16;
5140         }
5141
5142         /* Configure AGC only if standard is currently active */
5143         if ((ext_attr->standard == agc_settings->standard) ||
5144             (DRXJ_ISQAMSTD(ext_attr->standard) &&
5145              DRXJ_ISQAMSTD(agc_settings->standard)) ||
5146             (DRXJ_ISATVSTD(ext_attr->standard) &&
5147              DRXJ_ISATVSTD(agc_settings->standard))) {
5148                 u16 data = 0;
5149
5150                 switch (agc_settings->ctrl_mode) {
5151                 case DRX_AGC_CTRL_AUTO:
5152                         /* Enable IF AGC DAC */
5153                         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5154                         if (rc != 0) {
5155                                 pr_err("error %d\n", rc);
5156                                 goto rw_error;
5157                         }
5158                         data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5159                         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5160                         if (rc != 0) {
5161                                 pr_err("error %d\n", rc);
5162                                 goto rw_error;
5163                         }
5164
5165                         /* Enable SCU IF AGC loop */
5166                         rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5167                         if (rc != 0) {
5168                                 pr_err("error %d\n", rc);
5169                                 goto rw_error;
5170                         }
5171                         data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5172                         data &= ~SCU_RAM_AGC_KI_IF__M;
5173                         if (ext_attr->standard == DRX_STANDARD_8VSB)
5174                                 data |= (3 << SCU_RAM_AGC_KI_IF__B);
5175                         else if (DRXJ_ISQAMSTD(ext_attr->standard))
5176                                 data |= (6 << SCU_RAM_AGC_KI_IF__B);
5177                         else
5178                                 data |= (5 << SCU_RAM_AGC_KI_IF__B);
5179
5180                         if (common_attr->tuner_if_agc_pol)
5181                                 data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5182                         else
5183                                 data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5184                         rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5185                         if (rc != 0) {
5186                                 pr_err("error %d\n", rc);
5187                                 goto rw_error;
5188                         }
5189
5190                         /* Set speed (using complementary reduction value) */
5191                         rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
5192                         if (rc != 0) {
5193                                 pr_err("error %d\n", rc);
5194                                 goto rw_error;
5195                         }
5196                         data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
5197                         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);
5198                         if (rc != 0) {
5199                                 pr_err("error %d\n", rc);
5200                                 goto rw_error;
5201                         }
5202
5203                         if (agc_settings->standard == DRX_STANDARD_8VSB)
5204                                 p_agc_settings = &(ext_attr->vsb_rf_agc_cfg);
5205                         else if (DRXJ_ISQAMSTD(agc_settings->standard))
5206                                 p_agc_settings = &(ext_attr->qam_rf_agc_cfg);
5207                         else if (DRXJ_ISATVSTD(agc_settings->standard))
5208                                 p_agc_settings = &(ext_attr->atv_rf_agc_cfg);
5209                         else
5210                                 return -EINVAL;
5211
5212                         /* Restore TOP */
5213                         if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
5214                                 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, p_agc_settings->top, 0);
5215                                 if (rc != 0) {
5216                                         pr_err("error %d\n", rc);
5217                                         goto rw_error;
5218                                 }
5219                                 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, p_agc_settings->top, 0);
5220                                 if (rc != 0) {
5221                                         pr_err("error %d\n", rc);
5222                                         goto rw_error;
5223                                 }
5224                         } else {
5225                                 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, 0, 0);
5226                                 if (rc != 0) {
5227                                         pr_err("error %d\n", rc);
5228                                         goto rw_error;
5229                                 }
5230                                 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, 0, 0);
5231                                 if (rc != 0) {
5232                                         pr_err("error %d\n", rc);
5233                                         goto rw_error;
5234                                 }
5235                         }
5236                         break;
5237
5238                 case DRX_AGC_CTRL_USER:
5239
5240                         /* Enable IF AGC DAC */
5241                         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5242                         if (rc != 0) {
5243                                 pr_err("error %d\n", rc);
5244                                 goto rw_error;
5245                         }
5246                         data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5247                         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5248                         if (rc != 0) {
5249                                 pr_err("error %d\n", rc);
5250                                 goto rw_error;
5251                         }
5252
5253                         /* Disable SCU IF AGC loop */
5254                         rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5255                         if (rc != 0) {
5256                                 pr_err("error %d\n", rc);
5257                                 goto rw_error;
5258                         }
5259                         data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5260                         data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5261                         if (common_attr->tuner_if_agc_pol)
5262                                 data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5263                         else
5264                                 data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5265                         rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5266                         if (rc != 0) {
5267                                 pr_err("error %d\n", rc);
5268                                 goto rw_error;
5269                         }
5270
5271                         /* Write value to output pin */
5272                         rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->output_level, 0);
5273                         if (rc != 0) {
5274                                 pr_err("error %d\n", rc);
5275                                 goto rw_error;
5276                         }
5277                         break;
5278
5279                 case DRX_AGC_CTRL_OFF:
5280
5281                         /* Disable If AGC DAC */
5282                         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5283                         if (rc != 0) {
5284                                 pr_err("error %d\n", rc);
5285                                 goto rw_error;
5286                         }
5287                         data &= (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE);
5288                         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5289                         if (rc != 0) {
5290                                 pr_err("error %d\n", rc);
5291                                 goto rw_error;
5292                         }
5293
5294                         /* Disable SCU IF AGC loop */
5295                         rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5296                         if (rc != 0) {
5297                                 pr_err("error %d\n", rc);
5298                                 goto rw_error;
5299                         }
5300                         data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5301                         data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5302                         rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5303                         if (rc != 0) {
5304                                 pr_err("error %d\n", rc);
5305                                 goto rw_error;
5306                         }
5307                         break;
5308                 default:
5309                         return -EINVAL;
5310                 }               /* switch ( agcsettings->ctrl_mode ) */
5311
5312                 /* always set the top to support configurations without if-loop */
5313                 rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, agc_settings->top, 0);
5314                 if (rc != 0) {
5315                         pr_err("error %d\n", rc);
5316                         goto rw_error;
5317                 }
5318         }
5319
5320         /* Store if agc settings */
5321         switch (agc_settings->standard) {
5322         case DRX_STANDARD_8VSB:
5323                 ext_attr->vsb_if_agc_cfg = *agc_settings;
5324                 break;
5325 #ifndef DRXJ_VSB_ONLY
5326         case DRX_STANDARD_ITU_A:
5327         case DRX_STANDARD_ITU_B:
5328         case DRX_STANDARD_ITU_C:
5329                 ext_attr->qam_if_agc_cfg = *agc_settings;
5330                 break;
5331 #endif
5332         default:
5333                 return -EIO;
5334         }
5335
5336         return 0;
5337 rw_error:
5338         return rc;
5339 }
5340
5341 /*
5342 * \fn int set_iqm_af ()
5343 * \brief Configure IQM AF registers
5344 * \param demod instance of demodulator.
5345 * \param active
5346 * \return int.
5347 */
5348 static int set_iqm_af(struct drx_demod_instance *demod, bool active)
5349 {
5350         u16 data = 0;
5351         struct i2c_device_addr *dev_addr = NULL;
5352         int rc;
5353
5354         dev_addr = demod->my_i2c_dev_addr;
5355
5356         /* Configure IQM */
5357         rc = drxj_dap_read_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         if (!active)
5363                 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));
5364         else
5365                 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);
5366         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5367         if (rc != 0) {
5368                 pr_err("error %d\n", rc);
5369                 goto rw_error;
5370         }
5371
5372         return 0;
5373 rw_error:
5374         return rc;
5375 }
5376
5377 /*============================================================================*/
5378 /*==              END 8VSB & QAM COMMON DATAPATH FUNCTIONS                  ==*/
5379 /*============================================================================*/
5380
5381 /*============================================================================*/
5382 /*============================================================================*/
5383 /*==                       8VSB DATAPATH FUNCTIONS                          ==*/
5384 /*============================================================================*/
5385 /*============================================================================*/
5386
5387 /*
5388 * \fn int power_down_vsb ()
5389 * \brief Powr down QAM related blocks.
5390 * \param demod instance of demodulator.
5391 * \param channel pointer to channel data.
5392 * \return int.
5393 */
5394 static int power_down_vsb(struct drx_demod_instance *demod, bool primary)
5395 {
5396         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
5397         struct drxjscu_cmd cmd_scu = { /* command     */ 0,
5398                 /* parameter_len */ 0,
5399                 /* result_len    */ 0,
5400                 /* *parameter   */ NULL,
5401                 /* *result      */ NULL
5402         };
5403         struct drx_cfg_mpeg_output cfg_mpeg_output;
5404         int rc;
5405         u16 cmd_result = 0;
5406
5407         /*
5408            STOP demodulator
5409            reset of FEC and VSB HW
5410          */
5411         cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
5412             SCU_RAM_COMMAND_CMD_DEMOD_STOP;
5413         cmd_scu.parameter_len = 0;
5414         cmd_scu.result_len = 1;
5415         cmd_scu.parameter = NULL;
5416         cmd_scu.result = &cmd_result;
5417         rc = scu_command(dev_addr, &cmd_scu);
5418         if (rc != 0) {
5419                 pr_err("error %d\n", rc);
5420                 goto rw_error;
5421         }
5422
5423         /* stop all comm_exec */
5424         rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5425         if (rc != 0) {
5426                 pr_err("error %d\n", rc);
5427                 goto rw_error;
5428         }
5429         rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5430         if (rc != 0) {
5431                 pr_err("error %d\n", rc);
5432                 goto rw_error;
5433         }
5434         if (primary) {
5435                 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
5436                 if (rc != 0) {
5437                         pr_err("error %d\n", rc);
5438                         goto rw_error;
5439                 }
5440                 rc = set_iqm_af(demod, false);
5441                 if (rc != 0) {
5442                         pr_err("error %d\n", rc);
5443                         goto rw_error;
5444                 }
5445         } else {
5446                 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5447                 if (rc != 0) {
5448                         pr_err("error %d\n", rc);
5449                         goto rw_error;
5450                 }
5451                 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5452                 if (rc != 0) {
5453                         pr_err("error %d\n", rc);
5454                         goto rw_error;
5455                 }
5456                 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5457                 if (rc != 0) {
5458                         pr_err("error %d\n", rc);
5459                         goto rw_error;
5460                 }
5461                 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5462                 if (rc != 0) {
5463                         pr_err("error %d\n", rc);
5464                         goto rw_error;
5465                 }
5466                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5467                 if (rc != 0) {
5468                         pr_err("error %d\n", rc);
5469                         goto rw_error;
5470                 }
5471         }
5472
5473         cfg_mpeg_output.enable_mpeg_output = false;
5474         rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
5475         if (rc != 0) {
5476                 pr_err("error %d\n", rc);
5477                 goto rw_error;
5478         }
5479
5480         return 0;
5481 rw_error:
5482         return rc;
5483 }
5484
5485 /*
5486 * \fn int set_vsb_leak_n_gain ()
5487 * \brief Set ATSC demod.
5488 * \param demod instance of demodulator.
5489 * \return int.
5490 */
5491 static int set_vsb_leak_n_gain(struct drx_demod_instance *demod)
5492 {
5493         struct i2c_device_addr *dev_addr = NULL;
5494         int rc;
5495
5496         static const u8 vsb_ffe_leak_gain_ram0[] = {
5497                 DRXJ_16TO8(0x8),        /* FFETRAINLKRATIO1  */
5498                 DRXJ_16TO8(0x8),        /* FFETRAINLKRATIO2  */
5499                 DRXJ_16TO8(0x8),        /* FFETRAINLKRATIO3  */
5500                 DRXJ_16TO8(0xf),        /* FFETRAINLKRATIO4  */
5501                 DRXJ_16TO8(0xf),        /* FFETRAINLKRATIO5  */
5502                 DRXJ_16TO8(0xf),        /* FFETRAINLKRATIO6  */
5503                 DRXJ_16TO8(0xf),        /* FFETRAINLKRATIO7  */
5504                 DRXJ_16TO8(0xf),        /* FFETRAINLKRATIO8  */
5505                 DRXJ_16TO8(0xf),        /* FFETRAINLKRATIO9  */
5506                 DRXJ_16TO8(0x8),        /* FFETRAINLKRATIO10  */
5507                 DRXJ_16TO8(0x8),        /* FFETRAINLKRATIO11 */
5508                 DRXJ_16TO8(0x8),        /* FFETRAINLKRATIO12 */
5509                 DRXJ_16TO8(0x10),       /* FFERCA1TRAINLKRATIO1 */
5510                 DRXJ_16TO8(0x10),       /* FFERCA1TRAINLKRATIO2 */
5511                 DRXJ_16TO8(0x10),       /* FFERCA1TRAINLKRATIO3 */
5512                 DRXJ_16TO8(0x20),       /* FFERCA1TRAINLKRATIO4 */
5513                 DRXJ_16TO8(0x20),       /* FFERCA1TRAINLKRATIO5 */
5514                 DRXJ_16TO8(0x20),       /* FFERCA1TRAINLKRATIO6 */
5515                 DRXJ_16TO8(0x20),       /* FFERCA1TRAINLKRATIO7 */
5516                 DRXJ_16TO8(0x20),       /* FFERCA1TRAINLKRATIO8 */
5517                 DRXJ_16TO8(0x20),       /* FFERCA1TRAINLKRATIO9 */
5518                 DRXJ_16TO8(0x10),       /* FFERCA1TRAINLKRATIO10 */
5519                 DRXJ_16TO8(0x10),       /* FFERCA1TRAINLKRATIO11 */
5520                 DRXJ_16TO8(0x10),       /* FFERCA1TRAINLKRATIO12 */
5521                 DRXJ_16TO8(0x10),       /* FFERCA1DATALKRATIO1 */
5522                 DRXJ_16TO8(0x10),       /* FFERCA1DATALKRATIO2 */
5523                 DRXJ_16TO8(0x10),       /* FFERCA1DATALKRATIO3 */
5524                 DRXJ_16TO8(0x20),       /* FFERCA1DATALKRATIO4 */
5525                 DRXJ_16TO8(0x20),       /* FFERCA1DATALKRATIO5 */
5526                 DRXJ_16TO8(0x20),       /* FFERCA1DATALKRATIO6 */
5527                 DRXJ_16TO8(0x20),       /* FFERCA1DATALKRATIO7 */
5528                 DRXJ_16TO8(0x20),       /* FFERCA1DATALKRATIO8 */
5529                 DRXJ_16TO8(0x20),       /* FFERCA1DATALKRATIO9 */
5530                 DRXJ_16TO8(0x10),       /* FFERCA1DATALKRATIO10 */
5531                 DRXJ_16TO8(0x10),       /* FFERCA1DATALKRATIO11 */
5532                 DRXJ_16TO8(0x10),       /* FFERCA1DATALKRATIO12 */
5533                 DRXJ_16TO8(0x10),       /* FFERCA2TRAINLKRATIO1 */
5534                 DRXJ_16TO8(0x10),       /* FFERCA2TRAINLKRATIO2 */
5535                 DRXJ_16TO8(0x10),       /* FFERCA2TRAINLKRATIO3 */
5536                 DRXJ_16TO8(0x20),       /* FFERCA2TRAINLKRATIO4 */
5537                 DRXJ_16TO8(0x20),       /* FFERCA2TRAINLKRATIO5 */
5538                 DRXJ_16TO8(0x20),       /* FFERCA2TRAINLKRATIO6 */
5539                 DRXJ_16TO8(0x20),       /* FFERCA2TRAINLKRATIO7 */
5540                 DRXJ_16TO8(0x20),       /* FFERCA2TRAINLKRATIO8 */
5541                 DRXJ_16TO8(0x20),       /* FFERCA2TRAINLKRATIO9 */
5542                 DRXJ_16TO8(0x10),       /* FFERCA2TRAINLKRATIO10 */
5543                 DRXJ_16TO8(0x10),       /* FFERCA2TRAINLKRATIO11 */
5544                 DRXJ_16TO8(0x10),       /* FFERCA2TRAINLKRATIO12 */
5545                 DRXJ_16TO8(0x10),       /* FFERCA2DATALKRATIO1 */
5546                 DRXJ_16TO8(0x10),       /* FFERCA2DATALKRATIO2 */
5547                 DRXJ_16TO8(0x10),       /* FFERCA2DATALKRATIO3 */
5548                 DRXJ_16TO8(0x20),       /* FFERCA2DATALKRATIO4 */
5549                 DRXJ_16TO8(0x20),       /* FFERCA2DATALKRATIO5 */
5550                 DRXJ_16TO8(0x20),       /* FFERCA2DATALKRATIO6 */
5551                 DRXJ_16TO8(0x20),       /* FFERCA2DATALKRATIO7 */
5552                 DRXJ_16TO8(0x20),       /* FFERCA2DATALKRATIO8 */
5553                 DRXJ_16TO8(0x20),       /* FFERCA2DATALKRATIO9 */
5554                 DRXJ_16TO8(0x10),       /* FFERCA2DATALKRATIO10 */
5555                 DRXJ_16TO8(0x10),       /* FFERCA2DATALKRATIO11 */
5556                 DRXJ_16TO8(0x10),       /* FFERCA2DATALKRATIO12 */
5557                 DRXJ_16TO8(0x07),       /* FFEDDM1TRAINLKRATIO1 */
5558                 DRXJ_16TO8(0x07),       /* FFEDDM1TRAINLKRATIO2 */
5559                 DRXJ_16TO8(0x07),       /* FFEDDM1TRAINLKRATIO3 */
5560                 DRXJ_16TO8(0x0e),       /* FFEDDM1TRAINLKRATIO4 */
5561                 DRXJ_16TO8(0x0e),       /* FFEDDM1TRAINLKRATIO5 */
5562                 DRXJ_16TO8(0x0e),       /* FFEDDM1TRAINLKRATIO6 */
5563                 DRXJ_16TO8(0x0e),       /* FFEDDM1TRAINLKRATIO7 */
5564                 DRXJ_16TO8(0x0e),       /* FFEDDM1TRAINLKRATIO8 */
5565                 DRXJ_16TO8(0x0e),       /* FFEDDM1TRAINLKRATIO9 */
5566                 DRXJ_16TO8(0x07),       /* FFEDDM1TRAINLKRATIO10 */
5567                 DRXJ_16TO8(0x07),       /* FFEDDM1TRAINLKRATIO11 */
5568                 DRXJ_16TO8(0x07),       /* FFEDDM1TRAINLKRATIO12 */
5569                 DRXJ_16TO8(0x07),       /* FFEDDM1DATALKRATIO1 */
5570                 DRXJ_16TO8(0x07),       /* FFEDDM1DATALKRATIO2 */
5571                 DRXJ_16TO8(0x07),       /* FFEDDM1DATALKRATIO3 */
5572                 DRXJ_16TO8(0x0e),       /* FFEDDM1DATALKRATIO4 */
5573                 DRXJ_16TO8(0x0e),       /* FFEDDM1DATALKRATIO5 */
5574                 DRXJ_16TO8(0x0e),       /* FFEDDM1DATALKRATIO6 */
5575                 DRXJ_16TO8(0x0e),       /* FFEDDM1DATALKRATIO7 */
5576                 DRXJ_16TO8(0x0e),       /* FFEDDM1DATALKRATIO8 */
5577                 DRXJ_16TO8(0x0e),       /* FFEDDM1DATALKRATIO9 */
5578                 DRXJ_16TO8(0x07),       /* FFEDDM1DATALKRATIO10 */
5579                 DRXJ_16TO8(0x07),       /* FFEDDM1DATALKRATIO11 */
5580                 DRXJ_16TO8(0x07),       /* FFEDDM1DATALKRATIO12 */
5581                 DRXJ_16TO8(0x06),       /* FFEDDM2TRAINLKRATIO1 */
5582                 DRXJ_16TO8(0x06),       /* FFEDDM2TRAINLKRATIO2 */
5583                 DRXJ_16TO8(0x06),       /* FFEDDM2TRAINLKRATIO3 */
5584                 DRXJ_16TO8(0x0c),       /* FFEDDM2TRAINLKRATIO4 */
5585                 DRXJ_16TO8(0x0c),       /* FFEDDM2TRAINLKRATIO5 */
5586                 DRXJ_16TO8(0x0c),       /* FFEDDM2TRAINLKRATIO6 */
5587                 DRXJ_16TO8(0x0c),       /* FFEDDM2TRAINLKRATIO7 */
5588                 DRXJ_16TO8(0x0c),       /* FFEDDM2TRAINLKRATIO8 */
5589                 DRXJ_16TO8(0x0c),       /* FFEDDM2TRAINLKRATIO9 */
5590                 DRXJ_16TO8(0x06),       /* FFEDDM2TRAINLKRATIO10 */
5591                 DRXJ_16TO8(0x06),       /* FFEDDM2TRAINLKRATIO11 */
5592                 DRXJ_16TO8(0x06),       /* FFEDDM2TRAINLKRATIO12 */
5593                 DRXJ_16TO8(0x06),       /* FFEDDM2DATALKRATIO1 */
5594                 DRXJ_16TO8(0x06),       /* FFEDDM2DATALKRATIO2 */
5595                 DRXJ_16TO8(0x06),       /* FFEDDM2DATALKRATIO3 */
5596                 DRXJ_16TO8(0x0c),       /* FFEDDM2DATALKRATIO4 */
5597                 DRXJ_16TO8(0x0c),       /* FFEDDM2DATALKRATIO5 */
5598                 DRXJ_16TO8(0x0c),       /* FFEDDM2DATALKRATIO6 */
5599                 DRXJ_16TO8(0x0c),       /* FFEDDM2DATALKRATIO7 */
5600                 DRXJ_16TO8(0x0c),       /* FFEDDM2DATALKRATIO8 */
5601                 DRXJ_16TO8(0x0c),       /* FFEDDM2DATALKRATIO9 */
5602                 DRXJ_16TO8(0x06),       /* FFEDDM2DATALKRATIO10 */
5603                 DRXJ_16TO8(0x06),       /* FFEDDM2DATALKRATIO11 */
5604                 DRXJ_16TO8(0x06),       /* FFEDDM2DATALKRATIO12 */
5605                 DRXJ_16TO8(0x2020),     /* FIRTRAINGAIN1 */
5606                 DRXJ_16TO8(0x2020),     /* FIRTRAINGAIN2 */
5607                 DRXJ_16TO8(0x2020),     /* FIRTRAINGAIN3 */
5608                 DRXJ_16TO8(0x4040),     /* FIRTRAINGAIN4 */
5609                 DRXJ_16TO8(0x4040),     /* FIRTRAINGAIN5 */
5610                 DRXJ_16TO8(0x4040),     /* FIRTRAINGAIN6 */
5611                 DRXJ_16TO8(0x4040),     /* FIRTRAINGAIN7 */
5612                 DRXJ_16TO8(0x4040),     /* FIRTRAINGAIN8 */
5613                 DRXJ_16TO8(0x4040),     /* FIRTRAINGAIN9 */
5614                 DRXJ_16TO8(0x2020),     /* FIRTRAINGAIN10 */
5615                 DRXJ_16TO8(0x2020),     /* FIRTRAINGAIN11 */
5616                 DRXJ_16TO8(0x2020),     /* FIRTRAINGAIN12 */
5617                 DRXJ_16TO8(0x0808),     /* FIRRCA1GAIN1 */
5618                 DRXJ_16TO8(0x0808),     /* FIRRCA1GAIN2 */
5619                 DRXJ_16TO8(0x0808),     /* FIRRCA1GAIN3 */
5620                 DRXJ_16TO8(0x1010),     /* FIRRCA1GAIN4 */
5621                 DRXJ_16TO8(0x1010),     /* FIRRCA1GAIN5 */
5622                 DRXJ_16TO8(0x1010),     /* FIRRCA1GAIN6 */
5623                 DRXJ_16TO8(0x1010),     /* FIRRCA1GAIN7 */
5624                 DRXJ_16TO8(0x1010)      /* FIRRCA1GAIN8 */
5625         };
5626
5627         static const u8 vsb_ffe_leak_gain_ram1[] = {
5628                 DRXJ_16TO8(0x1010),     /* FIRRCA1GAIN9 */
5629                 DRXJ_16TO8(0x0808),     /* FIRRCA1GAIN10 */
5630                 DRXJ_16TO8(0x0808),     /* FIRRCA1GAIN11 */
5631                 DRXJ_16TO8(0x0808),     /* FIRRCA1GAIN12 */
5632                 DRXJ_16TO8(0x0808),     /* FIRRCA2GAIN1 */
5633                 DRXJ_16TO8(0x0808),     /* FIRRCA2GAIN2 */
5634                 DRXJ_16TO8(0x0808),     /* FIRRCA2GAIN3 */
5635                 DRXJ_16TO8(0x1010),     /* FIRRCA2GAIN4 */
5636                 DRXJ_16TO8(0x1010),     /* FIRRCA2GAIN5 */
5637                 DRXJ_16TO8(0x1010),     /* FIRRCA2GAIN6 */
5638                 DRXJ_16TO8(0x1010),     /* FIRRCA2GAIN7 */
5639                 DRXJ_16TO8(0x1010),     /* FIRRCA2GAIN8 */
5640                 DRXJ_16TO8(0x1010),     /* FIRRCA2GAIN9 */
5641                 DRXJ_16TO8(0x0808),     /* FIRRCA2GAIN10 */
5642                 DRXJ_16TO8(0x0808),     /* FIRRCA2GAIN11 */
5643                 DRXJ_16TO8(0x0808),     /* FIRRCA2GAIN12 */
5644                 DRXJ_16TO8(0x0303),     /* FIRDDM1GAIN1 */
5645                 DRXJ_16TO8(0x0303),     /* FIRDDM1GAIN2 */
5646                 DRXJ_16TO8(0x0303),     /* FIRDDM1GAIN3 */
5647                 DRXJ_16TO8(0x0606),     /* FIRDDM1GAIN4 */
5648                 DRXJ_16TO8(0x0606),     /* FIRDDM1GAIN5 */
5649                 DRXJ_16TO8(0x0606),     /* FIRDDM1GAIN6 */
5650                 DRXJ_16TO8(0x0606),     /* FIRDDM1GAIN7 */
5651                 DRXJ_16TO8(0x0606),     /* FIRDDM1GAIN8 */
5652                 DRXJ_16TO8(0x0606),     /* FIRDDM1GAIN9 */
5653                 DRXJ_16TO8(0x0303),     /* FIRDDM1GAIN10 */
5654                 DRXJ_16TO8(0x0303),     /* FIRDDM1GAIN11 */
5655                 DRXJ_16TO8(0x0303),     /* FIRDDM1GAIN12 */
5656                 DRXJ_16TO8(0x0303),     /* FIRDDM2GAIN1 */
5657                 DRXJ_16TO8(0x0303),     /* FIRDDM2GAIN2 */
5658                 DRXJ_16TO8(0x0303),     /* FIRDDM2GAIN3 */
5659                 DRXJ_16TO8(0x0505),     /* FIRDDM2GAIN4 */
5660                 DRXJ_16TO8(0x0505),     /* FIRDDM2GAIN5 */
5661                 DRXJ_16TO8(0x0505),     /* FIRDDM2GAIN6 */
5662                 DRXJ_16TO8(0x0505),     /* FIRDDM2GAIN7 */
5663                 DRXJ_16TO8(0x0505),     /* FIRDDM2GAIN8 */
5664                 DRXJ_16TO8(0x0505),     /* FIRDDM2GAIN9 */
5665                 DRXJ_16TO8(0x0303),     /* FIRDDM2GAIN10 */
5666                 DRXJ_16TO8(0x0303),     /* FIRDDM2GAIN11 */
5667                 DRXJ_16TO8(0x0303),     /* FIRDDM2GAIN12 */
5668                 DRXJ_16TO8(0x001f),     /* DFETRAINLKRATIO */
5669                 DRXJ_16TO8(0x01ff),     /* DFERCA1TRAINLKRATIO */
5670                 DRXJ_16TO8(0x01ff),     /* DFERCA1DATALKRATIO */
5671                 DRXJ_16TO8(0x004f),     /* DFERCA2TRAINLKRATIO */
5672                 DRXJ_16TO8(0x004f),     /* DFERCA2DATALKRATIO */
5673                 DRXJ_16TO8(0x01ff),     /* DFEDDM1TRAINLKRATIO */
5674                 DRXJ_16TO8(0x01ff),     /* DFEDDM1DATALKRATIO */
5675                 DRXJ_16TO8(0x0352),     /* DFEDDM2TRAINLKRATIO */
5676                 DRXJ_16TO8(0x0352),     /* DFEDDM2DATALKRATIO */
5677                 DRXJ_16TO8(0x0000),     /* DFETRAINGAIN */
5678                 DRXJ_16TO8(0x2020),     /* DFERCA1GAIN */
5679                 DRXJ_16TO8(0x1010),     /* DFERCA2GAIN */
5680                 DRXJ_16TO8(0x1818),     /* DFEDDM1GAIN */
5681                 DRXJ_16TO8(0x1212)      /* DFEDDM2GAIN */
5682         };
5683
5684         dev_addr = demod->my_i2c_dev_addr;
5685         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);
5686         if (rc != 0) {
5687                 pr_err("error %d\n", rc);
5688                 goto rw_error;
5689         }
5690         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);
5691         if (rc != 0) {
5692                 pr_err("error %d\n", rc);
5693                 goto rw_error;
5694         }
5695
5696         return 0;
5697 rw_error:
5698         return rc;
5699 }
5700
5701 /*
5702 * \fn int set_vsb()
5703 * \brief Set 8VSB demod.
5704 * \param demod instance of demodulator.
5705 * \return int.
5706 *
5707 */
5708 static int set_vsb(struct drx_demod_instance *demod)
5709 {
5710         struct i2c_device_addr *dev_addr = NULL;
5711         int rc;
5712         struct drx_common_attr *common_attr = NULL;
5713         struct drxjscu_cmd cmd_scu;
5714         struct drxj_data *ext_attr = NULL;
5715         u16 cmd_result = 0;
5716         u16 cmd_param = 0;
5717         static const u8 vsb_taps_re[] = {
5718                 DRXJ_16TO8(-2), /* re0  */
5719                 DRXJ_16TO8(4),  /* re1  */
5720                 DRXJ_16TO8(1),  /* re2  */
5721                 DRXJ_16TO8(-4), /* re3  */
5722                 DRXJ_16TO8(1),  /* re4  */
5723                 DRXJ_16TO8(4),  /* re5  */
5724                 DRXJ_16TO8(-3), /* re6  */
5725                 DRXJ_16TO8(-3), /* re7  */
5726                 DRXJ_16TO8(6),  /* re8  */
5727                 DRXJ_16TO8(1),  /* re9  */
5728                 DRXJ_16TO8(-9), /* re10 */
5729                 DRXJ_16TO8(3),  /* re11 */
5730                 DRXJ_16TO8(12), /* re12 */
5731                 DRXJ_16TO8(-9), /* re13 */
5732                 DRXJ_16TO8(-15),        /* re14 */
5733                 DRXJ_16TO8(17), /* re15 */
5734                 DRXJ_16TO8(19), /* re16 */
5735                 DRXJ_16TO8(-29),        /* re17 */
5736                 DRXJ_16TO8(-22),        /* re18 */
5737                 DRXJ_16TO8(45), /* re19 */
5738                 DRXJ_16TO8(25), /* re20 */
5739                 DRXJ_16TO8(-70),        /* re21 */
5740                 DRXJ_16TO8(-28),        /* re22 */
5741                 DRXJ_16TO8(111),        /* re23 */
5742                 DRXJ_16TO8(30), /* re24 */
5743                 DRXJ_16TO8(-201),       /* re25 */
5744                 DRXJ_16TO8(-31),        /* re26 */
5745                 DRXJ_16TO8(629) /* re27 */
5746         };
5747
5748         dev_addr = demod->my_i2c_dev_addr;
5749         common_attr = (struct drx_common_attr *) demod->my_common_attr;
5750         ext_attr = (struct drxj_data *) demod->my_ext_attr;
5751
5752         /* stop all comm_exec */
5753         rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5754         if (rc != 0) {
5755                 pr_err("error %d\n", rc);
5756                 goto rw_error;
5757         }
5758         rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5759         if (rc != 0) {
5760                 pr_err("error %d\n", rc);
5761                 goto rw_error;
5762         }
5763         rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5764         if (rc != 0) {
5765                 pr_err("error %d\n", rc);
5766                 goto rw_error;
5767         }
5768         rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5769         if (rc != 0) {
5770                 pr_err("error %d\n", rc);
5771                 goto rw_error;
5772         }
5773         rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5774         if (rc != 0) {
5775                 pr_err("error %d\n", rc);
5776                 goto rw_error;
5777         }
5778         rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5779         if (rc != 0) {
5780                 pr_err("error %d\n", rc);
5781                 goto rw_error;
5782         }
5783         rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5784         if (rc != 0) {
5785                 pr_err("error %d\n", rc);
5786                 goto rw_error;
5787         }
5788
5789         /* reset demodulator */
5790         cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
5791             | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
5792         cmd_scu.parameter_len = 0;
5793         cmd_scu.result_len = 1;
5794         cmd_scu.parameter = NULL;
5795         cmd_scu.result = &cmd_result;
5796         rc = scu_command(dev_addr, &cmd_scu);
5797         if (rc != 0) {
5798                 pr_err("error %d\n", rc);
5799                 goto rw_error;
5800         }
5801
5802         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_DCF_BYPASS__A, 1, 0);
5803         if (rc != 0) {
5804                 pr_err("error %d\n", rc);
5805                 goto rw_error;
5806         }
5807         rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, IQM_FS_ADJ_SEL_B_VSB, 0);
5808         if (rc != 0) {
5809                 pr_err("error %d\n", rc);
5810                 goto rw_error;
5811         }
5812         rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, IQM_RC_ADJ_SEL_B_VSB, 0);
5813         if (rc != 0) {
5814                 pr_err("error %d\n", rc);
5815                 goto rw_error;
5816         }
5817         ext_attr->iqm_rc_rate_ofs = 0x00AD0D79;
5818         rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, ext_attr->iqm_rc_rate_ofs, 0);
5819         if (rc != 0) {
5820                 pr_err("error %d\n", rc);
5821                 goto rw_error;
5822         }
5823         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CFAGC_GAINSHIFT__A, 4, 0);
5824         if (rc != 0) {
5825                 pr_err("error %d\n", rc);
5826                 goto rw_error;
5827         }
5828         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 1, 0);
5829         if (rc != 0) {
5830                 pr_err("error %d\n", rc);
5831                 goto rw_error;
5832         }
5833
5834         rc = drxj_dap_write_reg16(dev_addr, IQM_RC_CROUT_ENA__A, 1, 0);
5835         if (rc != 0) {
5836                 pr_err("error %d\n", rc);
5837                 goto rw_error;
5838         }
5839         rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, 28, 0);
5840         if (rc != 0) {
5841                 pr_err("error %d\n", rc);
5842                 goto rw_error;
5843         }
5844         rc = drxj_dap_write_reg16(dev_addr, IQM_RT_ACTIVE__A, 0, 0);
5845         if (rc != 0) {
5846                 pr_err("error %d\n", rc);
5847                 goto rw_error;
5848         }
5849         rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
5850         if (rc != 0) {
5851                 pr_err("error %d\n", rc);
5852                 goto rw_error;
5853         }
5854         rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
5855         if (rc != 0) {
5856                 pr_err("error %d\n", rc);
5857                 goto rw_error;
5858         }
5859         rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_VSB__M, 0);
5860         if (rc != 0) {
5861                 pr_err("error %d\n", rc);
5862                 goto rw_error;
5863         }
5864         rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE__A, 1393, 0);
5865         if (rc != 0) {
5866                 pr_err("error %d\n", rc);
5867                 goto rw_error;
5868         }
5869         rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
5870         if (rc != 0) {
5871                 pr_err("error %d\n", rc);
5872                 goto rw_error;
5873         }
5874         rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
5875         if (rc != 0) {
5876                 pr_err("error %d\n", rc);
5877                 goto rw_error;
5878         }
5879
5880         rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5881         if (rc != 0) {
5882                 pr_err("error %d\n", rc);
5883                 goto rw_error;
5884         }
5885         rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5886         if (rc != 0) {
5887                 pr_err("error %d\n", rc);
5888                 goto rw_error;
5889         }
5890
5891         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BNTHRESH__A, 330, 0);
5892         if (rc != 0) {
5893                 pr_err("error %d\n", rc);
5894                 goto rw_error;
5895         }       /* set higher threshold */
5896         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CLPLASTNUM__A, 90, 0);
5897         if (rc != 0) {
5898                 pr_err("error %d\n", rc);
5899                 goto rw_error;
5900         }       /* burst detection on   */
5901         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA1__A, 0x0042, 0);
5902         if (rc != 0) {
5903                 pr_err("error %d\n", rc);
5904                 goto rw_error;
5905         }       /* drop thresholds by 1 dB */
5906         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA2__A, 0x0053, 0);
5907         if (rc != 0) {
5908                 pr_err("error %d\n", rc);
5909                 goto rw_error;
5910         }       /* drop thresholds by 2 dB */
5911         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_EQCTRL__A, 0x1, 0);
5912         if (rc != 0) {
5913                 pr_err("error %d\n", rc);
5914                 goto rw_error;
5915         }       /* cma on               */
5916         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
5917         if (rc != 0) {
5918                 pr_err("error %d\n", rc);
5919                 goto rw_error;
5920         }       /* GPIO               */
5921
5922         /* Initialize the FEC Subsystem */
5923         rc = drxj_dap_write_reg16(dev_addr, FEC_TOP_ANNEX__A, FEC_TOP_ANNEX_D, 0);
5924         if (rc != 0) {
5925                 pr_err("error %d\n", rc);
5926                 goto rw_error;
5927         }
5928         {
5929                 u16 fec_oc_snc_mode = 0;
5930                 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
5931                 if (rc != 0) {
5932                         pr_err("error %d\n", rc);
5933                         goto rw_error;
5934                 }
5935                 /* output data even when not locked */
5936                 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode | FEC_OC_SNC_MODE_UNLOCK_ENABLE__M, 0);
5937                 if (rc != 0) {
5938                         pr_err("error %d\n", rc);
5939                         goto rw_error;
5940                 }
5941         }
5942
5943         /* set clip */
5944         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
5945         if (rc != 0) {
5946                 pr_err("error %d\n", rc);
5947                 goto rw_error;
5948         }
5949         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 470, 0);
5950         if (rc != 0) {
5951                 pr_err("error %d\n", rc);
5952                 goto rw_error;
5953         }
5954         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
5955         if (rc != 0) {
5956                 pr_err("error %d\n", rc);
5957                 goto rw_error;
5958         }
5959         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0xD4, 0);
5960         if (rc != 0) {
5961                 pr_err("error %d\n", rc);
5962                 goto rw_error;
5963         }
5964         /* no transparent, no A&C framing; parity is set in mpegoutput */
5965         {
5966                 u16 fec_oc_reg_mode = 0;
5967                 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
5968                 if (rc != 0) {
5969                         pr_err("error %d\n", rc);
5970                         goto rw_error;
5971                 }
5972                 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);
5973                 if (rc != 0) {
5974                         pr_err("error %d\n", rc);
5975                         goto rw_error;
5976                 }
5977         }
5978
5979         rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_LO__A, 0, 0);
5980         if (rc != 0) {
5981                 pr_err("error %d\n", rc);
5982                 goto rw_error;
5983         }       /* timeout counter for restarting */
5984         rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_HI__A, 3, 0);
5985         if (rc != 0) {
5986                 pr_err("error %d\n", rc);
5987                 goto rw_error;
5988         }
5989         rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MODE__A, 0, 0);
5990         if (rc != 0) {
5991                 pr_err("error %d\n", rc);
5992                 goto rw_error;
5993         }       /* bypass disabled */
5994         /* initialize RS packet error measurement parameters */
5995         rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, FEC_RS_MEASUREMENT_PERIOD, 0);
5996         if (rc != 0) {
5997                 pr_err("error %d\n", rc);
5998                 goto rw_error;
5999         }
6000         rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, FEC_RS_MEASUREMENT_PRESCALE, 0);
6001         if (rc != 0) {
6002                 pr_err("error %d\n", rc);
6003                 goto rw_error;
6004         }
6005
6006         /* init measurement period of MER/SER */
6007         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_MEASUREMENT_PERIOD__A, VSB_TOP_MEASUREMENT_PERIOD, 0);
6008         if (rc != 0) {
6009                 pr_err("error %d\n", rc);
6010                 goto rw_error;
6011         }
6012         rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6013         if (rc != 0) {
6014                 pr_err("error %d\n", rc);
6015                 goto rw_error;
6016         }
6017         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6018         if (rc != 0) {
6019                 pr_err("error %d\n", rc);
6020                 goto rw_error;
6021         }
6022         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6023         if (rc != 0) {
6024                 pr_err("error %d\n", rc);
6025                 goto rw_error;
6026         }
6027
6028         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CKGN1TRK__A, 128, 0);
6029         if (rc != 0) {
6030                 pr_err("error %d\n", rc);
6031                 goto rw_error;
6032         }
6033         /* B-Input to ADC, PGA+filter in standby */
6034         if (!ext_attr->has_lna) {
6035                 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
6036                 if (rc != 0) {
6037                         pr_err("error %d\n", rc);
6038                         goto rw_error;
6039                 }
6040         }
6041
6042         /* turn on IQMAF. It has to be in front of setAgc**() */
6043         rc = set_iqm_af(demod, true);
6044         if (rc != 0) {
6045                 pr_err("error %d\n", rc);
6046                 goto rw_error;
6047         }
6048         rc = adc_synchronization(demod);
6049         if (rc != 0) {
6050                 pr_err("error %d\n", rc);
6051                 goto rw_error;
6052         }
6053
6054         rc = init_agc(demod);
6055         if (rc != 0) {
6056                 pr_err("error %d\n", rc);
6057                 goto rw_error;
6058         }
6059         rc = set_agc_if(demod, &(ext_attr->vsb_if_agc_cfg), false);
6060         if (rc != 0) {
6061                 pr_err("error %d\n", rc);
6062                 goto rw_error;
6063         }
6064         rc = set_agc_rf(demod, &(ext_attr->vsb_rf_agc_cfg), false);
6065         if (rc != 0) {
6066                 pr_err("error %d\n", rc);
6067                 goto rw_error;
6068         }
6069         {
6070                 /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
6071                    of only the gain */
6072                 struct drxj_cfg_afe_gain vsb_pga_cfg = { DRX_STANDARD_8VSB, 0 };
6073
6074                 vsb_pga_cfg.gain = ext_attr->vsb_pga_cfg;
6075                 rc = ctrl_set_cfg_afe_gain(demod, &vsb_pga_cfg);
6076                 if (rc != 0) {
6077                         pr_err("error %d\n", rc);
6078                         goto rw_error;
6079                 }
6080         }
6081         rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->vsb_pre_saw_cfg));
6082         if (rc != 0) {
6083                 pr_err("error %d\n", rc);
6084                 goto rw_error;
6085         }
6086
6087         /* Mpeg output has to be in front of FEC active */
6088         rc = set_mpegtei_handling(demod);
6089         if (rc != 0) {
6090                 pr_err("error %d\n", rc);
6091                 goto rw_error;
6092         }
6093         rc = bit_reverse_mpeg_output(demod);
6094         if (rc != 0) {
6095                 pr_err("error %d\n", rc);
6096                 goto rw_error;
6097         }
6098         rc = set_mpeg_start_width(demod);
6099         if (rc != 0) {
6100                 pr_err("error %d\n", rc);
6101                 goto rw_error;
6102         }
6103         {
6104                 /* TODO: move to set_standard after hardware reset value problem is solved */
6105                 /* Configure initial MPEG output */
6106                 struct drx_cfg_mpeg_output cfg_mpeg_output;
6107
6108                 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6109                 cfg_mpeg_output.enable_mpeg_output = true;
6110
6111                 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6112                 if (rc != 0) {
6113                         pr_err("error %d\n", rc);
6114                         goto rw_error;
6115                 }
6116         }
6117
6118         /* TBD: what parameters should be set */
6119         cmd_param = 0x00;       /* Default mode AGC on, etc */
6120         cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6121             | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
6122         cmd_scu.parameter_len = 1;
6123         cmd_scu.result_len = 1;
6124         cmd_scu.parameter = &cmd_param;
6125         cmd_scu.result = &cmd_result;
6126         rc = scu_command(dev_addr, &cmd_scu);
6127         if (rc != 0) {
6128                 pr_err("error %d\n", rc);
6129                 goto rw_error;
6130         }
6131
6132         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEAGC_GAINSHIFT__A, 0x0004, 0);
6133         if (rc != 0) {
6134                 pr_err("error %d\n", rc);
6135                 goto rw_error;
6136         }
6137         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0x00D2, 0);
6138         if (rc != 0) {
6139                 pr_err("error %d\n", rc);
6140                 goto rw_error;
6141         }
6142         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SYSSMTRNCTRL__A, VSB_TOP_SYSSMTRNCTRL__PRE | VSB_TOP_SYSSMTRNCTRL_NCOTIMEOUTCNTEN__M, 0);
6143         if (rc != 0) {
6144                 pr_err("error %d\n", rc);
6145                 goto rw_error;
6146         }
6147         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEDETCTRL__A, 0x142, 0);
6148         if (rc != 0) {
6149                 pr_err("error %d\n", rc);
6150                 goto rw_error;
6151         }
6152         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_LBAGCREFLVL__A, 640, 0);
6153         if (rc != 0) {
6154                 pr_err("error %d\n", rc);
6155                 goto rw_error;
6156         }
6157         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1ACQ__A, 4, 0);
6158         if (rc != 0) {
6159                 pr_err("error %d\n", rc);
6160                 goto rw_error;
6161         }
6162         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 2, 0);
6163         if (rc != 0) {
6164                 pr_err("error %d\n", rc);
6165                 goto rw_error;
6166         }
6167         rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN2TRK__A, 3, 0);
6168         if (rc != 0) {
6169                 pr_err("error %d\n", rc);
6170                 goto rw_error;
6171         }
6172
6173         /* start demodulator */
6174         cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6175             | SCU_RAM_COMMAND_CMD_DEMOD_START;
6176         cmd_scu.parameter_len = 0;
6177         cmd_scu.result_len = 1;
6178         cmd_scu.parameter = NULL;
6179         cmd_scu.result = &cmd_result;
6180         rc = scu_command(dev_addr, &cmd_scu);
6181         if (rc != 0) {
6182                 pr_err("error %d\n", rc);
6183                 goto rw_error;
6184         }
6185
6186         rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
6187         if (rc != 0) {
6188                 pr_err("error %d\n", rc);
6189                 goto rw_error;
6190         }
6191         rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_ACTIVE, 0);
6192         if (rc != 0) {
6193                 pr_err("error %d\n", rc);
6194                 goto rw_error;
6195         }
6196         rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
6197         if (rc != 0) {
6198                 pr_err("error %d\n", rc);
6199                 goto rw_error;
6200         }
6201
6202         return 0;
6203 rw_error:
6204         return rc;
6205 }
6206
6207 /*
6208 * \fn static short get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *PckErrs)
6209 * \brief Get the values of packet error in 8VSB mode
6210 * \return Error code
6211 */
6212 static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr,
6213                                    u32 *pck_errs, u32 *pck_count)
6214 {
6215         int rc;
6216         u16 data = 0;
6217         u16 period = 0;
6218         u16 prescale = 0;
6219         u16 packet_errors_mant = 0;
6220         u16 packet_errors_exp = 0;
6221
6222         rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &data, 0);
6223         if (rc != 0) {
6224                 pr_err("error %d\n", rc);
6225                 goto rw_error;
6226         }
6227         packet_errors_mant = data & FEC_RS_NR_FAILURES_FIXED_MANT__M;
6228         packet_errors_exp = (data & FEC_RS_NR_FAILURES_EXP__M)
6229             >> FEC_RS_NR_FAILURES_EXP__B;
6230         period = FEC_RS_MEASUREMENT_PERIOD;
6231         prescale = FEC_RS_MEASUREMENT_PRESCALE;
6232         /* packet error rate = (error packet number) per second */
6233         /* 77.3 us is time for per packet */
6234         if (period * prescale == 0) {
6235                 pr_err("error: period and/or prescale is zero!\n");
6236                 return -EIO;
6237         }
6238         *pck_errs = packet_errors_mant * (1 << packet_errors_exp);
6239         *pck_count = period * prescale * 77;
6240
6241         return 0;
6242 rw_error:
6243         return rc;
6244 }
6245
6246 /*
6247 * \fn static short GetVSBBer(struct i2c_device_addr *dev_addr, u32 *ber)
6248 * \brief Get the values of ber in VSB mode
6249 * \return Error code
6250 */
6251 static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr,
6252                                     u32 *ber, u32 *cnt)
6253 {
6254         int rc;
6255         u16 data = 0;
6256         u16 period = 0;
6257         u16 prescale = 0;
6258         u16 bit_errors_mant = 0;
6259         u16 bit_errors_exp = 0;
6260
6261         rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &data, 0);
6262         if (rc != 0) {
6263                 pr_err("error %d\n", rc);
6264                 goto rw_error;
6265         }
6266         period = FEC_RS_MEASUREMENT_PERIOD;
6267         prescale = FEC_RS_MEASUREMENT_PRESCALE;
6268
6269         bit_errors_mant = data & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M;
6270         bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M)
6271             >> FEC_RS_NR_BIT_ERRORS_EXP__B;
6272
6273         *cnt = period * prescale * 207 * ((bit_errors_exp > 2) ? 1 : 8);
6274
6275         if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700)
6276                 *ber = (*cnt) * 26570;
6277         else {
6278                 if (period * prescale == 0) {
6279                         pr_err("error: period and/or prescale is zero!\n");
6280                         return -EIO;
6281                 }
6282                 *ber = bit_errors_mant << ((bit_errors_exp > 2) ?
6283                         (bit_errors_exp - 3) : bit_errors_exp);
6284         }
6285
6286         return 0;
6287 rw_error:
6288         return rc;
6289 }
6290
6291 /*
6292 * \fn static short get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
6293 * \brief Get the values of ber in VSB mode
6294 * \return Error code
6295 */
6296 static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr,
6297                                    u32 *ber, u32 *cnt)
6298 {
6299         u16 data = 0;
6300         int rc;
6301
6302         rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0);
6303         if (rc != 0) {
6304                 pr_err("error %d\n", rc);
6305                 return -EIO;
6306         }
6307         *ber = data;
6308         *cnt = VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT;
6309
6310         return 0;
6311 }
6312
6313 /*
6314 * \fn static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6315 * \brief Get the values of MER
6316 * \return Error code
6317 */
6318 static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6319 {
6320         int rc;
6321         u16 data_hi = 0;
6322
6323         rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_ERR_ENERGY_H__A, &data_hi, 0);
6324         if (rc != 0) {
6325                 pr_err("error %d\n", rc);
6326                 goto rw_error;
6327         }
6328         *mer =
6329             (u16) (log1_times100(21504) - log1_times100((data_hi << 6) / 52));
6330
6331         return 0;
6332 rw_error:
6333         return rc;
6334 }
6335
6336
6337 /*============================================================================*/
6338 /*==                     END 8VSB DATAPATH FUNCTIONS                        ==*/
6339 /*============================================================================*/
6340
6341 /*============================================================================*/
6342 /*============================================================================*/
6343 /*==                       QAM DATAPATH FUNCTIONS                           ==*/
6344 /*============================================================================*/
6345 /*============================================================================*/
6346
6347 /*
6348 * \fn int power_down_qam ()
6349 * \brief Powr down QAM related blocks.
6350 * \param demod instance of demodulator.
6351 * \param channel pointer to channel data.
6352 * \return int.
6353 */
6354 static int power_down_qam(struct drx_demod_instance *demod, bool primary)
6355 {
6356         struct drxjscu_cmd cmd_scu = { /* command      */ 0,
6357                 /* parameter_len */ 0,
6358                 /* result_len    */ 0,
6359                 /* *parameter   */ NULL,
6360                 /* *result      */ NULL
6361         };
6362         int rc;
6363         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6364         struct drx_cfg_mpeg_output cfg_mpeg_output;
6365         struct drx_common_attr *common_attr = demod->my_common_attr;
6366         u16 cmd_result = 0;
6367
6368         /*
6369            STOP demodulator
6370            resets IQM, QAM and FEC HW blocks
6371          */
6372         /* stop all comm_exec */
6373         rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
6374         if (rc != 0) {
6375                 pr_err("error %d\n", rc);
6376                 goto rw_error;
6377         }
6378         rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
6379         if (rc != 0) {
6380                 pr_err("error %d\n", rc);
6381                 goto rw_error;
6382         }
6383
6384         cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
6385             SCU_RAM_COMMAND_CMD_DEMOD_STOP;
6386         cmd_scu.parameter_len = 0;
6387         cmd_scu.result_len = 1;
6388         cmd_scu.parameter = NULL;
6389         cmd_scu.result = &cmd_result;
6390         rc = scu_command(dev_addr, &cmd_scu);
6391         if (rc != 0) {
6392                 pr_err("error %d\n", rc);
6393                 goto rw_error;
6394         }
6395
6396         if (primary) {
6397                 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
6398                 if (rc != 0) {
6399                         pr_err("error %d\n", rc);
6400                         goto rw_error;
6401                 }
6402                 rc = set_iqm_af(demod, false);
6403                 if (rc != 0) {
6404                         pr_err("error %d\n", rc);
6405                         goto rw_error;
6406                 }
6407         } else {
6408                 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
6409                 if (rc != 0) {
6410                         pr_err("error %d\n", rc);
6411                         goto rw_error;
6412                 }
6413                 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
6414                 if (rc != 0) {
6415                         pr_err("error %d\n", rc);
6416                         goto rw_error;
6417                 }
6418                 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
6419                 if (rc != 0) {
6420                         pr_err("error %d\n", rc);
6421                         goto rw_error;
6422                 }
6423                 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
6424                 if (rc != 0) {
6425                         pr_err("error %d\n", rc);
6426                         goto rw_error;
6427                 }
6428                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
6429                 if (rc != 0) {
6430                         pr_err("error %d\n", rc);
6431                         goto rw_error;
6432                 }
6433         }
6434
6435         memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6436         cfg_mpeg_output.enable_mpeg_output = false;
6437
6438         rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6439         if (rc != 0) {
6440                 pr_err("error %d\n", rc);
6441                 goto rw_error;
6442         }
6443
6444         return 0;
6445 rw_error:
6446         return rc;
6447 }
6448
6449 /*============================================================================*/
6450
6451 /*
6452 * \fn int set_qam_measurement ()
6453 * \brief Setup of the QAM Measuremnt intervals for signal quality
6454 * \param demod instance of demod.
6455 * \param constellation current constellation.
6456 * \return int.
6457 *
6458 *  NOTE:
6459 *  Take into account that for certain settings the errorcounters can overflow.
6460 *  The implementation does not check this.
6461 *
6462 *  TODO: overriding the ext_attr->fec_bits_desired by constellation dependent
6463 *  constants to get a measurement period of approx. 1 sec. Remove fec_bits_desired
6464 *  field ?
6465 *
6466 */
6467 #ifndef DRXJ_VSB_ONLY
6468 static int
6469 set_qam_measurement(struct drx_demod_instance *demod,
6470                     enum drx_modulation constellation, u32 symbol_rate)
6471 {
6472         struct i2c_device_addr *dev_addr = NULL;        /* device address for I2C writes */
6473         struct drxj_data *ext_attr = NULL;      /* Global data container for DRXJ specific data */
6474         int rc;
6475         u32 fec_bits_desired = 0;       /* BER accounting period */
6476         u16 fec_rs_plen = 0;    /* defines RS BER measurement period */
6477         u16 fec_rs_prescale = 0;        /* ReedSolomon Measurement Prescale */
6478         u32 fec_rs_period = 0;  /* Value for corresponding I2C register */
6479         u32 fec_rs_bit_cnt = 0; /* Actual precise amount of bits */
6480         u32 fec_oc_snc_fail_period = 0; /* Value for corresponding I2C register */
6481         u32 qam_vd_period = 0;  /* Value for corresponding I2C register */
6482         u32 qam_vd_bit_cnt = 0; /* Actual precise amount of bits */
6483         u16 fec_vd_plen = 0;    /* no of trellis symbols: VD SER measur period */
6484         u16 qam_vd_prescale = 0;        /* Viterbi Measurement Prescale */
6485
6486         dev_addr = demod->my_i2c_dev_addr;
6487         ext_attr = (struct drxj_data *) demod->my_ext_attr;
6488
6489         fec_bits_desired = ext_attr->fec_bits_desired;
6490         fec_rs_prescale = ext_attr->fec_rs_prescale;
6491
6492         switch (constellation) {
6493         case DRX_CONSTELLATION_QAM16:
6494                 fec_bits_desired = 4 * symbol_rate;
6495                 break;
6496         case DRX_CONSTELLATION_QAM32:
6497                 fec_bits_desired = 5 * symbol_rate;
6498                 break;
6499         case DRX_CONSTELLATION_QAM64:
6500                 fec_bits_desired = 6 * symbol_rate;
6501                 break;
6502         case DRX_CONSTELLATION_QAM128:
6503                 fec_bits_desired = 7 * symbol_rate;
6504                 break;
6505         case DRX_CONSTELLATION_QAM256:
6506                 fec_bits_desired = 8 * symbol_rate;
6507                 break;
6508         default:
6509                 return -EINVAL;
6510         }
6511
6512         /* Parameters for Reed-Solomon Decoder */
6513         /* fecrs_period = (int)ceil(FEC_BITS_DESIRED/(fecrs_prescale*plen)) */
6514         /* rs_bit_cnt   = fecrs_period*fecrs_prescale*plen                  */
6515         /*     result is within 32 bit arithmetic ->                        */
6516         /*     no need for mult or frac functions                           */
6517
6518         /* TODO: use constant instead of calculation and remove the fec_rs_plen in ext_attr */
6519         switch (ext_attr->standard) {
6520         case DRX_STANDARD_ITU_A:
6521         case DRX_STANDARD_ITU_C:
6522                 fec_rs_plen = 204 * 8;
6523                 break;
6524         case DRX_STANDARD_ITU_B:
6525                 fec_rs_plen = 128 * 7;
6526                 break;
6527         default:
6528                 return -EINVAL;
6529         }
6530
6531         ext_attr->fec_rs_plen = fec_rs_plen;    /* for getSigQual */
6532         fec_rs_bit_cnt = fec_rs_prescale * fec_rs_plen; /* temp storage   */
6533         if (fec_rs_bit_cnt == 0) {
6534                 pr_err("error: fec_rs_bit_cnt is zero!\n");
6535                 return -EIO;
6536         }
6537         fec_rs_period = fec_bits_desired / fec_rs_bit_cnt + 1;  /* ceil */
6538         if (ext_attr->standard != DRX_STANDARD_ITU_B)
6539                 fec_oc_snc_fail_period = fec_rs_period;
6540
6541         /* limit to max 16 bit value (I2C register width) if needed */
6542         if (fec_rs_period > 0xFFFF)
6543                 fec_rs_period = 0xFFFF;
6544
6545         /* write corresponding registers */
6546         switch (ext_attr->standard) {
6547         case DRX_STANDARD_ITU_A:
6548         case DRX_STANDARD_ITU_C:
6549                 break;
6550         case DRX_STANDARD_ITU_B:
6551                 switch (constellation) {
6552                 case DRX_CONSTELLATION_QAM64:
6553                         fec_rs_period = 31581;
6554                         fec_oc_snc_fail_period = 17932;
6555                         break;
6556                 case DRX_CONSTELLATION_QAM256:
6557                         fec_rs_period = 45446;
6558                         fec_oc_snc_fail_period = 25805;
6559                         break;
6560                 default:
6561                         return -EINVAL;
6562                 }
6563                 break;
6564         default:
6565                 return -EINVAL;
6566         }
6567
6568         rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, (u16)fec_oc_snc_fail_period, 0);
6569         if (rc != 0) {
6570                 pr_err("error %d\n", rc);
6571                 goto rw_error;
6572         }
6573         rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, (u16)fec_rs_period, 0);
6574         if (rc != 0) {
6575                 pr_err("error %d\n", rc);
6576                 goto rw_error;
6577         }
6578         rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, fec_rs_prescale, 0);
6579         if (rc != 0) {
6580                 pr_err("error %d\n", rc);
6581                 goto rw_error;
6582         }
6583         ext_attr->fec_rs_period = (u16) fec_rs_period;
6584         ext_attr->fec_rs_prescale = fec_rs_prescale;
6585         rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6586         if (rc != 0) {
6587                 pr_err("error %d\n", rc);
6588                 goto rw_error;
6589         }
6590         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6591         if (rc != 0) {
6592                 pr_err("error %d\n", rc);
6593                 goto rw_error;
6594         }
6595         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6596         if (rc != 0) {
6597                 pr_err("error %d\n", rc);
6598                 goto rw_error;
6599         }
6600
6601         if (ext_attr->standard == DRX_STANDARD_ITU_B) {
6602                 /* Parameters for Viterbi Decoder */
6603                 /* qamvd_period = (int)ceil(FEC_BITS_DESIRED/                      */
6604                 /*                    (qamvd_prescale*plen*(qam_constellation+1))) */
6605                 /* vd_bit_cnt   = qamvd_period*qamvd_prescale*plen                 */
6606                 /*     result is within 32 bit arithmetic ->                       */
6607                 /*     no need for mult or frac functions                          */
6608
6609                 /* a(8 bit) * b(8 bit) = 16 bit result => mult32 not needed */
6610                 fec_vd_plen = ext_attr->fec_vd_plen;
6611                 qam_vd_prescale = ext_attr->qam_vd_prescale;
6612                 qam_vd_bit_cnt = qam_vd_prescale * fec_vd_plen; /* temp storage */
6613
6614                 switch (constellation) {
6615                 case DRX_CONSTELLATION_QAM64:
6616                         /* a(16 bit) * b(4 bit) = 20 bit result => mult32 not needed */
6617                         qam_vd_period =
6618                             qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM64 + 1)
6619                             * (QAM_TOP_CONSTELLATION_QAM64 + 1);
6620                         break;
6621                 case DRX_CONSTELLATION_QAM256:
6622                         /* a(16 bit) * b(5 bit) = 21 bit result => mult32 not needed */
6623                         qam_vd_period =
6624                             qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM256 + 1)
6625                             * (QAM_TOP_CONSTELLATION_QAM256 + 1);
6626                         break;
6627                 default:
6628                         return -EINVAL;
6629                 }
6630                 if (qam_vd_period == 0) {
6631                         pr_err("error: qam_vd_period is zero!\n");
6632                         return -EIO;
6633                 }
6634                 qam_vd_period = fec_bits_desired / qam_vd_period;
6635                 /* limit to max 16 bit value (I2C register width) if needed */
6636                 if (qam_vd_period > 0xFFFF)
6637                         qam_vd_period = 0xFFFF;
6638
6639                 /* a(16 bit) * b(16 bit) = 32 bit result => mult32 not needed */
6640                 qam_vd_bit_cnt *= qam_vd_period;
6641
6642                 rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PERIOD__A, (u16)qam_vd_period, 0);
6643                 if (rc != 0) {
6644                         pr_err("error %d\n", rc);
6645                         goto rw_error;
6646                 }
6647                 rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PRESCALE__A, qam_vd_prescale, 0);
6648                 if (rc != 0) {
6649                         pr_err("error %d\n", rc);
6650                         goto rw_error;
6651                 }
6652                 ext_attr->qam_vd_period = (u16) qam_vd_period;
6653                 ext_attr->qam_vd_prescale = qam_vd_prescale;
6654         }
6655
6656         return 0;
6657 rw_error:
6658         return rc;
6659 }
6660
6661 /*============================================================================*/
6662
6663 /*
6664 * \fn int set_qam16 ()
6665 * \brief QAM16 specific setup
6666 * \param demod instance of demod.
6667 * \return int.
6668 */
6669 static int set_qam16(struct drx_demod_instance *demod)
6670 {
6671         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6672         int rc;
6673         static const u8 qam_dq_qual_fun[] = {
6674                 DRXJ_16TO8(2),  /* fun0  */
6675                 DRXJ_16TO8(2),  /* fun1  */
6676                 DRXJ_16TO8(2),  /* fun2  */
6677                 DRXJ_16TO8(2),  /* fun3  */
6678                 DRXJ_16TO8(3),  /* fun4  */
6679                 DRXJ_16TO8(3),  /* fun5  */
6680         };
6681         static const u8 qam_eq_cma_rad[] = {
6682                 DRXJ_16TO8(13517),      /* RAD0  */
6683                 DRXJ_16TO8(13517),      /* RAD1  */
6684                 DRXJ_16TO8(13517),      /* RAD2  */
6685                 DRXJ_16TO8(13517),      /* RAD3  */
6686                 DRXJ_16TO8(13517),      /* RAD4  */
6687                 DRXJ_16TO8(13517),      /* RAD5  */
6688         };
6689
6690         rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6691         if (rc != 0) {
6692                 pr_err("error %d\n", rc);
6693                 goto rw_error;
6694         }
6695         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);
6696         if (rc != 0) {
6697                 pr_err("error %d\n", rc);
6698                 goto rw_error;
6699         }
6700
6701         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 140, 0);
6702         if (rc != 0) {
6703                 pr_err("error %d\n", rc);
6704                 goto rw_error;
6705         }
6706         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6707         if (rc != 0) {
6708                 pr_err("error %d\n", rc);
6709                 goto rw_error;
6710         }
6711         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 120, 0);
6712         if (rc != 0) {
6713                 pr_err("error %d\n", rc);
6714                 goto rw_error;
6715         }
6716         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 230, 0);
6717         if (rc != 0) {
6718                 pr_err("error %d\n", rc);
6719                 goto rw_error;
6720         }
6721         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 95, 0);
6722         if (rc != 0) {
6723                 pr_err("error %d\n", rc);
6724                 goto rw_error;
6725         }
6726         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 105, 0);
6727         if (rc != 0) {
6728                 pr_err("error %d\n", rc);
6729                 goto rw_error;
6730         }
6731
6732         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6733         if (rc != 0) {
6734                 pr_err("error %d\n", rc);
6735                 goto rw_error;
6736         }
6737         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6738         if (rc != 0) {
6739                 pr_err("error %d\n", rc);
6740                 goto rw_error;
6741         }
6742         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6743         if (rc != 0) {
6744                 pr_err("error %d\n", rc);
6745                 goto rw_error;
6746         }
6747
6748         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 16, 0);
6749         if (rc != 0) {
6750                 pr_err("error %d\n", rc);
6751                 goto rw_error;
6752         }
6753         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 220, 0);
6754         if (rc != 0) {
6755                 pr_err("error %d\n", rc);
6756                 goto rw_error;
6757         }
6758         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 25, 0);
6759         if (rc != 0) {
6760                 pr_err("error %d\n", rc);
6761                 goto rw_error;
6762         }
6763         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 6, 0);
6764         if (rc != 0) {
6765                 pr_err("error %d\n", rc);
6766                 goto rw_error;
6767         }
6768         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-24), 0);
6769         if (rc != 0) {
6770                 pr_err("error %d\n", rc);
6771                 goto rw_error;
6772         }
6773         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-65), 0);
6774         if (rc != 0) {
6775                 pr_err("error %d\n", rc);
6776                 goto rw_error;
6777         }
6778         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-127), 0);
6779         if (rc != 0) {
6780                 pr_err("error %d\n", rc);
6781                 goto rw_error;
6782         }
6783
6784         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
6785         if (rc != 0) {
6786                 pr_err("error %d\n", rc);
6787                 goto rw_error;
6788         }
6789         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
6790         if (rc != 0) {
6791                 pr_err("error %d\n", rc);
6792                 goto rw_error;
6793         }
6794         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
6795         if (rc != 0) {
6796                 pr_err("error %d\n", rc);
6797                 goto rw_error;
6798         }
6799         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
6800         if (rc != 0) {
6801                 pr_err("error %d\n", rc);
6802                 goto rw_error;
6803         }
6804         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
6805         if (rc != 0) {
6806                 pr_err("error %d\n", rc);
6807                 goto rw_error;
6808         }
6809         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
6810         if (rc != 0) {
6811                 pr_err("error %d\n", rc);
6812                 goto rw_error;
6813         }
6814         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
6815         if (rc != 0) {
6816                 pr_err("error %d\n", rc);
6817                 goto rw_error;
6818         }
6819         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
6820         if (rc != 0) {
6821                 pr_err("error %d\n", rc);
6822                 goto rw_error;
6823         }
6824         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
6825         if (rc != 0) {
6826                 pr_err("error %d\n", rc);
6827                 goto rw_error;
6828         }
6829         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
6830         if (rc != 0) {
6831                 pr_err("error %d\n", rc);
6832                 goto rw_error;
6833         }
6834         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
6835         if (rc != 0) {
6836                 pr_err("error %d\n", rc);
6837                 goto rw_error;
6838         }
6839         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
6840         if (rc != 0) {
6841                 pr_err("error %d\n", rc);
6842                 goto rw_error;
6843         }
6844         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
6845         if (rc != 0) {
6846                 pr_err("error %d\n", rc);
6847                 goto rw_error;
6848         }
6849         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
6850         if (rc != 0) {
6851                 pr_err("error %d\n", rc);
6852                 goto rw_error;
6853         }
6854         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
6855         if (rc != 0) {
6856                 pr_err("error %d\n", rc);
6857                 goto rw_error;
6858         }
6859         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
6860         if (rc != 0) {
6861                 pr_err("error %d\n", rc);
6862                 goto rw_error;
6863         }
6864         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 240, 0);
6865         if (rc != 0) {
6866                 pr_err("error %d\n", rc);
6867                 goto rw_error;
6868         }
6869         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
6870         if (rc != 0) {
6871                 pr_err("error %d\n", rc);
6872                 goto rw_error;
6873         }
6874         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
6875         if (rc != 0) {
6876                 pr_err("error %d\n", rc);
6877                 goto rw_error;
6878         }
6879         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
6880         if (rc != 0) {
6881                 pr_err("error %d\n", rc);
6882                 goto rw_error;
6883         }
6884
6885         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 40960, 0);
6886         if (rc != 0) {
6887                 pr_err("error %d\n", rc);
6888                 goto rw_error;
6889         }
6890
6891         return 0;
6892 rw_error:
6893         return rc;
6894 }
6895
6896 /*============================================================================*/
6897
6898 /*
6899 * \fn int set_qam32 ()
6900 * \brief QAM32 specific setup
6901 * \param demod instance of demod.
6902 * \return int.
6903 */
6904 static int set_qam32(struct drx_demod_instance *demod)
6905 {
6906         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6907         int rc;
6908         static const u8 qam_dq_qual_fun[] = {
6909                 DRXJ_16TO8(3),  /* fun0  */
6910                 DRXJ_16TO8(3),  /* fun1  */
6911                 DRXJ_16TO8(3),  /* fun2  */
6912                 DRXJ_16TO8(3),  /* fun3  */
6913                 DRXJ_16TO8(4),  /* fun4  */
6914                 DRXJ_16TO8(4),  /* fun5  */
6915         };
6916         static const u8 qam_eq_cma_rad[] = {
6917                 DRXJ_16TO8(6707),       /* RAD0  */
6918                 DRXJ_16TO8(6707),       /* RAD1  */
6919                 DRXJ_16TO8(6707),       /* RAD2  */
6920                 DRXJ_16TO8(6707),       /* RAD3  */
6921                 DRXJ_16TO8(6707),       /* RAD4  */
6922                 DRXJ_16TO8(6707),       /* RAD5  */
6923         };
6924
6925         rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6926         if (rc != 0) {
6927                 pr_err("error %d\n", rc);
6928                 goto rw_error;
6929         }
6930         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);
6931         if (rc != 0) {
6932                 pr_err("error %d\n", rc);
6933                 goto rw_error;
6934         }
6935
6936         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 90, 0);
6937         if (rc != 0) {
6938                 pr_err("error %d\n", rc);
6939                 goto rw_error;
6940         }
6941         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6942         if (rc != 0) {
6943                 pr_err("error %d\n", rc);
6944                 goto rw_error;
6945         }
6946         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
6947         if (rc != 0) {
6948                 pr_err("error %d\n", rc);
6949                 goto rw_error;
6950         }
6951         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 170, 0);
6952         if (rc != 0) {
6953                 pr_err("error %d\n", rc);
6954                 goto rw_error;
6955         }
6956         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
6957         if (rc != 0) {
6958                 pr_err("error %d\n", rc);
6959                 goto rw_error;
6960         }
6961         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
6962         if (rc != 0) {
6963                 pr_err("error %d\n", rc);
6964                 goto rw_error;
6965         }
6966
6967         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6968         if (rc != 0) {
6969                 pr_err("error %d\n", rc);
6970                 goto rw_error;
6971         }
6972         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6973         if (rc != 0) {
6974                 pr_err("error %d\n", rc);
6975                 goto rw_error;
6976         }
6977         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6978         if (rc != 0) {
6979                 pr_err("error %d\n", rc);
6980                 goto rw_error;
6981         }
6982
6983         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
6984         if (rc != 0) {
6985                 pr_err("error %d\n", rc);
6986                 goto rw_error;
6987         }
6988         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 140, 0);
6989         if (rc != 0) {
6990                 pr_err("error %d\n", rc);
6991                 goto rw_error;
6992         }
6993         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16)(-8), 0);
6994         if (rc != 0) {
6995                 pr_err("error %d\n", rc);
6996                 goto rw_error;
6997         }
6998         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16)(-16), 0);
6999         if (rc != 0) {
7000                 pr_err("error %d\n", rc);
7001                 goto rw_error;
7002         }
7003         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-26), 0);
7004         if (rc != 0) {
7005                 pr_err("error %d\n", rc);
7006                 goto rw_error;
7007         }
7008         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-56), 0);
7009         if (rc != 0) {
7010                 pr_err("error %d\n", rc);
7011                 goto rw_error;
7012         }
7013         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-86), 0);
7014         if (rc != 0) {
7015                 pr_err("error %d\n", rc);
7016                 goto rw_error;
7017         }
7018
7019         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7020         if (rc != 0) {
7021                 pr_err("error %d\n", rc);
7022                 goto rw_error;
7023         }
7024         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7025         if (rc != 0) {
7026                 pr_err("error %d\n", rc);
7027                 goto rw_error;
7028         }
7029         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7030         if (rc != 0) {
7031                 pr_err("error %d\n", rc);
7032                 goto rw_error;
7033         }
7034         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
7035         if (rc != 0) {
7036                 pr_err("error %d\n", rc);
7037                 goto rw_error;
7038         }
7039         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7040         if (rc != 0) {
7041                 pr_err("error %d\n", rc);
7042                 goto rw_error;
7043         }
7044         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7045         if (rc != 0) {
7046                 pr_err("error %d\n", rc);
7047                 goto rw_error;
7048         }
7049         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
7050         if (rc != 0) {
7051                 pr_err("error %d\n", rc);
7052                 goto rw_error;
7053         }
7054         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
7055         if (rc != 0) {
7056                 pr_err("error %d\n", rc);
7057                 goto rw_error;
7058         }
7059         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7060         if (rc != 0) {
7061                 pr_err("error %d\n", rc);
7062                 goto rw_error;
7063         }
7064         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7065         if (rc != 0) {
7066                 pr_err("error %d\n", rc);
7067                 goto rw_error;
7068         }
7069         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7070         if (rc != 0) {
7071                 pr_err("error %d\n", rc);
7072                 goto rw_error;
7073         }
7074         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7075         if (rc != 0) {
7076                 pr_err("error %d\n", rc);
7077                 goto rw_error;
7078         }
7079         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7080         if (rc != 0) {
7081                 pr_err("error %d\n", rc);
7082                 goto rw_error;
7083         }
7084         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7085         if (rc != 0) {
7086                 pr_err("error %d\n", rc);
7087                 goto rw_error;
7088         }
7089         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7090         if (rc != 0) {
7091                 pr_err("error %d\n", rc);
7092                 goto rw_error;
7093         }
7094         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
7095         if (rc != 0) {
7096                 pr_err("error %d\n", rc);
7097                 goto rw_error;
7098         }
7099         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 176, 0);
7100         if (rc != 0) {
7101                 pr_err("error %d\n", rc);
7102                 goto rw_error;
7103         }
7104         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7105         if (rc != 0) {
7106                 pr_err("error %d\n", rc);
7107                 goto rw_error;
7108         }
7109         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7110         if (rc != 0) {
7111                 pr_err("error %d\n", rc);
7112                 goto rw_error;
7113         }
7114         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 8, 0);
7115         if (rc != 0) {
7116                 pr_err("error %d\n", rc);
7117                 goto rw_error;
7118         }
7119
7120         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20480, 0);
7121         if (rc != 0) {
7122                 pr_err("error %d\n", rc);
7123                 goto rw_error;
7124         }
7125
7126         return 0;
7127 rw_error:
7128         return rc;
7129 }
7130
7131 /*============================================================================*/
7132
7133 /*
7134 * \fn int set_qam64 ()
7135 * \brief QAM64 specific setup
7136 * \param demod instance of demod.
7137 * \return int.
7138 */
7139 static int set_qam64(struct drx_demod_instance *demod)
7140 {
7141         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7142         int rc;
7143         static const u8 qam_dq_qual_fun[] = {
7144                 /* this is hw reset value. no necessary to re-write */
7145                 DRXJ_16TO8(4),  /* fun0  */
7146                 DRXJ_16TO8(4),  /* fun1  */
7147                 DRXJ_16TO8(4),  /* fun2  */
7148                 DRXJ_16TO8(4),  /* fun3  */
7149                 DRXJ_16TO8(6),  /* fun4  */
7150                 DRXJ_16TO8(6),  /* fun5  */
7151         };
7152         static const u8 qam_eq_cma_rad[] = {
7153                 DRXJ_16TO8(13336),      /* RAD0  */
7154                 DRXJ_16TO8(12618),      /* RAD1  */
7155                 DRXJ_16TO8(11988),      /* RAD2  */
7156                 DRXJ_16TO8(13809),      /* RAD3  */
7157                 DRXJ_16TO8(13809),      /* RAD4  */
7158                 DRXJ_16TO8(15609),      /* RAD5  */
7159         };
7160
7161         rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7162         if (rc != 0) {
7163                 pr_err("error %d\n", rc);
7164                 goto rw_error;
7165         }
7166         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);
7167         if (rc != 0) {
7168                 pr_err("error %d\n", rc);
7169                 goto rw_error;
7170         }
7171
7172         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 105, 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_FTH__A, 60, 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_PTH__A, 100, 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_QTH__A, 195, 0);
7188         if (rc != 0) {
7189                 pr_err("error %d\n", rc);
7190                 goto rw_error;
7191         }
7192         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7193         if (rc != 0) {
7194                 pr_err("error %d\n", rc);
7195                 goto rw_error;
7196         }
7197         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 84, 0);
7198         if (rc != 0) {
7199                 pr_err("error %d\n", rc);
7200                 goto rw_error;
7201         }
7202
7203         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7204         if (rc != 0) {
7205                 pr_err("error %d\n", rc);
7206                 goto rw_error;
7207         }
7208         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7209         if (rc != 0) {
7210                 pr_err("error %d\n", rc);
7211                 goto rw_error;
7212         }
7213         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7214         if (rc != 0) {
7215                 pr_err("error %d\n", rc);
7216                 goto rw_error;
7217         }
7218
7219         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 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_RADIUS_AV_LIMIT__A, 141, 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_OFFSET1__A, 7, 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_OFFSET2__A, 0, 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_OFFSET3__A, (u16)(-15), 0);
7240         if (rc != 0) {
7241                 pr_err("error %d\n", rc);
7242                 goto rw_error;
7243         }
7244         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-45), 0);
7245         if (rc != 0) {
7246                 pr_err("error %d\n", rc);
7247                 goto rw_error;
7248         }
7249         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-80), 0);
7250         if (rc != 0) {
7251                 pr_err("error %d\n", rc);
7252                 goto rw_error;
7253         }
7254
7255         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 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_CA_COARSE__A, 40, 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_FINE__A, 2, 0);
7266         if (rc != 0) {
7267                 pr_err("error %d\n", rc);
7268                 goto rw_error;
7269         }
7270         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30, 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_CP_COARSE__A, 255, 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_FINE__A, 2, 0);
7281         if (rc != 0) {
7282                 pr_err("error %d\n", rc);
7283                 goto rw_error;
7284         }
7285         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 15, 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_CI_COARSE__A, 80, 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_FINE__A, 12, 0);
7296         if (rc != 0) {
7297                 pr_err("error %d\n", rc);
7298                 goto rw_error;
7299         }
7300         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7301         if (rc != 0) {
7302                 pr_err("error %d\n", rc);
7303                 goto rw_error;
7304         }
7305         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 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_FINE__A, 12, 0);
7311         if (rc != 0) {
7312                 pr_err("error %d\n", rc);
7313                 goto rw_error;
7314         }
7315         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__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_EI_COARSE__A, 16, 0);
7321         if (rc != 0) {
7322                 pr_err("error %d\n", rc);
7323                 goto rw_error;
7324         }
7325         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7326         if (rc != 0) {
7327                 pr_err("error %d\n", rc);
7328                 goto rw_error;
7329         }
7330         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 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_CF_COARSE__A, 160, 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_FINE__A, 5, 0);
7341         if (rc != 0) {
7342                 pr_err("error %d\n", rc);
7343                 goto rw_error;
7344         }
7345         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7346         if (rc != 0) {
7347                 pr_err("error %d\n", rc);
7348                 goto rw_error;
7349         }
7350         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
7351         if (rc != 0) {
7352                 pr_err("error %d\n", rc);
7353                 goto rw_error;
7354         }
7355
7356         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43008, 0);
7357         if (rc != 0) {
7358                 pr_err("error %d\n", rc);
7359                 goto rw_error;
7360         }
7361
7362         return 0;
7363 rw_error:
7364         return rc;
7365 }
7366
7367 /*============================================================================*/
7368
7369 /*
7370 * \fn int set_qam128 ()
7371 * \brief QAM128 specific setup
7372 * \param demod: instance of demod.
7373 * \return int.
7374 */
7375 static int set_qam128(struct drx_demod_instance *demod)
7376 {
7377         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7378         int rc;
7379         static const u8 qam_dq_qual_fun[] = {
7380                 DRXJ_16TO8(6),  /* fun0  */
7381                 DRXJ_16TO8(6),  /* fun1  */
7382                 DRXJ_16TO8(6),  /* fun2  */
7383                 DRXJ_16TO8(6),  /* fun3  */
7384                 DRXJ_16TO8(9),  /* fun4  */
7385                 DRXJ_16TO8(9),  /* fun5  */
7386         };
7387         static const u8 qam_eq_cma_rad[] = {
7388                 DRXJ_16TO8(6164),       /* RAD0  */
7389                 DRXJ_16TO8(6598),       /* RAD1  */
7390                 DRXJ_16TO8(6394),       /* RAD2  */
7391                 DRXJ_16TO8(6409),       /* RAD3  */
7392                 DRXJ_16TO8(6656),       /* RAD4  */
7393                 DRXJ_16TO8(7238),       /* RAD5  */
7394         };
7395
7396         rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7397         if (rc != 0) {
7398                 pr_err("error %d\n", rc);
7399                 goto rw_error;
7400         }
7401         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);
7402         if (rc != 0) {
7403                 pr_err("error %d\n", rc);
7404                 goto rw_error;
7405         }
7406
7407         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 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_FTH__A, 60, 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_PTH__A, 100, 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_QTH__A, 140, 0);
7423         if (rc != 0) {
7424                 pr_err("error %d\n", rc);
7425                 goto rw_error;
7426         }
7427         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7428         if (rc != 0) {
7429                 pr_err("error %d\n", rc);
7430                 goto rw_error;
7431         }
7432         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
7433         if (rc != 0) {
7434                 pr_err("error %d\n", rc);
7435                 goto rw_error;
7436         }
7437
7438         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7439         if (rc != 0) {
7440                 pr_err("error %d\n", rc);
7441                 goto rw_error;
7442         }
7443         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7444         if (rc != 0) {
7445                 pr_err("error %d\n", rc);
7446                 goto rw_error;
7447         }
7448         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7449         if (rc != 0) {
7450                 pr_err("error %d\n", rc);
7451                 goto rw_error;
7452         }
7453
7454         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 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_RADIUS_AV_LIMIT__A, 65, 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_OFFSET1__A, 5, 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_OFFSET2__A, 3, 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_OFFSET3__A, (u16)(-1), 0);
7475         if (rc != 0) {
7476                 pr_err("error %d\n", rc);
7477                 goto rw_error;
7478         }
7479         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 12, 0);
7480         if (rc != 0) {
7481                 pr_err("error %d\n", rc);
7482                 goto rw_error;
7483         }
7484         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-23), 0);
7485         if (rc != 0) {
7486                 pr_err("error %d\n", rc);
7487                 goto rw_error;
7488         }
7489
7490         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 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_CA_COARSE__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_FINE__A, 2, 0);
7501         if (rc != 0) {
7502                 pr_err("error %d\n", rc);
7503                 goto rw_error;
7504         }
7505         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40, 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_CP_COARSE__A, 255, 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_FINE__A, 2, 0);
7516         if (rc != 0) {
7517                 pr_err("error %d\n", rc);
7518                 goto rw_error;
7519         }
7520         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20, 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_CI_COARSE__A, 80, 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_FINE__A, 12, 0);
7531         if (rc != 0) {
7532                 pr_err("error %d\n", rc);
7533                 goto rw_error;
7534         }
7535         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7536         if (rc != 0) {
7537                 pr_err("error %d\n", rc);
7538                 goto rw_error;
7539         }
7540         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 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_FINE__A, 12, 0);
7546         if (rc != 0) {
7547                 pr_err("error %d\n", rc);
7548                 goto rw_error;
7549         }
7550         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__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_EI_COARSE__A, 16, 0);
7556         if (rc != 0) {
7557                 pr_err("error %d\n", rc);
7558                 goto rw_error;
7559         }
7560         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7561         if (rc != 0) {
7562                 pr_err("error %d\n", rc);
7563                 goto rw_error;
7564         }
7565         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 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_CF_COARSE__A, 144, 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_FINE__A, 5, 0);
7576         if (rc != 0) {
7577                 pr_err("error %d\n", rc);
7578                 goto rw_error;
7579         }
7580         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7581         if (rc != 0) {
7582                 pr_err("error %d\n", rc);
7583                 goto rw_error;
7584         }
7585         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7586         if (rc != 0) {
7587                 pr_err("error %d\n", rc);
7588                 goto rw_error;
7589         }
7590
7591         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20992, 0);
7592         if (rc != 0) {
7593                 pr_err("error %d\n", rc);
7594                 goto rw_error;
7595         }
7596
7597         return 0;
7598 rw_error:
7599         return rc;
7600 }
7601
7602 /*============================================================================*/
7603
7604 /*
7605 * \fn int set_qam256 ()
7606 * \brief QAM256 specific setup
7607 * \param demod: instance of demod.
7608 * \return int.
7609 */
7610 static int set_qam256(struct drx_demod_instance *demod)
7611 {
7612         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7613         int rc;
7614         static const u8 qam_dq_qual_fun[] = {
7615                 DRXJ_16TO8(8),  /* fun0  */
7616                 DRXJ_16TO8(8),  /* fun1  */
7617                 DRXJ_16TO8(8),  /* fun2  */
7618                 DRXJ_16TO8(8),  /* fun3  */
7619                 DRXJ_16TO8(12), /* fun4  */
7620                 DRXJ_16TO8(12), /* fun5  */
7621         };
7622         static const u8 qam_eq_cma_rad[] = {
7623                 DRXJ_16TO8(12345),      /* RAD0  */
7624                 DRXJ_16TO8(12345),      /* RAD1  */
7625                 DRXJ_16TO8(13626),      /* RAD2  */
7626                 DRXJ_16TO8(12931),      /* RAD3  */
7627                 DRXJ_16TO8(14719),      /* RAD4  */
7628                 DRXJ_16TO8(15356),      /* RAD5  */
7629         };
7630
7631         rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7632         if (rc != 0) {
7633                 pr_err("error %d\n", rc);
7634                 goto rw_error;
7635         }
7636         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);
7637         if (rc != 0) {
7638                 pr_err("error %d\n", rc);
7639                 goto rw_error;
7640         }
7641
7642         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 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_FTH__A, 60, 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_PTH__A, 100, 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_QTH__A, 150, 0);
7658         if (rc != 0) {
7659                 pr_err("error %d\n", rc);
7660                 goto rw_error;
7661         }
7662         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7663         if (rc != 0) {
7664                 pr_err("error %d\n", rc);
7665                 goto rw_error;
7666         }
7667         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 110, 0);
7668         if (rc != 0) {
7669                 pr_err("error %d\n", rc);
7670                 goto rw_error;
7671         }
7672
7673         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7674         if (rc != 0) {
7675                 pr_err("error %d\n", rc);
7676                 goto rw_error;
7677         }
7678         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 16, 0);
7679         if (rc != 0) {
7680                 pr_err("error %d\n", rc);
7681                 goto rw_error;
7682         }
7683         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7684         if (rc != 0) {
7685                 pr_err("error %d\n", rc);
7686                 goto rw_error;
7687         }
7688
7689         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 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_RADIUS_AV_LIMIT__A, 74, 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_OFFSET1__A, 18, 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_OFFSET2__A, 13, 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_OFFSET3__A, 7, 0);
7710         if (rc != 0) {
7711                 pr_err("error %d\n", rc);
7712                 goto rw_error;
7713         }
7714         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 0, 0);
7715         if (rc != 0) {
7716                 pr_err("error %d\n", rc);
7717                 goto rw_error;
7718         }
7719         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-8), 0);
7720         if (rc != 0) {
7721                 pr_err("error %d\n", rc);
7722                 goto rw_error;
7723         }
7724
7725         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 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_CA_COARSE__A, 40, 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_FINE__A, 2, 0);
7736         if (rc != 0) {
7737                 pr_err("error %d\n", rc);
7738                 goto rw_error;
7739         }
7740         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50, 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_CP_COARSE__A, 255, 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_FINE__A, 2, 0);
7751         if (rc != 0) {
7752                 pr_err("error %d\n", rc);
7753                 goto rw_error;
7754         }
7755         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 25, 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_CI_COARSE__A, 80, 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_FINE__A, 12, 0);
7766         if (rc != 0) {
7767                 pr_err("error %d\n", rc);
7768                 goto rw_error;
7769         }
7770         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7771         if (rc != 0) {
7772                 pr_err("error %d\n", rc);
7773                 goto rw_error;
7774         }
7775         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 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_FINE__A, 12, 0);
7781         if (rc != 0) {
7782                 pr_err("error %d\n", rc);
7783                 goto rw_error;
7784         }
7785         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__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_EI_COARSE__A, 16, 0);
7791         if (rc != 0) {
7792                 pr_err("error %d\n", rc);
7793                 goto rw_error;
7794         }
7795         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7796         if (rc != 0) {
7797                 pr_err("error %d\n", rc);
7798                 goto rw_error;
7799         }
7800         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 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_CF_COARSE__A, 80, 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_FINE__A, 5, 0);
7811         if (rc != 0) {
7812                 pr_err("error %d\n", rc);
7813                 goto rw_error;
7814         }
7815         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7816         if (rc != 0) {
7817                 pr_err("error %d\n", rc);
7818                 goto rw_error;
7819         }
7820         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7821         if (rc != 0) {
7822                 pr_err("error %d\n", rc);
7823                 goto rw_error;
7824         }
7825
7826         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43520, 0);
7827         if (rc != 0) {
7828                 pr_err("error %d\n", rc);
7829                 goto rw_error;
7830         }
7831
7832         return 0;
7833 rw_error:
7834         return rc;
7835 }
7836
7837 /*============================================================================*/
7838 #define QAM_SET_OP_ALL 0x1
7839 #define QAM_SET_OP_CONSTELLATION 0x2
7840 #define QAM_SET_OP_SPECTRUM 0X4
7841
7842 /*
7843 * \fn int set_qam ()
7844 * \brief Set QAM demod.
7845 * \param demod:   instance of demod.
7846 * \param channel: pointer to channel data.
7847 * \return int.
7848 */
7849 static int
7850 set_qam(struct drx_demod_instance *demod,
7851         struct drx_channel *channel, s32 tuner_freq_offset, u32 op)
7852 {
7853         struct i2c_device_addr *dev_addr = NULL;
7854         struct drxj_data *ext_attr = NULL;
7855         struct drx_common_attr *common_attr = NULL;
7856         int rc;
7857         u32 adc_frequency = 0;
7858         u32 iqm_rc_rate = 0;
7859         u16 cmd_result = 0;
7860         u16 lc_symbol_freq = 0;
7861         u16 iqm_rc_stretch = 0;
7862         u16 set_env_parameters = 0;
7863         u16 set_param_parameters[2] = { 0 };
7864         struct drxjscu_cmd cmd_scu = { /* command      */ 0,
7865                 /* parameter_len */ 0,
7866                 /* result_len    */ 0,
7867                 /* parameter    */ NULL,
7868                 /* result       */ NULL
7869         };
7870         static const u8 qam_a_taps[] = {
7871                 DRXJ_16TO8(-1), /* re0  */
7872                 DRXJ_16TO8(1),  /* re1  */
7873                 DRXJ_16TO8(1),  /* re2  */
7874                 DRXJ_16TO8(-1), /* re3  */
7875                 DRXJ_16TO8(-1), /* re4  */
7876                 DRXJ_16TO8(2),  /* re5  */
7877                 DRXJ_16TO8(1),  /* re6  */
7878                 DRXJ_16TO8(-2), /* re7  */
7879                 DRXJ_16TO8(0),  /* re8  */
7880                 DRXJ_16TO8(3),  /* re9  */
7881                 DRXJ_16TO8(-1), /* re10 */
7882                 DRXJ_16TO8(-3), /* re11 */
7883                 DRXJ_16TO8(4),  /* re12 */
7884                 DRXJ_16TO8(1),  /* re13 */
7885                 DRXJ_16TO8(-8), /* re14 */
7886                 DRXJ_16TO8(4),  /* re15 */
7887                 DRXJ_16TO8(13), /* re16 */
7888                 DRXJ_16TO8(-13),        /* re17 */
7889                 DRXJ_16TO8(-19),        /* re18 */
7890                 DRXJ_16TO8(28), /* re19 */
7891                 DRXJ_16TO8(25), /* re20 */
7892                 DRXJ_16TO8(-53),        /* re21 */
7893                 DRXJ_16TO8(-31),        /* re22 */
7894                 DRXJ_16TO8(96), /* re23 */
7895                 DRXJ_16TO8(37), /* re24 */
7896                 DRXJ_16TO8(-190),       /* re25 */
7897                 DRXJ_16TO8(-40),        /* re26 */
7898                 DRXJ_16TO8(619) /* re27 */
7899         };
7900         static const u8 qam_b64_taps[] = {
7901                 DRXJ_16TO8(0),  /* re0  */
7902                 DRXJ_16TO8(-2), /* re1  */
7903                 DRXJ_16TO8(1),  /* re2  */
7904                 DRXJ_16TO8(2),  /* re3  */
7905                 DRXJ_16TO8(-2), /* re4  */
7906                 DRXJ_16TO8(0),  /* re5  */
7907                 DRXJ_16TO8(4),  /* re6  */
7908                 DRXJ_16TO8(-2), /* re7  */
7909                 DRXJ_16TO8(-4), /* re8  */
7910                 DRXJ_16TO8(4),  /* re9  */
7911                 DRXJ_16TO8(3),  /* re10 */
7912                 DRXJ_16TO8(-6), /* re11 */
7913                 DRXJ_16TO8(0),  /* re12 */
7914                 DRXJ_16TO8(6),  /* re13 */
7915                 DRXJ_16TO8(-5), /* re14 */
7916                 DRXJ_16TO8(-3), /* re15 */
7917                 DRXJ_16TO8(11), /* re16 */
7918                 DRXJ_16TO8(-4), /* re17 */
7919                 DRXJ_16TO8(-19),        /* re18 */
7920                 DRXJ_16TO8(19), /* re19 */
7921                 DRXJ_16TO8(28), /* re20 */
7922                 DRXJ_16TO8(-45),        /* re21 */
7923                 DRXJ_16TO8(-36),        /* re22 */
7924                 DRXJ_16TO8(90), /* re23 */
7925                 DRXJ_16TO8(42), /* re24 */
7926                 DRXJ_16TO8(-185),       /* re25 */
7927                 DRXJ_16TO8(-46),        /* re26 */
7928                 DRXJ_16TO8(614) /* re27 */
7929         };
7930         static const u8 qam_b256_taps[] = {
7931                 DRXJ_16TO8(-2), /* re0  */
7932                 DRXJ_16TO8(4),  /* re1  */
7933                 DRXJ_16TO8(1),  /* re2  */
7934                 DRXJ_16TO8(-4), /* re3  */
7935                 DRXJ_16TO8(0),  /* re4  */
7936                 DRXJ_16TO8(4),  /* re5  */
7937                 DRXJ_16TO8(-2), /* re6  */
7938                 DRXJ_16TO8(-4), /* re7  */
7939                 DRXJ_16TO8(5),  /* re8  */
7940                 DRXJ_16TO8(2),  /* re9  */
7941                 DRXJ_16TO8(-8), /* re10 */
7942                 DRXJ_16TO8(2),  /* re11 */
7943                 DRXJ_16TO8(11), /* re12 */
7944                 DRXJ_16TO8(-8), /* re13 */
7945                 DRXJ_16TO8(-15),        /* re14 */
7946                 DRXJ_16TO8(16), /* re15 */
7947                 DRXJ_16TO8(19), /* re16 */
7948                 DRXJ_16TO8(-27),        /* re17 */
7949                 DRXJ_16TO8(-22),        /* re18 */
7950                 DRXJ_16TO8(44), /* re19 */
7951                 DRXJ_16TO8(26), /* re20 */
7952                 DRXJ_16TO8(-69),        /* re21 */
7953                 DRXJ_16TO8(-28),        /* re22 */
7954                 DRXJ_16TO8(110),        /* re23 */
7955                 DRXJ_16TO8(31), /* re24 */
7956                 DRXJ_16TO8(-201),       /* re25 */
7957                 DRXJ_16TO8(-32),        /* re26 */
7958                 DRXJ_16TO8(628) /* re27 */
7959         };
7960         static const u8 qam_c_taps[] = {
7961                 DRXJ_16TO8(-3), /* re0  */
7962                 DRXJ_16TO8(3),  /* re1  */
7963                 DRXJ_16TO8(2),  /* re2  */
7964                 DRXJ_16TO8(-4), /* re3  */
7965                 DRXJ_16TO8(0),  /* re4  */
7966                 DRXJ_16TO8(4),  /* re5  */
7967                 DRXJ_16TO8(-1), /* re6  */
7968                 DRXJ_16TO8(-4), /* re7  */
7969                 DRXJ_16TO8(3),  /* re8  */
7970                 DRXJ_16TO8(3),  /* re9  */
7971                 DRXJ_16TO8(-5), /* re10 */
7972                 DRXJ_16TO8(0),  /* re11 */
7973                 DRXJ_16TO8(9),  /* re12 */
7974                 DRXJ_16TO8(-4), /* re13 */
7975                 DRXJ_16TO8(-12),        /* re14 */
7976                 DRXJ_16TO8(10), /* re15 */
7977                 DRXJ_16TO8(16), /* re16 */
7978                 DRXJ_16TO8(-21),        /* re17 */
7979                 DRXJ_16TO8(-20),        /* re18 */
7980                 DRXJ_16TO8(37), /* re19 */
7981                 DRXJ_16TO8(25), /* re20 */
7982                 DRXJ_16TO8(-62),        /* re21 */
7983                 DRXJ_16TO8(-28),        /* re22 */
7984                 DRXJ_16TO8(105),        /* re23 */
7985                 DRXJ_16TO8(31), /* re24 */
7986                 DRXJ_16TO8(-197),       /* re25 */
7987                 DRXJ_16TO8(-33),        /* re26 */
7988                 DRXJ_16TO8(626) /* re27 */
7989         };
7990
7991         dev_addr = demod->my_i2c_dev_addr;
7992         ext_attr = (struct drxj_data *) demod->my_ext_attr;
7993         common_attr = (struct drx_common_attr *) demod->my_common_attr;
7994
7995         if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
7996                 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
7997                         switch (channel->constellation) {
7998                         case DRX_CONSTELLATION_QAM256:
7999                                 iqm_rc_rate = 0x00AE3562;
8000                                 lc_symbol_freq =
8001                                     QAM_LC_SYMBOL_FREQ_FREQ_QAM_B_256;
8002                                 channel->symbolrate = 5360537;
8003                                 iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_256;
8004                                 break;
8005                         case DRX_CONSTELLATION_QAM64:
8006                                 iqm_rc_rate = 0x00C05A0E;
8007                                 lc_symbol_freq = 409;
8008                                 channel->symbolrate = 5056941;
8009                                 iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_64;
8010                                 break;
8011                         default:
8012                                 return -EINVAL;
8013                         }
8014                 } else {
8015                         adc_frequency = (common_attr->sys_clock_freq * 1000) / 3;
8016                         if (channel->symbolrate == 0) {
8017                                 pr_err("error: channel symbolrate is zero!\n");
8018                                 return -EIO;
8019                         }
8020                         iqm_rc_rate =
8021                             (adc_frequency / channel->symbolrate) * (1 << 21) +
8022                             (frac28
8023                              ((adc_frequency % channel->symbolrate),
8024                               channel->symbolrate) >> 7) - (1 << 23);
8025                         lc_symbol_freq =
8026                             (u16) (frac28
8027                                      (channel->symbolrate +
8028                                       (adc_frequency >> 13),
8029                                       adc_frequency) >> 16);
8030                         if (lc_symbol_freq > 511)
8031                                 lc_symbol_freq = 511;
8032
8033                         iqm_rc_stretch = 21;
8034                 }
8035
8036                 if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8037                         set_env_parameters = QAM_TOP_ANNEX_A;   /* annex             */
8038                         set_param_parameters[0] = channel->constellation;       /* constellation     */
8039                         set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;   /* interleave mode   */
8040                 } else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8041                         set_env_parameters = QAM_TOP_ANNEX_B;   /* annex             */
8042                         set_param_parameters[0] = channel->constellation;       /* constellation     */
8043                         set_param_parameters[1] = channel->interleavemode;      /* interleave mode   */
8044                 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8045                         set_env_parameters = QAM_TOP_ANNEX_C;   /* annex             */
8046                         set_param_parameters[0] = channel->constellation;       /* constellation     */
8047                         set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;   /* interleave mode   */
8048                 } else {
8049                         return -EINVAL;
8050                 }
8051         }
8052
8053         if (op & QAM_SET_OP_ALL) {
8054                 /*
8055                    STEP 1: reset demodulator
8056                    resets IQM, QAM and FEC HW blocks
8057                    resets SCU variables
8058                  */
8059                 /* stop all comm_exec */
8060                 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_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, QAM_COMM_EXEC__A, QAM_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_FS_COMM_EXEC__A, IQM_FS_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_FD_COMM_EXEC__A, IQM_FD_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_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
8081                 if (rc != 0) {
8082                         pr_err("error %d\n", rc);
8083                         goto rw_error;
8084                 }
8085                 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
8086                 if (rc != 0) {
8087                         pr_err("error %d\n", rc);
8088                         goto rw_error;
8089                 }
8090                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
8091                 if (rc != 0) {
8092                         pr_err("error %d\n", rc);
8093                         goto rw_error;
8094                 }
8095
8096                 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8097                     SCU_RAM_COMMAND_CMD_DEMOD_RESET;
8098                 cmd_scu.parameter_len = 0;
8099                 cmd_scu.result_len = 1;
8100                 cmd_scu.parameter = NULL;
8101                 cmd_scu.result = &cmd_result;
8102                 rc = scu_command(dev_addr, &cmd_scu);
8103                 if (rc != 0) {
8104                         pr_err("error %d\n", rc);
8105                         goto rw_error;
8106                 }
8107         }
8108
8109         if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8110                 /*
8111                    STEP 2: configure demodulator
8112                    -set env
8113                    -set params (resets IQM,QAM,FEC HW; initializes some SCU variables )
8114                  */
8115                 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8116                     SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
8117                 cmd_scu.parameter_len = 1;
8118                 cmd_scu.result_len = 1;
8119                 cmd_scu.parameter = &set_env_parameters;
8120                 cmd_scu.result = &cmd_result;
8121                 rc = scu_command(dev_addr, &cmd_scu);
8122                 if (rc != 0) {
8123                         pr_err("error %d\n", rc);
8124                         goto rw_error;
8125                 }
8126
8127                 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8128                     SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
8129                 cmd_scu.parameter_len = 2;
8130                 cmd_scu.result_len = 1;
8131                 cmd_scu.parameter = set_param_parameters;
8132                 cmd_scu.result = &cmd_result;
8133                 rc = scu_command(dev_addr, &cmd_scu);
8134                 if (rc != 0) {
8135                         pr_err("error %d\n", rc);
8136                         goto rw_error;
8137                 }
8138                 /* set symbol rate */
8139                 rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate, 0);
8140                 if (rc != 0) {
8141                         pr_err("error %d\n", rc);
8142                         goto rw_error;
8143                 }
8144                 ext_attr->iqm_rc_rate_ofs = iqm_rc_rate;
8145                 rc = set_qam_measurement(demod, channel->constellation, channel->symbolrate);
8146                 if (rc != 0) {
8147                         pr_err("error %d\n", rc);
8148                         goto rw_error;
8149                 }
8150         }
8151         /* STEP 3: enable the system in a mode where the ADC provides valid signal
8152            setup constellation independent registers */
8153         /* from qam_cmd.py script (qam_driver_b) */
8154         /* TODO: remove re-writes of HW reset values */
8155         if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_SPECTRUM)) {
8156                 rc = set_frequency(demod, channel, tuner_freq_offset);
8157                 if (rc != 0) {
8158                         pr_err("error %d\n", rc);
8159                         goto rw_error;
8160                 }
8161         }
8162
8163         if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8164
8165                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_SYMBOL_FREQ__A, lc_symbol_freq, 0);
8166                 if (rc != 0) {
8167                         pr_err("error %d\n", rc);
8168                         goto rw_error;
8169                 }
8170                 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, iqm_rc_stretch, 0);
8171                 if (rc != 0) {
8172                         pr_err("error %d\n", rc);
8173                         goto rw_error;
8174                 }
8175         }
8176
8177         if (op & QAM_SET_OP_ALL) {
8178                 if (!ext_attr->has_lna) {
8179                         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
8180                         if (rc != 0) {
8181                                 pr_err("error %d\n", rc);
8182                                 goto rw_error;
8183                         }
8184                 }
8185                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
8186                 if (rc != 0) {
8187                         pr_err("error %d\n", rc);
8188                         goto rw_error;
8189                 }
8190                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
8191                 if (rc != 0) {
8192                         pr_err("error %d\n", rc);
8193                         goto rw_error;
8194                 }
8195                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_QAM__M, 0);
8196                 if (rc != 0) {
8197                         pr_err("error %d\n", rc);
8198                         goto rw_error;
8199                 }
8200
8201                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_WR_RSV_0__A, 0x5f, 0);
8202                 if (rc != 0) {
8203                         pr_err("error %d\n", rc);
8204                         goto rw_error;
8205                 }       /* scu temporary shut down agc */
8206
8207                 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SYNC_SEL__A, 3, 0);
8208                 if (rc != 0) {
8209                         pr_err("error %d\n", rc);
8210                         goto rw_error;
8211                 }
8212                 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_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_CLP_TH__A, 448, 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_SNS_LEN__A, 0, 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_PDREF__A, 4, 0);
8228                 if (rc != 0) {
8229                         pr_err("error %d\n", rc);
8230                         goto rw_error;
8231                 }
8232                 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, 0x10, 0);
8233                 if (rc != 0) {
8234                         pr_err("error %d\n", rc);
8235                         goto rw_error;
8236                 }
8237                 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, 11, 0);
8238                 if (rc != 0) {
8239                         pr_err("error %d\n", rc);
8240                         goto rw_error;
8241                 }
8242
8243                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
8244                 if (rc != 0) {
8245                         pr_err("error %d\n", rc);
8246                         goto rw_error;
8247                 }
8248                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE, 0);
8249                 if (rc != 0) {
8250                         pr_err("error %d\n", rc);
8251                         goto rw_error;
8252                 }       /*! reset default val ! */
8253
8254                 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE, 0);
8255                 if (rc != 0) {
8256                         pr_err("error %d\n", rc);
8257                         goto rw_error;
8258                 }       /*! reset default val ! */
8259                 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8260                         rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, QAM_SY_SYNC_LWM__PRE, 0);
8261                         if (rc != 0) {
8262                                 pr_err("error %d\n", rc);
8263                                 goto rw_error;
8264                         }       /*! reset default val ! */
8265                         rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, QAM_SY_SYNC_AWM__PRE, 0);
8266                         if (rc != 0) {
8267                                 pr_err("error %d\n", rc);
8268                                 goto rw_error;
8269                         }       /*! reset default val ! */
8270                         rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8271                         if (rc != 0) {
8272                                 pr_err("error %d\n", rc);
8273                                 goto rw_error;
8274                         }       /*! reset default val ! */
8275                 } else {
8276                         switch (channel->constellation) {
8277                         case DRX_CONSTELLATION_QAM16:
8278                         case DRX_CONSTELLATION_QAM64:
8279                         case DRX_CONSTELLATION_QAM256:
8280                                 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8281                                 if (rc != 0) {
8282                                         pr_err("error %d\n", rc);
8283                                         goto rw_error;
8284                                 }
8285                                 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x04, 0);
8286                                 if (rc != 0) {
8287                                         pr_err("error %d\n", rc);
8288                                         goto rw_error;
8289                                 }
8290                                 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8291                                 if (rc != 0) {
8292                                         pr_err("error %d\n", rc);
8293                                         goto rw_error;
8294                                 }       /*! reset default val ! */
8295                                 break;
8296                         case DRX_CONSTELLATION_QAM32:
8297                         case DRX_CONSTELLATION_QAM128:
8298                                 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8299                                 if (rc != 0) {
8300                                         pr_err("error %d\n", rc);
8301                                         goto rw_error;
8302                                 }
8303                                 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x05, 0);
8304                                 if (rc != 0) {
8305                                         pr_err("error %d\n", rc);
8306                                         goto rw_error;
8307                                 }
8308                                 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, 0x06, 0);
8309                                 if (rc != 0) {
8310                                         pr_err("error %d\n", rc);
8311                                         goto rw_error;
8312                                 }
8313                                 break;
8314                         default:
8315                                 return -EIO;
8316                         }       /* switch */
8317                 }
8318
8319                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, QAM_LC_MODE__PRE, 0);
8320                 if (rc != 0) {
8321                         pr_err("error %d\n", rc);
8322                         goto rw_error;
8323                 }       /*! reset default val ! */
8324                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_RATE_LIMIT__A, 3, 0);
8325                 if (rc != 0) {
8326                         pr_err("error %d\n", rc);
8327                         goto rw_error;
8328                 }
8329                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORP__A, 4, 0);
8330                 if (rc != 0) {
8331                         pr_err("error %d\n", rc);
8332                         goto rw_error;
8333                 }
8334                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORI__A, 4, 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_MODE__A, 7, 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_TAB0__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_TAB1__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_TAB2__A, 1, 0);
8355                 if (rc != 0) {
8356                         pr_err("error %d\n", rc);
8357                         goto rw_error;
8358                 }
8359                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB3__A, 1, 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_TAB4__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_TAB5__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_TAB6__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_TAB8__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_TAB9__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_TAB10__A, 2, 0);
8390                 if (rc != 0) {
8391                         pr_err("error %d\n", rc);
8392                         goto rw_error;
8393                 }
8394                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB12__A, 2, 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_TAB15__A, 3, 0);
8400                 if (rc != 0) {
8401                         pr_err("error %d\n", rc);
8402                         goto rw_error;
8403                 }
8404                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB16__A, 3, 0);
8405                 if (rc != 0) {
8406                         pr_err("error %d\n", rc);
8407                         goto rw_error;
8408                 }
8409                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB20__A, 4, 0);
8410                 if (rc != 0) {
8411                         pr_err("error %d\n", rc);
8412                         goto rw_error;
8413                 }
8414                 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB25__A, 4, 0);
8415                 if (rc != 0) {
8416                         pr_err("error %d\n", rc);
8417                         goto rw_error;
8418                 }
8419
8420                 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_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_RC_ADJ_SEL__A, 1, 0);
8426                 if (rc != 0) {
8427                         pr_err("error %d\n", rc);
8428                         goto rw_error;
8429                 }
8430                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_ADJ_SEL__A, 1, 0);
8431                 if (rc != 0) {
8432                         pr_err("error %d\n", rc);
8433                         goto rw_error;
8434                 }
8435                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 0, 0);
8436                 if (rc != 0) {
8437                         pr_err("error %d\n", rc);
8438                         goto rw_error;
8439                 }
8440                 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
8441                 if (rc != 0) {
8442                         pr_err("error %d\n", rc);
8443                         goto rw_error;
8444                 }
8445
8446                 /* No more resets of the IQM, current standard correctly set =>
8447                    now AGCs can be configured. */
8448                 /* turn on IQMAF. It has to be in front of setAgc**() */
8449                 rc = set_iqm_af(demod, true);
8450                 if (rc != 0) {
8451                         pr_err("error %d\n", rc);
8452                         goto rw_error;
8453                 }
8454                 rc = adc_synchronization(demod);
8455                 if (rc != 0) {
8456                         pr_err("error %d\n", rc);
8457                         goto rw_error;
8458                 }
8459
8460                 rc = init_agc(demod);
8461                 if (rc != 0) {
8462                         pr_err("error %d\n", rc);
8463                         goto rw_error;
8464                 }
8465                 rc = set_agc_if(demod, &(ext_attr->qam_if_agc_cfg), false);
8466                 if (rc != 0) {
8467                         pr_err("error %d\n", rc);
8468                         goto rw_error;
8469                 }
8470                 rc = set_agc_rf(demod, &(ext_attr->qam_rf_agc_cfg), false);
8471                 if (rc != 0) {
8472                         pr_err("error %d\n", rc);
8473                         goto rw_error;
8474                 }
8475                 {
8476                         /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
8477                            of only the gain */
8478                         struct drxj_cfg_afe_gain qam_pga_cfg = { DRX_STANDARD_ITU_B, 0 };
8479
8480                         qam_pga_cfg.gain = ext_attr->qam_pga_cfg;
8481                         rc = ctrl_set_cfg_afe_gain(demod, &qam_pga_cfg);
8482                         if (rc != 0) {
8483                                 pr_err("error %d\n", rc);
8484                                 goto rw_error;
8485                         }
8486                 }
8487                 rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->qam_pre_saw_cfg));
8488                 if (rc != 0) {
8489                         pr_err("error %d\n", rc);
8490                         goto rw_error;
8491                 }
8492         }
8493
8494         if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8495                 if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8496                         rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8497                         if (rc != 0) {
8498                                 pr_err("error %d\n", rc);
8499                                 goto rw_error;
8500                         }
8501                         rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8502                         if (rc != 0) {
8503                                 pr_err("error %d\n", rc);
8504                                 goto rw_error;
8505                         }
8506                 } else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8507                         switch (channel->constellation) {
8508                         case DRX_CONSTELLATION_QAM64:
8509                                 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8510                                 if (rc != 0) {
8511                                         pr_err("error %d\n", rc);
8512                                         goto rw_error;
8513                                 }
8514                                 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8515                                 if (rc != 0) {
8516                                         pr_err("error %d\n", rc);
8517                                         goto rw_error;
8518                                 }
8519                                 break;
8520                         case DRX_CONSTELLATION_QAM256:
8521                                 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8522                                 if (rc != 0) {
8523                                         pr_err("error %d\n", rc);
8524                                         goto rw_error;
8525                                 }
8526                                 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8527                                 if (rc != 0) {
8528                                         pr_err("error %d\n", rc);
8529                                         goto rw_error;
8530                                 }
8531                                 break;
8532                         default:
8533                                 return -EIO;
8534                         }
8535                 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8536                         rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8537                         if (rc != 0) {
8538                                 pr_err("error %d\n", rc);
8539                                 goto rw_error;
8540                         }
8541                         rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8542                         if (rc != 0) {
8543                                 pr_err("error %d\n", rc);
8544                                 goto rw_error;
8545                         }
8546                 }
8547
8548                 /* SETP 4: constellation specific setup */
8549                 switch (channel->constellation) {
8550                 case DRX_CONSTELLATION_QAM16:
8551                         rc = set_qam16(demod);
8552                         if (rc != 0) {
8553                                 pr_err("error %d\n", rc);
8554                                 goto rw_error;
8555                         }
8556                         break;
8557                 case DRX_CONSTELLATION_QAM32:
8558                         rc = set_qam32(demod);
8559                         if (rc != 0) {
8560                                 pr_err("error %d\n", rc);
8561                                 goto rw_error;
8562                         }
8563                         break;
8564                 case DRX_CONSTELLATION_QAM64:
8565                         rc = set_qam64(demod);
8566                         if (rc != 0) {
8567                                 pr_err("error %d\n", rc);
8568                                 goto rw_error;
8569                         }
8570                         break;
8571                 case DRX_CONSTELLATION_QAM128:
8572                         rc = set_qam128(demod);
8573                         if (rc != 0) {
8574                                 pr_err("error %d\n", rc);
8575                                 goto rw_error;
8576                         }
8577                         break;
8578                 case DRX_CONSTELLATION_QAM256:
8579                         rc = set_qam256(demod);
8580                         if (rc != 0) {
8581                                 pr_err("error %d\n", rc);
8582                                 goto rw_error;
8583                         }
8584                         break;
8585                 default:
8586                         return -EIO;
8587                 }               /* switch */
8588         }
8589
8590         if ((op & QAM_SET_OP_ALL)) {
8591                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
8592                 if (rc != 0) {
8593                         pr_err("error %d\n", rc);
8594                         goto rw_error;
8595                 }
8596
8597                 /* Mpeg output has to be in front of FEC active */
8598                 rc = set_mpegtei_handling(demod);
8599                 if (rc != 0) {
8600                         pr_err("error %d\n", rc);
8601                         goto rw_error;
8602                 }
8603                 rc = bit_reverse_mpeg_output(demod);
8604                 if (rc != 0) {
8605                         pr_err("error %d\n", rc);
8606                         goto rw_error;
8607                 }
8608                 rc = set_mpeg_start_width(demod);
8609                 if (rc != 0) {
8610                         pr_err("error %d\n", rc);
8611                         goto rw_error;
8612                 }
8613                 {
8614                         /* TODO: move to set_standard after hardware reset value problem is solved */
8615                         /* Configure initial MPEG output */
8616                         struct drx_cfg_mpeg_output cfg_mpeg_output;
8617
8618                         memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
8619                         cfg_mpeg_output.enable_mpeg_output = true;
8620
8621                         rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
8622                         if (rc != 0) {
8623                                 pr_err("error %d\n", rc);
8624                                 goto rw_error;
8625                         }
8626                 }
8627         }
8628
8629         if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8630
8631                 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
8632                 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8633                     SCU_RAM_COMMAND_CMD_DEMOD_START;
8634                 cmd_scu.parameter_len = 0;
8635                 cmd_scu.result_len = 1;
8636                 cmd_scu.parameter = NULL;
8637                 cmd_scu.result = &cmd_result;
8638                 rc = scu_command(dev_addr, &cmd_scu);
8639                 if (rc != 0) {
8640                         pr_err("error %d\n", rc);
8641                         goto rw_error;
8642                 }
8643         }
8644
8645         rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
8646         if (rc != 0) {
8647                 pr_err("error %d\n", rc);
8648                 goto rw_error;
8649         }
8650         rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE, 0);
8651         if (rc != 0) {
8652                 pr_err("error %d\n", rc);
8653                 goto rw_error;
8654         }
8655         rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
8656         if (rc != 0) {
8657                 pr_err("error %d\n", rc);
8658                 goto rw_error;
8659         }
8660
8661         return 0;
8662 rw_error:
8663         return rc;
8664 }
8665
8666 /*============================================================================*/
8667 static int ctrl_get_qam_sig_quality(struct drx_demod_instance *demod);
8668
8669 static int qam_flip_spec(struct drx_demod_instance *demod, struct drx_channel *channel)
8670 {
8671         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8672         struct drxj_data *ext_attr = demod->my_ext_attr;
8673         int rc;
8674         u32 iqm_fs_rate_ofs = 0;
8675         u32 iqm_fs_rate_lo = 0;
8676         u16 qam_ctl_ena = 0;
8677         u16 data = 0;
8678         u16 equ_mode = 0;
8679         u16 fsm_state = 0;
8680         int i = 0;
8681         int ofsofs = 0;
8682
8683         /* Silence the controlling of lc, equ, and the acquisition state machine */
8684         rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, &qam_ctl_ena, 0);
8685         if (rc != 0) {
8686                 pr_err("error %d\n", rc);
8687                 goto rw_error;
8688         }
8689         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);
8690         if (rc != 0) {
8691                 pr_err("error %d\n", rc);
8692                 goto rw_error;
8693         }
8694
8695         /* freeze the frequency control loop */
8696         rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF__A, 0, 0);
8697         if (rc != 0) {
8698                 pr_err("error %d\n", rc);
8699                 goto rw_error;
8700         }
8701         rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF1__A, 0, 0);
8702         if (rc != 0) {
8703                 pr_err("error %d\n", rc);
8704                 goto rw_error;
8705         }
8706
8707         rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, &iqm_fs_rate_ofs, 0);
8708         if (rc != 0) {
8709                 pr_err("error %d\n", rc);
8710                 goto rw_error;
8711         }
8712         rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_LO__A, &iqm_fs_rate_lo, 0);
8713         if (rc != 0) {
8714                 pr_err("error %d\n", rc);
8715                 goto rw_error;
8716         }
8717         ofsofs = iqm_fs_rate_lo - iqm_fs_rate_ofs;
8718         iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
8719         iqm_fs_rate_ofs -= 2 * ofsofs;
8720
8721         /* freeze dq/fq updating */
8722         rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8723         if (rc != 0) {
8724                 pr_err("error %d\n", rc);
8725                 goto rw_error;
8726         }
8727         data = (data & 0xfff9);
8728         rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8729         if (rc != 0) {
8730                 pr_err("error %d\n", rc);
8731                 goto rw_error;
8732         }
8733         rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8734         if (rc != 0) {
8735                 pr_err("error %d\n", rc);
8736                 goto rw_error;
8737         }
8738
8739         /* lc_cp / _ci / _ca */
8740         rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CI__A, 0, 0);
8741         if (rc != 0) {
8742                 pr_err("error %d\n", rc);
8743                 goto rw_error;
8744         }
8745         rc = drxj_dap_write_reg16(dev_addr, QAM_LC_EP__A, 0, 0);
8746         if (rc != 0) {
8747                 pr_err("error %d\n", rc);
8748                 goto rw_error;
8749         }
8750         rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_LA_FACTOR__A, 0, 0);
8751         if (rc != 0) {
8752                 pr_err("error %d\n", rc);
8753                 goto rw_error;
8754         }
8755
8756         /* flip the spec */
8757         rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
8758         if (rc != 0) {
8759                 pr_err("error %d\n", rc);
8760                 goto rw_error;
8761         }
8762         ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
8763         ext_attr->pos_image = (ext_attr->pos_image) ? false : true;
8764
8765         /* freeze dq/fq updating */
8766         rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8767         if (rc != 0) {
8768                 pr_err("error %d\n", rc);
8769                 goto rw_error;
8770         }
8771         equ_mode = data;
8772         data = (data & 0xfff9);
8773         rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8774         if (rc != 0) {
8775                 pr_err("error %d\n", rc);
8776                 goto rw_error;
8777         }
8778         rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8779         if (rc != 0) {
8780                 pr_err("error %d\n", rc);
8781                 goto rw_error;
8782         }
8783
8784         for (i = 0; i < 28; i++) {
8785                 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8786                 if (rc != 0) {
8787                         pr_err("error %d\n", rc);
8788                         goto rw_error;
8789                 }
8790                 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8791                 if (rc != 0) {
8792                         pr_err("error %d\n", rc);
8793                         goto rw_error;
8794                 }
8795         }
8796
8797         for (i = 0; i < 24; i++) {
8798                 rc = drxj_dap_read_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8799                 if (rc != 0) {
8800                         pr_err("error %d\n", rc);
8801                         goto rw_error;
8802                 }
8803                 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8804                 if (rc != 0) {
8805                         pr_err("error %d\n", rc);
8806                         goto rw_error;
8807                 }
8808         }
8809
8810         data = equ_mode;
8811         rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8812         if (rc != 0) {
8813                 pr_err("error %d\n", rc);
8814                 goto rw_error;
8815         }
8816         rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8817         if (rc != 0) {
8818                 pr_err("error %d\n", rc);
8819                 goto rw_error;
8820         }
8821
8822         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE_TGT__A, 4, 0);
8823         if (rc != 0) {
8824                 pr_err("error %d\n", rc);
8825                 goto rw_error;
8826         }
8827
8828         i = 0;
8829         while ((fsm_state != 4) && (i++ < 100)) {
8830                 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE__A, &fsm_state, 0);
8831                 if (rc != 0) {
8832                         pr_err("error %d\n", rc);
8833                         goto rw_error;
8834                 }
8835         }
8836         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, (qam_ctl_ena | 0x0016), 0);
8837         if (rc != 0) {
8838                 pr_err("error %d\n", rc);
8839                 goto rw_error;
8840         }
8841
8842         return 0;
8843 rw_error:
8844         return rc;
8845
8846 }
8847
8848 #define  NO_LOCK        0x0
8849 #define  DEMOD_LOCKED   0x1
8850 #define  SYNC_FLIPPED   0x2
8851 #define  SPEC_MIRRORED  0x4
8852 /*
8853 * \fn int qam64auto ()
8854 * \brief auto do sync pattern switching and mirroring.
8855 * \param demod:   instance of demod.
8856 * \param channel: pointer to channel data.
8857 * \param tuner_freq_offset: tuner frequency offset.
8858 * \param lock_status: pointer to lock status.
8859 * \return int.
8860 */
8861 static int
8862 qam64auto(struct drx_demod_instance *demod,
8863           struct drx_channel *channel,
8864           s32 tuner_freq_offset, enum drx_lock_status *lock_status)
8865 {
8866         struct drxj_data *ext_attr = demod->my_ext_attr;
8867         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8868         struct drx39xxj_state *state = dev_addr->user_data;
8869         struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
8870         int rc;
8871         u32 lck_state = NO_LOCK;
8872         u32 start_time = 0;
8873         u32 d_locked_time = 0;
8874         u32 timeout_ofs = 0;
8875         u16 data = 0;
8876
8877         /* external attributes for storing acquired channel constellation */
8878         *lock_status = DRX_NOT_LOCKED;
8879         start_time = jiffies_to_msecs(jiffies);
8880         lck_state = NO_LOCK;
8881         do {
8882                 rc = ctrl_lock_status(demod, lock_status);
8883                 if (rc != 0) {
8884                         pr_err("error %d\n", rc);
8885                         goto rw_error;
8886                 }
8887
8888                 switch (lck_state) {
8889                 case NO_LOCK:
8890                         if (*lock_status == DRXJ_DEMOD_LOCK) {
8891                                 rc = ctrl_get_qam_sig_quality(demod);
8892                                 if (rc != 0) {
8893                                         pr_err("error %d\n", rc);
8894                                         goto rw_error;
8895                                 }
8896                                 if (p->cnr.stat[0].svalue > 20800) {
8897                                         lck_state = DEMOD_LOCKED;
8898                                         /* some delay to see if fec_lock possible TODO find the right value */
8899                                         timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;        /* see something, waiting longer */
8900                                         d_locked_time = jiffies_to_msecs(jiffies);
8901                                 }
8902                         }
8903                         break;
8904                 case DEMOD_LOCKED:
8905                         if ((*lock_status == DRXJ_DEMOD_LOCK) &&        /* still demod_lock in 150ms */
8906                             ((jiffies_to_msecs(jiffies) - d_locked_time) >
8907                              DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8908                                 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8909                                 if (rc != 0) {
8910                                         pr_err("error %d\n", rc);
8911                                         goto rw_error;
8912                                 }
8913                                 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8914                                 if (rc != 0) {
8915                                         pr_err("error %d\n", rc);
8916                                         goto rw_error;
8917                                 }
8918                                 lck_state = SYNC_FLIPPED;
8919                                 msleep(10);
8920                         }
8921                         break;
8922                 case SYNC_FLIPPED:
8923                         if (*lock_status == DRXJ_DEMOD_LOCK) {
8924                                 if (channel->mirror == DRX_MIRROR_AUTO) {
8925                                         /* flip sync pattern back */
8926                                         rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8927                                         if (rc != 0) {
8928                                                 pr_err("error %d\n", rc);
8929                                                 goto rw_error;
8930                                         }
8931                                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data & 0xFFFE, 0);
8932                                         if (rc != 0) {
8933                                                 pr_err("error %d\n", rc);
8934                                                 goto rw_error;
8935                                         }
8936                                         /* flip spectrum */
8937                                         ext_attr->mirror = DRX_MIRROR_YES;
8938                                         rc = qam_flip_spec(demod, channel);
8939                                         if (rc != 0) {
8940                                                 pr_err("error %d\n", rc);
8941                                                 goto rw_error;
8942                                         }
8943                                         lck_state = SPEC_MIRRORED;
8944                                         /* reset timer TODO: still need 500ms? */
8945                                         start_time = d_locked_time =
8946                                             jiffies_to_msecs(jiffies);
8947                                         timeout_ofs = 0;
8948                                 } else {        /* no need to wait lock */
8949
8950                                         start_time =
8951                                             jiffies_to_msecs(jiffies) -
8952                                             DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8953                                 }
8954                         }
8955                         break;
8956                 case SPEC_MIRRORED:
8957                         if ((*lock_status == DRXJ_DEMOD_LOCK) &&        /* still demod_lock in 150ms */
8958                             ((jiffies_to_msecs(jiffies) - d_locked_time) >
8959                              DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8960                                 rc = ctrl_get_qam_sig_quality(demod);
8961                                 if (rc != 0) {
8962                                         pr_err("error %d\n", rc);
8963                                         goto rw_error;
8964                                 }
8965                                 if (p->cnr.stat[0].svalue > 20800) {
8966                                         rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8967                                         if (rc != 0) {
8968                                                 pr_err("error %d\n", rc);
8969                                                 goto rw_error;
8970                                         }
8971                                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8972                                         if (rc != 0) {
8973                                                 pr_err("error %d\n", rc);
8974                                                 goto rw_error;
8975                                         }
8976                                         /* no need to wait lock */
8977                                         start_time =
8978                                             jiffies_to_msecs(jiffies) -
8979                                             DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8980                                 }
8981                         }
8982                         break;
8983                 default:
8984                         break;
8985                 }
8986                 msleep(10);
8987         } while
8988             ((*lock_status != DRX_LOCKED) &&
8989              (*lock_status != DRX_NEVER_LOCK) &&
8990              ((jiffies_to_msecs(jiffies) - start_time) <
8991               (DRXJ_QAM_MAX_WAITTIME + timeout_ofs))
8992             );
8993         /* Returning control to apllication ... */
8994
8995         return 0;
8996 rw_error:
8997         return rc;
8998 }
8999
9000 /*
9001 * \fn int qam256auto ()
9002 * \brief auto do sync pattern switching and mirroring.
9003 * \param demod:   instance of demod.
9004 * \param channel: pointer to channel data.
9005 * \param tuner_freq_offset: tuner frequency offset.
9006 * \param lock_status: pointer to lock status.
9007 * \return int.
9008 */
9009 static int
9010 qam256auto(struct drx_demod_instance *demod,
9011            struct drx_channel *channel,
9012            s32 tuner_freq_offset, enum drx_lock_status *lock_status)
9013 {
9014         struct drxj_data *ext_attr = demod->my_ext_attr;
9015         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9016         struct drx39xxj_state *state = dev_addr->user_data;
9017         struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9018         int rc;
9019         u32 lck_state = NO_LOCK;
9020         u32 start_time = 0;
9021         u32 d_locked_time = 0;
9022         u32 timeout_ofs = DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
9023
9024         /* external attributes for storing acquired channel constellation */
9025         *lock_status = DRX_NOT_LOCKED;
9026         start_time = jiffies_to_msecs(jiffies);
9027         lck_state = NO_LOCK;
9028         do {
9029                 rc = ctrl_lock_status(demod, lock_status);
9030                 if (rc != 0) {
9031                         pr_err("error %d\n", rc);
9032                         goto rw_error;
9033                 }
9034                 switch (lck_state) {
9035                 case NO_LOCK:
9036                         if (*lock_status == DRXJ_DEMOD_LOCK) {
9037                                 rc = ctrl_get_qam_sig_quality(demod);
9038                                 if (rc != 0) {
9039                                         pr_err("error %d\n", rc);
9040                                         goto rw_error;
9041                                 }
9042                                 if (p->cnr.stat[0].svalue > 26800) {
9043                                         lck_state = DEMOD_LOCKED;
9044                                         timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;        /* see something, wait longer */
9045                                         d_locked_time = jiffies_to_msecs(jiffies);
9046                                 }
9047                         }
9048                         break;
9049                 case DEMOD_LOCKED:
9050                         if (*lock_status == DRXJ_DEMOD_LOCK) {
9051                                 if ((channel->mirror == DRX_MIRROR_AUTO) &&
9052                                     ((jiffies_to_msecs(jiffies) - d_locked_time) >
9053                                      DRXJ_QAM_FEC_LOCK_WAITTIME)) {
9054                                         ext_attr->mirror = DRX_MIRROR_YES;
9055                                         rc = qam_flip_spec(demod, channel);
9056                                         if (rc != 0) {
9057                                                 pr_err("error %d\n", rc);
9058                                                 goto rw_error;
9059                                         }
9060                                         lck_state = SPEC_MIRRORED;
9061                                         /* reset timer TODO: still need 300ms? */
9062                                         start_time = jiffies_to_msecs(jiffies);
9063                                         timeout_ofs = -DRXJ_QAM_MAX_WAITTIME / 2;
9064                                 }
9065                         }
9066                         break;
9067                 case SPEC_MIRRORED:
9068                         break;
9069                 default:
9070                         break;
9071                 }
9072                 msleep(10);
9073         } while
9074             ((*lock_status < DRX_LOCKED) &&
9075              (*lock_status != DRX_NEVER_LOCK) &&
9076              ((jiffies_to_msecs(jiffies) - start_time) <
9077               (DRXJ_QAM_MAX_WAITTIME + timeout_ofs)));
9078
9079         return 0;
9080 rw_error:
9081         return rc;
9082 }
9083
9084 /*
9085 * \fn int set_qam_channel ()
9086 * \brief Set QAM channel according to the requested constellation.
9087 * \param demod:   instance of demod.
9088 * \param channel: pointer to channel data.
9089 * \return int.
9090 */
9091 static int
9092 set_qam_channel(struct drx_demod_instance *demod,
9093                struct drx_channel *channel, s32 tuner_freq_offset)
9094 {
9095         struct drxj_data *ext_attr = NULL;
9096         int rc;
9097         enum drx_lock_status lock_status = DRX_NOT_LOCKED;
9098         bool auto_flag = false;
9099
9100         /* external attributes for storing acquired channel constellation */
9101         ext_attr = (struct drxj_data *) demod->my_ext_attr;
9102
9103         /* set QAM channel constellation */
9104         switch (channel->constellation) {
9105         case DRX_CONSTELLATION_QAM16:
9106         case DRX_CONSTELLATION_QAM32:
9107         case DRX_CONSTELLATION_QAM128:
9108                 return -EINVAL;
9109         case DRX_CONSTELLATION_QAM64:
9110         case DRX_CONSTELLATION_QAM256:
9111                 if (ext_attr->standard != DRX_STANDARD_ITU_B)
9112                         return -EINVAL;
9113
9114                 ext_attr->constellation = channel->constellation;
9115                 if (channel->mirror == DRX_MIRROR_AUTO)
9116                         ext_attr->mirror = DRX_MIRROR_NO;
9117                 else
9118                         ext_attr->mirror = channel->mirror;
9119
9120                 rc = set_qam(demod, channel, tuner_freq_offset, QAM_SET_OP_ALL);
9121                 if (rc != 0) {
9122                         pr_err("error %d\n", rc);
9123                         goto rw_error;
9124                 }
9125
9126                 if (channel->constellation == DRX_CONSTELLATION_QAM64)
9127                         rc = qam64auto(demod, channel, tuner_freq_offset,
9128                                        &lock_status);
9129                 else
9130                         rc = qam256auto(demod, channel, tuner_freq_offset,
9131                                         &lock_status);
9132                 if (rc != 0) {
9133                         pr_err("error %d\n", rc);
9134                         goto rw_error;
9135                 }
9136                 break;
9137         case DRX_CONSTELLATION_AUTO:    /* for channel scan */
9138                 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9139                         u16 qam_ctl_ena = 0;
9140
9141                         auto_flag = true;
9142
9143                         /* try to lock default QAM constellation: QAM256 */
9144                         channel->constellation = DRX_CONSTELLATION_QAM256;
9145                         ext_attr->constellation = DRX_CONSTELLATION_QAM256;
9146                         if (channel->mirror == DRX_MIRROR_AUTO)
9147                                 ext_attr->mirror = DRX_MIRROR_NO;
9148                         else
9149                                 ext_attr->mirror = channel->mirror;
9150                         rc = set_qam(demod, channel, tuner_freq_offset,
9151                                      QAM_SET_OP_ALL);
9152                         if (rc != 0) {
9153                                 pr_err("error %d\n", rc);
9154                                 goto rw_error;
9155                         }
9156                         rc = qam256auto(demod, channel, tuner_freq_offset,
9157                                         &lock_status);
9158                         if (rc != 0) {
9159                                 pr_err("error %d\n", rc);
9160                                 goto rw_error;
9161                         }
9162
9163                         if (lock_status >= DRX_LOCKED) {
9164                                 channel->constellation = DRX_CONSTELLATION_AUTO;
9165                                 break;
9166                         }
9167
9168                         /* QAM254 not locked. Try QAM64 constellation */
9169                         channel->constellation = DRX_CONSTELLATION_QAM64;
9170                         ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9171                         if (channel->mirror == DRX_MIRROR_AUTO)
9172                                 ext_attr->mirror = DRX_MIRROR_NO;
9173                         else
9174                                 ext_attr->mirror = channel->mirror;
9175
9176                         rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9177                                                      SCU_RAM_QAM_CTL_ENA__A,
9178                                                      &qam_ctl_ena, 0);
9179                         if (rc != 0) {
9180                                 pr_err("error %d\n", rc);
9181                                 goto rw_error;
9182                         }
9183                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9184                                                       SCU_RAM_QAM_CTL_ENA__A,
9185                                                       qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9186                         if (rc != 0) {
9187                                 pr_err("error %d\n", rc);
9188                                 goto rw_error;
9189                         }
9190                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9191                                                       SCU_RAM_QAM_FSM_STATE_TGT__A,
9192                                                       0x2, 0);
9193                         if (rc != 0) {
9194                                 pr_err("error %d\n", rc);
9195                                 goto rw_error;
9196                         }       /* force to rate hunting */
9197
9198                         rc = set_qam(demod, channel, tuner_freq_offset,
9199                                      QAM_SET_OP_CONSTELLATION);
9200                         if (rc != 0) {
9201                                 pr_err("error %d\n", rc);
9202                                 goto rw_error;
9203                         }
9204                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9205                                                       SCU_RAM_QAM_CTL_ENA__A,
9206                                                       qam_ctl_ena, 0);
9207                         if (rc != 0) {
9208                                 pr_err("error %d\n", rc);
9209                                 goto rw_error;
9210                         }
9211
9212                         rc = qam64auto(demod, channel, tuner_freq_offset,
9213                                        &lock_status);
9214                         if (rc != 0) {
9215                                 pr_err("error %d\n", rc);
9216                                 goto rw_error;
9217                         }
9218
9219                         channel->constellation = DRX_CONSTELLATION_AUTO;
9220                 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
9221                         u16 qam_ctl_ena = 0;
9222
9223                         channel->constellation = DRX_CONSTELLATION_QAM64;
9224                         ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9225                         auto_flag = true;
9226
9227                         if (channel->mirror == DRX_MIRROR_AUTO)
9228                                 ext_attr->mirror = DRX_MIRROR_NO;
9229                         else
9230                                 ext_attr->mirror = channel->mirror;
9231                         rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9232                                                      SCU_RAM_QAM_CTL_ENA__A,
9233                                                      &qam_ctl_ena, 0);
9234                         if (rc != 0) {
9235                                 pr_err("error %d\n", rc);
9236                                 goto rw_error;
9237                         }
9238                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9239                                                       SCU_RAM_QAM_CTL_ENA__A,
9240                                                       qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9241                         if (rc != 0) {
9242                                 pr_err("error %d\n", rc);
9243                                 goto rw_error;
9244                         }
9245                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9246                                                       SCU_RAM_QAM_FSM_STATE_TGT__A,
9247                                                       0x2, 0);
9248                         if (rc != 0) {
9249                                 pr_err("error %d\n", rc);
9250                                 goto rw_error;
9251                         }       /* force to rate hunting */
9252
9253                         rc = set_qam(demod, channel, tuner_freq_offset,
9254                                      QAM_SET_OP_CONSTELLATION);
9255                         if (rc != 0) {
9256                                 pr_err("error %d\n", rc);
9257                                 goto rw_error;
9258                         }
9259                         rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9260                                                       SCU_RAM_QAM_CTL_ENA__A,
9261                                                       qam_ctl_ena, 0);
9262                         if (rc != 0) {
9263                                 pr_err("error %d\n", rc);
9264                                 goto rw_error;
9265                         }
9266                         rc = qam64auto(demod, channel, tuner_freq_offset,
9267                                        &lock_status);
9268                         if (rc != 0) {
9269                                 pr_err("error %d\n", rc);
9270                                 goto rw_error;
9271                         }
9272                         channel->constellation = DRX_CONSTELLATION_AUTO;
9273                 } else {
9274                         return -EINVAL;
9275                 }
9276                 break;
9277         default:
9278                 return -EINVAL;
9279         }
9280
9281         return 0;
9282 rw_error:
9283         /* restore starting value */
9284         if (auto_flag)
9285                 channel->constellation = DRX_CONSTELLATION_AUTO;
9286         return rc;
9287 }
9288
9289 /*============================================================================*/
9290
9291 /*
9292 * \fn static short get_qamrs_err_count(struct i2c_device_addr *dev_addr)
9293 * \brief Get RS error count in QAM mode (used for post RS BER calculation)
9294 * \return Error code
9295 *
9296 * precondition: measurement period & measurement prescale must be set
9297 *
9298 */
9299 static int
9300 get_qamrs_err_count(struct i2c_device_addr *dev_addr,
9301                     struct drxjrs_errors *rs_errors)
9302 {
9303         int rc;
9304         u16 nr_bit_errors = 0,
9305             nr_symbol_errors = 0,
9306             nr_packet_errors = 0, nr_failures = 0, nr_snc_par_fail_count = 0;
9307
9308         /* check arguments */
9309         if (dev_addr == NULL)
9310                 return -EINVAL;
9311
9312         /* all reported errors are received in the  */
9313         /* most recently finished measurment period */
9314         /*   no of pre RS bit errors */
9315         rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &nr_bit_errors, 0);
9316         if (rc != 0) {
9317                 pr_err("error %d\n", rc);
9318                 goto rw_error;
9319         }
9320         /*   no of symbol errors      */
9321         rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_SYMBOL_ERRORS__A, &nr_symbol_errors, 0);
9322         if (rc != 0) {
9323                 pr_err("error %d\n", rc);
9324                 goto rw_error;
9325         }
9326         /*   no of packet errors      */
9327         rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_PACKET_ERRORS__A, &nr_packet_errors, 0);
9328         if (rc != 0) {
9329                 pr_err("error %d\n", rc);
9330                 goto rw_error;
9331         }
9332         /*   no of failures to decode */
9333         rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &nr_failures, 0);
9334         if (rc != 0) {
9335                 pr_err("error %d\n", rc);
9336                 goto rw_error;
9337         }
9338         /*   no of post RS bit erros  */
9339         rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_COUNT__A, &nr_snc_par_fail_count, 0);
9340         if (rc != 0) {
9341                 pr_err("error %d\n", rc);
9342                 goto rw_error;
9343         }
9344         /* TODO: NOTE */
9345         /* These register values are fetched in non-atomic fashion           */
9346         /* It is possible that the read values contain unrelated information */
9347
9348         rs_errors->nr_bit_errors = nr_bit_errors & FEC_RS_NR_BIT_ERRORS__M;
9349         rs_errors->nr_symbol_errors = nr_symbol_errors & FEC_RS_NR_SYMBOL_ERRORS__M;
9350         rs_errors->nr_packet_errors = nr_packet_errors & FEC_RS_NR_PACKET_ERRORS__M;
9351         rs_errors->nr_failures = nr_failures & FEC_RS_NR_FAILURES__M;
9352         rs_errors->nr_snc_par_fail_count =
9353             nr_snc_par_fail_count & FEC_OC_SNC_FAIL_COUNT__M;
9354
9355         return 0;
9356 rw_error:
9357         return rc;
9358 }
9359
9360 /*============================================================================*/
9361
9362 /*
9363  * \fn int get_sig_strength()
9364  * \brief Retrieve signal strength for VSB and QAM.
9365  * \param demod Pointer to demod instance
9366  * \param u16-t Pointer to signal strength data; range 0, .. , 100.
9367  * \return int.
9368  * \retval 0 sig_strength contains valid data.
9369  * \retval -EINVAL sig_strength is NULL.
9370  * \retval -EIO Erroneous data, sig_strength contains invalid data.
9371  */
9372 #define DRXJ_AGC_TOP    0x2800
9373 #define DRXJ_AGC_SNS    0x1600
9374 #define DRXJ_RFAGC_MAX  0x3fff
9375 #define DRXJ_RFAGC_MIN  0x800
9376
9377 static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
9378 {
9379         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9380         int rc;
9381         u16 rf_gain = 0;
9382         u16 if_gain = 0;
9383         u16 if_agc_sns = 0;
9384         u16 if_agc_top = 0;
9385         u16 rf_agc_max = 0;
9386         u16 rf_agc_min = 0;
9387
9388         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_IF__A, &if_gain, 0);
9389         if (rc != 0) {
9390                 pr_err("error %d\n", rc);
9391                 goto rw_error;
9392         }
9393         if_gain &= IQM_AF_AGC_IF__M;
9394         rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_RF__A, &rf_gain, 0);
9395         if (rc != 0) {
9396                 pr_err("error %d\n", rc);
9397                 goto rw_error;
9398         }
9399         rf_gain &= IQM_AF_AGC_RF__M;
9400
9401         if_agc_sns = DRXJ_AGC_SNS;
9402         if_agc_top = DRXJ_AGC_TOP;
9403         rf_agc_max = DRXJ_RFAGC_MAX;
9404         rf_agc_min = DRXJ_RFAGC_MIN;
9405
9406         if (if_gain > if_agc_top) {
9407                 if (rf_gain > rf_agc_max)
9408                         *sig_strength = 100;
9409                 else if (rf_gain > rf_agc_min) {
9410                         if (rf_agc_max == rf_agc_min) {
9411                                 pr_err("error: rf_agc_max == rf_agc_min\n");
9412                                 return -EIO;
9413                         }
9414                         *sig_strength =
9415                         75 + 25 * (rf_gain - rf_agc_min) / (rf_agc_max -
9416                                                                 rf_agc_min);
9417                 } else
9418                         *sig_strength = 75;
9419         } else if (if_gain > if_agc_sns) {
9420                 if (if_agc_top == if_agc_sns) {
9421                         pr_err("error: if_agc_top == if_agc_sns\n");
9422                         return -EIO;
9423                 }
9424                 *sig_strength =
9425                 20 + 55 * (if_gain - if_agc_sns) / (if_agc_top - if_agc_sns);
9426         } else {
9427                 if (!if_agc_sns) {
9428                         pr_err("error: if_agc_sns is zero!\n");
9429                         return -EIO;
9430                 }
9431                 *sig_strength = (20 * if_gain / if_agc_sns);
9432         }
9433
9434         if (*sig_strength <= 7)
9435                 *sig_strength = 0;
9436
9437         return 0;
9438 rw_error:
9439         return rc;
9440 }
9441
9442 /*
9443 * \fn int ctrl_get_qam_sig_quality()
9444 * \brief Retrieve QAM signal quality from device.
9445 * \param devmod Pointer to demodulator instance.
9446 * \param sig_quality Pointer to signal quality data.
9447 * \return int.
9448 * \retval 0 sig_quality contains valid data.
9449 * \retval -EINVAL sig_quality is NULL.
9450 * \retval -EIO Erroneous data, sig_quality contains invalid data.
9451
9452 *  Pre-condition: Device must be started and in lock.
9453 */
9454 static int
9455 ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
9456 {
9457         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9458         struct drxj_data *ext_attr = demod->my_ext_attr;
9459         struct drx39xxj_state *state = dev_addr->user_data;
9460         struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9461         struct drxjrs_errors measuredrs_errors = { 0, 0, 0, 0, 0 };
9462         enum drx_modulation constellation = ext_attr->constellation;
9463         int rc;
9464
9465         u32 pre_bit_err_rs = 0; /* pre RedSolomon Bit Error Rate */
9466         u32 post_bit_err_rs = 0;        /* post RedSolomon Bit Error Rate */
9467         u32 pkt_errs = 0;       /* no of packet errors in RS */
9468         u16 qam_sl_err_power = 0;       /* accumulated error between raw and sliced symbols */
9469         u16 qsym_err_vd = 0;    /* quadrature symbol errors in QAM_VD */
9470         u16 fec_oc_period = 0;  /* SNC sync failure measurement period */
9471         u16 fec_rs_prescale = 0;        /* ReedSolomon Measurement Prescale */
9472         u16 fec_rs_period = 0;  /* Value for corresponding I2C register */
9473         /* calculation constants */
9474         u32 rs_bit_cnt = 0;     /* RedSolomon Bit Count */
9475         u32 qam_sl_sig_power = 0;       /* used for MER, depends of QAM constellation */
9476         /* intermediate results */
9477         u32 e = 0;              /* exponent value used for QAM BER/SER */
9478         u32 m = 0;              /* mantisa value used for QAM BER/SER */
9479         u32 ber_cnt = 0;        /* BER count */
9480         /* signal quality info */
9481         u32 qam_sl_mer = 0;     /* QAM MER */
9482         u32 qam_pre_rs_ber = 0; /* Pre RedSolomon BER */
9483         u32 qam_post_rs_ber = 0;        /* Post RedSolomon BER */
9484         u32 qam_vd_ser = 0;     /* ViterbiDecoder SER */
9485         u16 qam_vd_prescale = 0;        /* Viterbi Measurement Prescale */
9486         u16 qam_vd_period = 0;  /* Viterbi Measurement period */
9487         u32 vd_bit_cnt = 0;     /* ViterbiDecoder Bit Count */
9488
9489         p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9490
9491         /* read the physical registers */
9492         /*   Get the RS error data */
9493         rc = get_qamrs_err_count(dev_addr, &measuredrs_errors);
9494         if (rc != 0) {
9495                 pr_err("error %d\n", rc);
9496                 goto rw_error;
9497         }
9498         /* get the register value needed for MER */
9499         rc = drxj_dap_read_reg16(dev_addr, QAM_SL_ERR_POWER__A, &qam_sl_err_power, 0);
9500         if (rc != 0) {
9501                 pr_err("error %d\n", rc);
9502                 goto rw_error;
9503         }
9504         /* get the register value needed for post RS BER */
9505         rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, &fec_oc_period, 0);
9506         if (rc != 0) {
9507                 pr_err("error %d\n", rc);
9508                 goto rw_error;
9509         }
9510
9511         /* get constants needed for signal quality calculation */
9512         fec_rs_period = ext_attr->fec_rs_period;
9513         fec_rs_prescale = ext_attr->fec_rs_prescale;
9514         rs_bit_cnt = fec_rs_period * fec_rs_prescale * ext_attr->fec_rs_plen;
9515         qam_vd_period = ext_attr->qam_vd_period;
9516         qam_vd_prescale = ext_attr->qam_vd_prescale;
9517         vd_bit_cnt = qam_vd_period * qam_vd_prescale * ext_attr->fec_vd_plen;
9518
9519         /* DRXJ_QAM_SL_SIG_POWER_QAMxxx  * 4     */
9520         switch (constellation) {
9521         case DRX_CONSTELLATION_QAM16:
9522                 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM16 << 2;
9523                 break;
9524         case DRX_CONSTELLATION_QAM32:
9525                 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM32 << 2;
9526                 break;
9527         case DRX_CONSTELLATION_QAM64:
9528                 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM64 << 2;
9529                 break;
9530         case DRX_CONSTELLATION_QAM128:
9531                 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM128 << 2;
9532                 break;
9533         case DRX_CONSTELLATION_QAM256:
9534                 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM256 << 2;
9535                 break;
9536         default:
9537                 return -EIO;
9538         }
9539
9540         /* ------------------------------ */
9541         /* MER Calculation                */
9542         /* ------------------------------ */
9543         /* MER is good if it is above 27.5 for QAM256 or 21.5 for QAM64 */
9544
9545         /* 10.0*log10(qam_sl_sig_power * 4.0 / qam_sl_err_power); */
9546         if (qam_sl_err_power == 0)
9547                 qam_sl_mer = 0;
9548         else
9549                 qam_sl_mer = log1_times100(qam_sl_sig_power) - log1_times100((u32)qam_sl_err_power);
9550
9551         /* ----------------------------------------- */
9552         /* Pre Viterbi Symbol Error Rate Calculation */
9553         /* ----------------------------------------- */
9554         /* pre viterbi SER is good if it is below 0.025 */
9555
9556         /* get the register value */
9557         /*   no of quadrature symbol errors */
9558         rc = drxj_dap_read_reg16(dev_addr, QAM_VD_NR_QSYM_ERRORS__A, &qsym_err_vd, 0);
9559         if (rc != 0) {
9560                 pr_err("error %d\n", rc);
9561                 goto rw_error;
9562         }
9563         /* Extract the Exponent and the Mantisa  */
9564         /* of number of quadrature symbol errors */
9565         e = (qsym_err_vd & QAM_VD_NR_QSYM_ERRORS_EXP__M) >>
9566             QAM_VD_NR_QSYM_ERRORS_EXP__B;
9567         m = (qsym_err_vd & QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__M) >>
9568             QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B;
9569
9570         if ((m << e) >> 3 > 549752)
9571                 qam_vd_ser = 500000 * vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9572         else
9573                 qam_vd_ser = m << ((e > 2) ? (e - 3) : e);
9574
9575         /* --------------------------------------- */
9576         /* pre and post RedSolomon BER Calculation */
9577         /* --------------------------------------- */
9578         /* pre RS BER is good if it is below 3.5e-4 */
9579
9580         /* get the register values */
9581         pre_bit_err_rs = (u32) measuredrs_errors.nr_bit_errors;
9582         pkt_errs = post_bit_err_rs = (u32) measuredrs_errors.nr_snc_par_fail_count;
9583
9584         /* Extract the Exponent and the Mantisa of the */
9585         /* pre Reed-Solomon bit error count            */
9586         e = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_EXP__M) >>
9587             FEC_RS_NR_BIT_ERRORS_EXP__B;
9588         m = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M) >>
9589             FEC_RS_NR_BIT_ERRORS_FIXED_MANT__B;
9590
9591         ber_cnt = m << e;
9592
9593         /*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */
9594         if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0)
9595                 qam_pre_rs_ber = 500000 * rs_bit_cnt >> e;
9596         else
9597                 qam_pre_rs_ber = ber_cnt;
9598
9599         /* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) /  */
9600         /*               (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A)  */
9601         /*
9602            => c = (1000000*100*11.17)/1504 =
9603            post RS BER = (( c* FEC_OC_SNC_FAIL_COUNT__A) /
9604            (100 * FEC_OC_SNC_FAIL_PERIOD__A)
9605            *100 and /100 is for more precision.
9606            => (20 bits * 12 bits) /(16 bits * 7 bits)  => safe in 32 bits computation
9607
9608            Precision errors still possible.
9609          */
9610         if (!fec_oc_period) {
9611                 qam_post_rs_ber = 0xFFFFFFFF;
9612         } else {
9613                 e = post_bit_err_rs * 742686;
9614                 m = fec_oc_period * 100;
9615                 qam_post_rs_ber = e / m;
9616         }
9617
9618         /* fill signal quality data structure */
9619         p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9620         p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9621         p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9622         p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9623         p->block_error.stat[0].scale = FE_SCALE_COUNTER;
9624         p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
9625
9626         p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100;
9627         if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9628                 p->pre_bit_error.stat[0].uvalue += qam_vd_ser;
9629                 p->pre_bit_count.stat[0].uvalue += vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9630         } else {
9631                 p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber;
9632                 p->pre_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9633         }
9634
9635         p->post_bit_error.stat[0].uvalue += qam_post_rs_ber;
9636         p->post_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9637
9638         p->block_error.stat[0].uvalue += pkt_errs;
9639
9640 #ifdef DRXJ_SIGNAL_ACCUM_ERR
9641         rc = get_acc_pkt_err(demod, &sig_quality->packet_error);
9642         if (rc != 0) {
9643                 pr_err("error %d\n", rc);
9644                 goto rw_error;
9645         }
9646 #endif
9647
9648         return 0;
9649 rw_error:
9650         p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9651         p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9652         p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9653         p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9654         p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9655         p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9656
9657         return rc;
9658 }
9659
9660 #endif /* #ifndef DRXJ_VSB_ONLY */
9661
9662 /*============================================================================*/
9663 /*==                     END QAM DATAPATH FUNCTIONS                         ==*/
9664 /*============================================================================*/
9665
9666 /*============================================================================*/
9667 /*============================================================================*/
9668 /*==                       ATV DATAPATH FUNCTIONS                           ==*/
9669 /*============================================================================*/
9670 /*============================================================================*/
9671
9672 /*
9673    Implementation notes.
9674
9675    NTSC/FM AGCs
9676
9677       Four AGCs are used for NTSC:
9678       (1) RF (used to attenuate the input signal in case of to much power)
9679       (2) IF (used to attenuate the input signal in case of to much power)
9680       (3) Video AGC (used to amplify the output signal in case input to low)
9681       (4) SIF AGC (used to amplify the output signal in case input to low)
9682
9683       Video AGC is coupled to RF and IF. SIF AGC is not coupled. It is assumed
9684       that the coupling between Video AGC and the RF and IF AGCs also works in
9685       favor of the SIF AGC.
9686
9687       Three AGCs are used for FM:
9688       (1) RF (used to attenuate the input signal in case of to much power)
9689       (2) IF (used to attenuate the input signal in case of to much power)
9690       (3) SIF AGC (used to amplify the output signal in case input to low)
9691
9692       The SIF AGC is now coupled to the RF/IF AGCs.
9693       The SIF AGC is needed for both SIF ouput and the internal SIF signal to
9694       the AUD block.
9695
9696       RF and IF AGCs DACs are part of AFE, Video and SIF AGC DACs are part of
9697       the ATV block. The AGC control algorithms are all implemented in
9698       microcode.
9699
9700    ATV SETTINGS
9701
9702       (Shadow settings will not be used for now, they will be implemented
9703        later on because of the schedule)
9704
9705       Several HW/SCU "settings" can be used for ATV. The standard selection
9706       will reset most of these settings. To avoid that the end user apllication
9707       has to perform these settings each time the ATV or FM standards is
9708       selected the driver will shadow these settings. This enables the end user
9709       to perform the settings only once after a drx_open(). The driver must
9710       write the shadow settings to HW/SCU incase:
9711          ( setstandard FM/ATV) ||
9712          ( settings have changed && FM/ATV standard is active)
9713       The shadow settings will be stored in the device specific data container.
9714       A set of flags will be defined to flag changes in shadow settings.
9715       A routine will be implemented to write all changed shadow settings to
9716       HW/SCU.
9717
9718       The "settings" will consist of: AGC settings, filter settings etc.
9719
9720       Disadvantage of use of shadow settings:
9721       Direct changes in HW/SCU registers will not be reflected in the
9722       shadow settings and these changes will be overwritten during a next
9723       update. This can happen during evaluation. This will not be a problem
9724       for normal customer usage.
9725 */
9726 /* -------------------------------------------------------------------------- */
9727
9728 /*
9729 * \fn int power_down_atv ()
9730 * \brief Power down ATV.
9731 * \param demod instance of demodulator
9732 * \param standard either NTSC or FM (sub strandard for ATV )
9733 * \return int.
9734 *
9735 *  Stops and thus resets ATV and IQM block
9736 *  SIF and CVBS ADC are powered down
9737 *  Calls audio power down
9738 */
9739 static int
9740 power_down_atv(struct drx_demod_instance *demod, enum drx_standard standard, bool primary)
9741 {
9742         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9743         struct drxjscu_cmd cmd_scu = { /* command      */ 0,
9744                 /* parameter_len */ 0,
9745                 /* result_len    */ 0,
9746                 /* *parameter   */ NULL,
9747                 /* *result      */ NULL
9748         };
9749         int rc;
9750         u16 cmd_result = 0;
9751
9752         /* ATV NTSC */
9753
9754         /* Stop ATV SCU (will reset ATV and IQM hardware */
9755         cmd_scu.command = SCU_RAM_COMMAND_STANDARD_ATV |
9756             SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9757         cmd_scu.parameter_len = 0;
9758         cmd_scu.result_len = 1;
9759         cmd_scu.parameter = NULL;
9760         cmd_scu.result = &cmd_result;
9761         rc = scu_command(dev_addr, &cmd_scu);
9762         if (rc != 0) {
9763                 pr_err("error %d\n", rc);
9764                 goto rw_error;
9765         }
9766         /* Disable ATV outputs (ATV reset enables CVBS, undo this) */
9767         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);
9768         if (rc != 0) {
9769                 pr_err("error %d\n", rc);
9770                 goto rw_error;
9771         }
9772
9773         rc = drxj_dap_write_reg16(dev_addr, ATV_COMM_EXEC__A, ATV_COMM_EXEC_STOP, 0);
9774         if (rc != 0) {
9775                 pr_err("error %d\n", rc);
9776                 goto rw_error;
9777         }
9778         if (primary) {
9779                 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
9780                 if (rc != 0) {
9781                         pr_err("error %d\n", rc);
9782                         goto rw_error;
9783                 }
9784                 rc = set_iqm_af(demod, false);
9785                 if (rc != 0) {
9786                         pr_err("error %d\n", rc);
9787                         goto rw_error;
9788                 }
9789         } else {
9790                 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
9791                 if (rc != 0) {
9792                         pr_err("error %d\n", rc);
9793                         goto rw_error;
9794                 }
9795                 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
9796                 if (rc != 0) {
9797                         pr_err("error %d\n", rc);
9798                         goto rw_error;
9799                 }
9800                 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
9801                 if (rc != 0) {
9802                         pr_err("error %d\n", rc);
9803                         goto rw_error;
9804                 }
9805                 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
9806                 if (rc != 0) {
9807                         pr_err("error %d\n", rc);
9808                         goto rw_error;
9809                 }
9810                 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
9811                 if (rc != 0) {
9812                         pr_err("error %d\n", rc);
9813                         goto rw_error;
9814                 }
9815         }
9816         rc = power_down_aud(demod);
9817         if (rc != 0) {
9818                 pr_err("error %d\n", rc);
9819                 goto rw_error;
9820         }
9821
9822         return 0;
9823 rw_error:
9824         return rc;
9825 }
9826
9827 /*============================================================================*/
9828
9829 /*
9830 * \brief Power up AUD.
9831 * \param demod instance of demodulator
9832 * \return int.
9833 *
9834 */
9835 static int power_down_aud(struct drx_demod_instance *demod)
9836 {
9837         struct i2c_device_addr *dev_addr = NULL;
9838         struct drxj_data *ext_attr = NULL;
9839         int rc;
9840
9841         dev_addr = (struct i2c_device_addr *)demod->my_i2c_dev_addr;
9842         ext_attr = (struct drxj_data *) demod->my_ext_attr;
9843
9844         rc = drxj_dap_write_reg16(dev_addr, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP, 0);
9845         if (rc != 0) {
9846                 pr_err("error %d\n", rc);
9847                 goto rw_error;
9848         }
9849
9850         ext_attr->aud_data.audio_is_active = false;
9851
9852         return 0;
9853 rw_error:
9854         return rc;
9855 }
9856
9857 /*
9858 * \fn int set_orx_nsu_aox()
9859 * \brief Configure OrxNsuAox for OOB
9860 * \param demod instance of demodulator.
9861 * \param active
9862 * \return int.
9863 */
9864 static int set_orx_nsu_aox(struct drx_demod_instance *demod, bool active)
9865 {
9866         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9867         int rc;
9868         u16 data = 0;
9869
9870         /* Configure NSU_AOX */
9871         rc = drxj_dap_read_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, &data, 0);
9872         if (rc != 0) {
9873                 pr_err("error %d\n", rc);
9874                 goto rw_error;
9875         }
9876         if (!active)
9877                 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));
9878         else
9879                 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);
9880         rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, data, 0);
9881         if (rc != 0) {
9882                 pr_err("error %d\n", rc);
9883                 goto rw_error;
9884         }
9885
9886         return 0;
9887 rw_error:
9888         return rc;
9889 }
9890
9891 /*
9892 * \fn int ctrl_set_oob()
9893 * \brief Set OOB channel to be used.
9894 * \param demod instance of demodulator
9895 * \param oob_param OOB parameters for channel setting.
9896 * \frequency should be in KHz
9897 * \return int.
9898 *
9899 * Accepts  only. Returns error otherwise.
9900 * Demapper value is written after scu_command START
9901 * because START command causes COMM_EXEC transition
9902 * from 0 to 1 which causes all registers to be
9903 * overwritten with initial value
9904 *
9905 */
9906
9907 /* Nyquist filter impulse response */
9908 #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 */
9909 #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 */
9910 #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) */
9911
9912 /* Coefficients for the nyquist fitler (total: 27 taps) */
9913 #define NYQFILTERLEN 27
9914
9915 static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_param)
9916 {
9917         int rc;
9918         s32 freq = 0;   /* KHz */
9919         struct i2c_device_addr *dev_addr = NULL;
9920         struct drxj_data *ext_attr = NULL;
9921         u16 i = 0;
9922         bool mirror_freq_spect_oob = false;
9923         u16 trk_filter_value = 0;
9924         struct drxjscu_cmd scu_cmd;
9925         u16 set_param_parameters[3];
9926         u16 cmd_result[2] = { 0, 0 };
9927         s16 nyquist_coeffs[4][(NYQFILTERLEN + 1) / 2] = {
9928                 IMPULSE_COSINE_ALPHA_0_3,       /* Target Mode 0 */
9929                 IMPULSE_COSINE_ALPHA_0_3,       /* Target Mode 1 */
9930                 IMPULSE_COSINE_ALPHA_0_5,       /* Target Mode 2 */
9931                 IMPULSE_COSINE_ALPHA_RO_0_5     /* Target Mode 3 */
9932         };
9933         u8 mode_val[4] = { 2, 2, 0, 1 };
9934         u8 pfi_coeffs[4][6] = {
9935                 {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) */
9936                 {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) */
9937                 {DRXJ_16TO8(-80), DRXJ_16TO8(-98), DRXJ_16TO8(92)},     /* TARGET_MODE = 2, 3:  PFI_A = -20/32; PFI_B = -49/32;  PFI_C = 23/32; fg = 0.8 MHz (Att=25dB) */
9938                 {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) */
9939         };
9940         u16 mode_index;
9941
9942         dev_addr = demod->my_i2c_dev_addr;
9943         ext_attr = (struct drxj_data *) demod->my_ext_attr;
9944         mirror_freq_spect_oob = ext_attr->mirror_freq_spect_oob;
9945
9946         /* Check parameters */
9947         if (oob_param == NULL) {
9948                 /* power off oob module  */
9949                 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
9950                     | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9951                 scu_cmd.parameter_len = 0;
9952                 scu_cmd.result_len = 1;
9953                 scu_cmd.result = cmd_result;
9954                 rc = scu_command(dev_addr, &scu_cmd);
9955                 if (rc != 0) {
9956                         pr_err("error %d\n", rc);
9957                         goto rw_error;
9958                 }
9959                 rc = set_orx_nsu_aox(demod, false);
9960                 if (rc != 0) {
9961                         pr_err("error %d\n", rc);
9962                         goto rw_error;
9963                 }
9964                 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
9965                 if (rc != 0) {
9966                         pr_err("error %d\n", rc);
9967                         goto rw_error;
9968                 }
9969
9970                 ext_attr->oob_power_on = false;
9971                 return 0;
9972         }
9973
9974         freq = oob_param->frequency;
9975         if ((freq < 70000) || (freq > 130000))
9976                 return -EIO;
9977         freq = (freq - 50000) / 50;
9978
9979         {
9980                 u16 index = 0;
9981                 u16 remainder = 0;
9982                 u16 *trk_filtercfg = ext_attr->oob_trk_filter_cfg;
9983
9984                 index = (u16) ((freq - 400) / 200);
9985                 remainder = (u16) ((freq - 400) % 200);
9986                 trk_filter_value =
9987                     trk_filtercfg[index] - (trk_filtercfg[index] -
9988                                            trk_filtercfg[index +
9989                                                         1]) / 10 * remainder /
9990                     20;
9991         }
9992
9993    /********/
9994         /* Stop  */
9995    /********/
9996         rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
9997         if (rc != 0) {
9998                 pr_err("error %d\n", rc);
9999                 goto rw_error;
10000         }
10001         scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10002             | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
10003         scu_cmd.parameter_len = 0;
10004         scu_cmd.result_len = 1;
10005         scu_cmd.result = cmd_result;
10006         rc = scu_command(dev_addr, &scu_cmd);
10007         if (rc != 0) {
10008                 pr_err("error %d\n", rc);
10009                 goto rw_error;
10010         }
10011    /********/
10012         /* Reset */
10013    /********/
10014         scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10015             | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
10016         scu_cmd.parameter_len = 0;
10017         scu_cmd.result_len = 1;
10018         scu_cmd.result = cmd_result;
10019         rc = scu_command(dev_addr, &scu_cmd);
10020         if (rc != 0) {
10021                 pr_err("error %d\n", rc);
10022                 goto rw_error;
10023         }
10024    /**********/
10025         /* SET_ENV */
10026    /**********/
10027         /* set frequency, spectrum inversion and data rate */
10028         scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10029             | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
10030         scu_cmd.parameter_len = 3;
10031         /* 1-data rate;2-frequency */
10032         switch (oob_param->standard) {
10033         case DRX_OOB_MODE_A:
10034                 if (
10035                            /* signal is transmitted inverted */
10036                            ((oob_param->spectrum_inverted == true) &&
10037                             /* and tuner is not mirroring the signal */
10038                             (!mirror_freq_spect_oob)) |
10039                            /* or */
10040                            /* signal is transmitted noninverted */
10041                            ((oob_param->spectrum_inverted == false) &&
10042                             /* and tuner is mirroring the signal */
10043                             (mirror_freq_spect_oob))
10044                     )
10045                         set_param_parameters[0] =
10046                             SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_INVSPEC;
10047                 else
10048                         set_param_parameters[0] =
10049                             SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_REGSPEC;
10050                 break;
10051         case DRX_OOB_MODE_B_GRADE_A:
10052                 if (
10053                            /* signal is transmitted inverted */
10054                            ((oob_param->spectrum_inverted == true) &&
10055                             /* and tuner is not mirroring the signal */
10056                             (!mirror_freq_spect_oob)) |
10057                            /* or */
10058                            /* signal is transmitted noninverted */
10059                            ((oob_param->spectrum_inverted == false) &&
10060                             /* and tuner is mirroring the signal */
10061                             (mirror_freq_spect_oob))
10062                     )
10063                         set_param_parameters[0] =
10064                             SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_INVSPEC;
10065                 else
10066                         set_param_parameters[0] =
10067                             SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_REGSPEC;
10068                 break;
10069         case DRX_OOB_MODE_B_GRADE_B:
10070         default:
10071                 if (
10072                            /* signal is transmitted inverted */
10073                            ((oob_param->spectrum_inverted == true) &&
10074                             /* and tuner is not mirroring the signal */
10075                             (!mirror_freq_spect_oob)) |
10076                            /* or */
10077                            /* signal is transmitted noninverted */
10078                            ((oob_param->spectrum_inverted == false) &&
10079                             /* and tuner is mirroring the signal */
10080                             (mirror_freq_spect_oob))
10081                     )
10082                         set_param_parameters[0] =
10083                             SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_INVSPEC;
10084                 else
10085                         set_param_parameters[0] =
10086                             SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_REGSPEC;
10087                 break;
10088         }
10089         set_param_parameters[1] = (u16) (freq & 0xFFFF);
10090         set_param_parameters[2] = trk_filter_value;
10091         scu_cmd.parameter = set_param_parameters;
10092         scu_cmd.result_len = 1;
10093         scu_cmd.result = cmd_result;
10094         mode_index = mode_val[(set_param_parameters[0] & 0xC0) >> 6];
10095         rc = scu_command(dev_addr, &scu_cmd);
10096         if (rc != 0) {
10097                 pr_err("error %d\n", rc);
10098                 goto rw_error;
10099         }
10100
10101         rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
10102         if (rc != 0) {
10103                 pr_err("error %d\n", rc);
10104                 goto rw_error;
10105         }       /*  Write magic word to enable pdr reg write  */
10106         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);
10107         if (rc != 0) {
10108                 pr_err("error %d\n", rc);
10109                 goto rw_error;
10110         }
10111         rc = drxj_dap_write_reg16(dev_addr, SIO_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);
10112         if (rc != 0) {
10113                 pr_err("error %d\n", rc);
10114                 goto rw_error;
10115         }
10116         rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
10117         if (rc != 0) {
10118                 pr_err("error %d\n", rc);
10119                 goto rw_error;
10120         }       /*  Write magic word to disable pdr reg write */
10121
10122         rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_COMM_KEY__A, 0, 0);
10123         if (rc != 0) {
10124                 pr_err("error %d\n", rc);
10125                 goto rw_error;
10126         }
10127         rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_LEN_W__A, 16000, 0);
10128         if (rc != 0) {
10129                 pr_err("error %d\n", rc);
10130                 goto rw_error;
10131         }
10132         rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_THR_W__A, 40, 0);
10133         if (rc != 0) {
10134                 pr_err("error %d\n", rc);
10135                 goto rw_error;
10136         }
10137
10138         /* ddc */
10139         rc = drxj_dap_write_reg16(dev_addr, ORX_DDC_OFO_SET_W__A, ORX_DDC_OFO_SET_W__PRE, 0);
10140         if (rc != 0) {
10141                 pr_err("error %d\n", rc);
10142                 goto rw_error;
10143         }
10144
10145         /* nsu */
10146         rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_LOPOW_W__A, ext_attr->oob_lo_pow, 0);
10147         if (rc != 0) {
10148                 pr_err("error %d\n", rc);
10149                 goto rw_error;
10150         }
10151
10152         /* initialization for target mode */
10153         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TARGET_MODE__A, SCU_RAM_ORX_TARGET_MODE_2048KBPS_SQRT, 0);
10154         if (rc != 0) {
10155                 pr_err("error %d\n", rc);
10156                 goto rw_error;
10157         }
10158         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FREQ_GAIN_CORR__A, SCU_RAM_ORX_FREQ_GAIN_CORR_2048KBPS, 0);
10159         if (rc != 0) {
10160                 pr_err("error %d\n", rc);
10161                 goto rw_error;
10162         }
10163
10164         /* Reset bits for timing and freq. recovery */
10165         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CPH__A, 0x0001, 0);
10166         if (rc != 0) {
10167                 pr_err("error %d\n", rc);
10168                 goto rw_error;
10169         }
10170         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CTI__A, 0x0002, 0);
10171         if (rc != 0) {
10172                 pr_err("error %d\n", rc);
10173                 goto rw_error;
10174         }
10175         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRN__A, 0x0004, 0);
10176         if (rc != 0) {
10177                 pr_err("error %d\n", rc);
10178                 goto rw_error;
10179         }
10180         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRP__A, 0x0008, 0);
10181         if (rc != 0) {
10182                 pr_err("error %d\n", rc);
10183                 goto rw_error;
10184         }
10185
10186         /* AGN_LOCK = {2048>>3, -2048, 8, -8, 0, 1}; */
10187         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TH__A, 2048 >> 3, 0);
10188         if (rc != 0) {
10189                 pr_err("error %d\n", rc);
10190                 goto rw_error;
10191         }
10192         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TOTH__A, (u16)(-2048), 0);
10193         if (rc != 0) {
10194                 pr_err("error %d\n", rc);
10195                 goto rw_error;
10196         }
10197         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_ONLOCK_TTH__A, 8, 0);
10198         if (rc != 0) {
10199                 pr_err("error %d\n", rc);
10200                 goto rw_error;
10201         }
10202         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_UNLOCK_TTH__A, (u16)(-8), 0);
10203         if (rc != 0) {
10204                 pr_err("error %d\n", rc);
10205                 goto rw_error;
10206         }
10207         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_MASK__A, 1, 0);
10208         if (rc != 0) {
10209                 pr_err("error %d\n", rc);
10210                 goto rw_error;
10211         }
10212
10213         /* DGN_LOCK = {10, -2048, 8, -8, 0, 1<<1}; */
10214         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TH__A, 10, 0);
10215         if (rc != 0) {
10216                 pr_err("error %d\n", rc);
10217                 goto rw_error;
10218         }
10219         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TOTH__A, (u16)(-2048), 0);
10220         if (rc != 0) {
10221                 pr_err("error %d\n", rc);
10222                 goto rw_error;
10223         }
10224         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_ONLOCK_TTH__A, 8, 0);
10225         if (rc != 0) {
10226                 pr_err("error %d\n", rc);
10227                 goto rw_error;
10228         }
10229         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_UNLOCK_TTH__A, (u16)(-8), 0);
10230         if (rc != 0) {
10231                 pr_err("error %d\n", rc);
10232                 goto rw_error;
10233         }
10234         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_MASK__A, 1 << 1, 0);
10235         if (rc != 0) {
10236                 pr_err("error %d\n", rc);
10237                 goto rw_error;
10238         }
10239
10240         /* FRQ_LOCK = {15,-2048, 8, -8, 0, 1<<2}; */
10241         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TH__A, 17, 0);
10242         if (rc != 0) {
10243                 pr_err("error %d\n", rc);
10244                 goto rw_error;
10245         }
10246         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TOTH__A, (u16)(-2048), 0);
10247         if (rc != 0) {
10248                 pr_err("error %d\n", rc);
10249                 goto rw_error;
10250         }
10251         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_ONLOCK_TTH__A, 8, 0);
10252         if (rc != 0) {
10253                 pr_err("error %d\n", rc);
10254                 goto rw_error;
10255         }
10256         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_UNLOCK_TTH__A, (u16)(-8), 0);
10257         if (rc != 0) {
10258                 pr_err("error %d\n", rc);
10259                 goto rw_error;
10260         }
10261         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_MASK__A, 1 << 2, 0);
10262         if (rc != 0) {
10263                 pr_err("error %d\n", rc);
10264                 goto rw_error;
10265         }
10266
10267         /* PHA_LOCK = {5000, -2048, 8, -8, 0, 1<<3}; */
10268         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TH__A, 3000, 0);
10269         if (rc != 0) {
10270                 pr_err("error %d\n", rc);
10271                 goto rw_error;
10272         }
10273         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TOTH__A, (u16)(-2048), 0);
10274         if (rc != 0) {
10275                 pr_err("error %d\n", rc);
10276                 goto rw_error;
10277         }
10278         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_ONLOCK_TTH__A, 8, 0);
10279         if (rc != 0) {
10280                 pr_err("error %d\n", rc);
10281                 goto rw_error;
10282         }
10283         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_UNLOCK_TTH__A, (u16)(-8), 0);
10284         if (rc != 0) {
10285                 pr_err("error %d\n", rc);
10286                 goto rw_error;
10287         }
10288         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_MASK__A, 1 << 3, 0);
10289         if (rc != 0) {
10290                 pr_err("error %d\n", rc);
10291                 goto rw_error;
10292         }
10293
10294         /* TIM_LOCK = {300,      -2048, 8, -8, 0, 1<<4}; */
10295         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TH__A, 400, 0);
10296         if (rc != 0) {
10297                 pr_err("error %d\n", rc);
10298                 goto rw_error;
10299         }
10300         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TOTH__A, (u16)(-2048), 0);
10301         if (rc != 0) {
10302                 pr_err("error %d\n", rc);
10303                 goto rw_error;
10304         }
10305         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_ONLOCK_TTH__A, 8, 0);
10306         if (rc != 0) {
10307                 pr_err("error %d\n", rc);
10308                 goto rw_error;
10309         }
10310         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_UNLOCK_TTH__A, (u16)(-8), 0);
10311         if (rc != 0) {
10312                 pr_err("error %d\n", rc);
10313                 goto rw_error;
10314         }
10315         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_MASK__A, 1 << 4, 0);
10316         if (rc != 0) {
10317                 pr_err("error %d\n", rc);
10318                 goto rw_error;
10319         }
10320
10321         /* EQU_LOCK = {20,      -2048, 8, -8, 0, 1<<5}; */
10322         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TH__A, 20, 0);
10323         if (rc != 0) {
10324                 pr_err("error %d\n", rc);
10325                 goto rw_error;
10326         }
10327         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TOTH__A, (u16)(-2048), 0);
10328         if (rc != 0) {
10329                 pr_err("error %d\n", rc);
10330                 goto rw_error;
10331         }
10332         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_ONLOCK_TTH__A, 4, 0);
10333         if (rc != 0) {
10334                 pr_err("error %d\n", rc);
10335                 goto rw_error;
10336         }
10337         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_UNLOCK_TTH__A, (u16)(-4), 0);
10338         if (rc != 0) {
10339                 pr_err("error %d\n", rc);
10340                 goto rw_error;
10341         }
10342         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_MASK__A, 1 << 5, 0);
10343         if (rc != 0) {
10344                 pr_err("error %d\n", rc);
10345                 goto rw_error;
10346         }
10347
10348         /* PRE-Filter coefficients (PFI) */
10349         rc = drxdap_fasi_write_block(dev_addr, ORX_FWP_PFI_A_W__A, sizeof(pfi_coeffs[mode_index]), ((u8 *)pfi_coeffs[mode_index]), 0);
10350         if (rc != 0) {
10351                 pr_err("error %d\n", rc);
10352                 goto rw_error;
10353         }
10354         rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_MDE_W__A, mode_index, 0);
10355         if (rc != 0) {
10356                 pr_err("error %d\n", rc);
10357                 goto rw_error;
10358         }
10359
10360         /* NYQUIST-Filter coefficients (NYQ) */
10361         for (i = 0; i < (NYQFILTERLEN + 1) / 2; i++) {
10362                 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, i, 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_FWP_NYQ_COF_RW__A, nyquist_coeffs[mode_index][i], 0);
10368                 if (rc != 0) {
10369                         pr_err("error %d\n", rc);
10370                         goto rw_error;
10371                 }
10372         }
10373         rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, 31, 0);
10374         if (rc != 0) {
10375                 pr_err("error %d\n", rc);
10376                 goto rw_error;
10377         }
10378         rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_ACTIVE, 0);
10379         if (rc != 0) {
10380                 pr_err("error %d\n", rc);
10381                 goto rw_error;
10382         }
10383         /********/
10384         /* Start */
10385         /********/
10386         scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10387             | SCU_RAM_COMMAND_CMD_DEMOD_START;
10388         scu_cmd.parameter_len = 0;
10389         scu_cmd.result_len = 1;
10390         scu_cmd.result = cmd_result;
10391         rc = scu_command(dev_addr, &scu_cmd);
10392         if (rc != 0) {
10393                 pr_err("error %d\n", rc);
10394                 goto rw_error;
10395         }
10396
10397         rc = set_orx_nsu_aox(demod, true);
10398         if (rc != 0) {
10399                 pr_err("error %d\n", rc);
10400                 goto rw_error;
10401         }
10402         rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STHR_W__A, ext_attr->oob_pre_saw, 0);
10403         if (rc != 0) {
10404                 pr_err("error %d\n", rc);
10405                 goto rw_error;
10406         }
10407
10408         ext_attr->oob_power_on = true;
10409
10410         return 0;
10411 rw_error:
10412         return rc;
10413 }
10414
10415 /*============================================================================*/
10416 /*==                     END OOB DATAPATH FUNCTIONS                         ==*/
10417 /*============================================================================*/
10418
10419 /*=============================================================================
10420   ===== MC command related functions ==========================================
10421   ===========================================================================*/
10422
10423 /*=============================================================================
10424   ===== ctrl_set_channel() ==========================================================
10425   ===========================================================================*/
10426 /*
10427 * \fn int ctrl_set_channel()
10428 * \brief Select a new transmission channel.
10429 * \param demod instance of demod.
10430 * \param channel Pointer to channel data.
10431 * \return int.
10432 *
10433 * In case the tuner module is not used and in case of NTSC/FM the pogrammer
10434 * must tune the tuner to the centre frequency of the NTSC/FM channel.
10435 *
10436 */
10437 static int
10438 ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel)
10439 {
10440         int rc;
10441         s32 tuner_freq_offset = 0;
10442         struct drxj_data *ext_attr = NULL;
10443         struct i2c_device_addr *dev_addr = NULL;
10444         enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10445 #ifndef DRXJ_VSB_ONLY
10446         u32 min_symbol_rate = 0;
10447         u32 max_symbol_rate = 0;
10448         int bandwidth_temp = 0;
10449         int bandwidth = 0;
10450 #endif
10451    /*== check arguments ======================================================*/
10452         if ((demod == NULL) || (channel == NULL))
10453                 return -EINVAL;
10454
10455         dev_addr = demod->my_i2c_dev_addr;
10456         ext_attr = (struct drxj_data *) demod->my_ext_attr;
10457         standard = ext_attr->standard;
10458
10459         /* check valid standards */
10460         switch (standard) {
10461         case DRX_STANDARD_8VSB:
10462 #ifndef DRXJ_VSB_ONLY
10463         case DRX_STANDARD_ITU_A:
10464         case DRX_STANDARD_ITU_B:
10465         case DRX_STANDARD_ITU_C:
10466 #endif /* DRXJ_VSB_ONLY */
10467                 break;
10468         case DRX_STANDARD_UNKNOWN:
10469         default:
10470                 return -EINVAL;
10471         }
10472
10473         /* check bandwidth QAM annex B, NTSC and 8VSB */
10474         if ((standard == DRX_STANDARD_ITU_B) ||
10475             (standard == DRX_STANDARD_8VSB) ||
10476             (standard == DRX_STANDARD_NTSC)) {
10477                 switch (channel->bandwidth) {
10478                 case DRX_BANDWIDTH_6MHZ:
10479                 case DRX_BANDWIDTH_UNKNOWN:     /* fall through */
10480                         channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10481                         break;
10482                 case DRX_BANDWIDTH_8MHZ:        /* fall through */
10483                 case DRX_BANDWIDTH_7MHZ:        /* fall through */
10484                 default:
10485                         return -EINVAL;
10486                 }
10487         }
10488
10489         /* For QAM annex A and annex C:
10490            -check symbolrate and constellation
10491            -derive bandwidth from symbolrate (input bandwidth is ignored)
10492          */
10493 #ifndef DRXJ_VSB_ONLY
10494         if ((standard == DRX_STANDARD_ITU_A) ||
10495             (standard == DRX_STANDARD_ITU_C)) {
10496                 struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SAW };
10497                 int bw_rolloff_factor = 0;
10498
10499                 bw_rolloff_factor = (standard == DRX_STANDARD_ITU_A) ? 115 : 113;
10500                 min_symbol_rate = DRXJ_QAM_SYMBOLRATE_MIN;
10501                 max_symbol_rate = DRXJ_QAM_SYMBOLRATE_MAX;
10502                 /* config SMA_TX pin to SAW switch mode */
10503                 rc = ctrl_set_uio_cfg(demod, &uio_cfg);
10504                 if (rc != 0) {
10505                         pr_err("error %d\n", rc);
10506                         goto rw_error;
10507                 }
10508
10509                 if (channel->symbolrate < min_symbol_rate ||
10510                     channel->symbolrate > max_symbol_rate) {
10511                         return -EINVAL;
10512                 }
10513
10514                 switch (channel->constellation) {
10515                 case DRX_CONSTELLATION_QAM16:   /* fall through */
10516                 case DRX_CONSTELLATION_QAM32:   /* fall through */
10517                 case DRX_CONSTELLATION_QAM64:   /* fall through */
10518                 case DRX_CONSTELLATION_QAM128:  /* fall through */
10519                 case DRX_CONSTELLATION_QAM256:
10520                         bandwidth_temp = channel->symbolrate * bw_rolloff_factor;
10521                         bandwidth = bandwidth_temp / 100;
10522
10523                         if ((bandwidth_temp % 100) >= 50)
10524                                 bandwidth++;
10525
10526                         if (bandwidth <= 6100000) {
10527                                 channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10528                         } else if ((bandwidth > 6100000)
10529                                    && (bandwidth <= 7100000)) {
10530                                 channel->bandwidth = DRX_BANDWIDTH_7MHZ;
10531                         } else if (bandwidth > 7100000) {
10532                                 channel->bandwidth = DRX_BANDWIDTH_8MHZ;
10533                         }
10534                         break;
10535                 default:
10536                         return -EINVAL;
10537                 }
10538         }
10539
10540         /* For QAM annex B:
10541            -check constellation
10542          */
10543         if (standard == DRX_STANDARD_ITU_B) {
10544                 switch (channel->constellation) {
10545                 case DRX_CONSTELLATION_AUTO:
10546                 case DRX_CONSTELLATION_QAM256:
10547                 case DRX_CONSTELLATION_QAM64:
10548                         break;
10549                 default:
10550                         return -EINVAL;
10551                 }
10552
10553                 switch (channel->interleavemode) {
10554                 case DRX_INTERLEAVEMODE_I128_J1:
10555                 case DRX_INTERLEAVEMODE_I128_J1_V2:
10556                 case DRX_INTERLEAVEMODE_I128_J2:
10557                 case DRX_INTERLEAVEMODE_I64_J2:
10558                 case DRX_INTERLEAVEMODE_I128_J3:
10559                 case DRX_INTERLEAVEMODE_I32_J4:
10560                 case DRX_INTERLEAVEMODE_I128_J4:
10561                 case DRX_INTERLEAVEMODE_I16_J8:
10562                 case DRX_INTERLEAVEMODE_I128_J5:
10563                 case DRX_INTERLEAVEMODE_I8_J16:
10564                 case DRX_INTERLEAVEMODE_I128_J6:
10565                 case DRX_INTERLEAVEMODE_I128_J7:
10566                 case DRX_INTERLEAVEMODE_I128_J8:
10567                 case DRX_INTERLEAVEMODE_I12_J17:
10568                 case DRX_INTERLEAVEMODE_I5_J4:
10569                 case DRX_INTERLEAVEMODE_B52_M240:
10570                 case DRX_INTERLEAVEMODE_B52_M720:
10571                 case DRX_INTERLEAVEMODE_UNKNOWN:
10572                 case DRX_INTERLEAVEMODE_AUTO:
10573                         break;
10574                 default:
10575                         return -EINVAL;
10576                 }
10577         }
10578
10579         if ((ext_attr->uio_sma_tx_mode) == DRX_UIO_MODE_FIRMWARE_SAW) {
10580                 /* SAW SW, user UIO is used for switchable SAW */
10581                 struct drxuio_data uio1 = { DRX_UIO1, false };
10582
10583                 switch (channel->bandwidth) {
10584                 case DRX_BANDWIDTH_8MHZ:
10585                         uio1.value = true;
10586                         break;
10587                 case DRX_BANDWIDTH_7MHZ:
10588                         uio1.value = false;
10589                         break;
10590                 case DRX_BANDWIDTH_6MHZ:
10591                         uio1.value = false;
10592                         break;
10593                 case DRX_BANDWIDTH_UNKNOWN:
10594                 default:
10595                         return -EINVAL;
10596                 }
10597
10598                 rc = ctrl_uio_write(demod, &uio1);
10599                 if (rc != 0) {
10600                         pr_err("error %d\n", rc);
10601                         goto rw_error;
10602                 }
10603         }
10604 #endif /* DRXJ_VSB_ONLY */
10605         rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
10606         if (rc != 0) {
10607                 pr_err("error %d\n", rc);
10608                 goto rw_error;
10609         }
10610
10611         tuner_freq_offset = 0;
10612
10613    /*== Setup demod for specific standard ====================================*/
10614         switch (standard) {
10615         case DRX_STANDARD_8VSB:
10616                 if (channel->mirror == DRX_MIRROR_AUTO)
10617                         ext_attr->mirror = DRX_MIRROR_NO;
10618                 else
10619                         ext_attr->mirror = channel->mirror;
10620                 rc = set_vsb(demod);
10621                 if (rc != 0) {
10622                         pr_err("error %d\n", rc);
10623                         goto rw_error;
10624                 }
10625                 rc = set_frequency(demod, channel, tuner_freq_offset);
10626                 if (rc != 0) {
10627                         pr_err("error %d\n", rc);
10628                         goto rw_error;
10629                 }
10630                 break;
10631 #ifndef DRXJ_VSB_ONLY
10632         case DRX_STANDARD_ITU_A:        /* fallthrough */
10633         case DRX_STANDARD_ITU_B:        /* fallthrough */
10634         case DRX_STANDARD_ITU_C:
10635                 rc = set_qam_channel(demod, channel, tuner_freq_offset);
10636                 if (rc != 0) {
10637                         pr_err("error %d\n", rc);
10638                         goto rw_error;
10639                 }
10640                 break;
10641 #endif
10642         case DRX_STANDARD_UNKNOWN:
10643         default:
10644                 return -EIO;
10645         }
10646
10647         /* flag the packet error counter reset */
10648         ext_attr->reset_pkt_err_acc = true;
10649
10650         return 0;
10651 rw_error:
10652         return rc;
10653 }
10654
10655 /*=============================================================================
10656   ===== SigQuality() ==========================================================
10657   ===========================================================================*/
10658
10659 /*
10660 * \fn int ctrl_sig_quality()
10661 * \brief Retrieve signal quality form device.
10662 * \param devmod Pointer to demodulator instance.
10663 * \param sig_quality Pointer to signal quality data.
10664 * \return int.
10665 * \retval 0 sig_quality contains valid data.
10666 * \retval -EINVAL sig_quality is NULL.
10667 * \retval -EIO Erroneous data, sig_quality contains invalid data.
10668
10669 */
10670 static int
10671 ctrl_sig_quality(struct drx_demod_instance *demod,
10672                  enum drx_lock_status lock_status)
10673 {
10674         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
10675         struct drxj_data *ext_attr = demod->my_ext_attr;
10676         struct drx39xxj_state *state = dev_addr->user_data;
10677         struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
10678         enum drx_standard standard = ext_attr->standard;
10679         int rc;
10680         u32 ber, cnt, err, pkt;
10681         u16 mer, strength = 0;
10682
10683         rc = get_sig_strength(demod, &strength);
10684         if (rc < 0) {
10685                 pr_err("error getting signal strength %d\n", rc);
10686                 p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10687         } else {
10688                 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
10689                 p->strength.stat[0].uvalue = 65535UL *  strength/ 100;
10690         }
10691
10692         switch (standard) {
10693         case DRX_STANDARD_8VSB:
10694 #ifdef DRXJ_SIGNAL_ACCUM_ERR
10695                 rc = get_acc_pkt_err(demod, &pkt);
10696                 if (rc != 0) {
10697                         pr_err("error %d\n", rc);
10698                         goto rw_error;
10699                 }
10700 #endif
10701                 if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) {
10702                         p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10703                         p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10704                         p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10705                         p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10706                         p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10707                         p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10708                         p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10709                 } else {
10710                         rc = get_vsb_post_rs_pck_err(dev_addr, &err, &pkt);
10711                         if (rc != 0) {
10712                                 pr_err("error %d getting UCB\n", rc);
10713                                 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10714                         } else {
10715                                 p->block_error.stat[0].scale = FE_SCALE_COUNTER;
10716                                 p->block_error.stat[0].uvalue += err;
10717                                 p->block_count.stat[0].scale = FE_SCALE_COUNTER;
10718                                 p->block_count.stat[0].uvalue += pkt;
10719                         }
10720
10721                         /* PostViterbi is compute in steps of 10^(-6) */
10722                         rc = get_vs_bpre_viterbi_ber(dev_addr, &ber, &cnt);
10723                         if (rc != 0) {
10724                                 pr_err("error %d getting pre-ber\n", rc);
10725                                 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10726                         } else {
10727                                 p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10728                                 p->pre_bit_error.stat[0].uvalue += ber;
10729                                 p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10730                                 p->pre_bit_count.stat[0].uvalue += cnt;
10731                         }
10732
10733                         rc = get_vs_bpost_viterbi_ber(dev_addr, &ber, &cnt);
10734                         if (rc != 0) {
10735                                 pr_err("error %d getting post-ber\n", rc);
10736                                 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10737                         } else {
10738                                 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10739                                 p->post_bit_error.stat[0].uvalue += ber;
10740                                 p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10741                                 p->post_bit_count.stat[0].uvalue += cnt;
10742                         }
10743                         rc = get_vsbmer(dev_addr, &mer);
10744                         if (rc != 0) {
10745                                 pr_err("error %d getting MER\n", rc);
10746                                 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10747                         } else {
10748                                 p->cnr.stat[0].svalue = mer * 100;
10749                                 p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
10750                         }
10751                 }
10752                 break;
10753 #ifndef DRXJ_VSB_ONLY
10754         case DRX_STANDARD_ITU_A:
10755         case DRX_STANDARD_ITU_B:
10756         case DRX_STANDARD_ITU_C:
10757                 rc = ctrl_get_qam_sig_quality(demod);
10758                 if (rc != 0) {
10759                         pr_err("error %d\n", rc);
10760                         goto rw_error;
10761                 }
10762                 break;
10763 #endif
10764         default:
10765                 return -EIO;
10766         }
10767
10768         return 0;
10769 rw_error:
10770         return rc;
10771 }
10772
10773 /*============================================================================*/
10774
10775 /*
10776 * \fn int ctrl_lock_status()
10777 * \brief Retrieve lock status .
10778 * \param dev_addr Pointer to demodulator device address.
10779 * \param lock_stat Pointer to lock status structure.
10780 * \return int.
10781 *
10782 */
10783 static int
10784 ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat)
10785 {
10786         enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10787         struct drxj_data *ext_attr = NULL;
10788         struct i2c_device_addr *dev_addr = NULL;
10789         struct drxjscu_cmd cmd_scu = { /* command      */ 0,
10790                 /* parameter_len */ 0,
10791                 /* result_len    */ 0,
10792                 /* *parameter   */ NULL,
10793                 /* *result      */ NULL
10794         };
10795         int rc;
10796         u16 cmd_result[2] = { 0, 0 };
10797         u16 demod_lock = SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_DEMOD_LOCKED;
10798
10799         /* check arguments */
10800         if ((demod == NULL) || (lock_stat == NULL))
10801                 return -EINVAL;
10802
10803         dev_addr = demod->my_i2c_dev_addr;
10804         ext_attr = (struct drxj_data *) demod->my_ext_attr;
10805         standard = ext_attr->standard;
10806
10807         *lock_stat = DRX_NOT_LOCKED;
10808
10809         /* define the SCU command code */
10810         switch (standard) {
10811         case DRX_STANDARD_8VSB:
10812                 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
10813                     SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10814                 demod_lock |= 0x6;
10815                 break;
10816 #ifndef DRXJ_VSB_ONLY
10817         case DRX_STANDARD_ITU_A:
10818         case DRX_STANDARD_ITU_B:
10819         case DRX_STANDARD_ITU_C:
10820                 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
10821                     SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10822                 break;
10823 #endif
10824         case DRX_STANDARD_UNKNOWN:      /* fallthrough */
10825         default:
10826                 return -EIO;
10827         }
10828
10829         /* define the SCU command parameters and execute the command */
10830         cmd_scu.parameter_len = 0;
10831         cmd_scu.result_len = 2;
10832         cmd_scu.parameter = NULL;
10833         cmd_scu.result = cmd_result;
10834         rc = scu_command(dev_addr, &cmd_scu);
10835         if (rc != 0) {
10836                 pr_err("error %d\n", rc);
10837                 goto rw_error;
10838         }
10839
10840         /* set the lock status */
10841         if (cmd_scu.result[1] < demod_lock) {
10842                 /* 0x0000 NOT LOCKED */
10843                 *lock_stat = DRX_NOT_LOCKED;
10844         } else if (cmd_scu.result[1] < SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_LOCKED) {
10845                 *lock_stat = DRXJ_DEMOD_LOCK;
10846         } else if (cmd_scu.result[1] <
10847                    SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_NEVER_LOCK) {
10848                 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
10849                 *lock_stat = DRX_LOCKED;
10850         } else {
10851                 /* 0xC000 NEVER LOCKED */
10852                 /* (system will never be able to lock to the signal) */
10853                 *lock_stat = DRX_NEVER_LOCK;
10854         }
10855
10856         return 0;
10857 rw_error:
10858         return rc;
10859 }
10860
10861 /*============================================================================*/
10862
10863 /*
10864 * \fn int ctrl_set_standard()
10865 * \brief Set modulation standard to be used.
10866 * \param standard Modulation standard.
10867 * \return int.
10868 *
10869 * Setup stuff for the desired demodulation standard.
10870 * Disable and power down the previous selected demodulation standard
10871 *
10872 */
10873 static int
10874 ctrl_set_standard(struct drx_demod_instance *demod, enum drx_standard *standard)
10875 {
10876         struct drxj_data *ext_attr = NULL;
10877         int rc;
10878         enum drx_standard prev_standard;
10879
10880         /* check arguments */
10881         if ((standard == NULL) || (demod == NULL))
10882                 return -EINVAL;
10883
10884         ext_attr = (struct drxj_data *) demod->my_ext_attr;
10885         prev_standard = ext_attr->standard;
10886
10887         /*
10888            Stop and power down previous standard
10889          */
10890         switch (prev_standard) {
10891 #ifndef DRXJ_VSB_ONLY
10892         case DRX_STANDARD_ITU_A:        /* fallthrough */
10893         case DRX_STANDARD_ITU_B:        /* fallthrough */
10894         case DRX_STANDARD_ITU_C:
10895                 rc = power_down_qam(demod, false);
10896                 if (rc != 0) {
10897                         pr_err("error %d\n", rc);
10898                         goto rw_error;
10899                 }
10900                 break;
10901 #endif
10902         case DRX_STANDARD_8VSB:
10903                 rc = power_down_vsb(demod, false);
10904                 if (rc != 0) {
10905                         pr_err("error %d\n", rc);
10906                         goto rw_error;
10907                 }
10908                 break;
10909         case DRX_STANDARD_UNKNOWN:
10910                 /* Do nothing */
10911                 break;
10912         case DRX_STANDARD_AUTO: /* fallthrough */
10913         default:
10914                 return -EINVAL;
10915         }
10916
10917         /*
10918            Initialize channel independent registers
10919            Power up new standard
10920          */
10921         ext_attr->standard = *standard;
10922
10923         switch (*standard) {
10924 #ifndef DRXJ_VSB_ONLY
10925         case DRX_STANDARD_ITU_A:        /* fallthrough */
10926         case DRX_STANDARD_ITU_B:        /* fallthrough */
10927         case DRX_STANDARD_ITU_C:
10928                 do {
10929                         u16 dummy;
10930                         rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SCU_RAM_VERSION_HI__A, &dummy, 0);
10931                         if (rc != 0) {
10932                                 pr_err("error %d\n", rc);
10933                                 goto rw_error;
10934                         }
10935                 } while (0);
10936                 break;
10937 #endif
10938         case DRX_STANDARD_8VSB:
10939                 rc = set_vsb_leak_n_gain(demod);
10940                 if (rc != 0) {
10941                         pr_err("error %d\n", rc);
10942                         goto rw_error;
10943                 }
10944                 break;
10945         default:
10946                 ext_attr->standard = DRX_STANDARD_UNKNOWN;
10947                 return -EINVAL;
10948                 break;
10949         }
10950
10951         return 0;
10952 rw_error:
10953         /* Don't know what the standard is now ... try again */
10954         ext_attr->standard = DRX_STANDARD_UNKNOWN;
10955         return rc;
10956 }
10957
10958 /*============================================================================*/
10959
10960 static void drxj_reset_mode(struct drxj_data *ext_attr)
10961 {
10962         /* Initialize default AFE configuration for QAM */
10963         if (ext_attr->has_lna) {
10964                 /* IF AGC off, PGA active */
10965 #ifndef DRXJ_VSB_ONLY
10966                 ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10967                 ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10968                 ext_attr->qam_pga_cfg = 140 + (11 * 13);
10969 #endif
10970                 ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10971                 ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10972                 ext_attr->vsb_pga_cfg = 140 + (11 * 13);
10973         } else {
10974                 /* IF AGC on, PGA not active */
10975 #ifndef DRXJ_VSB_ONLY
10976                 ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10977                 ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10978                 ext_attr->qam_if_agc_cfg.min_output_level = 0;
10979                 ext_attr->qam_if_agc_cfg.max_output_level = 0x7FFF;
10980                 ext_attr->qam_if_agc_cfg.speed = 3;
10981                 ext_attr->qam_if_agc_cfg.top = 1297;
10982                 ext_attr->qam_pga_cfg = 140;
10983 #endif
10984                 ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10985                 ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10986                 ext_attr->vsb_if_agc_cfg.min_output_level = 0;
10987                 ext_attr->vsb_if_agc_cfg.max_output_level = 0x7FFF;
10988                 ext_attr->vsb_if_agc_cfg.speed = 3;
10989                 ext_attr->vsb_if_agc_cfg.top = 1024;
10990                 ext_attr->vsb_pga_cfg = 140;
10991         }
10992         /* TODO: remove min_output_level and max_output_level for both QAM and VSB after */
10993         /* mc has not used them */
10994 #ifndef DRXJ_VSB_ONLY
10995         ext_attr->qam_rf_agc_cfg.standard = DRX_STANDARD_ITU_B;
10996         ext_attr->qam_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10997         ext_attr->qam_rf_agc_cfg.min_output_level = 0;
10998         ext_attr->qam_rf_agc_cfg.max_output_level = 0x7FFF;
10999         ext_attr->qam_rf_agc_cfg.speed = 3;
11000         ext_attr->qam_rf_agc_cfg.top = 9500;
11001         ext_attr->qam_rf_agc_cfg.cut_off_current = 4000;
11002         ext_attr->qam_pre_saw_cfg.standard = DRX_STANDARD_ITU_B;
11003         ext_attr->qam_pre_saw_cfg.reference = 0x07;
11004         ext_attr->qam_pre_saw_cfg.use_pre_saw = true;
11005 #endif
11006         /* Initialize default AFE configuration for VSB */
11007         ext_attr->vsb_rf_agc_cfg.standard = DRX_STANDARD_8VSB;
11008         ext_attr->vsb_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
11009         ext_attr->vsb_rf_agc_cfg.min_output_level = 0;
11010         ext_attr->vsb_rf_agc_cfg.max_output_level = 0x7FFF;
11011         ext_attr->vsb_rf_agc_cfg.speed = 3;
11012         ext_attr->vsb_rf_agc_cfg.top = 9500;
11013         ext_attr->vsb_rf_agc_cfg.cut_off_current = 4000;
11014         ext_attr->vsb_pre_saw_cfg.standard = DRX_STANDARD_8VSB;
11015         ext_attr->vsb_pre_saw_cfg.reference = 0x07;
11016         ext_attr->vsb_pre_saw_cfg.use_pre_saw = true;
11017 }
11018
11019 /*
11020 * \fn int ctrl_power_mode()
11021 * \brief Set the power mode of the device to the specified power mode
11022 * \param demod Pointer to demodulator instance.
11023 * \param mode  Pointer to new power mode.
11024 * \return int.
11025 * \retval 0          Success
11026 * \retval -EIO       I2C error or other failure
11027 * \retval -EINVAL Invalid mode argument.
11028 *
11029 *
11030 */
11031 static int
11032 ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode)
11033 {
11034         struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
11035         struct drxj_data *ext_attr = (struct drxj_data *) NULL;
11036         struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)NULL;
11037         int rc;
11038         u16 sio_cc_pwd_mode = 0;
11039
11040         common_attr = (struct drx_common_attr *) demod->my_common_attr;
11041         ext_attr = (struct drxj_data *) demod->my_ext_attr;
11042         dev_addr = demod->my_i2c_dev_addr;
11043
11044         /* Check arguments */
11045         if (mode == NULL)
11046                 return -EINVAL;
11047
11048         /* If already in requested power mode, do nothing */
11049         if (common_attr->current_power_mode == *mode)
11050                 return 0;
11051
11052         switch (*mode) {
11053         case DRX_POWER_UP:
11054         case DRXJ_POWER_DOWN_MAIN_PATH:
11055                 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
11056                 break;
11057         case DRXJ_POWER_DOWN_CORE:
11058                 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
11059                 break;
11060         case DRXJ_POWER_DOWN_PLL:
11061                 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
11062                 break;
11063         case DRX_POWER_DOWN:
11064                 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
11065                 break;
11066         default:
11067                 /* Unknow sleep mode */
11068                 return -EINVAL;
11069                 break;
11070         }
11071
11072         /* Check if device needs to be powered up */
11073         if ((common_attr->current_power_mode != DRX_POWER_UP)) {
11074                 rc = power_up_device(demod);
11075                 if (rc != 0) {
11076                         pr_err("error %d\n", rc);
11077                         goto rw_error;
11078                 }
11079         }
11080
11081         if (*mode == DRX_POWER_UP) {
11082                 /* Restore analog & pin configuration */
11083
11084                 /* Initialize default AFE configuration for VSB */
11085                 drxj_reset_mode(ext_attr);
11086         } else {
11087                 /* Power down to requested mode */
11088                 /* Backup some register settings */
11089                 /* Set pins with possible pull-ups connected to them in input mode */
11090                 /* Analog power down */
11091                 /* ADC power down */
11092                 /* Power down device */
11093                 /* stop all comm_exec */
11094                 /*
11095                    Stop and power down previous standard
11096                  */
11097
11098                 switch (ext_attr->standard) {
11099                 case DRX_STANDARD_ITU_A:
11100                 case DRX_STANDARD_ITU_B:
11101                 case DRX_STANDARD_ITU_C:
11102                         rc = power_down_qam(demod, true);
11103                         if (rc != 0) {
11104                                 pr_err("error %d\n", rc);
11105                                 goto rw_error;
11106                         }
11107                         break;
11108                 case DRX_STANDARD_8VSB:
11109                         rc = power_down_vsb(demod, true);
11110                         if (rc != 0) {
11111                                 pr_err("error %d\n", rc);
11112                                 goto rw_error;
11113                         }
11114                         break;
11115                 case DRX_STANDARD_PAL_SECAM_BG: /* fallthrough */
11116                 case DRX_STANDARD_PAL_SECAM_DK: /* fallthrough */
11117                 case DRX_STANDARD_PAL_SECAM_I:  /* fallthrough */
11118                 case DRX_STANDARD_PAL_SECAM_L:  /* fallthrough */
11119                 case DRX_STANDARD_PAL_SECAM_LP: /* fallthrough */
11120                 case DRX_STANDARD_NTSC: /* fallthrough */
11121                 case DRX_STANDARD_FM:
11122                         rc = power_down_atv(demod, ext_attr->standard, true);
11123                         if (rc != 0) {
11124                                 pr_err("error %d\n", rc);
11125                                 goto rw_error;
11126                         }
11127                         break;
11128                 case DRX_STANDARD_UNKNOWN:
11129                         /* Do nothing */
11130                         break;
11131                 case DRX_STANDARD_AUTO: /* fallthrough */
11132                 default:
11133                         return -EIO;
11134                 }
11135                 ext_attr->standard = DRX_STANDARD_UNKNOWN;
11136         }
11137
11138         if (*mode != DRXJ_POWER_DOWN_MAIN_PATH) {
11139                 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode, 0);
11140                 if (rc != 0) {
11141                         pr_err("error %d\n", rc);
11142                         goto rw_error;
11143                 }
11144                 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11145                 if (rc != 0) {
11146                         pr_err("error %d\n", rc);
11147                         goto rw_error;
11148                 }
11149
11150                 if ((*mode != DRX_POWER_UP)) {
11151                         /* Initialize HI, wakeup key especially before put IC to sleep */
11152                         rc = init_hi(demod);
11153                         if (rc != 0) {
11154                                 pr_err("error %d\n", rc);
11155                                 goto rw_error;
11156                         }
11157
11158                         ext_attr->hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
11159                         rc = hi_cfg_command(demod);
11160                         if (rc != 0) {
11161                                 pr_err("error %d\n", rc);
11162                                 goto rw_error;
11163                         }
11164                 }
11165         }
11166
11167         common_attr->current_power_mode = *mode;
11168
11169         return 0;
11170 rw_error:
11171         return rc;
11172 }
11173
11174 /*============================================================================*/
11175 /*== CTRL Set/Get Config related functions ===================================*/
11176 /*============================================================================*/
11177
11178 /*
11179 * \fn int ctrl_set_cfg_pre_saw()
11180 * \brief Set Pre-saw reference.
11181 * \param demod demod instance
11182 * \param u16 *
11183 * \return int.
11184 *
11185 * Check arguments
11186 * Dispatch handling to standard specific function.
11187 *
11188 */
11189 static int
11190 ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw)
11191 {
11192         struct i2c_device_addr *dev_addr = NULL;
11193         struct drxj_data *ext_attr = NULL;
11194         int rc;
11195
11196         dev_addr = demod->my_i2c_dev_addr;
11197         ext_attr = (struct drxj_data *) demod->my_ext_attr;
11198
11199         /* check arguments */
11200         if ((pre_saw == NULL) || (pre_saw->reference > IQM_AF_PDREF__M)
11201             ) {
11202                 return -EINVAL;
11203         }
11204
11205         /* Only if standard is currently active */
11206         if ((ext_attr->standard == pre_saw->standard) ||
11207             (DRXJ_ISQAMSTD(ext_attr->standard) &&
11208              DRXJ_ISQAMSTD(pre_saw->standard)) ||
11209             (DRXJ_ISATVSTD(ext_attr->standard) &&
11210              DRXJ_ISATVSTD(pre_saw->standard))) {
11211                 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, pre_saw->reference, 0);
11212                 if (rc != 0) {
11213                         pr_err("error %d\n", rc);
11214                         goto rw_error;
11215                 }
11216         }
11217
11218         /* Store pre-saw settings */
11219         switch (pre_saw->standard) {
11220         case DRX_STANDARD_8VSB:
11221                 ext_attr->vsb_pre_saw_cfg = *pre_saw;
11222                 break;
11223 #ifndef DRXJ_VSB_ONLY
11224         case DRX_STANDARD_ITU_A:        /* fallthrough */
11225         case DRX_STANDARD_ITU_B:        /* fallthrough */
11226         case DRX_STANDARD_ITU_C:
11227                 ext_attr->qam_pre_saw_cfg = *pre_saw;
11228                 break;
11229 #endif
11230         default:
11231                 return -EINVAL;
11232         }
11233
11234         return 0;
11235 rw_error:
11236         return rc;
11237 }
11238
11239 /*============================================================================*/
11240
11241 /*
11242 * \fn int ctrl_set_cfg_afe_gain()
11243 * \brief Set AFE Gain.
11244 * \param demod demod instance
11245 * \param u16 *
11246 * \return int.
11247 *
11248 * Check arguments
11249 * Dispatch handling to standard specific function.
11250 *
11251 */
11252 static int
11253 ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain)
11254 {
11255         struct i2c_device_addr *dev_addr = NULL;
11256         struct drxj_data *ext_attr = NULL;
11257         int rc;
11258         u8 gain = 0;
11259
11260         /* check arguments */
11261         if (afe_gain == NULL)
11262                 return -EINVAL;
11263
11264         dev_addr = demod->my_i2c_dev_addr;
11265         ext_attr = (struct drxj_data *) demod->my_ext_attr;
11266
11267         switch (afe_gain->standard) {
11268         case DRX_STANDARD_8VSB: /* fallthrough */
11269 #ifndef DRXJ_VSB_ONLY
11270         case DRX_STANDARD_ITU_A:        /* fallthrough */
11271         case DRX_STANDARD_ITU_B:        /* fallthrough */
11272         case DRX_STANDARD_ITU_C:
11273 #endif
11274                 /* Do nothing */
11275                 break;
11276         default:
11277                 return -EINVAL;
11278         }
11279
11280         /* TODO PGA gain is also written by microcode (at least by QAM and VSB)
11281            So I (PJ) think interface requires choice between auto, user mode */
11282
11283         if (afe_gain->gain >= 329)
11284                 gain = 15;
11285         else if (afe_gain->gain <= 147)
11286                 gain = 0;
11287         else
11288                 gain = (afe_gain->gain - 140 + 6) / 13;
11289
11290         /* Only if standard is currently active */
11291         if (ext_attr->standard == afe_gain->standard) {
11292                         rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, gain, 0);
11293                         if (rc != 0) {
11294                                 pr_err("error %d\n", rc);
11295                                 goto rw_error;
11296                         }
11297                 }
11298
11299         /* Store AFE Gain settings */
11300         switch (afe_gain->standard) {
11301         case DRX_STANDARD_8VSB:
11302                 ext_attr->vsb_pga_cfg = gain * 13 + 140;
11303                 break;
11304 #ifndef DRXJ_VSB_ONLY
11305         case DRX_STANDARD_ITU_A:        /* fallthrough */
11306         case DRX_STANDARD_ITU_B:        /* fallthrough */
11307         case DRX_STANDARD_ITU_C:
11308                 ext_attr->qam_pga_cfg = gain * 13 + 140;
11309                 break;
11310 #endif
11311         default:
11312                 return -EIO;
11313         }
11314
11315         return 0;
11316 rw_error:
11317         return rc;
11318 }
11319
11320 /*============================================================================*/
11321
11322
11323 /*=============================================================================
11324 ===== EXPORTED FUNCTIONS ====================================================*/
11325
11326 static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11327                        struct drxu_code_info *mc_info,
11328                        enum drxu_code_action action);
11329 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state);
11330
11331 /*
11332 * \fn drxj_open()
11333 * \brief Open the demod instance, configure device, configure drxdriver
11334 * \return Status_t Return status.
11335 *
11336 * drxj_open() can be called with a NULL ucode image => no ucode upload.
11337 * This means that drxj_open() must NOT contain SCU commands or, in general,
11338 * rely on SCU or AUD ucode to be present.
11339 *
11340 */
11341
11342 static int drxj_open(struct drx_demod_instance *demod)
11343 {
11344         struct i2c_device_addr *dev_addr = NULL;
11345         struct drxj_data *ext_attr = NULL;
11346         struct drx_common_attr *common_attr = NULL;
11347         u32 driver_version = 0;
11348         struct drxu_code_info ucode_info;
11349         struct drx_cfg_mpeg_output cfg_mpeg_output;
11350         int rc;
11351         enum drx_power_mode power_mode = DRX_POWER_UP;
11352
11353         if ((demod == NULL) ||
11354             (demod->my_common_attr == NULL) ||
11355             (demod->my_ext_attr == NULL) ||
11356             (demod->my_i2c_dev_addr == NULL) ||
11357             (demod->my_common_attr->is_opened)) {
11358                 return -EINVAL;
11359         }
11360
11361         /* Check arguments */
11362         if (demod->my_ext_attr == NULL)
11363                 return -EINVAL;
11364
11365         dev_addr = demod->my_i2c_dev_addr;
11366         ext_attr = (struct drxj_data *) demod->my_ext_attr;
11367         common_attr = (struct drx_common_attr *) demod->my_common_attr;
11368
11369         rc = ctrl_power_mode(demod, &power_mode);
11370         if (rc != 0) {
11371                 pr_err("error %d\n", rc);
11372                 goto rw_error;
11373         }
11374         if (power_mode != DRX_POWER_UP) {
11375                 rc = -EINVAL;
11376                 pr_err("failed to powerup device\n");
11377                 goto rw_error;
11378         }
11379
11380         /* has to be in front of setIqmAf and setOrxNsuAox */
11381         rc = get_device_capabilities(demod);
11382         if (rc != 0) {
11383                 pr_err("error %d\n", rc);
11384                 goto rw_error;
11385         }
11386
11387         /*
11388          * Soft reset of sys- and osc-clockdomain
11389          *
11390          * HACK: On windows, it writes a 0x07 here, instead of just 0x03.
11391          * As we didn't load the firmware here yet, we should do the same.
11392          * Btw, this is coherent with DRX-K, where we send reset codes
11393          * for modulation (OFTM, in DRX-k), SYS and OSC clock domains.
11394          */
11395         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);
11396         if (rc != 0) {
11397                 pr_err("error %d\n", rc);
11398                 goto rw_error;
11399         }
11400         rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11401         if (rc != 0) {
11402                 pr_err("error %d\n", rc);
11403                 goto rw_error;
11404         }
11405         msleep(1);
11406
11407         /* TODO first make sure that everything keeps working before enabling this */
11408         /* PowerDownAnalogBlocks() */
11409         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);
11410         if (rc != 0) {
11411                 pr_err("error %d\n", rc);
11412                 goto rw_error;
11413         }
11414
11415         rc = set_iqm_af(demod, false);
11416         if (rc != 0) {
11417                 pr_err("error %d\n", rc);
11418                 goto rw_error;
11419         }
11420         rc = set_orx_nsu_aox(demod, false);
11421         if (rc != 0) {
11422                 pr_err("error %d\n", rc);
11423                 goto rw_error;
11424         }
11425
11426         rc = init_hi(demod);
11427         if (rc != 0) {
11428                 pr_err("error %d\n", rc);
11429                 goto rw_error;
11430         }
11431
11432         /* disable mpegoutput pins */
11433         memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
11434         cfg_mpeg_output.enable_mpeg_output = false;
11435
11436         rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
11437         if (rc != 0) {
11438                 pr_err("error %d\n", rc);
11439                 goto rw_error;
11440         }
11441         /* Stop AUD Inform SetAudio it will need to do all setting */
11442         rc = power_down_aud(demod);
11443         if (rc != 0) {
11444                 pr_err("error %d\n", rc);
11445                 goto rw_error;
11446         }
11447         /* Stop SCU */
11448         rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP, 0);
11449         if (rc != 0) {
11450                 pr_err("error %d\n", rc);
11451                 goto rw_error;
11452         }
11453
11454         /* Upload microcode */
11455         if (common_attr->microcode_file != NULL) {
11456                 /* Dirty trick to use common ucode upload & verify,
11457                    pretend device is already open */
11458                 common_attr->is_opened = true;
11459                 ucode_info.mc_file = common_attr->microcode_file;
11460
11461                 if (DRX_ISPOWERDOWNMODE(demod->my_common_attr->current_power_mode)) {
11462                         pr_err("Should powerup before loading the firmware.");
11463                         return -EINVAL;
11464                 }
11465
11466                 rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_UPLOAD);
11467                 if (rc != 0) {
11468                         pr_err("error %d while uploading the firmware\n", rc);
11469                         goto rw_error;
11470                 }
11471                 if (common_attr->verify_microcode == true) {
11472                         rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_VERIFY);
11473                         if (rc != 0) {
11474                                 pr_err("error %d while verifying the firmware\n",
11475                                        rc);
11476                                 goto rw_error;
11477                         }
11478                 }
11479                 common_attr->is_opened = false;
11480         }
11481
11482         /* Run SCU for a little while to initialize microcode version numbers */
11483         rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11484         if (rc != 0) {
11485                 pr_err("error %d\n", rc);
11486                 goto rw_error;
11487         }
11488
11489         /* Initialize scan timeout */
11490         common_attr->scan_demod_lock_timeout = DRXJ_SCAN_TIMEOUT;
11491         common_attr->scan_desired_lock = DRX_LOCKED;
11492
11493         drxj_reset_mode(ext_attr);
11494         ext_attr->standard = DRX_STANDARD_UNKNOWN;
11495
11496         rc = smart_ant_init(demod);
11497         if (rc != 0) {
11498                 pr_err("error %d\n", rc);
11499                 goto rw_error;
11500         }
11501
11502         /* Stamp driver version number in SCU data RAM in BCD code
11503            Done to enable field application engineers to retrieve drxdriver version
11504            via I2C from SCU RAM
11505          */
11506         driver_version = (VERSION_MAJOR / 100) % 10;
11507         driver_version <<= 4;
11508         driver_version += (VERSION_MAJOR / 10) % 10;
11509         driver_version <<= 4;
11510         driver_version += (VERSION_MAJOR % 10);
11511         driver_version <<= 4;
11512         driver_version += (VERSION_MINOR % 10);
11513         driver_version <<= 4;
11514         driver_version += (VERSION_PATCH / 1000) % 10;
11515         driver_version <<= 4;
11516         driver_version += (VERSION_PATCH / 100) % 10;
11517         driver_version <<= 4;
11518         driver_version += (VERSION_PATCH / 10) % 10;
11519         driver_version <<= 4;
11520         driver_version += (VERSION_PATCH % 10);
11521         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_HI__A, (u16)(driver_version >> 16), 0);
11522         if (rc != 0) {
11523                 pr_err("error %d\n", rc);
11524                 goto rw_error;
11525         }
11526         rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_LO__A, (u16)(driver_version & 0xFFFF), 0);
11527         if (rc != 0) {
11528                 pr_err("error %d\n", rc);
11529                 goto rw_error;
11530         }
11531
11532         rc = ctrl_set_oob(demod, NULL);
11533         if (rc != 0) {
11534                 pr_err("error %d\n", rc);
11535                 goto rw_error;
11536         }
11537
11538         /* refresh the audio data structure with default */
11539         ext_attr->aud_data = drxj_default_aud_data_g;
11540
11541         demod->my_common_attr->is_opened = true;
11542         drxj_set_lna_state(demod, false);
11543         return 0;
11544 rw_error:
11545         common_attr->is_opened = false;
11546         return rc;
11547 }
11548
11549 /*============================================================================*/
11550 /*
11551 * \fn drxj_close()
11552 * \brief Close the demod instance, power down the device
11553 * \return Status_t Return status.
11554 *
11555 */
11556 static int drxj_close(struct drx_demod_instance *demod)
11557 {
11558         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11559         int rc;
11560         enum drx_power_mode power_mode = DRX_POWER_UP;
11561
11562         if ((demod->my_common_attr == NULL) ||
11563             (demod->my_ext_attr == NULL) ||
11564             (demod->my_i2c_dev_addr == NULL) ||
11565             (!demod->my_common_attr->is_opened)) {
11566                 return -EINVAL;
11567         }
11568
11569         /* power up */
11570         rc = ctrl_power_mode(demod, &power_mode);
11571         if (rc != 0) {
11572                 pr_err("error %d\n", rc);
11573                 goto rw_error;
11574         }
11575
11576         rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11577         if (rc != 0) {
11578                 pr_err("error %d\n", rc);
11579                 goto rw_error;
11580         }
11581         power_mode = DRX_POWER_DOWN;
11582         rc = ctrl_power_mode(demod, &power_mode);
11583         if (rc != 0) {
11584                 pr_err("error %d\n", rc);
11585                 goto rw_error;
11586         }
11587
11588         DRX_ATTR_ISOPENED(demod) = false;
11589
11590         return 0;
11591 rw_error:
11592         DRX_ATTR_ISOPENED(demod) = false;
11593
11594         return rc;
11595 }
11596
11597 /*
11598  * Microcode related functions
11599  */
11600
11601 /*
11602  * drx_u_code_compute_crc       - Compute CRC of block of microcode data.
11603  * @block_data: Pointer to microcode data.
11604  * @nr_words:   Size of microcode block (number of 16 bits words).
11605  *
11606  * returns The computed CRC residue.
11607  */
11608 static u16 drx_u_code_compute_crc(u8 *block_data, u16 nr_words)
11609 {
11610         u16 i = 0;
11611         u16 j = 0;
11612         u32 crc_word = 0;
11613         u32 carry = 0;
11614
11615         while (i < nr_words) {
11616                 crc_word |= (u32)be16_to_cpu(*(__be16 *)(block_data));
11617                 for (j = 0; j < 16; j++) {
11618                         crc_word <<= 1;
11619                         if (carry != 0)
11620                                 crc_word ^= 0x80050000UL;
11621                         carry = crc_word & 0x80000000UL;
11622                 }
11623                 i++;
11624                 block_data += (sizeof(u16));
11625         }
11626         return (u16)(crc_word >> 16);
11627 }
11628
11629 /*
11630  * drx_check_firmware - checks if the loaded firmware is valid
11631  *
11632  * @demod:      demod structure
11633  * @mc_data:    pointer to the start of the firmware
11634  * @size:       firmware size
11635  */
11636 static int drx_check_firmware(struct drx_demod_instance *demod, u8 *mc_data,
11637                           unsigned size)
11638 {
11639         struct drxu_code_block_hdr block_hdr;
11640         int i;
11641         unsigned count = 2 * sizeof(u16);
11642         u32 mc_dev_type, mc_version, mc_base_version;
11643         u16 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data + sizeof(u16)));
11644
11645         /*
11646          * Scan microcode blocks first for version info
11647          * and firmware check
11648          */
11649
11650         /* Clear version block */
11651         DRX_ATTR_MCRECORD(demod).aux_type = 0;
11652         DRX_ATTR_MCRECORD(demod).mc_dev_type = 0;
11653         DRX_ATTR_MCRECORD(demod).mc_version = 0;
11654         DRX_ATTR_MCRECORD(demod).mc_base_version = 0;
11655
11656         for (i = 0; i < mc_nr_of_blks; i++) {
11657                 if (count + 3 * sizeof(u16) + sizeof(u32) > size)
11658                         goto eof;
11659
11660                 /* Process block header */
11661                 block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data + count));
11662                 count += sizeof(u32);
11663                 block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data + count));
11664                 count += sizeof(u16);
11665                 block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data + count));
11666                 count += sizeof(u16);
11667                 block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data + count));
11668                 count += sizeof(u16);
11669
11670                 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11671                         count, block_hdr.addr, block_hdr.size, block_hdr.flags,
11672                         block_hdr.CRC);
11673
11674                 if (block_hdr.flags & 0x8) {
11675                         u8 *auxblk = ((void *)mc_data) + block_hdr.addr;
11676                         u16 auxtype;
11677
11678                         if (block_hdr.addr + sizeof(u16) > size)
11679                                 goto eof;
11680
11681                         auxtype = be16_to_cpu(*(__be16 *)(auxblk));
11682
11683                         /* Aux block. Check type */
11684                         if (DRX_ISMCVERTYPE(auxtype)) {
11685                                 if (block_hdr.addr + 2 * sizeof(u16) + 2 * sizeof (u32) > size)
11686                                         goto eof;
11687
11688                                 auxblk += sizeof(u16);
11689                                 mc_dev_type = be32_to_cpu(*(__be32 *)(auxblk));
11690                                 auxblk += sizeof(u32);
11691                                 mc_version = be32_to_cpu(*(__be32 *)(auxblk));
11692                                 auxblk += sizeof(u32);
11693                                 mc_base_version = be32_to_cpu(*(__be32 *)(auxblk));
11694
11695                                 DRX_ATTR_MCRECORD(demod).aux_type = auxtype;
11696                                 DRX_ATTR_MCRECORD(demod).mc_dev_type = mc_dev_type;
11697                                 DRX_ATTR_MCRECORD(demod).mc_version = mc_version;
11698                                 DRX_ATTR_MCRECORD(demod).mc_base_version = mc_base_version;
11699
11700                                 pr_info("Firmware dev %x, ver %x, base ver %x\n",
11701                                         mc_dev_type, mc_version, mc_base_version);
11702
11703                         }
11704                 } else if (count + block_hdr.size * sizeof(u16) > size)
11705                         goto eof;
11706
11707                 count += block_hdr.size * sizeof(u16);
11708         }
11709         return 0;
11710 eof:
11711         pr_err("Firmware is truncated at pos %u/%u\n", count, size);
11712         return -EINVAL;
11713 }
11714
11715 /*
11716  * drx_ctrl_u_code - Handle microcode upload or verify.
11717  * @dev_addr: Address of device.
11718  * @mc_info:  Pointer to information about microcode data.
11719  * @action:  Either UCODE_UPLOAD or UCODE_VERIFY
11720  *
11721  * This function returns:
11722  *      0:
11723  *              - In case of UCODE_UPLOAD: code is successfully uploaded.
11724  *               - In case of UCODE_VERIFY: image on device is equal to
11725  *                image provided to this control function.
11726  *      -EIO:
11727  *              - In case of UCODE_UPLOAD: I2C error.
11728  *              - In case of UCODE_VERIFY: I2C error or image on device
11729  *                is not equal to image provided to this control function.
11730  *      -EINVAL:
11731  *              - Invalid arguments.
11732  *              - Provided image is corrupt
11733  */
11734 static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11735                        struct drxu_code_info *mc_info,
11736                        enum drxu_code_action action)
11737 {
11738         struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11739         int rc;
11740         u16 i = 0;
11741         u16 mc_nr_of_blks = 0;
11742         u16 mc_magic_word = 0;
11743         const u8 *mc_data_init = NULL;
11744         u8 *mc_data = NULL;
11745         unsigned size;
11746         char *mc_file;
11747
11748         /* Check arguments */
11749         if (!mc_info || !mc_info->mc_file)
11750                 return -EINVAL;
11751
11752         mc_file = mc_info->mc_file;
11753
11754         if (!demod->firmware) {
11755                 const struct firmware *fw = NULL;
11756
11757                 rc = request_firmware(&fw, mc_file, demod->i2c->dev.parent);
11758                 if (rc < 0) {
11759                         pr_err("Couldn't read firmware %s\n", mc_file);
11760                         return rc;
11761                 }
11762                 demod->firmware = fw;
11763
11764                 if (demod->firmware->size < 2 * sizeof(u16)) {
11765                         rc = -EINVAL;
11766                         pr_err("Firmware is too short!\n");
11767                         goto release;
11768                 }
11769
11770                 pr_info("Firmware %s, size %zu\n",
11771                         mc_file, demod->firmware->size);
11772         }
11773
11774         mc_data_init = demod->firmware->data;
11775         size = demod->firmware->size;
11776
11777         mc_data = (void *)mc_data_init;
11778         /* Check data */
11779         mc_magic_word = be16_to_cpu(*(__be16 *)(mc_data));
11780         mc_data += sizeof(u16);
11781         mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data));
11782         mc_data += sizeof(u16);
11783
11784         if ((mc_magic_word != DRX_UCODE_MAGIC_WORD) || (mc_nr_of_blks == 0)) {
11785                 rc = -EINVAL;
11786                 pr_err("Firmware magic word doesn't match\n");
11787                 goto release;
11788         }
11789
11790         if (action == UCODE_UPLOAD) {
11791                 rc = drx_check_firmware(demod, (u8 *)mc_data_init, size);
11792                 if (rc)
11793                         goto release;
11794                 pr_info("Uploading firmware %s\n", mc_file);
11795         } else {
11796                 pr_info("Verifying if firmware upload was ok.\n");
11797         }
11798
11799         /* Process microcode blocks */
11800         for (i = 0; i < mc_nr_of_blks; i++) {
11801                 struct drxu_code_block_hdr block_hdr;
11802                 u16 mc_block_nr_bytes = 0;
11803
11804                 /* Process block header */
11805                 block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data));
11806                 mc_data += sizeof(u32);
11807                 block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data));
11808                 mc_data += sizeof(u16);
11809                 block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data));
11810                 mc_data += sizeof(u16);
11811                 block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data));
11812                 mc_data += sizeof(u16);
11813
11814                 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11815                         (unsigned)(mc_data - mc_data_init), block_hdr.addr,
11816                          block_hdr.size, block_hdr.flags, block_hdr.CRC);
11817
11818                 /* Check block header on:
11819                    - data larger than 64Kb
11820                    - if CRC enabled check CRC
11821                  */
11822                 if ((block_hdr.size > 0x7FFF) ||
11823                     (((block_hdr.flags & DRX_UCODE_CRC_FLAG) != 0) &&
11824                      (block_hdr.CRC != drx_u_code_compute_crc(mc_data, block_hdr.size)))
11825                     ) {
11826                         /* Wrong data ! */
11827                         rc = -EINVAL;
11828                         pr_err("firmware CRC is wrong\n");
11829                         goto release;
11830                 }
11831
11832                 if (!block_hdr.size)
11833                         continue;
11834
11835                 mc_block_nr_bytes = block_hdr.size * ((u16) sizeof(u16));
11836
11837                 /* Perform the desired action */
11838                 switch (action) {
11839                 case UCODE_UPLOAD:      /* Upload microcode */
11840                         if (drxdap_fasi_write_block(dev_addr,
11841                                                         block_hdr.addr,
11842                                                         mc_block_nr_bytes,
11843                                                         mc_data, 0x0000)) {
11844                                 rc = -EIO;
11845                                 pr_err("error writing firmware at pos %u\n",
11846                                        (unsigned)(mc_data - mc_data_init));
11847                                 goto release;
11848                         }
11849                         break;
11850                 case UCODE_VERIFY: {    /* Verify uploaded microcode */
11851                         int result = 0;
11852                         u8 mc_data_buffer[DRX_UCODE_MAX_BUF_SIZE];
11853                         u32 bytes_to_comp = 0;
11854                         u32 bytes_left = mc_block_nr_bytes;
11855                         u32 curr_addr = block_hdr.addr;
11856                         u8 *curr_ptr = mc_data;
11857
11858                         while (bytes_left != 0) {
11859                                 if (bytes_left > DRX_UCODE_MAX_BUF_SIZE)
11860                                         bytes_to_comp = DRX_UCODE_MAX_BUF_SIZE;
11861                                 else
11862                                         bytes_to_comp = bytes_left;
11863
11864                                 if (drxdap_fasi_read_block(dev_addr,
11865                                                     curr_addr,
11866                                                     (u16)bytes_to_comp,
11867                                                     (u8 *)mc_data_buffer,
11868                                                     0x0000)) {
11869                                         pr_err("error reading firmware at pos %u\n",
11870                                                (unsigned)(mc_data - mc_data_init));
11871                                         return -EIO;
11872                                 }
11873
11874                                 result = memcmp(curr_ptr, mc_data_buffer,
11875                                                 bytes_to_comp);
11876
11877                                 if (result) {
11878                                         pr_err("error verifying firmware at pos %u\n",
11879                                                (unsigned)(mc_data - mc_data_init));
11880                                         return -EIO;
11881                                 }
11882
11883                                 curr_addr += ((dr_xaddr_t)(bytes_to_comp / 2));
11884                                 curr_ptr =&(curr_ptr[bytes_to_comp]);
11885                                 bytes_left -=((u32) bytes_to_comp);
11886                         }
11887                         break;
11888                 }
11889                 default:
11890                         return -EINVAL;
11891                         break;
11892
11893                 }
11894                 mc_data += mc_block_nr_bytes;
11895         }
11896
11897         return 0;
11898
11899 release:
11900         release_firmware(demod->firmware);
11901         demod->firmware = NULL;
11902
11903         return rc;
11904 }
11905
11906 /* caller is expected to check if lna is supported before enabling */
11907 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state)
11908 {
11909         struct drxuio_cfg uio_cfg;
11910         struct drxuio_data uio_data;
11911         int result;
11912
11913         uio_cfg.uio = DRX_UIO1;
11914         uio_cfg.mode = DRX_UIO_MODE_READWRITE;
11915         /* Configure user-I/O #3: enable read/write */
11916         result = ctrl_set_uio_cfg(demod, &uio_cfg);
11917         if (result) {
11918                 pr_err("Failed to setup LNA GPIO!\n");
11919                 return result;
11920         }
11921
11922         uio_data.uio = DRX_UIO1;
11923         uio_data.value = state;
11924         result = ctrl_uio_write(demod, &uio_data);
11925         if (result != 0) {
11926                 pr_err("Failed to %sable LNA!\n",
11927                        state ? "en" : "dis");
11928                 return result;
11929         }
11930         return 0;
11931 }
11932
11933 /*
11934  * The Linux DVB Driver for Micronas DRX39xx family (drx3933j)
11935  *
11936  * Written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
11937  */
11938
11939 static int drx39xxj_set_powerstate(struct dvb_frontend *fe, int enable)
11940 {
11941         struct drx39xxj_state *state = fe->demodulator_priv;
11942         struct drx_demod_instance *demod = state->demod;
11943         int result;
11944         enum drx_power_mode power_mode;
11945
11946         if (enable)
11947                 power_mode = DRX_POWER_UP;
11948         else
11949                 power_mode = DRX_POWER_DOWN;
11950
11951         result = ctrl_power_mode(demod, &power_mode);
11952         if (result != 0) {
11953                 pr_err("Power state change failed\n");
11954                 return 0;
11955         }
11956
11957         return 0;
11958 }
11959
11960 static int drx39xxj_read_status(struct dvb_frontend *fe, enum fe_status *status)
11961 {
11962         struct drx39xxj_state *state = fe->demodulator_priv;
11963         struct drx_demod_instance *demod = state->demod;
11964         int result;
11965         enum drx_lock_status lock_status;
11966
11967         *status = 0;
11968
11969         result = ctrl_lock_status(demod, &lock_status);
11970         if (result != 0) {
11971                 pr_err("drx39xxj: could not get lock status!\n");
11972                 *status = 0;
11973         }
11974
11975         switch (lock_status) {
11976         case DRX_NEVER_LOCK:
11977                 *status = 0;
11978                 pr_err("drx says NEVER_LOCK\n");
11979                 break;
11980         case DRX_NOT_LOCKED:
11981                 *status = 0;
11982                 break;
11983         case DRX_LOCK_STATE_1:
11984         case DRX_LOCK_STATE_2:
11985         case DRX_LOCK_STATE_3:
11986         case DRX_LOCK_STATE_4:
11987         case DRX_LOCK_STATE_5:
11988         case DRX_LOCK_STATE_6:
11989         case DRX_LOCK_STATE_7:
11990         case DRX_LOCK_STATE_8:
11991         case DRX_LOCK_STATE_9:
11992                 *status = FE_HAS_SIGNAL
11993                     | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC;
11994                 break;
11995         case DRX_LOCKED:
11996                 *status = FE_HAS_SIGNAL
11997                     | FE_HAS_CARRIER
11998                     | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
11999                 break;
12000         default:
12001                 pr_err("Lock state unknown %d\n", lock_status);
12002         }
12003         ctrl_sig_quality(demod, lock_status);
12004
12005         return 0;
12006 }
12007
12008 static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber)
12009 {
12010         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12011
12012         if (p->pre_bit_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12013                 *ber = 0;
12014                 return 0;
12015         }
12016
12017         if (!p->pre_bit_count.stat[0].uvalue) {
12018                 if (!p->pre_bit_error.stat[0].uvalue)
12019                         *ber = 0;
12020                 else
12021                         *ber = 1000000;
12022         } else {
12023                 *ber = frac_times1e6(p->pre_bit_error.stat[0].uvalue,
12024                                      p->pre_bit_count.stat[0].uvalue);
12025         }
12026         return 0;
12027 }
12028
12029 static int drx39xxj_read_signal_strength(struct dvb_frontend *fe,
12030                                          u16 *strength)
12031 {
12032         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12033
12034         if (p->strength.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12035                 *strength = 0;
12036                 return 0;
12037         }
12038
12039         *strength = p->strength.stat[0].uvalue;
12040         return 0;
12041 }
12042
12043 static int drx39xxj_read_snr(struct dvb_frontend *fe, u16 *snr)
12044 {
12045         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12046         u64 tmp64;
12047
12048         if (p->cnr.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12049                 *snr = 0;
12050                 return 0;
12051         }
12052
12053         tmp64 = p->cnr.stat[0].svalue;
12054         do_div(tmp64, 10);
12055         *snr = tmp64;
12056         return 0;
12057 }
12058
12059 static int drx39xxj_read_ucblocks(struct dvb_frontend *fe, u32 *ucb)
12060 {
12061         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12062
12063         if (p->block_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12064                 *ucb = 0;
12065                 return 0;
12066         }
12067
12068         *ucb = p->block_error.stat[0].uvalue;
12069         return 0;
12070 }
12071
12072 static int drx39xxj_set_frontend(struct dvb_frontend *fe)
12073 {
12074 #ifdef DJH_DEBUG
12075         int i;
12076 #endif
12077         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12078         struct drx39xxj_state *state = fe->demodulator_priv;
12079         struct drx_demod_instance *demod = state->demod;
12080         enum drx_standard standard = DRX_STANDARD_8VSB;
12081         struct drx_channel channel;
12082         int result;
12083         static const struct drx_channel def_channel = {
12084                 /* frequency      */ 0,
12085                 /* bandwidth      */ DRX_BANDWIDTH_6MHZ,
12086                 /* mirror         */ DRX_MIRROR_NO,
12087                 /* constellation  */ DRX_CONSTELLATION_AUTO,
12088                 /* hierarchy      */ DRX_HIERARCHY_UNKNOWN,
12089                 /* priority       */ DRX_PRIORITY_UNKNOWN,
12090                 /* coderate       */ DRX_CODERATE_UNKNOWN,
12091                 /* guard          */ DRX_GUARD_UNKNOWN,
12092                 /* fftmode        */ DRX_FFTMODE_UNKNOWN,
12093                 /* classification */ DRX_CLASSIFICATION_AUTO,
12094                 /* symbolrate     */ 5057000,
12095                 /* interleavemode */ DRX_INTERLEAVEMODE_UNKNOWN,
12096                 /* ldpc           */ DRX_LDPC_UNKNOWN,
12097                 /* carrier        */ DRX_CARRIER_UNKNOWN,
12098                 /* frame mode     */ DRX_FRAMEMODE_UNKNOWN
12099         };
12100         u32 constellation = DRX_CONSTELLATION_AUTO;
12101
12102         /* Bring the demod out of sleep */
12103         drx39xxj_set_powerstate(fe, 1);
12104
12105         if (fe->ops.tuner_ops.set_params) {
12106                 u32 int_freq;
12107
12108                 if (fe->ops.i2c_gate_ctrl)
12109                         fe->ops.i2c_gate_ctrl(fe, 1);
12110
12111                 /* Set tuner to desired frequency and standard */
12112                 fe->ops.tuner_ops.set_params(fe);
12113
12114                 /* Use the tuner's IF */
12115                 if (fe->ops.tuner_ops.get_if_frequency) {
12116                         fe->ops.tuner_ops.get_if_frequency(fe, &int_freq);
12117                         demod->my_common_attr->intermediate_freq = int_freq / 1000;
12118                 }
12119
12120                 if (fe->ops.i2c_gate_ctrl)
12121                         fe->ops.i2c_gate_ctrl(fe, 0);
12122         }
12123
12124         switch (p->delivery_system) {
12125         case SYS_ATSC:
12126                 standard = DRX_STANDARD_8VSB;
12127                 break;
12128         case SYS_DVBC_ANNEX_B:
12129                 standard = DRX_STANDARD_ITU_B;
12130
12131                 switch (p->modulation) {
12132                 case QAM_64:
12133                         constellation = DRX_CONSTELLATION_QAM64;
12134                         break;
12135                 case QAM_256:
12136                         constellation = DRX_CONSTELLATION_QAM256;
12137                         break;
12138                 default:
12139                         constellation = DRX_CONSTELLATION_AUTO;
12140                         break;
12141                 }
12142                 break;
12143         default:
12144                 return -EINVAL;
12145         }
12146         /* Set the standard (will be powered up if necessary */
12147         result = ctrl_set_standard(demod, &standard);
12148         if (result != 0) {
12149                 pr_err("Failed to set standard! result=%02x\n",
12150                         result);
12151                 return -EINVAL;
12152         }
12153
12154         /* set channel parameters */
12155         channel = def_channel;
12156         channel.frequency = p->frequency / 1000;
12157         channel.bandwidth = DRX_BANDWIDTH_6MHZ;
12158         channel.constellation = constellation;
12159
12160         /* program channel */
12161         result = ctrl_set_channel(demod, &channel);
12162         if (result != 0) {
12163                 pr_err("Failed to set channel!\n");
12164                 return -EINVAL;
12165         }
12166         /* Just for giggles, let's shut off the LNA again.... */
12167         drxj_set_lna_state(demod, false);
12168
12169         /* After set_frontend, except for strength, stats aren't available */
12170         p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12171
12172         return 0;
12173 }
12174
12175 static int drx39xxj_sleep(struct dvb_frontend *fe)
12176 {
12177         /* power-down the demodulator */
12178         return drx39xxj_set_powerstate(fe, 0);
12179 }
12180
12181 static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
12182 {
12183         struct drx39xxj_state *state = fe->demodulator_priv;
12184         struct drx_demod_instance *demod = state->demod;
12185         bool i2c_gate_state;
12186         int result;
12187
12188 #ifdef DJH_DEBUG
12189         pr_debug("i2c gate call: enable=%d state=%d\n", enable,
12190                state->i2c_gate_open);
12191 #endif
12192
12193         if (enable)
12194                 i2c_gate_state = true;
12195         else
12196                 i2c_gate_state = false;
12197
12198         if (state->i2c_gate_open == enable) {
12199                 /* We're already in the desired state */
12200                 return 0;
12201         }
12202
12203         result = ctrl_i2c_bridge(demod, &i2c_gate_state);
12204         if (result != 0) {
12205                 pr_err("drx39xxj: could not open i2c gate [%d]\n",
12206                        result);
12207                 dump_stack();
12208         } else {
12209                 state->i2c_gate_open = enable;
12210         }
12211         return 0;
12212 }
12213
12214 static int drx39xxj_init(struct dvb_frontend *fe)
12215 {
12216         struct drx39xxj_state *state = fe->demodulator_priv;
12217         struct drx_demod_instance *demod = state->demod;
12218         int rc = 0;
12219
12220         if (fe->exit == DVB_FE_DEVICE_RESUME) {
12221                 /* so drxj_open() does what it needs to do */
12222                 demod->my_common_attr->is_opened = false;
12223                 rc = drxj_open(demod);
12224                 if (rc != 0)
12225                         pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc);
12226         } else
12227                 drx39xxj_set_powerstate(fe, 1);
12228
12229         return rc;
12230 }
12231
12232 static int drx39xxj_set_lna(struct dvb_frontend *fe)
12233 {
12234         struct dtv_frontend_properties *c = &fe->dtv_property_cache;
12235         struct drx39xxj_state *state = fe->demodulator_priv;
12236         struct drx_demod_instance *demod = state->demod;
12237         struct drxj_data *ext_attr = demod->my_ext_attr;
12238
12239         if (c->lna) {
12240                 if (!ext_attr->has_lna) {
12241                         pr_err("LNA is not supported on this device!\n");
12242                         return -EINVAL;
12243
12244                 }
12245         }
12246
12247         return drxj_set_lna_state(demod, c->lna);
12248 }
12249
12250 static int drx39xxj_get_tune_settings(struct dvb_frontend *fe,
12251                                       struct dvb_frontend_tune_settings *tune)
12252 {
12253         tune->min_delay_ms = 1000;
12254         return 0;
12255 }
12256
12257 static void drx39xxj_release(struct dvb_frontend *fe)
12258 {
12259         struct drx39xxj_state *state = fe->demodulator_priv;
12260         struct drx_demod_instance *demod = state->demod;
12261
12262         /* if device is removed don't access it */
12263         if (fe->exit != DVB_FE_DEVICE_REMOVED)
12264                 drxj_close(demod);
12265
12266         kfree(demod->my_ext_attr);
12267         kfree(demod->my_common_attr);
12268         kfree(demod->my_i2c_dev_addr);
12269         release_firmware(demod->firmware);
12270         kfree(demod);
12271         kfree(state);
12272 }
12273
12274 static const struct dvb_frontend_ops drx39xxj_ops;
12275
12276 struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
12277 {
12278         struct drx39xxj_state *state = NULL;
12279         struct i2c_device_addr *demod_addr = NULL;
12280         struct drx_common_attr *demod_comm_attr = NULL;
12281         struct drxj_data *demod_ext_attr = NULL;
12282         struct drx_demod_instance *demod = NULL;
12283         struct dtv_frontend_properties *p;
12284         int result;
12285
12286         /* allocate memory for the internal state */
12287         state = kzalloc(sizeof(struct drx39xxj_state), GFP_KERNEL);
12288         if (state == NULL)
12289                 goto error;
12290
12291         demod = kmalloc(sizeof(struct drx_demod_instance), GFP_KERNEL);
12292         if (demod == NULL)
12293                 goto error;
12294
12295         demod_addr = kmemdup(&drxj_default_addr_g,
12296                              sizeof(struct i2c_device_addr), GFP_KERNEL);
12297         if (demod_addr == NULL)
12298                 goto error;
12299
12300         demod_comm_attr = kmemdup(&drxj_default_comm_attr_g,
12301                                   sizeof(struct drx_common_attr), GFP_KERNEL);
12302         if (demod_comm_attr == NULL)
12303                 goto error;
12304
12305         demod_ext_attr = kmemdup(&drxj_data_g, sizeof(struct drxj_data),
12306                                  GFP_KERNEL);
12307         if (demod_ext_attr == NULL)
12308                 goto error;
12309
12310         /* setup the state */
12311         state->i2c = i2c;
12312         state->demod = demod;
12313
12314         /* setup the demod data */
12315         memcpy(demod, &drxj_default_demod_g, sizeof(struct drx_demod_instance));
12316
12317         demod->my_i2c_dev_addr = demod_addr;
12318         demod->my_common_attr = demod_comm_attr;
12319         demod->my_i2c_dev_addr->user_data = state;
12320         demod->my_common_attr->microcode_file = DRX39XX_MAIN_FIRMWARE;
12321         demod->my_common_attr->verify_microcode = true;
12322         demod->my_common_attr->intermediate_freq = 5000;
12323         demod->my_common_attr->current_power_mode = DRX_POWER_DOWN;
12324         demod->my_ext_attr = demod_ext_attr;
12325         ((struct drxj_data *)demod_ext_attr)->uio_sma_tx_mode = DRX_UIO_MODE_READWRITE;
12326         demod->i2c = i2c;
12327
12328         result = drxj_open(demod);
12329         if (result != 0) {
12330                 pr_err("DRX open failed!  Aborting\n");
12331                 goto error;
12332         }
12333
12334         /* create dvb_frontend */
12335         memcpy(&state->frontend.ops, &drx39xxj_ops,
12336                sizeof(struct dvb_frontend_ops));
12337
12338         state->frontend.demodulator_priv = state;
12339
12340         /* Initialize stats - needed for DVBv5 stats to work */
12341         p = &state->frontend.dtv_property_cache;
12342         p->strength.len = 1;
12343         p->pre_bit_count.len = 1;
12344         p->pre_bit_error.len = 1;
12345         p->post_bit_count.len = 1;
12346         p->post_bit_error.len = 1;
12347         p->block_count.len = 1;
12348         p->block_error.len = 1;
12349         p->cnr.len = 1;
12350
12351         p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12352         p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12353         p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12354         p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12355         p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12356         p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12357         p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12358         p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12359
12360         return &state->frontend;
12361
12362 error:
12363         kfree(demod_ext_attr);
12364         kfree(demod_comm_attr);
12365         kfree(demod_addr);
12366         kfree(demod);
12367         kfree(state);
12368
12369         return NULL;
12370 }
12371 EXPORT_SYMBOL(drx39xxj_attach);
12372
12373 static const struct dvb_frontend_ops drx39xxj_ops = {
12374         .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
12375         .info = {
12376                  .name = "Micronas DRX39xxj family Frontend",
12377                  .frequency_stepsize = 62500,
12378                  .frequency_min = 51000000,
12379                  .frequency_max = 858000000,
12380                  .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
12381         },
12382
12383         .init = drx39xxj_init,
12384         .i2c_gate_ctrl = drx39xxj_i2c_gate_ctrl,
12385         .sleep = drx39xxj_sleep,
12386         .set_frontend = drx39xxj_set_frontend,
12387         .get_tune_settings = drx39xxj_get_tune_settings,
12388         .read_status = drx39xxj_read_status,
12389         .read_ber = drx39xxj_read_ber,
12390         .read_signal_strength = drx39xxj_read_signal_strength,
12391         .read_snr = drx39xxj_read_snr,
12392         .read_ucblocks = drx39xxj_read_ucblocks,
12393         .release = drx39xxj_release,
12394         .set_lna = drx39xxj_set_lna,
12395 };
12396
12397 MODULE_DESCRIPTION("Micronas DRX39xxj Frontend");
12398 MODULE_AUTHOR("Devin Heitmueller");
12399 MODULE_LICENSE("GPL");
12400 MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE);