[media] DVB-frontends: Deletion of unnecessary checks before the function call "relea...
[deliverable/linux.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 "dvb_frontend.h"
65 #include "drx39xxj.h"
66
67 #include "drxj.h"
68 #include "drxj_map.h"
69
70 /*============================================================================*/
71 /*=== DEFINES ================================================================*/
72 /*============================================================================*/
73
74 #define DRX39XX_MAIN_FIRMWARE "dvb-fe-drxj-mc-1.0.8.fw"
75
76 /**
77 * \brief Maximum u32 value.
78 */
79 #ifndef MAX_U32
80 #define MAX_U32 ((u32) (0xFFFFFFFFL))
81 #endif
82
83 /* Customer configurable hardware settings, etc */
84 #ifndef MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
85 #define MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
86 #endif
87
88 #ifndef MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
89 #define MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
90 #endif
91
92 #ifndef MPEG_OUTPUT_CLK_DRIVE_STRENGTH
93 #define MPEG_OUTPUT_CLK_DRIVE_STRENGTH 0x06
94 #endif
95
96 #ifndef OOB_CRX_DRIVE_STRENGTH
97 #define OOB_CRX_DRIVE_STRENGTH 0x02
98 #endif
99
100 #ifndef OOB_DRX_DRIVE_STRENGTH
101 #define OOB_DRX_DRIVE_STRENGTH 0x02
102 #endif
103 /**** START DJCOMBO patches to DRXJ registermap constants *********************/
104 /**** registermap 200706071303 from drxj **************************************/
105 #define ATV_TOP_CR_AMP_TH_FM 0x0
106 #define ATV_TOP_CR_AMP_TH_L 0xA
107 #define ATV_TOP_CR_AMP_TH_LP 0xA
108 #define ATV_TOP_CR_AMP_TH_BG 0x8
109 #define ATV_TOP_CR_AMP_TH_DK 0x8
110 #define ATV_TOP_CR_AMP_TH_I 0x8
111 #define ATV_TOP_CR_CONT_CR_D_MN 0x18
112 #define ATV_TOP_CR_CONT_CR_D_FM 0x0
113 #define ATV_TOP_CR_CONT_CR_D_L 0x20
114 #define ATV_TOP_CR_CONT_CR_D_LP 0x20
115 #define ATV_TOP_CR_CONT_CR_D_BG 0x18
116 #define ATV_TOP_CR_CONT_CR_D_DK 0x18
117 #define ATV_TOP_CR_CONT_CR_D_I 0x18
118 #define ATV_TOP_CR_CONT_CR_I_MN 0x80
119 #define ATV_TOP_CR_CONT_CR_I_FM 0x0
120 #define ATV_TOP_CR_CONT_CR_I_L 0x80
121 #define ATV_TOP_CR_CONT_CR_I_LP 0x80
122 #define ATV_TOP_CR_CONT_CR_I_BG 0x80
123 #define ATV_TOP_CR_CONT_CR_I_DK 0x80
124 #define ATV_TOP_CR_CONT_CR_I_I 0x80
125 #define ATV_TOP_CR_CONT_CR_P_MN 0x4
126 #define ATV_TOP_CR_CONT_CR_P_FM 0x0
127 #define ATV_TOP_CR_CONT_CR_P_L 0x4
128 #define ATV_TOP_CR_CONT_CR_P_LP 0x4
129 #define ATV_TOP_CR_CONT_CR_P_BG 0x4
130 #define ATV_TOP_CR_CONT_CR_P_DK 0x4
131 #define ATV_TOP_CR_CONT_CR_P_I 0x4
132 #define ATV_TOP_CR_OVM_TH_MN 0xA0
133 #define ATV_TOP_CR_OVM_TH_FM 0x0
134 #define ATV_TOP_CR_OVM_TH_L 0xA0
135 #define ATV_TOP_CR_OVM_TH_LP 0xA0
136 #define ATV_TOP_CR_OVM_TH_BG 0xA0
137 #define ATV_TOP_CR_OVM_TH_DK 0xA0
138 #define ATV_TOP_CR_OVM_TH_I 0xA0
139 #define ATV_TOP_EQU0_EQU_C0_FM 0x0
140 #define ATV_TOP_EQU0_EQU_C0_L 0x3
141 #define ATV_TOP_EQU0_EQU_C0_LP 0x3
142 #define ATV_TOP_EQU0_EQU_C0_BG 0x7
143 #define ATV_TOP_EQU0_EQU_C0_DK 0x0
144 #define ATV_TOP_EQU0_EQU_C0_I 0x3
145 #define ATV_TOP_EQU1_EQU_C1_FM 0x0
146 #define ATV_TOP_EQU1_EQU_C1_L 0x1F6
147 #define ATV_TOP_EQU1_EQU_C1_LP 0x1F6
148 #define ATV_TOP_EQU1_EQU_C1_BG 0x197
149 #define ATV_TOP_EQU1_EQU_C1_DK 0x198
150 #define ATV_TOP_EQU1_EQU_C1_I 0x1F6
151 #define ATV_TOP_EQU2_EQU_C2_FM 0x0
152 #define ATV_TOP_EQU2_EQU_C2_L 0x28
153 #define ATV_TOP_EQU2_EQU_C2_LP 0x28
154 #define ATV_TOP_EQU2_EQU_C2_BG 0xC5
155 #define ATV_TOP_EQU2_EQU_C2_DK 0xB0
156 #define ATV_TOP_EQU2_EQU_C2_I 0x28
157 #define ATV_TOP_EQU3_EQU_C3_FM 0x0
158 #define ATV_TOP_EQU3_EQU_C3_L 0x192
159 #define ATV_TOP_EQU3_EQU_C3_LP 0x192
160 #define ATV_TOP_EQU3_EQU_C3_BG 0x12E
161 #define ATV_TOP_EQU3_EQU_C3_DK 0x18E
162 #define ATV_TOP_EQU3_EQU_C3_I 0x192
163 #define ATV_TOP_STD_MODE_MN 0x0
164 #define ATV_TOP_STD_MODE_FM 0x1
165 #define ATV_TOP_STD_MODE_L 0x0
166 #define ATV_TOP_STD_MODE_LP 0x0
167 #define ATV_TOP_STD_MODE_BG 0x0
168 #define ATV_TOP_STD_MODE_DK 0x0
169 #define ATV_TOP_STD_MODE_I 0x0
170 #define ATV_TOP_STD_VID_POL_MN 0x0
171 #define ATV_TOP_STD_VID_POL_FM 0x0
172 #define ATV_TOP_STD_VID_POL_L 0x2
173 #define ATV_TOP_STD_VID_POL_LP 0x2
174 #define ATV_TOP_STD_VID_POL_BG 0x0
175 #define ATV_TOP_STD_VID_POL_DK 0x0
176 #define ATV_TOP_STD_VID_POL_I 0x0
177 #define ATV_TOP_VID_AMP_MN 0x380
178 #define ATV_TOP_VID_AMP_FM 0x0
179 #define ATV_TOP_VID_AMP_L 0xF50
180 #define ATV_TOP_VID_AMP_LP 0xF50
181 #define ATV_TOP_VID_AMP_BG 0x380
182 #define ATV_TOP_VID_AMP_DK 0x394
183 #define ATV_TOP_VID_AMP_I 0x3D8
184 #define IQM_CF_OUT_ENA_OFDM__M 0x4
185 #define IQM_FS_ADJ_SEL_B_QAM 0x1
186 #define IQM_FS_ADJ_SEL_B_OFF 0x0
187 #define IQM_FS_ADJ_SEL_B_VSB 0x2
188 #define IQM_RC_ADJ_SEL_B_OFF 0x0
189 #define IQM_RC_ADJ_SEL_B_QAM 0x1
190 #define IQM_RC_ADJ_SEL_B_VSB 0x2
191 /**** END DJCOMBO patches to DRXJ registermap *********************************/
192
193 #include "drx_driver_version.h"
194
195 /* #define DRX_DEBUG */
196 #ifdef DRX_DEBUG
197 #include <stdio.h>
198 #endif
199
200 /*-----------------------------------------------------------------------------
201 ENUMS
202 ----------------------------------------------------------------------------*/
203
204 /*-----------------------------------------------------------------------------
205 DEFINES
206 ----------------------------------------------------------------------------*/
207 #ifndef DRXJ_WAKE_UP_KEY
208 #define DRXJ_WAKE_UP_KEY (demod->my_i2c_dev_addr->i2c_addr)
209 #endif
210
211 /**
212 * \def DRXJ_DEF_I2C_ADDR
213 * \brief Default I2C addres of a demodulator instance.
214 */
215 #define DRXJ_DEF_I2C_ADDR (0x52)
216
217 /**
218 * \def DRXJ_DEF_DEMOD_DEV_ID
219 * \brief Default device identifier of a demodultor instance.
220 */
221 #define DRXJ_DEF_DEMOD_DEV_ID (1)
222
223 /**
224 * \def DRXJ_SCAN_TIMEOUT
225 * \brief Timeout value for waiting on demod lock during channel scan (millisec).
226 */
227 #define DRXJ_SCAN_TIMEOUT 1000
228
229 /**
230 * \def HI_I2C_DELAY
231 * \brief HI timing delay for I2C timing (in nano seconds)
232 *
233 * Used to compute HI_CFG_DIV
234 */
235 #define HI_I2C_DELAY 42
236
237 /**
238 * \def HI_I2C_BRIDGE_DELAY
239 * \brief HI timing delay for I2C timing (in nano seconds)
240 *
241 * Used to compute HI_CFG_BDL
242 */
243 #define HI_I2C_BRIDGE_DELAY 750
244
245 /**
246 * \brief Time Window for MER and SER Measurement in Units of Segment duration.
247 */
248 #define VSB_TOP_MEASUREMENT_PERIOD 64
249 #define SYMBOLS_PER_SEGMENT 832
250
251 /**
252 * \brief bit rate and segment rate constants used for SER and BER.
253 */
254 /* values taken from the QAM microcode */
255 #define DRXJ_QAM_SL_SIG_POWER_QAM_UNKNOWN 0
256 #define DRXJ_QAM_SL_SIG_POWER_QPSK 32768
257 #define DRXJ_QAM_SL_SIG_POWER_QAM8 24576
258 #define DRXJ_QAM_SL_SIG_POWER_QAM16 40960
259 #define DRXJ_QAM_SL_SIG_POWER_QAM32 20480
260 #define DRXJ_QAM_SL_SIG_POWER_QAM64 43008
261 #define DRXJ_QAM_SL_SIG_POWER_QAM128 20992
262 #define DRXJ_QAM_SL_SIG_POWER_QAM256 43520
263 /**
264 * \brief Min supported symbolrates.
265 */
266 #ifndef DRXJ_QAM_SYMBOLRATE_MIN
267 #define DRXJ_QAM_SYMBOLRATE_MIN (520000)
268 #endif
269
270 /**
271 * \brief Max supported symbolrates.
272 */
273 #ifndef DRXJ_QAM_SYMBOLRATE_MAX
274 #define DRXJ_QAM_SYMBOLRATE_MAX (7233000)
275 #endif
276
277 /**
278 * \def DRXJ_QAM_MAX_WAITTIME
279 * \brief Maximal wait time for QAM auto constellation in ms
280 */
281 #ifndef DRXJ_QAM_MAX_WAITTIME
282 #define DRXJ_QAM_MAX_WAITTIME 900
283 #endif
284
285 #ifndef DRXJ_QAM_FEC_LOCK_WAITTIME
286 #define DRXJ_QAM_FEC_LOCK_WAITTIME 150
287 #endif
288
289 #ifndef DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
290 #define DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME 200
291 #endif
292
293 /**
294 * \def SCU status and results
295 * \brief SCU
296 */
297 #define DRX_SCU_READY 0
298 #define DRXJ_MAX_WAITTIME 100 /* ms */
299 #define FEC_RS_MEASUREMENT_PERIOD 12894 /* 1 sec */
300 #define FEC_RS_MEASUREMENT_PRESCALE 1 /* n sec */
301
302 /**
303 * \def DRX_AUD_MAX_DEVIATION
304 * \brief Needed for calculation of prescale feature in AUD
305 */
306 #ifndef DRXJ_AUD_MAX_FM_DEVIATION
307 #define DRXJ_AUD_MAX_FM_DEVIATION 100 /* kHz */
308 #endif
309
310 /**
311 * \brief Needed for calculation of NICAM prescale feature in AUD
312 */
313 #ifndef DRXJ_AUD_MAX_NICAM_PRESCALE
314 #define DRXJ_AUD_MAX_NICAM_PRESCALE (9) /* dB */
315 #endif
316
317 /**
318 * \brief Needed for calculation of NICAM prescale feature in AUD
319 */
320 #ifndef DRXJ_AUD_MAX_WAITTIME
321 #define DRXJ_AUD_MAX_WAITTIME 250 /* ms */
322 #endif
323
324 /* ATV config changed flags */
325 #define DRXJ_ATV_CHANGED_COEF (0x00000001UL)
326 #define DRXJ_ATV_CHANGED_PEAK_FLT (0x00000008UL)
327 #define DRXJ_ATV_CHANGED_NOISE_FLT (0x00000010UL)
328 #define DRXJ_ATV_CHANGED_OUTPUT (0x00000020UL)
329 #define DRXJ_ATV_CHANGED_SIF_ATT (0x00000040UL)
330
331 /* UIO define */
332 #define DRX_UIO_MODE_FIRMWARE_SMA DRX_UIO_MODE_FIRMWARE0
333 #define DRX_UIO_MODE_FIRMWARE_SAW DRX_UIO_MODE_FIRMWARE1
334
335 /*
336 * MICROCODE RELATED DEFINES
337 */
338
339 /* Magic word for checking correct Endianess of microcode data */
340 #define DRX_UCODE_MAGIC_WORD ((((u16)'H')<<8)+((u16)'L'))
341
342 /* CRC flag in ucode header, flags field. */
343 #define DRX_UCODE_CRC_FLAG (0x0001)
344
345 /*
346 * Maximum size of buffer used to verify the microcode.
347 * Must be an even number
348 */
349 #define DRX_UCODE_MAX_BUF_SIZE (DRXDAP_MAX_RCHUNKSIZE)
350
351 #if DRX_UCODE_MAX_BUF_SIZE & 1
352 #error DRX_UCODE_MAX_BUF_SIZE must be an even number
353 #endif
354
355 /*
356 * Power mode macros
357 */
358
359 #define DRX_ISPOWERDOWNMODE(mode) ((mode == DRX_POWER_MODE_9) || \
360 (mode == DRX_POWER_MODE_10) || \
361 (mode == DRX_POWER_MODE_11) || \
362 (mode == DRX_POWER_MODE_12) || \
363 (mode == DRX_POWER_MODE_13) || \
364 (mode == DRX_POWER_MODE_14) || \
365 (mode == DRX_POWER_MODE_15) || \
366 (mode == DRX_POWER_MODE_16) || \
367 (mode == DRX_POWER_DOWN))
368
369 /* Pin safe mode macro */
370 #define DRXJ_PIN_SAFE_MODE 0x0000
371 /*============================================================================*/
372 /*=== GLOBAL VARIABLEs =======================================================*/
373 /*============================================================================*/
374 /**
375 */
376
377 /**
378 * \brief Temporary register definitions.
379 * (register definitions that are not yet available in register master)
380 */
381
382 /******************************************************************************/
383 /* Audio block 0x103 is write only. To avoid shadowing in driver accessing */
384 /* RAM adresses directly. This must be READ ONLY to avoid problems. */
385 /* Writing to the interface adresses is more than only writing the RAM */
386 /* locations */
387 /******************************************************************************/
388 /**
389 * \brief RAM location of MODUS registers
390 */
391 #define AUD_DEM_RAM_MODUS_HI__A 0x10204A3
392 #define AUD_DEM_RAM_MODUS_HI__M 0xF000
393
394 #define AUD_DEM_RAM_MODUS_LO__A 0x10204A4
395 #define AUD_DEM_RAM_MODUS_LO__M 0x0FFF
396
397 /**
398 * \brief RAM location of I2S config registers
399 */
400 #define AUD_DEM_RAM_I2S_CONFIG1__A 0x10204B1
401 #define AUD_DEM_RAM_I2S_CONFIG2__A 0x10204B2
402
403 /**
404 * \brief RAM location of DCO config registers
405 */
406 #define AUD_DEM_RAM_DCO_B_HI__A 0x1020461
407 #define AUD_DEM_RAM_DCO_B_LO__A 0x1020462
408 #define AUD_DEM_RAM_DCO_A_HI__A 0x1020463
409 #define AUD_DEM_RAM_DCO_A_LO__A 0x1020464
410
411 /**
412 * \brief RAM location of Threshold registers
413 */
414 #define AUD_DEM_RAM_NICAM_THRSHLD__A 0x102045A
415 #define AUD_DEM_RAM_A2_THRSHLD__A 0x10204BB
416 #define AUD_DEM_RAM_BTSC_THRSHLD__A 0x10204A6
417
418 /**
419 * \brief RAM location of Carrier Threshold registers
420 */
421 #define AUD_DEM_RAM_CM_A_THRSHLD__A 0x10204AF
422 #define AUD_DEM_RAM_CM_B_THRSHLD__A 0x10204B0
423
424 /**
425 * \brief FM Matrix register fix
426 */
427 #ifdef AUD_DEM_WR_FM_MATRIX__A
428 #undef AUD_DEM_WR_FM_MATRIX__A
429 #endif
430 #define AUD_DEM_WR_FM_MATRIX__A 0x105006F
431
432 /*============================================================================*/
433 /**
434 * \brief Defines required for audio
435 */
436 #define AUD_VOLUME_ZERO_DB 115
437 #define AUD_VOLUME_DB_MIN -60
438 #define AUD_VOLUME_DB_MAX 12
439 #define AUD_CARRIER_STRENGTH_QP_0DB 0x4000
440 #define AUD_CARRIER_STRENGTH_QP_0DB_LOG10T100 421
441 #define AUD_MAX_AVC_REF_LEVEL 15
442 #define AUD_I2S_FREQUENCY_MAX 48000UL
443 #define AUD_I2S_FREQUENCY_MIN 12000UL
444 #define AUD_RDS_ARRAY_SIZE 18
445
446 /**
447 * \brief Needed for calculation of prescale feature in AUD
448 */
449 #ifndef DRX_AUD_MAX_FM_DEVIATION
450 #define DRX_AUD_MAX_FM_DEVIATION (100) /* kHz */
451 #endif
452
453 /**
454 * \brief Needed for calculation of NICAM prescale feature in AUD
455 */
456 #ifndef DRX_AUD_MAX_NICAM_PRESCALE
457 #define DRX_AUD_MAX_NICAM_PRESCALE (9) /* dB */
458 #endif
459
460 /*============================================================================*/
461 /* Values for I2S Master/Slave pin configurations */
462 #define SIO_PDR_I2S_CL_CFG_MODE__MASTER 0x0004
463 #define SIO_PDR_I2S_CL_CFG_DRIVE__MASTER 0x0008
464 #define SIO_PDR_I2S_CL_CFG_MODE__SLAVE 0x0004
465 #define SIO_PDR_I2S_CL_CFG_DRIVE__SLAVE 0x0000
466
467 #define SIO_PDR_I2S_DA_CFG_MODE__MASTER 0x0003
468 #define SIO_PDR_I2S_DA_CFG_DRIVE__MASTER 0x0008
469 #define SIO_PDR_I2S_DA_CFG_MODE__SLAVE 0x0003
470 #define SIO_PDR_I2S_DA_CFG_DRIVE__SLAVE 0x0008
471
472 #define SIO_PDR_I2S_WS_CFG_MODE__MASTER 0x0004
473 #define SIO_PDR_I2S_WS_CFG_DRIVE__MASTER 0x0008
474 #define SIO_PDR_I2S_WS_CFG_MODE__SLAVE 0x0004
475 #define SIO_PDR_I2S_WS_CFG_DRIVE__SLAVE 0x0000
476
477 /*============================================================================*/
478 /*=== REGISTER ACCESS MACROS =================================================*/
479 /*============================================================================*/
480
481 /**
482 * This macro is used to create byte arrays for block writes.
483 * Block writes speed up I2C traffic between host and demod.
484 * The macro takes care of the required byte order in a 16 bits word.
485 * x -> lowbyte(x), highbyte(x)
486 */
487 #define DRXJ_16TO8(x) ((u8) (((u16)x) & 0xFF)), \
488 ((u8)((((u16)x)>>8)&0xFF))
489 /**
490 * This macro is used to convert byte array to 16 bit register value for block read.
491 * Block read speed up I2C traffic between host and demod.
492 * The macro takes care of the required byte order in a 16 bits word.
493 */
494 #define DRXJ_8TO16(x) ((u16) (x[0] | (x[1] << 8)))
495
496 /*============================================================================*/
497 /*=== MISC DEFINES ===========================================================*/
498 /*============================================================================*/
499
500 /*============================================================================*/
501 /*=== HI COMMAND RELATED DEFINES =============================================*/
502 /*============================================================================*/
503
504 /**
505 * \brief General maximum number of retries for ucode command interfaces
506 */
507 #define DRXJ_MAX_RETRIES (100)
508
509 /*============================================================================*/
510 /*=== STANDARD RELATED MACROS ================================================*/
511 /*============================================================================*/
512
513 #define DRXJ_ISATVSTD(std) ((std == DRX_STANDARD_PAL_SECAM_BG) || \
514 (std == DRX_STANDARD_PAL_SECAM_DK) || \
515 (std == DRX_STANDARD_PAL_SECAM_I) || \
516 (std == DRX_STANDARD_PAL_SECAM_L) || \
517 (std == DRX_STANDARD_PAL_SECAM_LP) || \
518 (std == DRX_STANDARD_NTSC) || \
519 (std == DRX_STANDARD_FM))
520
521 #define DRXJ_ISQAMSTD(std) ((std == DRX_STANDARD_ITU_A) || \
522 (std == DRX_STANDARD_ITU_B) || \
523 (std == DRX_STANDARD_ITU_C) || \
524 (std == DRX_STANDARD_ITU_D))
525
526 /*-----------------------------------------------------------------------------
527 GLOBAL VARIABLES
528 ----------------------------------------------------------------------------*/
529 /*
530 * DRXJ DAP structures
531 */
532
533 static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
534 u32 addr,
535 u16 datasize,
536 u8 *data, u32 flags);
537
538
539 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
540 u32 waddr,
541 u32 raddr,
542 u16 wdata, u16 *rdata);
543
544 static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
545 u32 addr,
546 u16 *data, u32 flags);
547
548 static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
549 u32 addr,
550 u32 *data, u32 flags);
551
552 static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
553 u32 addr,
554 u16 datasize,
555 u8 *data, u32 flags);
556
557 static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
558 u32 addr,
559 u16 data, u32 flags);
560
561 static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
562 u32 addr,
563 u32 data, u32 flags);
564
565 static struct drxj_data drxj_data_g = {
566 false, /* has_lna : true if LNA (aka PGA) present */
567 false, /* has_oob : true if OOB supported */
568 false, /* has_ntsc: true if NTSC supported */
569 false, /* has_btsc: true if BTSC supported */
570 false, /* has_smatx: true if SMA_TX pin is available */
571 false, /* has_smarx: true if SMA_RX pin is available */
572 false, /* has_gpio : true if GPIO pin is available */
573 false, /* has_irqn : true if IRQN pin is available */
574 0, /* mfx A1/A2/A... */
575
576 /* tuner settings */
577 false, /* tuner mirrors RF signal */
578 /* standard/channel settings */
579 DRX_STANDARD_UNKNOWN, /* current standard */
580 DRX_CONSTELLATION_AUTO, /* constellation */
581 0, /* frequency in KHz */
582 DRX_BANDWIDTH_UNKNOWN, /* curr_bandwidth */
583 DRX_MIRROR_NO, /* mirror */
584
585 /* signal quality information: */
586 /* default values taken from the QAM Programming guide */
587 /* fec_bits_desired should not be less than 4000000 */
588 4000000, /* fec_bits_desired */
589 5, /* fec_vd_plen */
590 4, /* qam_vd_prescale */
591 0xFFFF, /* qamVDPeriod */
592 204 * 8, /* fec_rs_plen annex A */
593 1, /* fec_rs_prescale */
594 FEC_RS_MEASUREMENT_PERIOD, /* fec_rs_period */
595 true, /* reset_pkt_err_acc */
596 0, /* pkt_err_acc_start */
597
598 /* HI configuration */
599 0, /* hi_cfg_timing_div */
600 0, /* hi_cfg_bridge_delay */
601 0, /* hi_cfg_wake_up_key */
602 0, /* hi_cfg_ctrl */
603 0, /* HICfgTimeout */
604 /* UIO configuartion */
605 DRX_UIO_MODE_DISABLE, /* uio_sma_rx_mode */
606 DRX_UIO_MODE_DISABLE, /* uio_sma_tx_mode */
607 DRX_UIO_MODE_DISABLE, /* uioASELMode */
608 DRX_UIO_MODE_DISABLE, /* uio_irqn_mode */
609 /* FS setting */
610 0UL, /* iqm_fs_rate_ofs */
611 false, /* pos_image */
612 /* RC setting */
613 0UL, /* iqm_rc_rate_ofs */
614 /* AUD information */
615 /* false, * flagSetAUDdone */
616 /* false, * detectedRDS */
617 /* true, * flagASDRequest */
618 /* false, * flagHDevClear */
619 /* false, * flagHDevSet */
620 /* (u16) 0xFFF, * rdsLastCount */
621
622 /* ATV configuartion */
623 0UL, /* flags cfg changes */
624 /* shadow of ATV_TOP_EQU0__A */
625 {-5,
626 ATV_TOP_EQU0_EQU_C0_FM,
627 ATV_TOP_EQU0_EQU_C0_L,
628 ATV_TOP_EQU0_EQU_C0_LP,
629 ATV_TOP_EQU0_EQU_C0_BG,
630 ATV_TOP_EQU0_EQU_C0_DK,
631 ATV_TOP_EQU0_EQU_C0_I},
632 /* shadow of ATV_TOP_EQU1__A */
633 {-50,
634 ATV_TOP_EQU1_EQU_C1_FM,
635 ATV_TOP_EQU1_EQU_C1_L,
636 ATV_TOP_EQU1_EQU_C1_LP,
637 ATV_TOP_EQU1_EQU_C1_BG,
638 ATV_TOP_EQU1_EQU_C1_DK,
639 ATV_TOP_EQU1_EQU_C1_I},
640 /* shadow of ATV_TOP_EQU2__A */
641 {210,
642 ATV_TOP_EQU2_EQU_C2_FM,
643 ATV_TOP_EQU2_EQU_C2_L,
644 ATV_TOP_EQU2_EQU_C2_LP,
645 ATV_TOP_EQU2_EQU_C2_BG,
646 ATV_TOP_EQU2_EQU_C2_DK,
647 ATV_TOP_EQU2_EQU_C2_I},
648 /* shadow of ATV_TOP_EQU3__A */
649 {-160,
650 ATV_TOP_EQU3_EQU_C3_FM,
651 ATV_TOP_EQU3_EQU_C3_L,
652 ATV_TOP_EQU3_EQU_C3_LP,
653 ATV_TOP_EQU3_EQU_C3_BG,
654 ATV_TOP_EQU3_EQU_C3_DK,
655 ATV_TOP_EQU3_EQU_C3_I},
656 false, /* flag: true=bypass */
657 ATV_TOP_VID_PEAK__PRE, /* shadow of ATV_TOP_VID_PEAK__A */
658 ATV_TOP_NOISE_TH__PRE, /* shadow of ATV_TOP_NOISE_TH__A */
659 true, /* flag CVBS ouput enable */
660 false, /* flag SIF ouput enable */
661 DRXJ_SIF_ATTENUATION_0DB, /* current SIF att setting */
662 { /* qam_rf_agc_cfg */
663 DRX_STANDARD_ITU_B, /* standard */
664 DRX_AGC_CTRL_AUTO, /* ctrl_mode */
665 0, /* output_level */
666 0, /* min_output_level */
667 0xFFFF, /* max_output_level */
668 0x0000, /* speed */
669 0x0000, /* top */
670 0x0000 /* c.o.c. */
671 },
672 { /* qam_if_agc_cfg */
673 DRX_STANDARD_ITU_B, /* standard */
674 DRX_AGC_CTRL_AUTO, /* ctrl_mode */
675 0, /* output_level */
676 0, /* min_output_level */
677 0xFFFF, /* max_output_level */
678 0x0000, /* speed */
679 0x0000, /* top (don't care) */
680 0x0000 /* c.o.c. (don't care) */
681 },
682 { /* vsb_rf_agc_cfg */
683 DRX_STANDARD_8VSB, /* standard */
684 DRX_AGC_CTRL_AUTO, /* ctrl_mode */
685 0, /* output_level */
686 0, /* min_output_level */
687 0xFFFF, /* max_output_level */
688 0x0000, /* speed */
689 0x0000, /* top (don't care) */
690 0x0000 /* c.o.c. (don't care) */
691 },
692 { /* vsb_if_agc_cfg */
693 DRX_STANDARD_8VSB, /* standard */
694 DRX_AGC_CTRL_AUTO, /* ctrl_mode */
695 0, /* output_level */
696 0, /* min_output_level */
697 0xFFFF, /* max_output_level */
698 0x0000, /* speed */
699 0x0000, /* top (don't care) */
700 0x0000 /* c.o.c. (don't care) */
701 },
702 0, /* qam_pga_cfg */
703 0, /* vsb_pga_cfg */
704 { /* qam_pre_saw_cfg */
705 DRX_STANDARD_ITU_B, /* standard */
706 0, /* reference */
707 false /* use_pre_saw */
708 },
709 { /* vsb_pre_saw_cfg */
710 DRX_STANDARD_8VSB, /* standard */
711 0, /* reference */
712 false /* use_pre_saw */
713 },
714
715 /* Version information */
716 #ifndef _CH_
717 {
718 "01234567890", /* human readable version microcode */
719 "01234567890" /* human readable version device specific code */
720 },
721 {
722 { /* struct drx_version for microcode */
723 DRX_MODULE_UNKNOWN,
724 (char *)(NULL),
725 0,
726 0,
727 0,
728 (char *)(NULL)
729 },
730 { /* struct drx_version for device specific code */
731 DRX_MODULE_UNKNOWN,
732 (char *)(NULL),
733 0,
734 0,
735 0,
736 (char *)(NULL)
737 }
738 },
739 {
740 { /* struct drx_version_list for microcode */
741 (struct drx_version *) (NULL),
742 (struct drx_version_list *) (NULL)
743 },
744 { /* struct drx_version_list for device specific code */
745 (struct drx_version *) (NULL),
746 (struct drx_version_list *) (NULL)
747 }
748 },
749 #endif
750 false, /* smart_ant_inverted */
751 /* Tracking filter setting for OOB */
752 {
753 12000,
754 9300,
755 6600,
756 5280,
757 3700,
758 3000,
759 2000,
760 0},
761 false, /* oob_power_on */
762 0, /* mpeg_ts_static_bitrate */
763 false, /* disable_te_ihandling */
764 false, /* bit_reverse_mpeg_outout */
765 DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO, /* mpeg_output_clock_rate */
766 DRXJ_MPEG_START_WIDTH_1CLKCYC, /* mpeg_start_width */
767
768 /* Pre SAW & Agc configuration for ATV */
769 {
770 DRX_STANDARD_NTSC, /* standard */
771 7, /* reference */
772 true /* use_pre_saw */
773 },
774 { /* ATV RF-AGC */
775 DRX_STANDARD_NTSC, /* standard */
776 DRX_AGC_CTRL_AUTO, /* ctrl_mode */
777 0, /* output_level */
778 0, /* min_output_level (d.c.) */
779 0, /* max_output_level (d.c.) */
780 3, /* speed */
781 9500, /* top */
782 4000 /* cut-off current */
783 },
784 { /* ATV IF-AGC */
785 DRX_STANDARD_NTSC, /* standard */
786 DRX_AGC_CTRL_AUTO, /* ctrl_mode */
787 0, /* output_level */
788 0, /* min_output_level (d.c.) */
789 0, /* max_output_level (d.c.) */
790 3, /* speed */
791 2400, /* top */
792 0 /* c.o.c. (d.c.) */
793 },
794 140, /* ATV PGA config */
795 0, /* curr_symbol_rate */
796
797 false, /* pdr_safe_mode */
798 SIO_PDR_GPIO_CFG__PRE, /* pdr_safe_restore_val_gpio */
799 SIO_PDR_VSYNC_CFG__PRE, /* pdr_safe_restore_val_v_sync */
800 SIO_PDR_SMA_RX_CFG__PRE, /* pdr_safe_restore_val_sma_rx */
801 SIO_PDR_SMA_TX_CFG__PRE, /* pdr_safe_restore_val_sma_tx */
802
803 4, /* oob_pre_saw */
804 DRXJ_OOB_LO_POW_MINUS10DB, /* oob_lo_pow */
805 {
806 false /* aud_data, only first member */
807 },
808 };
809
810 /**
811 * \var drxj_default_addr_g
812 * \brief Default I2C address and device identifier.
813 */
814 static struct i2c_device_addr drxj_default_addr_g = {
815 DRXJ_DEF_I2C_ADDR, /* i2c address */
816 DRXJ_DEF_DEMOD_DEV_ID /* device id */
817 };
818
819 /**
820 * \var drxj_default_comm_attr_g
821 * \brief Default common attributes of a drxj demodulator instance.
822 */
823 static struct drx_common_attr drxj_default_comm_attr_g = {
824 NULL, /* ucode file */
825 true, /* ucode verify switch */
826 {0}, /* version record */
827
828 44000, /* IF in kHz in case no tuner instance is used */
829 (151875 - 0), /* system clock frequency in kHz */
830 0, /* oscillator frequency kHz */
831 0, /* oscillator deviation in ppm, signed */
832 false, /* If true mirror frequency spectrum */
833 {
834 /* MPEG output configuration */
835 true, /* If true, enable MPEG ouput */
836 false, /* If true, insert RS byte */
837 false, /* If true, parallel out otherwise serial */
838 false, /* If true, invert DATA signals */
839 false, /* If true, invert ERR signal */
840 false, /* If true, invert STR signals */
841 false, /* If true, invert VAL signals */
842 false, /* If true, invert CLK signals */
843 true, /* If true, static MPEG clockrate will
844 be used, otherwise clockrate will
845 adapt to the bitrate of the TS */
846 19392658UL, /* Maximum bitrate in b/s in case
847 static clockrate is selected */
848 DRX_MPEG_STR_WIDTH_1 /* MPEG Start width in clock cycles */
849 },
850 /* Initilisations below can be ommited, they require no user input and
851 are initialy 0, NULL or false. The compiler will initialize them to these
852 values when ommited. */
853 false, /* is_opened */
854
855 /* SCAN */
856 NULL, /* no scan params yet */
857 0, /* current scan index */
858 0, /* next scan frequency */
859 false, /* scan ready flag */
860 0, /* max channels to scan */
861 0, /* nr of channels scanned */
862 NULL, /* default scan function */
863 NULL, /* default context pointer */
864 0, /* millisec to wait for demod lock */
865 DRXJ_DEMOD_LOCK, /* desired lock */
866 false,
867
868 /* Power management */
869 DRX_POWER_UP,
870
871 /* Tuner */
872 1, /* nr of I2C port to wich tuner is */
873 0L, /* minimum RF input frequency, in kHz */
874 0L, /* maximum RF input frequency, in kHz */
875 false, /* Rf Agc Polarity */
876 false, /* If Agc Polarity */
877 false, /* tuner slow mode */
878
879 { /* current channel (all 0) */
880 0UL /* channel.frequency */
881 },
882 DRX_STANDARD_UNKNOWN, /* current standard */
883 DRX_STANDARD_UNKNOWN, /* previous standard */
884 DRX_STANDARD_UNKNOWN, /* di_cache_standard */
885 false, /* use_bootloader */
886 0UL, /* capabilities */
887 0 /* mfx */
888 };
889
890 /**
891 * \var drxj_default_demod_g
892 * \brief Default drxj demodulator instance.
893 */
894 static struct drx_demod_instance drxj_default_demod_g = {
895 &drxj_default_addr_g, /* i2c address & device id */
896 &drxj_default_comm_attr_g, /* demod common attributes */
897 &drxj_data_g /* demod device specific attributes */
898 };
899
900 /**
901 * \brief Default audio data structure for DRK demodulator instance.
902 *
903 * This structure is DRXK specific.
904 *
905 */
906 static struct drx_aud_data drxj_default_aud_data_g = {
907 false, /* audio_is_active */
908 DRX_AUD_STANDARD_AUTO, /* audio_standard */
909
910 /* i2sdata */
911 {
912 false, /* output_enable */
913 48000, /* frequency */
914 DRX_I2S_MODE_MASTER, /* mode */
915 DRX_I2S_WORDLENGTH_32, /* word_length */
916 DRX_I2S_POLARITY_RIGHT, /* polarity */
917 DRX_I2S_FORMAT_WS_WITH_DATA /* format */
918 },
919 /* volume */
920 {
921 true, /* mute; */
922 0, /* volume */
923 DRX_AUD_AVC_OFF, /* avc_mode */
924 0, /* avc_ref_level */
925 DRX_AUD_AVC_MAX_GAIN_12DB, /* avc_max_gain */
926 DRX_AUD_AVC_MAX_ATTEN_24DB, /* avc_max_atten */
927 0, /* strength_left */
928 0 /* strength_right */
929 },
930 DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_ON, /* auto_sound */
931 /* ass_thresholds */
932 {
933 440, /* A2 */
934 12, /* BTSC */
935 700, /* NICAM */
936 },
937 /* carrier */
938 {
939 /* a */
940 {
941 42, /* thres */
942 DRX_NO_CARRIER_NOISE, /* opt */
943 0, /* shift */
944 0 /* dco */
945 },
946 /* b */
947 {
948 42, /* thres */
949 DRX_NO_CARRIER_MUTE, /* opt */
950 0, /* shift */
951 0 /* dco */
952 },
953
954 },
955 /* mixer */
956 {
957 DRX_AUD_SRC_STEREO_OR_A, /* source_i2s */
958 DRX_AUD_I2S_MATRIX_STEREO, /* matrix_i2s */
959 DRX_AUD_FM_MATRIX_SOUND_A /* matrix_fm */
960 },
961 DRX_AUD_DEVIATION_NORMAL, /* deviation */
962 DRX_AUD_AVSYNC_OFF, /* av_sync */
963
964 /* prescale */
965 {
966 DRX_AUD_MAX_FM_DEVIATION, /* fm_deviation */
967 DRX_AUD_MAX_NICAM_PRESCALE /* nicam_gain */
968 },
969 DRX_AUD_FM_DEEMPH_75US, /* deemph */
970 DRX_BTSC_STEREO, /* btsc_detect */
971 0, /* rds_data_counter */
972 false /* rds_data_present */
973 };
974
975 /*-----------------------------------------------------------------------------
976 STRUCTURES
977 ----------------------------------------------------------------------------*/
978 struct drxjeq_stat {
979 u16 eq_mse;
980 u8 eq_mode;
981 u8 eq_ctrl;
982 u8 eq_stat;
983 };
984
985 /* HI command */
986 struct drxj_hi_cmd {
987 u16 cmd;
988 u16 param1;
989 u16 param2;
990 u16 param3;
991 u16 param4;
992 u16 param5;
993 u16 param6;
994 };
995
996 /*============================================================================*/
997 /*=== MICROCODE RELATED STRUCTURES ===========================================*/
998 /*============================================================================*/
999
1000 /**
1001 * struct drxu_code_block_hdr - Structure of the microcode block headers
1002 *
1003 * @addr: Destination address of the data in this block
1004 * @size: Size of the block data following this header counted in
1005 * 16 bits words
1006 * @CRC: CRC value of the data block, only valid if CRC flag is
1007 * set.
1008 */
1009 struct drxu_code_block_hdr {
1010 u32 addr;
1011 u16 size;
1012 u16 flags;
1013 u16 CRC;
1014 };
1015
1016 /*-----------------------------------------------------------------------------
1017 FUNCTIONS
1018 ----------------------------------------------------------------------------*/
1019 /* Some prototypes */
1020 static int
1021 hi_command(struct i2c_device_addr *dev_addr,
1022 const struct drxj_hi_cmd *cmd, u16 *result);
1023
1024 static int
1025 ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat);
1026
1027 static int
1028 ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode);
1029
1030 static int power_down_aud(struct drx_demod_instance *demod);
1031
1032 static int
1033 ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw);
1034
1035 static int
1036 ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain);
1037
1038 /*============================================================================*/
1039 /*============================================================================*/
1040 /*== HELPER FUNCTIONS ==*/
1041 /*============================================================================*/
1042 /*============================================================================*/
1043
1044
1045 /*============================================================================*/
1046
1047 /*
1048 * \fn u32 frac28(u32 N, u32 D)
1049 * \brief Compute: (1<<28)*N/D
1050 * \param N 32 bits
1051 * \param D 32 bits
1052 * \return (1<<28)*N/D
1053 * This function is used to avoid floating-point calculations as they may
1054 * not be present on the target platform.
1055
1056 * frac28 performs an unsigned 28/28 bits division to 32-bit fixed point
1057 * fraction used for setting the Frequency Shifter registers.
1058 * N and D can hold numbers up to width: 28-bits.
1059 * The 4 bits integer part and the 28 bits fractional part are calculated.
1060
1061 * Usage condition: ((1<<28)*n)/d < ((1<<32)-1) => (n/d) < 15.999
1062
1063 * N: 0...(1<<28)-1 = 268435454
1064 * D: 0...(1<<28)-1
1065 * Q: 0...(1<<32)-1
1066 */
1067 static u32 frac28(u32 N, u32 D)
1068 {
1069 int i = 0;
1070 u32 Q1 = 0;
1071 u32 R0 = 0;
1072
1073 R0 = (N % D) << 4; /* 32-28 == 4 shifts possible at max */
1074 Q1 = N / D; /* integer part, only the 4 least significant bits
1075 will be visible in the result */
1076
1077 /* division using radix 16, 7 nibbles in the result */
1078 for (i = 0; i < 7; i++) {
1079 Q1 = (Q1 << 4) | R0 / D;
1080 R0 = (R0 % D) << 4;
1081 }
1082 /* rounding */
1083 if ((R0 >> 3) >= D)
1084 Q1++;
1085
1086 return Q1;
1087 }
1088
1089 /**
1090 * \fn u32 log1_times100( u32 x)
1091 * \brief Compute: 100*log10(x)
1092 * \param x 32 bits
1093 * \return 100*log10(x)
1094 *
1095 * 100*log10(x)
1096 * = 100*(log2(x)/log2(10)))
1097 * = (100*(2^15)*log2(x))/((2^15)*log2(10))
1098 * = ((200*(2^15)*log2(x))/((2^15)*log2(10)))/2
1099 * = ((200*(2^15)*(log2(x/y)+log2(y)))/((2^15)*log2(10)))/2
1100 * = ((200*(2^15)*log2(x/y))+(200*(2^15)*log2(y)))/((2^15)*log2(10)))/2
1101 *
1102 * where y = 2^k and 1<= (x/y) < 2
1103 */
1104
1105 static u32 log1_times100(u32 x)
1106 {
1107 static const u8 scale = 15;
1108 static const u8 index_width = 5;
1109 /*
1110 log2lut[n] = (1<<scale) * 200 * log2( 1.0 + ( (1.0/(1<<INDEXWIDTH)) * n ))
1111 0 <= n < ((1<<INDEXWIDTH)+1)
1112 */
1113
1114 static const u32 log2lut[] = {
1115 0, /* 0.000000 */
1116 290941, /* 290941.300628 */
1117 573196, /* 573196.476418 */
1118 847269, /* 847269.179851 */
1119 1113620, /* 1113620.489452 */
1120 1372674, /* 1372673.576986 */
1121 1624818, /* 1624817.752104 */
1122 1870412, /* 1870411.981536 */
1123 2109788, /* 2109787.962654 */
1124 2343253, /* 2343252.817465 */
1125 2571091, /* 2571091.461923 */
1126 2793569, /* 2793568.696416 */
1127 3010931, /* 3010931.055901 */
1128 3223408, /* 3223408.452106 */
1129 3431216, /* 3431215.635215 */
1130 3634553, /* 3634553.498355 */
1131 3833610, /* 3833610.244726 */
1132 4028562, /* 4028562.434393 */
1133 4219576, /* 4219575.925308 */
1134 4406807, /* 4406806.721144 */
1135 4590402, /* 4590401.736809 */
1136 4770499, /* 4770499.491025 */
1137 4947231, /* 4947230.734179 */
1138 5120719, /* 5120719.018555 */
1139 5291081, /* 5291081.217197 */
1140 5458428, /* 5458427.996830 */
1141 5622864, /* 5622864.249668 */
1142 5784489, /* 5784489.488298 */
1143 5943398, /* 5943398.207380 */
1144 6099680, /* 6099680.215452 */
1145 6253421, /* 6253420.939751 */
1146 6404702, /* 6404701.706649 */
1147 6553600, /* 6553600.000000 */
1148 };
1149
1150 u8 i = 0;
1151 u32 y = 0;
1152 u32 d = 0;
1153 u32 k = 0;
1154 u32 r = 0;
1155
1156 if (x == 0)
1157 return 0;
1158
1159 /* Scale x (normalize) */
1160 /* computing y in log(x/y) = log(x) - log(y) */
1161 if ((x & (((u32) (-1)) << (scale + 1))) == 0) {
1162 for (k = scale; k > 0; k--) {
1163 if (x & (((u32) 1) << scale))
1164 break;
1165 x <<= 1;
1166 }
1167 } else {
1168 for (k = scale; k < 31; k++) {
1169 if ((x & (((u32) (-1)) << (scale + 1))) == 0)
1170 break;
1171 x >>= 1;
1172 }
1173 }
1174 /*
1175 Now x has binary point between bit[scale] and bit[scale-1]
1176 and 1.0 <= x < 2.0 */
1177
1178 /* correction for divison: log(x) = log(x/y)+log(y) */
1179 y = k * ((((u32) 1) << scale) * 200);
1180
1181 /* remove integer part */
1182 x &= ((((u32) 1) << scale) - 1);
1183 /* get index */
1184 i = (u8) (x >> (scale - index_width));
1185 /* compute delta (x-a) */
1186 d = x & ((((u32) 1) << (scale - index_width)) - 1);
1187 /* compute log, multiplication ( d* (.. )) must be within range ! */
1188 y += log2lut[i] +
1189 ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - index_width));
1190 /* Conver to log10() */
1191 y /= 108853; /* (log2(10) << scale) */
1192 r = (y >> 1);
1193 /* rounding */
1194 if (y & ((u32)1))
1195 r++;
1196
1197 return r;
1198
1199 }
1200
1201 /**
1202 * \fn u32 frac_times1e6( u16 N, u32 D)
1203 * \brief Compute: (N/D) * 1000000.
1204 * \param N nominator 16-bits.
1205 * \param D denominator 32-bits.
1206 * \return u32
1207 * \retval ((N/D) * 1000000), 32 bits
1208 *
1209 * No check on D=0!
1210 */
1211 static u32 frac_times1e6(u32 N, u32 D)
1212 {
1213 u32 remainder = 0;
1214 u32 frac = 0;
1215
1216 /*
1217 frac = (N * 1000000) / D
1218 To let it fit in a 32 bits computation:
1219 frac = (N * (1000000 >> 4)) / (D >> 4)
1220 This would result in a problem in case D < 16 (div by 0).
1221 So we do it more elaborate as shown below.
1222 */
1223 frac = (((u32) N) * (1000000 >> 4)) / D;
1224 frac <<= 4;
1225 remainder = (((u32) N) * (1000000 >> 4)) % D;
1226 remainder <<= 4;
1227 frac += remainder / D;
1228 remainder = remainder % D;
1229 if ((remainder * 2) > D)
1230 frac++;
1231
1232 return frac;
1233 }
1234
1235 /*============================================================================*/
1236
1237
1238 /**
1239 * \brief Values for NICAM prescaler gain. Computed from dB to integer
1240 * and rounded. For calc used formula: 16*10^(prescaleGain[dB]/20).
1241 *
1242 */
1243 static const u16 nicam_presc_table_val[43] = {
1244 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
1245 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16,
1246 18, 20, 23, 25, 28, 32, 36, 40, 45,
1247 51, 57, 64, 71, 80, 90, 101, 113, 127
1248 };
1249
1250 /*============================================================================*/
1251 /*== END HELPER FUNCTIONS ==*/
1252 /*============================================================================*/
1253
1254 /*============================================================================*/
1255 /*============================================================================*/
1256 /*== DRXJ DAP FUNCTIONS ==*/
1257 /*============================================================================*/
1258 /*============================================================================*/
1259
1260 /*
1261 This layer takes care of some device specific register access protocols:
1262 -conversion to short address format
1263 -access to audio block
1264 This layer is placed between the drx_dap_fasi and the rest of the drxj
1265 specific implementation. This layer can use address map knowledge whereas
1266 dap_fasi may not use memory map knowledge.
1267
1268 * For audio currently only 16 bits read and write register access is
1269 supported. More is not needed. RMW and 32 or 8 bit access on audio
1270 registers will have undefined behaviour. Flags (RMW, CRC reset, broadcast
1271 single/multi master) will be ignored.
1272
1273 TODO: check ignoring single/multimaster is ok for AUD access ?
1274 */
1275
1276 #define DRXJ_ISAUDWRITE(addr) (((((addr)>>16)&1) == 1) ? true : false)
1277 #define DRXJ_DAP_AUDTRIF_TIMEOUT 80 /* millisec */
1278 /*============================================================================*/
1279
1280 /**
1281 * \fn bool is_handled_by_aud_tr_if( u32 addr )
1282 * \brief Check if this address is handled by the audio token ring interface.
1283 * \param addr
1284 * \return bool
1285 * \retval true Yes, handled by audio token ring interface
1286 * \retval false No, not handled by audio token ring interface
1287 *
1288 */
1289 static
1290 bool is_handled_by_aud_tr_if(u32 addr)
1291 {
1292 bool retval = false;
1293
1294 if ((DRXDAP_FASI_ADDR2BLOCK(addr) == 4) &&
1295 (DRXDAP_FASI_ADDR2BANK(addr) > 1) &&
1296 (DRXDAP_FASI_ADDR2BANK(addr) < 6)) {
1297 retval = true;
1298 }
1299
1300 return retval;
1301 }
1302
1303 /*============================================================================*/
1304
1305 int drxbsp_i2c_write_read(struct i2c_device_addr *w_dev_addr,
1306 u16 w_count,
1307 u8 *wData,
1308 struct i2c_device_addr *r_dev_addr,
1309 u16 r_count, u8 *r_data)
1310 {
1311 struct drx39xxj_state *state;
1312 struct i2c_msg msg[2];
1313 unsigned int num_msgs;
1314
1315 if (w_dev_addr == NULL) {
1316 /* Read only */
1317 state = r_dev_addr->user_data;
1318 msg[0].addr = r_dev_addr->i2c_addr >> 1;
1319 msg[0].flags = I2C_M_RD;
1320 msg[0].buf = r_data;
1321 msg[0].len = r_count;
1322 num_msgs = 1;
1323 } else if (r_dev_addr == NULL) {
1324 /* Write only */
1325 state = w_dev_addr->user_data;
1326 msg[0].addr = w_dev_addr->i2c_addr >> 1;
1327 msg[0].flags = 0;
1328 msg[0].buf = wData;
1329 msg[0].len = w_count;
1330 num_msgs = 1;
1331 } else {
1332 /* Both write and read */
1333 state = w_dev_addr->user_data;
1334 msg[0].addr = w_dev_addr->i2c_addr >> 1;
1335 msg[0].flags = 0;
1336 msg[0].buf = wData;
1337 msg[0].len = w_count;
1338 msg[1].addr = r_dev_addr->i2c_addr >> 1;
1339 msg[1].flags = I2C_M_RD;
1340 msg[1].buf = r_data;
1341 msg[1].len = r_count;
1342 num_msgs = 2;
1343 }
1344
1345 if (state->i2c == NULL) {
1346 pr_err("i2c was zero, aborting\n");
1347 return 0;
1348 }
1349 if (i2c_transfer(state->i2c, msg, num_msgs) != num_msgs) {
1350 pr_warn("drx3933: I2C write/read failed\n");
1351 return -EREMOTEIO;
1352 }
1353
1354 #ifdef DJH_DEBUG
1355 if (w_dev_addr == NULL || r_dev_addr == NULL)
1356 return 0;
1357
1358 state = w_dev_addr->user_data;
1359
1360 if (state->i2c == NULL)
1361 return 0;
1362
1363 msg[0].addr = w_dev_addr->i2c_addr;
1364 msg[0].flags = 0;
1365 msg[0].buf = wData;
1366 msg[0].len = w_count;
1367 msg[1].addr = r_dev_addr->i2c_addr;
1368 msg[1].flags = I2C_M_RD;
1369 msg[1].buf = r_data;
1370 msg[1].len = r_count;
1371 num_msgs = 2;
1372
1373 pr_debug("drx3933 i2c operation addr=%x i2c=%p, wc=%x rc=%x\n",
1374 w_dev_addr->i2c_addr, state->i2c, w_count, r_count);
1375
1376 if (i2c_transfer(state->i2c, msg, 2) != 2) {
1377 pr_warn("drx3933: I2C write/read failed\n");
1378 return -EREMOTEIO;
1379 }
1380 #endif
1381 return 0;
1382 }
1383
1384 /*============================================================================*/
1385
1386 /******************************
1387 *
1388 * int drxdap_fasi_read_block (
1389 * struct i2c_device_addr *dev_addr, -- address of I2C device
1390 * u32 addr, -- address of chip register/memory
1391 * u16 datasize, -- number of bytes to read
1392 * u8 *data, -- data to receive
1393 * u32 flags) -- special device flags
1394 *
1395 * Read block data from chip address. Because the chip is word oriented,
1396 * the number of bytes to read must be even.
1397 *
1398 * Make sure that the buffer to receive the data is large enough.
1399 *
1400 * Although this function expects an even number of bytes, it is still byte
1401 * oriented, and the data read back is NOT translated to the endianness of
1402 * the target platform.
1403 *
1404 * Output:
1405 * - 0 if reading was successful
1406 * in that case: data read is in *data.
1407 * - -EIO if anything went wrong
1408 *
1409 ******************************/
1410
1411 static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
1412 u32 addr,
1413 u16 datasize,
1414 u8 *data, u32 flags)
1415 {
1416 u8 buf[4];
1417 u16 bufx;
1418 int rc;
1419 u16 overhead_size = 0;
1420
1421 /* Check parameters ******************************************************* */
1422 if (dev_addr == NULL)
1423 return -EINVAL;
1424
1425 overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
1426 (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
1427
1428 if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
1429 ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
1430 DRXDAP_FASI_LONG_FORMAT(addr)) ||
1431 (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) ||
1432 ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1)) {
1433 return -EINVAL;
1434 }
1435
1436 /* ReadModifyWrite & mode flag bits are not allowed */
1437 flags &= (~DRXDAP_FASI_RMW & ~DRXDAP_FASI_MODEFLAGS);
1438 #if DRXDAP_SINGLE_MASTER
1439 flags |= DRXDAP_FASI_SINGLE_MASTER;
1440 #endif
1441
1442 /* Read block from I2C **************************************************** */
1443 do {
1444 u16 todo = (datasize < DRXDAP_MAX_RCHUNKSIZE ?
1445 datasize : DRXDAP_MAX_RCHUNKSIZE);
1446
1447 bufx = 0;
1448
1449 addr &= ~DRXDAP_FASI_FLAGS;
1450 addr |= flags;
1451
1452 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1453 /* short format address preferred but long format otherwise */
1454 if (DRXDAP_FASI_LONG_FORMAT(addr)) {
1455 #endif
1456 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1457 buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01);
1458 buf[bufx++] = (u8) ((addr >> 16) & 0xFF);
1459 buf[bufx++] = (u8) ((addr >> 24) & 0xFF);
1460 buf[bufx++] = (u8) ((addr >> 7) & 0xFF);
1461 #endif
1462 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1463 } else {
1464 #endif
1465 #if (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)
1466 buf[bufx++] = (u8) ((addr << 1) & 0xFF);
1467 buf[bufx++] =
1468 (u8) (((addr >> 16) & 0x0F) |
1469 ((addr >> 18) & 0xF0));
1470 #endif
1471 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1472 }
1473 #endif
1474
1475 #if DRXDAP_SINGLE_MASTER
1476 /*
1477 * In single master mode, split the read and write actions.
1478 * No special action is needed for write chunks here.
1479 */
1480 rc = drxbsp_i2c_write_read(dev_addr, bufx, buf,
1481 NULL, 0, NULL);
1482 if (rc == 0)
1483 rc = drxbsp_i2c_write_read(NULL, 0, NULL, dev_addr, todo, data);
1484 #else
1485 /* In multi master mode, do everything in one RW action */
1486 rc = drxbsp_i2c_write_read(dev_addr, bufx, buf, dev_addr, todo,
1487 data);
1488 #endif
1489 data += todo;
1490 addr += (todo >> 1);
1491 datasize -= todo;
1492 } while (datasize && rc == 0);
1493
1494 return rc;
1495 }
1496
1497
1498 /******************************
1499 *
1500 * int drxdap_fasi_read_reg16 (
1501 * struct i2c_device_addr *dev_addr, -- address of I2C device
1502 * u32 addr, -- address of chip register/memory
1503 * u16 *data, -- data to receive
1504 * u32 flags) -- special device flags
1505 *
1506 * Read one 16-bit register or memory location. The data received back is
1507 * converted back to the target platform's endianness.
1508 *
1509 * Output:
1510 * - 0 if reading was successful
1511 * in that case: read data is at *data
1512 * - -EIO if anything went wrong
1513 *
1514 ******************************/
1515
1516 static int drxdap_fasi_read_reg16(struct i2c_device_addr *dev_addr,
1517 u32 addr,
1518 u16 *data, u32 flags)
1519 {
1520 u8 buf[sizeof(*data)];
1521 int rc;
1522
1523 if (!data)
1524 return -EINVAL;
1525
1526 rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags);
1527 *data = buf[0] + (((u16) buf[1]) << 8);
1528 return rc;
1529 }
1530
1531 /******************************
1532 *
1533 * int drxdap_fasi_read_reg32 (
1534 * struct i2c_device_addr *dev_addr, -- address of I2C device
1535 * u32 addr, -- address of chip register/memory
1536 * u32 *data, -- data to receive
1537 * u32 flags) -- special device flags
1538 *
1539 * Read one 32-bit register or memory location. The data received back is
1540 * converted back to the target platform's endianness.
1541 *
1542 * Output:
1543 * - 0 if reading was successful
1544 * in that case: read data is at *data
1545 * - -EIO if anything went wrong
1546 *
1547 ******************************/
1548
1549 static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
1550 u32 addr,
1551 u32 *data, u32 flags)
1552 {
1553 u8 buf[sizeof(*data)];
1554 int rc;
1555
1556 if (!data)
1557 return -EINVAL;
1558
1559 rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags);
1560 *data = (((u32) buf[0]) << 0) +
1561 (((u32) buf[1]) << 8) +
1562 (((u32) buf[2]) << 16) + (((u32) buf[3]) << 24);
1563 return rc;
1564 }
1565
1566 /******************************
1567 *
1568 * int drxdap_fasi_write_block (
1569 * struct i2c_device_addr *dev_addr, -- address of I2C device
1570 * u32 addr, -- address of chip register/memory
1571 * u16 datasize, -- number of bytes to read
1572 * u8 *data, -- data to receive
1573 * u32 flags) -- special device flags
1574 *
1575 * Write block data to chip address. Because the chip is word oriented,
1576 * the number of bytes to write must be even.
1577 *
1578 * Although this function expects an even number of bytes, it is still byte
1579 * oriented, and the data being written is NOT translated from the endianness of
1580 * the target platform.
1581 *
1582 * Output:
1583 * - 0 if writing was successful
1584 * - -EIO if anything went wrong
1585 *
1586 ******************************/
1587
1588 static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
1589 u32 addr,
1590 u16 datasize,
1591 u8 *data, u32 flags)
1592 {
1593 u8 buf[DRXDAP_MAX_WCHUNKSIZE];
1594 int st = -EIO;
1595 int first_err = 0;
1596 u16 overhead_size = 0;
1597 u16 block_size = 0;
1598
1599 /* Check parameters ******************************************************* */
1600 if (dev_addr == NULL)
1601 return -EINVAL;
1602
1603 overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
1604 (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
1605
1606 if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
1607 ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
1608 DRXDAP_FASI_LONG_FORMAT(addr)) ||
1609 (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) ||
1610 ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1))
1611 return -EINVAL;
1612
1613 flags &= DRXDAP_FASI_FLAGS;
1614 flags &= ~DRXDAP_FASI_MODEFLAGS;
1615 #if DRXDAP_SINGLE_MASTER
1616 flags |= DRXDAP_FASI_SINGLE_MASTER;
1617 #endif
1618
1619 /* Write block to I2C ***************************************************** */
1620 block_size = ((DRXDAP_MAX_WCHUNKSIZE) - overhead_size) & ~1;
1621 do {
1622 u16 todo = 0;
1623 u16 bufx = 0;
1624
1625 /* Buffer device address */
1626 addr &= ~DRXDAP_FASI_FLAGS;
1627 addr |= flags;
1628 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1629 /* short format address preferred but long format otherwise */
1630 if (DRXDAP_FASI_LONG_FORMAT(addr)) {
1631 #endif
1632 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1)
1633 buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01);
1634 buf[bufx++] = (u8) ((addr >> 16) & 0xFF);
1635 buf[bufx++] = (u8) ((addr >> 24) & 0xFF);
1636 buf[bufx++] = (u8) ((addr >> 7) & 0xFF);
1637 #endif
1638 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1639 } else {
1640 #endif
1641 #if ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1)
1642 buf[bufx++] = (u8) ((addr << 1) & 0xFF);
1643 buf[bufx++] =
1644 (u8) (((addr >> 16) & 0x0F) |
1645 ((addr >> 18) & 0xF0));
1646 #endif
1647 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1648 }
1649 #endif
1650
1651 /*
1652 In single master mode block_size can be 0. In such a case this I2C
1653 sequense will be visible: (1) write address {i2c addr,
1654 4 bytes chip address} (2) write data {i2c addr, 4 bytes data }
1655 (3) write address (4) write data etc...
1656 Addres must be rewriten because HI is reset after data transport and
1657 expects an address.
1658 */
1659 todo = (block_size < datasize ? block_size : datasize);
1660 if (todo == 0) {
1661 u16 overhead_size_i2c_addr = 0;
1662 u16 data_block_size = 0;
1663
1664 overhead_size_i2c_addr =
1665 (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1);
1666 data_block_size =
1667 (DRXDAP_MAX_WCHUNKSIZE - overhead_size_i2c_addr) & ~1;
1668
1669 /* write device address */
1670 st = drxbsp_i2c_write_read(dev_addr,
1671 (u16) (bufx),
1672 buf,
1673 (struct i2c_device_addr *)(NULL),
1674 0, (u8 *)(NULL));
1675
1676 if ((st != 0) && (first_err == 0)) {
1677 /* at the end, return the first error encountered */
1678 first_err = st;
1679 }
1680 bufx = 0;
1681 todo =
1682 (data_block_size <
1683 datasize ? data_block_size : datasize);
1684 }
1685 memcpy(&buf[bufx], data, todo);
1686 /* write (address if can do and) data */
1687 st = drxbsp_i2c_write_read(dev_addr,
1688 (u16) (bufx + todo),
1689 buf,
1690 (struct i2c_device_addr *)(NULL),
1691 0, (u8 *)(NULL));
1692
1693 if ((st != 0) && (first_err == 0)) {
1694 /* at the end, return the first error encountered */
1695 first_err = st;
1696 }
1697 datasize -= todo;
1698 data += todo;
1699 addr += (todo >> 1);
1700 } while (datasize);
1701
1702 return first_err;
1703 }
1704
1705 /******************************
1706 *
1707 * int drxdap_fasi_write_reg16 (
1708 * struct i2c_device_addr *dev_addr, -- address of I2C device
1709 * u32 addr, -- address of chip register/memory
1710 * u16 data, -- data to send
1711 * u32 flags) -- special device flags
1712 *
1713 * Write one 16-bit register or memory location. The data being written is
1714 * converted from the target platform's endianness to little endian.
1715 *
1716 * Output:
1717 * - 0 if writing was successful
1718 * - -EIO if anything went wrong
1719 *
1720 ******************************/
1721
1722 static int drxdap_fasi_write_reg16(struct i2c_device_addr *dev_addr,
1723 u32 addr,
1724 u16 data, u32 flags)
1725 {
1726 u8 buf[sizeof(data)];
1727
1728 buf[0] = (u8) ((data >> 0) & 0xFF);
1729 buf[1] = (u8) ((data >> 8) & 0xFF);
1730
1731 return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
1732 }
1733
1734 /******************************
1735 *
1736 * int drxdap_fasi_read_modify_write_reg16 (
1737 * struct i2c_device_addr *dev_addr, -- address of I2C device
1738 * u32 waddr, -- address of chip register/memory
1739 * u32 raddr, -- chip address to read back from
1740 * u16 wdata, -- data to send
1741 * u16 *rdata) -- data to receive back
1742 *
1743 * Write 16-bit data, then read back the original contents of that location.
1744 * Requires long addressing format to be allowed.
1745 *
1746 * Before sending data, the data is converted to little endian. The
1747 * data received back is converted back to the target platform's endianness.
1748 *
1749 * WARNING: This function is only guaranteed to work if there is one
1750 * master on the I2C bus.
1751 *
1752 * Output:
1753 * - 0 if reading was successful
1754 * in that case: read back data is at *rdata
1755 * - -EIO if anything went wrong
1756 *
1757 ******************************/
1758
1759 static int drxdap_fasi_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
1760 u32 waddr,
1761 u32 raddr,
1762 u16 wdata, u16 *rdata)
1763 {
1764 int rc = -EIO;
1765
1766 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1767 if (rdata == NULL)
1768 return -EINVAL;
1769
1770 rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata, DRXDAP_FASI_RMW);
1771 if (rc == 0)
1772 rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata, 0);
1773 #endif
1774
1775 return rc;
1776 }
1777
1778 /******************************
1779 *
1780 * int drxdap_fasi_write_reg32 (
1781 * struct i2c_device_addr *dev_addr, -- address of I2C device
1782 * u32 addr, -- address of chip register/memory
1783 * u32 data, -- data to send
1784 * u32 flags) -- special device flags
1785 *
1786 * Write one 32-bit register or memory location. The data being written is
1787 * converted from the target platform's endianness to little endian.
1788 *
1789 * Output:
1790 * - 0 if writing was successful
1791 * - -EIO if anything went wrong
1792 *
1793 ******************************/
1794
1795 static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
1796 u32 addr,
1797 u32 data, u32 flags)
1798 {
1799 u8 buf[sizeof(data)];
1800
1801 buf[0] = (u8) ((data >> 0) & 0xFF);
1802 buf[1] = (u8) ((data >> 8) & 0xFF);
1803 buf[2] = (u8) ((data >> 16) & 0xFF);
1804 buf[3] = (u8) ((data >> 24) & 0xFF);
1805
1806 return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
1807 }
1808
1809 /*============================================================================*/
1810
1811 /**
1812 * \fn int drxj_dap_rm_write_reg16short
1813 * \brief Read modify write 16 bits audio register using short format only.
1814 * \param dev_addr
1815 * \param waddr Address to write to
1816 * \param raddr Address to read from (usually SIO_HI_RA_RAM_S0_RMWBUF__A)
1817 * \param wdata Data to write
1818 * \param rdata Buffer for data to read
1819 * \return int
1820 * \retval 0 Succes
1821 * \retval -EIO Timeout, I2C error, illegal bank
1822 *
1823 * 16 bits register read modify write access using short addressing format only.
1824 * Requires knowledge of the registermap, thus device dependent.
1825 * Using DAP FASI directly to avoid endless recursion of RMWs to audio registers.
1826 *
1827 */
1828
1829 /* TODO correct define should be #if ( DRXDAPFASI_SHORT_ADDR_ALLOWED==1 )
1830 See comments drxj_dap_read_modify_write_reg16 */
1831 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 0)
1832 static int drxj_dap_rm_write_reg16short(struct i2c_device_addr *dev_addr,
1833 u32 waddr,
1834 u32 raddr,
1835 u16 wdata, u16 *rdata)
1836 {
1837 int rc;
1838
1839 if (rdata == NULL)
1840 return -EINVAL;
1841
1842 /* Set RMW flag */
1843 rc = drxdap_fasi_write_reg16(dev_addr,
1844 SIO_HI_RA_RAM_S0_FLG_ACC__A,
1845 SIO_HI_RA_RAM_S0_FLG_ACC_S0_RWM__M,
1846 0x0000);
1847 if (rc == 0) {
1848 /* Write new data: triggers RMW */
1849 rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata,
1850 0x0000);
1851 }
1852 if (rc == 0) {
1853 /* Read old data */
1854 rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata,
1855 0x0000);
1856 }
1857 if (rc == 0) {
1858 /* Reset RMW flag */
1859 rc = drxdap_fasi_write_reg16(dev_addr,
1860 SIO_HI_RA_RAM_S0_FLG_ACC__A,
1861 0, 0x0000);
1862 }
1863
1864 return rc;
1865 }
1866 #endif
1867
1868 /*============================================================================*/
1869
1870 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
1871 u32 waddr,
1872 u32 raddr,
1873 u16 wdata, u16 *rdata)
1874 {
1875 /* TODO: correct short/long addressing format decision,
1876 now long format has higher prio then short because short also
1877 needs virt bnks (not impl yet) for certain audio registers */
1878 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1879 return drxdap_fasi_read_modify_write_reg16(dev_addr,
1880 waddr,
1881 raddr, wdata, rdata);
1882 #else
1883 return drxj_dap_rm_write_reg16short(dev_addr, waddr, raddr, wdata, rdata);
1884 #endif
1885 }
1886
1887
1888 /*============================================================================*/
1889
1890 /**
1891 * \fn int drxj_dap_read_aud_reg16
1892 * \brief Read 16 bits audio register
1893 * \param dev_addr
1894 * \param addr
1895 * \param data
1896 * \return int
1897 * \retval 0 Succes
1898 * \retval -EIO Timeout, I2C error, illegal bank
1899 *
1900 * 16 bits register read access via audio token ring interface.
1901 *
1902 */
1903 static int drxj_dap_read_aud_reg16(struct i2c_device_addr *dev_addr,
1904 u32 addr, u16 *data)
1905 {
1906 u32 start_timer = 0;
1907 u32 current_timer = 0;
1908 u32 delta_timer = 0;
1909 u16 tr_status = 0;
1910 int stat = -EIO;
1911
1912 /* No read possible for bank 3, return with error */
1913 if (DRXDAP_FASI_ADDR2BANK(addr) == 3) {
1914 stat = -EINVAL;
1915 } else {
1916 const u32 write_bit = ((dr_xaddr_t) 1) << 16;
1917
1918 /* Force reset write bit */
1919 addr &= (~write_bit);
1920
1921 /* Set up read */
1922 start_timer = jiffies_to_msecs(jiffies);
1923 do {
1924 /* RMW to aud TR IF until request is granted or timeout */
1925 stat = drxj_dap_read_modify_write_reg16(dev_addr,
1926 addr,
1927 SIO_HI_RA_RAM_S0_RMWBUF__A,
1928 0x0000, &tr_status);
1929
1930 if (stat != 0)
1931 break;
1932
1933 current_timer = jiffies_to_msecs(jiffies);
1934 delta_timer = current_timer - start_timer;
1935 if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
1936 stat = -EIO;
1937 break;
1938 }
1939
1940 } while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) ==
1941 AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) ||
1942 ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) ==
1943 AUD_TOP_TR_CTR_FIFO_FULL_FULL));
1944 } /* if ( DRXDAP_FASI_ADDR2BANK(addr)!=3 ) */
1945
1946 /* Wait for read ready status or timeout */
1947 if (stat == 0) {
1948 start_timer = jiffies_to_msecs(jiffies);
1949
1950 while ((tr_status & AUD_TOP_TR_CTR_FIFO_RD_RDY__M) !=
1951 AUD_TOP_TR_CTR_FIFO_RD_RDY_READY) {
1952 stat = drxj_dap_read_reg16(dev_addr,
1953 AUD_TOP_TR_CTR__A,
1954 &tr_status, 0x0000);
1955 if (stat != 0)
1956 break;
1957
1958 current_timer = jiffies_to_msecs(jiffies);
1959 delta_timer = current_timer - start_timer;
1960 if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
1961 stat = -EIO;
1962 break;
1963 }
1964 } /* while ( ... ) */
1965 }
1966
1967 /* Read value */
1968 if (stat == 0)
1969 stat = drxj_dap_read_modify_write_reg16(dev_addr,
1970 AUD_TOP_TR_RD_REG__A,
1971 SIO_HI_RA_RAM_S0_RMWBUF__A,
1972 0x0000, data);
1973 return stat;
1974 }
1975
1976 /*============================================================================*/
1977
1978 static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
1979 u32 addr,
1980 u16 *data, u32 flags)
1981 {
1982 int stat = -EIO;
1983
1984 /* Check param */
1985 if ((dev_addr == NULL) || (data == NULL))
1986 return -EINVAL;
1987
1988 if (is_handled_by_aud_tr_if(addr))
1989 stat = drxj_dap_read_aud_reg16(dev_addr, addr, data);
1990 else
1991 stat = drxdap_fasi_read_reg16(dev_addr, addr, data, flags);
1992
1993 return stat;
1994 }
1995 /*============================================================================*/
1996
1997 /**
1998 * \fn int drxj_dap_write_aud_reg16
1999 * \brief Write 16 bits audio register
2000 * \param dev_addr
2001 * \param addr
2002 * \param data
2003 * \return int
2004 * \retval 0 Succes
2005 * \retval -EIO Timeout, I2C error, illegal bank
2006 *
2007 * 16 bits register write access via audio token ring interface.
2008 *
2009 */
2010 static int drxj_dap_write_aud_reg16(struct i2c_device_addr *dev_addr,
2011 u32 addr, u16 data)
2012 {
2013 int stat = -EIO;
2014
2015 /* No write possible for bank 2, return with error */
2016 if (DRXDAP_FASI_ADDR2BANK(addr) == 2) {
2017 stat = -EINVAL;
2018 } else {
2019 u32 start_timer = 0;
2020 u32 current_timer = 0;
2021 u32 delta_timer = 0;
2022 u16 tr_status = 0;
2023 const u32 write_bit = ((dr_xaddr_t) 1) << 16;
2024
2025 /* Force write bit */
2026 addr |= write_bit;
2027 start_timer = jiffies_to_msecs(jiffies);
2028 do {
2029 /* RMW to aud TR IF until request is granted or timeout */
2030 stat = drxj_dap_read_modify_write_reg16(dev_addr,
2031 addr,
2032 SIO_HI_RA_RAM_S0_RMWBUF__A,
2033 data, &tr_status);
2034 if (stat != 0)
2035 break;
2036
2037 current_timer = jiffies_to_msecs(jiffies);
2038 delta_timer = current_timer - start_timer;
2039 if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
2040 stat = -EIO;
2041 break;
2042 }
2043
2044 } while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) ==
2045 AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) ||
2046 ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) ==
2047 AUD_TOP_TR_CTR_FIFO_FULL_FULL));
2048
2049 } /* if ( DRXDAP_FASI_ADDR2BANK(addr)!=2 ) */
2050
2051 return stat;
2052 }
2053
2054 /*============================================================================*/
2055
2056 static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
2057 u32 addr,
2058 u16 data, u32 flags)
2059 {
2060 int stat = -EIO;
2061
2062 /* Check param */
2063 if (dev_addr == NULL)
2064 return -EINVAL;
2065
2066 if (is_handled_by_aud_tr_if(addr))
2067 stat = drxj_dap_write_aud_reg16(dev_addr, addr, data);
2068 else
2069 stat = drxdap_fasi_write_reg16(dev_addr,
2070 addr, data, flags);
2071
2072 return stat;
2073 }
2074
2075 /*============================================================================*/
2076
2077 /* Free data ram in SIO HI */
2078 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2079 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2080
2081 #define DRXJ_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2082 #define DRXJ_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2083 #define DRXJ_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2084 #define DRXJ_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2085
2086 /**
2087 * \fn int drxj_dap_atomic_read_write_block()
2088 * \brief Basic access routine for atomic read or write access
2089 * \param dev_addr pointer to i2c dev address
2090 * \param addr destination/source address
2091 * \param datasize size of data buffer in bytes
2092 * \param data pointer to data buffer
2093 * \return int
2094 * \retval 0 Succes
2095 * \retval -EIO Timeout, I2C error, illegal bank
2096 *
2097 */
2098 static
2099 int drxj_dap_atomic_read_write_block(struct i2c_device_addr *dev_addr,
2100 u32 addr,
2101 u16 datasize,
2102 u8 *data, bool read_flag)
2103 {
2104 struct drxj_hi_cmd hi_cmd;
2105 int rc;
2106 u16 word;
2107 u16 dummy = 0;
2108 u16 i = 0;
2109
2110 /* Parameter check */
2111 if (!data || !dev_addr || ((datasize % 2)) || ((datasize / 2) > 8))
2112 return -EINVAL;
2113
2114 /* Set up HI parameters to read or write n bytes */
2115 hi_cmd.cmd = SIO_HI_RA_RAM_CMD_ATOMIC_COPY;
2116 hi_cmd.param1 =
2117 (u16) ((DRXDAP_FASI_ADDR2BLOCK(DRXJ_HI_ATOMIC_BUF_START) << 6) +
2118 DRXDAP_FASI_ADDR2BANK(DRXJ_HI_ATOMIC_BUF_START));
2119 hi_cmd.param2 =
2120 (u16) DRXDAP_FASI_ADDR2OFFSET(DRXJ_HI_ATOMIC_BUF_START);
2121 hi_cmd.param3 = (u16) ((datasize / 2) - 1);
2122 if (!read_flag)
2123 hi_cmd.param3 |= DRXJ_HI_ATOMIC_WRITE;
2124 else
2125 hi_cmd.param3 |= DRXJ_HI_ATOMIC_READ;
2126 hi_cmd.param4 = (u16) ((DRXDAP_FASI_ADDR2BLOCK(addr) << 6) +
2127 DRXDAP_FASI_ADDR2BANK(addr));
2128 hi_cmd.param5 = (u16) DRXDAP_FASI_ADDR2OFFSET(addr);
2129
2130 if (!read_flag) {
2131 /* write data to buffer */
2132 for (i = 0; i < (datasize / 2); i++) {
2133
2134 word = ((u16) data[2 * i]);
2135 word += (((u16) data[(2 * i) + 1]) << 8);
2136 drxj_dap_write_reg16(dev_addr,
2137 (DRXJ_HI_ATOMIC_BUF_START + i),
2138 word, 0);
2139 }
2140 }
2141
2142 rc = hi_command(dev_addr, &hi_cmd, &dummy);
2143 if (rc != 0) {
2144 pr_err("error %d\n", rc);
2145 goto rw_error;
2146 }
2147
2148 if (read_flag) {
2149 /* read data from buffer */
2150 for (i = 0; i < (datasize / 2); i++) {
2151 drxj_dap_read_reg16(dev_addr,
2152 (DRXJ_HI_ATOMIC_BUF_START + i),
2153 &word, 0);
2154 data[2 * i] = (u8) (word & 0xFF);
2155 data[(2 * i) + 1] = (u8) (word >> 8);
2156 }
2157 }
2158
2159 return 0;
2160
2161 rw_error:
2162 return rc;
2163
2164 }
2165
2166 /*============================================================================*/
2167
2168 /**
2169 * \fn int drxj_dap_atomic_read_reg32()
2170 * \brief Atomic read of 32 bits words
2171 */
2172 static
2173 int drxj_dap_atomic_read_reg32(struct i2c_device_addr *dev_addr,
2174 u32 addr,
2175 u32 *data, u32 flags)
2176 {
2177 u8 buf[sizeof(*data)] = { 0 };
2178 int rc = -EIO;
2179 u32 word = 0;
2180
2181 if (!data)
2182 return -EINVAL;
2183
2184 rc = drxj_dap_atomic_read_write_block(dev_addr, addr,
2185 sizeof(*data), buf, true);
2186
2187 if (rc < 0)
2188 return 0;
2189
2190 word = (u32) buf[3];
2191 word <<= 8;
2192 word |= (u32) buf[2];
2193 word <<= 8;
2194 word |= (u32) buf[1];
2195 word <<= 8;
2196 word |= (u32) buf[0];
2197
2198 *data = word;
2199
2200 return rc;
2201 }
2202
2203 /*============================================================================*/
2204
2205 /*============================================================================*/
2206 /*== END DRXJ DAP FUNCTIONS ==*/
2207 /*============================================================================*/
2208
2209 /*============================================================================*/
2210 /*============================================================================*/
2211 /*== HOST INTERFACE FUNCTIONS ==*/
2212 /*============================================================================*/
2213 /*============================================================================*/
2214
2215 /**
2216 * \fn int hi_cfg_command()
2217 * \brief Configure HI with settings stored in the demod structure.
2218 * \param demod Demodulator.
2219 * \return int.
2220 *
2221 * This routine was created because to much orthogonal settings have
2222 * been put into one HI API function (configure). Especially the I2C bridge
2223 * enable/disable should not need re-configuration of the HI.
2224 *
2225 */
2226 static int hi_cfg_command(const struct drx_demod_instance *demod)
2227 {
2228 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2229 struct drxj_hi_cmd hi_cmd;
2230 u16 result = 0;
2231 int rc;
2232
2233 ext_attr = (struct drxj_data *) demod->my_ext_attr;
2234
2235 hi_cmd.cmd = SIO_HI_RA_RAM_CMD_CONFIG;
2236 hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
2237 hi_cmd.param2 = ext_attr->hi_cfg_timing_div;
2238 hi_cmd.param3 = ext_attr->hi_cfg_bridge_delay;
2239 hi_cmd.param4 = ext_attr->hi_cfg_wake_up_key;
2240 hi_cmd.param5 = ext_attr->hi_cfg_ctrl;
2241 hi_cmd.param6 = ext_attr->hi_cfg_transmit;
2242
2243 rc = hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
2244 if (rc != 0) {
2245 pr_err("error %d\n", rc);
2246 goto rw_error;
2247 }
2248
2249 /* Reset power down flag (set one call only) */
2250 ext_attr->hi_cfg_ctrl &= (~(SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2251
2252 return 0;
2253
2254 rw_error:
2255 return rc;
2256 }
2257
2258 /**
2259 * \fn int hi_command()
2260 * \brief Configure HI with settings stored in the demod structure.
2261 * \param dev_addr I2C address.
2262 * \param cmd HI command.
2263 * \param result HI command result.
2264 * \return int.
2265 *
2266 * Sends command to HI
2267 *
2268 */
2269 static int
2270 hi_command(struct i2c_device_addr *dev_addr, const struct drxj_hi_cmd *cmd, u16 *result)
2271 {
2272 u16 wait_cmd = 0;
2273 u16 nr_retries = 0;
2274 bool powerdown_cmd = false;
2275 int rc;
2276
2277 /* Write parameters */
2278 switch (cmd->cmd) {
2279
2280 case SIO_HI_RA_RAM_CMD_CONFIG:
2281 case SIO_HI_RA_RAM_CMD_ATOMIC_COPY:
2282 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_6__A, cmd->param6, 0);
2283 if (rc != 0) {
2284 pr_err("error %d\n", rc);
2285 goto rw_error;
2286 }
2287 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_5__A, cmd->param5, 0);
2288 if (rc != 0) {
2289 pr_err("error %d\n", rc);
2290 goto rw_error;
2291 }
2292 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_4__A, cmd->param4, 0);
2293 if (rc != 0) {
2294 pr_err("error %d\n", rc);
2295 goto rw_error;
2296 }
2297 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_3__A, cmd->param3, 0);
2298 if (rc != 0) {
2299 pr_err("error %d\n", rc);
2300 goto rw_error;
2301 }
2302 /* fallthrough */
2303 case SIO_HI_RA_RAM_CMD_BRDCTRL:
2304 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_2__A, cmd->param2, 0);
2305 if (rc != 0) {
2306 pr_err("error %d\n", rc);
2307 goto rw_error;
2308 }
2309 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_1__A, cmd->param1, 0);
2310 if (rc != 0) {
2311 pr_err("error %d\n", rc);
2312 goto rw_error;
2313 }
2314 /* fallthrough */
2315 case SIO_HI_RA_RAM_CMD_NULL:
2316 /* No parameters */
2317 break;
2318
2319 default:
2320 return -EINVAL;
2321 break;
2322 }
2323
2324 /* Write command */
2325 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, cmd->cmd, 0);
2326 if (rc != 0) {
2327 pr_err("error %d\n", rc);
2328 goto rw_error;
2329 }
2330
2331 if ((cmd->cmd) == SIO_HI_RA_RAM_CMD_RESET)
2332 msleep(1);
2333
2334 /* Detect power down to ommit reading result */
2335 powerdown_cmd = (bool) ((cmd->cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
2336 (((cmd->
2337 param5) & SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M)
2338 == SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2339 if (!powerdown_cmd) {
2340 /* Wait until command rdy */
2341 do {
2342 nr_retries++;
2343 if (nr_retries > DRXJ_MAX_RETRIES) {
2344 pr_err("timeout\n");
2345 goto rw_error;
2346 }
2347
2348 rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, &wait_cmd, 0);
2349 if (rc != 0) {
2350 pr_err("error %d\n", rc);
2351 goto rw_error;
2352 }
2353 } while (wait_cmd != 0);
2354
2355 /* Read result */
2356 rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_RES__A, result, 0);
2357 if (rc != 0) {
2358 pr_err("error %d\n", rc);
2359 goto rw_error;
2360 }
2361
2362 }
2363 /* if ( powerdown_cmd == true ) */
2364 return 0;
2365 rw_error:
2366 return rc;
2367 }
2368
2369 /**
2370 * \fn int init_hi( const struct drx_demod_instance *demod )
2371 * \brief Initialise and configurate HI.
2372 * \param demod pointer to demod data.
2373 * \return int Return status.
2374 * \retval 0 Success.
2375 * \retval -EIO Failure.
2376 *
2377 * Needs to know Psys (System Clock period) and Posc (Osc Clock period)
2378 * Need to store configuration in driver because of the way I2C
2379 * bridging is controlled.
2380 *
2381 */
2382 static int init_hi(const struct drx_demod_instance *demod)
2383 {
2384 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2385 struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2386 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2387 int rc;
2388
2389 ext_attr = (struct drxj_data *) demod->my_ext_attr;
2390 common_attr = (struct drx_common_attr *) demod->my_common_attr;
2391 dev_addr = demod->my_i2c_dev_addr;
2392
2393 /* PATCH for bug 5003, HI ucode v3.1.0 */
2394 rc = drxj_dap_write_reg16(dev_addr, 0x4301D7, 0x801, 0);
2395 if (rc != 0) {
2396 pr_err("error %d\n", rc);
2397 goto rw_error;
2398 }
2399
2400 /* Timing div, 250ns/Psys */
2401 /* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */
2402 ext_attr->hi_cfg_timing_div =
2403 (u16) ((common_attr->sys_clock_freq / 1000) * HI_I2C_DELAY) / 1000;
2404 /* Clipping */
2405 if ((ext_attr->hi_cfg_timing_div) > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
2406 ext_attr->hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
2407 /* Bridge delay, uses oscilator clock */
2408 /* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */
2409 /* SDA brdige delay */
2410 ext_attr->hi_cfg_bridge_delay =
2411 (u16) ((common_attr->osc_clock_freq / 1000) * HI_I2C_BRIDGE_DELAY) /
2412 1000;
2413 /* Clipping */
2414 if ((ext_attr->hi_cfg_bridge_delay) > SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M)
2415 ext_attr->hi_cfg_bridge_delay = SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
2416 /* SCL bridge delay, same as SDA for now */
2417 ext_attr->hi_cfg_bridge_delay += ((ext_attr->hi_cfg_bridge_delay) <<
2418 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B);
2419 /* Wakeup key, setting the read flag (as suggest in the documentation) does
2420 not always result into a working solution (barebones worked VI2C failed).
2421 Not setting the bit works in all cases . */
2422 ext_attr->hi_cfg_wake_up_key = DRXJ_WAKE_UP_KEY;
2423 /* port/bridge/power down ctrl */
2424 ext_attr->hi_cfg_ctrl = (SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE);
2425 /* transit mode time out delay and watch dog divider */
2426 ext_attr->hi_cfg_transmit = SIO_HI_RA_RAM_PAR_6__PRE;
2427
2428 rc = hi_cfg_command(demod);
2429 if (rc != 0) {
2430 pr_err("error %d\n", rc);
2431 goto rw_error;
2432 }
2433
2434 return 0;
2435
2436 rw_error:
2437 return rc;
2438 }
2439
2440 /*============================================================================*/
2441 /*== END HOST INTERFACE FUNCTIONS ==*/
2442 /*============================================================================*/
2443
2444 /*============================================================================*/
2445 /*============================================================================*/
2446 /*== AUXILIARY FUNCTIONS ==*/
2447 /*============================================================================*/
2448 /*============================================================================*/
2449
2450 /**
2451 * \fn int get_device_capabilities()
2452 * \brief Get and store device capabilities.
2453 * \param demod Pointer to demodulator instance.
2454 * \return int.
2455 * \return 0 Success
2456 * \retval -EIO Failure
2457 *
2458 * Depending on pulldowns on MDx pins the following internals are set:
2459 * * common_attr->osc_clock_freq
2460 * * ext_attr->has_lna
2461 * * ext_attr->has_ntsc
2462 * * ext_attr->has_btsc
2463 * * ext_attr->has_oob
2464 *
2465 */
2466 static int get_device_capabilities(struct drx_demod_instance *demod)
2467 {
2468 struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2469 struct drxj_data *ext_attr = (struct drxj_data *) NULL;
2470 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2471 u16 sio_pdr_ohw_cfg = 0;
2472 u32 sio_top_jtagid_lo = 0;
2473 u16 bid = 0;
2474 int rc;
2475
2476 common_attr = (struct drx_common_attr *) demod->my_common_attr;
2477 ext_attr = (struct drxj_data *) demod->my_ext_attr;
2478 dev_addr = demod->my_i2c_dev_addr;
2479
2480 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2481 if (rc != 0) {
2482 pr_err("error %d\n", rc);
2483 goto rw_error;
2484 }
2485 rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg, 0);
2486 if (rc != 0) {
2487 pr_err("error %d\n", rc);
2488 goto rw_error;
2489 }
2490 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2491 if (rc != 0) {
2492 pr_err("error %d\n", rc);
2493 goto rw_error;
2494 }
2495
2496 switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
2497 case 0:
2498 /* ignore (bypass ?) */
2499 break;
2500 case 1:
2501 /* 27 MHz */
2502 common_attr->osc_clock_freq = 27000;
2503 break;
2504 case 2:
2505 /* 20.25 MHz */
2506 common_attr->osc_clock_freq = 20250;
2507 break;
2508 case 3:
2509 /* 4 MHz */
2510 common_attr->osc_clock_freq = 4000;
2511 break;
2512 default:
2513 return -EIO;
2514 }
2515
2516 /*
2517 Determine device capabilities
2518 Based on pinning v47
2519 */
2520 rc = drxdap_fasi_read_reg32(dev_addr, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo, 0);
2521 if (rc != 0) {
2522 pr_err("error %d\n", rc);
2523 goto rw_error;
2524 }
2525 ext_attr->mfx = (u8) ((sio_top_jtagid_lo >> 29) & 0xF);
2526
2527 switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
2528 case 0x31:
2529 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2530 if (rc != 0) {
2531 pr_err("error %d\n", rc);
2532 goto rw_error;
2533 }
2534 rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_UIO_IN_HI__A, &bid, 0);
2535 if (rc != 0) {
2536 pr_err("error %d\n", rc);
2537 goto rw_error;
2538 }
2539 bid = (bid >> 10) & 0xf;
2540 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2541 if (rc != 0) {
2542 pr_err("error %d\n", rc);
2543 goto rw_error;
2544 }
2545
2546 ext_attr->has_lna = true;
2547 ext_attr->has_ntsc = false;
2548 ext_attr->has_btsc = false;
2549 ext_attr->has_oob = false;
2550 ext_attr->has_smatx = true;
2551 ext_attr->has_smarx = false;
2552 ext_attr->has_gpio = false;
2553 ext_attr->has_irqn = false;
2554 break;
2555 case 0x33:
2556 ext_attr->has_lna = false;
2557 ext_attr->has_ntsc = false;
2558 ext_attr->has_btsc = false;
2559 ext_attr->has_oob = false;
2560 ext_attr->has_smatx = true;
2561 ext_attr->has_smarx = false;
2562 ext_attr->has_gpio = false;
2563 ext_attr->has_irqn = false;
2564 break;
2565 case 0x45:
2566 ext_attr->has_lna = true;
2567 ext_attr->has_ntsc = true;
2568 ext_attr->has_btsc = false;
2569 ext_attr->has_oob = false;
2570 ext_attr->has_smatx = true;
2571 ext_attr->has_smarx = true;
2572 ext_attr->has_gpio = true;
2573 ext_attr->has_irqn = false;
2574 break;
2575 case 0x46:
2576 ext_attr->has_lna = false;
2577 ext_attr->has_ntsc = true;
2578 ext_attr->has_btsc = false;
2579 ext_attr->has_oob = false;
2580 ext_attr->has_smatx = true;
2581 ext_attr->has_smarx = true;
2582 ext_attr->has_gpio = true;
2583 ext_attr->has_irqn = false;
2584 break;
2585 case 0x41:
2586 ext_attr->has_lna = true;
2587 ext_attr->has_ntsc = true;
2588 ext_attr->has_btsc = true;
2589 ext_attr->has_oob = false;
2590 ext_attr->has_smatx = true;
2591 ext_attr->has_smarx = true;
2592 ext_attr->has_gpio = true;
2593 ext_attr->has_irqn = false;
2594 break;
2595 case 0x43:
2596 ext_attr->has_lna = false;
2597 ext_attr->has_ntsc = true;
2598 ext_attr->has_btsc = true;
2599 ext_attr->has_oob = false;
2600 ext_attr->has_smatx = true;
2601 ext_attr->has_smarx = true;
2602 ext_attr->has_gpio = true;
2603 ext_attr->has_irqn = false;
2604 break;
2605 case 0x32:
2606 ext_attr->has_lna = true;
2607 ext_attr->has_ntsc = false;
2608 ext_attr->has_btsc = false;
2609 ext_attr->has_oob = true;
2610 ext_attr->has_smatx = true;
2611 ext_attr->has_smarx = true;
2612 ext_attr->has_gpio = true;
2613 ext_attr->has_irqn = true;
2614 break;
2615 case 0x34:
2616 ext_attr->has_lna = false;
2617 ext_attr->has_ntsc = true;
2618 ext_attr->has_btsc = true;
2619 ext_attr->has_oob = true;
2620 ext_attr->has_smatx = true;
2621 ext_attr->has_smarx = true;
2622 ext_attr->has_gpio = true;
2623 ext_attr->has_irqn = true;
2624 break;
2625 case 0x42:
2626 ext_attr->has_lna = true;
2627 ext_attr->has_ntsc = true;
2628 ext_attr->has_btsc = true;
2629 ext_attr->has_oob = true;
2630 ext_attr->has_smatx = true;
2631 ext_attr->has_smarx = true;
2632 ext_attr->has_gpio = true;
2633 ext_attr->has_irqn = true;
2634 break;
2635 case 0x44:
2636 ext_attr->has_lna = false;
2637 ext_attr->has_ntsc = true;
2638 ext_attr->has_btsc = true;
2639 ext_attr->has_oob = true;
2640 ext_attr->has_smatx = true;
2641 ext_attr->has_smarx = true;
2642 ext_attr->has_gpio = true;
2643 ext_attr->has_irqn = true;
2644 break;
2645 default:
2646 /* Unknown device variant */
2647 return -EIO;
2648 break;
2649 }
2650
2651 return 0;
2652 rw_error:
2653 return rc;
2654 }
2655
2656 /**
2657 * \fn int power_up_device()
2658 * \brief Power up device.
2659 * \param demod Pointer to demodulator instance.
2660 * \return int.
2661 * \return 0 Success
2662 * \retval -EIO Failure, I2C or max retries reached
2663 *
2664 */
2665
2666 #ifndef DRXJ_MAX_RETRIES_POWERUP
2667 #define DRXJ_MAX_RETRIES_POWERUP 10
2668 #endif
2669
2670 static int power_up_device(struct drx_demod_instance *demod)
2671 {
2672 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2673 u8 data = 0;
2674 u16 retry_count = 0;
2675 struct i2c_device_addr wake_up_addr;
2676
2677 dev_addr = demod->my_i2c_dev_addr;
2678 wake_up_addr.i2c_addr = DRXJ_WAKE_UP_KEY;
2679 wake_up_addr.i2c_dev_id = dev_addr->i2c_dev_id;
2680 wake_up_addr.user_data = dev_addr->user_data;
2681 /*
2682 * I2C access may fail in this case: no ack
2683 * dummy write must be used to wake uop device, dummy read must be used to
2684 * reset HI state machine (avoiding actual writes)
2685 */
2686 do {
2687 data = 0;
2688 drxbsp_i2c_write_read(&wake_up_addr, 1, &data,
2689 (struct i2c_device_addr *)(NULL), 0,
2690 (u8 *)(NULL));
2691 msleep(10);
2692 retry_count++;
2693 } while ((drxbsp_i2c_write_read
2694 ((struct i2c_device_addr *) (NULL), 0, (u8 *)(NULL), dev_addr, 1,
2695 &data)
2696 != 0) && (retry_count < DRXJ_MAX_RETRIES_POWERUP));
2697
2698 /* Need some recovery time .... */
2699 msleep(10);
2700
2701 if (retry_count == DRXJ_MAX_RETRIES_POWERUP)
2702 return -EIO;
2703
2704 return 0;
2705 }
2706
2707 /*----------------------------------------------------------------------------*/
2708 /* MPEG Output Configuration Functions - begin */
2709 /*----------------------------------------------------------------------------*/
2710 /**
2711 * \fn int ctrl_set_cfg_mpeg_output()
2712 * \brief Set MPEG output configuration of the device.
2713 * \param devmod Pointer to demodulator instance.
2714 * \param cfg_data Pointer to mpeg output configuaration.
2715 * \return int.
2716 *
2717 * Configure MPEG output parameters.
2718 *
2719 */
2720 static int
2721 ctrl_set_cfg_mpeg_output(struct drx_demod_instance *demod, struct drx_cfg_mpeg_output *cfg_data)
2722 {
2723 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2724 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2725 struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2726 int rc;
2727 u16 fec_oc_reg_mode = 0;
2728 u16 fec_oc_reg_ipr_mode = 0;
2729 u16 fec_oc_reg_ipr_invert = 0;
2730 u32 max_bit_rate = 0;
2731 u32 rcn_rate = 0;
2732 u32 nr_bits = 0;
2733 u16 sio_pdr_md_cfg = 0;
2734 /* data mask for the output data byte */
2735 u16 invert_data_mask =
2736 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2737 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2738 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2739 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2740
2741 /* check arguments */
2742 if ((demod == NULL) || (cfg_data == NULL))
2743 return -EINVAL;
2744
2745 dev_addr = demod->my_i2c_dev_addr;
2746 ext_attr = (struct drxj_data *) demod->my_ext_attr;
2747 common_attr = (struct drx_common_attr *) demod->my_common_attr;
2748
2749 if (cfg_data->enable_mpeg_output == true) {
2750 /* quick and dirty patch to set MPEG incase current std is not
2751 producing MPEG */
2752 switch (ext_attr->standard) {
2753 case DRX_STANDARD_8VSB:
2754 case DRX_STANDARD_ITU_A:
2755 case DRX_STANDARD_ITU_B:
2756 case DRX_STANDARD_ITU_C:
2757 break;
2758 default:
2759 return 0;
2760 }
2761
2762 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_OCR_INVERT__A, 0, 0);
2763 if (rc != 0) {
2764 pr_err("error %d\n", rc);
2765 goto rw_error;
2766 }
2767 switch (ext_attr->standard) {
2768 case DRX_STANDARD_8VSB:
2769 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, 7, 0);
2770 if (rc != 0) {
2771 pr_err("error %d\n", rc);
2772 goto rw_error;
2773 } /* 2048 bytes fifo ram */
2774 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, 10, 0);
2775 if (rc != 0) {
2776 pr_err("error %d\n", rc);
2777 goto rw_error;
2778 }
2779 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 10, 0);
2780 if (rc != 0) {
2781 pr_err("error %d\n", rc);
2782 goto rw_error;
2783 }
2784 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, 5, 0);
2785 if (rc != 0) {
2786 pr_err("error %d\n", rc);
2787 goto rw_error;
2788 }
2789 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, 7, 0);
2790 if (rc != 0) {
2791 pr_err("error %d\n", rc);
2792 goto rw_error;
2793 }
2794 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 10, 0);
2795 if (rc != 0) {
2796 pr_err("error %d\n", rc);
2797 goto rw_error;
2798 }
2799 /* Low Water Mark for synchronization */
2800 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 3, 0);
2801 if (rc != 0) {
2802 pr_err("error %d\n", rc);
2803 goto rw_error;
2804 }
2805 /* High Water Mark for synchronization */
2806 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 5, 0);
2807 if (rc != 0) {
2808 pr_err("error %d\n", rc);
2809 goto rw_error;
2810 }
2811 break;
2812 case DRX_STANDARD_ITU_A:
2813 case DRX_STANDARD_ITU_C:
2814 switch (ext_attr->constellation) {
2815 case DRX_CONSTELLATION_QAM256:
2816 nr_bits = 8;
2817 break;
2818 case DRX_CONSTELLATION_QAM128:
2819 nr_bits = 7;
2820 break;
2821 case DRX_CONSTELLATION_QAM64:
2822 nr_bits = 6;
2823 break;
2824 case DRX_CONSTELLATION_QAM32:
2825 nr_bits = 5;
2826 break;
2827 case DRX_CONSTELLATION_QAM16:
2828 nr_bits = 4;
2829 break;
2830 default:
2831 return -EIO;
2832 } /* ext_attr->constellation */
2833 /* max_bit_rate = symbol_rate * nr_bits * coef */
2834 /* coef = 188/204 */
2835 max_bit_rate =
2836 (ext_attr->curr_symbol_rate / 8) * nr_bits * 188;
2837 /* pass through b/c Annex A/c need following settings */
2838 case DRX_STANDARD_ITU_B:
2839 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, FEC_OC_FCT_USAGE__PRE, 0);
2840 if (rc != 0) {
2841 pr_err("error %d\n", rc);
2842 goto rw_error;
2843 }
2844 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, FEC_OC_TMD_CTL_UPD_RATE__PRE, 0);
2845 if (rc != 0) {
2846 pr_err("error %d\n", rc);
2847 goto rw_error;
2848 }
2849 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 5, 0);
2850 if (rc != 0) {
2851 pr_err("error %d\n", rc);
2852 goto rw_error;
2853 }
2854 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, FEC_OC_AVR_PARM_A__PRE, 0);
2855 if (rc != 0) {
2856 pr_err("error %d\n", rc);
2857 goto rw_error;
2858 }
2859 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, FEC_OC_AVR_PARM_B__PRE, 0);
2860 if (rc != 0) {
2861 pr_err("error %d\n", rc);
2862 goto rw_error;
2863 }
2864 if (cfg_data->static_clk == true) {
2865 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 0xD, 0);
2866 if (rc != 0) {
2867 pr_err("error %d\n", rc);
2868 goto rw_error;
2869 }
2870 } else {
2871 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, FEC_OC_RCN_GAIN__PRE, 0);
2872 if (rc != 0) {
2873 pr_err("error %d\n", rc);
2874 goto rw_error;
2875 }
2876 }
2877 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 2, 0);
2878 if (rc != 0) {
2879 pr_err("error %d\n", rc);
2880 goto rw_error;
2881 }
2882 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 12, 0);
2883 if (rc != 0) {
2884 pr_err("error %d\n", rc);
2885 goto rw_error;
2886 }
2887 break;
2888 default:
2889 break;
2890 } /* swtich (standard) */
2891
2892 /* Check insertion of the Reed-Solomon parity bytes */
2893 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
2894 if (rc != 0) {
2895 pr_err("error %d\n", rc);
2896 goto rw_error;
2897 }
2898 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode, 0);
2899 if (rc != 0) {
2900 pr_err("error %d\n", rc);
2901 goto rw_error;
2902 }
2903 if (cfg_data->insert_rs_byte == true) {
2904 /* enable parity symbol forward */
2905 fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
2906 /* MVAL disable during parity bytes */
2907 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2908 switch (ext_attr->standard) {
2909 case DRX_STANDARD_8VSB:
2910 rcn_rate = 0x004854D3;
2911 break;
2912 case DRX_STANDARD_ITU_B:
2913 fec_oc_reg_mode |= FEC_OC_MODE_TRANSPARENT__M;
2914 switch (ext_attr->constellation) {
2915 case DRX_CONSTELLATION_QAM256:
2916 rcn_rate = 0x008945E7;
2917 break;
2918 case DRX_CONSTELLATION_QAM64:
2919 rcn_rate = 0x005F64D4;
2920 break;
2921 default:
2922 return -EIO;
2923 }
2924 break;
2925 case DRX_STANDARD_ITU_A:
2926 case DRX_STANDARD_ITU_C:
2927 /* insert_rs_byte = true -> coef = 188/188 -> 1, RS bits are in MPEG output */
2928 rcn_rate =
2929 (frac28
2930 (max_bit_rate,
2931 (u32) (common_attr->sys_clock_freq / 8))) /
2932 188;
2933 break;
2934 default:
2935 return -EIO;
2936 } /* ext_attr->standard */
2937 } else { /* insert_rs_byte == false */
2938
2939 /* disable parity symbol forward */
2940 fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
2941 /* MVAL enable during parity bytes */
2942 fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2943 switch (ext_attr->standard) {
2944 case DRX_STANDARD_8VSB:
2945 rcn_rate = 0x0041605C;
2946 break;
2947 case DRX_STANDARD_ITU_B:
2948 fec_oc_reg_mode &= (~FEC_OC_MODE_TRANSPARENT__M);
2949 switch (ext_attr->constellation) {
2950 case DRX_CONSTELLATION_QAM256:
2951 rcn_rate = 0x0082D6A0;
2952 break;
2953 case DRX_CONSTELLATION_QAM64:
2954 rcn_rate = 0x005AEC1A;
2955 break;
2956 default:
2957 return -EIO;
2958 }
2959 break;
2960 case DRX_STANDARD_ITU_A:
2961 case DRX_STANDARD_ITU_C:
2962 /* insert_rs_byte = false -> coef = 188/204, RS bits not in MPEG output */
2963 rcn_rate =
2964 (frac28
2965 (max_bit_rate,
2966 (u32) (common_attr->sys_clock_freq / 8))) /
2967 204;
2968 break;
2969 default:
2970 return -EIO;
2971 } /* ext_attr->standard */
2972 }
2973
2974 if (cfg_data->enable_parallel == true) { /* MPEG data output is paralel -> clear ipr_mode[0] */
2975 fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2976 } else { /* MPEG data output is serial -> set ipr_mode[0] */
2977 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
2978 }
2979
2980 /* Control slective inversion of output bits */
2981 if (cfg_data->invert_data == true)
2982 fec_oc_reg_ipr_invert |= invert_data_mask;
2983 else
2984 fec_oc_reg_ipr_invert &= (~(invert_data_mask));
2985
2986 if (cfg_data->invert_err == true)
2987 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
2988 else
2989 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2990
2991 if (cfg_data->invert_str == true)
2992 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
2993 else
2994 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2995
2996 if (cfg_data->invert_val == true)
2997 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
2998 else
2999 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
3000
3001 if (cfg_data->invert_clk == true)
3002 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
3003 else
3004 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
3005
3006
3007 if (cfg_data->static_clk == true) { /* Static mode */
3008 u32 dto_rate = 0;
3009 u32 bit_rate = 0;
3010 u16 fec_oc_dto_burst_len = 0;
3011 u16 fec_oc_dto_period = 0;
3012
3013 fec_oc_dto_burst_len = FEC_OC_DTO_BURST_LEN__PRE;
3014
3015 switch (ext_attr->standard) {
3016 case DRX_STANDARD_8VSB:
3017 fec_oc_dto_period = 4;
3018 if (cfg_data->insert_rs_byte == true)
3019 fec_oc_dto_burst_len = 208;
3020 break;
3021 case DRX_STANDARD_ITU_A:
3022 {
3023 u32 symbol_rate_th = 6400000;
3024 if (cfg_data->insert_rs_byte == true) {
3025 fec_oc_dto_burst_len = 204;
3026 symbol_rate_th = 5900000;
3027 }
3028 if (ext_attr->curr_symbol_rate >=
3029 symbol_rate_th) {
3030 fec_oc_dto_period = 0;
3031 } else {
3032 fec_oc_dto_period = 1;
3033 }
3034 }
3035 break;
3036 case DRX_STANDARD_ITU_B:
3037 fec_oc_dto_period = 1;
3038 if (cfg_data->insert_rs_byte == true)
3039 fec_oc_dto_burst_len = 128;
3040 break;
3041 case DRX_STANDARD_ITU_C:
3042 fec_oc_dto_period = 1;
3043 if (cfg_data->insert_rs_byte == true)
3044 fec_oc_dto_burst_len = 204;
3045 break;
3046 default:
3047 return -EIO;
3048 }
3049 bit_rate =
3050 common_attr->sys_clock_freq * 1000 / (fec_oc_dto_period +
3051 2);
3052 dto_rate =
3053 frac28(bit_rate, common_attr->sys_clock_freq * 1000);
3054 dto_rate >>= 3;
3055 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_HI__A, (u16)((dto_rate >> 16) & FEC_OC_DTO_RATE_HI__M), 0);
3056 if (rc != 0) {
3057 pr_err("error %d\n", rc);
3058 goto rw_error;
3059 }
3060 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_LO__A, (u16)(dto_rate & FEC_OC_DTO_RATE_LO_RATE_LO__M), 0);
3061 if (rc != 0) {
3062 pr_err("error %d\n", rc);
3063 goto rw_error;
3064 }
3065 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M | FEC_OC_DTO_MODE_OFFSET_ENABLE__M, 0);
3066 if (rc != 0) {
3067 pr_err("error %d\n", rc);
3068 goto rw_error;
3069 }
3070 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, FEC_OC_FCT_MODE_RAT_ENA__M | FEC_OC_FCT_MODE_VIRT_ENA__M, 0);
3071 if (rc != 0) {
3072 pr_err("error %d\n", rc);
3073 goto rw_error;
3074 }
3075 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len, 0);
3076 if (rc != 0) {
3077 pr_err("error %d\n", rc);
3078 goto rw_error;
3079 }
3080 if (ext_attr->mpeg_output_clock_rate != DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO)
3081 fec_oc_dto_period = ext_attr->mpeg_output_clock_rate - 1;
3082 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period, 0);
3083 if (rc != 0) {
3084 pr_err("error %d\n", rc);
3085 goto rw_error;
3086 }
3087 } else { /* Dynamic mode */
3088
3089 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M, 0);
3090 if (rc != 0) {
3091 pr_err("error %d\n", rc);
3092 goto rw_error;
3093 }
3094 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, 0, 0);
3095 if (rc != 0) {
3096 pr_err("error %d\n", rc);
3097 goto rw_error;
3098 }
3099 }
3100
3101 rc = drxdap_fasi_write_reg32(dev_addr, FEC_OC_RCN_CTL_RATE_LO__A, rcn_rate, 0);
3102 if (rc != 0) {
3103 pr_err("error %d\n", rc);
3104 goto rw_error;
3105 }
3106
3107 /* Write appropriate registers with requested configuration */
3108 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode, 0);
3109 if (rc != 0) {
3110 pr_err("error %d\n", rc);
3111 goto rw_error;
3112 }
3113 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode, 0);
3114 if (rc != 0) {
3115 pr_err("error %d\n", rc);
3116 goto rw_error;
3117 }
3118 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert, 0);
3119 if (rc != 0) {
3120 pr_err("error %d\n", rc);
3121 goto rw_error;
3122 }
3123
3124 /* enabling for both parallel and serial now */
3125 /* Write magic word to enable pdr reg write */
3126 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3127 if (rc != 0) {
3128 pr_err("error %d\n", rc);
3129 goto rw_error;
3130 }
3131 /* Set MPEG TS pads to outputmode */
3132 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0013, 0);
3133 if (rc != 0) {
3134 pr_err("error %d\n", rc);
3135 goto rw_error;
3136 }
3137 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0013, 0);
3138 if (rc != 0) {
3139 pr_err("error %d\n", rc);
3140 goto rw_error;
3141 }
3142 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, MPEG_OUTPUT_CLK_DRIVE_STRENGTH << SIO_PDR_MCLK_CFG_DRIVE__B | 0x03 << SIO_PDR_MCLK_CFG_MODE__B, 0);
3143 if (rc != 0) {
3144 pr_err("error %d\n", rc);
3145 goto rw_error;
3146 }
3147 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0013, 0);
3148 if (rc != 0) {
3149 pr_err("error %d\n", rc);
3150 goto rw_error;
3151 }
3152 sio_pdr_md_cfg =
3153 MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH <<
3154 SIO_PDR_MD0_CFG_DRIVE__B | 0x03 << SIO_PDR_MD0_CFG_MODE__B;
3155 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3156 if (rc != 0) {
3157 pr_err("error %d\n", rc);
3158 goto rw_error;
3159 }
3160 if (cfg_data->enable_parallel == true) { /* MPEG data output is paralel -> set MD1 to MD7 to output mode */
3161 sio_pdr_md_cfg =
3162 MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH <<
3163 SIO_PDR_MD0_CFG_DRIVE__B | 0x03 <<
3164 SIO_PDR_MD0_CFG_MODE__B;
3165 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3166 if (rc != 0) {
3167 pr_err("error %d\n", rc);
3168 goto rw_error;
3169 }
3170 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, sio_pdr_md_cfg, 0);
3171 if (rc != 0) {
3172 pr_err("error %d\n", rc);
3173 goto rw_error;
3174 }
3175 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, sio_pdr_md_cfg, 0);
3176 if (rc != 0) {
3177 pr_err("error %d\n", rc);
3178 goto rw_error;
3179 }
3180 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, sio_pdr_md_cfg, 0);
3181 if (rc != 0) {
3182 pr_err("error %d\n", rc);
3183 goto rw_error;
3184 }
3185 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, sio_pdr_md_cfg, 0);
3186 if (rc != 0) {
3187 pr_err("error %d\n", rc);
3188 goto rw_error;
3189 }
3190 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, sio_pdr_md_cfg, 0);
3191 if (rc != 0) {
3192 pr_err("error %d\n", rc);
3193 goto rw_error;
3194 }
3195 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, sio_pdr_md_cfg, 0);
3196 if (rc != 0) {
3197 pr_err("error %d\n", rc);
3198 goto rw_error;
3199 }
3200 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, sio_pdr_md_cfg, 0);
3201 if (rc != 0) {
3202 pr_err("error %d\n", rc);
3203 goto rw_error;
3204 }
3205 } else { /* MPEG data output is serial -> set MD1 to MD7 to tri-state */
3206 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3207 if (rc != 0) {
3208 pr_err("error %d\n", rc);
3209 goto rw_error;
3210 }
3211 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3212 if (rc != 0) {
3213 pr_err("error %d\n", rc);
3214 goto rw_error;
3215 }
3216 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3217 if (rc != 0) {
3218 pr_err("error %d\n", rc);
3219 goto rw_error;
3220 }
3221 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3222 if (rc != 0) {
3223 pr_err("error %d\n", rc);
3224 goto rw_error;
3225 }
3226 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3227 if (rc != 0) {
3228 pr_err("error %d\n", rc);
3229 goto rw_error;
3230 }
3231 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3232 if (rc != 0) {
3233 pr_err("error %d\n", rc);
3234 goto rw_error;
3235 }
3236 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3237 if (rc != 0) {
3238 pr_err("error %d\n", rc);
3239 goto rw_error;
3240 }
3241 }
3242 /* Enable Monitor Bus output over MPEG pads and ctl input */
3243 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3244 if (rc != 0) {
3245 pr_err("error %d\n", rc);
3246 goto rw_error;
3247 }
3248 /* Write nomagic word to enable pdr reg write */
3249 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3250 if (rc != 0) {
3251 pr_err("error %d\n", rc);
3252 goto rw_error;
3253 }
3254 } else {
3255 /* Write magic word to enable pdr reg write */
3256 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3257 if (rc != 0) {
3258 pr_err("error %d\n", rc);
3259 goto rw_error;
3260 }
3261 /* Set MPEG TS pads to inputmode */
3262 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0000, 0);
3263 if (rc != 0) {
3264 pr_err("error %d\n", rc);
3265 goto rw_error;
3266 }
3267 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0000, 0);
3268 if (rc != 0) {
3269 pr_err("error %d\n", rc);
3270 goto rw_error;
3271 }
3272 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, 0x0000, 0);
3273 if (rc != 0) {
3274 pr_err("error %d\n", rc);
3275 goto rw_error;
3276 }
3277 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0000, 0);
3278 if (rc != 0) {
3279 pr_err("error %d\n", rc);
3280 goto rw_error;
3281 }
3282 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, 0x0000, 0);
3283 if (rc != 0) {
3284 pr_err("error %d\n", rc);
3285 goto rw_error;
3286 }
3287 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3288 if (rc != 0) {
3289 pr_err("error %d\n", rc);
3290 goto rw_error;
3291 }
3292 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3293 if (rc != 0) {
3294 pr_err("error %d\n", rc);
3295 goto rw_error;
3296 }
3297 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3298 if (rc != 0) {
3299 pr_err("error %d\n", rc);
3300 goto rw_error;
3301 }
3302 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3303 if (rc != 0) {
3304 pr_err("error %d\n", rc);
3305 goto rw_error;
3306 }
3307 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3308 if (rc != 0) {
3309 pr_err("error %d\n", rc);
3310 goto rw_error;
3311 }
3312 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3313 if (rc != 0) {
3314 pr_err("error %d\n", rc);
3315 goto rw_error;
3316 }
3317 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3318 if (rc != 0) {
3319 pr_err("error %d\n", rc);
3320 goto rw_error;
3321 }
3322 /* Enable Monitor Bus output over MPEG pads and ctl input */
3323 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3324 if (rc != 0) {
3325 pr_err("error %d\n", rc);
3326 goto rw_error;
3327 }
3328 /* Write nomagic word to enable pdr reg write */
3329 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3330 if (rc != 0) {
3331 pr_err("error %d\n", rc);
3332 goto rw_error;
3333 }
3334 }
3335
3336 /* save values for restore after re-acquire */
3337 common_attr->mpeg_cfg.enable_mpeg_output = cfg_data->enable_mpeg_output;
3338
3339 return 0;
3340 rw_error:
3341 return rc;
3342 }
3343
3344 /*----------------------------------------------------------------------------*/
3345
3346
3347 /*----------------------------------------------------------------------------*/
3348 /* MPEG Output Configuration Functions - end */
3349 /*----------------------------------------------------------------------------*/
3350
3351 /*----------------------------------------------------------------------------*/
3352 /* miscellaneous configuartions - begin */
3353 /*----------------------------------------------------------------------------*/
3354
3355 /**
3356 * \fn int set_mpegtei_handling()
3357 * \brief Activate MPEG TEI handling settings.
3358 * \param devmod Pointer to demodulator instance.
3359 * \return int.
3360 *
3361 * This routine should be called during a set channel of QAM/VSB
3362 *
3363 */
3364 static int set_mpegtei_handling(struct drx_demod_instance *demod)
3365 {
3366 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3367 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3368 int rc;
3369 u16 fec_oc_dpr_mode = 0;
3370 u16 fec_oc_snc_mode = 0;
3371 u16 fec_oc_ems_mode = 0;
3372
3373 dev_addr = demod->my_i2c_dev_addr;
3374 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3375
3376 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_DPR_MODE__A, &fec_oc_dpr_mode, 0);
3377 if (rc != 0) {
3378 pr_err("error %d\n", rc);
3379 goto rw_error;
3380 }
3381 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
3382 if (rc != 0) {
3383 pr_err("error %d\n", rc);
3384 goto rw_error;
3385 }
3386 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_EMS_MODE__A, &fec_oc_ems_mode, 0);
3387 if (rc != 0) {
3388 pr_err("error %d\n", rc);
3389 goto rw_error;
3390 }
3391
3392 /* reset to default, allow TEI bit to be changed */
3393 fec_oc_dpr_mode &= (~FEC_OC_DPR_MODE_ERR_DISABLE__M);
3394 fec_oc_snc_mode &= (~(FEC_OC_SNC_MODE_ERROR_CTL__M |
3395 FEC_OC_SNC_MODE_CORR_DISABLE__M));
3396 fec_oc_ems_mode &= (~FEC_OC_EMS_MODE_MODE__M);
3397
3398 if (ext_attr->disable_te_ihandling) {
3399 /* do not change TEI bit */
3400 fec_oc_dpr_mode |= FEC_OC_DPR_MODE_ERR_DISABLE__M;
3401 fec_oc_snc_mode |= FEC_OC_SNC_MODE_CORR_DISABLE__M |
3402 ((0x2) << (FEC_OC_SNC_MODE_ERROR_CTL__B));
3403 fec_oc_ems_mode |= ((0x01) << (FEC_OC_EMS_MODE_MODE__B));
3404 }
3405
3406 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DPR_MODE__A, fec_oc_dpr_mode, 0);
3407 if (rc != 0) {
3408 pr_err("error %d\n", rc);
3409 goto rw_error;
3410 }
3411 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode, 0);
3412 if (rc != 0) {
3413 pr_err("error %d\n", rc);
3414 goto rw_error;
3415 }
3416 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_EMS_MODE__A, fec_oc_ems_mode, 0);
3417 if (rc != 0) {
3418 pr_err("error %d\n", rc);
3419 goto rw_error;
3420 }
3421
3422 return 0;
3423 rw_error:
3424 return rc;
3425 }
3426
3427 /*----------------------------------------------------------------------------*/
3428 /**
3429 * \fn int bit_reverse_mpeg_output()
3430 * \brief Set MPEG output bit-endian settings.
3431 * \param devmod Pointer to demodulator instance.
3432 * \return int.
3433 *
3434 * This routine should be called during a set channel of QAM/VSB
3435 *
3436 */
3437 static int bit_reverse_mpeg_output(struct drx_demod_instance *demod)
3438 {
3439 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3440 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3441 int rc;
3442 u16 fec_oc_ipr_mode = 0;
3443
3444 dev_addr = demod->my_i2c_dev_addr;
3445 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3446
3447 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode, 0);
3448 if (rc != 0) {
3449 pr_err("error %d\n", rc);
3450 goto rw_error;
3451 }
3452
3453 /* reset to default (normal bit order) */
3454 fec_oc_ipr_mode &= (~FEC_OC_IPR_MODE_REVERSE_ORDER__M);
3455
3456 if (ext_attr->bit_reverse_mpeg_outout)
3457 fec_oc_ipr_mode |= FEC_OC_IPR_MODE_REVERSE_ORDER__M;
3458
3459 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode, 0);
3460 if (rc != 0) {
3461 pr_err("error %d\n", rc);
3462 goto rw_error;
3463 }
3464
3465 return 0;
3466 rw_error:
3467 return rc;
3468 }
3469
3470 /*----------------------------------------------------------------------------*/
3471 /**
3472 * \fn int set_mpeg_start_width()
3473 * \brief Set MPEG start width.
3474 * \param devmod Pointer to demodulator instance.
3475 * \return int.
3476 *
3477 * This routine should be called during a set channel of QAM/VSB
3478 *
3479 */
3480 static int set_mpeg_start_width(struct drx_demod_instance *demod)
3481 {
3482 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3483 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3484 struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
3485 int rc;
3486 u16 fec_oc_comm_mb = 0;
3487
3488 dev_addr = demod->my_i2c_dev_addr;
3489 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3490 common_attr = demod->my_common_attr;
3491
3492 if ((common_attr->mpeg_cfg.static_clk == true)
3493 && (common_attr->mpeg_cfg.enable_parallel == false)) {
3494 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_COMM_MB__A, &fec_oc_comm_mb, 0);
3495 if (rc != 0) {
3496 pr_err("error %d\n", rc);
3497 goto rw_error;
3498 }
3499 fec_oc_comm_mb &= ~FEC_OC_COMM_MB_CTL_ON;
3500 if (ext_attr->mpeg_start_width == DRXJ_MPEG_START_WIDTH_8CLKCYC)
3501 fec_oc_comm_mb |= FEC_OC_COMM_MB_CTL_ON;
3502 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_COMM_MB__A, fec_oc_comm_mb, 0);
3503 if (rc != 0) {
3504 pr_err("error %d\n", rc);
3505 goto rw_error;
3506 }
3507 }
3508
3509 return 0;
3510 rw_error:
3511 return rc;
3512 }
3513
3514 /*----------------------------------------------------------------------------*/
3515 /* miscellaneous configuartions - end */
3516 /*----------------------------------------------------------------------------*/
3517
3518 /*----------------------------------------------------------------------------*/
3519 /* UIO Configuration Functions - begin */
3520 /*----------------------------------------------------------------------------*/
3521 /**
3522 * \fn int ctrl_set_uio_cfg()
3523 * \brief Configure modus oprandi UIO.
3524 * \param demod Pointer to demodulator instance.
3525 * \param uio_cfg Pointer to a configuration setting for a certain UIO.
3526 * \return int.
3527 */
3528 static int ctrl_set_uio_cfg(struct drx_demod_instance *demod, struct drxuio_cfg *uio_cfg)
3529 {
3530 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3531 int rc;
3532
3533 if ((uio_cfg == NULL) || (demod == NULL))
3534 return -EINVAL;
3535
3536 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3537
3538 /* Write magic word to enable pdr reg write */
3539 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3540 if (rc != 0) {
3541 pr_err("error %d\n", rc);
3542 goto rw_error;
3543 }
3544 switch (uio_cfg->uio) {
3545 /*====================================================================*/
3546 case DRX_UIO1:
3547 /* DRX_UIO1: SMA_TX UIO-1 */
3548 if (!ext_attr->has_smatx)
3549 return -EIO;
3550 switch (uio_cfg->mode) {
3551 case DRX_UIO_MODE_FIRMWARE_SMA: /* falltrough */
3552 case DRX_UIO_MODE_FIRMWARE_SAW: /* falltrough */
3553 case DRX_UIO_MODE_READWRITE:
3554 ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3555 break;
3556 case DRX_UIO_MODE_DISABLE:
3557 ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3558 /* pad configuration register is set 0 - input mode */
3559 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0, 0);
3560 if (rc != 0) {
3561 pr_err("error %d\n", rc);
3562 goto rw_error;
3563 }
3564 break;
3565 default:
3566 return -EINVAL;
3567 } /* switch ( uio_cfg->mode ) */
3568 break;
3569 /*====================================================================*/
3570 case DRX_UIO2:
3571 /* DRX_UIO2: SMA_RX UIO-2 */
3572 if (!ext_attr->has_smarx)
3573 return -EIO;
3574 switch (uio_cfg->mode) {
3575 case DRX_UIO_MODE_FIRMWARE0: /* falltrough */
3576 case DRX_UIO_MODE_READWRITE:
3577 ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3578 break;
3579 case DRX_UIO_MODE_DISABLE:
3580 ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3581 /* pad configuration register is set 0 - input mode */
3582 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, 0, 0);
3583 if (rc != 0) {
3584 pr_err("error %d\n", rc);
3585 goto rw_error;
3586 }
3587 break;
3588 default:
3589 return -EINVAL;
3590 break;
3591 } /* switch ( uio_cfg->mode ) */
3592 break;
3593 /*====================================================================*/
3594 case DRX_UIO3:
3595 /* DRX_UIO3: GPIO UIO-3 */
3596 if (!ext_attr->has_gpio)
3597 return -EIO;
3598 switch (uio_cfg->mode) {
3599 case DRX_UIO_MODE_FIRMWARE0: /* falltrough */
3600 case DRX_UIO_MODE_READWRITE:
3601 ext_attr->uio_gpio_mode = uio_cfg->mode;
3602 break;
3603 case DRX_UIO_MODE_DISABLE:
3604 ext_attr->uio_gpio_mode = uio_cfg->mode;
3605 /* pad configuration register is set 0 - input mode */
3606 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, 0, 0);
3607 if (rc != 0) {
3608 pr_err("error %d\n", rc);
3609 goto rw_error;
3610 }
3611 break;
3612 default:
3613 return -EINVAL;
3614 break;
3615 } /* switch ( uio_cfg->mode ) */
3616 break;
3617 /*====================================================================*/
3618 case DRX_UIO4:
3619 /* DRX_UIO4: IRQN UIO-4 */
3620 if (!ext_attr->has_irqn)
3621 return -EIO;
3622 switch (uio_cfg->mode) {
3623 case DRX_UIO_MODE_READWRITE:
3624 ext_attr->uio_irqn_mode = uio_cfg->mode;
3625 break;
3626 case DRX_UIO_MODE_DISABLE:
3627 /* pad configuration register is set 0 - input mode */
3628 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, 0, 0);
3629 if (rc != 0) {
3630 pr_err("error %d\n", rc);
3631 goto rw_error;
3632 }
3633 ext_attr->uio_irqn_mode = uio_cfg->mode;
3634 break;
3635 case DRX_UIO_MODE_FIRMWARE0: /* falltrough */
3636 default:
3637 return -EINVAL;
3638 break;
3639 } /* switch ( uio_cfg->mode ) */
3640 break;
3641 /*====================================================================*/
3642 default:
3643 return -EINVAL;
3644 } /* switch ( uio_cfg->uio ) */
3645
3646 /* Write magic word to disable pdr reg write */
3647 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3648 if (rc != 0) {
3649 pr_err("error %d\n", rc);
3650 goto rw_error;
3651 }
3652
3653 return 0;
3654 rw_error:
3655 return rc;
3656 }
3657
3658 /**
3659 * \fn int ctrl_uio_write()
3660 * \brief Write to a UIO.
3661 * \param demod Pointer to demodulator instance.
3662 * \param uio_data Pointer to data container for a certain UIO.
3663 * \return int.
3664 */
3665 static int
3666 ctrl_uio_write(struct drx_demod_instance *demod, struct drxuio_data *uio_data)
3667 {
3668 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3669 int rc;
3670 u16 pin_cfg_value = 0;
3671 u16 value = 0;
3672
3673 if ((uio_data == NULL) || (demod == NULL))
3674 return -EINVAL;
3675
3676 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3677
3678 /* Write magic word to enable pdr reg write */
3679 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3680 if (rc != 0) {
3681 pr_err("error %d\n", rc);
3682 goto rw_error;
3683 }
3684 switch (uio_data->uio) {
3685 /*====================================================================*/
3686 case DRX_UIO1:
3687 /* DRX_UIO1: SMA_TX UIO-1 */
3688 if (!ext_attr->has_smatx)
3689 return -EIO;
3690 if ((ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_READWRITE)
3691 && (ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_FIRMWARE_SAW)) {
3692 return -EIO;
3693 }
3694 pin_cfg_value = 0;
3695 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3696 pin_cfg_value |= 0x0113;
3697 /* io_pad_cfg_mode output mode is drive always */
3698 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3699
3700 /* write to io pad configuration register - output mode */
3701 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, pin_cfg_value, 0);
3702 if (rc != 0) {
3703 pr_err("error %d\n", rc);
3704 goto rw_error;
3705 }
3706
3707 /* use corresponding bit in io data output registar */
3708 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3709 if (rc != 0) {
3710 pr_err("error %d\n", rc);
3711 goto rw_error;
3712 }
3713 if (!uio_data->value)
3714 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
3715 else
3716 value |= 0x8000; /* write one to 15th bit - 1st UIO */
3717
3718 /* write back to io data output register */
3719 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3720 if (rc != 0) {
3721 pr_err("error %d\n", rc);
3722 goto rw_error;
3723 }
3724 break;
3725 /*======================================================================*/
3726 case DRX_UIO2:
3727 /* DRX_UIO2: SMA_RX UIO-2 */
3728 if (!ext_attr->has_smarx)
3729 return -EIO;
3730 if (ext_attr->uio_sma_rx_mode != DRX_UIO_MODE_READWRITE)
3731 return -EIO;
3732
3733 pin_cfg_value = 0;
3734 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3735 pin_cfg_value |= 0x0113;
3736 /* io_pad_cfg_mode output mode is drive always */
3737 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3738
3739 /* write to io pad configuration register - output mode */
3740 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, pin_cfg_value, 0);
3741 if (rc != 0) {
3742 pr_err("error %d\n", rc);
3743 goto rw_error;
3744 }
3745
3746 /* use corresponding bit in io data output registar */
3747 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3748 if (rc != 0) {
3749 pr_err("error %d\n", rc);
3750 goto rw_error;
3751 }
3752 if (!uio_data->value)
3753 value &= 0xBFFF; /* write zero to 14th bit - 2nd UIO */
3754 else
3755 value |= 0x4000; /* write one to 14th bit - 2nd UIO */
3756
3757 /* write back to io data output register */
3758 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3759 if (rc != 0) {
3760 pr_err("error %d\n", rc);
3761 goto rw_error;
3762 }
3763 break;
3764 /*====================================================================*/
3765 case DRX_UIO3:
3766 /* DRX_UIO3: ASEL UIO-3 */
3767 if (!ext_attr->has_gpio)
3768 return -EIO;
3769 if (ext_attr->uio_gpio_mode != DRX_UIO_MODE_READWRITE)
3770 return -EIO;
3771
3772 pin_cfg_value = 0;
3773 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3774 pin_cfg_value |= 0x0113;
3775 /* io_pad_cfg_mode output mode is drive always */
3776 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3777
3778 /* write to io pad configuration register - output mode */
3779 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, pin_cfg_value, 0);
3780 if (rc != 0) {
3781 pr_err("error %d\n", rc);
3782 goto rw_error;
3783 }
3784
3785 /* use corresponding bit in io data output registar */
3786 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, &value, 0);
3787 if (rc != 0) {
3788 pr_err("error %d\n", rc);
3789 goto rw_error;
3790 }
3791 if (!uio_data->value)
3792 value &= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
3793 else
3794 value |= 0x0004; /* write one to 2nd bit - 3rd UIO */
3795
3796 /* write back to io data output register */
3797 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, value, 0);
3798 if (rc != 0) {
3799 pr_err("error %d\n", rc);
3800 goto rw_error;
3801 }
3802 break;
3803 /*=====================================================================*/
3804 case DRX_UIO4:
3805 /* DRX_UIO4: IRQN UIO-4 */
3806 if (!ext_attr->has_irqn)
3807 return -EIO;
3808
3809 if (ext_attr->uio_irqn_mode != DRX_UIO_MODE_READWRITE)
3810 return -EIO;
3811
3812 pin_cfg_value = 0;
3813 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
3814 pin_cfg_value |= 0x0113;
3815 /* io_pad_cfg_mode output mode is drive always */
3816 /* io_pad_cfg_drive is set to power 2 (23 mA) */
3817
3818 /* write to io pad configuration register - output mode */
3819 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, pin_cfg_value, 0);
3820 if (rc != 0) {
3821 pr_err("error %d\n", rc);
3822 goto rw_error;
3823 }
3824
3825 /* use corresponding bit in io data output registar */
3826 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3827 if (rc != 0) {
3828 pr_err("error %d\n", rc);
3829 goto rw_error;
3830 }
3831 if (uio_data->value == false)
3832 value &= 0xEFFF; /* write zero to 12th bit - 4th UIO */
3833 else
3834 value |= 0x1000; /* write one to 12th bit - 4th UIO */
3835
3836 /* write back to io data output register */
3837 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3838 if (rc != 0) {
3839 pr_err("error %d\n", rc);
3840 goto rw_error;
3841 }
3842 break;
3843 /*=====================================================================*/
3844 default:
3845 return -EINVAL;
3846 } /* switch ( uio_data->uio ) */
3847
3848 /* Write magic word to disable pdr reg write */
3849 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3850 if (rc != 0) {
3851 pr_err("error %d\n", rc);
3852 goto rw_error;
3853 }
3854
3855 return 0;
3856 rw_error:
3857 return rc;
3858 }
3859
3860 /*---------------------------------------------------------------------------*/
3861 /* UIO Configuration Functions - end */
3862 /*---------------------------------------------------------------------------*/
3863
3864 /*----------------------------------------------------------------------------*/
3865 /* I2C Bridge Functions - begin */
3866 /*----------------------------------------------------------------------------*/
3867 /**
3868 * \fn int ctrl_i2c_bridge()
3869 * \brief Open or close the I2C switch to tuner.
3870 * \param demod Pointer to demodulator instance.
3871 * \param bridge_closed Pointer to bool indication if bridge is closed not.
3872 * \return int.
3873
3874 */
3875 static int
3876 ctrl_i2c_bridge(struct drx_demod_instance *demod, bool *bridge_closed)
3877 {
3878 struct drxj_hi_cmd hi_cmd;
3879 u16 result = 0;
3880
3881 /* check arguments */
3882 if (bridge_closed == NULL)
3883 return -EINVAL;
3884
3885 hi_cmd.cmd = SIO_HI_RA_RAM_CMD_BRDCTRL;
3886 hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
3887 if (*bridge_closed)
3888 hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED;
3889 else
3890 hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN;
3891
3892 return hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
3893 }
3894
3895 /*----------------------------------------------------------------------------*/
3896 /* I2C Bridge Functions - end */
3897 /*----------------------------------------------------------------------------*/
3898
3899 /*----------------------------------------------------------------------------*/
3900 /* Smart antenna Functions - begin */
3901 /*----------------------------------------------------------------------------*/
3902 /**
3903 * \fn int smart_ant_init()
3904 * \brief Initialize Smart Antenna.
3905 * \param pointer to struct drx_demod_instance.
3906 * \return int.
3907 *
3908 */
3909 static int smart_ant_init(struct drx_demod_instance *demod)
3910 {
3911 struct drxj_data *ext_attr = NULL;
3912 struct i2c_device_addr *dev_addr = NULL;
3913 struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SMA };
3914 int rc;
3915 u16 data = 0;
3916
3917 dev_addr = demod->my_i2c_dev_addr;
3918 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3919
3920 /* Write magic word to enable pdr reg write */
3921 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3922 if (rc != 0) {
3923 pr_err("error %d\n", rc);
3924 goto rw_error;
3925 }
3926 /* init smart antenna */
3927 rc = drxj_dap_read_reg16(dev_addr, SIO_SA_TX_COMMAND__A, &data, 0);
3928 if (rc != 0) {
3929 pr_err("error %d\n", rc);
3930 goto rw_error;
3931 }
3932 if (ext_attr->smart_ant_inverted) {
3933 rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data | SIO_SA_TX_COMMAND_TX_INVERT__M) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
3934 if (rc != 0) {
3935 pr_err("error %d\n", rc);
3936 goto rw_error;
3937 }
3938 } else {
3939 rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data & (~SIO_SA_TX_COMMAND_TX_INVERT__M)) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
3940 if (rc != 0) {
3941 pr_err("error %d\n", rc);
3942 goto rw_error;
3943 }
3944 }
3945
3946 /* config SMA_TX pin to smart antenna mode */
3947 rc = ctrl_set_uio_cfg(demod, &uio_cfg);
3948 if (rc != 0) {
3949 pr_err("error %d\n", rc);
3950 goto rw_error;
3951 }
3952 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0x13, 0);
3953 if (rc != 0) {
3954 pr_err("error %d\n", rc);
3955 goto rw_error;
3956 }
3957 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_GPIO_FNC__A, 0x03, 0);
3958 if (rc != 0) {
3959 pr_err("error %d\n", rc);
3960 goto rw_error;
3961 }
3962
3963 /* Write magic word to disable pdr reg write */
3964 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3965 if (rc != 0) {
3966 pr_err("error %d\n", rc);
3967 goto rw_error;
3968 }
3969
3970 return 0;
3971 rw_error:
3972 return rc;
3973 }
3974
3975 static int scu_command(struct i2c_device_addr *dev_addr, struct drxjscu_cmd *cmd)
3976 {
3977 int rc;
3978 u16 cur_cmd = 0;
3979 unsigned long timeout;
3980
3981 /* Check param */
3982 if (cmd == NULL)
3983 return -EINVAL;
3984
3985 /* Wait until SCU command interface is ready to receive command */
3986 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
3987 if (rc != 0) {
3988 pr_err("error %d\n", rc);
3989 goto rw_error;
3990 }
3991 if (cur_cmd != DRX_SCU_READY)
3992 return -EIO;
3993
3994 switch (cmd->parameter_len) {
3995 case 5:
3996 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_4__A, *(cmd->parameter + 4), 0);
3997 if (rc != 0) {
3998 pr_err("error %d\n", rc);
3999 goto rw_error;
4000 } /* fallthrough */
4001 case 4:
4002 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_3__A, *(cmd->parameter + 3), 0);
4003 if (rc != 0) {
4004 pr_err("error %d\n", rc);
4005 goto rw_error;
4006 } /* fallthrough */
4007 case 3:
4008 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_2__A, *(cmd->parameter + 2), 0);
4009 if (rc != 0) {
4010 pr_err("error %d\n", rc);
4011 goto rw_error;
4012 } /* fallthrough */
4013 case 2:
4014 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_1__A, *(cmd->parameter + 1), 0);
4015 if (rc != 0) {
4016 pr_err("error %d\n", rc);
4017 goto rw_error;
4018 } /* fallthrough */
4019 case 1:
4020 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_0__A, *(cmd->parameter + 0), 0);
4021 if (rc != 0) {
4022 pr_err("error %d\n", rc);
4023 goto rw_error;
4024 } /* fallthrough */
4025 case 0:
4026 /* do nothing */
4027 break;
4028 default:
4029 /* this number of parameters is not supported */
4030 return -EIO;
4031 }
4032 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_COMMAND__A, cmd->command, 0);
4033 if (rc != 0) {
4034 pr_err("error %d\n", rc);
4035 goto rw_error;
4036 }
4037
4038 /* Wait until SCU has processed command */
4039 timeout = jiffies + msecs_to_jiffies(DRXJ_MAX_WAITTIME);
4040 while (time_is_after_jiffies(timeout)) {
4041 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
4042 if (rc != 0) {
4043 pr_err("error %d\n", rc);
4044 goto rw_error;
4045 }
4046 if (cur_cmd == DRX_SCU_READY)
4047 break;
4048 usleep_range(1000, 2000);
4049 }
4050
4051 if (cur_cmd != DRX_SCU_READY)
4052 return -EIO;
4053
4054 /* read results */
4055 if ((cmd->result_len > 0) && (cmd->result != NULL)) {
4056 s16 err;
4057
4058 switch (cmd->result_len) {
4059 case 4:
4060 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_3__A, cmd->result + 3, 0);
4061 if (rc != 0) {
4062 pr_err("error %d\n", rc);
4063 goto rw_error;
4064 } /* fallthrough */
4065 case 3:
4066 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_2__A, cmd->result + 2, 0);
4067 if (rc != 0) {
4068 pr_err("error %d\n", rc);
4069 goto rw_error;
4070 } /* fallthrough */
4071 case 2:
4072 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_1__A, cmd->result + 1, 0);
4073 if (rc != 0) {
4074 pr_err("error %d\n", rc);
4075 goto rw_error;
4076 } /* fallthrough */
4077 case 1:
4078 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_0__A, cmd->result + 0, 0);
4079 if (rc != 0) {
4080 pr_err("error %d\n", rc);
4081 goto rw_error;
4082 } /* fallthrough */
4083 case 0:
4084 /* do nothing */
4085 break;
4086 default:
4087 /* this number of parameters is not supported */
4088 return -EIO;
4089 }
4090
4091 /* Check if an error was reported by SCU */
4092 err = cmd->result[0];
4093
4094 /* check a few fixed error codes */
4095 if ((err == (s16) SCU_RAM_PARAM_0_RESULT_UNKSTD)
4096 || (err == (s16) SCU_RAM_PARAM_0_RESULT_UNKCMD)
4097 || (err == (s16) SCU_RAM_PARAM_0_RESULT_INVPAR)
4098 || (err == (s16) SCU_RAM_PARAM_0_RESULT_SIZE)
4099 ) {
4100 return -EINVAL;
4101 }
4102 /* here it is assumed that negative means error, and positive no error */
4103 else if (err < 0)
4104 return -EIO;
4105 else
4106 return 0;
4107 }
4108
4109 return 0;
4110
4111 rw_error:
4112 return rc;
4113 }
4114
4115 /**
4116 * \fn int DRXJ_DAP_SCUAtomicReadWriteBlock()
4117 * \brief Basic access routine for SCU atomic read or write access
4118 * \param dev_addr pointer to i2c dev address
4119 * \param addr destination/source address
4120 * \param datasize size of data buffer in bytes
4121 * \param data pointer to data buffer
4122 * \return int
4123 * \retval 0 Succes
4124 * \retval -EIO Timeout, I2C error, illegal bank
4125 *
4126 */
4127 #define ADDR_AT_SCU_SPACE(x) ((x - 0x82E000) * 2)
4128 static
4129 int drxj_dap_scu_atomic_read_write_block(struct i2c_device_addr *dev_addr, u32 addr, u16 datasize, /* max 30 bytes because the limit of SCU parameter */
4130 u8 *data, bool read_flag)
4131 {
4132 struct drxjscu_cmd scu_cmd;
4133 int rc;
4134 u16 set_param_parameters[15];
4135 u16 cmd_result[15];
4136
4137 /* Parameter check */
4138 if (!data || !dev_addr || (datasize % 2) || ((datasize / 2) > 16))
4139 return -EINVAL;
4140
4141 set_param_parameters[1] = (u16) ADDR_AT_SCU_SPACE(addr);
4142 if (read_flag) { /* read */
4143 set_param_parameters[0] = ((~(0x0080)) & datasize);
4144 scu_cmd.parameter_len = 2;
4145 scu_cmd.result_len = datasize / 2 + 2;
4146 } else {
4147 int i = 0;
4148
4149 set_param_parameters[0] = 0x0080 | datasize;
4150 for (i = 0; i < (datasize / 2); i++) {
4151 set_param_parameters[i + 2] =
4152 (data[2 * i] | (data[(2 * i) + 1] << 8));
4153 }
4154 scu_cmd.parameter_len = datasize / 2 + 2;
4155 scu_cmd.result_len = 1;
4156 }
4157
4158 scu_cmd.command =
4159 SCU_RAM_COMMAND_STANDARD_TOP |
4160 SCU_RAM_COMMAND_CMD_AUX_SCU_ATOMIC_ACCESS;
4161 scu_cmd.result = cmd_result;
4162 scu_cmd.parameter = set_param_parameters;
4163 rc = scu_command(dev_addr, &scu_cmd);
4164 if (rc != 0) {
4165 pr_err("error %d\n", rc);
4166 goto rw_error;
4167 }
4168
4169 if (read_flag) {
4170 int i = 0;
4171 /* read data from buffer */
4172 for (i = 0; i < (datasize / 2); i++) {
4173 data[2 * i] = (u8) (scu_cmd.result[i + 2] & 0xFF);
4174 data[(2 * i) + 1] = (u8) (scu_cmd.result[i + 2] >> 8);
4175 }
4176 }
4177
4178 return 0;
4179
4180 rw_error:
4181 return rc;
4182
4183 }
4184
4185 /*============================================================================*/
4186
4187 /**
4188 * \fn int DRXJ_DAP_AtomicReadReg16()
4189 * \brief Atomic read of 16 bits words
4190 */
4191 static
4192 int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr *dev_addr,
4193 u32 addr,
4194 u16 *data, u32 flags)
4195 {
4196 u8 buf[2] = { 0 };
4197 int rc = -EIO;
4198 u16 word = 0;
4199
4200 if (!data)
4201 return -EINVAL;
4202
4203 rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, true);
4204 if (rc < 0)
4205 return rc;
4206
4207 word = (u16) (buf[0] + (buf[1] << 8));
4208
4209 *data = word;
4210
4211 return rc;
4212 }
4213
4214 /*============================================================================*/
4215 /**
4216 * \fn int drxj_dap_scu_atomic_write_reg16()
4217 * \brief Atomic read of 16 bits words
4218 */
4219 static
4220 int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr *dev_addr,
4221 u32 addr,
4222 u16 data, u32 flags)
4223 {
4224 u8 buf[2];
4225 int rc = -EIO;
4226
4227 buf[0] = (u8) (data & 0xff);
4228 buf[1] = (u8) ((data >> 8) & 0xff);
4229
4230 rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, false);
4231
4232 return rc;
4233 }
4234
4235 /* -------------------------------------------------------------------------- */
4236 /**
4237 * \brief Measure result of ADC synchronisation
4238 * \param demod demod instance
4239 * \param count (returned) count
4240 * \return int.
4241 * \retval 0 Success
4242 * \retval -EIO Failure: I2C error
4243 *
4244 */
4245 static int adc_sync_measurement(struct drx_demod_instance *demod, u16 *count)
4246 {
4247 struct i2c_device_addr *dev_addr = NULL;
4248 int rc;
4249 u16 data = 0;
4250
4251 dev_addr = demod->my_i2c_dev_addr;
4252
4253 /* Start measurement */
4254 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE, 0);
4255 if (rc != 0) {
4256 pr_err("error %d\n", rc);
4257 goto rw_error;
4258 }
4259 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_START_LOCK__A, 1, 0);
4260 if (rc != 0) {
4261 pr_err("error %d\n", rc);
4262 goto rw_error;
4263 }
4264
4265 /* Wait at least 3*128*(1/sysclk) <<< 1 millisec */
4266 msleep(1);
4267
4268 *count = 0;
4269 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE0__A, &data, 0);
4270 if (rc != 0) {
4271 pr_err("error %d\n", rc);
4272 goto rw_error;
4273 }
4274 if (data == 127)
4275 *count = *count + 1;
4276 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE1__A, &data, 0);
4277 if (rc != 0) {
4278 pr_err("error %d\n", rc);
4279 goto rw_error;
4280 }
4281 if (data == 127)
4282 *count = *count + 1;
4283 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE2__A, &data, 0);
4284 if (rc != 0) {
4285 pr_err("error %d\n", rc);
4286 goto rw_error;
4287 }
4288 if (data == 127)
4289 *count = *count + 1;
4290
4291 return 0;
4292 rw_error:
4293 return rc;
4294 }
4295
4296 /**
4297 * \brief Synchronize analog and digital clock domains
4298 * \param demod demod instance
4299 * \return int.
4300 * \retval 0 Success
4301 * \retval -EIO Failure: I2C error or failure to synchronize
4302 *
4303 * An IQM reset will also reset the results of this synchronization.
4304 * After an IQM reset this routine needs to be called again.
4305 *
4306 */
4307
4308 static int adc_synchronization(struct drx_demod_instance *demod)
4309 {
4310 struct i2c_device_addr *dev_addr = NULL;
4311 int rc;
4312 u16 count = 0;
4313
4314 dev_addr = demod->my_i2c_dev_addr;
4315
4316 rc = adc_sync_measurement(demod, &count);
4317 if (rc != 0) {
4318 pr_err("error %d\n", rc);
4319 goto rw_error;
4320 }
4321
4322 if (count == 1) {
4323 /* Try sampling on a diffrent edge */
4324 u16 clk_neg = 0;
4325
4326 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_CLKNEG__A, &clk_neg, 0);
4327 if (rc != 0) {
4328 pr_err("error %d\n", rc);
4329 goto rw_error;
4330 }
4331
4332 clk_neg ^= IQM_AF_CLKNEG_CLKNEGDATA__M;
4333 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLKNEG__A, clk_neg, 0);
4334 if (rc != 0) {
4335 pr_err("error %d\n", rc);
4336 goto rw_error;
4337 }
4338
4339 rc = adc_sync_measurement(demod, &count);
4340 if (rc != 0) {
4341 pr_err("error %d\n", rc);
4342 goto rw_error;
4343 }
4344 }
4345
4346 /* TODO: implement fallback scenarios */
4347 if (count < 2)
4348 return -EIO;
4349
4350 return 0;
4351 rw_error:
4352 return rc;
4353 }
4354
4355 /*============================================================================*/
4356 /*== END AUXILIARY FUNCTIONS ==*/
4357 /*============================================================================*/
4358
4359 /*============================================================================*/
4360 /*============================================================================*/
4361 /*== 8VSB & QAM COMMON DATAPATH FUNCTIONS ==*/
4362 /*============================================================================*/
4363 /*============================================================================*/
4364 /**
4365 * \fn int init_agc ()
4366 * \brief Initialize AGC for all standards.
4367 * \param demod instance of demodulator.
4368 * \param channel pointer to channel data.
4369 * \return int.
4370 */
4371 static int init_agc(struct drx_demod_instance *demod)
4372 {
4373 struct i2c_device_addr *dev_addr = NULL;
4374 struct drx_common_attr *common_attr = NULL;
4375 struct drxj_data *ext_attr = NULL;
4376 struct drxj_cfg_agc *p_agc_rf_settings = NULL;
4377 struct drxj_cfg_agc *p_agc_if_settings = NULL;
4378 int rc;
4379 u16 ingain_tgt_max = 0;
4380 u16 clp_dir_to = 0;
4381 u16 sns_sum_max = 0;
4382 u16 clp_sum_max = 0;
4383 u16 sns_dir_to = 0;
4384 u16 ki_innergain_min = 0;
4385 u16 agc_ki = 0;
4386 u16 ki_max = 0;
4387 u16 if_iaccu_hi_tgt_min = 0;
4388 u16 data = 0;
4389 u16 agc_ki_dgain = 0;
4390 u16 ki_min = 0;
4391 u16 clp_ctrl_mode = 0;
4392 u16 agc_rf = 0;
4393 u16 agc_if = 0;
4394
4395 dev_addr = demod->my_i2c_dev_addr;
4396 common_attr = (struct drx_common_attr *) demod->my_common_attr;
4397 ext_attr = (struct drxj_data *) demod->my_ext_attr;
4398
4399 switch (ext_attr->standard) {
4400 case DRX_STANDARD_8VSB:
4401 clp_sum_max = 1023;
4402 clp_dir_to = (u16) (-9);
4403 sns_sum_max = 1023;
4404 sns_dir_to = (u16) (-9);
4405 ki_innergain_min = (u16) (-32768);
4406 ki_max = 0x032C;
4407 agc_ki_dgain = 0xC;
4408 if_iaccu_hi_tgt_min = 2047;
4409 ki_min = 0x0117;
4410 ingain_tgt_max = 16383;
4411 clp_ctrl_mode = 0;
4412 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4413 if (rc != 0) {
4414 pr_err("error %d\n", rc);
4415 goto rw_error;
4416 }
4417 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4418 if (rc != 0) {
4419 pr_err("error %d\n", rc);
4420 goto rw_error;
4421 }
4422 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4423 if (rc != 0) {
4424 pr_err("error %d\n", rc);
4425 goto rw_error;
4426 }
4427 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4428 if (rc != 0) {
4429 pr_err("error %d\n", rc);
4430 goto rw_error;
4431 }
4432 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4433 if (rc != 0) {
4434 pr_err("error %d\n", rc);
4435 goto rw_error;
4436 }
4437 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4438 if (rc != 0) {
4439 pr_err("error %d\n", rc);
4440 goto rw_error;
4441 }
4442 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4443 if (rc != 0) {
4444 pr_err("error %d\n", rc);
4445 goto rw_error;
4446 }
4447 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4448 if (rc != 0) {
4449 pr_err("error %d\n", rc);
4450 goto rw_error;
4451 }
4452 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4453 if (rc != 0) {
4454 pr_err("error %d\n", rc);
4455 goto rw_error;
4456 }
4457 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4458 if (rc != 0) {
4459 pr_err("error %d\n", rc);
4460 goto rw_error;
4461 }
4462 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, 1024, 0);
4463 if (rc != 0) {
4464 pr_err("error %d\n", rc);
4465 goto rw_error;
4466 }
4467 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_VSB_AGC_POW_TGT__A, 22600, 0);
4468 if (rc != 0) {
4469 pr_err("error %d\n", rc);
4470 goto rw_error;
4471 }
4472 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, 13200, 0);
4473 if (rc != 0) {
4474 pr_err("error %d\n", rc);
4475 goto rw_error;
4476 }
4477 p_agc_if_settings = &(ext_attr->vsb_if_agc_cfg);
4478 p_agc_rf_settings = &(ext_attr->vsb_rf_agc_cfg);
4479 break;
4480 #ifndef DRXJ_VSB_ONLY
4481 case DRX_STANDARD_ITU_A:
4482 case DRX_STANDARD_ITU_C:
4483 case DRX_STANDARD_ITU_B:
4484 ingain_tgt_max = 5119;
4485 clp_sum_max = 1023;
4486 clp_dir_to = (u16) (-5);
4487 sns_sum_max = 127;
4488 sns_dir_to = (u16) (-3);
4489 ki_innergain_min = 0;
4490 ki_max = 0x0657;
4491 if_iaccu_hi_tgt_min = 2047;
4492 agc_ki_dgain = 0x7;
4493 ki_min = 0x0117;
4494 clp_ctrl_mode = 0;
4495 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4496 if (rc != 0) {
4497 pr_err("error %d\n", rc);
4498 goto rw_error;
4499 }
4500 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4501 if (rc != 0) {
4502 pr_err("error %d\n", rc);
4503 goto rw_error;
4504 }
4505 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4506 if (rc != 0) {
4507 pr_err("error %d\n", rc);
4508 goto rw_error;
4509 }
4510 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4511 if (rc != 0) {
4512 pr_err("error %d\n", rc);
4513 goto rw_error;
4514 }
4515 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4516 if (rc != 0) {
4517 pr_err("error %d\n", rc);
4518 goto rw_error;
4519 }
4520 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4521 if (rc != 0) {
4522 pr_err("error %d\n", rc);
4523 goto rw_error;
4524 }
4525 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4526 if (rc != 0) {
4527 pr_err("error %d\n", rc);
4528 goto rw_error;
4529 }
4530 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4531 if (rc != 0) {
4532 pr_err("error %d\n", rc);
4533 goto rw_error;
4534 }
4535 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4536 if (rc != 0) {
4537 pr_err("error %d\n", rc);
4538 goto rw_error;
4539 }
4540 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4541 if (rc != 0) {
4542 pr_err("error %d\n", rc);
4543 goto rw_error;
4544 }
4545 p_agc_if_settings = &(ext_attr->qam_if_agc_cfg);
4546 p_agc_rf_settings = &(ext_attr->qam_rf_agc_cfg);
4547 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, p_agc_if_settings->top, 0);
4548 if (rc != 0) {
4549 pr_err("error %d\n", rc);
4550 goto rw_error;
4551 }
4552
4553 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &agc_ki, 0);
4554 if (rc != 0) {
4555 pr_err("error %d\n", rc);
4556 goto rw_error;
4557 }
4558 agc_ki &= 0xf000;
4559 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, agc_ki, 0);
4560 if (rc != 0) {
4561 pr_err("error %d\n", rc);
4562 goto rw_error;
4563 }
4564 break;
4565 #endif
4566 default:
4567 return -EINVAL;
4568 }
4569
4570 /* for new AGC interface */
4571 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_if_settings->top, 0);
4572 if (rc != 0) {
4573 pr_err("error %d\n", rc);
4574 goto rw_error;
4575 }
4576 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, p_agc_if_settings->top, 0);
4577 if (rc != 0) {
4578 pr_err("error %d\n", rc);
4579 goto rw_error;
4580 } /* Gain fed from inner to outer AGC */
4581 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max, 0);
4582 if (rc != 0) {
4583 pr_err("error %d\n", rc);
4584 goto rw_error;
4585 }
4586 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, if_iaccu_hi_tgt_min, 0);
4587 if (rc != 0) {
4588 pr_err("error %d\n", rc);
4589 goto rw_error;
4590 }
4591 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI__A, 0, 0);
4592 if (rc != 0) {
4593 pr_err("error %d\n", rc);
4594 goto rw_error;
4595 } /* set to p_agc_settings->top before */
4596 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_LO__A, 0, 0);
4597 if (rc != 0) {
4598 pr_err("error %d\n", rc);
4599 goto rw_error;
4600 }
4601 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, 0, 0);
4602 if (rc != 0) {
4603 pr_err("error %d\n", rc);
4604 goto rw_error;
4605 }
4606 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_LO__A, 0, 0);
4607 if (rc != 0) {
4608 pr_err("error %d\n", rc);
4609 goto rw_error;
4610 }
4611 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_MAX__A, 32767, 0);
4612 if (rc != 0) {
4613 pr_err("error %d\n", rc);
4614 goto rw_error;
4615 }
4616 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max, 0);
4617 if (rc != 0) {
4618 pr_err("error %d\n", rc);
4619 goto rw_error;
4620 }
4621 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max, 0);
4622 if (rc != 0) {
4623 pr_err("error %d\n", rc);
4624 goto rw_error;
4625 }
4626 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, ki_innergain_min, 0);
4627 if (rc != 0) {
4628 pr_err("error %d\n", rc);
4629 goto rw_error;
4630 }
4631 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50, 0);
4632 if (rc != 0) {
4633 pr_err("error %d\n", rc);
4634 goto rw_error;
4635 }
4636 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_CYCLEN__A, 500, 0);
4637 if (rc != 0) {
4638 pr_err("error %d\n", rc);
4639 goto rw_error;
4640 }
4641 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCLEN__A, 500, 0);
4642 if (rc != 0) {
4643 pr_err("error %d\n", rc);
4644 goto rw_error;
4645 }
4646 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20, 0);
4647 if (rc != 0) {
4648 pr_err("error %d\n", rc);
4649 goto rw_error;
4650 }
4651 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MIN__A, ki_min, 0);
4652 if (rc != 0) {
4653 pr_err("error %d\n", rc);
4654 goto rw_error;
4655 }
4656 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAX__A, ki_max, 0);
4657 if (rc != 0) {
4658 pr_err("error %d\n", rc);
4659 goto rw_error;
4660 }
4661 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_RED__A, 0, 0);
4662 if (rc != 0) {
4663 pr_err("error %d\n", rc);
4664 goto rw_error;
4665 }
4666 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MIN__A, 8, 0);
4667 if (rc != 0) {
4668 pr_err("error %d\n", rc);
4669 goto rw_error;
4670 }
4671 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCLEN__A, 500, 0);
4672 if (rc != 0) {
4673 pr_err("error %d\n", rc);
4674 goto rw_error;
4675 }
4676 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to, 0);
4677 if (rc != 0) {
4678 pr_err("error %d\n", rc);
4679 goto rw_error;
4680 }
4681 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MIN__A, 8, 0);
4682 if (rc != 0) {
4683 pr_err("error %d\n", rc);
4684 goto rw_error;
4685 }
4686 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to, 0);
4687 if (rc != 0) {
4688 pr_err("error %d\n", rc);
4689 goto rw_error;
4690 }
4691 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, 50, 0);
4692 if (rc != 0) {
4693 pr_err("error %d\n", rc);
4694 goto rw_error;
4695 }
4696 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode, 0);
4697 if (rc != 0) {
4698 pr_err("error %d\n", rc);
4699 goto rw_error;
4700 }
4701
4702 agc_rf = 0x800 + p_agc_rf_settings->cut_off_current;
4703 if (common_attr->tuner_rf_agc_pol == true)
4704 agc_rf = 0x87ff - agc_rf;
4705
4706 agc_if = 0x800;
4707 if (common_attr->tuner_if_agc_pol == true)
4708 agc_rf = 0x87ff - agc_rf;
4709
4710 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_RF__A, agc_rf, 0);
4711 if (rc != 0) {
4712 pr_err("error %d\n", rc);
4713 goto rw_error;
4714 }
4715 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_IF__A, agc_if, 0);
4716 if (rc != 0) {
4717 pr_err("error %d\n", rc);
4718 goto rw_error;
4719 }
4720
4721 /* Set/restore Ki DGAIN factor */
4722 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4723 if (rc != 0) {
4724 pr_err("error %d\n", rc);
4725 goto rw_error;
4726 }
4727 data &= ~SCU_RAM_AGC_KI_DGAIN__M;
4728 data |= (agc_ki_dgain << SCU_RAM_AGC_KI_DGAIN__B);
4729 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4730 if (rc != 0) {
4731 pr_err("error %d\n", rc);
4732 goto rw_error;
4733 }
4734
4735 return 0;
4736 rw_error:
4737 return rc;
4738 }
4739
4740 /**
4741 * \fn int set_frequency ()
4742 * \brief Set frequency shift.
4743 * \param demod instance of demodulator.
4744 * \param channel pointer to channel data.
4745 * \param tuner_freq_offset residual frequency from tuner.
4746 * \return int.
4747 */
4748 static int
4749 set_frequency(struct drx_demod_instance *demod,
4750 struct drx_channel *channel, s32 tuner_freq_offset)
4751 {
4752 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
4753 struct drxj_data *ext_attr = demod->my_ext_attr;
4754 int rc;
4755 s32 sampling_frequency = 0;
4756 s32 frequency_shift = 0;
4757 s32 if_freq_actual = 0;
4758 s32 rf_freq_residual = -1 * tuner_freq_offset;
4759 s32 adc_freq = 0;
4760 s32 intermediate_freq = 0;
4761 u32 iqm_fs_rate_ofs = 0;
4762 bool adc_flip = true;
4763 bool select_pos_image = false;
4764 bool rf_mirror;
4765 bool tuner_mirror;
4766 bool image_to_select = true;
4767 s32 fm_frequency_shift = 0;
4768
4769 rf_mirror = (ext_attr->mirror == DRX_MIRROR_YES) ? true : false;
4770 tuner_mirror = demod->my_common_attr->mirror_freq_spect ? false : true;
4771 /*
4772 Program frequency shifter
4773 No need to account for mirroring on RF
4774 */
4775 switch (ext_attr->standard) {
4776 case DRX_STANDARD_ITU_A: /* fallthrough */
4777 case DRX_STANDARD_ITU_C: /* fallthrough */
4778 case DRX_STANDARD_PAL_SECAM_LP: /* fallthrough */
4779 case DRX_STANDARD_8VSB:
4780 select_pos_image = true;
4781 break;
4782 case DRX_STANDARD_FM:
4783 /* After IQM FS sound carrier must appear at 4 Mhz in spect.
4784 Sound carrier is already 3Mhz above centre frequency due
4785 to tuner setting so now add an extra shift of 1MHz... */
4786 fm_frequency_shift = 1000;
4787 case DRX_STANDARD_ITU_B: /* fallthrough */
4788 case DRX_STANDARD_NTSC: /* fallthrough */
4789 case DRX_STANDARD_PAL_SECAM_BG: /* fallthrough */
4790 case DRX_STANDARD_PAL_SECAM_DK: /* fallthrough */
4791 case DRX_STANDARD_PAL_SECAM_I: /* fallthrough */
4792 case DRX_STANDARD_PAL_SECAM_L:
4793 select_pos_image = false;
4794 break;
4795 default:
4796 return -EINVAL;
4797 }
4798 intermediate_freq = demod->my_common_attr->intermediate_freq;
4799 sampling_frequency = demod->my_common_attr->sys_clock_freq / 3;
4800 if (tuner_mirror)
4801 if_freq_actual = intermediate_freq + rf_freq_residual + fm_frequency_shift;
4802 else
4803 if_freq_actual = intermediate_freq - rf_freq_residual - fm_frequency_shift;
4804 if (if_freq_actual > sampling_frequency / 2) {
4805 /* adc mirrors */
4806 adc_freq = sampling_frequency - if_freq_actual;
4807 adc_flip = true;
4808 } else {
4809 /* adc doesn't mirror */
4810 adc_freq = if_freq_actual;
4811 adc_flip = false;
4812 }
4813
4814 frequency_shift = adc_freq;
4815 image_to_select =
4816 (bool) (rf_mirror ^ tuner_mirror ^ adc_flip ^ select_pos_image);
4817 iqm_fs_rate_ofs = frac28(frequency_shift, sampling_frequency);
4818
4819 if (image_to_select)
4820 iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
4821
4822 /* Program frequency shifter with tuner offset compensation */
4823 /* frequency_shift += tuner_freq_offset; TODO */
4824 rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
4825 if (rc != 0) {
4826 pr_err("error %d\n", rc);
4827 goto rw_error;
4828 }
4829 ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
4830 ext_attr->pos_image = (bool) (rf_mirror ^ tuner_mirror ^ select_pos_image);
4831
4832 return 0;
4833 rw_error:
4834 return rc;
4835 }
4836
4837 /**
4838 * \fn int get_acc_pkt_err()
4839 * \brief Retrieve signal strength for VSB and QAM.
4840 * \param demod Pointer to demod instance
4841 * \param packet_err Pointer to packet error
4842 * \return int.
4843 * \retval 0 sig_strength contains valid data.
4844 * \retval -EINVAL sig_strength is NULL.
4845 * \retval -EIO Erroneous data, sig_strength contains invalid data.
4846 */
4847 #ifdef DRXJ_SIGNAL_ACCUM_ERR
4848 static int get_acc_pkt_err(struct drx_demod_instance *demod, u16 *packet_err)
4849 {
4850 int rc;
4851 static u16 pkt_err;
4852 static u16 last_pkt_err;
4853 u16 data = 0;
4854 struct drxj_data *ext_attr = NULL;
4855 struct i2c_device_addr *dev_addr = NULL;
4856
4857 ext_attr = (struct drxj_data *) demod->my_ext_attr;
4858 dev_addr = demod->my_i2c_dev_addr;
4859
4860 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, &data, 0);
4861 if (rc != 0) {
4862 pr_err("error %d\n", rc);
4863 goto rw_error;
4864 }
4865 if (ext_attr->reset_pkt_err_acc) {
4866 last_pkt_err = data;
4867 pkt_err = 0;
4868 ext_attr->reset_pkt_err_acc = false;
4869 }
4870
4871 if (data < last_pkt_err) {
4872 pkt_err += 0xffff - last_pkt_err;
4873 pkt_err += data;
4874 } else {
4875 pkt_err += (data - last_pkt_err);
4876 }
4877 *packet_err = pkt_err;
4878 last_pkt_err = data;
4879
4880 return 0;
4881 rw_error:
4882 return rc;
4883 }
4884 #endif
4885
4886
4887 /*============================================================================*/
4888
4889 /**
4890 * \fn int set_agc_rf ()
4891 * \brief Configure RF AGC
4892 * \param demod instance of demodulator.
4893 * \param agc_settings AGC configuration structure
4894 * \return int.
4895 */
4896 static int
4897 set_agc_rf(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
4898 {
4899 struct i2c_device_addr *dev_addr = NULL;
4900 struct drxj_data *ext_attr = NULL;
4901 struct drxj_cfg_agc *p_agc_settings = NULL;
4902 struct drx_common_attr *common_attr = NULL;
4903 int rc;
4904 drx_write_reg16func_t scu_wr16 = NULL;
4905 drx_read_reg16func_t scu_rr16 = NULL;
4906
4907 common_attr = (struct drx_common_attr *) demod->my_common_attr;
4908 dev_addr = demod->my_i2c_dev_addr;
4909 ext_attr = (struct drxj_data *) demod->my_ext_attr;
4910
4911 if (atomic) {
4912 scu_rr16 = drxj_dap_scu_atomic_read_reg16;
4913 scu_wr16 = drxj_dap_scu_atomic_write_reg16;
4914 } else {
4915 scu_rr16 = drxj_dap_read_reg16;
4916 scu_wr16 = drxj_dap_write_reg16;
4917 }
4918
4919 /* Configure AGC only if standard is currently active */
4920 if ((ext_attr->standard == agc_settings->standard) ||
4921 (DRXJ_ISQAMSTD(ext_attr->standard) &&
4922 DRXJ_ISQAMSTD(agc_settings->standard)) ||
4923 (DRXJ_ISATVSTD(ext_attr->standard) &&
4924 DRXJ_ISATVSTD(agc_settings->standard))) {
4925 u16 data = 0;
4926
4927 switch (agc_settings->ctrl_mode) {
4928 case DRX_AGC_CTRL_AUTO:
4929
4930 /* Enable RF AGC DAC */
4931 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
4932 if (rc != 0) {
4933 pr_err("error %d\n", rc);
4934 goto rw_error;
4935 }
4936 data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
4937 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
4938 if (rc != 0) {
4939 pr_err("error %d\n", rc);
4940 goto rw_error;
4941 }
4942
4943 /* Enable SCU RF AGC loop */
4944 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4945 if (rc != 0) {
4946 pr_err("error %d\n", rc);
4947 goto rw_error;
4948 }
4949 data &= ~SCU_RAM_AGC_KI_RF__M;
4950 if (ext_attr->standard == DRX_STANDARD_8VSB)
4951 data |= (2 << SCU_RAM_AGC_KI_RF__B);
4952 else if (DRXJ_ISQAMSTD(ext_attr->standard))
4953 data |= (5 << SCU_RAM_AGC_KI_RF__B);
4954 else
4955 data |= (4 << SCU_RAM_AGC_KI_RF__B);
4956
4957 if (common_attr->tuner_rf_agc_pol)
4958 data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
4959 else
4960 data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
4961 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4962 if (rc != 0) {
4963 pr_err("error %d\n", rc);
4964 goto rw_error;
4965 }
4966
4967 /* Set speed ( using complementary reduction value ) */
4968 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
4969 if (rc != 0) {
4970 pr_err("error %d\n", rc);
4971 goto rw_error;
4972 }
4973 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
4974 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, (~(agc_settings->speed << SCU_RAM_AGC_KI_RED_RAGC_RED__B) & SCU_RAM_AGC_KI_RED_RAGC_RED__M) | data, 0);
4975 if (rc != 0) {
4976 pr_err("error %d\n", rc);
4977 goto rw_error;
4978 }
4979
4980 if (agc_settings->standard == DRX_STANDARD_8VSB)
4981 p_agc_settings = &(ext_attr->vsb_if_agc_cfg);
4982 else if (DRXJ_ISQAMSTD(agc_settings->standard))
4983 p_agc_settings = &(ext_attr->qam_if_agc_cfg);
4984 else if (DRXJ_ISATVSTD(agc_settings->standard))
4985 p_agc_settings = &(ext_attr->atv_if_agc_cfg);
4986 else
4987 return -EINVAL;
4988
4989 /* Set TOP, only if IF-AGC is in AUTO mode */
4990 if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
4991 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->top, 0);
4992 if (rc != 0) {
4993 pr_err("error %d\n", rc);
4994 goto rw_error;
4995 }
4996 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, agc_settings->top, 0);
4997 if (rc != 0) {
4998 pr_err("error %d\n", rc);
4999 goto rw_error;
5000 }
5001 }
5002
5003 /* Cut-Off current */
5004 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI_CO__A, agc_settings->cut_off_current, 0);
5005 if (rc != 0) {
5006 pr_err("error %d\n", rc);
5007 goto rw_error;
5008 }
5009 break;
5010 case DRX_AGC_CTRL_USER:
5011
5012 /* Enable RF AGC DAC */
5013 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5014 if (rc != 0) {
5015 pr_err("error %d\n", rc);
5016 goto rw_error;
5017 }
5018 data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
5019 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5020 if (rc != 0) {
5021 pr_err("error %d\n", rc);
5022 goto rw_error;
5023 }
5024
5025 /* Disable SCU RF AGC loop */
5026 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5027 if (rc != 0) {
5028 pr_err("error %d\n", rc);
5029 goto rw_error;
5030 }
5031 data &= ~SCU_RAM_AGC_KI_RF__M;
5032 if (common_attr->tuner_rf_agc_pol)
5033 data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
5034 else
5035 data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
5036 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5037 if (rc != 0) {
5038 pr_err("error %d\n", rc);
5039 goto rw_error;
5040 }
5041
5042 /* Write value to output pin */
5043 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, agc_settings->output_level, 0);
5044 if (rc != 0) {
5045 pr_err("error %d\n", rc);
5046 goto rw_error;
5047 }
5048 break;
5049 case DRX_AGC_CTRL_OFF:
5050
5051 /* Disable RF AGC DAC */
5052 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5053 if (rc != 0) {
5054 pr_err("error %d\n", rc);
5055 goto rw_error;
5056 }
5057 data &= (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE);
5058 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5059 if (rc != 0) {
5060 pr_err("error %d\n", rc);
5061 goto rw_error;
5062 }
5063
5064 /* Disable SCU RF AGC loop */
5065 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5066 if (rc != 0) {
5067 pr_err("error %d\n", rc);
5068 goto rw_error;
5069 }
5070 data &= ~SCU_RAM_AGC_KI_RF__M;
5071 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5072 if (rc != 0) {
5073 pr_err("error %d\n", rc);
5074 goto rw_error;
5075 }
5076 break;
5077 default:
5078 return -EINVAL;
5079 } /* switch ( agcsettings->ctrl_mode ) */
5080 }
5081
5082 /* Store rf agc settings */
5083 switch (agc_settings->standard) {
5084 case DRX_STANDARD_8VSB:
5085 ext_attr->vsb_rf_agc_cfg = *agc_settings;
5086 break;
5087 #ifndef DRXJ_VSB_ONLY
5088 case DRX_STANDARD_ITU_A:
5089 case DRX_STANDARD_ITU_B:
5090 case DRX_STANDARD_ITU_C:
5091 ext_attr->qam_rf_agc_cfg = *agc_settings;
5092 break;
5093 #endif
5094 default:
5095 return -EIO;
5096 }
5097
5098 return 0;
5099 rw_error:
5100 return rc;
5101 }
5102
5103 /**
5104 * \fn int set_agc_if ()
5105 * \brief Configure If AGC
5106 * \param demod instance of demodulator.
5107 * \param agc_settings AGC configuration structure
5108 * \return int.
5109 */
5110 static int
5111 set_agc_if(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
5112 {
5113 struct i2c_device_addr *dev_addr = NULL;
5114 struct drxj_data *ext_attr = NULL;
5115 struct drxj_cfg_agc *p_agc_settings = NULL;
5116 struct drx_common_attr *common_attr = NULL;
5117 drx_write_reg16func_t scu_wr16 = NULL;
5118 drx_read_reg16func_t scu_rr16 = NULL;
5119 int rc;
5120
5121 common_attr = (struct drx_common_attr *) demod->my_common_attr;
5122 dev_addr = demod->my_i2c_dev_addr;
5123 ext_attr = (struct drxj_data *) demod->my_ext_attr;
5124
5125 if (atomic) {
5126 scu_rr16 = drxj_dap_scu_atomic_read_reg16;
5127 scu_wr16 = drxj_dap_scu_atomic_write_reg16;
5128 } else {
5129 scu_rr16 = drxj_dap_read_reg16;
5130 scu_wr16 = drxj_dap_write_reg16;
5131 }
5132
5133 /* Configure AGC only if standard is currently active */
5134 if ((ext_attr->standard == agc_settings->standard) ||
5135 (DRXJ_ISQAMSTD(ext_attr->standard) &&
5136 DRXJ_ISQAMSTD(agc_settings->standard)) ||
5137 (DRXJ_ISATVSTD(ext_attr->standard) &&
5138 DRXJ_ISATVSTD(agc_settings->standard))) {
5139 u16 data = 0;
5140
5141 switch (agc_settings->ctrl_mode) {
5142 case DRX_AGC_CTRL_AUTO:
5143 /* Enable IF AGC DAC */
5144 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5145 if (rc != 0) {
5146 pr_err("error %d\n", rc);
5147 goto rw_error;
5148 }
5149 data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5150 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5151 if (rc != 0) {
5152 pr_err("error %d\n", rc);
5153 goto rw_error;
5154 }
5155
5156 /* Enable SCU IF AGC loop */
5157 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5158 if (rc != 0) {
5159 pr_err("error %d\n", rc);
5160 goto rw_error;
5161 }
5162 data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5163 data &= ~SCU_RAM_AGC_KI_IF__M;
5164 if (ext_attr->standard == DRX_STANDARD_8VSB)
5165 data |= (3 << SCU_RAM_AGC_KI_IF__B);
5166 else if (DRXJ_ISQAMSTD(ext_attr->standard))
5167 data |= (6 << SCU_RAM_AGC_KI_IF__B);
5168 else
5169 data |= (5 << SCU_RAM_AGC_KI_IF__B);
5170
5171 if (common_attr->tuner_if_agc_pol)
5172 data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5173 else
5174 data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5175 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5176 if (rc != 0) {
5177 pr_err("error %d\n", rc);
5178 goto rw_error;
5179 }
5180
5181 /* Set speed (using complementary reduction value) */
5182 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
5183 if (rc != 0) {
5184 pr_err("error %d\n", rc);
5185 goto rw_error;
5186 }
5187 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
5188 rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_KI_RED__A, (~(agc_settings->speed << SCU_RAM_AGC_KI_RED_IAGC_RED__B) & SCU_RAM_AGC_KI_RED_IAGC_RED__M) | data, 0);
5189 if (rc != 0) {
5190 pr_err("error %d\n", rc);
5191 goto rw_error;
5192 }
5193
5194 if (agc_settings->standard == DRX_STANDARD_8VSB)
5195 p_agc_settings = &(ext_attr->vsb_rf_agc_cfg);
5196 else if (DRXJ_ISQAMSTD(agc_settings->standard))
5197 p_agc_settings = &(ext_attr->qam_rf_agc_cfg);
5198 else if (DRXJ_ISATVSTD(agc_settings->standard))
5199 p_agc_settings = &(ext_attr->atv_rf_agc_cfg);
5200 else
5201 return -EINVAL;
5202
5203 /* Restore TOP */
5204 if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
5205 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, p_agc_settings->top, 0);
5206 if (rc != 0) {
5207 pr_err("error %d\n", rc);
5208 goto rw_error;
5209 }
5210 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, p_agc_settings->top, 0);
5211 if (rc != 0) {
5212 pr_err("error %d\n", rc);
5213 goto rw_error;
5214 }
5215 } else {
5216 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, 0, 0);
5217 if (rc != 0) {
5218 pr_err("error %d\n", rc);
5219 goto rw_error;
5220 }
5221 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, 0, 0);
5222 if (rc != 0) {
5223 pr_err("error %d\n", rc);
5224 goto rw_error;
5225 }
5226 }
5227 break;
5228
5229 case DRX_AGC_CTRL_USER:
5230
5231 /* Enable IF AGC DAC */
5232 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5233 if (rc != 0) {
5234 pr_err("error %d\n", rc);
5235 goto rw_error;
5236 }
5237 data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5238 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5239 if (rc != 0) {
5240 pr_err("error %d\n", rc);
5241 goto rw_error;
5242 }
5243
5244 /* Disable SCU IF AGC loop */
5245 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5246 if (rc != 0) {
5247 pr_err("error %d\n", rc);
5248 goto rw_error;
5249 }
5250 data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5251 data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5252 if (common_attr->tuner_if_agc_pol)
5253 data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5254 else
5255 data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5256 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5257 if (rc != 0) {
5258 pr_err("error %d\n", rc);
5259 goto rw_error;
5260 }
5261
5262 /* Write value to output pin */
5263 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->output_level, 0);
5264 if (rc != 0) {
5265 pr_err("error %d\n", rc);
5266 goto rw_error;
5267 }
5268 break;
5269
5270 case DRX_AGC_CTRL_OFF:
5271
5272 /* Disable If AGC DAC */
5273 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5274 if (rc != 0) {
5275 pr_err("error %d\n", rc);
5276 goto rw_error;
5277 }
5278 data &= (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE);
5279 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5280 if (rc != 0) {
5281 pr_err("error %d\n", rc);
5282 goto rw_error;
5283 }
5284
5285 /* Disable SCU IF AGC loop */
5286 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5287 if (rc != 0) {
5288 pr_err("error %d\n", rc);
5289 goto rw_error;
5290 }
5291 data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5292 data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5293 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5294 if (rc != 0) {
5295 pr_err("error %d\n", rc);
5296 goto rw_error;
5297 }
5298 break;
5299 default:
5300 return -EINVAL;
5301 } /* switch ( agcsettings->ctrl_mode ) */
5302
5303 /* always set the top to support configurations without if-loop */
5304 rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, agc_settings->top, 0);
5305 if (rc != 0) {
5306 pr_err("error %d\n", rc);
5307 goto rw_error;
5308 }
5309 }
5310
5311 /* Store if agc settings */
5312 switch (agc_settings->standard) {
5313 case DRX_STANDARD_8VSB:
5314 ext_attr->vsb_if_agc_cfg = *agc_settings;
5315 break;
5316 #ifndef DRXJ_VSB_ONLY
5317 case DRX_STANDARD_ITU_A:
5318 case DRX_STANDARD_ITU_B:
5319 case DRX_STANDARD_ITU_C:
5320 ext_attr->qam_if_agc_cfg = *agc_settings;
5321 break;
5322 #endif
5323 default:
5324 return -EIO;
5325 }
5326
5327 return 0;
5328 rw_error:
5329 return rc;
5330 }
5331
5332 /**
5333 * \fn int set_iqm_af ()
5334 * \brief Configure IQM AF registers
5335 * \param demod instance of demodulator.
5336 * \param active
5337 * \return int.
5338 */
5339 static int set_iqm_af(struct drx_demod_instance *demod, bool active)
5340 {
5341 u16 data = 0;
5342 struct i2c_device_addr *dev_addr = NULL;
5343 int rc;
5344
5345 dev_addr = demod->my_i2c_dev_addr;
5346
5347 /* Configure IQM */
5348 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5349 if (rc != 0) {
5350 pr_err("error %d\n", rc);
5351 goto rw_error;
5352 }
5353 if (!active)
5354 data &= ((~IQM_AF_STDBY_STDBY_ADC_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_AMP_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_PD_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE));
5355 else
5356 data |= (IQM_AF_STDBY_STDBY_ADC_A2_ACTIVE | IQM_AF_STDBY_STDBY_AMP_A2_ACTIVE | IQM_AF_STDBY_STDBY_PD_A2_ACTIVE | IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE | IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE);
5357 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5358 if (rc != 0) {
5359 pr_err("error %d\n", rc);
5360 goto rw_error;
5361 }
5362
5363 return 0;
5364 rw_error:
5365 return rc;
5366 }
5367
5368 /*============================================================================*/
5369 /*== END 8VSB & QAM COMMON DATAPATH FUNCTIONS ==*/
5370 /*============================================================================*/
5371
5372 /*============================================================================*/
5373 /*============================================================================*/
5374 /*== 8VSB DATAPATH FUNCTIONS ==*/
5375 /*============================================================================*/
5376 /*============================================================================*/
5377
5378 /**
5379 * \fn int power_down_vsb ()
5380 * \brief Powr down QAM related blocks.
5381 * \param demod instance of demodulator.
5382 * \param channel pointer to channel data.
5383 * \return int.
5384 */
5385 static int power_down_vsb(struct drx_demod_instance *demod, bool primary)
5386 {
5387 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
5388 struct drxjscu_cmd cmd_scu = { /* command */ 0,
5389 /* parameter_len */ 0,
5390 /* result_len */ 0,
5391 /* *parameter */ NULL,
5392 /* *result */ NULL
5393 };
5394 struct drx_cfg_mpeg_output cfg_mpeg_output;
5395 int rc;
5396 u16 cmd_result = 0;
5397
5398 /*
5399 STOP demodulator
5400 reset of FEC and VSB HW
5401 */
5402 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
5403 SCU_RAM_COMMAND_CMD_DEMOD_STOP;
5404 cmd_scu.parameter_len = 0;
5405 cmd_scu.result_len = 1;
5406 cmd_scu.parameter = NULL;
5407 cmd_scu.result = &cmd_result;
5408 rc = scu_command(dev_addr, &cmd_scu);
5409 if (rc != 0) {
5410 pr_err("error %d\n", rc);
5411 goto rw_error;
5412 }
5413
5414 /* stop all comm_exec */
5415 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5416 if (rc != 0) {
5417 pr_err("error %d\n", rc);
5418 goto rw_error;
5419 }
5420 rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5421 if (rc != 0) {
5422 pr_err("error %d\n", rc);
5423 goto rw_error;
5424 }
5425 if (primary) {
5426 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
5427 if (rc != 0) {
5428 pr_err("error %d\n", rc);
5429 goto rw_error;
5430 }
5431 rc = set_iqm_af(demod, false);
5432 if (rc != 0) {
5433 pr_err("error %d\n", rc);
5434 goto rw_error;
5435 }
5436 } else {
5437 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5438 if (rc != 0) {
5439 pr_err("error %d\n", rc);
5440 goto rw_error;
5441 }
5442 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5443 if (rc != 0) {
5444 pr_err("error %d\n", rc);
5445 goto rw_error;
5446 }
5447 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5448 if (rc != 0) {
5449 pr_err("error %d\n", rc);
5450 goto rw_error;
5451 }
5452 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5453 if (rc != 0) {
5454 pr_err("error %d\n", rc);
5455 goto rw_error;
5456 }
5457 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5458 if (rc != 0) {
5459 pr_err("error %d\n", rc);
5460 goto rw_error;
5461 }
5462 }
5463
5464 cfg_mpeg_output.enable_mpeg_output = false;
5465 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
5466 if (rc != 0) {
5467 pr_err("error %d\n", rc);
5468 goto rw_error;
5469 }
5470
5471 return 0;
5472 rw_error:
5473 return rc;
5474 }
5475
5476 /**
5477 * \fn int set_vsb_leak_n_gain ()
5478 * \brief Set ATSC demod.
5479 * \param demod instance of demodulator.
5480 * \return int.
5481 */
5482 static int set_vsb_leak_n_gain(struct drx_demod_instance *demod)
5483 {
5484 struct i2c_device_addr *dev_addr = NULL;
5485 int rc;
5486
5487 const u8 vsb_ffe_leak_gain_ram0[] = {
5488 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO1 */
5489 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO2 */
5490 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO3 */
5491 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO4 */
5492 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO5 */
5493 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO6 */
5494 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO7 */
5495 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO8 */
5496 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO9 */
5497 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO10 */
5498 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO11 */
5499 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO12 */
5500 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO1 */
5501 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO2 */
5502 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO3 */
5503 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO4 */
5504 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO5 */
5505 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO6 */
5506 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO7 */
5507 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO8 */
5508 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO9 */
5509 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO10 */
5510 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO11 */
5511 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO12 */
5512 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO1 */
5513 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO2 */
5514 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO3 */
5515 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO4 */
5516 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO5 */
5517 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO6 */
5518 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO7 */
5519 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO8 */
5520 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO9 */
5521 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO10 */
5522 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO11 */
5523 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO12 */
5524 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO1 */
5525 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO2 */
5526 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO3 */
5527 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO4 */
5528 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO5 */
5529 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO6 */
5530 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO7 */
5531 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO8 */
5532 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO9 */
5533 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO10 */
5534 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO11 */
5535 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO12 */
5536 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO1 */
5537 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO2 */
5538 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO3 */
5539 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO4 */
5540 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO5 */
5541 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO6 */
5542 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO7 */
5543 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO8 */
5544 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO9 */
5545 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO10 */
5546 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO11 */
5547 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO12 */
5548 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO1 */
5549 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO2 */
5550 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO3 */
5551 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO4 */
5552 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO5 */
5553 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO6 */
5554 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO7 */
5555 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO8 */
5556 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO9 */
5557 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO10 */
5558 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO11 */
5559 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO12 */
5560 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO1 */
5561 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO2 */
5562 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO3 */
5563 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO4 */
5564 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO5 */
5565 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO6 */
5566 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO7 */
5567 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO8 */
5568 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO9 */
5569 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO10 */
5570 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO11 */
5571 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO12 */
5572 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO1 */
5573 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO2 */
5574 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO3 */
5575 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO4 */
5576 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO5 */
5577 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO6 */
5578 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO7 */
5579 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO8 */
5580 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO9 */
5581 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO10 */
5582 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO11 */
5583 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO12 */
5584 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO1 */
5585 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO2 */
5586 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO3 */
5587 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO4 */
5588 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO5 */
5589 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO6 */
5590 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO7 */
5591 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO8 */
5592 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO9 */
5593 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO10 */
5594 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO11 */
5595 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO12 */
5596 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN1 */
5597 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN2 */
5598 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN3 */
5599 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN4 */
5600 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN5 */
5601 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN6 */
5602 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN7 */
5603 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN8 */
5604 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN9 */
5605 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN10 */
5606 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN11 */
5607 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN12 */
5608 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN1 */
5609 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN2 */
5610 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN3 */
5611 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN4 */
5612 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN5 */
5613 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN6 */
5614 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN7 */
5615 DRXJ_16TO8(0x1010) /* FIRRCA1GAIN8 */
5616 };
5617
5618 const u8 vsb_ffe_leak_gain_ram1[] = {
5619 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN9 */
5620 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN10 */
5621 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN11 */
5622 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN12 */
5623 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN1 */
5624 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN2 */
5625 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN3 */
5626 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN4 */
5627 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN5 */
5628 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN6 */
5629 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN7 */
5630 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN8 */
5631 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN9 */
5632 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN10 */
5633 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN11 */
5634 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN12 */
5635 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN1 */
5636 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN2 */
5637 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN3 */
5638 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN4 */
5639 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN5 */
5640 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN6 */
5641 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN7 */
5642 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN8 */
5643 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN9 */
5644 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN10 */
5645 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN11 */
5646 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN12 */
5647 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN1 */
5648 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN2 */
5649 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN3 */
5650 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN4 */
5651 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN5 */
5652 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN6 */
5653 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN7 */
5654 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN8 */
5655 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN9 */
5656 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN10 */
5657 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN11 */
5658 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN12 */
5659 DRXJ_16TO8(0x001f), /* DFETRAINLKRATIO */
5660 DRXJ_16TO8(0x01ff), /* DFERCA1TRAINLKRATIO */
5661 DRXJ_16TO8(0x01ff), /* DFERCA1DATALKRATIO */
5662 DRXJ_16TO8(0x004f), /* DFERCA2TRAINLKRATIO */
5663 DRXJ_16TO8(0x004f), /* DFERCA2DATALKRATIO */
5664 DRXJ_16TO8(0x01ff), /* DFEDDM1TRAINLKRATIO */
5665 DRXJ_16TO8(0x01ff), /* DFEDDM1DATALKRATIO */
5666 DRXJ_16TO8(0x0352), /* DFEDDM2TRAINLKRATIO */
5667 DRXJ_16TO8(0x0352), /* DFEDDM2DATALKRATIO */
5668 DRXJ_16TO8(0x0000), /* DFETRAINGAIN */
5669 DRXJ_16TO8(0x2020), /* DFERCA1GAIN */
5670 DRXJ_16TO8(0x1010), /* DFERCA2GAIN */
5671 DRXJ_16TO8(0x1818), /* DFEDDM1GAIN */
5672 DRXJ_16TO8(0x1212) /* DFEDDM2GAIN */
5673 };
5674
5675 dev_addr = demod->my_i2c_dev_addr;
5676 rc = drxdap_fasi_write_block(dev_addr, VSB_SYSCTRL_RAM0_FFETRAINLKRATIO1__A, sizeof(vsb_ffe_leak_gain_ram0), ((u8 *)vsb_ffe_leak_gain_ram0), 0);
5677 if (rc != 0) {
5678 pr_err("error %d\n", rc);
5679 goto rw_error;
5680 }
5681 rc = drxdap_fasi_write_block(dev_addr, VSB_SYSCTRL_RAM1_FIRRCA1GAIN9__A, sizeof(vsb_ffe_leak_gain_ram1), ((u8 *)vsb_ffe_leak_gain_ram1), 0);
5682 if (rc != 0) {
5683 pr_err("error %d\n", rc);
5684 goto rw_error;
5685 }
5686
5687 return 0;
5688 rw_error:
5689 return rc;
5690 }
5691
5692 /**
5693 * \fn int set_vsb()
5694 * \brief Set 8VSB demod.
5695 * \param demod instance of demodulator.
5696 * \return int.
5697 *
5698 */
5699 static int set_vsb(struct drx_demod_instance *demod)
5700 {
5701 struct i2c_device_addr *dev_addr = NULL;
5702 int rc;
5703 struct drx_common_attr *common_attr = NULL;
5704 struct drxjscu_cmd cmd_scu;
5705 struct drxj_data *ext_attr = NULL;
5706 u16 cmd_result = 0;
5707 u16 cmd_param = 0;
5708 const u8 vsb_taps_re[] = {
5709 DRXJ_16TO8(-2), /* re0 */
5710 DRXJ_16TO8(4), /* re1 */
5711 DRXJ_16TO8(1), /* re2 */
5712 DRXJ_16TO8(-4), /* re3 */
5713 DRXJ_16TO8(1), /* re4 */
5714 DRXJ_16TO8(4), /* re5 */
5715 DRXJ_16TO8(-3), /* re6 */
5716 DRXJ_16TO8(-3), /* re7 */
5717 DRXJ_16TO8(6), /* re8 */
5718 DRXJ_16TO8(1), /* re9 */
5719 DRXJ_16TO8(-9), /* re10 */
5720 DRXJ_16TO8(3), /* re11 */
5721 DRXJ_16TO8(12), /* re12 */
5722 DRXJ_16TO8(-9), /* re13 */
5723 DRXJ_16TO8(-15), /* re14 */
5724 DRXJ_16TO8(17), /* re15 */
5725 DRXJ_16TO8(19), /* re16 */
5726 DRXJ_16TO8(-29), /* re17 */
5727 DRXJ_16TO8(-22), /* re18 */
5728 DRXJ_16TO8(45), /* re19 */
5729 DRXJ_16TO8(25), /* re20 */
5730 DRXJ_16TO8(-70), /* re21 */
5731 DRXJ_16TO8(-28), /* re22 */
5732 DRXJ_16TO8(111), /* re23 */
5733 DRXJ_16TO8(30), /* re24 */
5734 DRXJ_16TO8(-201), /* re25 */
5735 DRXJ_16TO8(-31), /* re26 */
5736 DRXJ_16TO8(629) /* re27 */
5737 };
5738
5739 dev_addr = demod->my_i2c_dev_addr;
5740 common_attr = (struct drx_common_attr *) demod->my_common_attr;
5741 ext_attr = (struct drxj_data *) demod->my_ext_attr;
5742
5743 /* stop all comm_exec */
5744 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5745 if (rc != 0) {
5746 pr_err("error %d\n", rc);
5747 goto rw_error;
5748 }
5749 rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5750 if (rc != 0) {
5751 pr_err("error %d\n", rc);
5752 goto rw_error;
5753 }
5754 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5755 if (rc != 0) {
5756 pr_err("error %d\n", rc);
5757 goto rw_error;
5758 }
5759 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5760 if (rc != 0) {
5761 pr_err("error %d\n", rc);
5762 goto rw_error;
5763 }
5764 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5765 if (rc != 0) {
5766 pr_err("error %d\n", rc);
5767 goto rw_error;
5768 }
5769 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5770 if (rc != 0) {
5771 pr_err("error %d\n", rc);
5772 goto rw_error;
5773 }
5774 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5775 if (rc != 0) {
5776 pr_err("error %d\n", rc);
5777 goto rw_error;
5778 }
5779
5780 /* reset demodulator */
5781 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
5782 | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
5783 cmd_scu.parameter_len = 0;
5784 cmd_scu.result_len = 1;
5785 cmd_scu.parameter = NULL;
5786 cmd_scu.result = &cmd_result;
5787 rc = scu_command(dev_addr, &cmd_scu);
5788 if (rc != 0) {
5789 pr_err("error %d\n", rc);
5790 goto rw_error;
5791 }
5792
5793 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_DCF_BYPASS__A, 1, 0);
5794 if (rc != 0) {
5795 pr_err("error %d\n", rc);
5796 goto rw_error;
5797 }
5798 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, IQM_FS_ADJ_SEL_B_VSB, 0);
5799 if (rc != 0) {
5800 pr_err("error %d\n", rc);
5801 goto rw_error;
5802 }
5803 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, IQM_RC_ADJ_SEL_B_VSB, 0);
5804 if (rc != 0) {
5805 pr_err("error %d\n", rc);
5806 goto rw_error;
5807 }
5808 ext_attr->iqm_rc_rate_ofs = 0x00AD0D79;
5809 rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, ext_attr->iqm_rc_rate_ofs, 0);
5810 if (rc != 0) {
5811 pr_err("error %d\n", rc);
5812 goto rw_error;
5813 }
5814 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CFAGC_GAINSHIFT__A, 4, 0);
5815 if (rc != 0) {
5816 pr_err("error %d\n", rc);
5817 goto rw_error;
5818 }
5819 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 1, 0);
5820 if (rc != 0) {
5821 pr_err("error %d\n", rc);
5822 goto rw_error;
5823 }
5824
5825 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_CROUT_ENA__A, 1, 0);
5826 if (rc != 0) {
5827 pr_err("error %d\n", rc);
5828 goto rw_error;
5829 }
5830 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, 28, 0);
5831 if (rc != 0) {
5832 pr_err("error %d\n", rc);
5833 goto rw_error;
5834 }
5835 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_ACTIVE__A, 0, 0);
5836 if (rc != 0) {
5837 pr_err("error %d\n", rc);
5838 goto rw_error;
5839 }
5840 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
5841 if (rc != 0) {
5842 pr_err("error %d\n", rc);
5843 goto rw_error;
5844 }
5845 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
5846 if (rc != 0) {
5847 pr_err("error %d\n", rc);
5848 goto rw_error;
5849 }
5850 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_VSB__M, 0);
5851 if (rc != 0) {
5852 pr_err("error %d\n", rc);
5853 goto rw_error;
5854 }
5855 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE__A, 1393, 0);
5856 if (rc != 0) {
5857 pr_err("error %d\n", rc);
5858 goto rw_error;
5859 }
5860 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
5861 if (rc != 0) {
5862 pr_err("error %d\n", rc);
5863 goto rw_error;
5864 }
5865 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
5866 if (rc != 0) {
5867 pr_err("error %d\n", rc);
5868 goto rw_error;
5869 }
5870
5871 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5872 if (rc != 0) {
5873 pr_err("error %d\n", rc);
5874 goto rw_error;
5875 }
5876 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5877 if (rc != 0) {
5878 pr_err("error %d\n", rc);
5879 goto rw_error;
5880 }
5881
5882 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BNTHRESH__A, 330, 0);
5883 if (rc != 0) {
5884 pr_err("error %d\n", rc);
5885 goto rw_error;
5886 } /* set higher threshold */
5887 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CLPLASTNUM__A, 90, 0);
5888 if (rc != 0) {
5889 pr_err("error %d\n", rc);
5890 goto rw_error;
5891 } /* burst detection on */
5892 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA1__A, 0x0042, 0);
5893 if (rc != 0) {
5894 pr_err("error %d\n", rc);
5895 goto rw_error;
5896 } /* drop thresholds by 1 dB */
5897 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA2__A, 0x0053, 0);
5898 if (rc != 0) {
5899 pr_err("error %d\n", rc);
5900 goto rw_error;
5901 } /* drop thresholds by 2 dB */
5902 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_EQCTRL__A, 0x1, 0);
5903 if (rc != 0) {
5904 pr_err("error %d\n", rc);
5905 goto rw_error;
5906 } /* cma on */
5907 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
5908 if (rc != 0) {
5909 pr_err("error %d\n", rc);
5910 goto rw_error;
5911 } /* GPIO */
5912
5913 /* Initialize the FEC Subsystem */
5914 rc = drxj_dap_write_reg16(dev_addr, FEC_TOP_ANNEX__A, FEC_TOP_ANNEX_D, 0);
5915 if (rc != 0) {
5916 pr_err("error %d\n", rc);
5917 goto rw_error;
5918 }
5919 {
5920 u16 fec_oc_snc_mode = 0;
5921 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
5922 if (rc != 0) {
5923 pr_err("error %d\n", rc);
5924 goto rw_error;
5925 }
5926 /* output data even when not locked */
5927 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode | FEC_OC_SNC_MODE_UNLOCK_ENABLE__M, 0);
5928 if (rc != 0) {
5929 pr_err("error %d\n", rc);
5930 goto rw_error;
5931 }
5932 }
5933
5934 /* set clip */
5935 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
5936 if (rc != 0) {
5937 pr_err("error %d\n", rc);
5938 goto rw_error;
5939 }
5940 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 470, 0);
5941 if (rc != 0) {
5942 pr_err("error %d\n", rc);
5943 goto rw_error;
5944 }
5945 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
5946 if (rc != 0) {
5947 pr_err("error %d\n", rc);
5948 goto rw_error;
5949 }
5950 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0xD4, 0);
5951 if (rc != 0) {
5952 pr_err("error %d\n", rc);
5953 goto rw_error;
5954 }
5955 /* no transparent, no A&C framing; parity is set in mpegoutput */
5956 {
5957 u16 fec_oc_reg_mode = 0;
5958 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
5959 if (rc != 0) {
5960 pr_err("error %d\n", rc);
5961 goto rw_error;
5962 }
5963 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode & (~(FEC_OC_MODE_TRANSPARENT__M | FEC_OC_MODE_CLEAR__M | FEC_OC_MODE_RETAIN_FRAMING__M)), 0);
5964 if (rc != 0) {
5965 pr_err("error %d\n", rc);
5966 goto rw_error;
5967 }
5968 }
5969
5970 rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_LO__A, 0, 0);
5971 if (rc != 0) {
5972 pr_err("error %d\n", rc);
5973 goto rw_error;
5974 } /* timeout counter for restarting */
5975 rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_HI__A, 3, 0);
5976 if (rc != 0) {
5977 pr_err("error %d\n", rc);
5978 goto rw_error;
5979 }
5980 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MODE__A, 0, 0);
5981 if (rc != 0) {
5982 pr_err("error %d\n", rc);
5983 goto rw_error;
5984 } /* bypass disabled */
5985 /* initialize RS packet error measurement parameters */
5986 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, FEC_RS_MEASUREMENT_PERIOD, 0);
5987 if (rc != 0) {
5988 pr_err("error %d\n", rc);
5989 goto rw_error;
5990 }
5991 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, FEC_RS_MEASUREMENT_PRESCALE, 0);
5992 if (rc != 0) {
5993 pr_err("error %d\n", rc);
5994 goto rw_error;
5995 }
5996
5997 /* init measurement period of MER/SER */
5998 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_MEASUREMENT_PERIOD__A, VSB_TOP_MEASUREMENT_PERIOD, 0);
5999 if (rc != 0) {
6000 pr_err("error %d\n", rc);
6001 goto rw_error;
6002 }
6003 rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6004 if (rc != 0) {
6005 pr_err("error %d\n", rc);
6006 goto rw_error;
6007 }
6008 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6009 if (rc != 0) {
6010 pr_err("error %d\n", rc);
6011 goto rw_error;
6012 }
6013 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6014 if (rc != 0) {
6015 pr_err("error %d\n", rc);
6016 goto rw_error;
6017 }
6018
6019 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CKGN1TRK__A, 128, 0);
6020 if (rc != 0) {
6021 pr_err("error %d\n", rc);
6022 goto rw_error;
6023 }
6024 /* B-Input to ADC, PGA+filter in standby */
6025 if (!ext_attr->has_lna) {
6026 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
6027 if (rc != 0) {
6028 pr_err("error %d\n", rc);
6029 goto rw_error;
6030 }
6031 }
6032
6033 /* turn on IQMAF. It has to be in front of setAgc**() */
6034 rc = set_iqm_af(demod, true);
6035 if (rc != 0) {
6036 pr_err("error %d\n", rc);
6037 goto rw_error;
6038 }
6039 rc = adc_synchronization(demod);
6040 if (rc != 0) {
6041 pr_err("error %d\n", rc);
6042 goto rw_error;
6043 }
6044
6045 rc = init_agc(demod);
6046 if (rc != 0) {
6047 pr_err("error %d\n", rc);
6048 goto rw_error;
6049 }
6050 rc = set_agc_if(demod, &(ext_attr->vsb_if_agc_cfg), false);
6051 if (rc != 0) {
6052 pr_err("error %d\n", rc);
6053 goto rw_error;
6054 }
6055 rc = set_agc_rf(demod, &(ext_attr->vsb_rf_agc_cfg), false);
6056 if (rc != 0) {
6057 pr_err("error %d\n", rc);
6058 goto rw_error;
6059 }
6060 {
6061 /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
6062 of only the gain */
6063 struct drxj_cfg_afe_gain vsb_pga_cfg = { DRX_STANDARD_8VSB, 0 };
6064
6065 vsb_pga_cfg.gain = ext_attr->vsb_pga_cfg;
6066 rc = ctrl_set_cfg_afe_gain(demod, &vsb_pga_cfg);
6067 if (rc != 0) {
6068 pr_err("error %d\n", rc);
6069 goto rw_error;
6070 }
6071 }
6072 rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->vsb_pre_saw_cfg));
6073 if (rc != 0) {
6074 pr_err("error %d\n", rc);
6075 goto rw_error;
6076 }
6077
6078 /* Mpeg output has to be in front of FEC active */
6079 rc = set_mpegtei_handling(demod);
6080 if (rc != 0) {
6081 pr_err("error %d\n", rc);
6082 goto rw_error;
6083 }
6084 rc = bit_reverse_mpeg_output(demod);
6085 if (rc != 0) {
6086 pr_err("error %d\n", rc);
6087 goto rw_error;
6088 }
6089 rc = set_mpeg_start_width(demod);
6090 if (rc != 0) {
6091 pr_err("error %d\n", rc);
6092 goto rw_error;
6093 }
6094 {
6095 /* TODO: move to set_standard after hardware reset value problem is solved */
6096 /* Configure initial MPEG output */
6097 struct drx_cfg_mpeg_output cfg_mpeg_output;
6098
6099 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6100 cfg_mpeg_output.enable_mpeg_output = true;
6101
6102 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6103 if (rc != 0) {
6104 pr_err("error %d\n", rc);
6105 goto rw_error;
6106 }
6107 }
6108
6109 /* TBD: what parameters should be set */
6110 cmd_param = 0x00; /* Default mode AGC on, etc */
6111 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6112 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
6113 cmd_scu.parameter_len = 1;
6114 cmd_scu.result_len = 1;
6115 cmd_scu.parameter = &cmd_param;
6116 cmd_scu.result = &cmd_result;
6117 rc = scu_command(dev_addr, &cmd_scu);
6118 if (rc != 0) {
6119 pr_err("error %d\n", rc);
6120 goto rw_error;
6121 }
6122
6123 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEAGC_GAINSHIFT__A, 0x0004, 0);
6124 if (rc != 0) {
6125 pr_err("error %d\n", rc);
6126 goto rw_error;
6127 }
6128 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0x00D2, 0);
6129 if (rc != 0) {
6130 pr_err("error %d\n", rc);
6131 goto rw_error;
6132 }
6133 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SYSSMTRNCTRL__A, VSB_TOP_SYSSMTRNCTRL__PRE | VSB_TOP_SYSSMTRNCTRL_NCOTIMEOUTCNTEN__M, 0);
6134 if (rc != 0) {
6135 pr_err("error %d\n", rc);
6136 goto rw_error;
6137 }
6138 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEDETCTRL__A, 0x142, 0);
6139 if (rc != 0) {
6140 pr_err("error %d\n", rc);
6141 goto rw_error;
6142 }
6143 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_LBAGCREFLVL__A, 640, 0);
6144 if (rc != 0) {
6145 pr_err("error %d\n", rc);
6146 goto rw_error;
6147 }
6148 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1ACQ__A, 4, 0);
6149 if (rc != 0) {
6150 pr_err("error %d\n", rc);
6151 goto rw_error;
6152 }
6153 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 2, 0);
6154 if (rc != 0) {
6155 pr_err("error %d\n", rc);
6156 goto rw_error;
6157 }
6158 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN2TRK__A, 3, 0);
6159 if (rc != 0) {
6160 pr_err("error %d\n", rc);
6161 goto rw_error;
6162 }
6163
6164 /* start demodulator */
6165 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6166 | SCU_RAM_COMMAND_CMD_DEMOD_START;
6167 cmd_scu.parameter_len = 0;
6168 cmd_scu.result_len = 1;
6169 cmd_scu.parameter = NULL;
6170 cmd_scu.result = &cmd_result;
6171 rc = scu_command(dev_addr, &cmd_scu);
6172 if (rc != 0) {
6173 pr_err("error %d\n", rc);
6174 goto rw_error;
6175 }
6176
6177 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
6178 if (rc != 0) {
6179 pr_err("error %d\n", rc);
6180 goto rw_error;
6181 }
6182 rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_ACTIVE, 0);
6183 if (rc != 0) {
6184 pr_err("error %d\n", rc);
6185 goto rw_error;
6186 }
6187 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
6188 if (rc != 0) {
6189 pr_err("error %d\n", rc);
6190 goto rw_error;
6191 }
6192
6193 return 0;
6194 rw_error:
6195 return rc;
6196 }
6197
6198 /**
6199 * \fn static short get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *PckErrs)
6200 * \brief Get the values of packet error in 8VSB mode
6201 * \return Error code
6202 */
6203 static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr,
6204 u32 *pck_errs, u32 *pck_count)
6205 {
6206 int rc;
6207 u16 data = 0;
6208 u16 period = 0;
6209 u16 prescale = 0;
6210 u16 packet_errors_mant = 0;
6211 u16 packet_errors_exp = 0;
6212
6213 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &data, 0);
6214 if (rc != 0) {
6215 pr_err("error %d\n", rc);
6216 goto rw_error;
6217 }
6218 packet_errors_mant = data & FEC_RS_NR_FAILURES_FIXED_MANT__M;
6219 packet_errors_exp = (data & FEC_RS_NR_FAILURES_EXP__M)
6220 >> FEC_RS_NR_FAILURES_EXP__B;
6221 period = FEC_RS_MEASUREMENT_PERIOD;
6222 prescale = FEC_RS_MEASUREMENT_PRESCALE;
6223 /* packet error rate = (error packet number) per second */
6224 /* 77.3 us is time for per packet */
6225 if (period * prescale == 0) {
6226 pr_err("error: period and/or prescale is zero!\n");
6227 return -EIO;
6228 }
6229 *pck_errs = packet_errors_mant * (1 << packet_errors_exp);
6230 *pck_count = period * prescale * 77;
6231
6232 return 0;
6233 rw_error:
6234 return rc;
6235 }
6236
6237 /**
6238 * \fn static short GetVSBBer(struct i2c_device_addr *dev_addr, u32 *ber)
6239 * \brief Get the values of ber in VSB mode
6240 * \return Error code
6241 */
6242 static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr,
6243 u32 *ber, u32 *cnt)
6244 {
6245 int rc;
6246 u16 data = 0;
6247 u16 period = 0;
6248 u16 prescale = 0;
6249 u16 bit_errors_mant = 0;
6250 u16 bit_errors_exp = 0;
6251
6252 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &data, 0);
6253 if (rc != 0) {
6254 pr_err("error %d\n", rc);
6255 goto rw_error;
6256 }
6257 period = FEC_RS_MEASUREMENT_PERIOD;
6258 prescale = FEC_RS_MEASUREMENT_PRESCALE;
6259
6260 bit_errors_mant = data & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M;
6261 bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M)
6262 >> FEC_RS_NR_BIT_ERRORS_EXP__B;
6263
6264 *cnt = period * prescale * 207 * ((bit_errors_exp > 2) ? 1 : 8);
6265
6266 if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700)
6267 *ber = (*cnt) * 26570;
6268 else {
6269 if (period * prescale == 0) {
6270 pr_err("error: period and/or prescale is zero!\n");
6271 return -EIO;
6272 }
6273 *ber = bit_errors_mant << ((bit_errors_exp > 2) ?
6274 (bit_errors_exp - 3) : bit_errors_exp);
6275 }
6276
6277 return 0;
6278 rw_error:
6279 return rc;
6280 }
6281
6282 /**
6283 * \fn static short get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
6284 * \brief Get the values of ber in VSB mode
6285 * \return Error code
6286 */
6287 static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr,
6288 u32 *ber, u32 *cnt)
6289 {
6290 u16 data = 0;
6291 int rc;
6292
6293 rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0);
6294 if (rc != 0) {
6295 pr_err("error %d\n", rc);
6296 return -EIO;
6297 }
6298 *ber = data;
6299 *cnt = VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT;
6300
6301 return 0;
6302 }
6303
6304 /**
6305 * \fn static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6306 * \brief Get the values of MER
6307 * \return Error code
6308 */
6309 static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6310 {
6311 int rc;
6312 u16 data_hi = 0;
6313
6314 rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_ERR_ENERGY_H__A, &data_hi, 0);
6315 if (rc != 0) {
6316 pr_err("error %d\n", rc);
6317 goto rw_error;
6318 }
6319 *mer =
6320 (u16) (log1_times100(21504) - log1_times100((data_hi << 6) / 52));
6321
6322 return 0;
6323 rw_error:
6324 return rc;
6325 }
6326
6327
6328 /*============================================================================*/
6329 /*== END 8VSB DATAPATH FUNCTIONS ==*/
6330 /*============================================================================*/
6331
6332 /*============================================================================*/
6333 /*============================================================================*/
6334 /*== QAM DATAPATH FUNCTIONS ==*/
6335 /*============================================================================*/
6336 /*============================================================================*/
6337
6338 /**
6339 * \fn int power_down_qam ()
6340 * \brief Powr down QAM related blocks.
6341 * \param demod instance of demodulator.
6342 * \param channel pointer to channel data.
6343 * \return int.
6344 */
6345 static int power_down_qam(struct drx_demod_instance *demod, bool primary)
6346 {
6347 struct drxjscu_cmd cmd_scu = { /* command */ 0,
6348 /* parameter_len */ 0,
6349 /* result_len */ 0,
6350 /* *parameter */ NULL,
6351 /* *result */ NULL
6352 };
6353 int rc;
6354 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6355 struct drx_cfg_mpeg_output cfg_mpeg_output;
6356 struct drx_common_attr *common_attr = demod->my_common_attr;
6357 u16 cmd_result = 0;
6358
6359 /*
6360 STOP demodulator
6361 resets IQM, QAM and FEC HW blocks
6362 */
6363 /* stop all comm_exec */
6364 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
6365 if (rc != 0) {
6366 pr_err("error %d\n", rc);
6367 goto rw_error;
6368 }
6369 rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
6370 if (rc != 0) {
6371 pr_err("error %d\n", rc);
6372 goto rw_error;
6373 }
6374
6375 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
6376 SCU_RAM_COMMAND_CMD_DEMOD_STOP;
6377 cmd_scu.parameter_len = 0;
6378 cmd_scu.result_len = 1;
6379 cmd_scu.parameter = NULL;
6380 cmd_scu.result = &cmd_result;
6381 rc = scu_command(dev_addr, &cmd_scu);
6382 if (rc != 0) {
6383 pr_err("error %d\n", rc);
6384 goto rw_error;
6385 }
6386
6387 if (primary) {
6388 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
6389 if (rc != 0) {
6390 pr_err("error %d\n", rc);
6391 goto rw_error;
6392 }
6393 rc = set_iqm_af(demod, false);
6394 if (rc != 0) {
6395 pr_err("error %d\n", rc);
6396 goto rw_error;
6397 }
6398 } else {
6399 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
6400 if (rc != 0) {
6401 pr_err("error %d\n", rc);
6402 goto rw_error;
6403 }
6404 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
6405 if (rc != 0) {
6406 pr_err("error %d\n", rc);
6407 goto rw_error;
6408 }
6409 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
6410 if (rc != 0) {
6411 pr_err("error %d\n", rc);
6412 goto rw_error;
6413 }
6414 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
6415 if (rc != 0) {
6416 pr_err("error %d\n", rc);
6417 goto rw_error;
6418 }
6419 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
6420 if (rc != 0) {
6421 pr_err("error %d\n", rc);
6422 goto rw_error;
6423 }
6424 }
6425
6426 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6427 cfg_mpeg_output.enable_mpeg_output = false;
6428
6429 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6430 if (rc != 0) {
6431 pr_err("error %d\n", rc);
6432 goto rw_error;
6433 }
6434
6435 return 0;
6436 rw_error:
6437 return rc;
6438 }
6439
6440 /*============================================================================*/
6441
6442 /**
6443 * \fn int set_qam_measurement ()
6444 * \brief Setup of the QAM Measuremnt intervals for signal quality
6445 * \param demod instance of demod.
6446 * \param constellation current constellation.
6447 * \return int.
6448 *
6449 * NOTE:
6450 * Take into account that for certain settings the errorcounters can overflow.
6451 * The implementation does not check this.
6452 *
6453 * TODO: overriding the ext_attr->fec_bits_desired by constellation dependent
6454 * constants to get a measurement period of approx. 1 sec. Remove fec_bits_desired
6455 * field ?
6456 *
6457 */
6458 #ifndef DRXJ_VSB_ONLY
6459 static int
6460 set_qam_measurement(struct drx_demod_instance *demod,
6461 enum drx_modulation constellation, u32 symbol_rate)
6462 {
6463 struct i2c_device_addr *dev_addr = NULL; /* device address for I2C writes */
6464 struct drxj_data *ext_attr = NULL; /* Global data container for DRXJ specif data */
6465 int rc;
6466 u32 fec_bits_desired = 0; /* BER accounting period */
6467 u16 fec_rs_plen = 0; /* defines RS BER measurement period */
6468 u16 fec_rs_prescale = 0; /* ReedSolomon Measurement Prescale */
6469 u32 fec_rs_period = 0; /* Value for corresponding I2C register */
6470 u32 fec_rs_bit_cnt = 0; /* Actual precise amount of bits */
6471 u32 fec_oc_snc_fail_period = 0; /* Value for corresponding I2C register */
6472 u32 qam_vd_period = 0; /* Value for corresponding I2C register */
6473 u32 qam_vd_bit_cnt = 0; /* Actual precise amount of bits */
6474 u16 fec_vd_plen = 0; /* no of trellis symbols: VD SER measur period */
6475 u16 qam_vd_prescale = 0; /* Viterbi Measurement Prescale */
6476
6477 dev_addr = demod->my_i2c_dev_addr;
6478 ext_attr = (struct drxj_data *) demod->my_ext_attr;
6479
6480 fec_bits_desired = ext_attr->fec_bits_desired;
6481 fec_rs_prescale = ext_attr->fec_rs_prescale;
6482
6483 switch (constellation) {
6484 case DRX_CONSTELLATION_QAM16:
6485 fec_bits_desired = 4 * symbol_rate;
6486 break;
6487 case DRX_CONSTELLATION_QAM32:
6488 fec_bits_desired = 5 * symbol_rate;
6489 break;
6490 case DRX_CONSTELLATION_QAM64:
6491 fec_bits_desired = 6 * symbol_rate;
6492 break;
6493 case DRX_CONSTELLATION_QAM128:
6494 fec_bits_desired = 7 * symbol_rate;
6495 break;
6496 case DRX_CONSTELLATION_QAM256:
6497 fec_bits_desired = 8 * symbol_rate;
6498 break;
6499 default:
6500 return -EINVAL;
6501 }
6502
6503 /* Parameters for Reed-Solomon Decoder */
6504 /* fecrs_period = (int)ceil(FEC_BITS_DESIRED/(fecrs_prescale*plen)) */
6505 /* rs_bit_cnt = fecrs_period*fecrs_prescale*plen */
6506 /* result is within 32 bit arithmetic -> */
6507 /* no need for mult or frac functions */
6508
6509 /* TODO: use constant instead of calculation and remove the fec_rs_plen in ext_attr */
6510 switch (ext_attr->standard) {
6511 case DRX_STANDARD_ITU_A:
6512 case DRX_STANDARD_ITU_C:
6513 fec_rs_plen = 204 * 8;
6514 break;
6515 case DRX_STANDARD_ITU_B:
6516 fec_rs_plen = 128 * 7;
6517 break;
6518 default:
6519 return -EINVAL;
6520 }
6521
6522 ext_attr->fec_rs_plen = fec_rs_plen; /* for getSigQual */
6523 fec_rs_bit_cnt = fec_rs_prescale * fec_rs_plen; /* temp storage */
6524 if (fec_rs_bit_cnt == 0) {
6525 pr_err("error: fec_rs_bit_cnt is zero!\n");
6526 return -EIO;
6527 }
6528 fec_rs_period = fec_bits_desired / fec_rs_bit_cnt + 1; /* ceil */
6529 if (ext_attr->standard != DRX_STANDARD_ITU_B)
6530 fec_oc_snc_fail_period = fec_rs_period;
6531
6532 /* limit to max 16 bit value (I2C register width) if needed */
6533 if (fec_rs_period > 0xFFFF)
6534 fec_rs_period = 0xFFFF;
6535
6536 /* write corresponding registers */
6537 switch (ext_attr->standard) {
6538 case DRX_STANDARD_ITU_A:
6539 case DRX_STANDARD_ITU_C:
6540 break;
6541 case DRX_STANDARD_ITU_B:
6542 switch (constellation) {
6543 case DRX_CONSTELLATION_QAM64:
6544 fec_rs_period = 31581;
6545 fec_oc_snc_fail_period = 17932;
6546 break;
6547 case DRX_CONSTELLATION_QAM256:
6548 fec_rs_period = 45446;
6549 fec_oc_snc_fail_period = 25805;
6550 break;
6551 default:
6552 return -EINVAL;
6553 }
6554 break;
6555 default:
6556 return -EINVAL;
6557 }
6558
6559 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, (u16)fec_oc_snc_fail_period, 0);
6560 if (rc != 0) {
6561 pr_err("error %d\n", rc);
6562 goto rw_error;
6563 }
6564 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, (u16)fec_rs_period, 0);
6565 if (rc != 0) {
6566 pr_err("error %d\n", rc);
6567 goto rw_error;
6568 }
6569 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, fec_rs_prescale, 0);
6570 if (rc != 0) {
6571 pr_err("error %d\n", rc);
6572 goto rw_error;
6573 }
6574 ext_attr->fec_rs_period = (u16) fec_rs_period;
6575 ext_attr->fec_rs_prescale = fec_rs_prescale;
6576 rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6577 if (rc != 0) {
6578 pr_err("error %d\n", rc);
6579 goto rw_error;
6580 }
6581 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6582 if (rc != 0) {
6583 pr_err("error %d\n", rc);
6584 goto rw_error;
6585 }
6586 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6587 if (rc != 0) {
6588 pr_err("error %d\n", rc);
6589 goto rw_error;
6590 }
6591
6592 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
6593 /* Parameters for Viterbi Decoder */
6594 /* qamvd_period = (int)ceil(FEC_BITS_DESIRED/ */
6595 /* (qamvd_prescale*plen*(qam_constellation+1))) */
6596 /* vd_bit_cnt = qamvd_period*qamvd_prescale*plen */
6597 /* result is within 32 bit arithmetic -> */
6598 /* no need for mult or frac functions */
6599
6600 /* a(8 bit) * b(8 bit) = 16 bit result => mult32 not needed */
6601 fec_vd_plen = ext_attr->fec_vd_plen;
6602 qam_vd_prescale = ext_attr->qam_vd_prescale;
6603 qam_vd_bit_cnt = qam_vd_prescale * fec_vd_plen; /* temp storage */
6604
6605 switch (constellation) {
6606 case DRX_CONSTELLATION_QAM64:
6607 /* a(16 bit) * b(4 bit) = 20 bit result => mult32 not needed */
6608 qam_vd_period =
6609 qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM64 + 1)
6610 * (QAM_TOP_CONSTELLATION_QAM64 + 1);
6611 break;
6612 case DRX_CONSTELLATION_QAM256:
6613 /* a(16 bit) * b(5 bit) = 21 bit result => mult32 not needed */
6614 qam_vd_period =
6615 qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM256 + 1)
6616 * (QAM_TOP_CONSTELLATION_QAM256 + 1);
6617 break;
6618 default:
6619 return -EINVAL;
6620 }
6621 if (qam_vd_period == 0) {
6622 pr_err("error: qam_vd_period is zero!\n");
6623 return -EIO;
6624 }
6625 qam_vd_period = fec_bits_desired / qam_vd_period;
6626 /* limit to max 16 bit value (I2C register width) if needed */
6627 if (qam_vd_period > 0xFFFF)
6628 qam_vd_period = 0xFFFF;
6629
6630 /* a(16 bit) * b(16 bit) = 32 bit result => mult32 not needed */
6631 qam_vd_bit_cnt *= qam_vd_period;
6632
6633 rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PERIOD__A, (u16)qam_vd_period, 0);
6634 if (rc != 0) {
6635 pr_err("error %d\n", rc);
6636 goto rw_error;
6637 }
6638 rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PRESCALE__A, qam_vd_prescale, 0);
6639 if (rc != 0) {
6640 pr_err("error %d\n", rc);
6641 goto rw_error;
6642 }
6643 ext_attr->qam_vd_period = (u16) qam_vd_period;
6644 ext_attr->qam_vd_prescale = qam_vd_prescale;
6645 }
6646
6647 return 0;
6648 rw_error:
6649 return rc;
6650 }
6651
6652 /*============================================================================*/
6653
6654 /**
6655 * \fn int set_qam16 ()
6656 * \brief QAM16 specific setup
6657 * \param demod instance of demod.
6658 * \return int.
6659 */
6660 static int set_qam16(struct drx_demod_instance *demod)
6661 {
6662 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6663 int rc;
6664 const u8 qam_dq_qual_fun[] = {
6665 DRXJ_16TO8(2), /* fun0 */
6666 DRXJ_16TO8(2), /* fun1 */
6667 DRXJ_16TO8(2), /* fun2 */
6668 DRXJ_16TO8(2), /* fun3 */
6669 DRXJ_16TO8(3), /* fun4 */
6670 DRXJ_16TO8(3), /* fun5 */
6671 };
6672 const u8 qam_eq_cma_rad[] = {
6673 DRXJ_16TO8(13517), /* RAD0 */
6674 DRXJ_16TO8(13517), /* RAD1 */
6675 DRXJ_16TO8(13517), /* RAD2 */
6676 DRXJ_16TO8(13517), /* RAD3 */
6677 DRXJ_16TO8(13517), /* RAD4 */
6678 DRXJ_16TO8(13517), /* RAD5 */
6679 };
6680
6681 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6682 if (rc != 0) {
6683 pr_err("error %d\n", rc);
6684 goto rw_error;
6685 }
6686 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
6687 if (rc != 0) {
6688 pr_err("error %d\n", rc);
6689 goto rw_error;
6690 }
6691
6692 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 140, 0);
6693 if (rc != 0) {
6694 pr_err("error %d\n", rc);
6695 goto rw_error;
6696 }
6697 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6698 if (rc != 0) {
6699 pr_err("error %d\n", rc);
6700 goto rw_error;
6701 }
6702 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 120, 0);
6703 if (rc != 0) {
6704 pr_err("error %d\n", rc);
6705 goto rw_error;
6706 }
6707 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 230, 0);
6708 if (rc != 0) {
6709 pr_err("error %d\n", rc);
6710 goto rw_error;
6711 }
6712 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 95, 0);
6713 if (rc != 0) {
6714 pr_err("error %d\n", rc);
6715 goto rw_error;
6716 }
6717 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 105, 0);
6718 if (rc != 0) {
6719 pr_err("error %d\n", rc);
6720 goto rw_error;
6721 }
6722
6723 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6724 if (rc != 0) {
6725 pr_err("error %d\n", rc);
6726 goto rw_error;
6727 }
6728 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6729 if (rc != 0) {
6730 pr_err("error %d\n", rc);
6731 goto rw_error;
6732 }
6733 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6734 if (rc != 0) {
6735 pr_err("error %d\n", rc);
6736 goto rw_error;
6737 }
6738
6739 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 16, 0);
6740 if (rc != 0) {
6741 pr_err("error %d\n", rc);
6742 goto rw_error;
6743 }
6744 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 220, 0);
6745 if (rc != 0) {
6746 pr_err("error %d\n", rc);
6747 goto rw_error;
6748 }
6749 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 25, 0);
6750 if (rc != 0) {
6751 pr_err("error %d\n", rc);
6752 goto rw_error;
6753 }
6754 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 6, 0);
6755 if (rc != 0) {
6756 pr_err("error %d\n", rc);
6757 goto rw_error;
6758 }
6759 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-24), 0);
6760 if (rc != 0) {
6761 pr_err("error %d\n", rc);
6762 goto rw_error;
6763 }
6764 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-65), 0);
6765 if (rc != 0) {
6766 pr_err("error %d\n", rc);
6767 goto rw_error;
6768 }
6769 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-127), 0);
6770 if (rc != 0) {
6771 pr_err("error %d\n", rc);
6772 goto rw_error;
6773 }
6774
6775 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
6776 if (rc != 0) {
6777 pr_err("error %d\n", rc);
6778 goto rw_error;
6779 }
6780 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
6781 if (rc != 0) {
6782 pr_err("error %d\n", rc);
6783 goto rw_error;
6784 }
6785 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
6786 if (rc != 0) {
6787 pr_err("error %d\n", rc);
6788 goto rw_error;
6789 }
6790 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
6791 if (rc != 0) {
6792 pr_err("error %d\n", rc);
6793 goto rw_error;
6794 }
6795 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
6796 if (rc != 0) {
6797 pr_err("error %d\n", rc);
6798 goto rw_error;
6799 }
6800 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
6801 if (rc != 0) {
6802 pr_err("error %d\n", rc);
6803 goto rw_error;
6804 }
6805 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
6806 if (rc != 0) {
6807 pr_err("error %d\n", rc);
6808 goto rw_error;
6809 }
6810 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
6811 if (rc != 0) {
6812 pr_err("error %d\n", rc);
6813 goto rw_error;
6814 }
6815 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
6816 if (rc != 0) {
6817 pr_err("error %d\n", rc);
6818 goto rw_error;
6819 }
6820 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
6821 if (rc != 0) {
6822 pr_err("error %d\n", rc);
6823 goto rw_error;
6824 }
6825 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
6826 if (rc != 0) {
6827 pr_err("error %d\n", rc);
6828 goto rw_error;
6829 }
6830 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
6831 if (rc != 0) {
6832 pr_err("error %d\n", rc);
6833 goto rw_error;
6834 }
6835 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
6836 if (rc != 0) {
6837 pr_err("error %d\n", rc);
6838 goto rw_error;
6839 }
6840 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
6841 if (rc != 0) {
6842 pr_err("error %d\n", rc);
6843 goto rw_error;
6844 }
6845 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
6846 if (rc != 0) {
6847 pr_err("error %d\n", rc);
6848 goto rw_error;
6849 }
6850 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
6851 if (rc != 0) {
6852 pr_err("error %d\n", rc);
6853 goto rw_error;
6854 }
6855 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 240, 0);
6856 if (rc != 0) {
6857 pr_err("error %d\n", rc);
6858 goto rw_error;
6859 }
6860 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
6861 if (rc != 0) {
6862 pr_err("error %d\n", rc);
6863 goto rw_error;
6864 }
6865 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
6866 if (rc != 0) {
6867 pr_err("error %d\n", rc);
6868 goto rw_error;
6869 }
6870 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
6871 if (rc != 0) {
6872 pr_err("error %d\n", rc);
6873 goto rw_error;
6874 }
6875
6876 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 40960, 0);
6877 if (rc != 0) {
6878 pr_err("error %d\n", rc);
6879 goto rw_error;
6880 }
6881
6882 return 0;
6883 rw_error:
6884 return rc;
6885 }
6886
6887 /*============================================================================*/
6888
6889 /**
6890 * \fn int set_qam32 ()
6891 * \brief QAM32 specific setup
6892 * \param demod instance of demod.
6893 * \return int.
6894 */
6895 static int set_qam32(struct drx_demod_instance *demod)
6896 {
6897 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6898 int rc;
6899 const u8 qam_dq_qual_fun[] = {
6900 DRXJ_16TO8(3), /* fun0 */
6901 DRXJ_16TO8(3), /* fun1 */
6902 DRXJ_16TO8(3), /* fun2 */
6903 DRXJ_16TO8(3), /* fun3 */
6904 DRXJ_16TO8(4), /* fun4 */
6905 DRXJ_16TO8(4), /* fun5 */
6906 };
6907 const u8 qam_eq_cma_rad[] = {
6908 DRXJ_16TO8(6707), /* RAD0 */
6909 DRXJ_16TO8(6707), /* RAD1 */
6910 DRXJ_16TO8(6707), /* RAD2 */
6911 DRXJ_16TO8(6707), /* RAD3 */
6912 DRXJ_16TO8(6707), /* RAD4 */
6913 DRXJ_16TO8(6707), /* RAD5 */
6914 };
6915
6916 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6917 if (rc != 0) {
6918 pr_err("error %d\n", rc);
6919 goto rw_error;
6920 }
6921 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
6922 if (rc != 0) {
6923 pr_err("error %d\n", rc);
6924 goto rw_error;
6925 }
6926
6927 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 90, 0);
6928 if (rc != 0) {
6929 pr_err("error %d\n", rc);
6930 goto rw_error;
6931 }
6932 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6933 if (rc != 0) {
6934 pr_err("error %d\n", rc);
6935 goto rw_error;
6936 }
6937 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
6938 if (rc != 0) {
6939 pr_err("error %d\n", rc);
6940 goto rw_error;
6941 }
6942 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 170, 0);
6943 if (rc != 0) {
6944 pr_err("error %d\n", rc);
6945 goto rw_error;
6946 }
6947 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
6948 if (rc != 0) {
6949 pr_err("error %d\n", rc);
6950 goto rw_error;
6951 }
6952 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
6953 if (rc != 0) {
6954 pr_err("error %d\n", rc);
6955 goto rw_error;
6956 }
6957
6958 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6959 if (rc != 0) {
6960 pr_err("error %d\n", rc);
6961 goto rw_error;
6962 }
6963 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6964 if (rc != 0) {
6965 pr_err("error %d\n", rc);
6966 goto rw_error;
6967 }
6968 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6969 if (rc != 0) {
6970 pr_err("error %d\n", rc);
6971 goto rw_error;
6972 }
6973
6974 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
6975 if (rc != 0) {
6976 pr_err("error %d\n", rc);
6977 goto rw_error;
6978 }
6979 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 140, 0);
6980 if (rc != 0) {
6981 pr_err("error %d\n", rc);
6982 goto rw_error;
6983 }
6984 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16)(-8), 0);
6985 if (rc != 0) {
6986 pr_err("error %d\n", rc);
6987 goto rw_error;
6988 }
6989 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16)(-16), 0);
6990 if (rc != 0) {
6991 pr_err("error %d\n", rc);
6992 goto rw_error;
6993 }
6994 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-26), 0);
6995 if (rc != 0) {
6996 pr_err("error %d\n", rc);
6997 goto rw_error;
6998 }
6999 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-56), 0);
7000 if (rc != 0) {
7001 pr_err("error %d\n", rc);
7002 goto rw_error;
7003 }
7004 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-86), 0);
7005 if (rc != 0) {
7006 pr_err("error %d\n", rc);
7007 goto rw_error;
7008 }
7009
7010 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7011 if (rc != 0) {
7012 pr_err("error %d\n", rc);
7013 goto rw_error;
7014 }
7015 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7016 if (rc != 0) {
7017 pr_err("error %d\n", rc);
7018 goto rw_error;
7019 }
7020 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7021 if (rc != 0) {
7022 pr_err("error %d\n", rc);
7023 goto rw_error;
7024 }
7025 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
7026 if (rc != 0) {
7027 pr_err("error %d\n", rc);
7028 goto rw_error;
7029 }
7030 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7031 if (rc != 0) {
7032 pr_err("error %d\n", rc);
7033 goto rw_error;
7034 }
7035 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7036 if (rc != 0) {
7037 pr_err("error %d\n", rc);
7038 goto rw_error;
7039 }
7040 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
7041 if (rc != 0) {
7042 pr_err("error %d\n", rc);
7043 goto rw_error;
7044 }
7045 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
7046 if (rc != 0) {
7047 pr_err("error %d\n", rc);
7048 goto rw_error;
7049 }
7050 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7051 if (rc != 0) {
7052 pr_err("error %d\n", rc);
7053 goto rw_error;
7054 }
7055 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7056 if (rc != 0) {
7057 pr_err("error %d\n", rc);
7058 goto rw_error;
7059 }
7060 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7061 if (rc != 0) {
7062 pr_err("error %d\n", rc);
7063 goto rw_error;
7064 }
7065 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7066 if (rc != 0) {
7067 pr_err("error %d\n", rc);
7068 goto rw_error;
7069 }
7070 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7071 if (rc != 0) {
7072 pr_err("error %d\n", rc);
7073 goto rw_error;
7074 }
7075 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7076 if (rc != 0) {
7077 pr_err("error %d\n", rc);
7078 goto rw_error;
7079 }
7080 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7081 if (rc != 0) {
7082 pr_err("error %d\n", rc);
7083 goto rw_error;
7084 }
7085 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
7086 if (rc != 0) {
7087 pr_err("error %d\n", rc);
7088 goto rw_error;
7089 }
7090 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 176, 0);
7091 if (rc != 0) {
7092 pr_err("error %d\n", rc);
7093 goto rw_error;
7094 }
7095 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7096 if (rc != 0) {
7097 pr_err("error %d\n", rc);
7098 goto rw_error;
7099 }
7100 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7101 if (rc != 0) {
7102 pr_err("error %d\n", rc);
7103 goto rw_error;
7104 }
7105 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 8, 0);
7106 if (rc != 0) {
7107 pr_err("error %d\n", rc);
7108 goto rw_error;
7109 }
7110
7111 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20480, 0);
7112 if (rc != 0) {
7113 pr_err("error %d\n", rc);
7114 goto rw_error;
7115 }
7116
7117 return 0;
7118 rw_error:
7119 return rc;
7120 }
7121
7122 /*============================================================================*/
7123
7124 /**
7125 * \fn int set_qam64 ()
7126 * \brief QAM64 specific setup
7127 * \param demod instance of demod.
7128 * \return int.
7129 */
7130 static int set_qam64(struct drx_demod_instance *demod)
7131 {
7132 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7133 int rc;
7134 const u8 qam_dq_qual_fun[] = { /* this is hw reset value. no necessary to re-write */
7135 DRXJ_16TO8(4), /* fun0 */
7136 DRXJ_16TO8(4), /* fun1 */
7137 DRXJ_16TO8(4), /* fun2 */
7138 DRXJ_16TO8(4), /* fun3 */
7139 DRXJ_16TO8(6), /* fun4 */
7140 DRXJ_16TO8(6), /* fun5 */
7141 };
7142 const u8 qam_eq_cma_rad[] = {
7143 DRXJ_16TO8(13336), /* RAD0 */
7144 DRXJ_16TO8(12618), /* RAD1 */
7145 DRXJ_16TO8(11988), /* RAD2 */
7146 DRXJ_16TO8(13809), /* RAD3 */
7147 DRXJ_16TO8(13809), /* RAD4 */
7148 DRXJ_16TO8(15609), /* RAD5 */
7149 };
7150
7151 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7152 if (rc != 0) {
7153 pr_err("error %d\n", rc);
7154 goto rw_error;
7155 }
7156 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
7157 if (rc != 0) {
7158 pr_err("error %d\n", rc);
7159 goto rw_error;
7160 }
7161
7162 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 105, 0);
7163 if (rc != 0) {
7164 pr_err("error %d\n", rc);
7165 goto rw_error;
7166 }
7167 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7168 if (rc != 0) {
7169 pr_err("error %d\n", rc);
7170 goto rw_error;
7171 }
7172 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7173 if (rc != 0) {
7174 pr_err("error %d\n", rc);
7175 goto rw_error;
7176 }
7177 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 195, 0);
7178 if (rc != 0) {
7179 pr_err("error %d\n", rc);
7180 goto rw_error;
7181 }
7182 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7183 if (rc != 0) {
7184 pr_err("error %d\n", rc);
7185 goto rw_error;
7186 }
7187 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 84, 0);
7188 if (rc != 0) {
7189 pr_err("error %d\n", rc);
7190 goto rw_error;
7191 }
7192
7193 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7194 if (rc != 0) {
7195 pr_err("error %d\n", rc);
7196 goto rw_error;
7197 }
7198 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7199 if (rc != 0) {
7200 pr_err("error %d\n", rc);
7201 goto rw_error;
7202 }
7203 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7204 if (rc != 0) {
7205 pr_err("error %d\n", rc);
7206 goto rw_error;
7207 }
7208
7209 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
7210 if (rc != 0) {
7211 pr_err("error %d\n", rc);
7212 goto rw_error;
7213 }
7214 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 141, 0);
7215 if (rc != 0) {
7216 pr_err("error %d\n", rc);
7217 goto rw_error;
7218 }
7219 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 7, 0);
7220 if (rc != 0) {
7221 pr_err("error %d\n", rc);
7222 goto rw_error;
7223 }
7224 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 0, 0);
7225 if (rc != 0) {
7226 pr_err("error %d\n", rc);
7227 goto rw_error;
7228 }
7229 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-15), 0);
7230 if (rc != 0) {
7231 pr_err("error %d\n", rc);
7232 goto rw_error;
7233 }
7234 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-45), 0);
7235 if (rc != 0) {
7236 pr_err("error %d\n", rc);
7237 goto rw_error;
7238 }
7239 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-80), 0);
7240 if (rc != 0) {
7241 pr_err("error %d\n", rc);
7242 goto rw_error;
7243 }
7244
7245 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7246 if (rc != 0) {
7247 pr_err("error %d\n", rc);
7248 goto rw_error;
7249 }
7250 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7251 if (rc != 0) {
7252 pr_err("error %d\n", rc);
7253 goto rw_error;
7254 }
7255 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7256 if (rc != 0) {
7257 pr_err("error %d\n", rc);
7258 goto rw_error;
7259 }
7260 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30, 0);
7261 if (rc != 0) {
7262 pr_err("error %d\n", rc);
7263 goto rw_error;
7264 }
7265 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7266 if (rc != 0) {
7267 pr_err("error %d\n", rc);
7268 goto rw_error;
7269 }
7270 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7271 if (rc != 0) {
7272 pr_err("error %d\n", rc);
7273 goto rw_error;
7274 }
7275 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 15, 0);
7276 if (rc != 0) {
7277 pr_err("error %d\n", rc);
7278 goto rw_error;
7279 }
7280 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7281 if (rc != 0) {
7282 pr_err("error %d\n", rc);
7283 goto rw_error;
7284 }
7285 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7286 if (rc != 0) {
7287 pr_err("error %d\n", rc);
7288 goto rw_error;
7289 }
7290 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7291 if (rc != 0) {
7292 pr_err("error %d\n", rc);
7293 goto rw_error;
7294 }
7295 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7296 if (rc != 0) {
7297 pr_err("error %d\n", rc);
7298 goto rw_error;
7299 }
7300 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7301 if (rc != 0) {
7302 pr_err("error %d\n", rc);
7303 goto rw_error;
7304 }
7305 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7306 if (rc != 0) {
7307 pr_err("error %d\n", rc);
7308 goto rw_error;
7309 }
7310 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7311 if (rc != 0) {
7312 pr_err("error %d\n", rc);
7313 goto rw_error;
7314 }
7315 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7316 if (rc != 0) {
7317 pr_err("error %d\n", rc);
7318 goto rw_error;
7319 }
7320 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
7321 if (rc != 0) {
7322 pr_err("error %d\n", rc);
7323 goto rw_error;
7324 }
7325 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 160, 0);
7326 if (rc != 0) {
7327 pr_err("error %d\n", rc);
7328 goto rw_error;
7329 }
7330 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7331 if (rc != 0) {
7332 pr_err("error %d\n", rc);
7333 goto rw_error;
7334 }
7335 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7336 if (rc != 0) {
7337 pr_err("error %d\n", rc);
7338 goto rw_error;
7339 }
7340 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
7341 if (rc != 0) {
7342 pr_err("error %d\n", rc);
7343 goto rw_error;
7344 }
7345
7346 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43008, 0);
7347 if (rc != 0) {
7348 pr_err("error %d\n", rc);
7349 goto rw_error;
7350 }
7351
7352 return 0;
7353 rw_error:
7354 return rc;
7355 }
7356
7357 /*============================================================================*/
7358
7359 /**
7360 * \fn int set_qam128 ()
7361 * \brief QAM128 specific setup
7362 * \param demod: instance of demod.
7363 * \return int.
7364 */
7365 static int set_qam128(struct drx_demod_instance *demod)
7366 {
7367 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7368 int rc;
7369 const u8 qam_dq_qual_fun[] = {
7370 DRXJ_16TO8(6), /* fun0 */
7371 DRXJ_16TO8(6), /* fun1 */
7372 DRXJ_16TO8(6), /* fun2 */
7373 DRXJ_16TO8(6), /* fun3 */
7374 DRXJ_16TO8(9), /* fun4 */
7375 DRXJ_16TO8(9), /* fun5 */
7376 };
7377 const u8 qam_eq_cma_rad[] = {
7378 DRXJ_16TO8(6164), /* RAD0 */
7379 DRXJ_16TO8(6598), /* RAD1 */
7380 DRXJ_16TO8(6394), /* RAD2 */
7381 DRXJ_16TO8(6409), /* RAD3 */
7382 DRXJ_16TO8(6656), /* RAD4 */
7383 DRXJ_16TO8(7238), /* RAD5 */
7384 };
7385
7386 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7387 if (rc != 0) {
7388 pr_err("error %d\n", rc);
7389 goto rw_error;
7390 }
7391 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
7392 if (rc != 0) {
7393 pr_err("error %d\n", rc);
7394 goto rw_error;
7395 }
7396
7397 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
7398 if (rc != 0) {
7399 pr_err("error %d\n", rc);
7400 goto rw_error;
7401 }
7402 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7403 if (rc != 0) {
7404 pr_err("error %d\n", rc);
7405 goto rw_error;
7406 }
7407 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7408 if (rc != 0) {
7409 pr_err("error %d\n", rc);
7410 goto rw_error;
7411 }
7412 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 140, 0);
7413 if (rc != 0) {
7414 pr_err("error %d\n", rc);
7415 goto rw_error;
7416 }
7417 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7418 if (rc != 0) {
7419 pr_err("error %d\n", rc);
7420 goto rw_error;
7421 }
7422 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
7423 if (rc != 0) {
7424 pr_err("error %d\n", rc);
7425 goto rw_error;
7426 }
7427
7428 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7429 if (rc != 0) {
7430 pr_err("error %d\n", rc);
7431 goto rw_error;
7432 }
7433 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7434 if (rc != 0) {
7435 pr_err("error %d\n", rc);
7436 goto rw_error;
7437 }
7438 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7439 if (rc != 0) {
7440 pr_err("error %d\n", rc);
7441 goto rw_error;
7442 }
7443
7444 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
7445 if (rc != 0) {
7446 pr_err("error %d\n", rc);
7447 goto rw_error;
7448 }
7449 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 65, 0);
7450 if (rc != 0) {
7451 pr_err("error %d\n", rc);
7452 goto rw_error;
7453 }
7454 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 5, 0);
7455 if (rc != 0) {
7456 pr_err("error %d\n", rc);
7457 goto rw_error;
7458 }
7459 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 3, 0);
7460 if (rc != 0) {
7461 pr_err("error %d\n", rc);
7462 goto rw_error;
7463 }
7464 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-1), 0);
7465 if (rc != 0) {
7466 pr_err("error %d\n", rc);
7467 goto rw_error;
7468 }
7469 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 12, 0);
7470 if (rc != 0) {
7471 pr_err("error %d\n", rc);
7472 goto rw_error;
7473 }
7474 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-23), 0);
7475 if (rc != 0) {
7476 pr_err("error %d\n", rc);
7477 goto rw_error;
7478 }
7479
7480 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7481 if (rc != 0) {
7482 pr_err("error %d\n", rc);
7483 goto rw_error;
7484 }
7485 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7486 if (rc != 0) {
7487 pr_err("error %d\n", rc);
7488 goto rw_error;
7489 }
7490 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7491 if (rc != 0) {
7492 pr_err("error %d\n", rc);
7493 goto rw_error;
7494 }
7495 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40, 0);
7496 if (rc != 0) {
7497 pr_err("error %d\n", rc);
7498 goto rw_error;
7499 }
7500 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7501 if (rc != 0) {
7502 pr_err("error %d\n", rc);
7503 goto rw_error;
7504 }
7505 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7506 if (rc != 0) {
7507 pr_err("error %d\n", rc);
7508 goto rw_error;
7509 }
7510 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20, 0);
7511 if (rc != 0) {
7512 pr_err("error %d\n", rc);
7513 goto rw_error;
7514 }
7515 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7516 if (rc != 0) {
7517 pr_err("error %d\n", rc);
7518 goto rw_error;
7519 }
7520 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7521 if (rc != 0) {
7522 pr_err("error %d\n", rc);
7523 goto rw_error;
7524 }
7525 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7526 if (rc != 0) {
7527 pr_err("error %d\n", rc);
7528 goto rw_error;
7529 }
7530 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7531 if (rc != 0) {
7532 pr_err("error %d\n", rc);
7533 goto rw_error;
7534 }
7535 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7536 if (rc != 0) {
7537 pr_err("error %d\n", rc);
7538 goto rw_error;
7539 }
7540 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7541 if (rc != 0) {
7542 pr_err("error %d\n", rc);
7543 goto rw_error;
7544 }
7545 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7546 if (rc != 0) {
7547 pr_err("error %d\n", rc);
7548 goto rw_error;
7549 }
7550 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7551 if (rc != 0) {
7552 pr_err("error %d\n", rc);
7553 goto rw_error;
7554 }
7555 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
7556 if (rc != 0) {
7557 pr_err("error %d\n", rc);
7558 goto rw_error;
7559 }
7560 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 144, 0);
7561 if (rc != 0) {
7562 pr_err("error %d\n", rc);
7563 goto rw_error;
7564 }
7565 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7566 if (rc != 0) {
7567 pr_err("error %d\n", rc);
7568 goto rw_error;
7569 }
7570 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7571 if (rc != 0) {
7572 pr_err("error %d\n", rc);
7573 goto rw_error;
7574 }
7575 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7576 if (rc != 0) {
7577 pr_err("error %d\n", rc);
7578 goto rw_error;
7579 }
7580
7581 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20992, 0);
7582 if (rc != 0) {
7583 pr_err("error %d\n", rc);
7584 goto rw_error;
7585 }
7586
7587 return 0;
7588 rw_error:
7589 return rc;
7590 }
7591
7592 /*============================================================================*/
7593
7594 /**
7595 * \fn int set_qam256 ()
7596 * \brief QAM256 specific setup
7597 * \param demod: instance of demod.
7598 * \return int.
7599 */
7600 static int set_qam256(struct drx_demod_instance *demod)
7601 {
7602 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7603 int rc;
7604 const u8 qam_dq_qual_fun[] = {
7605 DRXJ_16TO8(8), /* fun0 */
7606 DRXJ_16TO8(8), /* fun1 */
7607 DRXJ_16TO8(8), /* fun2 */
7608 DRXJ_16TO8(8), /* fun3 */
7609 DRXJ_16TO8(12), /* fun4 */
7610 DRXJ_16TO8(12), /* fun5 */
7611 };
7612 const u8 qam_eq_cma_rad[] = {
7613 DRXJ_16TO8(12345), /* RAD0 */
7614 DRXJ_16TO8(12345), /* RAD1 */
7615 DRXJ_16TO8(13626), /* RAD2 */
7616 DRXJ_16TO8(12931), /* RAD3 */
7617 DRXJ_16TO8(14719), /* RAD4 */
7618 DRXJ_16TO8(15356), /* RAD5 */
7619 };
7620
7621 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7622 if (rc != 0) {
7623 pr_err("error %d\n", rc);
7624 goto rw_error;
7625 }
7626 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
7627 if (rc != 0) {
7628 pr_err("error %d\n", rc);
7629 goto rw_error;
7630 }
7631
7632 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
7633 if (rc != 0) {
7634 pr_err("error %d\n", rc);
7635 goto rw_error;
7636 }
7637 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7638 if (rc != 0) {
7639 pr_err("error %d\n", rc);
7640 goto rw_error;
7641 }
7642 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7643 if (rc != 0) {
7644 pr_err("error %d\n", rc);
7645 goto rw_error;
7646 }
7647 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 150, 0);
7648 if (rc != 0) {
7649 pr_err("error %d\n", rc);
7650 goto rw_error;
7651 }
7652 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7653 if (rc != 0) {
7654 pr_err("error %d\n", rc);
7655 goto rw_error;
7656 }
7657 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 110, 0);
7658 if (rc != 0) {
7659 pr_err("error %d\n", rc);
7660 goto rw_error;
7661 }
7662
7663 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7664 if (rc != 0) {
7665 pr_err("error %d\n", rc);
7666 goto rw_error;
7667 }
7668 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 16, 0);
7669 if (rc != 0) {
7670 pr_err("error %d\n", rc);
7671 goto rw_error;
7672 }
7673 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7674 if (rc != 0) {
7675 pr_err("error %d\n", rc);
7676 goto rw_error;
7677 }
7678
7679 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
7680 if (rc != 0) {
7681 pr_err("error %d\n", rc);
7682 goto rw_error;
7683 }
7684 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 74, 0);
7685 if (rc != 0) {
7686 pr_err("error %d\n", rc);
7687 goto rw_error;
7688 }
7689 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 18, 0);
7690 if (rc != 0) {
7691 pr_err("error %d\n", rc);
7692 goto rw_error;
7693 }
7694 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 13, 0);
7695 if (rc != 0) {
7696 pr_err("error %d\n", rc);
7697 goto rw_error;
7698 }
7699 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, 7, 0);
7700 if (rc != 0) {
7701 pr_err("error %d\n", rc);
7702 goto rw_error;
7703 }
7704 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 0, 0);
7705 if (rc != 0) {
7706 pr_err("error %d\n", rc);
7707 goto rw_error;
7708 }
7709 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-8), 0);
7710 if (rc != 0) {
7711 pr_err("error %d\n", rc);
7712 goto rw_error;
7713 }
7714
7715 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7716 if (rc != 0) {
7717 pr_err("error %d\n", rc);
7718 goto rw_error;
7719 }
7720 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7721 if (rc != 0) {
7722 pr_err("error %d\n", rc);
7723 goto rw_error;
7724 }
7725 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7726 if (rc != 0) {
7727 pr_err("error %d\n", rc);
7728 goto rw_error;
7729 }
7730 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50, 0);
7731 if (rc != 0) {
7732 pr_err("error %d\n", rc);
7733 goto rw_error;
7734 }
7735 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7736 if (rc != 0) {
7737 pr_err("error %d\n", rc);
7738 goto rw_error;
7739 }
7740 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7741 if (rc != 0) {
7742 pr_err("error %d\n", rc);
7743 goto rw_error;
7744 }
7745 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 25, 0);
7746 if (rc != 0) {
7747 pr_err("error %d\n", rc);
7748 goto rw_error;
7749 }
7750 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7751 if (rc != 0) {
7752 pr_err("error %d\n", rc);
7753 goto rw_error;
7754 }
7755 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7756 if (rc != 0) {
7757 pr_err("error %d\n", rc);
7758 goto rw_error;
7759 }
7760 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7761 if (rc != 0) {
7762 pr_err("error %d\n", rc);
7763 goto rw_error;
7764 }
7765 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7766 if (rc != 0) {
7767 pr_err("error %d\n", rc);
7768 goto rw_error;
7769 }
7770 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7771 if (rc != 0) {
7772 pr_err("error %d\n", rc);
7773 goto rw_error;
7774 }
7775 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7776 if (rc != 0) {
7777 pr_err("error %d\n", rc);
7778 goto rw_error;
7779 }
7780 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7781 if (rc != 0) {
7782 pr_err("error %d\n", rc);
7783 goto rw_error;
7784 }
7785 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7786 if (rc != 0) {
7787 pr_err("error %d\n", rc);
7788 goto rw_error;
7789 }
7790 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
7791 if (rc != 0) {
7792 pr_err("error %d\n", rc);
7793 goto rw_error;
7794 }
7795 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 80, 0);
7796 if (rc != 0) {
7797 pr_err("error %d\n", rc);
7798 goto rw_error;
7799 }
7800 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7801 if (rc != 0) {
7802 pr_err("error %d\n", rc);
7803 goto rw_error;
7804 }
7805 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7806 if (rc != 0) {
7807 pr_err("error %d\n", rc);
7808 goto rw_error;
7809 }
7810 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7811 if (rc != 0) {
7812 pr_err("error %d\n", rc);
7813 goto rw_error;
7814 }
7815
7816 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43520, 0);
7817 if (rc != 0) {
7818 pr_err("error %d\n", rc);
7819 goto rw_error;
7820 }
7821
7822 return 0;
7823 rw_error:
7824 return rc;
7825 }
7826
7827 /*============================================================================*/
7828 #define QAM_SET_OP_ALL 0x1
7829 #define QAM_SET_OP_CONSTELLATION 0x2
7830 #define QAM_SET_OP_SPECTRUM 0X4
7831
7832 /**
7833 * \fn int set_qam ()
7834 * \brief Set QAM demod.
7835 * \param demod: instance of demod.
7836 * \param channel: pointer to channel data.
7837 * \return int.
7838 */
7839 static int
7840 set_qam(struct drx_demod_instance *demod,
7841 struct drx_channel *channel, s32 tuner_freq_offset, u32 op)
7842 {
7843 struct i2c_device_addr *dev_addr = NULL;
7844 struct drxj_data *ext_attr = NULL;
7845 struct drx_common_attr *common_attr = NULL;
7846 int rc;
7847 u32 adc_frequency = 0;
7848 u32 iqm_rc_rate = 0;
7849 u16 cmd_result = 0;
7850 u16 lc_symbol_freq = 0;
7851 u16 iqm_rc_stretch = 0;
7852 u16 set_env_parameters = 0;
7853 u16 set_param_parameters[2] = { 0 };
7854 struct drxjscu_cmd cmd_scu = { /* command */ 0,
7855 /* parameter_len */ 0,
7856 /* result_len */ 0,
7857 /* parameter */ NULL,
7858 /* result */ NULL
7859 };
7860 const u8 qam_a_taps[] = {
7861 DRXJ_16TO8(-1), /* re0 */
7862 DRXJ_16TO8(1), /* re1 */
7863 DRXJ_16TO8(1), /* re2 */
7864 DRXJ_16TO8(-1), /* re3 */
7865 DRXJ_16TO8(-1), /* re4 */
7866 DRXJ_16TO8(2), /* re5 */
7867 DRXJ_16TO8(1), /* re6 */
7868 DRXJ_16TO8(-2), /* re7 */
7869 DRXJ_16TO8(0), /* re8 */
7870 DRXJ_16TO8(3), /* re9 */
7871 DRXJ_16TO8(-1), /* re10 */
7872 DRXJ_16TO8(-3), /* re11 */
7873 DRXJ_16TO8(4), /* re12 */
7874 DRXJ_16TO8(1), /* re13 */
7875 DRXJ_16TO8(-8), /* re14 */
7876 DRXJ_16TO8(4), /* re15 */
7877 DRXJ_16TO8(13), /* re16 */
7878 DRXJ_16TO8(-13), /* re17 */
7879 DRXJ_16TO8(-19), /* re18 */
7880 DRXJ_16TO8(28), /* re19 */
7881 DRXJ_16TO8(25), /* re20 */
7882 DRXJ_16TO8(-53), /* re21 */
7883 DRXJ_16TO8(-31), /* re22 */
7884 DRXJ_16TO8(96), /* re23 */
7885 DRXJ_16TO8(37), /* re24 */
7886 DRXJ_16TO8(-190), /* re25 */
7887 DRXJ_16TO8(-40), /* re26 */
7888 DRXJ_16TO8(619) /* re27 */
7889 };
7890 const u8 qam_b64_taps[] = {
7891 DRXJ_16TO8(0), /* re0 */
7892 DRXJ_16TO8(-2), /* re1 */
7893 DRXJ_16TO8(1), /* re2 */
7894 DRXJ_16TO8(2), /* re3 */
7895 DRXJ_16TO8(-2), /* re4 */
7896 DRXJ_16TO8(0), /* re5 */
7897 DRXJ_16TO8(4), /* re6 */
7898 DRXJ_16TO8(-2), /* re7 */
7899 DRXJ_16TO8(-4), /* re8 */
7900 DRXJ_16TO8(4), /* re9 */
7901 DRXJ_16TO8(3), /* re10 */
7902 DRXJ_16TO8(-6), /* re11 */
7903 DRXJ_16TO8(0), /* re12 */
7904 DRXJ_16TO8(6), /* re13 */
7905 DRXJ_16TO8(-5), /* re14 */
7906 DRXJ_16TO8(-3), /* re15 */
7907 DRXJ_16TO8(11), /* re16 */
7908 DRXJ_16TO8(-4), /* re17 */
7909 DRXJ_16TO8(-19), /* re18 */
7910 DRXJ_16TO8(19), /* re19 */
7911 DRXJ_16TO8(28), /* re20 */
7912 DRXJ_16TO8(-45), /* re21 */
7913 DRXJ_16TO8(-36), /* re22 */
7914 DRXJ_16TO8(90), /* re23 */
7915 DRXJ_16TO8(42), /* re24 */
7916 DRXJ_16TO8(-185), /* re25 */
7917 DRXJ_16TO8(-46), /* re26 */
7918 DRXJ_16TO8(614) /* re27 */
7919 };
7920 const u8 qam_b256_taps[] = {
7921 DRXJ_16TO8(-2), /* re0 */
7922 DRXJ_16TO8(4), /* re1 */
7923 DRXJ_16TO8(1), /* re2 */
7924 DRXJ_16TO8(-4), /* re3 */
7925 DRXJ_16TO8(0), /* re4 */
7926 DRXJ_16TO8(4), /* re5 */
7927 DRXJ_16TO8(-2), /* re6 */
7928 DRXJ_16TO8(-4), /* re7 */
7929 DRXJ_16TO8(5), /* re8 */
7930 DRXJ_16TO8(2), /* re9 */
7931 DRXJ_16TO8(-8), /* re10 */
7932 DRXJ_16TO8(2), /* re11 */
7933 DRXJ_16TO8(11), /* re12 */
7934 DRXJ_16TO8(-8), /* re13 */
7935 DRXJ_16TO8(-15), /* re14 */
7936 DRXJ_16TO8(16), /* re15 */
7937 DRXJ_16TO8(19), /* re16 */
7938 DRXJ_16TO8(-27), /* re17 */
7939 DRXJ_16TO8(-22), /* re18 */
7940 DRXJ_16TO8(44), /* re19 */
7941 DRXJ_16TO8(26), /* re20 */
7942 DRXJ_16TO8(-69), /* re21 */
7943 DRXJ_16TO8(-28), /* re22 */
7944 DRXJ_16TO8(110), /* re23 */
7945 DRXJ_16TO8(31), /* re24 */
7946 DRXJ_16TO8(-201), /* re25 */
7947 DRXJ_16TO8(-32), /* re26 */
7948 DRXJ_16TO8(628) /* re27 */
7949 };
7950 const u8 qam_c_taps[] = {
7951 DRXJ_16TO8(-3), /* re0 */
7952 DRXJ_16TO8(3), /* re1 */
7953 DRXJ_16TO8(2), /* re2 */
7954 DRXJ_16TO8(-4), /* re3 */
7955 DRXJ_16TO8(0), /* re4 */
7956 DRXJ_16TO8(4), /* re5 */
7957 DRXJ_16TO8(-1), /* re6 */
7958 DRXJ_16TO8(-4), /* re7 */
7959 DRXJ_16TO8(3), /* re8 */
7960 DRXJ_16TO8(3), /* re9 */
7961 DRXJ_16TO8(-5), /* re10 */
7962 DRXJ_16TO8(0), /* re11 */
7963 DRXJ_16TO8(9), /* re12 */
7964 DRXJ_16TO8(-4), /* re13 */
7965 DRXJ_16TO8(-12), /* re14 */
7966 DRXJ_16TO8(10), /* re15 */
7967 DRXJ_16TO8(16), /* re16 */
7968 DRXJ_16TO8(-21), /* re17 */
7969 DRXJ_16TO8(-20), /* re18 */
7970 DRXJ_16TO8(37), /* re19 */
7971 DRXJ_16TO8(25), /* re20 */
7972 DRXJ_16TO8(-62), /* re21 */
7973 DRXJ_16TO8(-28), /* re22 */
7974 DRXJ_16TO8(105), /* re23 */
7975 DRXJ_16TO8(31), /* re24 */
7976 DRXJ_16TO8(-197), /* re25 */
7977 DRXJ_16TO8(-33), /* re26 */
7978 DRXJ_16TO8(626) /* re27 */
7979 };
7980
7981 dev_addr = demod->my_i2c_dev_addr;
7982 ext_attr = (struct drxj_data *) demod->my_ext_attr;
7983 common_attr = (struct drx_common_attr *) demod->my_common_attr;
7984
7985 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
7986 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
7987 switch (channel->constellation) {
7988 case DRX_CONSTELLATION_QAM256:
7989 iqm_rc_rate = 0x00AE3562;
7990 lc_symbol_freq =
7991 QAM_LC_SYMBOL_FREQ_FREQ_QAM_B_256;
7992 channel->symbolrate = 5360537;
7993 iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_256;
7994 break;
7995 case DRX_CONSTELLATION_QAM64:
7996 iqm_rc_rate = 0x00C05A0E;
7997 lc_symbol_freq = 409;
7998 channel->symbolrate = 5056941;
7999 iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_64;
8000 break;
8001 default:
8002 return -EINVAL;
8003 }
8004 } else {
8005 adc_frequency = (common_attr->sys_clock_freq * 1000) / 3;
8006 if (channel->symbolrate == 0) {
8007 pr_err("error: channel symbolrate is zero!\n");
8008 return -EIO;
8009 }
8010 iqm_rc_rate =
8011 (adc_frequency / channel->symbolrate) * (1 << 21) +
8012 (frac28
8013 ((adc_frequency % channel->symbolrate),
8014 channel->symbolrate) >> 7) - (1 << 23);
8015 lc_symbol_freq =
8016 (u16) (frac28
8017 (channel->symbolrate +
8018 (adc_frequency >> 13),
8019 adc_frequency) >> 16);
8020 if (lc_symbol_freq > 511)
8021 lc_symbol_freq = 511;
8022
8023 iqm_rc_stretch = 21;
8024 }
8025
8026 if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8027 set_env_parameters = QAM_TOP_ANNEX_A; /* annex */
8028 set_param_parameters[0] = channel->constellation; /* constellation */
8029 set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17; /* interleave mode */
8030 } else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8031 set_env_parameters = QAM_TOP_ANNEX_B; /* annex */
8032 set_param_parameters[0] = channel->constellation; /* constellation */
8033 set_param_parameters[1] = channel->interleavemode; /* interleave mode */
8034 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8035 set_env_parameters = QAM_TOP_ANNEX_C; /* annex */
8036 set_param_parameters[0] = channel->constellation; /* constellation */
8037 set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17; /* interleave mode */
8038 } else {
8039 return -EINVAL;
8040 }
8041 }
8042
8043 if (op & QAM_SET_OP_ALL) {
8044 /*
8045 STEP 1: reset demodulator
8046 resets IQM, QAM and FEC HW blocks
8047 resets SCU variables
8048 */
8049 /* stop all comm_exec */
8050 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
8051 if (rc != 0) {
8052 pr_err("error %d\n", rc);
8053 goto rw_error;
8054 }
8055 rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
8056 if (rc != 0) {
8057 pr_err("error %d\n", rc);
8058 goto rw_error;
8059 }
8060 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
8061 if (rc != 0) {
8062 pr_err("error %d\n", rc);
8063 goto rw_error;
8064 }
8065 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
8066 if (rc != 0) {
8067 pr_err("error %d\n", rc);
8068 goto rw_error;
8069 }
8070 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
8071 if (rc != 0) {
8072 pr_err("error %d\n", rc);
8073 goto rw_error;
8074 }
8075 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
8076 if (rc != 0) {
8077 pr_err("error %d\n", rc);
8078 goto rw_error;
8079 }
8080 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
8081 if (rc != 0) {
8082 pr_err("error %d\n", rc);
8083 goto rw_error;
8084 }
8085
8086 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8087 SCU_RAM_COMMAND_CMD_DEMOD_RESET;
8088 cmd_scu.parameter_len = 0;
8089 cmd_scu.result_len = 1;
8090 cmd_scu.parameter = NULL;
8091 cmd_scu.result = &cmd_result;
8092 rc = scu_command(dev_addr, &cmd_scu);
8093 if (rc != 0) {
8094 pr_err("error %d\n", rc);
8095 goto rw_error;
8096 }
8097 }
8098
8099 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8100 /*
8101 STEP 2: configure demodulator
8102 -set env
8103 -set params (resets IQM,QAM,FEC HW; initializes some SCU variables )
8104 */
8105 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8106 SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
8107 cmd_scu.parameter_len = 1;
8108 cmd_scu.result_len = 1;
8109 cmd_scu.parameter = &set_env_parameters;
8110 cmd_scu.result = &cmd_result;
8111 rc = scu_command(dev_addr, &cmd_scu);
8112 if (rc != 0) {
8113 pr_err("error %d\n", rc);
8114 goto rw_error;
8115 }
8116
8117 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8118 SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
8119 cmd_scu.parameter_len = 2;
8120 cmd_scu.result_len = 1;
8121 cmd_scu.parameter = set_param_parameters;
8122 cmd_scu.result = &cmd_result;
8123 rc = scu_command(dev_addr, &cmd_scu);
8124 if (rc != 0) {
8125 pr_err("error %d\n", rc);
8126 goto rw_error;
8127 }
8128 /* set symbol rate */
8129 rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate, 0);
8130 if (rc != 0) {
8131 pr_err("error %d\n", rc);
8132 goto rw_error;
8133 }
8134 ext_attr->iqm_rc_rate_ofs = iqm_rc_rate;
8135 rc = set_qam_measurement(demod, channel->constellation, channel->symbolrate);
8136 if (rc != 0) {
8137 pr_err("error %d\n", rc);
8138 goto rw_error;
8139 }
8140 }
8141 /* STEP 3: enable the system in a mode where the ADC provides valid signal
8142 setup constellation independent registers */
8143 /* from qam_cmd.py script (qam_driver_b) */
8144 /* TODO: remove re-writes of HW reset values */
8145 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_SPECTRUM)) {
8146 rc = set_frequency(demod, channel, tuner_freq_offset);
8147 if (rc != 0) {
8148 pr_err("error %d\n", rc);
8149 goto rw_error;
8150 }
8151 }
8152
8153 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8154
8155 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_SYMBOL_FREQ__A, lc_symbol_freq, 0);
8156 if (rc != 0) {
8157 pr_err("error %d\n", rc);
8158 goto rw_error;
8159 }
8160 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, iqm_rc_stretch, 0);
8161 if (rc != 0) {
8162 pr_err("error %d\n", rc);
8163 goto rw_error;
8164 }
8165 }
8166
8167 if (op & QAM_SET_OP_ALL) {
8168 if (!ext_attr->has_lna) {
8169 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
8170 if (rc != 0) {
8171 pr_err("error %d\n", rc);
8172 goto rw_error;
8173 }
8174 }
8175 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
8176 if (rc != 0) {
8177 pr_err("error %d\n", rc);
8178 goto rw_error;
8179 }
8180 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
8181 if (rc != 0) {
8182 pr_err("error %d\n", rc);
8183 goto rw_error;
8184 }
8185 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_QAM__M, 0);
8186 if (rc != 0) {
8187 pr_err("error %d\n", rc);
8188 goto rw_error;
8189 }
8190
8191 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_WR_RSV_0__A, 0x5f, 0);
8192 if (rc != 0) {
8193 pr_err("error %d\n", rc);
8194 goto rw_error;
8195 } /* scu temporary shut down agc */
8196
8197 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SYNC_SEL__A, 3, 0);
8198 if (rc != 0) {
8199 pr_err("error %d\n", rc);
8200 goto rw_error;
8201 }
8202 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
8203 if (rc != 0) {
8204 pr_err("error %d\n", rc);
8205 goto rw_error;
8206 }
8207 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 448, 0);
8208 if (rc != 0) {
8209 pr_err("error %d\n", rc);
8210 goto rw_error;
8211 }
8212 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
8213 if (rc != 0) {
8214 pr_err("error %d\n", rc);
8215 goto rw_error;
8216 }
8217 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, 4, 0);
8218 if (rc != 0) {
8219 pr_err("error %d\n", rc);
8220 goto rw_error;
8221 }
8222 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, 0x10, 0);
8223 if (rc != 0) {
8224 pr_err("error %d\n", rc);
8225 goto rw_error;
8226 }
8227 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, 11, 0);
8228 if (rc != 0) {
8229 pr_err("error %d\n", rc);
8230 goto rw_error;
8231 }
8232
8233 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
8234 if (rc != 0) {
8235 pr_err("error %d\n", rc);
8236 goto rw_error;
8237 }
8238 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE, 0);
8239 if (rc != 0) {
8240 pr_err("error %d\n", rc);
8241 goto rw_error;
8242 } /*! reset default val ! */
8243
8244 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE, 0);
8245 if (rc != 0) {
8246 pr_err("error %d\n", rc);
8247 goto rw_error;
8248 } /*! reset default val ! */
8249 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8250 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, QAM_SY_SYNC_LWM__PRE, 0);
8251 if (rc != 0) {
8252 pr_err("error %d\n", rc);
8253 goto rw_error;
8254 } /*! reset default val ! */
8255 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, QAM_SY_SYNC_AWM__PRE, 0);
8256 if (rc != 0) {
8257 pr_err("error %d\n", rc);
8258 goto rw_error;
8259 } /*! reset default val ! */
8260 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8261 if (rc != 0) {
8262 pr_err("error %d\n", rc);
8263 goto rw_error;
8264 } /*! reset default val ! */
8265 } else {
8266 switch (channel->constellation) {
8267 case DRX_CONSTELLATION_QAM16:
8268 case DRX_CONSTELLATION_QAM64:
8269 case DRX_CONSTELLATION_QAM256:
8270 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8271 if (rc != 0) {
8272 pr_err("error %d\n", rc);
8273 goto rw_error;
8274 }
8275 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x04, 0);
8276 if (rc != 0) {
8277 pr_err("error %d\n", rc);
8278 goto rw_error;
8279 }
8280 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8281 if (rc != 0) {
8282 pr_err("error %d\n", rc);
8283 goto rw_error;
8284 } /*! reset default val ! */
8285 break;
8286 case DRX_CONSTELLATION_QAM32:
8287 case DRX_CONSTELLATION_QAM128:
8288 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8289 if (rc != 0) {
8290 pr_err("error %d\n", rc);
8291 goto rw_error;
8292 }
8293 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x05, 0);
8294 if (rc != 0) {
8295 pr_err("error %d\n", rc);
8296 goto rw_error;
8297 }
8298 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, 0x06, 0);
8299 if (rc != 0) {
8300 pr_err("error %d\n", rc);
8301 goto rw_error;
8302 }
8303 break;
8304 default:
8305 return -EIO;
8306 } /* switch */
8307 }
8308
8309 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, QAM_LC_MODE__PRE, 0);
8310 if (rc != 0) {
8311 pr_err("error %d\n", rc);
8312 goto rw_error;
8313 } /*! reset default val ! */
8314 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_RATE_LIMIT__A, 3, 0);
8315 if (rc != 0) {
8316 pr_err("error %d\n", rc);
8317 goto rw_error;
8318 }
8319 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORP__A, 4, 0);
8320 if (rc != 0) {
8321 pr_err("error %d\n", rc);
8322 goto rw_error;
8323 }
8324 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORI__A, 4, 0);
8325 if (rc != 0) {
8326 pr_err("error %d\n", rc);
8327 goto rw_error;
8328 }
8329 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, 7, 0);
8330 if (rc != 0) {
8331 pr_err("error %d\n", rc);
8332 goto rw_error;
8333 }
8334 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB0__A, 1, 0);
8335 if (rc != 0) {
8336 pr_err("error %d\n", rc);
8337 goto rw_error;
8338 }
8339 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB1__A, 1, 0);
8340 if (rc != 0) {
8341 pr_err("error %d\n", rc);
8342 goto rw_error;
8343 }
8344 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB2__A, 1, 0);
8345 if (rc != 0) {
8346 pr_err("error %d\n", rc);
8347 goto rw_error;
8348 }
8349 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB3__A, 1, 0);
8350 if (rc != 0) {
8351 pr_err("error %d\n", rc);
8352 goto rw_error;
8353 }
8354 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB4__A, 2, 0);
8355 if (rc != 0) {
8356 pr_err("error %d\n", rc);
8357 goto rw_error;
8358 }
8359 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB5__A, 2, 0);
8360 if (rc != 0) {
8361 pr_err("error %d\n", rc);
8362 goto rw_error;
8363 }
8364 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB6__A, 2, 0);
8365 if (rc != 0) {
8366 pr_err("error %d\n", rc);
8367 goto rw_error;
8368 }
8369 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB8__A, 2, 0);
8370 if (rc != 0) {
8371 pr_err("error %d\n", rc);
8372 goto rw_error;
8373 }
8374 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB9__A, 2, 0);
8375 if (rc != 0) {
8376 pr_err("error %d\n", rc);
8377 goto rw_error;
8378 }
8379 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB10__A, 2, 0);
8380 if (rc != 0) {
8381 pr_err("error %d\n", rc);
8382 goto rw_error;
8383 }
8384 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB12__A, 2, 0);
8385 if (rc != 0) {
8386 pr_err("error %d\n", rc);
8387 goto rw_error;
8388 }
8389 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB15__A, 3, 0);
8390 if (rc != 0) {
8391 pr_err("error %d\n", rc);
8392 goto rw_error;
8393 }
8394 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB16__A, 3, 0);
8395 if (rc != 0) {
8396 pr_err("error %d\n", rc);
8397 goto rw_error;
8398 }
8399 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB20__A, 4, 0);
8400 if (rc != 0) {
8401 pr_err("error %d\n", rc);
8402 goto rw_error;
8403 }
8404 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB25__A, 4, 0);
8405 if (rc != 0) {
8406 pr_err("error %d\n", rc);
8407 goto rw_error;
8408 }
8409
8410 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, 1, 0);
8411 if (rc != 0) {
8412 pr_err("error %d\n", rc);
8413 goto rw_error;
8414 }
8415 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, 1, 0);
8416 if (rc != 0) {
8417 pr_err("error %d\n", rc);
8418 goto rw_error;
8419 }
8420 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_ADJ_SEL__A, 1, 0);
8421 if (rc != 0) {
8422 pr_err("error %d\n", rc);
8423 goto rw_error;
8424 }
8425 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 0, 0);
8426 if (rc != 0) {
8427 pr_err("error %d\n", rc);
8428 goto rw_error;
8429 }
8430 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
8431 if (rc != 0) {
8432 pr_err("error %d\n", rc);
8433 goto rw_error;
8434 }
8435
8436 /* No more resets of the IQM, current standard correctly set =>
8437 now AGCs can be configured. */
8438 /* turn on IQMAF. It has to be in front of setAgc**() */
8439 rc = set_iqm_af(demod, true);
8440 if (rc != 0) {
8441 pr_err("error %d\n", rc);
8442 goto rw_error;
8443 }
8444 rc = adc_synchronization(demod);
8445 if (rc != 0) {
8446 pr_err("error %d\n", rc);
8447 goto rw_error;
8448 }
8449
8450 rc = init_agc(demod);
8451 if (rc != 0) {
8452 pr_err("error %d\n", rc);
8453 goto rw_error;
8454 }
8455 rc = set_agc_if(demod, &(ext_attr->qam_if_agc_cfg), false);
8456 if (rc != 0) {
8457 pr_err("error %d\n", rc);
8458 goto rw_error;
8459 }
8460 rc = set_agc_rf(demod, &(ext_attr->qam_rf_agc_cfg), false);
8461 if (rc != 0) {
8462 pr_err("error %d\n", rc);
8463 goto rw_error;
8464 }
8465 {
8466 /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead
8467 of only the gain */
8468 struct drxj_cfg_afe_gain qam_pga_cfg = { DRX_STANDARD_ITU_B, 0 };
8469
8470 qam_pga_cfg.gain = ext_attr->qam_pga_cfg;
8471 rc = ctrl_set_cfg_afe_gain(demod, &qam_pga_cfg);
8472 if (rc != 0) {
8473 pr_err("error %d\n", rc);
8474 goto rw_error;
8475 }
8476 }
8477 rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->qam_pre_saw_cfg));
8478 if (rc != 0) {
8479 pr_err("error %d\n", rc);
8480 goto rw_error;
8481 }
8482 }
8483
8484 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8485 if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8486 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8487 if (rc != 0) {
8488 pr_err("error %d\n", rc);
8489 goto rw_error;
8490 }
8491 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8492 if (rc != 0) {
8493 pr_err("error %d\n", rc);
8494 goto rw_error;
8495 }
8496 } else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8497 switch (channel->constellation) {
8498 case DRX_CONSTELLATION_QAM64:
8499 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8500 if (rc != 0) {
8501 pr_err("error %d\n", rc);
8502 goto rw_error;
8503 }
8504 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8505 if (rc != 0) {
8506 pr_err("error %d\n", rc);
8507 goto rw_error;
8508 }
8509 break;
8510 case DRX_CONSTELLATION_QAM256:
8511 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8512 if (rc != 0) {
8513 pr_err("error %d\n", rc);
8514 goto rw_error;
8515 }
8516 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8517 if (rc != 0) {
8518 pr_err("error %d\n", rc);
8519 goto rw_error;
8520 }
8521 break;
8522 default:
8523 return -EIO;
8524 }
8525 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8526 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8527 if (rc != 0) {
8528 pr_err("error %d\n", rc);
8529 goto rw_error;
8530 }
8531 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8532 if (rc != 0) {
8533 pr_err("error %d\n", rc);
8534 goto rw_error;
8535 }
8536 }
8537
8538 /* SETP 4: constellation specific setup */
8539 switch (channel->constellation) {
8540 case DRX_CONSTELLATION_QAM16:
8541 rc = set_qam16(demod);
8542 if (rc != 0) {
8543 pr_err("error %d\n", rc);
8544 goto rw_error;
8545 }
8546 break;
8547 case DRX_CONSTELLATION_QAM32:
8548 rc = set_qam32(demod);
8549 if (rc != 0) {
8550 pr_err("error %d\n", rc);
8551 goto rw_error;
8552 }
8553 break;
8554 case DRX_CONSTELLATION_QAM64:
8555 rc = set_qam64(demod);
8556 if (rc != 0) {
8557 pr_err("error %d\n", rc);
8558 goto rw_error;
8559 }
8560 break;
8561 case DRX_CONSTELLATION_QAM128:
8562 rc = set_qam128(demod);
8563 if (rc != 0) {
8564 pr_err("error %d\n", rc);
8565 goto rw_error;
8566 }
8567 break;
8568 case DRX_CONSTELLATION_QAM256:
8569 rc = set_qam256(demod);
8570 if (rc != 0) {
8571 pr_err("error %d\n", rc);
8572 goto rw_error;
8573 }
8574 break;
8575 default:
8576 return -EIO;
8577 } /* switch */
8578 }
8579
8580 if ((op & QAM_SET_OP_ALL)) {
8581 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
8582 if (rc != 0) {
8583 pr_err("error %d\n", rc);
8584 goto rw_error;
8585 }
8586
8587 /* Mpeg output has to be in front of FEC active */
8588 rc = set_mpegtei_handling(demod);
8589 if (rc != 0) {
8590 pr_err("error %d\n", rc);
8591 goto rw_error;
8592 }
8593 rc = bit_reverse_mpeg_output(demod);
8594 if (rc != 0) {
8595 pr_err("error %d\n", rc);
8596 goto rw_error;
8597 }
8598 rc = set_mpeg_start_width(demod);
8599 if (rc != 0) {
8600 pr_err("error %d\n", rc);
8601 goto rw_error;
8602 }
8603 {
8604 /* TODO: move to set_standard after hardware reset value problem is solved */
8605 /* Configure initial MPEG output */
8606 struct drx_cfg_mpeg_output cfg_mpeg_output;
8607
8608 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
8609 cfg_mpeg_output.enable_mpeg_output = true;
8610
8611 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
8612 if (rc != 0) {
8613 pr_err("error %d\n", rc);
8614 goto rw_error;
8615 }
8616 }
8617 }
8618
8619 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8620
8621 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
8622 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8623 SCU_RAM_COMMAND_CMD_DEMOD_START;
8624 cmd_scu.parameter_len = 0;
8625 cmd_scu.result_len = 1;
8626 cmd_scu.parameter = NULL;
8627 cmd_scu.result = &cmd_result;
8628 rc = scu_command(dev_addr, &cmd_scu);
8629 if (rc != 0) {
8630 pr_err("error %d\n", rc);
8631 goto rw_error;
8632 }
8633 }
8634
8635 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
8636 if (rc != 0) {
8637 pr_err("error %d\n", rc);
8638 goto rw_error;
8639 }
8640 rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE, 0);
8641 if (rc != 0) {
8642 pr_err("error %d\n", rc);
8643 goto rw_error;
8644 }
8645 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
8646 if (rc != 0) {
8647 pr_err("error %d\n", rc);
8648 goto rw_error;
8649 }
8650
8651 return 0;
8652 rw_error:
8653 return rc;
8654 }
8655
8656 /*============================================================================*/
8657 static int ctrl_get_qam_sig_quality(struct drx_demod_instance *demod);
8658
8659 static int qam_flip_spec(struct drx_demod_instance *demod, struct drx_channel *channel)
8660 {
8661 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8662 struct drxj_data *ext_attr = demod->my_ext_attr;
8663 int rc;
8664 u32 iqm_fs_rate_ofs = 0;
8665 u32 iqm_fs_rate_lo = 0;
8666 u16 qam_ctl_ena = 0;
8667 u16 data = 0;
8668 u16 equ_mode = 0;
8669 u16 fsm_state = 0;
8670 int i = 0;
8671 int ofsofs = 0;
8672
8673 /* Silence the controlling of lc, equ, and the acquisition state machine */
8674 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, &qam_ctl_ena, 0);
8675 if (rc != 0) {
8676 pr_err("error %d\n", rc);
8677 goto rw_error;
8678 }
8679 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, qam_ctl_ena & ~(SCU_RAM_QAM_CTL_ENA_ACQ__M | SCU_RAM_QAM_CTL_ENA_EQU__M | SCU_RAM_QAM_CTL_ENA_LC__M), 0);
8680 if (rc != 0) {
8681 pr_err("error %d\n", rc);
8682 goto rw_error;
8683 }
8684
8685 /* freeze the frequency control loop */
8686 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF__A, 0, 0);
8687 if (rc != 0) {
8688 pr_err("error %d\n", rc);
8689 goto rw_error;
8690 }
8691 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF1__A, 0, 0);
8692 if (rc != 0) {
8693 pr_err("error %d\n", rc);
8694 goto rw_error;
8695 }
8696
8697 rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, &iqm_fs_rate_ofs, 0);
8698 if (rc != 0) {
8699 pr_err("error %d\n", rc);
8700 goto rw_error;
8701 }
8702 rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_LO__A, &iqm_fs_rate_lo, 0);
8703 if (rc != 0) {
8704 pr_err("error %d\n", rc);
8705 goto rw_error;
8706 }
8707 ofsofs = iqm_fs_rate_lo - iqm_fs_rate_ofs;
8708 iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
8709 iqm_fs_rate_ofs -= 2 * ofsofs;
8710
8711 /* freeze dq/fq updating */
8712 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8713 if (rc != 0) {
8714 pr_err("error %d\n", rc);
8715 goto rw_error;
8716 }
8717 data = (data & 0xfff9);
8718 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8719 if (rc != 0) {
8720 pr_err("error %d\n", rc);
8721 goto rw_error;
8722 }
8723 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8724 if (rc != 0) {
8725 pr_err("error %d\n", rc);
8726 goto rw_error;
8727 }
8728
8729 /* lc_cp / _ci / _ca */
8730 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CI__A, 0, 0);
8731 if (rc != 0) {
8732 pr_err("error %d\n", rc);
8733 goto rw_error;
8734 }
8735 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_EP__A, 0, 0);
8736 if (rc != 0) {
8737 pr_err("error %d\n", rc);
8738 goto rw_error;
8739 }
8740 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_LA_FACTOR__A, 0, 0);
8741 if (rc != 0) {
8742 pr_err("error %d\n", rc);
8743 goto rw_error;
8744 }
8745
8746 /* flip the spec */
8747 rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
8748 if (rc != 0) {
8749 pr_err("error %d\n", rc);
8750 goto rw_error;
8751 }
8752 ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
8753 ext_attr->pos_image = (ext_attr->pos_image) ? false : true;
8754
8755 /* freeze dq/fq updating */
8756 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8757 if (rc != 0) {
8758 pr_err("error %d\n", rc);
8759 goto rw_error;
8760 }
8761 equ_mode = data;
8762 data = (data & 0xfff9);
8763 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8764 if (rc != 0) {
8765 pr_err("error %d\n", rc);
8766 goto rw_error;
8767 }
8768 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8769 if (rc != 0) {
8770 pr_err("error %d\n", rc);
8771 goto rw_error;
8772 }
8773
8774 for (i = 0; i < 28; i++) {
8775 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8776 if (rc != 0) {
8777 pr_err("error %d\n", rc);
8778 goto rw_error;
8779 }
8780 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8781 if (rc != 0) {
8782 pr_err("error %d\n", rc);
8783 goto rw_error;
8784 }
8785 }
8786
8787 for (i = 0; i < 24; i++) {
8788 rc = drxj_dap_read_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8789 if (rc != 0) {
8790 pr_err("error %d\n", rc);
8791 goto rw_error;
8792 }
8793 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8794 if (rc != 0) {
8795 pr_err("error %d\n", rc);
8796 goto rw_error;
8797 }
8798 }
8799
8800 data = equ_mode;
8801 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8802 if (rc != 0) {
8803 pr_err("error %d\n", rc);
8804 goto rw_error;
8805 }
8806 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8807 if (rc != 0) {
8808 pr_err("error %d\n", rc);
8809 goto rw_error;
8810 }
8811
8812 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE_TGT__A, 4, 0);
8813 if (rc != 0) {
8814 pr_err("error %d\n", rc);
8815 goto rw_error;
8816 }
8817
8818 i = 0;
8819 while ((fsm_state != 4) && (i++ < 100)) {
8820 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE__A, &fsm_state, 0);
8821 if (rc != 0) {
8822 pr_err("error %d\n", rc);
8823 goto rw_error;
8824 }
8825 }
8826 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, (qam_ctl_ena | 0x0016), 0);
8827 if (rc != 0) {
8828 pr_err("error %d\n", rc);
8829 goto rw_error;
8830 }
8831
8832 return 0;
8833 rw_error:
8834 return rc;
8835
8836 }
8837
8838 #define NO_LOCK 0x0
8839 #define DEMOD_LOCKED 0x1
8840 #define SYNC_FLIPPED 0x2
8841 #define SPEC_MIRRORED 0x4
8842 /**
8843 * \fn int qam64auto ()
8844 * \brief auto do sync pattern switching and mirroring.
8845 * \param demod: instance of demod.
8846 * \param channel: pointer to channel data.
8847 * \param tuner_freq_offset: tuner frequency offset.
8848 * \param lock_status: pointer to lock status.
8849 * \return int.
8850 */
8851 static int
8852 qam64auto(struct drx_demod_instance *demod,
8853 struct drx_channel *channel,
8854 s32 tuner_freq_offset, enum drx_lock_status *lock_status)
8855 {
8856 struct drxj_data *ext_attr = demod->my_ext_attr;
8857 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8858 struct drx39xxj_state *state = dev_addr->user_data;
8859 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
8860 int rc;
8861 u32 lck_state = NO_LOCK;
8862 u32 start_time = 0;
8863 u32 d_locked_time = 0;
8864 u32 timeout_ofs = 0;
8865 u16 data = 0;
8866
8867 /* external attributes for storing aquired channel constellation */
8868 *lock_status = DRX_NOT_LOCKED;
8869 start_time = jiffies_to_msecs(jiffies);
8870 lck_state = NO_LOCK;
8871 do {
8872 rc = ctrl_lock_status(demod, lock_status);
8873 if (rc != 0) {
8874 pr_err("error %d\n", rc);
8875 goto rw_error;
8876 }
8877
8878 switch (lck_state) {
8879 case NO_LOCK:
8880 if (*lock_status == DRXJ_DEMOD_LOCK) {
8881 rc = ctrl_get_qam_sig_quality(demod);
8882 if (rc != 0) {
8883 pr_err("error %d\n", rc);
8884 goto rw_error;
8885 }
8886 if (p->cnr.stat[0].svalue > 20800) {
8887 lck_state = DEMOD_LOCKED;
8888 /* some delay to see if fec_lock possible TODO find the right value */
8889 timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME; /* see something, waiting longer */
8890 d_locked_time = jiffies_to_msecs(jiffies);
8891 }
8892 }
8893 break;
8894 case DEMOD_LOCKED:
8895 if ((*lock_status == DRXJ_DEMOD_LOCK) && /* still demod_lock in 150ms */
8896 ((jiffies_to_msecs(jiffies) - d_locked_time) >
8897 DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8898 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8899 if (rc != 0) {
8900 pr_err("error %d\n", rc);
8901 goto rw_error;
8902 }
8903 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8904 if (rc != 0) {
8905 pr_err("error %d\n", rc);
8906 goto rw_error;
8907 }
8908 lck_state = SYNC_FLIPPED;
8909 msleep(10);
8910 }
8911 break;
8912 case SYNC_FLIPPED:
8913 if (*lock_status == DRXJ_DEMOD_LOCK) {
8914 if (channel->mirror == DRX_MIRROR_AUTO) {
8915 /* flip sync pattern back */
8916 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8917 if (rc != 0) {
8918 pr_err("error %d\n", rc);
8919 goto rw_error;
8920 }
8921 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data & 0xFFFE, 0);
8922 if (rc != 0) {
8923 pr_err("error %d\n", rc);
8924 goto rw_error;
8925 }
8926 /* flip spectrum */
8927 ext_attr->mirror = DRX_MIRROR_YES;
8928 rc = qam_flip_spec(demod, channel);
8929 if (rc != 0) {
8930 pr_err("error %d\n", rc);
8931 goto rw_error;
8932 }
8933 lck_state = SPEC_MIRRORED;
8934 /* reset timer TODO: still need 500ms? */
8935 start_time = d_locked_time =
8936 jiffies_to_msecs(jiffies);
8937 timeout_ofs = 0;
8938 } else { /* no need to wait lock */
8939
8940 start_time =
8941 jiffies_to_msecs(jiffies) -
8942 DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8943 }
8944 }
8945 break;
8946 case SPEC_MIRRORED:
8947 if ((*lock_status == DRXJ_DEMOD_LOCK) && /* still demod_lock in 150ms */
8948 ((jiffies_to_msecs(jiffies) - d_locked_time) >
8949 DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8950 rc = ctrl_get_qam_sig_quality(demod);
8951 if (rc != 0) {
8952 pr_err("error %d\n", rc);
8953 goto rw_error;
8954 }
8955 if (p->cnr.stat[0].svalue > 20800) {
8956 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8957 if (rc != 0) {
8958 pr_err("error %d\n", rc);
8959 goto rw_error;
8960 }
8961 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8962 if (rc != 0) {
8963 pr_err("error %d\n", rc);
8964 goto rw_error;
8965 }
8966 /* no need to wait lock */
8967 start_time =
8968 jiffies_to_msecs(jiffies) -
8969 DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8970 }
8971 }
8972 break;
8973 default:
8974 break;
8975 }
8976 msleep(10);
8977 } while
8978 ((*lock_status != DRX_LOCKED) &&
8979 (*lock_status != DRX_NEVER_LOCK) &&
8980 ((jiffies_to_msecs(jiffies) - start_time) <
8981 (DRXJ_QAM_MAX_WAITTIME + timeout_ofs))
8982 );
8983 /* Returning control to apllication ... */
8984
8985 return 0;
8986 rw_error:
8987 return rc;
8988 }
8989
8990 /**
8991 * \fn int qam256auto ()
8992 * \brief auto do sync pattern switching and mirroring.
8993 * \param demod: instance of demod.
8994 * \param channel: pointer to channel data.
8995 * \param tuner_freq_offset: tuner frequency offset.
8996 * \param lock_status: pointer to lock status.
8997 * \return int.
8998 */
8999 static int
9000 qam256auto(struct drx_demod_instance *demod,
9001 struct drx_channel *channel,
9002 s32 tuner_freq_offset, enum drx_lock_status *lock_status)
9003 {
9004 struct drxj_data *ext_attr = demod->my_ext_attr;
9005 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9006 struct drx39xxj_state *state = dev_addr->user_data;
9007 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9008 int rc;
9009 u32 lck_state = NO_LOCK;
9010 u32 start_time = 0;
9011 u32 d_locked_time = 0;
9012 u32 timeout_ofs = DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
9013
9014 /* external attributes for storing aquired channel constellation */
9015 *lock_status = DRX_NOT_LOCKED;
9016 start_time = jiffies_to_msecs(jiffies);
9017 lck_state = NO_LOCK;
9018 do {
9019 rc = ctrl_lock_status(demod, lock_status);
9020 if (rc != 0) {
9021 pr_err("error %d\n", rc);
9022 goto rw_error;
9023 }
9024 switch (lck_state) {
9025 case NO_LOCK:
9026 if (*lock_status == DRXJ_DEMOD_LOCK) {
9027 rc = ctrl_get_qam_sig_quality(demod);
9028 if (rc != 0) {
9029 pr_err("error %d\n", rc);
9030 goto rw_error;
9031 }
9032 if (p->cnr.stat[0].svalue > 26800) {
9033 lck_state = DEMOD_LOCKED;
9034 timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME; /* see something, wait longer */
9035 d_locked_time = jiffies_to_msecs(jiffies);
9036 }
9037 }
9038 break;
9039 case DEMOD_LOCKED:
9040 if (*lock_status == DRXJ_DEMOD_LOCK) {
9041 if ((channel->mirror == DRX_MIRROR_AUTO) &&
9042 ((jiffies_to_msecs(jiffies) - d_locked_time) >
9043 DRXJ_QAM_FEC_LOCK_WAITTIME)) {
9044 ext_attr->mirror = DRX_MIRROR_YES;
9045 rc = qam_flip_spec(demod, channel);
9046 if (rc != 0) {
9047 pr_err("error %d\n", rc);
9048 goto rw_error;
9049 }
9050 lck_state = SPEC_MIRRORED;
9051 /* reset timer TODO: still need 300ms? */
9052 start_time = jiffies_to_msecs(jiffies);
9053 timeout_ofs = -DRXJ_QAM_MAX_WAITTIME / 2;
9054 }
9055 }
9056 break;
9057 case SPEC_MIRRORED:
9058 break;
9059 default:
9060 break;
9061 }
9062 msleep(10);
9063 } while
9064 ((*lock_status < DRX_LOCKED) &&
9065 (*lock_status != DRX_NEVER_LOCK) &&
9066 ((jiffies_to_msecs(jiffies) - start_time) <
9067 (DRXJ_QAM_MAX_WAITTIME + timeout_ofs)));
9068
9069 return 0;
9070 rw_error:
9071 return rc;
9072 }
9073
9074 /**
9075 * \fn int set_qam_channel ()
9076 * \brief Set QAM channel according to the requested constellation.
9077 * \param demod: instance of demod.
9078 * \param channel: pointer to channel data.
9079 * \return int.
9080 */
9081 static int
9082 set_qam_channel(struct drx_demod_instance *demod,
9083 struct drx_channel *channel, s32 tuner_freq_offset)
9084 {
9085 struct drxj_data *ext_attr = NULL;
9086 int rc;
9087 enum drx_lock_status lock_status = DRX_NOT_LOCKED;
9088 bool auto_flag = false;
9089
9090 /* external attributes for storing aquired channel constellation */
9091 ext_attr = (struct drxj_data *) demod->my_ext_attr;
9092
9093 /* set QAM channel constellation */
9094 switch (channel->constellation) {
9095 case DRX_CONSTELLATION_QAM16:
9096 case DRX_CONSTELLATION_QAM32:
9097 case DRX_CONSTELLATION_QAM128:
9098 return -EINVAL;
9099 case DRX_CONSTELLATION_QAM64:
9100 case DRX_CONSTELLATION_QAM256:
9101 if (ext_attr->standard != DRX_STANDARD_ITU_B)
9102 return -EINVAL;
9103
9104 ext_attr->constellation = channel->constellation;
9105 if (channel->mirror == DRX_MIRROR_AUTO)
9106 ext_attr->mirror = DRX_MIRROR_NO;
9107 else
9108 ext_attr->mirror = channel->mirror;
9109
9110 rc = set_qam(demod, channel, tuner_freq_offset, QAM_SET_OP_ALL);
9111 if (rc != 0) {
9112 pr_err("error %d\n", rc);
9113 goto rw_error;
9114 }
9115
9116 if (channel->constellation == DRX_CONSTELLATION_QAM64)
9117 rc = qam64auto(demod, channel, tuner_freq_offset,
9118 &lock_status);
9119 else
9120 rc = qam256auto(demod, channel, tuner_freq_offset,
9121 &lock_status);
9122 if (rc != 0) {
9123 pr_err("error %d\n", rc);
9124 goto rw_error;
9125 }
9126 break;
9127 case DRX_CONSTELLATION_AUTO: /* for channel scan */
9128 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9129 u16 qam_ctl_ena = 0;
9130
9131 auto_flag = true;
9132
9133 /* try to lock default QAM constellation: QAM256 */
9134 channel->constellation = DRX_CONSTELLATION_QAM256;
9135 ext_attr->constellation = DRX_CONSTELLATION_QAM256;
9136 if (channel->mirror == DRX_MIRROR_AUTO)
9137 ext_attr->mirror = DRX_MIRROR_NO;
9138 else
9139 ext_attr->mirror = channel->mirror;
9140 rc = set_qam(demod, channel, tuner_freq_offset,
9141 QAM_SET_OP_ALL);
9142 if (rc != 0) {
9143 pr_err("error %d\n", rc);
9144 goto rw_error;
9145 }
9146 rc = qam256auto(demod, channel, tuner_freq_offset,
9147 &lock_status);
9148 if (rc != 0) {
9149 pr_err("error %d\n", rc);
9150 goto rw_error;
9151 }
9152
9153 if (lock_status >= DRX_LOCKED) {
9154 channel->constellation = DRX_CONSTELLATION_AUTO;
9155 break;
9156 }
9157
9158 /* QAM254 not locked. Try QAM64 constellation */
9159 channel->constellation = DRX_CONSTELLATION_QAM64;
9160 ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9161 if (channel->mirror == DRX_MIRROR_AUTO)
9162 ext_attr->mirror = DRX_MIRROR_NO;
9163 else
9164 ext_attr->mirror = channel->mirror;
9165
9166 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9167 SCU_RAM_QAM_CTL_ENA__A,
9168 &qam_ctl_ena, 0);
9169 if (rc != 0) {
9170 pr_err("error %d\n", rc);
9171 goto rw_error;
9172 }
9173 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9174 SCU_RAM_QAM_CTL_ENA__A,
9175 qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9176 if (rc != 0) {
9177 pr_err("error %d\n", rc);
9178 goto rw_error;
9179 }
9180 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9181 SCU_RAM_QAM_FSM_STATE_TGT__A,
9182 0x2, 0);
9183 if (rc != 0) {
9184 pr_err("error %d\n", rc);
9185 goto rw_error;
9186 } /* force to rate hunting */
9187
9188 rc = set_qam(demod, channel, tuner_freq_offset,
9189 QAM_SET_OP_CONSTELLATION);
9190 if (rc != 0) {
9191 pr_err("error %d\n", rc);
9192 goto rw_error;
9193 }
9194 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9195 SCU_RAM_QAM_CTL_ENA__A,
9196 qam_ctl_ena, 0);
9197 if (rc != 0) {
9198 pr_err("error %d\n", rc);
9199 goto rw_error;
9200 }
9201
9202 rc = qam64auto(demod, channel, tuner_freq_offset,
9203 &lock_status);
9204 if (rc != 0) {
9205 pr_err("error %d\n", rc);
9206 goto rw_error;
9207 }
9208
9209 channel->constellation = DRX_CONSTELLATION_AUTO;
9210 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
9211 u16 qam_ctl_ena = 0;
9212
9213 channel->constellation = DRX_CONSTELLATION_QAM64;
9214 ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9215 auto_flag = true;
9216
9217 if (channel->mirror == DRX_MIRROR_AUTO)
9218 ext_attr->mirror = DRX_MIRROR_NO;
9219 else
9220 ext_attr->mirror = channel->mirror;
9221 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9222 SCU_RAM_QAM_CTL_ENA__A,
9223 &qam_ctl_ena, 0);
9224 if (rc != 0) {
9225 pr_err("error %d\n", rc);
9226 goto rw_error;
9227 }
9228 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9229 SCU_RAM_QAM_CTL_ENA__A,
9230 qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9231 if (rc != 0) {
9232 pr_err("error %d\n", rc);
9233 goto rw_error;
9234 }
9235 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9236 SCU_RAM_QAM_FSM_STATE_TGT__A,
9237 0x2, 0);
9238 if (rc != 0) {
9239 pr_err("error %d\n", rc);
9240 goto rw_error;
9241 } /* force to rate hunting */
9242
9243 rc = set_qam(demod, channel, tuner_freq_offset,
9244 QAM_SET_OP_CONSTELLATION);
9245 if (rc != 0) {
9246 pr_err("error %d\n", rc);
9247 goto rw_error;
9248 }
9249 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9250 SCU_RAM_QAM_CTL_ENA__A,
9251 qam_ctl_ena, 0);
9252 if (rc != 0) {
9253 pr_err("error %d\n", rc);
9254 goto rw_error;
9255 }
9256 rc = qam64auto(demod, channel, tuner_freq_offset,
9257 &lock_status);
9258 if (rc != 0) {
9259 pr_err("error %d\n", rc);
9260 goto rw_error;
9261 }
9262 channel->constellation = DRX_CONSTELLATION_AUTO;
9263 } else {
9264 return -EINVAL;
9265 }
9266 break;
9267 default:
9268 return -EINVAL;
9269 }
9270
9271 return 0;
9272 rw_error:
9273 /* restore starting value */
9274 if (auto_flag)
9275 channel->constellation = DRX_CONSTELLATION_AUTO;
9276 return rc;
9277 }
9278
9279 /*============================================================================*/
9280
9281 /**
9282 * \fn static short get_qamrs_err_count(struct i2c_device_addr *dev_addr)
9283 * \brief Get RS error count in QAM mode (used for post RS BER calculation)
9284 * \return Error code
9285 *
9286 * precondition: measurement period & measurement prescale must be set
9287 *
9288 */
9289 static int
9290 get_qamrs_err_count(struct i2c_device_addr *dev_addr,
9291 struct drxjrs_errors *rs_errors)
9292 {
9293 int rc;
9294 u16 nr_bit_errors = 0,
9295 nr_symbol_errors = 0,
9296 nr_packet_errors = 0, nr_failures = 0, nr_snc_par_fail_count = 0;
9297
9298 /* check arguments */
9299 if (dev_addr == NULL)
9300 return -EINVAL;
9301
9302 /* all reported errors are received in the */
9303 /* most recently finished measurment period */
9304 /* no of pre RS bit errors */
9305 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &nr_bit_errors, 0);
9306 if (rc != 0) {
9307 pr_err("error %d\n", rc);
9308 goto rw_error;
9309 }
9310 /* no of symbol errors */
9311 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_SYMBOL_ERRORS__A, &nr_symbol_errors, 0);
9312 if (rc != 0) {
9313 pr_err("error %d\n", rc);
9314 goto rw_error;
9315 }
9316 /* no of packet errors */
9317 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_PACKET_ERRORS__A, &nr_packet_errors, 0);
9318 if (rc != 0) {
9319 pr_err("error %d\n", rc);
9320 goto rw_error;
9321 }
9322 /* no of failures to decode */
9323 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &nr_failures, 0);
9324 if (rc != 0) {
9325 pr_err("error %d\n", rc);
9326 goto rw_error;
9327 }
9328 /* no of post RS bit erros */
9329 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_COUNT__A, &nr_snc_par_fail_count, 0);
9330 if (rc != 0) {
9331 pr_err("error %d\n", rc);
9332 goto rw_error;
9333 }
9334 /* TODO: NOTE */
9335 /* These register values are fetched in non-atomic fashion */
9336 /* It is possible that the read values contain unrelated information */
9337
9338 rs_errors->nr_bit_errors = nr_bit_errors & FEC_RS_NR_BIT_ERRORS__M;
9339 rs_errors->nr_symbol_errors = nr_symbol_errors & FEC_RS_NR_SYMBOL_ERRORS__M;
9340 rs_errors->nr_packet_errors = nr_packet_errors & FEC_RS_NR_PACKET_ERRORS__M;
9341 rs_errors->nr_failures = nr_failures & FEC_RS_NR_FAILURES__M;
9342 rs_errors->nr_snc_par_fail_count =
9343 nr_snc_par_fail_count & FEC_OC_SNC_FAIL_COUNT__M;
9344
9345 return 0;
9346 rw_error:
9347 return rc;
9348 }
9349
9350 /*============================================================================*/
9351
9352 /**
9353 * \fn int get_sig_strength()
9354 * \brief Retrieve signal strength for VSB and QAM.
9355 * \param demod Pointer to demod instance
9356 * \param u16-t Pointer to signal strength data; range 0, .. , 100.
9357 * \return int.
9358 * \retval 0 sig_strength contains valid data.
9359 * \retval -EINVAL sig_strength is NULL.
9360 * \retval -EIO Erroneous data, sig_strength contains invalid data.
9361 */
9362 #define DRXJ_AGC_TOP 0x2800
9363 #define DRXJ_AGC_SNS 0x1600
9364 #define DRXJ_RFAGC_MAX 0x3fff
9365 #define DRXJ_RFAGC_MIN 0x800
9366
9367 static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
9368 {
9369 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9370 int rc;
9371 u16 rf_gain = 0;
9372 u16 if_gain = 0;
9373 u16 if_agc_sns = 0;
9374 u16 if_agc_top = 0;
9375 u16 rf_agc_max = 0;
9376 u16 rf_agc_min = 0;
9377
9378 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_IF__A, &if_gain, 0);
9379 if (rc != 0) {
9380 pr_err("error %d\n", rc);
9381 goto rw_error;
9382 }
9383 if_gain &= IQM_AF_AGC_IF__M;
9384 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_RF__A, &rf_gain, 0);
9385 if (rc != 0) {
9386 pr_err("error %d\n", rc);
9387 goto rw_error;
9388 }
9389 rf_gain &= IQM_AF_AGC_RF__M;
9390
9391 if_agc_sns = DRXJ_AGC_SNS;
9392 if_agc_top = DRXJ_AGC_TOP;
9393 rf_agc_max = DRXJ_RFAGC_MAX;
9394 rf_agc_min = DRXJ_RFAGC_MIN;
9395
9396 if (if_gain > if_agc_top) {
9397 if (rf_gain > rf_agc_max)
9398 *sig_strength = 100;
9399 else if (rf_gain > rf_agc_min) {
9400 if (rf_agc_max == rf_agc_min) {
9401 pr_err("error: rf_agc_max == rf_agc_min\n");
9402 return -EIO;
9403 }
9404 *sig_strength =
9405 75 + 25 * (rf_gain - rf_agc_min) / (rf_agc_max -
9406 rf_agc_min);
9407 } else
9408 *sig_strength = 75;
9409 } else if (if_gain > if_agc_sns) {
9410 if (if_agc_top == if_agc_sns) {
9411 pr_err("error: if_agc_top == if_agc_sns\n");
9412 return -EIO;
9413 }
9414 *sig_strength =
9415 20 + 55 * (if_gain - if_agc_sns) / (if_agc_top - if_agc_sns);
9416 } else {
9417 if (!if_agc_sns) {
9418 pr_err("error: if_agc_sns is zero!\n");
9419 return -EIO;
9420 }
9421 *sig_strength = (20 * if_gain / if_agc_sns);
9422 }
9423
9424 if (*sig_strength <= 7)
9425 *sig_strength = 0;
9426
9427 return 0;
9428 rw_error:
9429 return rc;
9430 }
9431
9432 /**
9433 * \fn int ctrl_get_qam_sig_quality()
9434 * \brief Retreive QAM signal quality from device.
9435 * \param devmod Pointer to demodulator instance.
9436 * \param sig_quality Pointer to signal quality data.
9437 * \return int.
9438 * \retval 0 sig_quality contains valid data.
9439 * \retval -EINVAL sig_quality is NULL.
9440 * \retval -EIO Erroneous data, sig_quality contains invalid data.
9441
9442 * Pre-condition: Device must be started and in lock.
9443 */
9444 static int
9445 ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
9446 {
9447 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9448 struct drxj_data *ext_attr = demod->my_ext_attr;
9449 struct drx39xxj_state *state = dev_addr->user_data;
9450 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9451 struct drxjrs_errors measuredrs_errors = { 0, 0, 0, 0, 0 };
9452 enum drx_modulation constellation = ext_attr->constellation;
9453 int rc;
9454
9455 u32 pre_bit_err_rs = 0; /* pre RedSolomon Bit Error Rate */
9456 u32 post_bit_err_rs = 0; /* post RedSolomon Bit Error Rate */
9457 u32 pkt_errs = 0; /* no of packet errors in RS */
9458 u16 qam_sl_err_power = 0; /* accumulated error between raw and sliced symbols */
9459 u16 qsym_err_vd = 0; /* quadrature symbol errors in QAM_VD */
9460 u16 fec_oc_period = 0; /* SNC sync failure measurement period */
9461 u16 fec_rs_prescale = 0; /* ReedSolomon Measurement Prescale */
9462 u16 fec_rs_period = 0; /* Value for corresponding I2C register */
9463 /* calculation constants */
9464 u32 rs_bit_cnt = 0; /* RedSolomon Bit Count */
9465 u32 qam_sl_sig_power = 0; /* used for MER, depends of QAM constellation */
9466 /* intermediate results */
9467 u32 e = 0; /* exponent value used for QAM BER/SER */
9468 u32 m = 0; /* mantisa value used for QAM BER/SER */
9469 u32 ber_cnt = 0; /* BER count */
9470 /* signal quality info */
9471 u32 qam_sl_mer = 0; /* QAM MER */
9472 u32 qam_pre_rs_ber = 0; /* Pre RedSolomon BER */
9473 u32 qam_post_rs_ber = 0; /* Post RedSolomon BER */
9474 u32 qam_vd_ser = 0; /* ViterbiDecoder SER */
9475 u16 qam_vd_prescale = 0; /* Viterbi Measurement Prescale */
9476 u16 qam_vd_period = 0; /* Viterbi Measurement period */
9477 u32 vd_bit_cnt = 0; /* ViterbiDecoder Bit Count */
9478
9479 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9480
9481 /* read the physical registers */
9482 /* Get the RS error data */
9483 rc = get_qamrs_err_count(dev_addr, &measuredrs_errors);
9484 if (rc != 0) {
9485 pr_err("error %d\n", rc);
9486 goto rw_error;
9487 }
9488 /* get the register value needed for MER */
9489 rc = drxj_dap_read_reg16(dev_addr, QAM_SL_ERR_POWER__A, &qam_sl_err_power, 0);
9490 if (rc != 0) {
9491 pr_err("error %d\n", rc);
9492 goto rw_error;
9493 }
9494 /* get the register value needed for post RS BER */
9495 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, &fec_oc_period, 0);
9496 if (rc != 0) {
9497 pr_err("error %d\n", rc);
9498 goto rw_error;
9499 }
9500
9501 /* get constants needed for signal quality calculation */
9502 fec_rs_period = ext_attr->fec_rs_period;
9503 fec_rs_prescale = ext_attr->fec_rs_prescale;
9504 rs_bit_cnt = fec_rs_period * fec_rs_prescale * ext_attr->fec_rs_plen;
9505 qam_vd_period = ext_attr->qam_vd_period;
9506 qam_vd_prescale = ext_attr->qam_vd_prescale;
9507 vd_bit_cnt = qam_vd_period * qam_vd_prescale * ext_attr->fec_vd_plen;
9508
9509 /* DRXJ_QAM_SL_SIG_POWER_QAMxxx * 4 */
9510 switch (constellation) {
9511 case DRX_CONSTELLATION_QAM16:
9512 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM16 << 2;
9513 break;
9514 case DRX_CONSTELLATION_QAM32:
9515 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM32 << 2;
9516 break;
9517 case DRX_CONSTELLATION_QAM64:
9518 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM64 << 2;
9519 break;
9520 case DRX_CONSTELLATION_QAM128:
9521 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM128 << 2;
9522 break;
9523 case DRX_CONSTELLATION_QAM256:
9524 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM256 << 2;
9525 break;
9526 default:
9527 return -EIO;
9528 }
9529
9530 /* ------------------------------ */
9531 /* MER Calculation */
9532 /* ------------------------------ */
9533 /* MER is good if it is above 27.5 for QAM256 or 21.5 for QAM64 */
9534
9535 /* 10.0*log10(qam_sl_sig_power * 4.0 / qam_sl_err_power); */
9536 if (qam_sl_err_power == 0)
9537 qam_sl_mer = 0;
9538 else
9539 qam_sl_mer = log1_times100(qam_sl_sig_power) - log1_times100((u32)qam_sl_err_power);
9540
9541 /* ----------------------------------------- */
9542 /* Pre Viterbi Symbol Error Rate Calculation */
9543 /* ----------------------------------------- */
9544 /* pre viterbi SER is good if it is bellow 0.025 */
9545
9546 /* get the register value */
9547 /* no of quadrature symbol errors */
9548 rc = drxj_dap_read_reg16(dev_addr, QAM_VD_NR_QSYM_ERRORS__A, &qsym_err_vd, 0);
9549 if (rc != 0) {
9550 pr_err("error %d\n", rc);
9551 goto rw_error;
9552 }
9553 /* Extract the Exponent and the Mantisa */
9554 /* of number of quadrature symbol errors */
9555 e = (qsym_err_vd & QAM_VD_NR_QSYM_ERRORS_EXP__M) >>
9556 QAM_VD_NR_QSYM_ERRORS_EXP__B;
9557 m = (qsym_err_vd & QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__M) >>
9558 QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B;
9559
9560 if ((m << e) >> 3 > 549752)
9561 qam_vd_ser = 500000 * vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9562 else
9563 qam_vd_ser = m << ((e > 2) ? (e - 3) : e);
9564
9565 /* --------------------------------------- */
9566 /* pre and post RedSolomon BER Calculation */
9567 /* --------------------------------------- */
9568 /* pre RS BER is good if it is below 3.5e-4 */
9569
9570 /* get the register values */
9571 pre_bit_err_rs = (u32) measuredrs_errors.nr_bit_errors;
9572 pkt_errs = post_bit_err_rs = (u32) measuredrs_errors.nr_snc_par_fail_count;
9573
9574 /* Extract the Exponent and the Mantisa of the */
9575 /* pre Reed-Solomon bit error count */
9576 e = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_EXP__M) >>
9577 FEC_RS_NR_BIT_ERRORS_EXP__B;
9578 m = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M) >>
9579 FEC_RS_NR_BIT_ERRORS_FIXED_MANT__B;
9580
9581 ber_cnt = m << e;
9582
9583 /*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */
9584 if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0)
9585 qam_pre_rs_ber = 500000 * rs_bit_cnt >> e;
9586 else
9587 qam_pre_rs_ber = ber_cnt;
9588
9589 /* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) / */
9590 /* (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A) */
9591 /*
9592 => c = (1000000*100*11.17)/1504 =
9593 post RS BER = (( c* FEC_OC_SNC_FAIL_COUNT__A) /
9594 (100 * FEC_OC_SNC_FAIL_PERIOD__A)
9595 *100 and /100 is for more precision.
9596 => (20 bits * 12 bits) /(16 bits * 7 bits) => safe in 32 bits computation
9597
9598 Precision errors still possible.
9599 */
9600 e = post_bit_err_rs * 742686;
9601 m = fec_oc_period * 100;
9602 if (fec_oc_period == 0)
9603 qam_post_rs_ber = 0xFFFFFFFF;
9604 else
9605 qam_post_rs_ber = e / m;
9606
9607 /* fill signal quality data structure */
9608 p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9609 p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9610 p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9611 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9612 p->block_error.stat[0].scale = FE_SCALE_COUNTER;
9613 p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
9614
9615 p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100;
9616 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9617 p->pre_bit_error.stat[0].uvalue += qam_vd_ser;
9618 p->pre_bit_count.stat[0].uvalue += vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9619 } else {
9620 p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber;
9621 p->pre_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9622 }
9623
9624 p->post_bit_error.stat[0].uvalue += qam_post_rs_ber;
9625 p->post_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9626
9627 p->block_error.stat[0].uvalue += pkt_errs;
9628
9629 #ifdef DRXJ_SIGNAL_ACCUM_ERR
9630 rc = get_acc_pkt_err(demod, &sig_quality->packet_error);
9631 if (rc != 0) {
9632 pr_err("error %d\n", rc);
9633 goto rw_error;
9634 }
9635 #endif
9636
9637 return 0;
9638 rw_error:
9639 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9640 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9641 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9642 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9643 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9644 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9645
9646 return rc;
9647 }
9648
9649 #endif /* #ifndef DRXJ_VSB_ONLY */
9650
9651 /*============================================================================*/
9652 /*== END QAM DATAPATH FUNCTIONS ==*/
9653 /*============================================================================*/
9654
9655 /*============================================================================*/
9656 /*============================================================================*/
9657 /*== ATV DATAPATH FUNCTIONS ==*/
9658 /*============================================================================*/
9659 /*============================================================================*/
9660
9661 /*
9662 Implementation notes.
9663
9664 NTSC/FM AGCs
9665
9666 Four AGCs are used for NTSC:
9667 (1) RF (used to attenuate the input signal in case of to much power)
9668 (2) IF (used to attenuate the input signal in case of to much power)
9669 (3) Video AGC (used to amplify the output signal in case input to low)
9670 (4) SIF AGC (used to amplify the output signal in case input to low)
9671
9672 Video AGC is coupled to RF and IF. SIF AGC is not coupled. It is assumed
9673 that the coupling between Video AGC and the RF and IF AGCs also works in
9674 favor of the SIF AGC.
9675
9676 Three AGCs are used for FM:
9677 (1) RF (used to attenuate the input signal in case of to much power)
9678 (2) IF (used to attenuate the input signal in case of to much power)
9679 (3) SIF AGC (used to amplify the output signal in case input to low)
9680
9681 The SIF AGC is now coupled to the RF/IF AGCs.
9682 The SIF AGC is needed for both SIF ouput and the internal SIF signal to
9683 the AUD block.
9684
9685 RF and IF AGCs DACs are part of AFE, Video and SIF AGC DACs are part of
9686 the ATV block. The AGC control algorithms are all implemented in
9687 microcode.
9688
9689 ATV SETTINGS
9690
9691 (Shadow settings will not be used for now, they will be implemented
9692 later on because of the schedule)
9693
9694 Several HW/SCU "settings" can be used for ATV. The standard selection
9695 will reset most of these settings. To avoid that the end user apllication
9696 has to perform these settings each time the ATV or FM standards is
9697 selected the driver will shadow these settings. This enables the end user
9698 to perform the settings only once after a drx_open(). The driver must
9699 write the shadow settings to HW/SCU incase:
9700 ( setstandard FM/ATV) ||
9701 ( settings have changed && FM/ATV standard is active)
9702 The shadow settings will be stored in the device specific data container.
9703 A set of flags will be defined to flag changes in shadow settings.
9704 A routine will be implemented to write all changed shadow settings to
9705 HW/SCU.
9706
9707 The "settings" will consist of: AGC settings, filter settings etc.
9708
9709 Disadvantage of use of shadow settings:
9710 Direct changes in HW/SCU registers will not be reflected in the
9711 shadow settings and these changes will be overwritten during a next
9712 update. This can happen during evaluation. This will not be a problem
9713 for normal customer usage.
9714 */
9715 /* -------------------------------------------------------------------------- */
9716
9717 /**
9718 * \fn int power_down_atv ()
9719 * \brief Power down ATV.
9720 * \param demod instance of demodulator
9721 * \param standard either NTSC or FM (sub strandard for ATV )
9722 * \return int.
9723 *
9724 * Stops and thus resets ATV and IQM block
9725 * SIF and CVBS ADC are powered down
9726 * Calls audio power down
9727 */
9728 static int
9729 power_down_atv(struct drx_demod_instance *demod, enum drx_standard standard, bool primary)
9730 {
9731 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9732 struct drxjscu_cmd cmd_scu = { /* command */ 0,
9733 /* parameter_len */ 0,
9734 /* result_len */ 0,
9735 /* *parameter */ NULL,
9736 /* *result */ NULL
9737 };
9738 int rc;
9739 u16 cmd_result = 0;
9740
9741 /* ATV NTSC */
9742
9743 /* Stop ATV SCU (will reset ATV and IQM hardware */
9744 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_ATV |
9745 SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9746 cmd_scu.parameter_len = 0;
9747 cmd_scu.result_len = 1;
9748 cmd_scu.parameter = NULL;
9749 cmd_scu.result = &cmd_result;
9750 rc = scu_command(dev_addr, &cmd_scu);
9751 if (rc != 0) {
9752 pr_err("error %d\n", rc);
9753 goto rw_error;
9754 }
9755 /* Disable ATV outputs (ATV reset enables CVBS, undo this) */
9756 rc = drxj_dap_write_reg16(dev_addr, ATV_TOP_STDBY__A, (ATV_TOP_STDBY_SIF_STDBY_STANDBY & (~ATV_TOP_STDBY_CVBS_STDBY_A2_ACTIVE)), 0);
9757 if (rc != 0) {
9758 pr_err("error %d\n", rc);
9759 goto rw_error;
9760 }
9761
9762 rc = drxj_dap_write_reg16(dev_addr, ATV_COMM_EXEC__A, ATV_COMM_EXEC_STOP, 0);
9763 if (rc != 0) {
9764 pr_err("error %d\n", rc);
9765 goto rw_error;
9766 }
9767 if (primary) {
9768 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
9769 if (rc != 0) {
9770 pr_err("error %d\n", rc);
9771 goto rw_error;
9772 }
9773 rc = set_iqm_af(demod, false);
9774 if (rc != 0) {
9775 pr_err("error %d\n", rc);
9776 goto rw_error;
9777 }
9778 } else {
9779 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
9780 if (rc != 0) {
9781 pr_err("error %d\n", rc);
9782 goto rw_error;
9783 }
9784 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
9785 if (rc != 0) {
9786 pr_err("error %d\n", rc);
9787 goto rw_error;
9788 }
9789 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
9790 if (rc != 0) {
9791 pr_err("error %d\n", rc);
9792 goto rw_error;
9793 }
9794 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
9795 if (rc != 0) {
9796 pr_err("error %d\n", rc);
9797 goto rw_error;
9798 }
9799 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
9800 if (rc != 0) {
9801 pr_err("error %d\n", rc);
9802 goto rw_error;
9803 }
9804 }
9805 rc = power_down_aud(demod);
9806 if (rc != 0) {
9807 pr_err("error %d\n", rc);
9808 goto rw_error;
9809 }
9810
9811 return 0;
9812 rw_error:
9813 return rc;
9814 }
9815
9816 /*============================================================================*/
9817
9818 /**
9819 * \brief Power up AUD.
9820 * \param demod instance of demodulator
9821 * \return int.
9822 *
9823 */
9824 static int power_down_aud(struct drx_demod_instance *demod)
9825 {
9826 struct i2c_device_addr *dev_addr = NULL;
9827 struct drxj_data *ext_attr = NULL;
9828 int rc;
9829
9830 dev_addr = (struct i2c_device_addr *)demod->my_i2c_dev_addr;
9831 ext_attr = (struct drxj_data *) demod->my_ext_attr;
9832
9833 rc = drxj_dap_write_reg16(dev_addr, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP, 0);
9834 if (rc != 0) {
9835 pr_err("error %d\n", rc);
9836 goto rw_error;
9837 }
9838
9839 ext_attr->aud_data.audio_is_active = false;
9840
9841 return 0;
9842 rw_error:
9843 return rc;
9844 }
9845
9846 /**
9847 * \fn int set_orx_nsu_aox()
9848 * \brief Configure OrxNsuAox for OOB
9849 * \param demod instance of demodulator.
9850 * \param active
9851 * \return int.
9852 */
9853 static int set_orx_nsu_aox(struct drx_demod_instance *demod, bool active)
9854 {
9855 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9856 int rc;
9857 u16 data = 0;
9858
9859 /* Configure NSU_AOX */
9860 rc = drxj_dap_read_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, &data, 0);
9861 if (rc != 0) {
9862 pr_err("error %d\n", rc);
9863 goto rw_error;
9864 }
9865 if (!active)
9866 data &= ((~ORX_NSU_AOX_STDBY_W_STDBYADC_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYAMP_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYBIAS_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYPLL_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYPD_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_IF_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_RF_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYFLT_A2_ON));
9867 else
9868 data |= (ORX_NSU_AOX_STDBY_W_STDBYADC_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYAMP_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYBIAS_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYPLL_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYPD_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYTAGC_IF_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYTAGC_RF_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYFLT_A2_ON);
9869 rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, data, 0);
9870 if (rc != 0) {
9871 pr_err("error %d\n", rc);
9872 goto rw_error;
9873 }
9874
9875 return 0;
9876 rw_error:
9877 return rc;
9878 }
9879
9880 /**
9881 * \fn int ctrl_set_oob()
9882 * \brief Set OOB channel to be used.
9883 * \param demod instance of demodulator
9884 * \param oob_param OOB parameters for channel setting.
9885 * \frequency should be in KHz
9886 * \return int.
9887 *
9888 * Accepts only. Returns error otherwise.
9889 * Demapper value is written after scu_command START
9890 * because START command causes COMM_EXEC transition
9891 * from 0 to 1 which causes all registers to be
9892 * overwritten with initial value
9893 *
9894 */
9895
9896 /* Nyquist filter impulse response */
9897 #define IMPULSE_COSINE_ALPHA_0_3 {-3, -4, -1, 6, 10, 7, -5, -20, -25, -10, 29, 79, 123, 140} /*sqrt raised-cosine filter with alpha=0.3 */
9898 #define IMPULSE_COSINE_ALPHA_0_5 { 2, 0, -2, -2, 2, 5, 2, -10, -20, -14, 20, 74, 125, 145} /*sqrt raised-cosine filter with alpha=0.5 */
9899 #define IMPULSE_COSINE_ALPHA_RO_0_5 { 0, 0, 1, 2, 3, 0, -7, -15, -16, 0, 34, 77, 114, 128} /*full raised-cosine filter with alpha=0.5 (receiver only) */
9900
9901 /* Coefficients for the nyquist fitler (total: 27 taps) */
9902 #define NYQFILTERLEN 27
9903
9904 static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_param)
9905 {
9906 int rc;
9907 s32 freq = 0; /* KHz */
9908 struct i2c_device_addr *dev_addr = NULL;
9909 struct drxj_data *ext_attr = NULL;
9910 u16 i = 0;
9911 bool mirror_freq_spect_oob = false;
9912 u16 trk_filter_value = 0;
9913 struct drxjscu_cmd scu_cmd;
9914 u16 set_param_parameters[3];
9915 u16 cmd_result[2] = { 0, 0 };
9916 s16 nyquist_coeffs[4][(NYQFILTERLEN + 1) / 2] = {
9917 IMPULSE_COSINE_ALPHA_0_3, /* Target Mode 0 */
9918 IMPULSE_COSINE_ALPHA_0_3, /* Target Mode 1 */
9919 IMPULSE_COSINE_ALPHA_0_5, /* Target Mode 2 */
9920 IMPULSE_COSINE_ALPHA_RO_0_5 /* Target Mode 3 */
9921 };
9922 u8 mode_val[4] = { 2, 2, 0, 1 };
9923 u8 pfi_coeffs[4][6] = {
9924 {DRXJ_16TO8(-92), DRXJ_16TO8(-108), DRXJ_16TO8(100)}, /* TARGET_MODE = 0: PFI_A = -23/32; PFI_B = -54/32; PFI_C = 25/32; fg = 0.5 MHz (Att=26dB) */
9925 {DRXJ_16TO8(-64), DRXJ_16TO8(-80), DRXJ_16TO8(80)}, /* TARGET_MODE = 1: PFI_A = -16/32; PFI_B = -40/32; PFI_C = 20/32; fg = 1.0 MHz (Att=28dB) */
9926 {DRXJ_16TO8(-80), DRXJ_16TO8(-98), DRXJ_16TO8(92)}, /* TARGET_MODE = 2, 3: PFI_A = -20/32; PFI_B = -49/32; PFI_C = 23/32; fg = 0.8 MHz (Att=25dB) */
9927 {DRXJ_16TO8(-80), DRXJ_16TO8(-98), DRXJ_16TO8(92)} /* TARGET_MODE = 2, 3: PFI_A = -20/32; PFI_B = -49/32; PFI_C = 23/32; fg = 0.8 MHz (Att=25dB) */
9928 };
9929 u16 mode_index;
9930
9931 dev_addr = demod->my_i2c_dev_addr;
9932 ext_attr = (struct drxj_data *) demod->my_ext_attr;
9933 mirror_freq_spect_oob = ext_attr->mirror_freq_spect_oob;
9934
9935 /* Check parameters */
9936 if (oob_param == NULL) {
9937 /* power off oob module */
9938 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
9939 | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9940 scu_cmd.parameter_len = 0;
9941 scu_cmd.result_len = 1;
9942 scu_cmd.result = cmd_result;
9943 rc = scu_command(dev_addr, &scu_cmd);
9944 if (rc != 0) {
9945 pr_err("error %d\n", rc);
9946 goto rw_error;
9947 }
9948 rc = set_orx_nsu_aox(demod, false);
9949 if (rc != 0) {
9950 pr_err("error %d\n", rc);
9951 goto rw_error;
9952 }
9953 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
9954 if (rc != 0) {
9955 pr_err("error %d\n", rc);
9956 goto rw_error;
9957 }
9958
9959 ext_attr->oob_power_on = false;
9960 return 0;
9961 }
9962
9963 freq = oob_param->frequency;
9964 if ((freq < 70000) || (freq > 130000))
9965 return -EIO;
9966 freq = (freq - 50000) / 50;
9967
9968 {
9969 u16 index = 0;
9970 u16 remainder = 0;
9971 u16 *trk_filtercfg = ext_attr->oob_trk_filter_cfg;
9972
9973 index = (u16) ((freq - 400) / 200);
9974 remainder = (u16) ((freq - 400) % 200);
9975 trk_filter_value =
9976 trk_filtercfg[index] - (trk_filtercfg[index] -
9977 trk_filtercfg[index +
9978 1]) / 10 * remainder /
9979 20;
9980 }
9981
9982 /*********/
9983 /* Stop */
9984 /*********/
9985 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
9986 if (rc != 0) {
9987 pr_err("error %d\n", rc);
9988 goto rw_error;
9989 }
9990 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
9991 | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9992 scu_cmd.parameter_len = 0;
9993 scu_cmd.result_len = 1;
9994 scu_cmd.result = cmd_result;
9995 rc = scu_command(dev_addr, &scu_cmd);
9996 if (rc != 0) {
9997 pr_err("error %d\n", rc);
9998 goto rw_error;
9999 }
10000 /*********/
10001 /* Reset */
10002 /*********/
10003 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10004 | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
10005 scu_cmd.parameter_len = 0;
10006 scu_cmd.result_len = 1;
10007 scu_cmd.result = cmd_result;
10008 rc = scu_command(dev_addr, &scu_cmd);
10009 if (rc != 0) {
10010 pr_err("error %d\n", rc);
10011 goto rw_error;
10012 }
10013 /***********/
10014 /* SET_ENV */
10015 /***********/
10016 /* set frequency, spectrum inversion and data rate */
10017 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10018 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
10019 scu_cmd.parameter_len = 3;
10020 /* 1-data rate;2-frequency */
10021 switch (oob_param->standard) {
10022 case DRX_OOB_MODE_A:
10023 if (
10024 /* signal is transmitted inverted */
10025 ((oob_param->spectrum_inverted == true) &&
10026 /* and tuner is not mirroring the signal */
10027 (!mirror_freq_spect_oob)) |
10028 /* or */
10029 /* signal is transmitted noninverted */
10030 ((oob_param->spectrum_inverted == false) &&
10031 /* and tuner is mirroring the signal */
10032 (mirror_freq_spect_oob))
10033 )
10034 set_param_parameters[0] =
10035 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_INVSPEC;
10036 else
10037 set_param_parameters[0] =
10038 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_REGSPEC;
10039 break;
10040 case DRX_OOB_MODE_B_GRADE_A:
10041 if (
10042 /* signal is transmitted inverted */
10043 ((oob_param->spectrum_inverted == true) &&
10044 /* and tuner is not mirroring the signal */
10045 (!mirror_freq_spect_oob)) |
10046 /* or */
10047 /* signal is transmitted noninverted */
10048 ((oob_param->spectrum_inverted == false) &&
10049 /* and tuner is mirroring the signal */
10050 (mirror_freq_spect_oob))
10051 )
10052 set_param_parameters[0] =
10053 SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_INVSPEC;
10054 else
10055 set_param_parameters[0] =
10056 SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_REGSPEC;
10057 break;
10058 case DRX_OOB_MODE_B_GRADE_B:
10059 default:
10060 if (
10061 /* signal is transmitted inverted */
10062 ((oob_param->spectrum_inverted == true) &&
10063 /* and tuner is not mirroring the signal */
10064 (!mirror_freq_spect_oob)) |
10065 /* or */
10066 /* signal is transmitted noninverted */
10067 ((oob_param->spectrum_inverted == false) &&
10068 /* and tuner is mirroring the signal */
10069 (mirror_freq_spect_oob))
10070 )
10071 set_param_parameters[0] =
10072 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_INVSPEC;
10073 else
10074 set_param_parameters[0] =
10075 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_REGSPEC;
10076 break;
10077 }
10078 set_param_parameters[1] = (u16) (freq & 0xFFFF);
10079 set_param_parameters[2] = trk_filter_value;
10080 scu_cmd.parameter = set_param_parameters;
10081 scu_cmd.result_len = 1;
10082 scu_cmd.result = cmd_result;
10083 mode_index = mode_val[(set_param_parameters[0] & 0xC0) >> 6];
10084 rc = scu_command(dev_addr, &scu_cmd);
10085 if (rc != 0) {
10086 pr_err("error %d\n", rc);
10087 goto rw_error;
10088 }
10089
10090 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
10091 if (rc != 0) {
10092 pr_err("error %d\n", rc);
10093 goto rw_error;
10094 } /* Write magic word to enable pdr reg write */
10095 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_OOB_CRX_CFG__A, OOB_CRX_DRIVE_STRENGTH << SIO_PDR_OOB_CRX_CFG_DRIVE__B | 0x03 << SIO_PDR_OOB_CRX_CFG_MODE__B, 0);
10096 if (rc != 0) {
10097 pr_err("error %d\n", rc);
10098 goto rw_error;
10099 }
10100 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_OOB_DRX_CFG__A, OOB_DRX_DRIVE_STRENGTH << SIO_PDR_OOB_DRX_CFG_DRIVE__B | 0x03 << SIO_PDR_OOB_DRX_CFG_MODE__B, 0);
10101 if (rc != 0) {
10102 pr_err("error %d\n", rc);
10103 goto rw_error;
10104 }
10105 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
10106 if (rc != 0) {
10107 pr_err("error %d\n", rc);
10108 goto rw_error;
10109 } /* Write magic word to disable pdr reg write */
10110
10111 rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_COMM_KEY__A, 0, 0);
10112 if (rc != 0) {
10113 pr_err("error %d\n", rc);
10114 goto rw_error;
10115 }
10116 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_LEN_W__A, 16000, 0);
10117 if (rc != 0) {
10118 pr_err("error %d\n", rc);
10119 goto rw_error;
10120 }
10121 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_THR_W__A, 40, 0);
10122 if (rc != 0) {
10123 pr_err("error %d\n", rc);
10124 goto rw_error;
10125 }
10126
10127 /* ddc */
10128 rc = drxj_dap_write_reg16(dev_addr, ORX_DDC_OFO_SET_W__A, ORX_DDC_OFO_SET_W__PRE, 0);
10129 if (rc != 0) {
10130 pr_err("error %d\n", rc);
10131 goto rw_error;
10132 }
10133
10134 /* nsu */
10135 rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_LOPOW_W__A, ext_attr->oob_lo_pow, 0);
10136 if (rc != 0) {
10137 pr_err("error %d\n", rc);
10138 goto rw_error;
10139 }
10140
10141 /* initialization for target mode */
10142 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TARGET_MODE__A, SCU_RAM_ORX_TARGET_MODE_2048KBPS_SQRT, 0);
10143 if (rc != 0) {
10144 pr_err("error %d\n", rc);
10145 goto rw_error;
10146 }
10147 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FREQ_GAIN_CORR__A, SCU_RAM_ORX_FREQ_GAIN_CORR_2048KBPS, 0);
10148 if (rc != 0) {
10149 pr_err("error %d\n", rc);
10150 goto rw_error;
10151 }
10152
10153 /* Reset bits for timing and freq. recovery */
10154 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CPH__A, 0x0001, 0);
10155 if (rc != 0) {
10156 pr_err("error %d\n", rc);
10157 goto rw_error;
10158 }
10159 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CTI__A, 0x0002, 0);
10160 if (rc != 0) {
10161 pr_err("error %d\n", rc);
10162 goto rw_error;
10163 }
10164 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRN__A, 0x0004, 0);
10165 if (rc != 0) {
10166 pr_err("error %d\n", rc);
10167 goto rw_error;
10168 }
10169 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRP__A, 0x0008, 0);
10170 if (rc != 0) {
10171 pr_err("error %d\n", rc);
10172 goto rw_error;
10173 }
10174
10175 /* AGN_LOCK = {2048>>3, -2048, 8, -8, 0, 1}; */
10176 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TH__A, 2048 >> 3, 0);
10177 if (rc != 0) {
10178 pr_err("error %d\n", rc);
10179 goto rw_error;
10180 }
10181 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TOTH__A, (u16)(-2048), 0);
10182 if (rc != 0) {
10183 pr_err("error %d\n", rc);
10184 goto rw_error;
10185 }
10186 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_ONLOCK_TTH__A, 8, 0);
10187 if (rc != 0) {
10188 pr_err("error %d\n", rc);
10189 goto rw_error;
10190 }
10191 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_UNLOCK_TTH__A, (u16)(-8), 0);
10192 if (rc != 0) {
10193 pr_err("error %d\n", rc);
10194 goto rw_error;
10195 }
10196 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_MASK__A, 1, 0);
10197 if (rc != 0) {
10198 pr_err("error %d\n", rc);
10199 goto rw_error;
10200 }
10201
10202 /* DGN_LOCK = {10, -2048, 8, -8, 0, 1<<1}; */
10203 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TH__A, 10, 0);
10204 if (rc != 0) {
10205 pr_err("error %d\n", rc);
10206 goto rw_error;
10207 }
10208 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TOTH__A, (u16)(-2048), 0);
10209 if (rc != 0) {
10210 pr_err("error %d\n", rc);
10211 goto rw_error;
10212 }
10213 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_ONLOCK_TTH__A, 8, 0);
10214 if (rc != 0) {
10215 pr_err("error %d\n", rc);
10216 goto rw_error;
10217 }
10218 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_UNLOCK_TTH__A, (u16)(-8), 0);
10219 if (rc != 0) {
10220 pr_err("error %d\n", rc);
10221 goto rw_error;
10222 }
10223 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_MASK__A, 1 << 1, 0);
10224 if (rc != 0) {
10225 pr_err("error %d\n", rc);
10226 goto rw_error;
10227 }
10228
10229 /* FRQ_LOCK = {15,-2048, 8, -8, 0, 1<<2}; */
10230 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TH__A, 17, 0);
10231 if (rc != 0) {
10232 pr_err("error %d\n", rc);
10233 goto rw_error;
10234 }
10235 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TOTH__A, (u16)(-2048), 0);
10236 if (rc != 0) {
10237 pr_err("error %d\n", rc);
10238 goto rw_error;
10239 }
10240 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_ONLOCK_TTH__A, 8, 0);
10241 if (rc != 0) {
10242 pr_err("error %d\n", rc);
10243 goto rw_error;
10244 }
10245 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_UNLOCK_TTH__A, (u16)(-8), 0);
10246 if (rc != 0) {
10247 pr_err("error %d\n", rc);
10248 goto rw_error;
10249 }
10250 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_MASK__A, 1 << 2, 0);
10251 if (rc != 0) {
10252 pr_err("error %d\n", rc);
10253 goto rw_error;
10254 }
10255
10256 /* PHA_LOCK = {5000, -2048, 8, -8, 0, 1<<3}; */
10257 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TH__A, 3000, 0);
10258 if (rc != 0) {
10259 pr_err("error %d\n", rc);
10260 goto rw_error;
10261 }
10262 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TOTH__A, (u16)(-2048), 0);
10263 if (rc != 0) {
10264 pr_err("error %d\n", rc);
10265 goto rw_error;
10266 }
10267 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_ONLOCK_TTH__A, 8, 0);
10268 if (rc != 0) {
10269 pr_err("error %d\n", rc);
10270 goto rw_error;
10271 }
10272 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_UNLOCK_TTH__A, (u16)(-8), 0);
10273 if (rc != 0) {
10274 pr_err("error %d\n", rc);
10275 goto rw_error;
10276 }
10277 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_MASK__A, 1 << 3, 0);
10278 if (rc != 0) {
10279 pr_err("error %d\n", rc);
10280 goto rw_error;
10281 }
10282
10283 /* TIM_LOCK = {300, -2048, 8, -8, 0, 1<<4}; */
10284 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TH__A, 400, 0);
10285 if (rc != 0) {
10286 pr_err("error %d\n", rc);
10287 goto rw_error;
10288 }
10289 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TOTH__A, (u16)(-2048), 0);
10290 if (rc != 0) {
10291 pr_err("error %d\n", rc);
10292 goto rw_error;
10293 }
10294 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_ONLOCK_TTH__A, 8, 0);
10295 if (rc != 0) {
10296 pr_err("error %d\n", rc);
10297 goto rw_error;
10298 }
10299 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_UNLOCK_TTH__A, (u16)(-8), 0);
10300 if (rc != 0) {
10301 pr_err("error %d\n", rc);
10302 goto rw_error;
10303 }
10304 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_MASK__A, 1 << 4, 0);
10305 if (rc != 0) {
10306 pr_err("error %d\n", rc);
10307 goto rw_error;
10308 }
10309
10310 /* EQU_LOCK = {20, -2048, 8, -8, 0, 1<<5}; */
10311 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TH__A, 20, 0);
10312 if (rc != 0) {
10313 pr_err("error %d\n", rc);
10314 goto rw_error;
10315 }
10316 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TOTH__A, (u16)(-2048), 0);
10317 if (rc != 0) {
10318 pr_err("error %d\n", rc);
10319 goto rw_error;
10320 }
10321 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_ONLOCK_TTH__A, 4, 0);
10322 if (rc != 0) {
10323 pr_err("error %d\n", rc);
10324 goto rw_error;
10325 }
10326 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_UNLOCK_TTH__A, (u16)(-4), 0);
10327 if (rc != 0) {
10328 pr_err("error %d\n", rc);
10329 goto rw_error;
10330 }
10331 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_MASK__A, 1 << 5, 0);
10332 if (rc != 0) {
10333 pr_err("error %d\n", rc);
10334 goto rw_error;
10335 }
10336
10337 /* PRE-Filter coefficients (PFI) */
10338 rc = drxdap_fasi_write_block(dev_addr, ORX_FWP_PFI_A_W__A, sizeof(pfi_coeffs[mode_index]), ((u8 *)pfi_coeffs[mode_index]), 0);
10339 if (rc != 0) {
10340 pr_err("error %d\n", rc);
10341 goto rw_error;
10342 }
10343 rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_MDE_W__A, mode_index, 0);
10344 if (rc != 0) {
10345 pr_err("error %d\n", rc);
10346 goto rw_error;
10347 }
10348
10349 /* NYQUIST-Filter coefficients (NYQ) */
10350 for (i = 0; i < (NYQFILTERLEN + 1) / 2; i++) {
10351 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, i, 0);
10352 if (rc != 0) {
10353 pr_err("error %d\n", rc);
10354 goto rw_error;
10355 }
10356 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_COF_RW__A, nyquist_coeffs[mode_index][i], 0);
10357 if (rc != 0) {
10358 pr_err("error %d\n", rc);
10359 goto rw_error;
10360 }
10361 }
10362 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, 31, 0);
10363 if (rc != 0) {
10364 pr_err("error %d\n", rc);
10365 goto rw_error;
10366 }
10367 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_ACTIVE, 0);
10368 if (rc != 0) {
10369 pr_err("error %d\n", rc);
10370 goto rw_error;
10371 }
10372 /*********/
10373 /* Start */
10374 /*********/
10375 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10376 | SCU_RAM_COMMAND_CMD_DEMOD_START;
10377 scu_cmd.parameter_len = 0;
10378 scu_cmd.result_len = 1;
10379 scu_cmd.result = cmd_result;
10380 rc = scu_command(dev_addr, &scu_cmd);
10381 if (rc != 0) {
10382 pr_err("error %d\n", rc);
10383 goto rw_error;
10384 }
10385
10386 rc = set_orx_nsu_aox(demod, true);
10387 if (rc != 0) {
10388 pr_err("error %d\n", rc);
10389 goto rw_error;
10390 }
10391 rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STHR_W__A, ext_attr->oob_pre_saw, 0);
10392 if (rc != 0) {
10393 pr_err("error %d\n", rc);
10394 goto rw_error;
10395 }
10396
10397 ext_attr->oob_power_on = true;
10398
10399 return 0;
10400 rw_error:
10401 return rc;
10402 }
10403
10404 /*============================================================================*/
10405 /*== END OOB DATAPATH FUNCTIONS ==*/
10406 /*============================================================================*/
10407
10408 /*=============================================================================
10409 ===== MC command related functions ==========================================
10410 ===========================================================================*/
10411
10412 /*=============================================================================
10413 ===== ctrl_set_channel() ==========================================================
10414 ===========================================================================*/
10415 /**
10416 * \fn int ctrl_set_channel()
10417 * \brief Select a new transmission channel.
10418 * \param demod instance of demod.
10419 * \param channel Pointer to channel data.
10420 * \return int.
10421 *
10422 * In case the tuner module is not used and in case of NTSC/FM the pogrammer
10423 * must tune the tuner to the centre frequency of the NTSC/FM channel.
10424 *
10425 */
10426 static int
10427 ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel)
10428 {
10429 int rc;
10430 s32 tuner_freq_offset = 0;
10431 struct drxj_data *ext_attr = NULL;
10432 struct i2c_device_addr *dev_addr = NULL;
10433 enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10434 #ifndef DRXJ_VSB_ONLY
10435 u32 min_symbol_rate = 0;
10436 u32 max_symbol_rate = 0;
10437 int bandwidth_temp = 0;
10438 int bandwidth = 0;
10439 #endif
10440 /*== check arguments ======================================================*/
10441 if ((demod == NULL) || (channel == NULL))
10442 return -EINVAL;
10443
10444 dev_addr = demod->my_i2c_dev_addr;
10445 ext_attr = (struct drxj_data *) demod->my_ext_attr;
10446 standard = ext_attr->standard;
10447
10448 /* check valid standards */
10449 switch (standard) {
10450 case DRX_STANDARD_8VSB:
10451 #ifndef DRXJ_VSB_ONLY
10452 case DRX_STANDARD_ITU_A:
10453 case DRX_STANDARD_ITU_B:
10454 case DRX_STANDARD_ITU_C:
10455 #endif /* DRXJ_VSB_ONLY */
10456 break;
10457 case DRX_STANDARD_UNKNOWN:
10458 default:
10459 return -EINVAL;
10460 }
10461
10462 /* check bandwidth QAM annex B, NTSC and 8VSB */
10463 if ((standard == DRX_STANDARD_ITU_B) ||
10464 (standard == DRX_STANDARD_8VSB) ||
10465 (standard == DRX_STANDARD_NTSC)) {
10466 switch (channel->bandwidth) {
10467 case DRX_BANDWIDTH_6MHZ:
10468 case DRX_BANDWIDTH_UNKNOWN: /* fall through */
10469 channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10470 break;
10471 case DRX_BANDWIDTH_8MHZ: /* fall through */
10472 case DRX_BANDWIDTH_7MHZ: /* fall through */
10473 default:
10474 return -EINVAL;
10475 }
10476 }
10477
10478 /* For QAM annex A and annex C:
10479 -check symbolrate and constellation
10480 -derive bandwidth from symbolrate (input bandwidth is ignored)
10481 */
10482 #ifndef DRXJ_VSB_ONLY
10483 if ((standard == DRX_STANDARD_ITU_A) ||
10484 (standard == DRX_STANDARD_ITU_C)) {
10485 struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SAW };
10486 int bw_rolloff_factor = 0;
10487
10488 bw_rolloff_factor = (standard == DRX_STANDARD_ITU_A) ? 115 : 113;
10489 min_symbol_rate = DRXJ_QAM_SYMBOLRATE_MIN;
10490 max_symbol_rate = DRXJ_QAM_SYMBOLRATE_MAX;
10491 /* config SMA_TX pin to SAW switch mode */
10492 rc = ctrl_set_uio_cfg(demod, &uio_cfg);
10493 if (rc != 0) {
10494 pr_err("error %d\n", rc);
10495 goto rw_error;
10496 }
10497
10498 if (channel->symbolrate < min_symbol_rate ||
10499 channel->symbolrate > max_symbol_rate) {
10500 return -EINVAL;
10501 }
10502
10503 switch (channel->constellation) {
10504 case DRX_CONSTELLATION_QAM16: /* fall through */
10505 case DRX_CONSTELLATION_QAM32: /* fall through */
10506 case DRX_CONSTELLATION_QAM64: /* fall through */
10507 case DRX_CONSTELLATION_QAM128: /* fall through */
10508 case DRX_CONSTELLATION_QAM256:
10509 bandwidth_temp = channel->symbolrate * bw_rolloff_factor;
10510 bandwidth = bandwidth_temp / 100;
10511
10512 if ((bandwidth_temp % 100) >= 50)
10513 bandwidth++;
10514
10515 if (bandwidth <= 6100000) {
10516 channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10517 } else if ((bandwidth > 6100000)
10518 && (bandwidth <= 7100000)) {
10519 channel->bandwidth = DRX_BANDWIDTH_7MHZ;
10520 } else if (bandwidth > 7100000) {
10521 channel->bandwidth = DRX_BANDWIDTH_8MHZ;
10522 }
10523 break;
10524 default:
10525 return -EINVAL;
10526 }
10527 }
10528
10529 /* For QAM annex B:
10530 -check constellation
10531 */
10532 if (standard == DRX_STANDARD_ITU_B) {
10533 switch (channel->constellation) {
10534 case DRX_CONSTELLATION_AUTO:
10535 case DRX_CONSTELLATION_QAM256:
10536 case DRX_CONSTELLATION_QAM64:
10537 break;
10538 default:
10539 return -EINVAL;
10540 }
10541
10542 switch (channel->interleavemode) {
10543 case DRX_INTERLEAVEMODE_I128_J1:
10544 case DRX_INTERLEAVEMODE_I128_J1_V2:
10545 case DRX_INTERLEAVEMODE_I128_J2:
10546 case DRX_INTERLEAVEMODE_I64_J2:
10547 case DRX_INTERLEAVEMODE_I128_J3:
10548 case DRX_INTERLEAVEMODE_I32_J4:
10549 case DRX_INTERLEAVEMODE_I128_J4:
10550 case DRX_INTERLEAVEMODE_I16_J8:
10551 case DRX_INTERLEAVEMODE_I128_J5:
10552 case DRX_INTERLEAVEMODE_I8_J16:
10553 case DRX_INTERLEAVEMODE_I128_J6:
10554 case DRX_INTERLEAVEMODE_I128_J7:
10555 case DRX_INTERLEAVEMODE_I128_J8:
10556 case DRX_INTERLEAVEMODE_I12_J17:
10557 case DRX_INTERLEAVEMODE_I5_J4:
10558 case DRX_INTERLEAVEMODE_B52_M240:
10559 case DRX_INTERLEAVEMODE_B52_M720:
10560 case DRX_INTERLEAVEMODE_UNKNOWN:
10561 case DRX_INTERLEAVEMODE_AUTO:
10562 break;
10563 default:
10564 return -EINVAL;
10565 }
10566 }
10567
10568 if ((ext_attr->uio_sma_tx_mode) == DRX_UIO_MODE_FIRMWARE_SAW) {
10569 /* SAW SW, user UIO is used for switchable SAW */
10570 struct drxuio_data uio1 = { DRX_UIO1, false };
10571
10572 switch (channel->bandwidth) {
10573 case DRX_BANDWIDTH_8MHZ:
10574 uio1.value = true;
10575 break;
10576 case DRX_BANDWIDTH_7MHZ:
10577 uio1.value = false;
10578 break;
10579 case DRX_BANDWIDTH_6MHZ:
10580 uio1.value = false;
10581 break;
10582 case DRX_BANDWIDTH_UNKNOWN:
10583 default:
10584 return -EINVAL;
10585 }
10586
10587 rc = ctrl_uio_write(demod, &uio1);
10588 if (rc != 0) {
10589 pr_err("error %d\n", rc);
10590 goto rw_error;
10591 }
10592 }
10593 #endif /* DRXJ_VSB_ONLY */
10594 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
10595 if (rc != 0) {
10596 pr_err("error %d\n", rc);
10597 goto rw_error;
10598 }
10599
10600 tuner_freq_offset = 0;
10601
10602 /*== Setup demod for specific standard ====================================*/
10603 switch (standard) {
10604 case DRX_STANDARD_8VSB:
10605 if (channel->mirror == DRX_MIRROR_AUTO)
10606 ext_attr->mirror = DRX_MIRROR_NO;
10607 else
10608 ext_attr->mirror = channel->mirror;
10609 rc = set_vsb(demod);
10610 if (rc != 0) {
10611 pr_err("error %d\n", rc);
10612 goto rw_error;
10613 }
10614 rc = set_frequency(demod, channel, tuner_freq_offset);
10615 if (rc != 0) {
10616 pr_err("error %d\n", rc);
10617 goto rw_error;
10618 }
10619 break;
10620 #ifndef DRXJ_VSB_ONLY
10621 case DRX_STANDARD_ITU_A: /* fallthrough */
10622 case DRX_STANDARD_ITU_B: /* fallthrough */
10623 case DRX_STANDARD_ITU_C:
10624 rc = set_qam_channel(demod, channel, tuner_freq_offset);
10625 if (rc != 0) {
10626 pr_err("error %d\n", rc);
10627 goto rw_error;
10628 }
10629 break;
10630 #endif
10631 case DRX_STANDARD_UNKNOWN:
10632 default:
10633 return -EIO;
10634 }
10635
10636 /* flag the packet error counter reset */
10637 ext_attr->reset_pkt_err_acc = true;
10638
10639 return 0;
10640 rw_error:
10641 return rc;
10642 }
10643
10644 /*=============================================================================
10645 ===== SigQuality() ==========================================================
10646 ===========================================================================*/
10647
10648 /**
10649 * \fn int ctrl_sig_quality()
10650 * \brief Retreive signal quality form device.
10651 * \param devmod Pointer to demodulator instance.
10652 * \param sig_quality Pointer to signal quality data.
10653 * \return int.
10654 * \retval 0 sig_quality contains valid data.
10655 * \retval -EINVAL sig_quality is NULL.
10656 * \retval -EIO Erroneous data, sig_quality contains invalid data.
10657
10658 */
10659 static int
10660 ctrl_sig_quality(struct drx_demod_instance *demod,
10661 enum drx_lock_status lock_status)
10662 {
10663 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
10664 struct drxj_data *ext_attr = demod->my_ext_attr;
10665 struct drx39xxj_state *state = dev_addr->user_data;
10666 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
10667 enum drx_standard standard = ext_attr->standard;
10668 int rc;
10669 u32 ber, cnt, err, pkt;
10670 u16 mer, strength = 0;
10671
10672 rc = get_sig_strength(demod, &strength);
10673 if (rc < 0) {
10674 pr_err("error getting signal strength %d\n", rc);
10675 p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10676 } else {
10677 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
10678 p->strength.stat[0].uvalue = 65535UL * strength/ 100;
10679 }
10680
10681 switch (standard) {
10682 case DRX_STANDARD_8VSB:
10683 #ifdef DRXJ_SIGNAL_ACCUM_ERR
10684 rc = get_acc_pkt_err(demod, &pkt);
10685 if (rc != 0) {
10686 pr_err("error %d\n", rc);
10687 goto rw_error;
10688 }
10689 #endif
10690 if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) {
10691 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10692 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10693 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10694 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10695 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10696 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10697 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10698 } else {
10699 rc = get_vsb_post_rs_pck_err(dev_addr, &err, &pkt);
10700 if (rc != 0) {
10701 pr_err("error %d getting UCB\n", rc);
10702 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10703 } else {
10704 p->block_error.stat[0].scale = FE_SCALE_COUNTER;
10705 p->block_error.stat[0].uvalue += err;
10706 p->block_count.stat[0].scale = FE_SCALE_COUNTER;
10707 p->block_count.stat[0].uvalue += pkt;
10708 }
10709
10710 /* PostViterbi is compute in steps of 10^(-6) */
10711 rc = get_vs_bpre_viterbi_ber(dev_addr, &ber, &cnt);
10712 if (rc != 0) {
10713 pr_err("error %d getting pre-ber\n", rc);
10714 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10715 } else {
10716 p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10717 p->pre_bit_error.stat[0].uvalue += ber;
10718 p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10719 p->pre_bit_count.stat[0].uvalue += cnt;
10720 }
10721
10722 rc = get_vs_bpost_viterbi_ber(dev_addr, &ber, &cnt);
10723 if (rc != 0) {
10724 pr_err("error %d getting post-ber\n", rc);
10725 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10726 } else {
10727 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10728 p->post_bit_error.stat[0].uvalue += ber;
10729 p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10730 p->post_bit_count.stat[0].uvalue += cnt;
10731 }
10732 rc = get_vsbmer(dev_addr, &mer);
10733 if (rc != 0) {
10734 pr_err("error %d getting MER\n", rc);
10735 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10736 } else {
10737 p->cnr.stat[0].svalue = mer * 100;
10738 p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
10739 }
10740 }
10741 break;
10742 #ifndef DRXJ_VSB_ONLY
10743 case DRX_STANDARD_ITU_A:
10744 case DRX_STANDARD_ITU_B:
10745 case DRX_STANDARD_ITU_C:
10746 rc = ctrl_get_qam_sig_quality(demod);
10747 if (rc != 0) {
10748 pr_err("error %d\n", rc);
10749 goto rw_error;
10750 }
10751 break;
10752 #endif
10753 default:
10754 return -EIO;
10755 }
10756
10757 return 0;
10758 rw_error:
10759 return rc;
10760 }
10761
10762 /*============================================================================*/
10763
10764 /**
10765 * \fn int ctrl_lock_status()
10766 * \brief Retreive lock status .
10767 * \param dev_addr Pointer to demodulator device address.
10768 * \param lock_stat Pointer to lock status structure.
10769 * \return int.
10770 *
10771 */
10772 static int
10773 ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat)
10774 {
10775 enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10776 struct drxj_data *ext_attr = NULL;
10777 struct i2c_device_addr *dev_addr = NULL;
10778 struct drxjscu_cmd cmd_scu = { /* command */ 0,
10779 /* parameter_len */ 0,
10780 /* result_len */ 0,
10781 /* *parameter */ NULL,
10782 /* *result */ NULL
10783 };
10784 int rc;
10785 u16 cmd_result[2] = { 0, 0 };
10786 u16 demod_lock = SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_DEMOD_LOCKED;
10787
10788 /* check arguments */
10789 if ((demod == NULL) || (lock_stat == NULL))
10790 return -EINVAL;
10791
10792 dev_addr = demod->my_i2c_dev_addr;
10793 ext_attr = (struct drxj_data *) demod->my_ext_attr;
10794 standard = ext_attr->standard;
10795
10796 *lock_stat = DRX_NOT_LOCKED;
10797
10798 /* define the SCU command code */
10799 switch (standard) {
10800 case DRX_STANDARD_8VSB:
10801 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
10802 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10803 demod_lock |= 0x6;
10804 break;
10805 #ifndef DRXJ_VSB_ONLY
10806 case DRX_STANDARD_ITU_A:
10807 case DRX_STANDARD_ITU_B:
10808 case DRX_STANDARD_ITU_C:
10809 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
10810 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10811 break;
10812 #endif
10813 case DRX_STANDARD_UNKNOWN: /* fallthrough */
10814 default:
10815 return -EIO;
10816 }
10817
10818 /* define the SCU command paramters and execute the command */
10819 cmd_scu.parameter_len = 0;
10820 cmd_scu.result_len = 2;
10821 cmd_scu.parameter = NULL;
10822 cmd_scu.result = cmd_result;
10823 rc = scu_command(dev_addr, &cmd_scu);
10824 if (rc != 0) {
10825 pr_err("error %d\n", rc);
10826 goto rw_error;
10827 }
10828
10829 /* set the lock status */
10830 if (cmd_scu.result[1] < demod_lock) {
10831 /* 0x0000 NOT LOCKED */
10832 *lock_stat = DRX_NOT_LOCKED;
10833 } else if (cmd_scu.result[1] < SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_LOCKED) {
10834 *lock_stat = DRXJ_DEMOD_LOCK;
10835 } else if (cmd_scu.result[1] <
10836 SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_NEVER_LOCK) {
10837 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
10838 *lock_stat = DRX_LOCKED;
10839 } else {
10840 /* 0xC000 NEVER LOCKED */
10841 /* (system will never be able to lock to the signal) */
10842 *lock_stat = DRX_NEVER_LOCK;
10843 }
10844
10845 return 0;
10846 rw_error:
10847 return rc;
10848 }
10849
10850 /*============================================================================*/
10851
10852 /**
10853 * \fn int ctrl_set_standard()
10854 * \brief Set modulation standard to be used.
10855 * \param standard Modulation standard.
10856 * \return int.
10857 *
10858 * Setup stuff for the desired demodulation standard.
10859 * Disable and power down the previous selected demodulation standard
10860 *
10861 */
10862 static int
10863 ctrl_set_standard(struct drx_demod_instance *demod, enum drx_standard *standard)
10864 {
10865 struct drxj_data *ext_attr = NULL;
10866 int rc;
10867 enum drx_standard prev_standard;
10868
10869 /* check arguments */
10870 if ((standard == NULL) || (demod == NULL))
10871 return -EINVAL;
10872
10873 ext_attr = (struct drxj_data *) demod->my_ext_attr;
10874 prev_standard = ext_attr->standard;
10875
10876 /*
10877 Stop and power down previous standard
10878 */
10879 switch (prev_standard) {
10880 #ifndef DRXJ_VSB_ONLY
10881 case DRX_STANDARD_ITU_A: /* fallthrough */
10882 case DRX_STANDARD_ITU_B: /* fallthrough */
10883 case DRX_STANDARD_ITU_C:
10884 rc = power_down_qam(demod, false);
10885 if (rc != 0) {
10886 pr_err("error %d\n", rc);
10887 goto rw_error;
10888 }
10889 break;
10890 #endif
10891 case DRX_STANDARD_8VSB:
10892 rc = power_down_vsb(demod, false);
10893 if (rc != 0) {
10894 pr_err("error %d\n", rc);
10895 goto rw_error;
10896 }
10897 break;
10898 case DRX_STANDARD_UNKNOWN:
10899 /* Do nothing */
10900 break;
10901 case DRX_STANDARD_AUTO: /* fallthrough */
10902 default:
10903 return -EINVAL;
10904 }
10905
10906 /*
10907 Initialize channel independent registers
10908 Power up new standard
10909 */
10910 ext_attr->standard = *standard;
10911
10912 switch (*standard) {
10913 #ifndef DRXJ_VSB_ONLY
10914 case DRX_STANDARD_ITU_A: /* fallthrough */
10915 case DRX_STANDARD_ITU_B: /* fallthrough */
10916 case DRX_STANDARD_ITU_C:
10917 do {
10918 u16 dummy;
10919 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SCU_RAM_VERSION_HI__A, &dummy, 0);
10920 if (rc != 0) {
10921 pr_err("error %d\n", rc);
10922 goto rw_error;
10923 }
10924 } while (0);
10925 break;
10926 #endif
10927 case DRX_STANDARD_8VSB:
10928 rc = set_vsb_leak_n_gain(demod);
10929 if (rc != 0) {
10930 pr_err("error %d\n", rc);
10931 goto rw_error;
10932 }
10933 break;
10934 default:
10935 ext_attr->standard = DRX_STANDARD_UNKNOWN;
10936 return -EINVAL;
10937 break;
10938 }
10939
10940 return 0;
10941 rw_error:
10942 /* Don't know what the standard is now ... try again */
10943 ext_attr->standard = DRX_STANDARD_UNKNOWN;
10944 return rc;
10945 }
10946
10947 /*============================================================================*/
10948
10949 static void drxj_reset_mode(struct drxj_data *ext_attr)
10950 {
10951 /* Initialize default AFE configuartion for QAM */
10952 if (ext_attr->has_lna) {
10953 /* IF AGC off, PGA active */
10954 #ifndef DRXJ_VSB_ONLY
10955 ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10956 ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10957 ext_attr->qam_pga_cfg = 140 + (11 * 13);
10958 #endif
10959 ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10960 ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10961 ext_attr->vsb_pga_cfg = 140 + (11 * 13);
10962 } else {
10963 /* IF AGC on, PGA not active */
10964 #ifndef DRXJ_VSB_ONLY
10965 ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10966 ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10967 ext_attr->qam_if_agc_cfg.min_output_level = 0;
10968 ext_attr->qam_if_agc_cfg.max_output_level = 0x7FFF;
10969 ext_attr->qam_if_agc_cfg.speed = 3;
10970 ext_attr->qam_if_agc_cfg.top = 1297;
10971 ext_attr->qam_pga_cfg = 140;
10972 #endif
10973 ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10974 ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10975 ext_attr->vsb_if_agc_cfg.min_output_level = 0;
10976 ext_attr->vsb_if_agc_cfg.max_output_level = 0x7FFF;
10977 ext_attr->vsb_if_agc_cfg.speed = 3;
10978 ext_attr->vsb_if_agc_cfg.top = 1024;
10979 ext_attr->vsb_pga_cfg = 140;
10980 }
10981 /* TODO: remove min_output_level and max_output_level for both QAM and VSB after */
10982 /* mc has not used them */
10983 #ifndef DRXJ_VSB_ONLY
10984 ext_attr->qam_rf_agc_cfg.standard = DRX_STANDARD_ITU_B;
10985 ext_attr->qam_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10986 ext_attr->qam_rf_agc_cfg.min_output_level = 0;
10987 ext_attr->qam_rf_agc_cfg.max_output_level = 0x7FFF;
10988 ext_attr->qam_rf_agc_cfg.speed = 3;
10989 ext_attr->qam_rf_agc_cfg.top = 9500;
10990 ext_attr->qam_rf_agc_cfg.cut_off_current = 4000;
10991 ext_attr->qam_pre_saw_cfg.standard = DRX_STANDARD_ITU_B;
10992 ext_attr->qam_pre_saw_cfg.reference = 0x07;
10993 ext_attr->qam_pre_saw_cfg.use_pre_saw = true;
10994 #endif
10995 /* Initialize default AFE configuartion for VSB */
10996 ext_attr->vsb_rf_agc_cfg.standard = DRX_STANDARD_8VSB;
10997 ext_attr->vsb_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10998 ext_attr->vsb_rf_agc_cfg.min_output_level = 0;
10999 ext_attr->vsb_rf_agc_cfg.max_output_level = 0x7FFF;
11000 ext_attr->vsb_rf_agc_cfg.speed = 3;
11001 ext_attr->vsb_rf_agc_cfg.top = 9500;
11002 ext_attr->vsb_rf_agc_cfg.cut_off_current = 4000;
11003 ext_attr->vsb_pre_saw_cfg.standard = DRX_STANDARD_8VSB;
11004 ext_attr->vsb_pre_saw_cfg.reference = 0x07;
11005 ext_attr->vsb_pre_saw_cfg.use_pre_saw = true;
11006 }
11007
11008 /**
11009 * \fn int ctrl_power_mode()
11010 * \brief Set the power mode of the device to the specified power mode
11011 * \param demod Pointer to demodulator instance.
11012 * \param mode Pointer to new power mode.
11013 * \return int.
11014 * \retval 0 Success
11015 * \retval -EIO I2C error or other failure
11016 * \retval -EINVAL Invalid mode argument.
11017 *
11018 *
11019 */
11020 static int
11021 ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode)
11022 {
11023 struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
11024 struct drxj_data *ext_attr = (struct drxj_data *) NULL;
11025 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)NULL;
11026 int rc;
11027 u16 sio_cc_pwd_mode = 0;
11028
11029 common_attr = (struct drx_common_attr *) demod->my_common_attr;
11030 ext_attr = (struct drxj_data *) demod->my_ext_attr;
11031 dev_addr = demod->my_i2c_dev_addr;
11032
11033 /* Check arguments */
11034 if (mode == NULL)
11035 return -EINVAL;
11036
11037 /* If already in requested power mode, do nothing */
11038 if (common_attr->current_power_mode == *mode)
11039 return 0;
11040
11041 switch (*mode) {
11042 case DRX_POWER_UP:
11043 case DRXJ_POWER_DOWN_MAIN_PATH:
11044 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
11045 break;
11046 case DRXJ_POWER_DOWN_CORE:
11047 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
11048 break;
11049 case DRXJ_POWER_DOWN_PLL:
11050 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
11051 break;
11052 case DRX_POWER_DOWN:
11053 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
11054 break;
11055 default:
11056 /* Unknow sleep mode */
11057 return -EINVAL;
11058 break;
11059 }
11060
11061 /* Check if device needs to be powered up */
11062 if ((common_attr->current_power_mode != DRX_POWER_UP)) {
11063 rc = power_up_device(demod);
11064 if (rc != 0) {
11065 pr_err("error %d\n", rc);
11066 goto rw_error;
11067 }
11068 }
11069
11070 if ((*mode == DRX_POWER_UP)) {
11071 /* Restore analog & pin configuartion */
11072
11073 /* Initialize default AFE configuartion for VSB */
11074 drxj_reset_mode(ext_attr);
11075 } else {
11076 /* Power down to requested mode */
11077 /* Backup some register settings */
11078 /* Set pins with possible pull-ups connected to them in input mode */
11079 /* Analog power down */
11080 /* ADC power down */
11081 /* Power down device */
11082 /* stop all comm_exec */
11083 /*
11084 Stop and power down previous standard
11085 */
11086
11087 switch (ext_attr->standard) {
11088 case DRX_STANDARD_ITU_A:
11089 case DRX_STANDARD_ITU_B:
11090 case DRX_STANDARD_ITU_C:
11091 rc = power_down_qam(demod, true);
11092 if (rc != 0) {
11093 pr_err("error %d\n", rc);
11094 goto rw_error;
11095 }
11096 break;
11097 case DRX_STANDARD_8VSB:
11098 rc = power_down_vsb(demod, true);
11099 if (rc != 0) {
11100 pr_err("error %d\n", rc);
11101 goto rw_error;
11102 }
11103 break;
11104 case DRX_STANDARD_PAL_SECAM_BG: /* fallthrough */
11105 case DRX_STANDARD_PAL_SECAM_DK: /* fallthrough */
11106 case DRX_STANDARD_PAL_SECAM_I: /* fallthrough */
11107 case DRX_STANDARD_PAL_SECAM_L: /* fallthrough */
11108 case DRX_STANDARD_PAL_SECAM_LP: /* fallthrough */
11109 case DRX_STANDARD_NTSC: /* fallthrough */
11110 case DRX_STANDARD_FM:
11111 rc = power_down_atv(demod, ext_attr->standard, true);
11112 if (rc != 0) {
11113 pr_err("error %d\n", rc);
11114 goto rw_error;
11115 }
11116 break;
11117 case DRX_STANDARD_UNKNOWN:
11118 /* Do nothing */
11119 break;
11120 case DRX_STANDARD_AUTO: /* fallthrough */
11121 default:
11122 return -EIO;
11123 }
11124 ext_attr->standard = DRX_STANDARD_UNKNOWN;
11125 }
11126
11127 if (*mode != DRXJ_POWER_DOWN_MAIN_PATH) {
11128 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode, 0);
11129 if (rc != 0) {
11130 pr_err("error %d\n", rc);
11131 goto rw_error;
11132 }
11133 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11134 if (rc != 0) {
11135 pr_err("error %d\n", rc);
11136 goto rw_error;
11137 }
11138
11139 if ((*mode != DRX_POWER_UP)) {
11140 /* Initialize HI, wakeup key especially before put IC to sleep */
11141 rc = init_hi(demod);
11142 if (rc != 0) {
11143 pr_err("error %d\n", rc);
11144 goto rw_error;
11145 }
11146
11147 ext_attr->hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
11148 rc = hi_cfg_command(demod);
11149 if (rc != 0) {
11150 pr_err("error %d\n", rc);
11151 goto rw_error;
11152 }
11153 }
11154 }
11155
11156 common_attr->current_power_mode = *mode;
11157
11158 return 0;
11159 rw_error:
11160 return rc;
11161 }
11162
11163 /*============================================================================*/
11164 /*== CTRL Set/Get Config related functions ===================================*/
11165 /*============================================================================*/
11166
11167 /**
11168 * \fn int ctrl_set_cfg_pre_saw()
11169 * \brief Set Pre-saw reference.
11170 * \param demod demod instance
11171 * \param u16 *
11172 * \return int.
11173 *
11174 * Check arguments
11175 * Dispatch handling to standard specific function.
11176 *
11177 */
11178 static int
11179 ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw)
11180 {
11181 struct i2c_device_addr *dev_addr = NULL;
11182 struct drxj_data *ext_attr = NULL;
11183 int rc;
11184
11185 dev_addr = demod->my_i2c_dev_addr;
11186 ext_attr = (struct drxj_data *) demod->my_ext_attr;
11187
11188 /* check arguments */
11189 if ((pre_saw == NULL) || (pre_saw->reference > IQM_AF_PDREF__M)
11190 ) {
11191 return -EINVAL;
11192 }
11193
11194 /* Only if standard is currently active */
11195 if ((ext_attr->standard == pre_saw->standard) ||
11196 (DRXJ_ISQAMSTD(ext_attr->standard) &&
11197 DRXJ_ISQAMSTD(pre_saw->standard)) ||
11198 (DRXJ_ISATVSTD(ext_attr->standard) &&
11199 DRXJ_ISATVSTD(pre_saw->standard))) {
11200 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, pre_saw->reference, 0);
11201 if (rc != 0) {
11202 pr_err("error %d\n", rc);
11203 goto rw_error;
11204 }
11205 }
11206
11207 /* Store pre-saw settings */
11208 switch (pre_saw->standard) {
11209 case DRX_STANDARD_8VSB:
11210 ext_attr->vsb_pre_saw_cfg = *pre_saw;
11211 break;
11212 #ifndef DRXJ_VSB_ONLY
11213 case DRX_STANDARD_ITU_A: /* fallthrough */
11214 case DRX_STANDARD_ITU_B: /* fallthrough */
11215 case DRX_STANDARD_ITU_C:
11216 ext_attr->qam_pre_saw_cfg = *pre_saw;
11217 break;
11218 #endif
11219 default:
11220 return -EINVAL;
11221 }
11222
11223 return 0;
11224 rw_error:
11225 return rc;
11226 }
11227
11228 /*============================================================================*/
11229
11230 /**
11231 * \fn int ctrl_set_cfg_afe_gain()
11232 * \brief Set AFE Gain.
11233 * \param demod demod instance
11234 * \param u16 *
11235 * \return int.
11236 *
11237 * Check arguments
11238 * Dispatch handling to standard specific function.
11239 *
11240 */
11241 static int
11242 ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain)
11243 {
11244 struct i2c_device_addr *dev_addr = NULL;
11245 struct drxj_data *ext_attr = NULL;
11246 int rc;
11247 u8 gain = 0;
11248
11249 /* check arguments */
11250 if (afe_gain == NULL)
11251 return -EINVAL;
11252
11253 dev_addr = demod->my_i2c_dev_addr;
11254 ext_attr = (struct drxj_data *) demod->my_ext_attr;
11255
11256 switch (afe_gain->standard) {
11257 case DRX_STANDARD_8VSB: /* fallthrough */
11258 #ifndef DRXJ_VSB_ONLY
11259 case DRX_STANDARD_ITU_A: /* fallthrough */
11260 case DRX_STANDARD_ITU_B: /* fallthrough */
11261 case DRX_STANDARD_ITU_C:
11262 #endif
11263 /* Do nothing */
11264 break;
11265 default:
11266 return -EINVAL;
11267 }
11268
11269 /* TODO PGA gain is also written by microcode (at least by QAM and VSB)
11270 So I (PJ) think interface requires choice between auto, user mode */
11271
11272 if (afe_gain->gain >= 329)
11273 gain = 15;
11274 else if (afe_gain->gain <= 147)
11275 gain = 0;
11276 else
11277 gain = (afe_gain->gain - 140 + 6) / 13;
11278
11279 /* Only if standard is currently active */
11280 if (ext_attr->standard == afe_gain->standard) {
11281 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, gain, 0);
11282 if (rc != 0) {
11283 pr_err("error %d\n", rc);
11284 goto rw_error;
11285 }
11286 }
11287
11288 /* Store AFE Gain settings */
11289 switch (afe_gain->standard) {
11290 case DRX_STANDARD_8VSB:
11291 ext_attr->vsb_pga_cfg = gain * 13 + 140;
11292 break;
11293 #ifndef DRXJ_VSB_ONLY
11294 case DRX_STANDARD_ITU_A: /* fallthrough */
11295 case DRX_STANDARD_ITU_B: /* fallthrough */
11296 case DRX_STANDARD_ITU_C:
11297 ext_attr->qam_pga_cfg = gain * 13 + 140;
11298 break;
11299 #endif
11300 default:
11301 return -EIO;
11302 }
11303
11304 return 0;
11305 rw_error:
11306 return rc;
11307 }
11308
11309 /*============================================================================*/
11310
11311
11312 /*=============================================================================
11313 ===== EXPORTED FUNCTIONS ====================================================*/
11314
11315 static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11316 struct drxu_code_info *mc_info,
11317 enum drxu_code_action action);
11318 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state);
11319
11320 /**
11321 * \fn drxj_open()
11322 * \brief Open the demod instance, configure device, configure drxdriver
11323 * \return Status_t Return status.
11324 *
11325 * drxj_open() can be called with a NULL ucode image => no ucode upload.
11326 * This means that drxj_open() must NOT contain SCU commands or, in general,
11327 * rely on SCU or AUD ucode to be present.
11328 *
11329 */
11330
11331 static int drxj_open(struct drx_demod_instance *demod)
11332 {
11333 struct i2c_device_addr *dev_addr = NULL;
11334 struct drxj_data *ext_attr = NULL;
11335 struct drx_common_attr *common_attr = NULL;
11336 u32 driver_version = 0;
11337 struct drxu_code_info ucode_info;
11338 struct drx_cfg_mpeg_output cfg_mpeg_output;
11339 int rc;
11340 enum drx_power_mode power_mode = DRX_POWER_UP;
11341
11342 if ((demod == NULL) ||
11343 (demod->my_common_attr == NULL) ||
11344 (demod->my_ext_attr == NULL) ||
11345 (demod->my_i2c_dev_addr == NULL) ||
11346 (demod->my_common_attr->is_opened)) {
11347 return -EINVAL;
11348 }
11349
11350 /* Check arguments */
11351 if (demod->my_ext_attr == NULL)
11352 return -EINVAL;
11353
11354 dev_addr = demod->my_i2c_dev_addr;
11355 ext_attr = (struct drxj_data *) demod->my_ext_attr;
11356 common_attr = (struct drx_common_attr *) demod->my_common_attr;
11357
11358 rc = ctrl_power_mode(demod, &power_mode);
11359 if (rc != 0) {
11360 pr_err("error %d\n", rc);
11361 goto rw_error;
11362 }
11363 if (power_mode != DRX_POWER_UP) {
11364 rc = -EINVAL;
11365 pr_err("failed to powerup device\n");
11366 goto rw_error;
11367 }
11368
11369 /* has to be in front of setIqmAf and setOrxNsuAox */
11370 rc = get_device_capabilities(demod);
11371 if (rc != 0) {
11372 pr_err("error %d\n", rc);
11373 goto rw_error;
11374 }
11375
11376 /*
11377 * Soft reset of sys- and osc-clockdomain
11378 *
11379 * HACK: On windows, it writes a 0x07 here, instead of just 0x03.
11380 * As we didn't load the firmware here yet, we should do the same.
11381 * Btw, this is coherent with DRX-K, where we send reset codes
11382 * for modulation (OFTM, in DRX-k), SYS and OSC clock domains.
11383 */
11384 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_SOFT_RST__A, (0x04 | SIO_CC_SOFT_RST_SYS__M | SIO_CC_SOFT_RST_OSC__M), 0);
11385 if (rc != 0) {
11386 pr_err("error %d\n", rc);
11387 goto rw_error;
11388 }
11389 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11390 if (rc != 0) {
11391 pr_err("error %d\n", rc);
11392 goto rw_error;
11393 }
11394 msleep(1);
11395
11396 /* TODO first make sure that everything keeps working before enabling this */
11397 /* PowerDownAnalogBlocks() */
11398 rc = drxj_dap_write_reg16(dev_addr, ATV_TOP_STDBY__A, (~ATV_TOP_STDBY_CVBS_STDBY_A2_ACTIVE) | ATV_TOP_STDBY_SIF_STDBY_STANDBY, 0);
11399 if (rc != 0) {
11400 pr_err("error %d\n", rc);
11401 goto rw_error;
11402 }
11403
11404 rc = set_iqm_af(demod, false);
11405 if (rc != 0) {
11406 pr_err("error %d\n", rc);
11407 goto rw_error;
11408 }
11409 rc = set_orx_nsu_aox(demod, false);
11410 if (rc != 0) {
11411 pr_err("error %d\n", rc);
11412 goto rw_error;
11413 }
11414
11415 rc = init_hi(demod);
11416 if (rc != 0) {
11417 pr_err("error %d\n", rc);
11418 goto rw_error;
11419 }
11420
11421 /* disable mpegoutput pins */
11422 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
11423 cfg_mpeg_output.enable_mpeg_output = false;
11424
11425 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
11426 if (rc != 0) {
11427 pr_err("error %d\n", rc);
11428 goto rw_error;
11429 }
11430 /* Stop AUD Inform SetAudio it will need to do all setting */
11431 rc = power_down_aud(demod);
11432 if (rc != 0) {
11433 pr_err("error %d\n", rc);
11434 goto rw_error;
11435 }
11436 /* Stop SCU */
11437 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP, 0);
11438 if (rc != 0) {
11439 pr_err("error %d\n", rc);
11440 goto rw_error;
11441 }
11442
11443 /* Upload microcode */
11444 if (common_attr->microcode_file != NULL) {
11445 /* Dirty trick to use common ucode upload & verify,
11446 pretend device is already open */
11447 common_attr->is_opened = true;
11448 ucode_info.mc_file = common_attr->microcode_file;
11449
11450 if (DRX_ISPOWERDOWNMODE(demod->my_common_attr->current_power_mode)) {
11451 pr_err("Should powerup before loading the firmware.");
11452 return -EINVAL;
11453 }
11454
11455 rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_UPLOAD);
11456 if (rc != 0) {
11457 pr_err("error %d while uploading the firmware\n", rc);
11458 goto rw_error;
11459 }
11460 if (common_attr->verify_microcode == true) {
11461 rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_VERIFY);
11462 if (rc != 0) {
11463 pr_err("error %d while verifying the firmware\n",
11464 rc);
11465 goto rw_error;
11466 }
11467 }
11468 common_attr->is_opened = false;
11469 }
11470
11471 /* Run SCU for a little while to initialize microcode version numbers */
11472 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11473 if (rc != 0) {
11474 pr_err("error %d\n", rc);
11475 goto rw_error;
11476 }
11477
11478 /* Initialize scan timeout */
11479 common_attr->scan_demod_lock_timeout = DRXJ_SCAN_TIMEOUT;
11480 common_attr->scan_desired_lock = DRX_LOCKED;
11481
11482 drxj_reset_mode(ext_attr);
11483 ext_attr->standard = DRX_STANDARD_UNKNOWN;
11484
11485 rc = smart_ant_init(demod);
11486 if (rc != 0) {
11487 pr_err("error %d\n", rc);
11488 goto rw_error;
11489 }
11490
11491 /* Stamp driver version number in SCU data RAM in BCD code
11492 Done to enable field application engineers to retreive drxdriver version
11493 via I2C from SCU RAM
11494 */
11495 driver_version = (VERSION_MAJOR / 100) % 10;
11496 driver_version <<= 4;
11497 driver_version += (VERSION_MAJOR / 10) % 10;
11498 driver_version <<= 4;
11499 driver_version += (VERSION_MAJOR % 10);
11500 driver_version <<= 4;
11501 driver_version += (VERSION_MINOR % 10);
11502 driver_version <<= 4;
11503 driver_version += (VERSION_PATCH / 1000) % 10;
11504 driver_version <<= 4;
11505 driver_version += (VERSION_PATCH / 100) % 10;
11506 driver_version <<= 4;
11507 driver_version += (VERSION_PATCH / 10) % 10;
11508 driver_version <<= 4;
11509 driver_version += (VERSION_PATCH % 10);
11510 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_HI__A, (u16)(driver_version >> 16), 0);
11511 if (rc != 0) {
11512 pr_err("error %d\n", rc);
11513 goto rw_error;
11514 }
11515 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_LO__A, (u16)(driver_version & 0xFFFF), 0);
11516 if (rc != 0) {
11517 pr_err("error %d\n", rc);
11518 goto rw_error;
11519 }
11520
11521 rc = ctrl_set_oob(demod, NULL);
11522 if (rc != 0) {
11523 pr_err("error %d\n", rc);
11524 goto rw_error;
11525 }
11526
11527 /* refresh the audio data structure with default */
11528 ext_attr->aud_data = drxj_default_aud_data_g;
11529
11530 demod->my_common_attr->is_opened = true;
11531 drxj_set_lna_state(demod, false);
11532 return 0;
11533 rw_error:
11534 common_attr->is_opened = false;
11535 return rc;
11536 }
11537
11538 /*============================================================================*/
11539 /**
11540 * \fn drxj_close()
11541 * \brief Close the demod instance, power down the device
11542 * \return Status_t Return status.
11543 *
11544 */
11545 static int drxj_close(struct drx_demod_instance *demod)
11546 {
11547 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11548 int rc;
11549 enum drx_power_mode power_mode = DRX_POWER_UP;
11550
11551 if ((demod->my_common_attr == NULL) ||
11552 (demod->my_ext_attr == NULL) ||
11553 (demod->my_i2c_dev_addr == NULL) ||
11554 (!demod->my_common_attr->is_opened)) {
11555 return -EINVAL;
11556 }
11557
11558 /* power up */
11559 rc = ctrl_power_mode(demod, &power_mode);
11560 if (rc != 0) {
11561 pr_err("error %d\n", rc);
11562 goto rw_error;
11563 }
11564
11565 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11566 if (rc != 0) {
11567 pr_err("error %d\n", rc);
11568 goto rw_error;
11569 }
11570 power_mode = DRX_POWER_DOWN;
11571 rc = ctrl_power_mode(demod, &power_mode);
11572 if (rc != 0) {
11573 pr_err("error %d\n", rc);
11574 goto rw_error;
11575 }
11576
11577 DRX_ATTR_ISOPENED(demod) = false;
11578
11579 return 0;
11580 rw_error:
11581 DRX_ATTR_ISOPENED(demod) = false;
11582
11583 return rc;
11584 }
11585
11586 /*
11587 * Microcode related functions
11588 */
11589
11590 /**
11591 * drx_u_code_compute_crc - Compute CRC of block of microcode data.
11592 * @block_data: Pointer to microcode data.
11593 * @nr_words: Size of microcode block (number of 16 bits words).
11594 *
11595 * returns The computed CRC residue.
11596 */
11597 static u16 drx_u_code_compute_crc(u8 *block_data, u16 nr_words)
11598 {
11599 u16 i = 0;
11600 u16 j = 0;
11601 u32 crc_word = 0;
11602 u32 carry = 0;
11603
11604 while (i < nr_words) {
11605 crc_word |= (u32)be16_to_cpu(*(__be16 *)(block_data));
11606 for (j = 0; j < 16; j++) {
11607 crc_word <<= 1;
11608 if (carry != 0)
11609 crc_word ^= 0x80050000UL;
11610 carry = crc_word & 0x80000000UL;
11611 }
11612 i++;
11613 block_data += (sizeof(u16));
11614 }
11615 return (u16)(crc_word >> 16);
11616 }
11617
11618 /**
11619 * drx_check_firmware - checks if the loaded firmware is valid
11620 *
11621 * @demod: demod structure
11622 * @mc_data: pointer to the start of the firmware
11623 * @size: firmware size
11624 */
11625 static int drx_check_firmware(struct drx_demod_instance *demod, u8 *mc_data,
11626 unsigned size)
11627 {
11628 struct drxu_code_block_hdr block_hdr;
11629 int i;
11630 unsigned count = 2 * sizeof(u16);
11631 u32 mc_dev_type, mc_version, mc_base_version;
11632 u16 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data + sizeof(u16)));
11633
11634 /*
11635 * Scan microcode blocks first for version info
11636 * and firmware check
11637 */
11638
11639 /* Clear version block */
11640 DRX_ATTR_MCRECORD(demod).aux_type = 0;
11641 DRX_ATTR_MCRECORD(demod).mc_dev_type = 0;
11642 DRX_ATTR_MCRECORD(demod).mc_version = 0;
11643 DRX_ATTR_MCRECORD(demod).mc_base_version = 0;
11644
11645 for (i = 0; i < mc_nr_of_blks; i++) {
11646 if (count + 3 * sizeof(u16) + sizeof(u32) > size)
11647 goto eof;
11648
11649 /* Process block header */
11650 block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data + count));
11651 count += sizeof(u32);
11652 block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data + count));
11653 count += sizeof(u16);
11654 block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data + count));
11655 count += sizeof(u16);
11656 block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data + count));
11657 count += sizeof(u16);
11658
11659 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11660 count, block_hdr.addr, block_hdr.size, block_hdr.flags,
11661 block_hdr.CRC);
11662
11663 if (block_hdr.flags & 0x8) {
11664 u8 *auxblk = ((void *)mc_data) + block_hdr.addr;
11665 u16 auxtype;
11666
11667 if (block_hdr.addr + sizeof(u16) > size)
11668 goto eof;
11669
11670 auxtype = be16_to_cpu(*(__be16 *)(auxblk));
11671
11672 /* Aux block. Check type */
11673 if (DRX_ISMCVERTYPE(auxtype)) {
11674 if (block_hdr.addr + 2 * sizeof(u16) + 2 * sizeof (u32) > size)
11675 goto eof;
11676
11677 auxblk += sizeof(u16);
11678 mc_dev_type = be32_to_cpu(*(__be32 *)(auxblk));
11679 auxblk += sizeof(u32);
11680 mc_version = be32_to_cpu(*(__be32 *)(auxblk));
11681 auxblk += sizeof(u32);
11682 mc_base_version = be32_to_cpu(*(__be32 *)(auxblk));
11683
11684 DRX_ATTR_MCRECORD(demod).aux_type = auxtype;
11685 DRX_ATTR_MCRECORD(demod).mc_dev_type = mc_dev_type;
11686 DRX_ATTR_MCRECORD(demod).mc_version = mc_version;
11687 DRX_ATTR_MCRECORD(demod).mc_base_version = mc_base_version;
11688
11689 pr_info("Firmware dev %x, ver %x, base ver %x\n",
11690 mc_dev_type, mc_version, mc_base_version);
11691
11692 }
11693 } else if (count + block_hdr.size * sizeof(u16) > size)
11694 goto eof;
11695
11696 count += block_hdr.size * sizeof(u16);
11697 }
11698 return 0;
11699 eof:
11700 pr_err("Firmware is truncated at pos %u/%u\n", count, size);
11701 return -EINVAL;
11702 }
11703
11704 /**
11705 * drx_ctrl_u_code - Handle microcode upload or verify.
11706 * @dev_addr: Address of device.
11707 * @mc_info: Pointer to information about microcode data.
11708 * @action: Either UCODE_UPLOAD or UCODE_VERIFY
11709 *
11710 * This function returns:
11711 * 0:
11712 * - In case of UCODE_UPLOAD: code is successfully uploaded.
11713 * - In case of UCODE_VERIFY: image on device is equal to
11714 * image provided to this control function.
11715 * -EIO:
11716 * - In case of UCODE_UPLOAD: I2C error.
11717 * - In case of UCODE_VERIFY: I2C error or image on device
11718 * is not equal to image provided to this control function.
11719 * -EINVAL:
11720 * - Invalid arguments.
11721 * - Provided image is corrupt
11722 */
11723 static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11724 struct drxu_code_info *mc_info,
11725 enum drxu_code_action action)
11726 {
11727 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11728 int rc;
11729 u16 i = 0;
11730 u16 mc_nr_of_blks = 0;
11731 u16 mc_magic_word = 0;
11732 const u8 *mc_data_init = NULL;
11733 u8 *mc_data = NULL;
11734 unsigned size;
11735 char *mc_file;
11736
11737 /* Check arguments */
11738 if (!mc_info || !mc_info->mc_file)
11739 return -EINVAL;
11740
11741 mc_file = mc_info->mc_file;
11742
11743 if (!demod->firmware) {
11744 const struct firmware *fw = NULL;
11745
11746 rc = request_firmware(&fw, mc_file, demod->i2c->dev.parent);
11747 if (rc < 0) {
11748 pr_err("Couldn't read firmware %s\n", mc_file);
11749 return rc;
11750 }
11751 demod->firmware = fw;
11752
11753 if (demod->firmware->size < 2 * sizeof(u16)) {
11754 rc = -EINVAL;
11755 pr_err("Firmware is too short!\n");
11756 goto release;
11757 }
11758
11759 pr_info("Firmware %s, size %zu\n",
11760 mc_file, demod->firmware->size);
11761 }
11762
11763 mc_data_init = demod->firmware->data;
11764 size = demod->firmware->size;
11765
11766 mc_data = (void *)mc_data_init;
11767 /* Check data */
11768 mc_magic_word = be16_to_cpu(*(__be16 *)(mc_data));
11769 mc_data += sizeof(u16);
11770 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data));
11771 mc_data += sizeof(u16);
11772
11773 if ((mc_magic_word != DRX_UCODE_MAGIC_WORD) || (mc_nr_of_blks == 0)) {
11774 rc = -EINVAL;
11775 pr_err("Firmware magic word doesn't match\n");
11776 goto release;
11777 }
11778
11779 if (action == UCODE_UPLOAD) {
11780 rc = drx_check_firmware(demod, (u8 *)mc_data_init, size);
11781 if (rc)
11782 goto release;
11783 pr_info("Uploading firmware %s\n", mc_file);
11784 } else {
11785 pr_info("Verifying if firmware upload was ok.\n");
11786 }
11787
11788 /* Process microcode blocks */
11789 for (i = 0; i < mc_nr_of_blks; i++) {
11790 struct drxu_code_block_hdr block_hdr;
11791 u16 mc_block_nr_bytes = 0;
11792
11793 /* Process block header */
11794 block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data));
11795 mc_data += sizeof(u32);
11796 block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data));
11797 mc_data += sizeof(u16);
11798 block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data));
11799 mc_data += sizeof(u16);
11800 block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data));
11801 mc_data += sizeof(u16);
11802
11803 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11804 (unsigned)(mc_data - mc_data_init), block_hdr.addr,
11805 block_hdr.size, block_hdr.flags, block_hdr.CRC);
11806
11807 /* Check block header on:
11808 - data larger than 64Kb
11809 - if CRC enabled check CRC
11810 */
11811 if ((block_hdr.size > 0x7FFF) ||
11812 (((block_hdr.flags & DRX_UCODE_CRC_FLAG) != 0) &&
11813 (block_hdr.CRC != drx_u_code_compute_crc(mc_data, block_hdr.size)))
11814 ) {
11815 /* Wrong data ! */
11816 rc = -EINVAL;
11817 pr_err("firmware CRC is wrong\n");
11818 goto release;
11819 }
11820
11821 if (!block_hdr.size)
11822 continue;
11823
11824 mc_block_nr_bytes = block_hdr.size * ((u16) sizeof(u16));
11825
11826 /* Perform the desired action */
11827 switch (action) {
11828 case UCODE_UPLOAD: /* Upload microcode */
11829 if (drxdap_fasi_write_block(dev_addr,
11830 block_hdr.addr,
11831 mc_block_nr_bytes,
11832 mc_data, 0x0000)) {
11833 rc = -EIO;
11834 pr_err("error writing firmware at pos %u\n",
11835 (unsigned)(mc_data - mc_data_init));
11836 goto release;
11837 }
11838 break;
11839 case UCODE_VERIFY: { /* Verify uploaded microcode */
11840 int result = 0;
11841 u8 mc_data_buffer[DRX_UCODE_MAX_BUF_SIZE];
11842 u32 bytes_to_comp = 0;
11843 u32 bytes_left = mc_block_nr_bytes;
11844 u32 curr_addr = block_hdr.addr;
11845 u8 *curr_ptr = mc_data;
11846
11847 while (bytes_left != 0) {
11848 if (bytes_left > DRX_UCODE_MAX_BUF_SIZE)
11849 bytes_to_comp = DRX_UCODE_MAX_BUF_SIZE;
11850 else
11851 bytes_to_comp = bytes_left;
11852
11853 if (drxdap_fasi_read_block(dev_addr,
11854 curr_addr,
11855 (u16)bytes_to_comp,
11856 (u8 *)mc_data_buffer,
11857 0x0000)) {
11858 pr_err("error reading firmware at pos %u\n",
11859 (unsigned)(mc_data - mc_data_init));
11860 return -EIO;
11861 }
11862
11863 result = memcmp(curr_ptr, mc_data_buffer,
11864 bytes_to_comp);
11865
11866 if (result) {
11867 pr_err("error verifying firmware at pos %u\n",
11868 (unsigned)(mc_data - mc_data_init));
11869 return -EIO;
11870 }
11871
11872 curr_addr += ((dr_xaddr_t)(bytes_to_comp / 2));
11873 curr_ptr =&(curr_ptr[bytes_to_comp]);
11874 bytes_left -=((u32) bytes_to_comp);
11875 }
11876 break;
11877 }
11878 default:
11879 return -EINVAL;
11880 break;
11881
11882 }
11883 mc_data += mc_block_nr_bytes;
11884 }
11885
11886 return 0;
11887
11888 release:
11889 release_firmware(demod->firmware);
11890 demod->firmware = NULL;
11891
11892 return rc;
11893 }
11894
11895 /* caller is expeced to check if lna is supported before enabling */
11896 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state)
11897 {
11898 struct drxuio_cfg uio_cfg;
11899 struct drxuio_data uio_data;
11900 int result;
11901
11902 uio_cfg.uio = DRX_UIO1;
11903 uio_cfg.mode = DRX_UIO_MODE_READWRITE;
11904 /* Configure user-I/O #3: enable read/write */
11905 result = ctrl_set_uio_cfg(demod, &uio_cfg);
11906 if (result) {
11907 pr_err("Failed to setup LNA GPIO!\n");
11908 return result;
11909 }
11910
11911 uio_data.uio = DRX_UIO1;
11912 uio_data.value = state;
11913 result = ctrl_uio_write(demod, &uio_data);
11914 if (result != 0) {
11915 pr_err("Failed to %sable LNA!\n",
11916 state ? "en" : "dis");
11917 return result;
11918 }
11919 return 0;
11920 }
11921
11922 /*
11923 * The Linux DVB Driver for Micronas DRX39xx family (drx3933j)
11924 *
11925 * Written by Devin Heitmueller <devin.heitmueller@kernellabs.com>
11926 */
11927
11928 static int drx39xxj_set_powerstate(struct dvb_frontend *fe, int enable)
11929 {
11930 struct drx39xxj_state *state = fe->demodulator_priv;
11931 struct drx_demod_instance *demod = state->demod;
11932 int result;
11933 enum drx_power_mode power_mode;
11934
11935 if (enable)
11936 power_mode = DRX_POWER_UP;
11937 else
11938 power_mode = DRX_POWER_DOWN;
11939
11940 result = ctrl_power_mode(demod, &power_mode);
11941 if (result != 0) {
11942 pr_err("Power state change failed\n");
11943 return 0;
11944 }
11945
11946 return 0;
11947 }
11948
11949 static int drx39xxj_read_status(struct dvb_frontend *fe, fe_status_t *status)
11950 {
11951 struct drx39xxj_state *state = fe->demodulator_priv;
11952 struct drx_demod_instance *demod = state->demod;
11953 int result;
11954 enum drx_lock_status lock_status;
11955
11956 *status = 0;
11957
11958 result = ctrl_lock_status(demod, &lock_status);
11959 if (result != 0) {
11960 pr_err("drx39xxj: could not get lock status!\n");
11961 *status = 0;
11962 }
11963
11964 switch (lock_status) {
11965 case DRX_NEVER_LOCK:
11966 *status = 0;
11967 pr_err("drx says NEVER_LOCK\n");
11968 break;
11969 case DRX_NOT_LOCKED:
11970 *status = 0;
11971 break;
11972 case DRX_LOCK_STATE_1:
11973 case DRX_LOCK_STATE_2:
11974 case DRX_LOCK_STATE_3:
11975 case DRX_LOCK_STATE_4:
11976 case DRX_LOCK_STATE_5:
11977 case DRX_LOCK_STATE_6:
11978 case DRX_LOCK_STATE_7:
11979 case DRX_LOCK_STATE_8:
11980 case DRX_LOCK_STATE_9:
11981 *status = FE_HAS_SIGNAL
11982 | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC;
11983 break;
11984 case DRX_LOCKED:
11985 *status = FE_HAS_SIGNAL
11986 | FE_HAS_CARRIER
11987 | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
11988 break;
11989 default:
11990 pr_err("Lock state unknown %d\n", lock_status);
11991 }
11992 ctrl_sig_quality(demod, lock_status);
11993
11994 return 0;
11995 }
11996
11997 static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber)
11998 {
11999 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12000
12001 if (p->pre_bit_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12002 *ber = 0;
12003 return 0;
12004 }
12005
12006 if (!p->pre_bit_count.stat[0].uvalue) {
12007 if (!p->pre_bit_error.stat[0].uvalue)
12008 *ber = 0;
12009 else
12010 *ber = 1000000;
12011 } else {
12012 *ber = frac_times1e6(p->pre_bit_error.stat[0].uvalue,
12013 p->pre_bit_count.stat[0].uvalue);
12014 }
12015 return 0;
12016 }
12017
12018 static int drx39xxj_read_signal_strength(struct dvb_frontend *fe,
12019 u16 *strength)
12020 {
12021 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12022
12023 if (p->strength.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12024 *strength = 0;
12025 return 0;
12026 }
12027
12028 *strength = p->strength.stat[0].uvalue;
12029 return 0;
12030 }
12031
12032 static int drx39xxj_read_snr(struct dvb_frontend *fe, u16 *snr)
12033 {
12034 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12035 u64 tmp64;
12036
12037 if (p->cnr.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12038 *snr = 0;
12039 return 0;
12040 }
12041
12042 tmp64 = p->cnr.stat[0].svalue;
12043 do_div(tmp64, 10);
12044 *snr = tmp64;
12045 return 0;
12046 }
12047
12048 static int drx39xxj_read_ucblocks(struct dvb_frontend *fe, u32 *ucb)
12049 {
12050 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12051
12052 if (p->block_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12053 *ucb = 0;
12054 return 0;
12055 }
12056
12057 *ucb = p->block_error.stat[0].uvalue;
12058 return 0;
12059 }
12060
12061 static int drx39xxj_set_frontend(struct dvb_frontend *fe)
12062 {
12063 #ifdef DJH_DEBUG
12064 int i;
12065 #endif
12066 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12067 struct drx39xxj_state *state = fe->demodulator_priv;
12068 struct drx_demod_instance *demod = state->demod;
12069 enum drx_standard standard = DRX_STANDARD_8VSB;
12070 struct drx_channel channel;
12071 int result;
12072 static const struct drx_channel def_channel = {
12073 /* frequency */ 0,
12074 /* bandwidth */ DRX_BANDWIDTH_6MHZ,
12075 /* mirror */ DRX_MIRROR_NO,
12076 /* constellation */ DRX_CONSTELLATION_AUTO,
12077 /* hierarchy */ DRX_HIERARCHY_UNKNOWN,
12078 /* priority */ DRX_PRIORITY_UNKNOWN,
12079 /* coderate */ DRX_CODERATE_UNKNOWN,
12080 /* guard */ DRX_GUARD_UNKNOWN,
12081 /* fftmode */ DRX_FFTMODE_UNKNOWN,
12082 /* classification */ DRX_CLASSIFICATION_AUTO,
12083 /* symbolrate */ 5057000,
12084 /* interleavemode */ DRX_INTERLEAVEMODE_UNKNOWN,
12085 /* ldpc */ DRX_LDPC_UNKNOWN,
12086 /* carrier */ DRX_CARRIER_UNKNOWN,
12087 /* frame mode */ DRX_FRAMEMODE_UNKNOWN
12088 };
12089 u32 constellation = DRX_CONSTELLATION_AUTO;
12090
12091 /* Bring the demod out of sleep */
12092 drx39xxj_set_powerstate(fe, 1);
12093
12094 if (fe->ops.tuner_ops.set_params) {
12095 u32 int_freq;
12096
12097 if (fe->ops.i2c_gate_ctrl)
12098 fe->ops.i2c_gate_ctrl(fe, 1);
12099
12100 /* Set tuner to desired frequency and standard */
12101 fe->ops.tuner_ops.set_params(fe);
12102
12103 /* Use the tuner's IF */
12104 if (fe->ops.tuner_ops.get_if_frequency) {
12105 fe->ops.tuner_ops.get_if_frequency(fe, &int_freq);
12106 demod->my_common_attr->intermediate_freq = int_freq / 1000;
12107 }
12108
12109 if (fe->ops.i2c_gate_ctrl)
12110 fe->ops.i2c_gate_ctrl(fe, 0);
12111 }
12112
12113 switch (p->delivery_system) {
12114 case SYS_ATSC:
12115 standard = DRX_STANDARD_8VSB;
12116 break;
12117 case SYS_DVBC_ANNEX_B:
12118 standard = DRX_STANDARD_ITU_B;
12119
12120 switch (p->modulation) {
12121 case QAM_64:
12122 constellation = DRX_CONSTELLATION_QAM64;
12123 break;
12124 case QAM_256:
12125 constellation = DRX_CONSTELLATION_QAM256;
12126 break;
12127 default:
12128 constellation = DRX_CONSTELLATION_AUTO;
12129 break;
12130 }
12131 break;
12132 default:
12133 return -EINVAL;
12134 }
12135 /* Set the standard (will be powered up if necessary */
12136 result = ctrl_set_standard(demod, &standard);
12137 if (result != 0) {
12138 pr_err("Failed to set standard! result=%02x\n",
12139 result);
12140 return -EINVAL;
12141 }
12142
12143 /* set channel parameters */
12144 channel = def_channel;
12145 channel.frequency = p->frequency / 1000;
12146 channel.bandwidth = DRX_BANDWIDTH_6MHZ;
12147 channel.constellation = constellation;
12148
12149 /* program channel */
12150 result = ctrl_set_channel(demod, &channel);
12151 if (result != 0) {
12152 pr_err("Failed to set channel!\n");
12153 return -EINVAL;
12154 }
12155 /* Just for giggles, let's shut off the LNA again.... */
12156 drxj_set_lna_state(demod, false);
12157
12158 /* After set_frontend, except for strength, stats aren't available */
12159 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12160
12161 return 0;
12162 }
12163
12164 static int drx39xxj_sleep(struct dvb_frontend *fe)
12165 {
12166 /* power-down the demodulator */
12167 return drx39xxj_set_powerstate(fe, 0);
12168 }
12169
12170 static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
12171 {
12172 struct drx39xxj_state *state = fe->demodulator_priv;
12173 struct drx_demod_instance *demod = state->demod;
12174 bool i2c_gate_state;
12175 int result;
12176
12177 #ifdef DJH_DEBUG
12178 pr_debug("i2c gate call: enable=%d state=%d\n", enable,
12179 state->i2c_gate_open);
12180 #endif
12181
12182 if (enable)
12183 i2c_gate_state = true;
12184 else
12185 i2c_gate_state = false;
12186
12187 if (state->i2c_gate_open == enable) {
12188 /* We're already in the desired state */
12189 return 0;
12190 }
12191
12192 result = ctrl_i2c_bridge(demod, &i2c_gate_state);
12193 if (result != 0) {
12194 pr_err("drx39xxj: could not open i2c gate [%d]\n",
12195 result);
12196 dump_stack();
12197 } else {
12198 state->i2c_gate_open = enable;
12199 }
12200 return 0;
12201 }
12202
12203 static int drx39xxj_init(struct dvb_frontend *fe)
12204 {
12205 struct drx39xxj_state *state = fe->demodulator_priv;
12206 struct drx_demod_instance *demod = state->demod;
12207 int rc = 0;
12208
12209 if (fe->exit == DVB_FE_DEVICE_RESUME) {
12210 /* so drxj_open() does what it needs to do */
12211 demod->my_common_attr->is_opened = false;
12212 rc = drxj_open(demod);
12213 if (rc != 0)
12214 pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc);
12215 } else
12216 drx39xxj_set_powerstate(fe, 1);
12217
12218 return rc;
12219 }
12220
12221 static int drx39xxj_set_lna(struct dvb_frontend *fe)
12222 {
12223 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
12224 struct drx39xxj_state *state = fe->demodulator_priv;
12225 struct drx_demod_instance *demod = state->demod;
12226 struct drxj_data *ext_attr = demod->my_ext_attr;
12227
12228 if (c->lna) {
12229 if (!ext_attr->has_lna) {
12230 pr_err("LNA is not supported on this device!\n");
12231 return -EINVAL;
12232
12233 }
12234 }
12235
12236 return drxj_set_lna_state(demod, c->lna);
12237 }
12238
12239 static int drx39xxj_get_tune_settings(struct dvb_frontend *fe,
12240 struct dvb_frontend_tune_settings *tune)
12241 {
12242 tune->min_delay_ms = 1000;
12243 return 0;
12244 }
12245
12246 static void drx39xxj_release(struct dvb_frontend *fe)
12247 {
12248 struct drx39xxj_state *state = fe->demodulator_priv;
12249 struct drx_demod_instance *demod = state->demod;
12250
12251 /* if device is removed don't access it */
12252 if (fe->exit != DVB_FE_DEVICE_REMOVED)
12253 drxj_close(demod);
12254
12255 kfree(demod->my_ext_attr);
12256 kfree(demod->my_common_attr);
12257 kfree(demod->my_i2c_dev_addr);
12258 release_firmware(demod->firmware);
12259 kfree(demod);
12260 kfree(state);
12261 }
12262
12263 static struct dvb_frontend_ops drx39xxj_ops;
12264
12265 struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
12266 {
12267 struct drx39xxj_state *state = NULL;
12268 struct i2c_device_addr *demod_addr = NULL;
12269 struct drx_common_attr *demod_comm_attr = NULL;
12270 struct drxj_data *demod_ext_attr = NULL;
12271 struct drx_demod_instance *demod = NULL;
12272 struct dtv_frontend_properties *p;
12273 int result;
12274
12275 /* allocate memory for the internal state */
12276 state = kzalloc(sizeof(struct drx39xxj_state), GFP_KERNEL);
12277 if (state == NULL)
12278 goto error;
12279
12280 demod = kmalloc(sizeof(struct drx_demod_instance), GFP_KERNEL);
12281 if (demod == NULL)
12282 goto error;
12283
12284 demod_addr = kmemdup(&drxj_default_addr_g,
12285 sizeof(struct i2c_device_addr), GFP_KERNEL);
12286 if (demod_addr == NULL)
12287 goto error;
12288
12289 demod_comm_attr = kmemdup(&drxj_default_comm_attr_g,
12290 sizeof(struct drx_common_attr), GFP_KERNEL);
12291 if (demod_comm_attr == NULL)
12292 goto error;
12293
12294 demod_ext_attr = kmemdup(&drxj_data_g, sizeof(struct drxj_data),
12295 GFP_KERNEL);
12296 if (demod_ext_attr == NULL)
12297 goto error;
12298
12299 /* setup the state */
12300 state->i2c = i2c;
12301 state->demod = demod;
12302
12303 /* setup the demod data */
12304 memcpy(demod, &drxj_default_demod_g, sizeof(struct drx_demod_instance));
12305
12306 demod->my_i2c_dev_addr = demod_addr;
12307 demod->my_common_attr = demod_comm_attr;
12308 demod->my_i2c_dev_addr->user_data = state;
12309 demod->my_common_attr->microcode_file = DRX39XX_MAIN_FIRMWARE;
12310 demod->my_common_attr->verify_microcode = true;
12311 demod->my_common_attr->intermediate_freq = 5000;
12312 demod->my_common_attr->current_power_mode = DRX_POWER_DOWN;
12313 demod->my_ext_attr = demod_ext_attr;
12314 ((struct drxj_data *)demod_ext_attr)->uio_sma_tx_mode = DRX_UIO_MODE_READWRITE;
12315 demod->i2c = i2c;
12316
12317 result = drxj_open(demod);
12318 if (result != 0) {
12319 pr_err("DRX open failed! Aborting\n");
12320 goto error;
12321 }
12322
12323 /* create dvb_frontend */
12324 memcpy(&state->frontend.ops, &drx39xxj_ops,
12325 sizeof(struct dvb_frontend_ops));
12326
12327 state->frontend.demodulator_priv = state;
12328
12329 /* Initialize stats - needed for DVBv5 stats to work */
12330 p = &state->frontend.dtv_property_cache;
12331 p->strength.len = 1;
12332 p->pre_bit_count.len = 1;
12333 p->pre_bit_error.len = 1;
12334 p->post_bit_count.len = 1;
12335 p->post_bit_error.len = 1;
12336 p->block_count.len = 1;
12337 p->block_error.len = 1;
12338 p->cnr.len = 1;
12339
12340 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12341 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12342 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12343 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12344 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12345 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12346 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12347 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12348
12349 return &state->frontend;
12350
12351 error:
12352 kfree(demod_ext_attr);
12353 kfree(demod_comm_attr);
12354 kfree(demod_addr);
12355 kfree(demod);
12356 kfree(state);
12357
12358 return NULL;
12359 }
12360 EXPORT_SYMBOL(drx39xxj_attach);
12361
12362 static struct dvb_frontend_ops drx39xxj_ops = {
12363 .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
12364 .info = {
12365 .name = "Micronas DRX39xxj family Frontend",
12366 .frequency_stepsize = 62500,
12367 .frequency_min = 51000000,
12368 .frequency_max = 858000000,
12369 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
12370 },
12371
12372 .init = drx39xxj_init,
12373 .i2c_gate_ctrl = drx39xxj_i2c_gate_ctrl,
12374 .sleep = drx39xxj_sleep,
12375 .set_frontend = drx39xxj_set_frontend,
12376 .get_tune_settings = drx39xxj_get_tune_settings,
12377 .read_status = drx39xxj_read_status,
12378 .read_ber = drx39xxj_read_ber,
12379 .read_signal_strength = drx39xxj_read_signal_strength,
12380 .read_snr = drx39xxj_read_snr,
12381 .read_ucblocks = drx39xxj_read_ucblocks,
12382 .release = drx39xxj_release,
12383 .set_lna = drx39xxj_set_lna,
12384 };
12385
12386 MODULE_DESCRIPTION("Micronas DRX39xxj Frontend");
12387 MODULE_AUTHOR("Devin Heitmueller");
12388 MODULE_LICENSE("GPL");
12389 MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE);
This page took 0.418936 seconds and 5 git commands to generate.