1 /* 2 Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc. 3 All rights reserved. 4 5 Redistribution and use in source and binary forms, with or without 6 modification, are permitted provided that the following conditions are met: 7 8 * Redistributions of source code must retain the above copyright notice, 9 this list of conditions and the following disclaimer. 10 * Redistributions in binary form must reproduce the above copyright notice, 11 this list of conditions and the following disclaimer in the documentation 12 and/or other materials provided with the distribution. 13 * Neither the name of Trident Microsystems nor Hauppauge Computer Works 14 nor the names of its contributors may be used to endorse or promote 15 products derived from this software without specific prior written 16 permission. 17 18 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 POSSIBILITY OF SUCH DAMAGE. 29 30 DRXJ specific implementation of DRX driver 31 authors: Dragan Savic, Milos Nikolic, Mihajlo Katona, Tao Ding, Paul Janssen 32 33 The Linux DVB Driver for Micronas DRX39xx family (drx3933j) was 34 written by Devin Heitmueller <devin.heitmueller@kernellabs.com> 35 36 This program is free software; you can redistribute it and/or modify 37 it under the terms of the GNU General Public License as published by 38 the Free Software Foundation; either version 2 of the License, or 39 (at your option) any later version. 40 41 This program is distributed in the hope that it will be useful, 42 but WITHOUT ANY WARRANTY; without even the implied warranty of 43 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 44 45 GNU General Public License for more details. 46 47 You should have received a copy of the GNU General Public License 48 along with this program; if not, write to the Free Software 49 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 50 */ 51 52 /*----------------------------------------------------------------------------- 53 INCLUDE FILES 54 ----------------------------------------------------------------------------*/ 55 56 #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ 57 58 #include <linux/module.h> 59 #include <linux/init.h> 60 #include <linux/string.h> 61 #include <linux/slab.h> 62 #include <asm/div64.h> 63 64 #include <media/dvb_frontend.h> 65 #include "drx39xxj.h" 66 67 #include "drxj.h" 68 #include "drxj_map.h" 69 70 /*============================================================================*/ 71 /*=== DEFINES ================================================================*/ 72 /*============================================================================*/ 73 74 #define DRX39XX_MAIN_FIRMWARE "dvb-fe-drxj-mc-1.0.8.fw" 75 76 /* 77 * \brief Maximum u32 value. 78 */ 79 #ifndef MAX_U32 80 #define MAX_U32 ((u32) (0xFFFFFFFFL)) 81 #endif 82 83 /* Customer configurable hardware settings, etc */ 84 #ifndef MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH 85 #define MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH 0x02 86 #endif 87 88 #ifndef MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH 89 #define MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH 0x02 90 #endif 91 92 #ifndef MPEG_OUTPUT_CLK_DRIVE_STRENGTH 93 #define MPEG_OUTPUT_CLK_DRIVE_STRENGTH 0x06 94 #endif 95 96 #ifndef OOB_CRX_DRIVE_STRENGTH 97 #define OOB_CRX_DRIVE_STRENGTH 0x02 98 #endif 99 100 #ifndef OOB_DRX_DRIVE_STRENGTH 101 #define OOB_DRX_DRIVE_STRENGTH 0x02 102 #endif 103 /*** START DJCOMBO patches to DRXJ registermap constants *********************/ 104 /*** registermap 200706071303 from drxj **************************************/ 105 #define ATV_TOP_CR_AMP_TH_FM 0x0 106 #define ATV_TOP_CR_AMP_TH_L 0xA 107 #define ATV_TOP_CR_AMP_TH_LP 0xA 108 #define ATV_TOP_CR_AMP_TH_BG 0x8 109 #define ATV_TOP_CR_AMP_TH_DK 0x8 110 #define ATV_TOP_CR_AMP_TH_I 0x8 111 #define ATV_TOP_CR_CONT_CR_D_MN 0x18 112 #define ATV_TOP_CR_CONT_CR_D_FM 0x0 113 #define ATV_TOP_CR_CONT_CR_D_L 0x20 114 #define ATV_TOP_CR_CONT_CR_D_LP 0x20 115 #define ATV_TOP_CR_CONT_CR_D_BG 0x18 116 #define ATV_TOP_CR_CONT_CR_D_DK 0x18 117 #define ATV_TOP_CR_CONT_CR_D_I 0x18 118 #define ATV_TOP_CR_CONT_CR_I_MN 0x80 119 #define ATV_TOP_CR_CONT_CR_I_FM 0x0 120 #define ATV_TOP_CR_CONT_CR_I_L 0x80 121 #define ATV_TOP_CR_CONT_CR_I_LP 0x80 122 #define ATV_TOP_CR_CONT_CR_I_BG 0x80 123 #define ATV_TOP_CR_CONT_CR_I_DK 0x80 124 #define ATV_TOP_CR_CONT_CR_I_I 0x80 125 #define ATV_TOP_CR_CONT_CR_P_MN 0x4 126 #define ATV_TOP_CR_CONT_CR_P_FM 0x0 127 #define ATV_TOP_CR_CONT_CR_P_L 0x4 128 #define ATV_TOP_CR_CONT_CR_P_LP 0x4 129 #define ATV_TOP_CR_CONT_CR_P_BG 0x4 130 #define ATV_TOP_CR_CONT_CR_P_DK 0x4 131 #define ATV_TOP_CR_CONT_CR_P_I 0x4 132 #define ATV_TOP_CR_OVM_TH_MN 0xA0 133 #define ATV_TOP_CR_OVM_TH_FM 0x0 134 #define ATV_TOP_CR_OVM_TH_L 0xA0 135 #define ATV_TOP_CR_OVM_TH_LP 0xA0 136 #define ATV_TOP_CR_OVM_TH_BG 0xA0 137 #define ATV_TOP_CR_OVM_TH_DK 0xA0 138 #define ATV_TOP_CR_OVM_TH_I 0xA0 139 #define ATV_TOP_EQU0_EQU_C0_FM 0x0 140 #define ATV_TOP_EQU0_EQU_C0_L 0x3 141 #define ATV_TOP_EQU0_EQU_C0_LP 0x3 142 #define ATV_TOP_EQU0_EQU_C0_BG 0x7 143 #define ATV_TOP_EQU0_EQU_C0_DK 0x0 144 #define ATV_TOP_EQU0_EQU_C0_I 0x3 145 #define ATV_TOP_EQU1_EQU_C1_FM 0x0 146 #define ATV_TOP_EQU1_EQU_C1_L 0x1F6 147 #define ATV_TOP_EQU1_EQU_C1_LP 0x1F6 148 #define ATV_TOP_EQU1_EQU_C1_BG 0x197 149 #define ATV_TOP_EQU1_EQU_C1_DK 0x198 150 #define ATV_TOP_EQU1_EQU_C1_I 0x1F6 151 #define ATV_TOP_EQU2_EQU_C2_FM 0x0 152 #define ATV_TOP_EQU2_EQU_C2_L 0x28 153 #define ATV_TOP_EQU2_EQU_C2_LP 0x28 154 #define ATV_TOP_EQU2_EQU_C2_BG 0xC5 155 #define ATV_TOP_EQU2_EQU_C2_DK 0xB0 156 #define ATV_TOP_EQU2_EQU_C2_I 0x28 157 #define ATV_TOP_EQU3_EQU_C3_FM 0x0 158 #define ATV_TOP_EQU3_EQU_C3_L 0x192 159 #define ATV_TOP_EQU3_EQU_C3_LP 0x192 160 #define ATV_TOP_EQU3_EQU_C3_BG 0x12E 161 #define ATV_TOP_EQU3_EQU_C3_DK 0x18E 162 #define ATV_TOP_EQU3_EQU_C3_I 0x192 163 #define ATV_TOP_STD_MODE_MN 0x0 164 #define ATV_TOP_STD_MODE_FM 0x1 165 #define ATV_TOP_STD_MODE_L 0x0 166 #define ATV_TOP_STD_MODE_LP 0x0 167 #define ATV_TOP_STD_MODE_BG 0x0 168 #define ATV_TOP_STD_MODE_DK 0x0 169 #define ATV_TOP_STD_MODE_I 0x0 170 #define ATV_TOP_STD_VID_POL_MN 0x0 171 #define ATV_TOP_STD_VID_POL_FM 0x0 172 #define ATV_TOP_STD_VID_POL_L 0x2 173 #define ATV_TOP_STD_VID_POL_LP 0x2 174 #define ATV_TOP_STD_VID_POL_BG 0x0 175 #define ATV_TOP_STD_VID_POL_DK 0x0 176 #define ATV_TOP_STD_VID_POL_I 0x0 177 #define ATV_TOP_VID_AMP_MN 0x380 178 #define ATV_TOP_VID_AMP_FM 0x0 179 #define ATV_TOP_VID_AMP_L 0xF50 180 #define ATV_TOP_VID_AMP_LP 0xF50 181 #define ATV_TOP_VID_AMP_BG 0x380 182 #define ATV_TOP_VID_AMP_DK 0x394 183 #define ATV_TOP_VID_AMP_I 0x3D8 184 #define IQM_CF_OUT_ENA_OFDM__M 0x4 185 #define IQM_FS_ADJ_SEL_B_QAM 0x1 186 #define IQM_FS_ADJ_SEL_B_OFF 0x0 187 #define IQM_FS_ADJ_SEL_B_VSB 0x2 188 #define IQM_RC_ADJ_SEL_B_OFF 0x0 189 #define IQM_RC_ADJ_SEL_B_QAM 0x1 190 #define IQM_RC_ADJ_SEL_B_VSB 0x2 191 /*** END DJCOMBO patches to DRXJ registermap *********************************/ 192 193 #include "drx_driver_version.h" 194 195 /* #define DRX_DEBUG */ 196 #ifdef DRX_DEBUG 197 #include <stdio.h> 198 #endif 199 200 /*----------------------------------------------------------------------------- 201 ENUMS 202 ----------------------------------------------------------------------------*/ 203 204 /*----------------------------------------------------------------------------- 205 DEFINES 206 ----------------------------------------------------------------------------*/ 207 #ifndef DRXJ_WAKE_UP_KEY 208 #define DRXJ_WAKE_UP_KEY (demod->my_i2c_dev_addr->i2c_addr) 209 #endif 210 211 /* 212 * \def DRXJ_DEF_I2C_ADDR 213 * \brief Default I2C address of a demodulator instance. 214 */ 215 #define DRXJ_DEF_I2C_ADDR (0x52) 216 217 /* 218 * \def DRXJ_DEF_DEMOD_DEV_ID 219 * \brief Default device identifier of a demodultor instance. 220 */ 221 #define DRXJ_DEF_DEMOD_DEV_ID (1) 222 223 /* 224 * \def DRXJ_SCAN_TIMEOUT 225 * \brief Timeout value for waiting on demod lock during channel scan (millisec). 226 */ 227 #define DRXJ_SCAN_TIMEOUT 1000 228 229 /* 230 * \def HI_I2C_DELAY 231 * \brief HI timing delay for I2C timing (in nano seconds) 232 * 233 * Used to compute HI_CFG_DIV 234 */ 235 #define HI_I2C_DELAY 42 236 237 /* 238 * \def HI_I2C_BRIDGE_DELAY 239 * \brief HI timing delay for I2C timing (in nano seconds) 240 * 241 * Used to compute HI_CFG_BDL 242 */ 243 #define HI_I2C_BRIDGE_DELAY 750 244 245 /* 246 * \brief Time Window for MER and SER Measurement in Units of Segment duration. 247 */ 248 #define VSB_TOP_MEASUREMENT_PERIOD 64 249 #define SYMBOLS_PER_SEGMENT 832 250 251 /* 252 * \brief bit rate and segment rate constants used for SER and BER. 253 */ 254 /* values taken from the QAM microcode */ 255 #define DRXJ_QAM_SL_SIG_POWER_QAM_UNKNOWN 0 256 #define DRXJ_QAM_SL_SIG_POWER_QPSK 32768 257 #define DRXJ_QAM_SL_SIG_POWER_QAM8 24576 258 #define DRXJ_QAM_SL_SIG_POWER_QAM16 40960 259 #define DRXJ_QAM_SL_SIG_POWER_QAM32 20480 260 #define DRXJ_QAM_SL_SIG_POWER_QAM64 43008 261 #define DRXJ_QAM_SL_SIG_POWER_QAM128 20992 262 #define DRXJ_QAM_SL_SIG_POWER_QAM256 43520 263 /* 264 * \brief Min supported symbolrates. 265 */ 266 #ifndef DRXJ_QAM_SYMBOLRATE_MIN 267 #define DRXJ_QAM_SYMBOLRATE_MIN (520000) 268 #endif 269 270 /* 271 * \brief Max supported symbolrates. 272 */ 273 #ifndef DRXJ_QAM_SYMBOLRATE_MAX 274 #define DRXJ_QAM_SYMBOLRATE_MAX (7233000) 275 #endif 276 277 /* 278 * \def DRXJ_QAM_MAX_WAITTIME 279 * \brief Maximal wait time for QAM auto constellation in ms 280 */ 281 #ifndef DRXJ_QAM_MAX_WAITTIME 282 #define DRXJ_QAM_MAX_WAITTIME 900 283 #endif 284 285 #ifndef DRXJ_QAM_FEC_LOCK_WAITTIME 286 #define DRXJ_QAM_FEC_LOCK_WAITTIME 150 287 #endif 288 289 #ifndef DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME 290 #define DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME 200 291 #endif 292 293 /* 294 * \def SCU status and results 295 * \brief SCU 296 */ 297 #define DRX_SCU_READY 0 298 #define DRXJ_MAX_WAITTIME 100 /* ms */ 299 #define FEC_RS_MEASUREMENT_PERIOD 12894 /* 1 sec */ 300 #define FEC_RS_MEASUREMENT_PRESCALE 1 /* n sec */ 301 302 /* 303 * \def DRX_AUD_MAX_DEVIATION 304 * \brief Needed for calculation of prescale feature in AUD 305 */ 306 #ifndef DRXJ_AUD_MAX_FM_DEVIATION 307 #define DRXJ_AUD_MAX_FM_DEVIATION 100 /* kHz */ 308 #endif 309 310 /* 311 * \brief Needed for calculation of NICAM prescale feature in AUD 312 */ 313 #ifndef DRXJ_AUD_MAX_NICAM_PRESCALE 314 #define DRXJ_AUD_MAX_NICAM_PRESCALE (9) /* dB */ 315 #endif 316 317 /* 318 * \brief Needed for calculation of NICAM prescale feature in AUD 319 */ 320 #ifndef DRXJ_AUD_MAX_WAITTIME 321 #define DRXJ_AUD_MAX_WAITTIME 250 /* ms */ 322 #endif 323 324 /* ATV config changed flags */ 325 #define DRXJ_ATV_CHANGED_COEF (0x00000001UL) 326 #define DRXJ_ATV_CHANGED_PEAK_FLT (0x00000008UL) 327 #define DRXJ_ATV_CHANGED_NOISE_FLT (0x00000010UL) 328 #define DRXJ_ATV_CHANGED_OUTPUT (0x00000020UL) 329 #define DRXJ_ATV_CHANGED_SIF_ATT (0x00000040UL) 330 331 /* UIO define */ 332 #define DRX_UIO_MODE_FIRMWARE_SMA DRX_UIO_MODE_FIRMWARE0 333 #define DRX_UIO_MODE_FIRMWARE_SAW DRX_UIO_MODE_FIRMWARE1 334 335 /* 336 * MICROCODE RELATED DEFINES 337 */ 338 339 /* Magic word for checking correct Endianness of microcode data */ 340 #define DRX_UCODE_MAGIC_WORD ((((u16)'H')<<8)+((u16)'L')) 341 342 /* CRC flag in ucode header, flags field. */ 343 #define DRX_UCODE_CRC_FLAG (0x0001) 344 345 /* 346 * Maximum size of buffer used to verify the microcode. 347 * Must be an even number 348 */ 349 #define DRX_UCODE_MAX_BUF_SIZE (DRXDAP_MAX_RCHUNKSIZE) 350 351 #if DRX_UCODE_MAX_BUF_SIZE & 1 352 #error DRX_UCODE_MAX_BUF_SIZE must be an even number 353 #endif 354 355 /* 356 * Power mode macros 357 */ 358 359 #define DRX_ISPOWERDOWNMODE(mode) ((mode == DRX_POWER_MODE_9) || \ 360 (mode == DRX_POWER_MODE_10) || \ 361 (mode == DRX_POWER_MODE_11) || \ 362 (mode == DRX_POWER_MODE_12) || \ 363 (mode == DRX_POWER_MODE_13) || \ 364 (mode == DRX_POWER_MODE_14) || \ 365 (mode == DRX_POWER_MODE_15) || \ 366 (mode == DRX_POWER_MODE_16) || \ 367 (mode == DRX_POWER_DOWN)) 368 369 /* Pin safe mode macro */ 370 #define DRXJ_PIN_SAFE_MODE 0x0000 371 /*============================================================================*/ 372 /*=== GLOBAL VARIABLEs =======================================================*/ 373 /*============================================================================*/ 374 /* 375 */ 376 377 /* 378 * \brief Temporary register definitions. 379 * (register definitions that are not yet available in register master) 380 */ 381 382 /*****************************************************************************/ 383 /* Audio block 0x103 is write only. To avoid shadowing in driver accessing */ 384 /* RAM addresses directly. This must be READ ONLY to avoid problems. */ 385 /* Writing to the interface addresses are more than only writing the RAM */ 386 /* locations */ 387 /*****************************************************************************/ 388 /* 389 * \brief RAM location of MODUS registers 390 */ 391 #define AUD_DEM_RAM_MODUS_HI__A 0x10204A3 392 #define AUD_DEM_RAM_MODUS_HI__M 0xF000 393 394 #define AUD_DEM_RAM_MODUS_LO__A 0x10204A4 395 #define AUD_DEM_RAM_MODUS_LO__M 0x0FFF 396 397 /* 398 * \brief RAM location of I2S config registers 399 */ 400 #define AUD_DEM_RAM_I2S_CONFIG1__A 0x10204B1 401 #define AUD_DEM_RAM_I2S_CONFIG2__A 0x10204B2 402 403 /* 404 * \brief RAM location of DCO config registers 405 */ 406 #define AUD_DEM_RAM_DCO_B_HI__A 0x1020461 407 #define AUD_DEM_RAM_DCO_B_LO__A 0x1020462 408 #define AUD_DEM_RAM_DCO_A_HI__A 0x1020463 409 #define AUD_DEM_RAM_DCO_A_LO__A 0x1020464 410 411 /* 412 * \brief RAM location of Threshold registers 413 */ 414 #define AUD_DEM_RAM_NICAM_THRSHLD__A 0x102045A 415 #define AUD_DEM_RAM_A2_THRSHLD__A 0x10204BB 416 #define AUD_DEM_RAM_BTSC_THRSHLD__A 0x10204A6 417 418 /* 419 * \brief RAM location of Carrier Threshold registers 420 */ 421 #define AUD_DEM_RAM_CM_A_THRSHLD__A 0x10204AF 422 #define AUD_DEM_RAM_CM_B_THRSHLD__A 0x10204B0 423 424 /* 425 * \brief FM Matrix register fix 426 */ 427 #ifdef AUD_DEM_WR_FM_MATRIX__A 428 #undef AUD_DEM_WR_FM_MATRIX__A 429 #endif 430 #define AUD_DEM_WR_FM_MATRIX__A 0x105006F 431 432 /*============================================================================*/ 433 /* 434 * \brief Defines required for audio 435 */ 436 #define AUD_VOLUME_ZERO_DB 115 437 #define AUD_VOLUME_DB_MIN -60 438 #define AUD_VOLUME_DB_MAX 12 439 #define AUD_CARRIER_STRENGTH_QP_0DB 0x4000 440 #define AUD_CARRIER_STRENGTH_QP_0DB_LOG10T100 421 441 #define AUD_MAX_AVC_REF_LEVEL 15 442 #define AUD_I2S_FREQUENCY_MAX 48000UL 443 #define AUD_I2S_FREQUENCY_MIN 12000UL 444 #define AUD_RDS_ARRAY_SIZE 18 445 446 /* 447 * \brief Needed for calculation of prescale feature in AUD 448 */ 449 #ifndef DRX_AUD_MAX_FM_DEVIATION 450 #define DRX_AUD_MAX_FM_DEVIATION (100) /* kHz */ 451 #endif 452 453 /* 454 * \brief Needed for calculation of NICAM prescale feature in AUD 455 */ 456 #ifndef DRX_AUD_MAX_NICAM_PRESCALE 457 #define DRX_AUD_MAX_NICAM_PRESCALE (9) /* dB */ 458 #endif 459 460 /*============================================================================*/ 461 /* Values for I2S Master/Slave pin configurations */ 462 #define SIO_PDR_I2S_CL_CFG_MODE__MASTER 0x0004 463 #define SIO_PDR_I2S_CL_CFG_DRIVE__MASTER 0x0008 464 #define SIO_PDR_I2S_CL_CFG_MODE__SLAVE 0x0004 465 #define SIO_PDR_I2S_CL_CFG_DRIVE__SLAVE 0x0000 466 467 #define SIO_PDR_I2S_DA_CFG_MODE__MASTER 0x0003 468 #define SIO_PDR_I2S_DA_CFG_DRIVE__MASTER 0x0008 469 #define SIO_PDR_I2S_DA_CFG_MODE__SLAVE 0x0003 470 #define SIO_PDR_I2S_DA_CFG_DRIVE__SLAVE 0x0008 471 472 #define SIO_PDR_I2S_WS_CFG_MODE__MASTER 0x0004 473 #define SIO_PDR_I2S_WS_CFG_DRIVE__MASTER 0x0008 474 #define SIO_PDR_I2S_WS_CFG_MODE__SLAVE 0x0004 475 #define SIO_PDR_I2S_WS_CFG_DRIVE__SLAVE 0x0000 476 477 /*============================================================================*/ 478 /*=== REGISTER ACCESS MACROS =================================================*/ 479 /*============================================================================*/ 480 481 /* 482 * This macro is used to create byte arrays for block writes. 483 * Block writes speed up I2C traffic between host and demod. 484 * The macro takes care of the required byte order in a 16 bits word. 485 * x -> lowbyte(x), highbyte(x) 486 */ 487 #define DRXJ_16TO8(x) ((u8) (((u16)x) & 0xFF)), \ 488 ((u8)((((u16)x)>>8)&0xFF)) 489 /* 490 * This macro is used to convert byte array to 16 bit register value for block read. 491 * Block read speed up I2C traffic between host and demod. 492 * The macro takes care of the required byte order in a 16 bits word. 493 */ 494 #define DRXJ_8TO16(x) ((u16) (x[0] | (x[1] << 8))) 495 496 /*============================================================================*/ 497 /*=== MISC DEFINES ===========================================================*/ 498 /*============================================================================*/ 499 500 /*============================================================================*/ 501 /*=== HI COMMAND RELATED DEFINES =============================================*/ 502 /*============================================================================*/ 503 504 /* 505 * \brief General maximum number of retries for ucode command interfaces 506 */ 507 #define DRXJ_MAX_RETRIES (100) 508 509 /*============================================================================*/ 510 /*=== STANDARD RELATED MACROS ================================================*/ 511 /*============================================================================*/ 512 513 #define DRXJ_ISATVSTD(std) ((std == DRX_STANDARD_PAL_SECAM_BG) || \ 514 (std == DRX_STANDARD_PAL_SECAM_DK) || \ 515 (std == DRX_STANDARD_PAL_SECAM_I) || \ 516 (std == DRX_STANDARD_PAL_SECAM_L) || \ 517 (std == DRX_STANDARD_PAL_SECAM_LP) || \ 518 (std == DRX_STANDARD_NTSC) || \ 519 (std == DRX_STANDARD_FM)) 520 521 #define DRXJ_ISQAMSTD(std) ((std == DRX_STANDARD_ITU_A) || \ 522 (std == DRX_STANDARD_ITU_B) || \ 523 (std == DRX_STANDARD_ITU_C) || \ 524 (std == DRX_STANDARD_ITU_D)) 525 526 /*----------------------------------------------------------------------------- 527 GLOBAL VARIABLES 528 ----------------------------------------------------------------------------*/ 529 /* 530 * DRXJ DAP structures 531 */ 532 533 static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr, 534 u32 addr, 535 u16 datasize, 536 u8 *data, u32 flags); 537 538 539 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr, 540 u32 waddr, 541 u32 raddr, 542 u16 wdata, u16 *rdata); 543 544 static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr, 545 u32 addr, 546 u16 *data, u32 flags); 547 548 static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr, 549 u32 addr, 550 u32 *data, u32 flags); 551 552 static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr, 553 u32 addr, 554 u16 datasize, 555 u8 *data, u32 flags); 556 557 static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr, 558 u32 addr, 559 u16 data, u32 flags); 560 561 static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr, 562 u32 addr, 563 u32 data, u32 flags); 564 565 static struct drxj_data drxj_data_g = { 566 false, /* has_lna : true if LNA (aka PGA) present */ 567 false, /* has_oob : true if OOB supported */ 568 false, /* has_ntsc: true if NTSC supported */ 569 false, /* has_btsc: true if BTSC supported */ 570 false, /* has_smatx: true if SMA_TX pin is available */ 571 false, /* has_smarx: true if SMA_RX pin is available */ 572 false, /* has_gpio : true if GPIO pin is available */ 573 false, /* has_irqn : true if IRQN pin is available */ 574 0, /* mfx A1/A2/A... */ 575 576 /* tuner settings */ 577 false, /* tuner mirrors RF signal */ 578 /* standard/channel settings */ 579 DRX_STANDARD_UNKNOWN, /* current standard */ 580 DRX_CONSTELLATION_AUTO, /* constellation */ 581 0, /* frequency in KHz */ 582 DRX_BANDWIDTH_UNKNOWN, /* curr_bandwidth */ 583 DRX_MIRROR_NO, /* mirror */ 584 585 /* signal quality information: */ 586 /* default values taken from the QAM Programming guide */ 587 /* fec_bits_desired should not be less than 4000000 */ 588 4000000, /* fec_bits_desired */ 589 5, /* fec_vd_plen */ 590 4, /* qam_vd_prescale */ 591 0xFFFF, /* qamVDPeriod */ 592 204 * 8, /* fec_rs_plen annex A */ 593 1, /* fec_rs_prescale */ 594 FEC_RS_MEASUREMENT_PERIOD, /* fec_rs_period */ 595 true, /* reset_pkt_err_acc */ 596 0, /* pkt_err_acc_start */ 597 598 /* HI configuration */ 599 0, /* hi_cfg_timing_div */ 600 0, /* hi_cfg_bridge_delay */ 601 0, /* hi_cfg_wake_up_key */ 602 0, /* hi_cfg_ctrl */ 603 0, /* HICfgTimeout */ 604 /* UIO configuration */ 605 DRX_UIO_MODE_DISABLE, /* uio_sma_rx_mode */ 606 DRX_UIO_MODE_DISABLE, /* uio_sma_tx_mode */ 607 DRX_UIO_MODE_DISABLE, /* uioASELMode */ 608 DRX_UIO_MODE_DISABLE, /* uio_irqn_mode */ 609 /* FS setting */ 610 0UL, /* iqm_fs_rate_ofs */ 611 false, /* pos_image */ 612 /* RC setting */ 613 0UL, /* iqm_rc_rate_ofs */ 614 /* AUD information */ 615 /* false, * flagSetAUDdone */ 616 /* false, * detectedRDS */ 617 /* true, * flagASDRequest */ 618 /* false, * flagHDevClear */ 619 /* false, * flagHDevSet */ 620 /* (u16) 0xFFF, * rdsLastCount */ 621 622 /* ATV configuration */ 623 0UL, /* flags cfg changes */ 624 /* shadow of ATV_TOP_EQU0__A */ 625 {-5, 626 ATV_TOP_EQU0_EQU_C0_FM, 627 ATV_TOP_EQU0_EQU_C0_L, 628 ATV_TOP_EQU0_EQU_C0_LP, 629 ATV_TOP_EQU0_EQU_C0_BG, 630 ATV_TOP_EQU0_EQU_C0_DK, 631 ATV_TOP_EQU0_EQU_C0_I}, 632 /* shadow of ATV_TOP_EQU1__A */ 633 {-50, 634 ATV_TOP_EQU1_EQU_C1_FM, 635 ATV_TOP_EQU1_EQU_C1_L, 636 ATV_TOP_EQU1_EQU_C1_LP, 637 ATV_TOP_EQU1_EQU_C1_BG, 638 ATV_TOP_EQU1_EQU_C1_DK, 639 ATV_TOP_EQU1_EQU_C1_I}, 640 /* shadow of ATV_TOP_EQU2__A */ 641 {210, 642 ATV_TOP_EQU2_EQU_C2_FM, 643 ATV_TOP_EQU2_EQU_C2_L, 644 ATV_TOP_EQU2_EQU_C2_LP, 645 ATV_TOP_EQU2_EQU_C2_BG, 646 ATV_TOP_EQU2_EQU_C2_DK, 647 ATV_TOP_EQU2_EQU_C2_I}, 648 /* shadow of ATV_TOP_EQU3__A */ 649 {-160, 650 ATV_TOP_EQU3_EQU_C3_FM, 651 ATV_TOP_EQU3_EQU_C3_L, 652 ATV_TOP_EQU3_EQU_C3_LP, 653 ATV_TOP_EQU3_EQU_C3_BG, 654 ATV_TOP_EQU3_EQU_C3_DK, 655 ATV_TOP_EQU3_EQU_C3_I}, 656 false, /* flag: true=bypass */ 657 ATV_TOP_VID_PEAK__PRE, /* shadow of ATV_TOP_VID_PEAK__A */ 658 ATV_TOP_NOISE_TH__PRE, /* shadow of ATV_TOP_NOISE_TH__A */ 659 true, /* flag CVBS output enable */ 660 false, /* flag SIF output 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 output */ 836 false, /* If true, insert RS byte */ 837 false, /* If true, parallel out otherwise serial */ 838 false, /* If true, invert DATA signals */ 839 false, /* If true, invert ERR signal */ 840 false, /* If true, invert STR signals */ 841 false, /* If true, invert VAL signals */ 842 false, /* If true, invert CLK signals */ 843 true, /* If true, static MPEG clockrate will 844 be used, otherwise clockrate will 845 adapt to the bitrate of the TS */ 846 19392658UL, /* Maximum bitrate in b/s in case 847 static clockrate is selected */ 848 DRX_MPEG_STR_WIDTH_1 /* MPEG Start width in clock cycles */ 849 }, 850 /* Initilisations below can be omitted, they require no user input and 851 are initially 0, NULL or false. The compiler will initialize them to these 852 values when omitted. */ 853 false, /* is_opened */ 854 855 /* SCAN */ 856 NULL, /* no scan params yet */ 857 0, /* current scan index */ 858 0, /* next scan frequency */ 859 false, /* scan ready flag */ 860 0, /* max channels to scan */ 861 0, /* nr of channels scanned */ 862 NULL, /* default scan function */ 863 NULL, /* default context pointer */ 864 0, /* millisec to wait for demod lock */ 865 DRXJ_DEMOD_LOCK, /* desired lock */ 866 false, 867 868 /* Power management */ 869 DRX_POWER_UP, 870 871 /* Tuner */ 872 1, /* nr of I2C port to which tuner is */ 873 0L, /* minimum RF input frequency, in kHz */ 874 0L, /* maximum RF input frequency, in kHz */ 875 false, /* Rf Agc Polarity */ 876 false, /* If Agc Polarity */ 877 false, /* tuner slow mode */ 878 879 { /* current channel (all 0) */ 880 0UL /* channel.frequency */ 881 }, 882 DRX_STANDARD_UNKNOWN, /* current standard */ 883 DRX_STANDARD_UNKNOWN, /* previous standard */ 884 DRX_STANDARD_UNKNOWN, /* di_cache_standard */ 885 false, /* use_bootloader */ 886 0UL, /* capabilities */ 887 0 /* mfx */ 888 }; 889 890 /* 891 * \var drxj_default_demod_g 892 * \brief Default drxj demodulator instance. 893 */ 894 static struct drx_demod_instance drxj_default_demod_g = { 895 &drxj_default_addr_g, /* i2c address & device id */ 896 &drxj_default_comm_attr_g, /* demod common attributes */ 897 &drxj_data_g /* demod device specific attributes */ 898 }; 899 900 /* 901 * \brief Default audio data structure for DRK demodulator instance. 902 * 903 * This structure is DRXK specific. 904 * 905 */ 906 static struct drx_aud_data drxj_default_aud_data_g = { 907 false, /* audio_is_active */ 908 DRX_AUD_STANDARD_AUTO, /* audio_standard */ 909 910 /* i2sdata */ 911 { 912 false, /* output_enable */ 913 48000, /* frequency */ 914 DRX_I2S_MODE_MASTER, /* mode */ 915 DRX_I2S_WORDLENGTH_32, /* word_length */ 916 DRX_I2S_POLARITY_RIGHT, /* polarity */ 917 DRX_I2S_FORMAT_WS_WITH_DATA /* format */ 918 }, 919 /* volume */ 920 { 921 true, /* mute; */ 922 0, /* volume */ 923 DRX_AUD_AVC_OFF, /* avc_mode */ 924 0, /* avc_ref_level */ 925 DRX_AUD_AVC_MAX_GAIN_12DB, /* avc_max_gain */ 926 DRX_AUD_AVC_MAX_ATTEN_24DB, /* avc_max_atten */ 927 0, /* strength_left */ 928 0 /* strength_right */ 929 }, 930 DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_ON, /* auto_sound */ 931 /* ass_thresholds */ 932 { 933 440, /* A2 */ 934 12, /* BTSC */ 935 700, /* NICAM */ 936 }, 937 /* carrier */ 938 { 939 /* a */ 940 { 941 42, /* thres */ 942 DRX_NO_CARRIER_NOISE, /* opt */ 943 0, /* shift */ 944 0 /* dco */ 945 }, 946 /* b */ 947 { 948 42, /* thres */ 949 DRX_NO_CARRIER_MUTE, /* opt */ 950 0, /* shift */ 951 0 /* dco */ 952 }, 953 954 }, 955 /* mixer */ 956 { 957 DRX_AUD_SRC_STEREO_OR_A, /* source_i2s */ 958 DRX_AUD_I2S_MATRIX_STEREO, /* matrix_i2s */ 959 DRX_AUD_FM_MATRIX_SOUND_A /* matrix_fm */ 960 }, 961 DRX_AUD_DEVIATION_NORMAL, /* deviation */ 962 DRX_AUD_AVSYNC_OFF, /* av_sync */ 963 964 /* prescale */ 965 { 966 DRX_AUD_MAX_FM_DEVIATION, /* fm_deviation */ 967 DRX_AUD_MAX_NICAM_PRESCALE /* nicam_gain */ 968 }, 969 DRX_AUD_FM_DEEMPH_75US, /* deemph */ 970 DRX_BTSC_STEREO, /* btsc_detect */ 971 0, /* rds_data_counter */ 972 false /* rds_data_present */ 973 }; 974 975 /*----------------------------------------------------------------------------- 976 STRUCTURES 977 ----------------------------------------------------------------------------*/ 978 struct drxjeq_stat { 979 u16 eq_mse; 980 u8 eq_mode; 981 u8 eq_ctrl; 982 u8 eq_stat; 983 }; 984 985 /* HI command */ 986 struct drxj_hi_cmd { 987 u16 cmd; 988 u16 param1; 989 u16 param2; 990 u16 param3; 991 u16 param4; 992 u16 param5; 993 u16 param6; 994 }; 995 996 /*============================================================================*/ 997 /*=== MICROCODE RELATED STRUCTURES ===========================================*/ 998 /*============================================================================*/ 999 1000 /* 1001 * struct drxu_code_block_hdr - Structure of the microcode block headers 1002 * 1003 * @addr: Destination address of the data in this block 1004 * @size: Size of the block data following this header counted in 1005 * 16 bits words 1006 * @CRC: CRC value of the data block, only valid if CRC flag is 1007 * set. 1008 */ 1009 struct drxu_code_block_hdr { 1010 u32 addr; 1011 u16 size; 1012 u16 flags; 1013 u16 CRC; 1014 }; 1015 1016 /*----------------------------------------------------------------------------- 1017 FUNCTIONS 1018 ----------------------------------------------------------------------------*/ 1019 /* Some prototypes */ 1020 static int 1021 hi_command(struct i2c_device_addr *dev_addr, 1022 const struct drxj_hi_cmd *cmd, u16 *result); 1023 1024 static int 1025 ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat); 1026 1027 static int 1028 ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode); 1029 1030 static int power_down_aud(struct drx_demod_instance *demod); 1031 1032 static int 1033 ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw); 1034 1035 static int 1036 ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain); 1037 1038 /*============================================================================*/ 1039 /*============================================================================*/ 1040 /*== HELPER FUNCTIONS ==*/ 1041 /*============================================================================*/ 1042 /*============================================================================*/ 1043 1044 1045 /*============================================================================*/ 1046 1047 /* 1048 * \fn u32 frac28(u32 N, u32 D) 1049 * \brief Compute: (1<<28)*N/D 1050 * \param N 32 bits 1051 * \param D 32 bits 1052 * \return (1<<28)*N/D 1053 * This function is used to avoid floating-point calculations as they may 1054 * not be present on the target platform. 1055 1056 * frac28 performs an unsigned 28/28 bits division to 32-bit fixed point 1057 * fraction used for setting the Frequency Shifter registers. 1058 * N and D can hold numbers up to width: 28-bits. 1059 * The 4 bits integer part and the 28 bits fractional part are calculated. 1060 1061 * Usage condition: ((1<<28)*n)/d < ((1<<32)-1) => (n/d) < 15.999 1062 1063 * N: 0...(1<<28)-1 = 268435454 1064 * D: 0...(1<<28)-1 1065 * Q: 0...(1<<32)-1 1066 */ 1067 static u32 frac28(u32 N, u32 D) 1068 { 1069 int i = 0; 1070 u32 Q1 = 0; 1071 u32 R0 = 0; 1072 1073 R0 = (N % D) << 4; /* 32-28 == 4 shifts possible at max */ 1074 Q1 = N / D; /* integer part, only the 4 least significant bits 1075 will be visible in the result */ 1076 1077 /* division using radix 16, 7 nibbles in the result */ 1078 for (i = 0; i < 7; i++) { 1079 Q1 = (Q1 << 4) | R0 / D; 1080 R0 = (R0 % D) << 4; 1081 } 1082 /* rounding */ 1083 if ((R0 >> 3) >= D) 1084 Q1++; 1085 1086 return Q1; 1087 } 1088 1089 /* 1090 * \fn u32 log1_times100( u32 x) 1091 * \brief Compute: 100*log10(x) 1092 * \param x 32 bits 1093 * \return 100*log10(x) 1094 * 1095 * 100*log10(x) 1096 * = 100*(log2(x)/log2(10))) 1097 * = (100*(2^15)*log2(x))/((2^15)*log2(10)) 1098 * = ((200*(2^15)*log2(x))/((2^15)*log2(10)))/2 1099 * = ((200*(2^15)*(log2(x/y)+log2(y)))/((2^15)*log2(10)))/2 1100 * = ((200*(2^15)*log2(x/y))+(200*(2^15)*log2(y)))/((2^15)*log2(10)))/2 1101 * 1102 * where y = 2^k and 1<= (x/y) < 2 1103 */ 1104 1105 static u32 log1_times100(u32 x) 1106 { 1107 static const u8 scale = 15; 1108 static const u8 index_width = 5; 1109 /* 1110 log2lut[n] = (1<<scale) * 200 * log2( 1.0 + ( (1.0/(1<<INDEXWIDTH)) * n )) 1111 0 <= n < ((1<<INDEXWIDTH)+1) 1112 */ 1113 1114 static const u32 log2lut[] = { 1115 0, /* 0.000000 */ 1116 290941, /* 290941.300628 */ 1117 573196, /* 573196.476418 */ 1118 847269, /* 847269.179851 */ 1119 1113620, /* 1113620.489452 */ 1120 1372674, /* 1372673.576986 */ 1121 1624818, /* 1624817.752104 */ 1122 1870412, /* 1870411.981536 */ 1123 2109788, /* 2109787.962654 */ 1124 2343253, /* 2343252.817465 */ 1125 2571091, /* 2571091.461923 */ 1126 2793569, /* 2793568.696416 */ 1127 3010931, /* 3010931.055901 */ 1128 3223408, /* 3223408.452106 */ 1129 3431216, /* 3431215.635215 */ 1130 3634553, /* 3634553.498355 */ 1131 3833610, /* 3833610.244726 */ 1132 4028562, /* 4028562.434393 */ 1133 4219576, /* 4219575.925308 */ 1134 4406807, /* 4406806.721144 */ 1135 4590402, /* 4590401.736809 */ 1136 4770499, /* 4770499.491025 */ 1137 4947231, /* 4947230.734179 */ 1138 5120719, /* 5120719.018555 */ 1139 5291081, /* 5291081.217197 */ 1140 5458428, /* 5458427.996830 */ 1141 5622864, /* 5622864.249668 */ 1142 5784489, /* 5784489.488298 */ 1143 5943398, /* 5943398.207380 */ 1144 6099680, /* 6099680.215452 */ 1145 6253421, /* 6253420.939751 */ 1146 6404702, /* 6404701.706649 */ 1147 6553600, /* 6553600.000000 */ 1148 }; 1149 1150 u8 i = 0; 1151 u32 y = 0; 1152 u32 d = 0; 1153 u32 k = 0; 1154 u32 r = 0; 1155 1156 if (x == 0) 1157 return 0; 1158 1159 /* Scale x (normalize) */ 1160 /* computing y in log(x/y) = log(x) - log(y) */ 1161 if ((x & (((u32) (-1)) << (scale + 1))) == 0) { 1162 for (k = scale; k > 0; k--) { 1163 if (x & (((u32) 1) << scale)) 1164 break; 1165 x <<= 1; 1166 } 1167 } else { 1168 for (k = scale; k < 31; k++) { 1169 if ((x & (((u32) (-1)) << (scale + 1))) == 0) 1170 break; 1171 x >>= 1; 1172 } 1173 } 1174 /* 1175 Now x has binary point between bit[scale] and bit[scale-1] 1176 and 1.0 <= x < 2.0 */ 1177 1178 /* correction for division: log(x) = log(x/y)+log(y) */ 1179 y = k * ((((u32) 1) << scale) * 200); 1180 1181 /* remove integer part */ 1182 x &= ((((u32) 1) << scale) - 1); 1183 /* get index */ 1184 i = (u8) (x >> (scale - index_width)); 1185 /* compute delta (x-a) */ 1186 d = x & ((((u32) 1) << (scale - index_width)) - 1); 1187 /* compute log, multiplication ( d* (.. )) must be within range ! */ 1188 y += log2lut[i] + 1189 ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - index_width)); 1190 /* Conver to log10() */ 1191 y /= 108853; /* (log2(10) << scale) */ 1192 r = (y >> 1); 1193 /* rounding */ 1194 if (y & ((u32)1)) 1195 r++; 1196 1197 return r; 1198 1199 } 1200 1201 /* 1202 * \fn u32 frac_times1e6( u16 N, u32 D) 1203 * \brief Compute: (N/D) * 1000000. 1204 * \param N nominator 16-bits. 1205 * \param D denominator 32-bits. 1206 * \return u32 1207 * \retval ((N/D) * 1000000), 32 bits 1208 * 1209 * No check on D=0! 1210 */ 1211 static u32 frac_times1e6(u32 N, u32 D) 1212 { 1213 u32 remainder = 0; 1214 u32 frac = 0; 1215 1216 /* 1217 frac = (N * 1000000) / D 1218 To let it fit in a 32 bits computation: 1219 frac = (N * (1000000 >> 4)) / (D >> 4) 1220 This would result in a problem in case D < 16 (div by 0). 1221 So we do it more elaborate as shown below. 1222 */ 1223 frac = (((u32) N) * (1000000 >> 4)) / D; 1224 frac <<= 4; 1225 remainder = (((u32) N) * (1000000 >> 4)) % D; 1226 remainder <<= 4; 1227 frac += remainder / D; 1228 remainder = remainder % D; 1229 if ((remainder * 2) > D) 1230 frac++; 1231 1232 return frac; 1233 } 1234 1235 /*============================================================================*/ 1236 1237 1238 /* 1239 * \brief Values for NICAM prescaler gain. Computed from dB to integer 1240 * and rounded. For calc used formula: 16*10^(prescaleGain[dB]/20). 1241 * 1242 */ 1243 #if 0 1244 /* Currently, unused as we lack support for analog TV */ 1245 static const u16 nicam_presc_table_val[43] = { 1246 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 1247 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16, 1248 18, 20, 23, 25, 28, 32, 36, 40, 45, 1249 51, 57, 64, 71, 80, 90, 101, 113, 127 1250 }; 1251 #endif 1252 1253 /*============================================================================*/ 1254 /*== END HELPER FUNCTIONS ==*/ 1255 /*============================================================================*/ 1256 1257 /*============================================================================*/ 1258 /*============================================================================*/ 1259 /*== DRXJ DAP FUNCTIONS ==*/ 1260 /*============================================================================*/ 1261 /*============================================================================*/ 1262 1263 /* 1264 This layer takes care of some device specific register access protocols: 1265 -conversion to short address format 1266 -access to audio block 1267 This layer is placed between the drx_dap_fasi and the rest of the drxj 1268 specific implementation. This layer can use address map knowledge whereas 1269 dap_fasi may not use memory map knowledge. 1270 1271 * For audio currently only 16 bits read and write register access is 1272 supported. More is not needed. RMW and 32 or 8 bit access on audio 1273 registers will have undefined behaviour. Flags (RMW, CRC reset, broadcast 1274 single/multi master) will be ignored. 1275 1276 TODO: check ignoring single/multimaster is ok for AUD access ? 1277 */ 1278 1279 #define DRXJ_ISAUDWRITE(addr) (((((addr)>>16)&1) == 1) ? true : false) 1280 #define DRXJ_DAP_AUDTRIF_TIMEOUT 80 /* millisec */ 1281 /*============================================================================*/ 1282 1283 /* 1284 * \fn bool is_handled_by_aud_tr_if( u32 addr ) 1285 * \brief Check if this address is handled by the audio token ring interface. 1286 * \param addr 1287 * \return bool 1288 * \retval true Yes, handled by audio token ring interface 1289 * \retval false No, not handled by audio token ring interface 1290 * 1291 */ 1292 static 1293 bool is_handled_by_aud_tr_if(u32 addr) 1294 { 1295 bool retval = false; 1296 1297 if ((DRXDAP_FASI_ADDR2BLOCK(addr) == 4) && 1298 (DRXDAP_FASI_ADDR2BANK(addr) > 1) && 1299 (DRXDAP_FASI_ADDR2BANK(addr) < 6)) { 1300 retval = true; 1301 } 1302 1303 return retval; 1304 } 1305 1306 /*============================================================================*/ 1307 1308 int drxbsp_i2c_write_read(struct i2c_device_addr *w_dev_addr, 1309 u16 w_count, 1310 u8 *wData, 1311 struct i2c_device_addr *r_dev_addr, 1312 u16 r_count, u8 *r_data) 1313 { 1314 struct drx39xxj_state *state; 1315 struct i2c_msg msg[2]; 1316 unsigned int num_msgs; 1317 1318 if (w_dev_addr == NULL) { 1319 /* Read only */ 1320 state = r_dev_addr->user_data; 1321 msg[0].addr = r_dev_addr->i2c_addr >> 1; 1322 msg[0].flags = I2C_M_RD; 1323 msg[0].buf = r_data; 1324 msg[0].len = r_count; 1325 num_msgs = 1; 1326 } else if (r_dev_addr == NULL) { 1327 /* Write only */ 1328 state = w_dev_addr->user_data; 1329 msg[0].addr = w_dev_addr->i2c_addr >> 1; 1330 msg[0].flags = 0; 1331 msg[0].buf = wData; 1332 msg[0].len = w_count; 1333 num_msgs = 1; 1334 } else { 1335 /* Both write and read */ 1336 state = w_dev_addr->user_data; 1337 msg[0].addr = w_dev_addr->i2c_addr >> 1; 1338 msg[0].flags = 0; 1339 msg[0].buf = wData; 1340 msg[0].len = w_count; 1341 msg[1].addr = r_dev_addr->i2c_addr >> 1; 1342 msg[1].flags = I2C_M_RD; 1343 msg[1].buf = r_data; 1344 msg[1].len = r_count; 1345 num_msgs = 2; 1346 } 1347 1348 if (state->i2c == NULL) { 1349 pr_err("i2c was zero, aborting\n"); 1350 return 0; 1351 } 1352 if (i2c_transfer(state->i2c, msg, num_msgs) != num_msgs) { 1353 pr_warn("drx3933: I2C write/read failed\n"); 1354 return -EREMOTEIO; 1355 } 1356 1357 #ifdef DJH_DEBUG 1358 if (w_dev_addr == NULL || r_dev_addr == NULL) 1359 return 0; 1360 1361 state = w_dev_addr->user_data; 1362 1363 if (state->i2c == NULL) 1364 return 0; 1365 1366 msg[0].addr = w_dev_addr->i2c_addr; 1367 msg[0].flags = 0; 1368 msg[0].buf = wData; 1369 msg[0].len = w_count; 1370 msg[1].addr = r_dev_addr->i2c_addr; 1371 msg[1].flags = I2C_M_RD; 1372 msg[1].buf = r_data; 1373 msg[1].len = r_count; 1374 num_msgs = 2; 1375 1376 pr_debug("drx3933 i2c operation addr=%x i2c=%p, wc=%x rc=%x\n", 1377 w_dev_addr->i2c_addr, state->i2c, w_count, r_count); 1378 1379 if (i2c_transfer(state->i2c, msg, 2) != 2) { 1380 pr_warn("drx3933: I2C write/read failed\n"); 1381 return -EREMOTEIO; 1382 } 1383 #endif 1384 return 0; 1385 } 1386 1387 /*============================================================================*/ 1388 1389 /***************************** 1390 * 1391 * int drxdap_fasi_read_block ( 1392 * struct i2c_device_addr *dev_addr, -- address of I2C device 1393 * u32 addr, -- address of chip register/memory 1394 * u16 datasize, -- number of bytes to read 1395 * u8 *data, -- data to receive 1396 * u32 flags) -- special device flags 1397 * 1398 * Read block data from chip address. Because the chip is word oriented, 1399 * the number of bytes to read must be even. 1400 * 1401 * Make sure that the buffer to receive the data is large enough. 1402 * 1403 * Although this function expects an even number of bytes, it is still byte 1404 * oriented, and the data read back is NOT translated to the endianness of 1405 * the target platform. 1406 * 1407 * Output: 1408 * - 0 if reading was successful 1409 * in that case: data read is in *data. 1410 * - -EIO if anything went wrong 1411 * 1412 ******************************/ 1413 1414 static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr, 1415 u32 addr, 1416 u16 datasize, 1417 u8 *data, u32 flags) 1418 { 1419 u8 buf[4]; 1420 u16 bufx; 1421 int rc; 1422 u16 overhead_size = 0; 1423 1424 /* Check parameters ******************************************************* */ 1425 if (dev_addr == NULL) 1426 return -EINVAL; 1427 1428 overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) + 1429 (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2); 1430 1431 if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) || 1432 ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) && 1433 DRXDAP_FASI_LONG_FORMAT(addr)) || 1434 (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) || 1435 ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1)) { 1436 return -EINVAL; 1437 } 1438 1439 /* ReadModifyWrite & mode flag bits are not allowed */ 1440 flags &= (~DRXDAP_FASI_RMW & ~DRXDAP_FASI_MODEFLAGS); 1441 #if DRXDAP_SINGLE_MASTER 1442 flags |= DRXDAP_FASI_SINGLE_MASTER; 1443 #endif 1444 1445 /* Read block from I2C **************************************************** */ 1446 do { 1447 u16 todo = (datasize < DRXDAP_MAX_RCHUNKSIZE ? 1448 datasize : DRXDAP_MAX_RCHUNKSIZE); 1449 1450 bufx = 0; 1451 1452 addr &= ~DRXDAP_FASI_FLAGS; 1453 addr |= flags; 1454 1455 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)) 1456 /* short format address preferred but long format otherwise */ 1457 if (DRXDAP_FASI_LONG_FORMAT(addr)) { 1458 #endif 1459 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1) 1460 buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01); 1461 buf[bufx++] = (u8) ((addr >> 16) & 0xFF); 1462 buf[bufx++] = (u8) ((addr >> 24) & 0xFF); 1463 buf[bufx++] = (u8) ((addr >> 7) & 0xFF); 1464 #endif 1465 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)) 1466 } else { 1467 #endif 1468 #if (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1) 1469 buf[bufx++] = (u8) ((addr << 1) & 0xFF); 1470 buf[bufx++] = 1471 (u8) (((addr >> 16) & 0x0F) | 1472 ((addr >> 18) & 0xF0)); 1473 #endif 1474 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)) 1475 } 1476 #endif 1477 1478 #if DRXDAP_SINGLE_MASTER 1479 /* 1480 * In single master mode, split the read and write actions. 1481 * No special action is needed for write chunks here. 1482 */ 1483 rc = drxbsp_i2c_write_read(dev_addr, bufx, buf, 1484 NULL, 0, NULL); 1485 if (rc == 0) 1486 rc = drxbsp_i2c_write_read(NULL, 0, NULL, dev_addr, todo, data); 1487 #else 1488 /* In multi master mode, do everything in one RW action */ 1489 rc = drxbsp_i2c_write_read(dev_addr, bufx, buf, dev_addr, todo, 1490 data); 1491 #endif 1492 data += todo; 1493 addr += (todo >> 1); 1494 datasize -= todo; 1495 } while (datasize && rc == 0); 1496 1497 return rc; 1498 } 1499 1500 1501 /***************************** 1502 * 1503 * int drxdap_fasi_read_reg16 ( 1504 * struct i2c_device_addr *dev_addr, -- address of I2C device 1505 * u32 addr, -- address of chip register/memory 1506 * u16 *data, -- data to receive 1507 * u32 flags) -- special device flags 1508 * 1509 * Read one 16-bit register or memory location. The data received back is 1510 * converted back to the target platform's endianness. 1511 * 1512 * Output: 1513 * - 0 if reading was successful 1514 * in that case: read data is at *data 1515 * - -EIO if anything went wrong 1516 * 1517 ******************************/ 1518 1519 static int drxdap_fasi_read_reg16(struct i2c_device_addr *dev_addr, 1520 u32 addr, 1521 u16 *data, u32 flags) 1522 { 1523 u8 buf[sizeof(*data)]; 1524 int rc; 1525 1526 if (!data) 1527 return -EINVAL; 1528 1529 rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags); 1530 *data = buf[0] + (((u16) buf[1]) << 8); 1531 return rc; 1532 } 1533 1534 /***************************** 1535 * 1536 * int drxdap_fasi_read_reg32 ( 1537 * struct i2c_device_addr *dev_addr, -- address of I2C device 1538 * u32 addr, -- address of chip register/memory 1539 * u32 *data, -- data to receive 1540 * u32 flags) -- special device flags 1541 * 1542 * Read one 32-bit register or memory location. The data received back is 1543 * converted back to the target platform's endianness. 1544 * 1545 * Output: 1546 * - 0 if reading was successful 1547 * in that case: read data is at *data 1548 * - -EIO if anything went wrong 1549 * 1550 ******************************/ 1551 1552 static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr, 1553 u32 addr, 1554 u32 *data, u32 flags) 1555 { 1556 u8 buf[sizeof(*data)]; 1557 int rc; 1558 1559 if (!data) 1560 return -EINVAL; 1561 1562 rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags); 1563 *data = (((u32) buf[0]) << 0) + 1564 (((u32) buf[1]) << 8) + 1565 (((u32) buf[2]) << 16) + (((u32) buf[3]) << 24); 1566 return rc; 1567 } 1568 1569 /***************************** 1570 * 1571 * int drxdap_fasi_write_block ( 1572 * struct i2c_device_addr *dev_addr, -- address of I2C device 1573 * u32 addr, -- address of chip register/memory 1574 * u16 datasize, -- number of bytes to read 1575 * u8 *data, -- data to receive 1576 * u32 flags) -- special device flags 1577 * 1578 * Write block data to chip address. Because the chip is word oriented, 1579 * the number of bytes to write must be even. 1580 * 1581 * Although this function expects an even number of bytes, it is still byte 1582 * oriented, and the data being written is NOT translated from the endianness of 1583 * the target platform. 1584 * 1585 * Output: 1586 * - 0 if writing was successful 1587 * - -EIO if anything went wrong 1588 * 1589 ******************************/ 1590 1591 static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr, 1592 u32 addr, 1593 u16 datasize, 1594 u8 *data, u32 flags) 1595 { 1596 u8 buf[DRXDAP_MAX_WCHUNKSIZE]; 1597 int st = -EIO; 1598 int first_err = 0; 1599 u16 overhead_size = 0; 1600 u16 block_size = 0; 1601 1602 /* Check parameters ******************************************************* */ 1603 if (dev_addr == NULL) 1604 return -EINVAL; 1605 1606 overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) + 1607 (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2); 1608 1609 if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) || 1610 ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) && 1611 DRXDAP_FASI_LONG_FORMAT(addr)) || 1612 (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) || 1613 ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1)) 1614 return -EINVAL; 1615 1616 flags &= DRXDAP_FASI_FLAGS; 1617 flags &= ~DRXDAP_FASI_MODEFLAGS; 1618 #if DRXDAP_SINGLE_MASTER 1619 flags |= DRXDAP_FASI_SINGLE_MASTER; 1620 #endif 1621 1622 /* Write block to I2C ***************************************************** */ 1623 block_size = ((DRXDAP_MAX_WCHUNKSIZE) - overhead_size) & ~1; 1624 do { 1625 u16 todo = 0; 1626 u16 bufx = 0; 1627 1628 /* Buffer device address */ 1629 addr &= ~DRXDAP_FASI_FLAGS; 1630 addr |= flags; 1631 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1)) 1632 /* short format address preferred but long format otherwise */ 1633 if (DRXDAP_FASI_LONG_FORMAT(addr)) { 1634 #endif 1635 #if ((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) 1636 buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01); 1637 buf[bufx++] = (u8) ((addr >> 16) & 0xFF); 1638 buf[bufx++] = (u8) ((addr >> 24) & 0xFF); 1639 buf[bufx++] = (u8) ((addr >> 7) & 0xFF); 1640 #endif 1641 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1)) 1642 } else { 1643 #endif 1644 #if ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1) 1645 buf[bufx++] = (u8) ((addr << 1) & 0xFF); 1646 buf[bufx++] = 1647 (u8) (((addr >> 16) & 0x0F) | 1648 ((addr >> 18) & 0xF0)); 1649 #endif 1650 #if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1)) 1651 } 1652 #endif 1653 1654 /* 1655 In single master mode block_size can be 0. In such a case this I2C 1656 sequense will be visible: (1) write address {i2c addr, 1657 4 bytes chip address} (2) write data {i2c addr, 4 bytes data } 1658 (3) write address (4) write data etc... 1659 Address must be rewritten because HI is reset after data transport and 1660 expects an address. 1661 */ 1662 todo = (block_size < datasize ? block_size : datasize); 1663 if (todo == 0) { 1664 u16 overhead_size_i2c_addr = 0; 1665 u16 data_block_size = 0; 1666 1667 overhead_size_i2c_addr = 1668 (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1); 1669 data_block_size = 1670 (DRXDAP_MAX_WCHUNKSIZE - overhead_size_i2c_addr) & ~1; 1671 1672 /* write device address */ 1673 st = drxbsp_i2c_write_read(dev_addr, 1674 (u16) (bufx), 1675 buf, 1676 (struct i2c_device_addr *)(NULL), 1677 0, (u8 *)(NULL)); 1678 1679 if ((st != 0) && (first_err == 0)) { 1680 /* at the end, return the first error encountered */ 1681 first_err = st; 1682 } 1683 bufx = 0; 1684 todo = 1685 (data_block_size < 1686 datasize ? data_block_size : datasize); 1687 } 1688 memcpy(&buf[bufx], data, todo); 1689 /* write (address if can do and) data */ 1690 st = drxbsp_i2c_write_read(dev_addr, 1691 (u16) (bufx + todo), 1692 buf, 1693 (struct i2c_device_addr *)(NULL), 1694 0, (u8 *)(NULL)); 1695 1696 if ((st != 0) && (first_err == 0)) { 1697 /* at the end, return the first error encountered */ 1698 first_err = st; 1699 } 1700 datasize -= todo; 1701 data += todo; 1702 addr += (todo >> 1); 1703 } while (datasize); 1704 1705 return first_err; 1706 } 1707 1708 /***************************** 1709 * 1710 * int drxdap_fasi_write_reg16 ( 1711 * struct i2c_device_addr *dev_addr, -- address of I2C device 1712 * u32 addr, -- address of chip register/memory 1713 * u16 data, -- data to send 1714 * u32 flags) -- special device flags 1715 * 1716 * Write one 16-bit register or memory location. The data being written is 1717 * converted from the target platform's endianness to little endian. 1718 * 1719 * Output: 1720 * - 0 if writing was successful 1721 * - -EIO if anything went wrong 1722 * 1723 ******************************/ 1724 1725 static int drxdap_fasi_write_reg16(struct i2c_device_addr *dev_addr, 1726 u32 addr, 1727 u16 data, u32 flags) 1728 { 1729 u8 buf[sizeof(data)]; 1730 1731 buf[0] = (u8) ((data >> 0) & 0xFF); 1732 buf[1] = (u8) ((data >> 8) & 0xFF); 1733 1734 return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags); 1735 } 1736 1737 /***************************** 1738 * 1739 * int drxdap_fasi_read_modify_write_reg16 ( 1740 * struct i2c_device_addr *dev_addr, -- address of I2C device 1741 * u32 waddr, -- address of chip register/memory 1742 * u32 raddr, -- chip address to read back from 1743 * u16 wdata, -- data to send 1744 * u16 *rdata) -- data to receive back 1745 * 1746 * Write 16-bit data, then read back the original contents of that location. 1747 * Requires long addressing format to be allowed. 1748 * 1749 * Before sending data, the data is converted to little endian. The 1750 * data received back is converted back to the target platform's endianness. 1751 * 1752 * WARNING: This function is only guaranteed to work if there is one 1753 * master on the I2C bus. 1754 * 1755 * Output: 1756 * - 0 if reading was successful 1757 * in that case: read back data is at *rdata 1758 * - -EIO if anything went wrong 1759 * 1760 ******************************/ 1761 1762 static int drxdap_fasi_read_modify_write_reg16(struct i2c_device_addr *dev_addr, 1763 u32 waddr, 1764 u32 raddr, 1765 u16 wdata, u16 *rdata) 1766 { 1767 int rc = -EIO; 1768 1769 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1) 1770 if (rdata == NULL) 1771 return -EINVAL; 1772 1773 rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata, DRXDAP_FASI_RMW); 1774 if (rc == 0) 1775 rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata, 0); 1776 #endif 1777 1778 return rc; 1779 } 1780 1781 /***************************** 1782 * 1783 * int drxdap_fasi_write_reg32 ( 1784 * struct i2c_device_addr *dev_addr, -- address of I2C device 1785 * u32 addr, -- address of chip register/memory 1786 * u32 data, -- data to send 1787 * u32 flags) -- special device flags 1788 * 1789 * Write one 32-bit register or memory location. The data being written is 1790 * converted from the target platform's endianness to little endian. 1791 * 1792 * Output: 1793 * - 0 if writing was successful 1794 * - -EIO if anything went wrong 1795 * 1796 ******************************/ 1797 1798 static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr, 1799 u32 addr, 1800 u32 data, u32 flags) 1801 { 1802 u8 buf[sizeof(data)]; 1803 1804 buf[0] = (u8) ((data >> 0) & 0xFF); 1805 buf[1] = (u8) ((data >> 8) & 0xFF); 1806 buf[2] = (u8) ((data >> 16) & 0xFF); 1807 buf[3] = (u8) ((data >> 24) & 0xFF); 1808 1809 return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags); 1810 } 1811 1812 /*============================================================================*/ 1813 1814 /* 1815 * \fn int drxj_dap_rm_write_reg16short 1816 * \brief Read modify write 16 bits audio register using short format only. 1817 * \param dev_addr 1818 * \param waddr Address to write to 1819 * \param raddr Address to read from (usually SIO_HI_RA_RAM_S0_RMWBUF__A) 1820 * \param wdata Data to write 1821 * \param rdata Buffer for data to read 1822 * \return int 1823 * \retval 0 Success 1824 * \retval -EIO Timeout, I2C error, illegal bank 1825 * 1826 * 16 bits register read modify write access using short addressing format only. 1827 * Requires knowledge of the registermap, thus device dependent. 1828 * Using DAP FASI directly to avoid endless recursion of RMWs to audio registers. 1829 * 1830 */ 1831 1832 /* TODO correct define should be #if ( DRXDAPFASI_SHORT_ADDR_ALLOWED==1 ) 1833 See comments drxj_dap_read_modify_write_reg16 */ 1834 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 0) 1835 static int drxj_dap_rm_write_reg16short(struct i2c_device_addr *dev_addr, 1836 u32 waddr, 1837 u32 raddr, 1838 u16 wdata, u16 *rdata) 1839 { 1840 int rc; 1841 1842 if (rdata == NULL) 1843 return -EINVAL; 1844 1845 /* Set RMW flag */ 1846 rc = drxdap_fasi_write_reg16(dev_addr, 1847 SIO_HI_RA_RAM_S0_FLG_ACC__A, 1848 SIO_HI_RA_RAM_S0_FLG_ACC_S0_RWM__M, 1849 0x0000); 1850 if (rc == 0) { 1851 /* Write new data: triggers RMW */ 1852 rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata, 1853 0x0000); 1854 } 1855 if (rc == 0) { 1856 /* Read old data */ 1857 rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata, 1858 0x0000); 1859 } 1860 if (rc == 0) { 1861 /* Reset RMW flag */ 1862 rc = drxdap_fasi_write_reg16(dev_addr, 1863 SIO_HI_RA_RAM_S0_FLG_ACC__A, 1864 0, 0x0000); 1865 } 1866 1867 return rc; 1868 } 1869 #endif 1870 1871 /*============================================================================*/ 1872 1873 static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr, 1874 u32 waddr, 1875 u32 raddr, 1876 u16 wdata, u16 *rdata) 1877 { 1878 /* TODO: correct short/long addressing format decision, 1879 now long format has higher prio then short because short also 1880 needs virt bnks (not impl yet) for certain audio registers */ 1881 #if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1) 1882 return drxdap_fasi_read_modify_write_reg16(dev_addr, 1883 waddr, 1884 raddr, wdata, rdata); 1885 #else 1886 return drxj_dap_rm_write_reg16short(dev_addr, waddr, raddr, wdata, rdata); 1887 #endif 1888 } 1889 1890 1891 /*============================================================================*/ 1892 1893 /* 1894 * \fn int drxj_dap_read_aud_reg16 1895 * \brief Read 16 bits audio register 1896 * \param dev_addr 1897 * \param addr 1898 * \param data 1899 * \return int 1900 * \retval 0 Success 1901 * \retval -EIO Timeout, I2C error, illegal bank 1902 * 1903 * 16 bits register read access via audio token ring interface. 1904 * 1905 */ 1906 static int drxj_dap_read_aud_reg16(struct i2c_device_addr *dev_addr, 1907 u32 addr, u16 *data) 1908 { 1909 u32 start_timer = 0; 1910 u32 current_timer = 0; 1911 u32 delta_timer = 0; 1912 u16 tr_status = 0; 1913 int stat = -EIO; 1914 1915 /* No read possible for bank 3, return with error */ 1916 if (DRXDAP_FASI_ADDR2BANK(addr) == 3) { 1917 stat = -EINVAL; 1918 } else { 1919 const u32 write_bit = ((dr_xaddr_t) 1) << 16; 1920 1921 /* Force reset write bit */ 1922 addr &= (~write_bit); 1923 1924 /* Set up read */ 1925 start_timer = jiffies_to_msecs(jiffies); 1926 do { 1927 /* RMW to aud TR IF until request is granted or timeout */ 1928 stat = drxj_dap_read_modify_write_reg16(dev_addr, 1929 addr, 1930 SIO_HI_RA_RAM_S0_RMWBUF__A, 1931 0x0000, &tr_status); 1932 1933 if (stat != 0) 1934 break; 1935 1936 current_timer = jiffies_to_msecs(jiffies); 1937 delta_timer = current_timer - start_timer; 1938 if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) { 1939 stat = -EIO; 1940 break; 1941 } 1942 1943 } while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) == 1944 AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) || 1945 ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) == 1946 AUD_TOP_TR_CTR_FIFO_FULL_FULL)); 1947 } /* if ( DRXDAP_FASI_ADDR2BANK(addr)!=3 ) */ 1948 1949 /* Wait for read ready status or timeout */ 1950 if (stat == 0) { 1951 start_timer = jiffies_to_msecs(jiffies); 1952 1953 while ((tr_status & AUD_TOP_TR_CTR_FIFO_RD_RDY__M) != 1954 AUD_TOP_TR_CTR_FIFO_RD_RDY_READY) { 1955 stat = drxj_dap_read_reg16(dev_addr, 1956 AUD_TOP_TR_CTR__A, 1957 &tr_status, 0x0000); 1958 if (stat != 0) 1959 break; 1960 1961 current_timer = jiffies_to_msecs(jiffies); 1962 delta_timer = current_timer - start_timer; 1963 if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) { 1964 stat = -EIO; 1965 break; 1966 } 1967 } /* while ( ... ) */ 1968 } 1969 1970 /* Read value */ 1971 if (stat == 0) 1972 stat = drxj_dap_read_modify_write_reg16(dev_addr, 1973 AUD_TOP_TR_RD_REG__A, 1974 SIO_HI_RA_RAM_S0_RMWBUF__A, 1975 0x0000, data); 1976 return stat; 1977 } 1978 1979 /*============================================================================*/ 1980 1981 static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr, 1982 u32 addr, 1983 u16 *data, u32 flags) 1984 { 1985 int stat = -EIO; 1986 1987 /* Check param */ 1988 if ((dev_addr == NULL) || (data == NULL)) 1989 return -EINVAL; 1990 1991 if (is_handled_by_aud_tr_if(addr)) 1992 stat = drxj_dap_read_aud_reg16(dev_addr, addr, data); 1993 else 1994 stat = drxdap_fasi_read_reg16(dev_addr, addr, data, flags); 1995 1996 return stat; 1997 } 1998 /*============================================================================*/ 1999 2000 /* 2001 * \fn int drxj_dap_write_aud_reg16 2002 * \brief Write 16 bits audio register 2003 * \param dev_addr 2004 * \param addr 2005 * \param data 2006 * \return int 2007 * \retval 0 Success 2008 * \retval -EIO Timeout, I2C error, illegal bank 2009 * 2010 * 16 bits register write access via audio token ring interface. 2011 * 2012 */ 2013 static int drxj_dap_write_aud_reg16(struct i2c_device_addr *dev_addr, 2014 u32 addr, u16 data) 2015 { 2016 int stat = -EIO; 2017 2018 /* No write possible for bank 2, return with error */ 2019 if (DRXDAP_FASI_ADDR2BANK(addr) == 2) { 2020 stat = -EINVAL; 2021 } else { 2022 u32 start_timer = 0; 2023 u32 current_timer = 0; 2024 u32 delta_timer = 0; 2025 u16 tr_status = 0; 2026 const u32 write_bit = ((dr_xaddr_t) 1) << 16; 2027 2028 /* Force write bit */ 2029 addr |= write_bit; 2030 start_timer = jiffies_to_msecs(jiffies); 2031 do { 2032 /* RMW to aud TR IF until request is granted or timeout */ 2033 stat = drxj_dap_read_modify_write_reg16(dev_addr, 2034 addr, 2035 SIO_HI_RA_RAM_S0_RMWBUF__A, 2036 data, &tr_status); 2037 if (stat != 0) 2038 break; 2039 2040 current_timer = jiffies_to_msecs(jiffies); 2041 delta_timer = current_timer - start_timer; 2042 if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) { 2043 stat = -EIO; 2044 break; 2045 } 2046 2047 } while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) == 2048 AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) || 2049 ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) == 2050 AUD_TOP_TR_CTR_FIFO_FULL_FULL)); 2051 2052 } /* if ( DRXDAP_FASI_ADDR2BANK(addr)!=2 ) */ 2053 2054 return stat; 2055 } 2056 2057 /*============================================================================*/ 2058 2059 static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr, 2060 u32 addr, 2061 u16 data, u32 flags) 2062 { 2063 int stat = -EIO; 2064 2065 /* Check param */ 2066 if (dev_addr == NULL) 2067 return -EINVAL; 2068 2069 if (is_handled_by_aud_tr_if(addr)) 2070 stat = drxj_dap_write_aud_reg16(dev_addr, addr, data); 2071 else 2072 stat = drxdap_fasi_write_reg16(dev_addr, 2073 addr, data, flags); 2074 2075 return stat; 2076 } 2077 2078 /*============================================================================*/ 2079 2080 /* Free data ram in SIO HI */ 2081 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040 2082 #define SIO_HI_RA_RAM_USR_END__A 0x420060 2083 2084 #define DRXJ_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A) 2085 #define DRXJ_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7) 2086 #define DRXJ_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ 2087 #define DRXJ_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE 2088 2089 /* 2090 * \fn int drxj_dap_atomic_read_write_block() 2091 * \brief Basic access routine for atomic read or write access 2092 * \param dev_addr pointer to i2c dev address 2093 * \param addr destination/source address 2094 * \param datasize size of data buffer in bytes 2095 * \param data pointer to data buffer 2096 * \return int 2097 * \retval 0 Success 2098 * \retval -EIO Timeout, I2C error, illegal bank 2099 * 2100 */ 2101 static 2102 int drxj_dap_atomic_read_write_block(struct i2c_device_addr *dev_addr, 2103 u32 addr, 2104 u16 datasize, 2105 u8 *data, bool read_flag) 2106 { 2107 struct drxj_hi_cmd hi_cmd; 2108 int rc; 2109 u16 word; 2110 u16 dummy = 0; 2111 u16 i = 0; 2112 2113 /* Parameter check */ 2114 if (!data || !dev_addr || ((datasize % 2)) || ((datasize / 2) > 8)) 2115 return -EINVAL; 2116 2117 /* Set up HI parameters to read or write n bytes */ 2118 hi_cmd.cmd = SIO_HI_RA_RAM_CMD_ATOMIC_COPY; 2119 hi_cmd.param1 = 2120 (u16) ((DRXDAP_FASI_ADDR2BLOCK(DRXJ_HI_ATOMIC_BUF_START) << 6) + 2121 DRXDAP_FASI_ADDR2BANK(DRXJ_HI_ATOMIC_BUF_START)); 2122 hi_cmd.param2 = 2123 (u16) DRXDAP_FASI_ADDR2OFFSET(DRXJ_HI_ATOMIC_BUF_START); 2124 hi_cmd.param3 = (u16) ((datasize / 2) - 1); 2125 if (!read_flag) 2126 hi_cmd.param3 |= DRXJ_HI_ATOMIC_WRITE; 2127 else 2128 hi_cmd.param3 |= DRXJ_HI_ATOMIC_READ; 2129 hi_cmd.param4 = (u16) ((DRXDAP_FASI_ADDR2BLOCK(addr) << 6) + 2130 DRXDAP_FASI_ADDR2BANK(addr)); 2131 hi_cmd.param5 = (u16) DRXDAP_FASI_ADDR2OFFSET(addr); 2132 2133 if (!read_flag) { 2134 /* write data to buffer */ 2135 for (i = 0; i < (datasize / 2); i++) { 2136 2137 word = ((u16) data[2 * i]); 2138 word += (((u16) data[(2 * i) + 1]) << 8); 2139 drxj_dap_write_reg16(dev_addr, 2140 (DRXJ_HI_ATOMIC_BUF_START + i), 2141 word, 0); 2142 } 2143 } 2144 2145 rc = hi_command(dev_addr, &hi_cmd, &dummy); 2146 if (rc != 0) { 2147 pr_err("error %d\n", rc); 2148 goto rw_error; 2149 } 2150 2151 if (read_flag) { 2152 /* read data from buffer */ 2153 for (i = 0; i < (datasize / 2); i++) { 2154 rc = drxj_dap_read_reg16(dev_addr, 2155 (DRXJ_HI_ATOMIC_BUF_START + i), 2156 &word, 0); 2157 if (rc) { 2158 pr_err("error %d\n", rc); 2159 goto rw_error; 2160 } 2161 data[2 * i] = (u8) (word & 0xFF); 2162 data[(2 * i) + 1] = (u8) (word >> 8); 2163 } 2164 } 2165 2166 return 0; 2167 2168 rw_error: 2169 return rc; 2170 2171 } 2172 2173 /*============================================================================*/ 2174 2175 /* 2176 * \fn int drxj_dap_atomic_read_reg32() 2177 * \brief Atomic read of 32 bits words 2178 */ 2179 static 2180 int drxj_dap_atomic_read_reg32(struct i2c_device_addr *dev_addr, 2181 u32 addr, 2182 u32 *data, u32 flags) 2183 { 2184 u8 buf[sizeof(*data)] = { 0 }; 2185 int rc; 2186 u32 word = 0; 2187 2188 if (!data) 2189 return -EINVAL; 2190 2191 rc = drxj_dap_atomic_read_write_block(dev_addr, addr, 2192 sizeof(*data), buf, true); 2193 2194 if (rc < 0) 2195 return 0; 2196 2197 word = (u32) buf[3]; 2198 word <<= 8; 2199 word |= (u32) buf[2]; 2200 word <<= 8; 2201 word |= (u32) buf[1]; 2202 word <<= 8; 2203 word |= (u32) buf[0]; 2204 2205 *data = word; 2206 2207 return rc; 2208 } 2209 2210 /*============================================================================*/ 2211 2212 /*============================================================================*/ 2213 /*== END DRXJ DAP FUNCTIONS ==*/ 2214 /*============================================================================*/ 2215 2216 /*============================================================================*/ 2217 /*============================================================================*/ 2218 /*== HOST INTERFACE FUNCTIONS ==*/ 2219 /*============================================================================*/ 2220 /*============================================================================*/ 2221 2222 /* 2223 * \fn int hi_cfg_command() 2224 * \brief Configure HI with settings stored in the demod structure. 2225 * \param demod Demodulator. 2226 * \return int. 2227 * 2228 * This routine was created because to much orthogonal settings have 2229 * been put into one HI API function (configure). Especially the I2C bridge 2230 * enable/disable should not need re-configuration of the HI. 2231 * 2232 */ 2233 static int hi_cfg_command(const struct drx_demod_instance *demod) 2234 { 2235 struct drxj_data *ext_attr = (struct drxj_data *) (NULL); 2236 struct drxj_hi_cmd hi_cmd; 2237 u16 result = 0; 2238 int rc; 2239 2240 ext_attr = (struct drxj_data *) demod->my_ext_attr; 2241 2242 hi_cmd.cmd = SIO_HI_RA_RAM_CMD_CONFIG; 2243 hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY; 2244 hi_cmd.param2 = ext_attr->hi_cfg_timing_div; 2245 hi_cmd.param3 = ext_attr->hi_cfg_bridge_delay; 2246 hi_cmd.param4 = ext_attr->hi_cfg_wake_up_key; 2247 hi_cmd.param5 = ext_attr->hi_cfg_ctrl; 2248 hi_cmd.param6 = ext_attr->hi_cfg_transmit; 2249 2250 rc = hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result); 2251 if (rc != 0) { 2252 pr_err("error %d\n", rc); 2253 goto rw_error; 2254 } 2255 2256 /* Reset power down flag (set one call only) */ 2257 ext_attr->hi_cfg_ctrl &= (~(SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ)); 2258 2259 return 0; 2260 2261 rw_error: 2262 return rc; 2263 } 2264 2265 /* 2266 * \fn int hi_command() 2267 * \brief Configure HI with settings stored in the demod structure. 2268 * \param dev_addr I2C address. 2269 * \param cmd HI command. 2270 * \param result HI command result. 2271 * \return int. 2272 * 2273 * Sends command to HI 2274 * 2275 */ 2276 static int 2277 hi_command(struct i2c_device_addr *dev_addr, const struct drxj_hi_cmd *cmd, u16 *result) 2278 { 2279 u16 wait_cmd = 0; 2280 u16 nr_retries = 0; 2281 bool powerdown_cmd = false; 2282 int rc; 2283 2284 /* Write parameters */ 2285 switch (cmd->cmd) { 2286 2287 case SIO_HI_RA_RAM_CMD_CONFIG: 2288 case SIO_HI_RA_RAM_CMD_ATOMIC_COPY: 2289 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_6__A, cmd->param6, 0); 2290 if (rc != 0) { 2291 pr_err("error %d\n", rc); 2292 goto rw_error; 2293 } 2294 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_5__A, cmd->param5, 0); 2295 if (rc != 0) { 2296 pr_err("error %d\n", rc); 2297 goto rw_error; 2298 } 2299 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_4__A, cmd->param4, 0); 2300 if (rc != 0) { 2301 pr_err("error %d\n", rc); 2302 goto rw_error; 2303 } 2304 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_3__A, cmd->param3, 0); 2305 if (rc != 0) { 2306 pr_err("error %d\n", rc); 2307 goto rw_error; 2308 } 2309 fallthrough; 2310 case SIO_HI_RA_RAM_CMD_BRDCTRL: 2311 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_2__A, cmd->param2, 0); 2312 if (rc != 0) { 2313 pr_err("error %d\n", rc); 2314 goto rw_error; 2315 } 2316 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_1__A, cmd->param1, 0); 2317 if (rc != 0) { 2318 pr_err("error %d\n", rc); 2319 goto rw_error; 2320 } 2321 fallthrough; 2322 case SIO_HI_RA_RAM_CMD_NULL: 2323 /* No parameters */ 2324 break; 2325 2326 default: 2327 return -EINVAL; 2328 break; 2329 } 2330 2331 /* Write command */ 2332 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, cmd->cmd, 0); 2333 if (rc != 0) { 2334 pr_err("error %d\n", rc); 2335 goto rw_error; 2336 } 2337 2338 if ((cmd->cmd) == SIO_HI_RA_RAM_CMD_RESET) 2339 msleep(1); 2340 2341 /* Detect power down to omit reading result */ 2342 powerdown_cmd = (bool) ((cmd->cmd == SIO_HI_RA_RAM_CMD_CONFIG) && 2343 (((cmd-> 2344 param5) & SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) 2345 == SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ)); 2346 if (!powerdown_cmd) { 2347 /* Wait until command rdy */ 2348 do { 2349 nr_retries++; 2350 if (nr_retries > DRXJ_MAX_RETRIES) { 2351 pr_err("timeout\n"); 2352 goto rw_error; 2353 } 2354 2355 rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, &wait_cmd, 0); 2356 if (rc != 0) { 2357 pr_err("error %d\n", rc); 2358 goto rw_error; 2359 } 2360 } while (wait_cmd != 0); 2361 2362 /* Read result */ 2363 rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_RES__A, result, 0); 2364 if (rc != 0) { 2365 pr_err("error %d\n", rc); 2366 goto rw_error; 2367 } 2368 2369 } 2370 /* if ( powerdown_cmd == true ) */ 2371 return 0; 2372 rw_error: 2373 return rc; 2374 } 2375 2376 /* 2377 * \fn int init_hi( const struct drx_demod_instance *demod ) 2378 * \brief Initialise and configurate HI. 2379 * \param demod pointer to demod data. 2380 * \return int Return status. 2381 * \retval 0 Success. 2382 * \retval -EIO Failure. 2383 * 2384 * Needs to know Psys (System Clock period) and Posc (Osc Clock period) 2385 * Need to store configuration in driver because of the way I2C 2386 * bridging is controlled. 2387 * 2388 */ 2389 static int init_hi(const struct drx_demod_instance *demod) 2390 { 2391 struct drxj_data *ext_attr = (struct drxj_data *) (NULL); 2392 struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL); 2393 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL); 2394 int rc; 2395 2396 ext_attr = (struct drxj_data *) demod->my_ext_attr; 2397 common_attr = (struct drx_common_attr *) demod->my_common_attr; 2398 dev_addr = demod->my_i2c_dev_addr; 2399 2400 /* PATCH for bug 5003, HI ucode v3.1.0 */ 2401 rc = drxj_dap_write_reg16(dev_addr, 0x4301D7, 0x801, 0); 2402 if (rc != 0) { 2403 pr_err("error %d\n", rc); 2404 goto rw_error; 2405 } 2406 2407 /* Timing div, 250ns/Psys */ 2408 /* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */ 2409 ext_attr->hi_cfg_timing_div = 2410 (u16) ((common_attr->sys_clock_freq / 1000) * HI_I2C_DELAY) / 1000; 2411 /* Clipping */ 2412 if ((ext_attr->hi_cfg_timing_div) > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M) 2413 ext_attr->hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M; 2414 /* Bridge delay, uses oscilator clock */ 2415 /* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */ 2416 /* SDA brdige delay */ 2417 ext_attr->hi_cfg_bridge_delay = 2418 (u16) ((common_attr->osc_clock_freq / 1000) * HI_I2C_BRIDGE_DELAY) / 2419 1000; 2420 /* Clipping */ 2421 if ((ext_attr->hi_cfg_bridge_delay) > SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) 2422 ext_attr->hi_cfg_bridge_delay = SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M; 2423 /* SCL bridge delay, same as SDA for now */ 2424 ext_attr->hi_cfg_bridge_delay += ((ext_attr->hi_cfg_bridge_delay) << 2425 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B); 2426 /* Wakeup key, setting the read flag (as suggest in the documentation) does 2427 not always result into a working solution (barebones worked VI2C failed). 2428 Not setting the bit works in all cases . */ 2429 ext_attr->hi_cfg_wake_up_key = DRXJ_WAKE_UP_KEY; 2430 /* port/bridge/power down ctrl */ 2431 ext_attr->hi_cfg_ctrl = (SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE); 2432 /* transit mode time out delay and watch dog divider */ 2433 ext_attr->hi_cfg_transmit = SIO_HI_RA_RAM_PAR_6__PRE; 2434 2435 rc = hi_cfg_command(demod); 2436 if (rc != 0) { 2437 pr_err("error %d\n", rc); 2438 goto rw_error; 2439 } 2440 2441 return 0; 2442 2443 rw_error: 2444 return rc; 2445 } 2446 2447 /*============================================================================*/ 2448 /*== END HOST INTERFACE FUNCTIONS ==*/ 2449 /*============================================================================*/ 2450 2451 /*============================================================================*/ 2452 /*============================================================================*/ 2453 /*== AUXILIARY FUNCTIONS ==*/ 2454 /*============================================================================*/ 2455 /*============================================================================*/ 2456 2457 /* 2458 * \fn int get_device_capabilities() 2459 * \brief Get and store device capabilities. 2460 * \param demod Pointer to demodulator instance. 2461 * \return int. 2462 * \return 0 Success 2463 * \retval -EIO Failure 2464 * 2465 * Depending on pulldowns on MDx pins the following internals are set: 2466 * * common_attr->osc_clock_freq 2467 * * ext_attr->has_lna 2468 * * ext_attr->has_ntsc 2469 * * ext_attr->has_btsc 2470 * * ext_attr->has_oob 2471 * 2472 */ 2473 static int get_device_capabilities(struct drx_demod_instance *demod) 2474 { 2475 struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL); 2476 struct drxj_data *ext_attr = (struct drxj_data *) NULL; 2477 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL); 2478 u16 sio_pdr_ohw_cfg = 0; 2479 u32 sio_top_jtagid_lo = 0; 2480 u16 bid = 0; 2481 int rc; 2482 2483 common_attr = (struct drx_common_attr *) demod->my_common_attr; 2484 ext_attr = (struct drxj_data *) demod->my_ext_attr; 2485 dev_addr = demod->my_i2c_dev_addr; 2486 2487 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0); 2488 if (rc != 0) { 2489 pr_err("error %d\n", rc); 2490 goto rw_error; 2491 } 2492 rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg, 0); 2493 if (rc != 0) { 2494 pr_err("error %d\n", rc); 2495 goto rw_error; 2496 } 2497 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0); 2498 if (rc != 0) { 2499 pr_err("error %d\n", rc); 2500 goto rw_error; 2501 } 2502 2503 switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) { 2504 case 0: 2505 /* ignore (bypass ?) */ 2506 break; 2507 case 1: 2508 /* 27 MHz */ 2509 common_attr->osc_clock_freq = 27000; 2510 break; 2511 case 2: 2512 /* 20.25 MHz */ 2513 common_attr->osc_clock_freq = 20250; 2514 break; 2515 case 3: 2516 /* 4 MHz */ 2517 common_attr->osc_clock_freq = 4000; 2518 break; 2519 default: 2520 return -EIO; 2521 } 2522 2523 /* 2524 Determine device capabilities 2525 Based on pinning v47 2526 */ 2527 rc = drxdap_fasi_read_reg32(dev_addr, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo, 0); 2528 if (rc != 0) { 2529 pr_err("error %d\n", rc); 2530 goto rw_error; 2531 } 2532 ext_attr->mfx = (u8) ((sio_top_jtagid_lo >> 29) & 0xF); 2533 2534 switch ((sio_top_jtagid_lo >> 12) & 0xFF) { 2535 case 0x31: 2536 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0); 2537 if (rc != 0) { 2538 pr_err("error %d\n", rc); 2539 goto rw_error; 2540 } 2541 rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_UIO_IN_HI__A, &bid, 0); 2542 if (rc != 0) { 2543 pr_err("error %d\n", rc); 2544 goto rw_error; 2545 } 2546 bid = (bid >> 10) & 0xf; 2547 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0); 2548 if (rc != 0) { 2549 pr_err("error %d\n", rc); 2550 goto rw_error; 2551 } 2552 2553 ext_attr->has_lna = true; 2554 ext_attr->has_ntsc = false; 2555 ext_attr->has_btsc = false; 2556 ext_attr->has_oob = false; 2557 ext_attr->has_smatx = true; 2558 ext_attr->has_smarx = false; 2559 ext_attr->has_gpio = false; 2560 ext_attr->has_irqn = false; 2561 break; 2562 case 0x33: 2563 ext_attr->has_lna = false; 2564 ext_attr->has_ntsc = false; 2565 ext_attr->has_btsc = false; 2566 ext_attr->has_oob = false; 2567 ext_attr->has_smatx = true; 2568 ext_attr->has_smarx = false; 2569 ext_attr->has_gpio = false; 2570 ext_attr->has_irqn = false; 2571 break; 2572 case 0x45: 2573 ext_attr->has_lna = true; 2574 ext_attr->has_ntsc = true; 2575 ext_attr->has_btsc = false; 2576 ext_attr->has_oob = false; 2577 ext_attr->has_smatx = true; 2578 ext_attr->has_smarx = true; 2579 ext_attr->has_gpio = true; 2580 ext_attr->has_irqn = false; 2581 break; 2582 case 0x46: 2583 ext_attr->has_lna = false; 2584 ext_attr->has_ntsc = true; 2585 ext_attr->has_btsc = false; 2586 ext_attr->has_oob = false; 2587 ext_attr->has_smatx = true; 2588 ext_attr->has_smarx = true; 2589 ext_attr->has_gpio = true; 2590 ext_attr->has_irqn = false; 2591 break; 2592 case 0x41: 2593 ext_attr->has_lna = true; 2594 ext_attr->has_ntsc = true; 2595 ext_attr->has_btsc = true; 2596 ext_attr->has_oob = false; 2597 ext_attr->has_smatx = true; 2598 ext_attr->has_smarx = true; 2599 ext_attr->has_gpio = true; 2600 ext_attr->has_irqn = false; 2601 break; 2602 case 0x43: 2603 ext_attr->has_lna = false; 2604 ext_attr->has_ntsc = true; 2605 ext_attr->has_btsc = true; 2606 ext_attr->has_oob = false; 2607 ext_attr->has_smatx = true; 2608 ext_attr->has_smarx = true; 2609 ext_attr->has_gpio = true; 2610 ext_attr->has_irqn = false; 2611 break; 2612 case 0x32: 2613 ext_attr->has_lna = true; 2614 ext_attr->has_ntsc = false; 2615 ext_attr->has_btsc = false; 2616 ext_attr->has_oob = true; 2617 ext_attr->has_smatx = true; 2618 ext_attr->has_smarx = true; 2619 ext_attr->has_gpio = true; 2620 ext_attr->has_irqn = true; 2621 break; 2622 case 0x34: 2623 ext_attr->has_lna = false; 2624 ext_attr->has_ntsc = true; 2625 ext_attr->has_btsc = true; 2626 ext_attr->has_oob = true; 2627 ext_attr->has_smatx = true; 2628 ext_attr->has_smarx = true; 2629 ext_attr->has_gpio = true; 2630 ext_attr->has_irqn = true; 2631 break; 2632 case 0x42: 2633 ext_attr->has_lna = true; 2634 ext_attr->has_ntsc = true; 2635 ext_attr->has_btsc = true; 2636 ext_attr->has_oob = true; 2637 ext_attr->has_smatx = true; 2638 ext_attr->has_smarx = true; 2639 ext_attr->has_gpio = true; 2640 ext_attr->has_irqn = true; 2641 break; 2642 case 0x44: 2643 ext_attr->has_lna = false; 2644 ext_attr->has_ntsc = true; 2645 ext_attr->has_btsc = true; 2646 ext_attr->has_oob = true; 2647 ext_attr->has_smatx = true; 2648 ext_attr->has_smarx = true; 2649 ext_attr->has_gpio = true; 2650 ext_attr->has_irqn = true; 2651 break; 2652 default: 2653 /* Unknown device variant */ 2654 return -EIO; 2655 break; 2656 } 2657 2658 return 0; 2659 rw_error: 2660 return rc; 2661 } 2662 2663 /* 2664 * \fn int power_up_device() 2665 * \brief Power up device. 2666 * \param demod Pointer to demodulator instance. 2667 * \return int. 2668 * \return 0 Success 2669 * \retval -EIO Failure, I2C or max retries reached 2670 * 2671 */ 2672 2673 #ifndef DRXJ_MAX_RETRIES_POWERUP 2674 #define DRXJ_MAX_RETRIES_POWERUP 10 2675 #endif 2676 2677 static int power_up_device(struct drx_demod_instance *demod) 2678 { 2679 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL); 2680 u8 data = 0; 2681 u16 retry_count = 0; 2682 struct i2c_device_addr wake_up_addr; 2683 2684 dev_addr = demod->my_i2c_dev_addr; 2685 wake_up_addr.i2c_addr = DRXJ_WAKE_UP_KEY; 2686 wake_up_addr.i2c_dev_id = dev_addr->i2c_dev_id; 2687 wake_up_addr.user_data = dev_addr->user_data; 2688 /* 2689 * I2C access may fail in this case: no ack 2690 * dummy write must be used to wake uop device, dummy read must be used to 2691 * reset HI state machine (avoiding actual writes) 2692 */ 2693 do { 2694 data = 0; 2695 drxbsp_i2c_write_read(&wake_up_addr, 1, &data, 2696 (struct i2c_device_addr *)(NULL), 0, 2697 (u8 *)(NULL)); 2698 msleep(10); 2699 retry_count++; 2700 } while ((drxbsp_i2c_write_read 2701 ((struct i2c_device_addr *) (NULL), 0, (u8 *)(NULL), dev_addr, 1, 2702 &data) 2703 != 0) && (retry_count < DRXJ_MAX_RETRIES_POWERUP)); 2704 2705 /* Need some recovery time .... */ 2706 msleep(10); 2707 2708 if (retry_count == DRXJ_MAX_RETRIES_POWERUP) 2709 return -EIO; 2710 2711 return 0; 2712 } 2713 2714 /*----------------------------------------------------------------------------*/ 2715 /* MPEG Output Configuration Functions - begin */ 2716 /*----------------------------------------------------------------------------*/ 2717 /* 2718 * \fn int ctrl_set_cfg_mpeg_output() 2719 * \brief Set MPEG output configuration of the device. 2720 * \param devmod Pointer to demodulator instance. 2721 * \param cfg_data Pointer to mpeg output configuaration. 2722 * \return int. 2723 * 2724 * Configure MPEG output parameters. 2725 * 2726 */ 2727 static int 2728 ctrl_set_cfg_mpeg_output(struct drx_demod_instance *demod, struct drx_cfg_mpeg_output *cfg_data) 2729 { 2730 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL); 2731 struct drxj_data *ext_attr = (struct drxj_data *) (NULL); 2732 struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL); 2733 int rc; 2734 u16 fec_oc_reg_mode = 0; 2735 u16 fec_oc_reg_ipr_mode = 0; 2736 u16 fec_oc_reg_ipr_invert = 0; 2737 u32 max_bit_rate = 0; 2738 u32 rcn_rate = 0; 2739 u32 nr_bits = 0; 2740 u16 sio_pdr_md_cfg = 0; 2741 /* data mask for the output data byte */ 2742 u16 invert_data_mask = 2743 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M | 2744 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M | 2745 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M | 2746 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M; 2747 2748 /* check arguments */ 2749 if ((demod == NULL) || (cfg_data == NULL)) 2750 return -EINVAL; 2751 2752 dev_addr = demod->my_i2c_dev_addr; 2753 ext_attr = (struct drxj_data *) demod->my_ext_attr; 2754 common_attr = (struct drx_common_attr *) demod->my_common_attr; 2755 2756 if (cfg_data->enable_mpeg_output == true) { 2757 /* quick and dirty patch to set MPEG in case current std is not 2758 producing MPEG */ 2759 switch (ext_attr->standard) { 2760 case DRX_STANDARD_8VSB: 2761 case DRX_STANDARD_ITU_A: 2762 case DRX_STANDARD_ITU_B: 2763 case DRX_STANDARD_ITU_C: 2764 break; 2765 default: 2766 return 0; 2767 } 2768 2769 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_OCR_INVERT__A, 0, 0); 2770 if (rc != 0) { 2771 pr_err("error %d\n", rc); 2772 goto rw_error; 2773 } 2774 switch (ext_attr->standard) { 2775 case DRX_STANDARD_8VSB: 2776 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, 7, 0); 2777 if (rc != 0) { 2778 pr_err("error %d\n", rc); 2779 goto rw_error; 2780 } /* 2048 bytes fifo ram */ 2781 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, 10, 0); 2782 if (rc != 0) { 2783 pr_err("error %d\n", rc); 2784 goto rw_error; 2785 } 2786 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 10, 0); 2787 if (rc != 0) { 2788 pr_err("error %d\n", rc); 2789 goto rw_error; 2790 } 2791 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, 5, 0); 2792 if (rc != 0) { 2793 pr_err("error %d\n", rc); 2794 goto rw_error; 2795 } 2796 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, 7, 0); 2797 if (rc != 0) { 2798 pr_err("error %d\n", rc); 2799 goto rw_error; 2800 } 2801 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 10, 0); 2802 if (rc != 0) { 2803 pr_err("error %d\n", rc); 2804 goto rw_error; 2805 } 2806 /* Low Water Mark for synchronization */ 2807 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 3, 0); 2808 if (rc != 0) { 2809 pr_err("error %d\n", rc); 2810 goto rw_error; 2811 } 2812 /* High Water Mark for synchronization */ 2813 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 5, 0); 2814 if (rc != 0) { 2815 pr_err("error %d\n", rc); 2816 goto rw_error; 2817 } 2818 break; 2819 case DRX_STANDARD_ITU_A: 2820 case DRX_STANDARD_ITU_C: 2821 switch (ext_attr->constellation) { 2822 case DRX_CONSTELLATION_QAM256: 2823 nr_bits = 8; 2824 break; 2825 case DRX_CONSTELLATION_QAM128: 2826 nr_bits = 7; 2827 break; 2828 case DRX_CONSTELLATION_QAM64: 2829 nr_bits = 6; 2830 break; 2831 case DRX_CONSTELLATION_QAM32: 2832 nr_bits = 5; 2833 break; 2834 case DRX_CONSTELLATION_QAM16: 2835 nr_bits = 4; 2836 break; 2837 default: 2838 return -EIO; 2839 } /* ext_attr->constellation */ 2840 /* max_bit_rate = symbol_rate * nr_bits * coef */ 2841 /* coef = 188/204 */ 2842 max_bit_rate = 2843 (ext_attr->curr_symbol_rate / 8) * nr_bits * 188; 2844 fallthrough; /* as b/c Annex A/C need following settings */ 2845 case DRX_STANDARD_ITU_B: 2846 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, FEC_OC_FCT_USAGE__PRE, 0); 2847 if (rc != 0) { 2848 pr_err("error %d\n", rc); 2849 goto rw_error; 2850 } 2851 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, FEC_OC_TMD_CTL_UPD_RATE__PRE, 0); 2852 if (rc != 0) { 2853 pr_err("error %d\n", rc); 2854 goto rw_error; 2855 } 2856 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 5, 0); 2857 if (rc != 0) { 2858 pr_err("error %d\n", rc); 2859 goto rw_error; 2860 } 2861 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, FEC_OC_AVR_PARM_A__PRE, 0); 2862 if (rc != 0) { 2863 pr_err("error %d\n", rc); 2864 goto rw_error; 2865 } 2866 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, FEC_OC_AVR_PARM_B__PRE, 0); 2867 if (rc != 0) { 2868 pr_err("error %d\n", rc); 2869 goto rw_error; 2870 } 2871 if (cfg_data->static_clk == true) { 2872 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 0xD, 0); 2873 if (rc != 0) { 2874 pr_err("error %d\n", rc); 2875 goto rw_error; 2876 } 2877 } else { 2878 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, FEC_OC_RCN_GAIN__PRE, 0); 2879 if (rc != 0) { 2880 pr_err("error %d\n", rc); 2881 goto rw_error; 2882 } 2883 } 2884 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 2, 0); 2885 if (rc != 0) { 2886 pr_err("error %d\n", rc); 2887 goto rw_error; 2888 } 2889 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 12, 0); 2890 if (rc != 0) { 2891 pr_err("error %d\n", rc); 2892 goto rw_error; 2893 } 2894 break; 2895 default: 2896 break; 2897 } /* switch (standard) */ 2898 2899 /* Check insertion of the Reed-Solomon parity bytes */ 2900 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0); 2901 if (rc != 0) { 2902 pr_err("error %d\n", rc); 2903 goto rw_error; 2904 } 2905 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode, 0); 2906 if (rc != 0) { 2907 pr_err("error %d\n", rc); 2908 goto rw_error; 2909 } 2910 if (cfg_data->insert_rs_byte == true) { 2911 /* enable parity symbol forward */ 2912 fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M; 2913 /* MVAL disable during parity bytes */ 2914 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M; 2915 switch (ext_attr->standard) { 2916 case DRX_STANDARD_8VSB: 2917 rcn_rate = 0x004854D3; 2918 break; 2919 case DRX_STANDARD_ITU_B: 2920 fec_oc_reg_mode |= FEC_OC_MODE_TRANSPARENT__M; 2921 switch (ext_attr->constellation) { 2922 case DRX_CONSTELLATION_QAM256: 2923 rcn_rate = 0x008945E7; 2924 break; 2925 case DRX_CONSTELLATION_QAM64: 2926 rcn_rate = 0x005F64D4; 2927 break; 2928 default: 2929 return -EIO; 2930 } 2931 break; 2932 case DRX_STANDARD_ITU_A: 2933 case DRX_STANDARD_ITU_C: 2934 /* insert_rs_byte = true -> coef = 188/188 -> 1, RS bits are in MPEG output */ 2935 rcn_rate = 2936 (frac28 2937 (max_bit_rate, 2938 (u32) (common_attr->sys_clock_freq / 8))) / 2939 188; 2940 break; 2941 default: 2942 return -EIO; 2943 } /* ext_attr->standard */ 2944 } else { /* insert_rs_byte == false */ 2945 2946 /* disable parity symbol forward */ 2947 fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M); 2948 /* MVAL enable during parity bytes */ 2949 fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M); 2950 switch (ext_attr->standard) { 2951 case DRX_STANDARD_8VSB: 2952 rcn_rate = 0x0041605C; 2953 break; 2954 case DRX_STANDARD_ITU_B: 2955 fec_oc_reg_mode &= (~FEC_OC_MODE_TRANSPARENT__M); 2956 switch (ext_attr->constellation) { 2957 case DRX_CONSTELLATION_QAM256: 2958 rcn_rate = 0x0082D6A0; 2959 break; 2960 case DRX_CONSTELLATION_QAM64: 2961 rcn_rate = 0x005AEC1A; 2962 break; 2963 default: 2964 return -EIO; 2965 } 2966 break; 2967 case DRX_STANDARD_ITU_A: 2968 case DRX_STANDARD_ITU_C: 2969 /* insert_rs_byte = false -> coef = 188/204, RS bits not in MPEG output */ 2970 rcn_rate = 2971 (frac28 2972 (max_bit_rate, 2973 (u32) (common_attr->sys_clock_freq / 8))) / 2974 204; 2975 break; 2976 default: 2977 return -EIO; 2978 } /* ext_attr->standard */ 2979 } 2980 2981 if (cfg_data->enable_parallel == true) { /* MPEG data output is parallel -> clear ipr_mode[0] */ 2982 fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M)); 2983 } else { /* MPEG data output is serial -> set ipr_mode[0] */ 2984 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M; 2985 } 2986 2987 /* Control slective inversion of output bits */ 2988 if (cfg_data->invert_data == true) 2989 fec_oc_reg_ipr_invert |= invert_data_mask; 2990 else 2991 fec_oc_reg_ipr_invert &= (~(invert_data_mask)); 2992 2993 if (cfg_data->invert_err == true) 2994 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M; 2995 else 2996 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M)); 2997 2998 if (cfg_data->invert_str == true) 2999 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M; 3000 else 3001 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M)); 3002 3003 if (cfg_data->invert_val == true) 3004 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M; 3005 else 3006 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M)); 3007 3008 if (cfg_data->invert_clk == true) 3009 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M; 3010 else 3011 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M)); 3012 3013 3014 if (cfg_data->static_clk == true) { /* Static mode */ 3015 u32 dto_rate = 0; 3016 u32 bit_rate = 0; 3017 u16 fec_oc_dto_burst_len = 0; 3018 u16 fec_oc_dto_period = 0; 3019 3020 fec_oc_dto_burst_len = FEC_OC_DTO_BURST_LEN__PRE; 3021 3022 switch (ext_attr->standard) { 3023 case DRX_STANDARD_8VSB: 3024 fec_oc_dto_period = 4; 3025 if (cfg_data->insert_rs_byte == true) 3026 fec_oc_dto_burst_len = 208; 3027 break; 3028 case DRX_STANDARD_ITU_A: 3029 { 3030 u32 symbol_rate_th = 6400000; 3031 if (cfg_data->insert_rs_byte == true) { 3032 fec_oc_dto_burst_len = 204; 3033 symbol_rate_th = 5900000; 3034 } 3035 if (ext_attr->curr_symbol_rate >= 3036 symbol_rate_th) { 3037 fec_oc_dto_period = 0; 3038 } else { 3039 fec_oc_dto_period = 1; 3040 } 3041 } 3042 break; 3043 case DRX_STANDARD_ITU_B: 3044 fec_oc_dto_period = 1; 3045 if (cfg_data->insert_rs_byte == true) 3046 fec_oc_dto_burst_len = 128; 3047 break; 3048 case DRX_STANDARD_ITU_C: 3049 fec_oc_dto_period = 1; 3050 if (cfg_data->insert_rs_byte == true) 3051 fec_oc_dto_burst_len = 204; 3052 break; 3053 default: 3054 return -EIO; 3055 } 3056 bit_rate = 3057 common_attr->sys_clock_freq * 1000 / (fec_oc_dto_period + 3058 2); 3059 dto_rate = 3060 frac28(bit_rate, common_attr->sys_clock_freq * 1000); 3061 dto_rate >>= 3; 3062 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_HI__A, (u16)((dto_rate >> 16) & FEC_OC_DTO_RATE_HI__M), 0); 3063 if (rc != 0) { 3064 pr_err("error %d\n", rc); 3065 goto rw_error; 3066 } 3067 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_LO__A, (u16)(dto_rate & FEC_OC_DTO_RATE_LO_RATE_LO__M), 0); 3068 if (rc != 0) { 3069 pr_err("error %d\n", rc); 3070 goto rw_error; 3071 } 3072 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M | FEC_OC_DTO_MODE_OFFSET_ENABLE__M, 0); 3073 if (rc != 0) { 3074 pr_err("error %d\n", rc); 3075 goto rw_error; 3076 } 3077 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, FEC_OC_FCT_MODE_RAT_ENA__M | FEC_OC_FCT_MODE_VIRT_ENA__M, 0); 3078 if (rc != 0) { 3079 pr_err("error %d\n", rc); 3080 goto rw_error; 3081 } 3082 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len, 0); 3083 if (rc != 0) { 3084 pr_err("error %d\n", rc); 3085 goto rw_error; 3086 } 3087 if (ext_attr->mpeg_output_clock_rate != DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO) 3088 fec_oc_dto_period = ext_attr->mpeg_output_clock_rate - 1; 3089 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period, 0); 3090 if (rc != 0) { 3091 pr_err("error %d\n", rc); 3092 goto rw_error; 3093 } 3094 } else { /* Dynamic mode */ 3095 3096 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M, 0); 3097 if (rc != 0) { 3098 pr_err("error %d\n", rc); 3099 goto rw_error; 3100 } 3101 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, 0, 0); 3102 if (rc != 0) { 3103 pr_err("error %d\n", rc); 3104 goto rw_error; 3105 } 3106 } 3107 3108 rc = drxdap_fasi_write_reg32(dev_addr, FEC_OC_RCN_CTL_RATE_LO__A, rcn_rate, 0); 3109 if (rc != 0) { 3110 pr_err("error %d\n", rc); 3111 goto rw_error; 3112 } 3113 3114 /* Write appropriate registers with requested configuration */ 3115 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode, 0); 3116 if (rc != 0) { 3117 pr_err("error %d\n", rc); 3118 goto rw_error; 3119 } 3120 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode, 0); 3121 if (rc != 0) { 3122 pr_err("error %d\n", rc); 3123 goto rw_error; 3124 } 3125 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert, 0); 3126 if (rc != 0) { 3127 pr_err("error %d\n", rc); 3128 goto rw_error; 3129 } 3130 3131 /* enabling for both parallel and serial now */ 3132 /* Write magic word to enable pdr reg write */ 3133 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0); 3134 if (rc != 0) { 3135 pr_err("error %d\n", rc); 3136 goto rw_error; 3137 } 3138 /* Set MPEG TS pads to outputmode */ 3139 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0013, 0); 3140 if (rc != 0) { 3141 pr_err("error %d\n", rc); 3142 goto rw_error; 3143 } 3144 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0013, 0); 3145 if (rc != 0) { 3146 pr_err("error %d\n", rc); 3147 goto rw_error; 3148 } 3149 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, MPEG_OUTPUT_CLK_DRIVE_STRENGTH << SIO_PDR_MCLK_CFG_DRIVE__B | 0x03 << SIO_PDR_MCLK_CFG_MODE__B, 0); 3150 if (rc != 0) { 3151 pr_err("error %d\n", rc); 3152 goto rw_error; 3153 } 3154 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0013, 0); 3155 if (rc != 0) { 3156 pr_err("error %d\n", rc); 3157 goto rw_error; 3158 } 3159 sio_pdr_md_cfg = 3160 MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH << 3161 SIO_PDR_MD0_CFG_DRIVE__B | 0x03 << SIO_PDR_MD0_CFG_MODE__B; 3162 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0); 3163 if (rc != 0) { 3164 pr_err("error %d\n", rc); 3165 goto rw_error; 3166 } 3167 if (cfg_data->enable_parallel == true) { /* MPEG data output is parallel -> set MD1 to MD7 to output mode */ 3168 sio_pdr_md_cfg = 3169 MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH << 3170 SIO_PDR_MD0_CFG_DRIVE__B | 0x03 << 3171 SIO_PDR_MD0_CFG_MODE__B; 3172 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0); 3173 if (rc != 0) { 3174 pr_err("error %d\n", rc); 3175 goto rw_error; 3176 } 3177 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, sio_pdr_md_cfg, 0); 3178 if (rc != 0) { 3179 pr_err("error %d\n", rc); 3180 goto rw_error; 3181 } 3182 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, sio_pdr_md_cfg, 0); 3183 if (rc != 0) { 3184 pr_err("error %d\n", rc); 3185 goto rw_error; 3186 } 3187 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, sio_pdr_md_cfg, 0); 3188 if (rc != 0) { 3189 pr_err("error %d\n", rc); 3190 goto rw_error; 3191 } 3192 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, sio_pdr_md_cfg, 0); 3193 if (rc != 0) { 3194 pr_err("error %d\n", rc); 3195 goto rw_error; 3196 } 3197 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, sio_pdr_md_cfg, 0); 3198 if (rc != 0) { 3199 pr_err("error %d\n", rc); 3200 goto rw_error; 3201 } 3202 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, sio_pdr_md_cfg, 0); 3203 if (rc != 0) { 3204 pr_err("error %d\n", rc); 3205 goto rw_error; 3206 } 3207 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, sio_pdr_md_cfg, 0); 3208 if (rc != 0) { 3209 pr_err("error %d\n", rc); 3210 goto rw_error; 3211 } 3212 } else { /* MPEG data output is serial -> set MD1 to MD7 to tri-state */ 3213 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0); 3214 if (rc != 0) { 3215 pr_err("error %d\n", rc); 3216 goto rw_error; 3217 } 3218 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0); 3219 if (rc != 0) { 3220 pr_err("error %d\n", rc); 3221 goto rw_error; 3222 } 3223 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0); 3224 if (rc != 0) { 3225 pr_err("error %d\n", rc); 3226 goto rw_error; 3227 } 3228 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0); 3229 if (rc != 0) { 3230 pr_err("error %d\n", rc); 3231 goto rw_error; 3232 } 3233 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0); 3234 if (rc != 0) { 3235 pr_err("error %d\n", rc); 3236 goto rw_error; 3237 } 3238 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0); 3239 if (rc != 0) { 3240 pr_err("error %d\n", rc); 3241 goto rw_error; 3242 } 3243 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0); 3244 if (rc != 0) { 3245 pr_err("error %d\n", rc); 3246 goto rw_error; 3247 } 3248 } 3249 /* Enable Monitor Bus output over MPEG pads and ctl input */ 3250 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0); 3251 if (rc != 0) { 3252 pr_err("error %d\n", rc); 3253 goto rw_error; 3254 } 3255 /* Write nomagic word to enable pdr reg write */ 3256 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0); 3257 if (rc != 0) { 3258 pr_err("error %d\n", rc); 3259 goto rw_error; 3260 } 3261 } else { 3262 /* Write magic word to enable pdr reg write */ 3263 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0); 3264 if (rc != 0) { 3265 pr_err("error %d\n", rc); 3266 goto rw_error; 3267 } 3268 /* Set MPEG TS pads to inputmode */ 3269 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0000, 0); 3270 if (rc != 0) { 3271 pr_err("error %d\n", rc); 3272 goto rw_error; 3273 } 3274 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0000, 0); 3275 if (rc != 0) { 3276 pr_err("error %d\n", rc); 3277 goto rw_error; 3278 } 3279 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, 0x0000, 0); 3280 if (rc != 0) { 3281 pr_err("error %d\n", rc); 3282 goto rw_error; 3283 } 3284 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0000, 0); 3285 if (rc != 0) { 3286 pr_err("error %d\n", rc); 3287 goto rw_error; 3288 } 3289 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, 0x0000, 0); 3290 if (rc != 0) { 3291 pr_err("error %d\n", rc); 3292 goto rw_error; 3293 } 3294 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0); 3295 if (rc != 0) { 3296 pr_err("error %d\n", rc); 3297 goto rw_error; 3298 } 3299 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0); 3300 if (rc != 0) { 3301 pr_err("error %d\n", rc); 3302 goto rw_error; 3303 } 3304 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0); 3305 if (rc != 0) { 3306 pr_err("error %d\n", rc); 3307 goto rw_error; 3308 } 3309 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0); 3310 if (rc != 0) { 3311 pr_err("error %d\n", rc); 3312 goto rw_error; 3313 } 3314 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0); 3315 if (rc != 0) { 3316 pr_err("error %d\n", rc); 3317 goto rw_error; 3318 } 3319 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0); 3320 if (rc != 0) { 3321 pr_err("error %d\n", rc); 3322 goto rw_error; 3323 } 3324 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0); 3325 if (rc != 0) { 3326 pr_err("error %d\n", rc); 3327 goto rw_error; 3328 } 3329 /* Enable Monitor Bus output over MPEG pads and ctl input */ 3330 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0); 3331 if (rc != 0) { 3332 pr_err("error %d\n", rc); 3333 goto rw_error; 3334 } 3335 /* Write nomagic word to enable pdr reg write */ 3336 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0); 3337 if (rc != 0) { 3338 pr_err("error %d\n", rc); 3339 goto rw_error; 3340 } 3341 } 3342 3343 /* save values for restore after re-acquire */ 3344 common_attr->mpeg_cfg.enable_mpeg_output = cfg_data->enable_mpeg_output; 3345 3346 return 0; 3347 rw_error: 3348 return rc; 3349 } 3350 3351 /*----------------------------------------------------------------------------*/ 3352 3353 3354 /*----------------------------------------------------------------------------*/ 3355 /* MPEG Output Configuration Functions - end */ 3356 /*----------------------------------------------------------------------------*/ 3357 3358 /*----------------------------------------------------------------------------*/ 3359 /* miscellaneous configurations - begin */ 3360 /*----------------------------------------------------------------------------*/ 3361 3362 /* 3363 * \fn int set_mpegtei_handling() 3364 * \brief Activate MPEG TEI handling settings. 3365 * \param devmod Pointer to demodulator instance. 3366 * \return int. 3367 * 3368 * This routine should be called during a set channel of QAM/VSB 3369 * 3370 */ 3371 static int set_mpegtei_handling(struct drx_demod_instance *demod) 3372 { 3373 struct drxj_data *ext_attr = (struct drxj_data *) (NULL); 3374 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL); 3375 int rc; 3376 u16 fec_oc_dpr_mode = 0; 3377 u16 fec_oc_snc_mode = 0; 3378 u16 fec_oc_ems_mode = 0; 3379 3380 dev_addr = demod->my_i2c_dev_addr; 3381 ext_attr = (struct drxj_data *) demod->my_ext_attr; 3382 3383 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_DPR_MODE__A, &fec_oc_dpr_mode, 0); 3384 if (rc != 0) { 3385 pr_err("error %d\n", rc); 3386 goto rw_error; 3387 } 3388 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0); 3389 if (rc != 0) { 3390 pr_err("error %d\n", rc); 3391 goto rw_error; 3392 } 3393 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_EMS_MODE__A, &fec_oc_ems_mode, 0); 3394 if (rc != 0) { 3395 pr_err("error %d\n", rc); 3396 goto rw_error; 3397 } 3398 3399 /* reset to default, allow TEI bit to be changed */ 3400 fec_oc_dpr_mode &= (~FEC_OC_DPR_MODE_ERR_DISABLE__M); 3401 fec_oc_snc_mode &= (~(FEC_OC_SNC_MODE_ERROR_CTL__M | 3402 FEC_OC_SNC_MODE_CORR_DISABLE__M)); 3403 fec_oc_ems_mode &= (~FEC_OC_EMS_MODE_MODE__M); 3404 3405 if (ext_attr->disable_te_ihandling) { 3406 /* do not change TEI bit */ 3407 fec_oc_dpr_mode |= FEC_OC_DPR_MODE_ERR_DISABLE__M; 3408 fec_oc_snc_mode |= FEC_OC_SNC_MODE_CORR_DISABLE__M | 3409 ((0x2) << (FEC_OC_SNC_MODE_ERROR_CTL__B)); 3410 fec_oc_ems_mode |= ((0x01) << (FEC_OC_EMS_MODE_MODE__B)); 3411 } 3412 3413 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DPR_MODE__A, fec_oc_dpr_mode, 0); 3414 if (rc != 0) { 3415 pr_err("error %d\n", rc); 3416 goto rw_error; 3417 } 3418 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode, 0); 3419 if (rc != 0) { 3420 pr_err("error %d\n", rc); 3421 goto rw_error; 3422 } 3423 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_EMS_MODE__A, fec_oc_ems_mode, 0); 3424 if (rc != 0) { 3425 pr_err("error %d\n", rc); 3426 goto rw_error; 3427 } 3428 3429 return 0; 3430 rw_error: 3431 return rc; 3432 } 3433 3434 /*----------------------------------------------------------------------------*/ 3435 /* 3436 * \fn int bit_reverse_mpeg_output() 3437 * \brief Set MPEG output bit-endian settings. 3438 * \param devmod Pointer to demodulator instance. 3439 * \return int. 3440 * 3441 * This routine should be called during a set channel of QAM/VSB 3442 * 3443 */ 3444 static int bit_reverse_mpeg_output(struct drx_demod_instance *demod) 3445 { 3446 struct drxj_data *ext_attr = (struct drxj_data *) (NULL); 3447 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL); 3448 int rc; 3449 u16 fec_oc_ipr_mode = 0; 3450 3451 dev_addr = demod->my_i2c_dev_addr; 3452 ext_attr = (struct drxj_data *) demod->my_ext_attr; 3453 3454 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode, 0); 3455 if (rc != 0) { 3456 pr_err("error %d\n", rc); 3457 goto rw_error; 3458 } 3459 3460 /* reset to default (normal bit order) */ 3461 fec_oc_ipr_mode &= (~FEC_OC_IPR_MODE_REVERSE_ORDER__M); 3462 3463 if (ext_attr->bit_reverse_mpeg_outout) 3464 fec_oc_ipr_mode |= FEC_OC_IPR_MODE_REVERSE_ORDER__M; 3465 3466 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode, 0); 3467 if (rc != 0) { 3468 pr_err("error %d\n", rc); 3469 goto rw_error; 3470 } 3471 3472 return 0; 3473 rw_error: 3474 return rc; 3475 } 3476 3477 /*----------------------------------------------------------------------------*/ 3478 /* 3479 * \fn int set_mpeg_start_width() 3480 * \brief Set MPEG start width. 3481 * \param devmod Pointer to demodulator instance. 3482 * \return int. 3483 * 3484 * This routine should be called during a set channel of QAM/VSB 3485 * 3486 */ 3487 static int set_mpeg_start_width(struct drx_demod_instance *demod) 3488 { 3489 struct drxj_data *ext_attr = (struct drxj_data *) (NULL); 3490 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL); 3491 struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL; 3492 int rc; 3493 u16 fec_oc_comm_mb = 0; 3494 3495 dev_addr = demod->my_i2c_dev_addr; 3496 ext_attr = (struct drxj_data *) demod->my_ext_attr; 3497 common_attr = demod->my_common_attr; 3498 3499 if ((common_attr->mpeg_cfg.static_clk == true) 3500 && (common_attr->mpeg_cfg.enable_parallel == false)) { 3501 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_COMM_MB__A, &fec_oc_comm_mb, 0); 3502 if (rc != 0) { 3503 pr_err("error %d\n", rc); 3504 goto rw_error; 3505 } 3506 fec_oc_comm_mb &= ~FEC_OC_COMM_MB_CTL_ON; 3507 if (ext_attr->mpeg_start_width == DRXJ_MPEG_START_WIDTH_8CLKCYC) 3508 fec_oc_comm_mb |= FEC_OC_COMM_MB_CTL_ON; 3509 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_COMM_MB__A, fec_oc_comm_mb, 0); 3510 if (rc != 0) { 3511 pr_err("error %d\n", rc); 3512 goto rw_error; 3513 } 3514 } 3515 3516 return 0; 3517 rw_error: 3518 return rc; 3519 } 3520 3521 /*----------------------------------------------------------------------------*/ 3522 /* miscellaneous configurations - end */ 3523 /*----------------------------------------------------------------------------*/ 3524 3525 /*----------------------------------------------------------------------------*/ 3526 /* UIO Configuration Functions - begin */ 3527 /*----------------------------------------------------------------------------*/ 3528 /* 3529 * \fn int ctrl_set_uio_cfg() 3530 * \brief Configure modus oprandi UIO. 3531 * \param demod Pointer to demodulator instance. 3532 * \param uio_cfg Pointer to a configuration setting for a certain UIO. 3533 * \return int. 3534 */ 3535 static int ctrl_set_uio_cfg(struct drx_demod_instance *demod, struct drxuio_cfg *uio_cfg) 3536 { 3537 struct drxj_data *ext_attr = (struct drxj_data *) (NULL); 3538 int rc; 3539 3540 if ((uio_cfg == NULL) || (demod == NULL)) 3541 return -EINVAL; 3542 3543 ext_attr = (struct drxj_data *) demod->my_ext_attr; 3544 3545 /* Write magic word to enable pdr reg write */ 3546 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0); 3547 if (rc != 0) { 3548 pr_err("error %d\n", rc); 3549 goto rw_error; 3550 } 3551 switch (uio_cfg->uio) { 3552 /*====================================================================*/ 3553 case DRX_UIO1: 3554 /* DRX_UIO1: SMA_TX UIO-1 */ 3555 if (!ext_attr->has_smatx) 3556 return -EIO; 3557 switch (uio_cfg->mode) { 3558 case DRX_UIO_MODE_FIRMWARE_SMA: 3559 case DRX_UIO_MODE_FIRMWARE_SAW: 3560 case DRX_UIO_MODE_READWRITE: 3561 ext_attr->uio_sma_tx_mode = uio_cfg->mode; 3562 break; 3563 case DRX_UIO_MODE_DISABLE: 3564 ext_attr->uio_sma_tx_mode = uio_cfg->mode; 3565 /* pad configuration register is set 0 - input mode */ 3566 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0, 0); 3567 if (rc != 0) { 3568 pr_err("error %d\n", rc); 3569 goto rw_error; 3570 } 3571 break; 3572 default: 3573 return -EINVAL; 3574 } /* switch ( uio_cfg->mode ) */ 3575 break; 3576 /*====================================================================*/ 3577 case DRX_UIO2: 3578 /* DRX_UIO2: SMA_RX UIO-2 */ 3579 if (!ext_attr->has_smarx) 3580 return -EIO; 3581 switch (uio_cfg->mode) { 3582 case DRX_UIO_MODE_FIRMWARE0: 3583 case DRX_UIO_MODE_READWRITE: 3584 ext_attr->uio_sma_rx_mode = uio_cfg->mode; 3585 break; 3586 case DRX_UIO_MODE_DISABLE: 3587 ext_attr->uio_sma_rx_mode = uio_cfg->mode; 3588 /* pad configuration register is set 0 - input mode */ 3589 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, 0, 0); 3590 if (rc != 0) { 3591 pr_err("error %d\n", rc); 3592 goto rw_error; 3593 } 3594 break; 3595 default: 3596 return -EINVAL; 3597 break; 3598 } /* switch ( uio_cfg->mode ) */ 3599 break; 3600 /*====================================================================*/ 3601 case DRX_UIO3: 3602 /* DRX_UIO3: GPIO UIO-3 */ 3603 if (!ext_attr->has_gpio) 3604 return -EIO; 3605 switch (uio_cfg->mode) { 3606 case DRX_UIO_MODE_FIRMWARE0: 3607 case DRX_UIO_MODE_READWRITE: 3608 ext_attr->uio_gpio_mode = uio_cfg->mode; 3609 break; 3610 case DRX_UIO_MODE_DISABLE: 3611 ext_attr->uio_gpio_mode = uio_cfg->mode; 3612 /* pad configuration register is set 0 - input mode */ 3613 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, 0, 0); 3614 if (rc != 0) { 3615 pr_err("error %d\n", rc); 3616 goto rw_error; 3617 } 3618 break; 3619 default: 3620 return -EINVAL; 3621 break; 3622 } /* switch ( uio_cfg->mode ) */ 3623 break; 3624 /*====================================================================*/ 3625 case DRX_UIO4: 3626 /* DRX_UIO4: IRQN UIO-4 */ 3627 if (!ext_attr->has_irqn) 3628 return -EIO; 3629 switch (uio_cfg->mode) { 3630 case DRX_UIO_MODE_READWRITE: 3631 ext_attr->uio_irqn_mode = uio_cfg->mode; 3632 break; 3633 case DRX_UIO_MODE_DISABLE: 3634 /* pad configuration register is set 0 - input mode */ 3635 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, 0, 0); 3636 if (rc != 0) { 3637 pr_err("error %d\n", rc); 3638 goto rw_error; 3639 } 3640 ext_attr->uio_irqn_mode = uio_cfg->mode; 3641 break; 3642 case DRX_UIO_MODE_FIRMWARE0: 3643 default: 3644 return -EINVAL; 3645 break; 3646 } /* switch ( uio_cfg->mode ) */ 3647 break; 3648 /*====================================================================*/ 3649 default: 3650 return -EINVAL; 3651 } /* switch ( uio_cfg->uio ) */ 3652 3653 /* Write magic word to disable pdr reg write */ 3654 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0); 3655 if (rc != 0) { 3656 pr_err("error %d\n", rc); 3657 goto rw_error; 3658 } 3659 3660 return 0; 3661 rw_error: 3662 return rc; 3663 } 3664 3665 /* 3666 * \fn int ctrl_uio_write() 3667 * \brief Write to a UIO. 3668 * \param demod Pointer to demodulator instance. 3669 * \param uio_data Pointer to data container for a certain UIO. 3670 * \return int. 3671 */ 3672 static int 3673 ctrl_uio_write(struct drx_demod_instance *demod, struct drxuio_data *uio_data) 3674 { 3675 struct drxj_data *ext_attr = (struct drxj_data *) (NULL); 3676 int rc; 3677 u16 pin_cfg_value = 0; 3678 u16 value = 0; 3679 3680 if ((uio_data == NULL) || (demod == NULL)) 3681 return -EINVAL; 3682 3683 ext_attr = (struct drxj_data *) demod->my_ext_attr; 3684 3685 /* Write magic word to enable pdr reg write */ 3686 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0); 3687 if (rc != 0) { 3688 pr_err("error %d\n", rc); 3689 goto rw_error; 3690 } 3691 switch (uio_data->uio) { 3692 /*====================================================================*/ 3693 case DRX_UIO1: 3694 /* DRX_UIO1: SMA_TX UIO-1 */ 3695 if (!ext_attr->has_smatx) 3696 return -EIO; 3697 if ((ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_READWRITE) 3698 && (ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_FIRMWARE_SAW)) { 3699 return -EIO; 3700 } 3701 pin_cfg_value = 0; 3702 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */ 3703 pin_cfg_value |= 0x0113; 3704 /* io_pad_cfg_mode output mode is drive always */ 3705 /* io_pad_cfg_drive is set to power 2 (23 mA) */ 3706 3707 /* write to io pad configuration register - output mode */ 3708 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, pin_cfg_value, 0); 3709 if (rc != 0) { 3710 pr_err("error %d\n", rc); 3711 goto rw_error; 3712 } 3713 3714 /* use corresponding bit in io data output registar */ 3715 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0); 3716 if (rc != 0) { 3717 pr_err("error %d\n", rc); 3718 goto rw_error; 3719 } 3720 if (!uio_data->value) 3721 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */ 3722 else 3723 value |= 0x8000; /* write one to 15th bit - 1st UIO */ 3724 3725 /* write back to io data output register */ 3726 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0); 3727 if (rc != 0) { 3728 pr_err("error %d\n", rc); 3729 goto rw_error; 3730 } 3731 break; 3732 /*======================================================================*/ 3733 case DRX_UIO2: 3734 /* DRX_UIO2: SMA_RX UIO-2 */ 3735 if (!ext_attr->has_smarx) 3736 return -EIO; 3737 if (ext_attr->uio_sma_rx_mode != DRX_UIO_MODE_READWRITE) 3738 return -EIO; 3739 3740 pin_cfg_value = 0; 3741 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */ 3742 pin_cfg_value |= 0x0113; 3743 /* io_pad_cfg_mode output mode is drive always */ 3744 /* io_pad_cfg_drive is set to power 2 (23 mA) */ 3745 3746 /* write to io pad configuration register - output mode */ 3747 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, pin_cfg_value, 0); 3748 if (rc != 0) { 3749 pr_err("error %d\n", rc); 3750 goto rw_error; 3751 } 3752 3753 /* use corresponding bit in io data output registar */ 3754 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0); 3755 if (rc != 0) { 3756 pr_err("error %d\n", rc); 3757 goto rw_error; 3758 } 3759 if (!uio_data->value) 3760 value &= 0xBFFF; /* write zero to 14th bit - 2nd UIO */ 3761 else 3762 value |= 0x4000; /* write one to 14th bit - 2nd UIO */ 3763 3764 /* write back to io data output register */ 3765 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0); 3766 if (rc != 0) { 3767 pr_err("error %d\n", rc); 3768 goto rw_error; 3769 } 3770 break; 3771 /*====================================================================*/ 3772 case DRX_UIO3: 3773 /* DRX_UIO3: ASEL UIO-3 */ 3774 if (!ext_attr->has_gpio) 3775 return -EIO; 3776 if (ext_attr->uio_gpio_mode != DRX_UIO_MODE_READWRITE) 3777 return -EIO; 3778 3779 pin_cfg_value = 0; 3780 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */ 3781 pin_cfg_value |= 0x0113; 3782 /* io_pad_cfg_mode output mode is drive always */ 3783 /* io_pad_cfg_drive is set to power 2 (23 mA) */ 3784 3785 /* write to io pad configuration register - output mode */ 3786 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, pin_cfg_value, 0); 3787 if (rc != 0) { 3788 pr_err("error %d\n", rc); 3789 goto rw_error; 3790 } 3791 3792 /* use corresponding bit in io data output registar */ 3793 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, &value, 0); 3794 if (rc != 0) { 3795 pr_err("error %d\n", rc); 3796 goto rw_error; 3797 } 3798 if (!uio_data->value) 3799 value &= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */ 3800 else 3801 value |= 0x0004; /* write one to 2nd bit - 3rd UIO */ 3802 3803 /* write back to io data output register */ 3804 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, value, 0); 3805 if (rc != 0) { 3806 pr_err("error %d\n", rc); 3807 goto rw_error; 3808 } 3809 break; 3810 /*=====================================================================*/ 3811 case DRX_UIO4: 3812 /* DRX_UIO4: IRQN UIO-4 */ 3813 if (!ext_attr->has_irqn) 3814 return -EIO; 3815 3816 if (ext_attr->uio_irqn_mode != DRX_UIO_MODE_READWRITE) 3817 return -EIO; 3818 3819 pin_cfg_value = 0; 3820 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */ 3821 pin_cfg_value |= 0x0113; 3822 /* io_pad_cfg_mode output mode is drive always */ 3823 /* io_pad_cfg_drive is set to power 2 (23 mA) */ 3824 3825 /* write to io pad configuration register - output mode */ 3826 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, pin_cfg_value, 0); 3827 if (rc != 0) { 3828 pr_err("error %d\n", rc); 3829 goto rw_error; 3830 } 3831 3832 /* use corresponding bit in io data output registar */ 3833 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0); 3834 if (rc != 0) { 3835 pr_err("error %d\n", rc); 3836 goto rw_error; 3837 } 3838 if (uio_data->value == false) 3839 value &= 0xEFFF; /* write zero to 12th bit - 4th UIO */ 3840 else 3841 value |= 0x1000; /* write one to 12th bit - 4th UIO */ 3842 3843 /* write back to io data output register */ 3844 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0); 3845 if (rc != 0) { 3846 pr_err("error %d\n", rc); 3847 goto rw_error; 3848 } 3849 break; 3850 /*=====================================================================*/ 3851 default: 3852 return -EINVAL; 3853 } /* switch ( uio_data->uio ) */ 3854 3855 /* Write magic word to disable pdr reg write */ 3856 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0); 3857 if (rc != 0) { 3858 pr_err("error %d\n", rc); 3859 goto rw_error; 3860 } 3861 3862 return 0; 3863 rw_error: 3864 return rc; 3865 } 3866 3867 /*---------------------------------------------------------------------------*/ 3868 /* UIO Configuration Functions - end */ 3869 /*---------------------------------------------------------------------------*/ 3870 3871 /*----------------------------------------------------------------------------*/ 3872 /* I2C Bridge Functions - begin */ 3873 /*----------------------------------------------------------------------------*/ 3874 /* 3875 * \fn int ctrl_i2c_bridge() 3876 * \brief Open or close the I2C switch to tuner. 3877 * \param demod Pointer to demodulator instance. 3878 * \param bridge_closed Pointer to bool indication if bridge is closed not. 3879 * \return int. 3880 3881 */ 3882 static int 3883 ctrl_i2c_bridge(struct drx_demod_instance *demod, bool *bridge_closed) 3884 { 3885 struct drxj_hi_cmd hi_cmd; 3886 u16 result = 0; 3887 3888 /* check arguments */ 3889 if (bridge_closed == NULL) 3890 return -EINVAL; 3891 3892 hi_cmd.cmd = SIO_HI_RA_RAM_CMD_BRDCTRL; 3893 hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY; 3894 if (*bridge_closed) 3895 hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED; 3896 else 3897 hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN; 3898 3899 return hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result); 3900 } 3901 3902 /*----------------------------------------------------------------------------*/ 3903 /* I2C Bridge Functions - end */ 3904 /*----------------------------------------------------------------------------*/ 3905 3906 /*----------------------------------------------------------------------------*/ 3907 /* Smart antenna Functions - begin */ 3908 /*----------------------------------------------------------------------------*/ 3909 /* 3910 * \fn int smart_ant_init() 3911 * \brief Initialize Smart Antenna. 3912 * \param pointer to struct drx_demod_instance. 3913 * \return int. 3914 * 3915 */ 3916 static int smart_ant_init(struct drx_demod_instance *demod) 3917 { 3918 struct drxj_data *ext_attr = NULL; 3919 struct i2c_device_addr *dev_addr = NULL; 3920 struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SMA }; 3921 int rc; 3922 u16 data = 0; 3923 3924 dev_addr = demod->my_i2c_dev_addr; 3925 ext_attr = (struct drxj_data *) demod->my_ext_attr; 3926 3927 /* Write magic word to enable pdr reg write */ 3928 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0); 3929 if (rc != 0) { 3930 pr_err("error %d\n", rc); 3931 goto rw_error; 3932 } 3933 /* init smart antenna */ 3934 rc = drxj_dap_read_reg16(dev_addr, SIO_SA_TX_COMMAND__A, &data, 0); 3935 if (rc != 0) { 3936 pr_err("error %d\n", rc); 3937 goto rw_error; 3938 } 3939 if (ext_attr->smart_ant_inverted) { 3940 rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data | SIO_SA_TX_COMMAND_TX_INVERT__M) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0); 3941 if (rc != 0) { 3942 pr_err("error %d\n", rc); 3943 goto rw_error; 3944 } 3945 } else { 3946 rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data & (~SIO_SA_TX_COMMAND_TX_INVERT__M)) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0); 3947 if (rc != 0) { 3948 pr_err("error %d\n", rc); 3949 goto rw_error; 3950 } 3951 } 3952 3953 /* config SMA_TX pin to smart antenna mode */ 3954 rc = ctrl_set_uio_cfg(demod, &uio_cfg); 3955 if (rc != 0) { 3956 pr_err("error %d\n", rc); 3957 goto rw_error; 3958 } 3959 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0x13, 0); 3960 if (rc != 0) { 3961 pr_err("error %d\n", rc); 3962 goto rw_error; 3963 } 3964 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_GPIO_FNC__A, 0x03, 0); 3965 if (rc != 0) { 3966 pr_err("error %d\n", rc); 3967 goto rw_error; 3968 } 3969 3970 /* Write magic word to disable pdr reg write */ 3971 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0); 3972 if (rc != 0) { 3973 pr_err("error %d\n", rc); 3974 goto rw_error; 3975 } 3976 3977 return 0; 3978 rw_error: 3979 return rc; 3980 } 3981 3982 static int scu_command(struct i2c_device_addr *dev_addr, struct drxjscu_cmd *cmd) 3983 { 3984 int rc; 3985 u16 cur_cmd = 0; 3986 unsigned long timeout; 3987 3988 /* Check param */ 3989 if (cmd == NULL) 3990 return -EINVAL; 3991 3992 /* Wait until SCU command interface is ready to receive command */ 3993 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0); 3994 if (rc != 0) { 3995 pr_err("error %d\n", rc); 3996 goto rw_error; 3997 } 3998 if (cur_cmd != DRX_SCU_READY) 3999 return -EIO; 4000 4001 switch (cmd->parameter_len) { 4002 case 5: 4003 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_4__A, *(cmd->parameter + 4), 0); 4004 if (rc != 0) { 4005 pr_err("error %d\n", rc); 4006 goto rw_error; 4007 } 4008 fallthrough; 4009 case 4: 4010 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_3__A, *(cmd->parameter + 3), 0); 4011 if (rc != 0) { 4012 pr_err("error %d\n", rc); 4013 goto rw_error; 4014 } 4015 fallthrough; 4016 case 3: 4017 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_2__A, *(cmd->parameter + 2), 0); 4018 if (rc != 0) { 4019 pr_err("error %d\n", rc); 4020 goto rw_error; 4021 } 4022 fallthrough; 4023 case 2: 4024 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_1__A, *(cmd->parameter + 1), 0); 4025 if (rc != 0) { 4026 pr_err("error %d\n", rc); 4027 goto rw_error; 4028 } 4029 fallthrough; 4030 case 1: 4031 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_0__A, *(cmd->parameter + 0), 0); 4032 if (rc != 0) { 4033 pr_err("error %d\n", rc); 4034 goto rw_error; 4035 } 4036 fallthrough; 4037 case 0: 4038 /* do nothing */ 4039 break; 4040 default: 4041 /* this number of parameters is not supported */ 4042 return -EIO; 4043 } 4044 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_COMMAND__A, cmd->command, 0); 4045 if (rc != 0) { 4046 pr_err("error %d\n", rc); 4047 goto rw_error; 4048 } 4049 4050 /* Wait until SCU has processed command */ 4051 timeout = jiffies + msecs_to_jiffies(DRXJ_MAX_WAITTIME); 4052 while (time_is_after_jiffies(timeout)) { 4053 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0); 4054 if (rc != 0) { 4055 pr_err("error %d\n", rc); 4056 goto rw_error; 4057 } 4058 if (cur_cmd == DRX_SCU_READY) 4059 break; 4060 usleep_range(1000, 2000); 4061 } 4062 4063 if (cur_cmd != DRX_SCU_READY) 4064 return -EIO; 4065 4066 /* read results */ 4067 if ((cmd->result_len > 0) && (cmd->result != NULL)) { 4068 s16 err; 4069 4070 switch (cmd->result_len) { 4071 case 4: 4072 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_3__A, cmd->result + 3, 0); 4073 if (rc != 0) { 4074 pr_err("error %d\n", rc); 4075 goto rw_error; 4076 } 4077 fallthrough; 4078 case 3: 4079 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_2__A, cmd->result + 2, 0); 4080 if (rc != 0) { 4081 pr_err("error %d\n", rc); 4082 goto rw_error; 4083 } 4084 fallthrough; 4085 case 2: 4086 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_1__A, cmd->result + 1, 0); 4087 if (rc != 0) { 4088 pr_err("error %d\n", rc); 4089 goto rw_error; 4090 } 4091 fallthrough; 4092 case 1: 4093 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_0__A, cmd->result + 0, 0); 4094 if (rc != 0) { 4095 pr_err("error %d\n", rc); 4096 goto rw_error; 4097 } 4098 fallthrough; 4099 case 0: 4100 /* do nothing */ 4101 break; 4102 default: 4103 /* this number of parameters is not supported */ 4104 return -EIO; 4105 } 4106 4107 /* Check if an error was reported by SCU */ 4108 err = cmd->result[0]; 4109 4110 /* check a few fixed error codes */ 4111 if ((err == (s16) SCU_RAM_PARAM_0_RESULT_UNKSTD) 4112 || (err == (s16) SCU_RAM_PARAM_0_RESULT_UNKCMD) 4113 || (err == (s16) SCU_RAM_PARAM_0_RESULT_INVPAR) 4114 || (err == (s16) SCU_RAM_PARAM_0_RESULT_SIZE) 4115 ) { 4116 return -EINVAL; 4117 } 4118 /* here it is assumed that negative means error, and positive no error */ 4119 else if (err < 0) 4120 return -EIO; 4121 else 4122 return 0; 4123 } 4124 4125 return 0; 4126 4127 rw_error: 4128 return rc; 4129 } 4130 4131 /* 4132 * \fn int DRXJ_DAP_SCUAtomicReadWriteBlock() 4133 * \brief Basic access routine for SCU atomic read or write access 4134 * \param dev_addr pointer to i2c dev address 4135 * \param addr destination/source address 4136 * \param datasize size of data buffer in bytes 4137 * \param data pointer to data buffer 4138 * \return int 4139 * \retval 0 Success 4140 * \retval -EIO Timeout, I2C error, illegal bank 4141 * 4142 */ 4143 #define ADDR_AT_SCU_SPACE(x) ((x - 0x82E000) * 2) 4144 static 4145 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 */ 4146 u8 *data, bool read_flag) 4147 { 4148 struct drxjscu_cmd scu_cmd; 4149 int rc; 4150 u16 set_param_parameters[18]; 4151 u16 cmd_result[15]; 4152 4153 /* Parameter check */ 4154 if (!data || !dev_addr || (datasize % 2) || ((datasize / 2) > 16)) 4155 return -EINVAL; 4156 4157 set_param_parameters[1] = (u16) ADDR_AT_SCU_SPACE(addr); 4158 if (read_flag) { /* read */ 4159 set_param_parameters[0] = ((~(0x0080)) & datasize); 4160 scu_cmd.parameter_len = 2; 4161 scu_cmd.result_len = datasize / 2 + 2; 4162 } else { 4163 int i = 0; 4164 4165 set_param_parameters[0] = 0x0080 | datasize; 4166 for (i = 0; i < (datasize / 2); i++) { 4167 set_param_parameters[i + 2] = 4168 (data[2 * i] | (data[(2 * i) + 1] << 8)); 4169 } 4170 scu_cmd.parameter_len = datasize / 2 + 2; 4171 scu_cmd.result_len = 1; 4172 } 4173 4174 scu_cmd.command = 4175 SCU_RAM_COMMAND_STANDARD_TOP | 4176 SCU_RAM_COMMAND_CMD_AUX_SCU_ATOMIC_ACCESS; 4177 scu_cmd.result = cmd_result; 4178 scu_cmd.parameter = set_param_parameters; 4179 rc = scu_command(dev_addr, &scu_cmd); 4180 if (rc != 0) { 4181 pr_err("error %d\n", rc); 4182 goto rw_error; 4183 } 4184 4185 if (read_flag) { 4186 int i = 0; 4187 /* read data from buffer */ 4188 for (i = 0; i < (datasize / 2); i++) { 4189 data[2 * i] = (u8) (scu_cmd.result[i + 2] & 0xFF); 4190 data[(2 * i) + 1] = (u8) (scu_cmd.result[i + 2] >> 8); 4191 } 4192 } 4193 4194 return 0; 4195 4196 rw_error: 4197 return rc; 4198 4199 } 4200 4201 /*============================================================================*/ 4202 4203 /* 4204 * \fn int DRXJ_DAP_AtomicReadReg16() 4205 * \brief Atomic read of 16 bits words 4206 */ 4207 static 4208 int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr *dev_addr, 4209 u32 addr, 4210 u16 *data, u32 flags) 4211 { 4212 u8 buf[2] = { 0 }; 4213 int rc; 4214 u16 word = 0; 4215 4216 if (!data) 4217 return -EINVAL; 4218 4219 rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, true); 4220 if (rc < 0) 4221 return rc; 4222 4223 word = (u16) (buf[0] + (buf[1] << 8)); 4224 4225 *data = word; 4226 4227 return rc; 4228 } 4229 4230 /*============================================================================*/ 4231 /* 4232 * \fn int drxj_dap_scu_atomic_write_reg16() 4233 * \brief Atomic read of 16 bits words 4234 */ 4235 static 4236 int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr *dev_addr, 4237 u32 addr, 4238 u16 data, u32 flags) 4239 { 4240 u8 buf[2]; 4241 int rc; 4242 4243 buf[0] = (u8) (data & 0xff); 4244 buf[1] = (u8) ((data >> 8) & 0xff); 4245 4246 rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, false); 4247 4248 return rc; 4249 } 4250 4251 /* -------------------------------------------------------------------------- */ 4252 /* 4253 * \brief Measure result of ADC synchronisation 4254 * \param demod demod instance 4255 * \param count (returned) count 4256 * \return int. 4257 * \retval 0 Success 4258 * \retval -EIO Failure: I2C error 4259 * 4260 */ 4261 static int adc_sync_measurement(struct drx_demod_instance *demod, u16 *count) 4262 { 4263 struct i2c_device_addr *dev_addr = NULL; 4264 int rc; 4265 u16 data = 0; 4266 4267 dev_addr = demod->my_i2c_dev_addr; 4268 4269 /* Start measurement */ 4270 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE, 0); 4271 if (rc != 0) { 4272 pr_err("error %d\n", rc); 4273 goto rw_error; 4274 } 4275 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_START_LOCK__A, 1, 0); 4276 if (rc != 0) { 4277 pr_err("error %d\n", rc); 4278 goto rw_error; 4279 } 4280 4281 /* Wait at least 3*128*(1/sysclk) <<< 1 millisec */ 4282 msleep(1); 4283 4284 *count = 0; 4285 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE0__A, &data, 0); 4286 if (rc != 0) { 4287 pr_err("error %d\n", rc); 4288 goto rw_error; 4289 } 4290 if (data == 127) 4291 *count = *count + 1; 4292 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE1__A, &data, 0); 4293 if (rc != 0) { 4294 pr_err("error %d\n", rc); 4295 goto rw_error; 4296 } 4297 if (data == 127) 4298 *count = *count + 1; 4299 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE2__A, &data, 0); 4300 if (rc != 0) { 4301 pr_err("error %d\n", rc); 4302 goto rw_error; 4303 } 4304 if (data == 127) 4305 *count = *count + 1; 4306 4307 return 0; 4308 rw_error: 4309 return rc; 4310 } 4311 4312 /* 4313 * \brief Synchronize analog and digital clock domains 4314 * \param demod demod instance 4315 * \return int. 4316 * \retval 0 Success 4317 * \retval -EIO Failure: I2C error or failure to synchronize 4318 * 4319 * An IQM reset will also reset the results of this synchronization. 4320 * After an IQM reset this routine needs to be called again. 4321 * 4322 */ 4323 4324 static int adc_synchronization(struct drx_demod_instance *demod) 4325 { 4326 struct i2c_device_addr *dev_addr = NULL; 4327 int rc; 4328 u16 count = 0; 4329 4330 dev_addr = demod->my_i2c_dev_addr; 4331 4332 rc = adc_sync_measurement(demod, &count); 4333 if (rc != 0) { 4334 pr_err("error %d\n", rc); 4335 goto rw_error; 4336 } 4337 4338 if (count == 1) { 4339 /* Try sampling on a different edge */ 4340 u16 clk_neg = 0; 4341 4342 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_CLKNEG__A, &clk_neg, 0); 4343 if (rc != 0) { 4344 pr_err("error %d\n", rc); 4345 goto rw_error; 4346 } 4347 4348 clk_neg ^= IQM_AF_CLKNEG_CLKNEGDATA__M; 4349 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLKNEG__A, clk_neg, 0); 4350 if (rc != 0) { 4351 pr_err("error %d\n", rc); 4352 goto rw_error; 4353 } 4354 4355 rc = adc_sync_measurement(demod, &count); 4356 if (rc != 0) { 4357 pr_err("error %d\n", rc); 4358 goto rw_error; 4359 } 4360 } 4361 4362 /* TODO: implement fallback scenarios */ 4363 if (count < 2) 4364 return -EIO; 4365 4366 return 0; 4367 rw_error: 4368 return rc; 4369 } 4370 4371 /*============================================================================*/ 4372 /*== END AUXILIARY FUNCTIONS ==*/ 4373 /*============================================================================*/ 4374 4375 /*============================================================================*/ 4376 /*============================================================================*/ 4377 /*== 8VSB & QAM COMMON DATAPATH FUNCTIONS ==*/ 4378 /*============================================================================*/ 4379 /*============================================================================*/ 4380 /* 4381 * \fn int init_agc () 4382 * \brief Initialize AGC for all standards. 4383 * \param demod instance of demodulator. 4384 * \param channel pointer to channel data. 4385 * \return int. 4386 */ 4387 static int init_agc(struct drx_demod_instance *demod) 4388 { 4389 struct i2c_device_addr *dev_addr = NULL; 4390 struct drx_common_attr *common_attr = NULL; 4391 struct drxj_data *ext_attr = NULL; 4392 struct drxj_cfg_agc *p_agc_rf_settings = NULL; 4393 struct drxj_cfg_agc *p_agc_if_settings = NULL; 4394 int rc; 4395 u16 ingain_tgt_max = 0; 4396 u16 clp_dir_to = 0; 4397 u16 sns_sum_max = 0; 4398 u16 clp_sum_max = 0; 4399 u16 sns_dir_to = 0; 4400 u16 ki_innergain_min = 0; 4401 u16 agc_ki = 0; 4402 u16 ki_max = 0; 4403 u16 if_iaccu_hi_tgt_min = 0; 4404 u16 data = 0; 4405 u16 agc_ki_dgain = 0; 4406 u16 ki_min = 0; 4407 u16 clp_ctrl_mode = 0; 4408 u16 agc_rf = 0; 4409 u16 agc_if = 0; 4410 4411 dev_addr = demod->my_i2c_dev_addr; 4412 common_attr = (struct drx_common_attr *) demod->my_common_attr; 4413 ext_attr = (struct drxj_data *) demod->my_ext_attr; 4414 4415 switch (ext_attr->standard) { 4416 case DRX_STANDARD_8VSB: 4417 clp_sum_max = 1023; 4418 clp_dir_to = (u16) (-9); 4419 sns_sum_max = 1023; 4420 sns_dir_to = (u16) (-9); 4421 ki_innergain_min = (u16) (-32768); 4422 ki_max = 0x032C; 4423 agc_ki_dgain = 0xC; 4424 if_iaccu_hi_tgt_min = 2047; 4425 ki_min = 0x0117; 4426 ingain_tgt_max = 16383; 4427 clp_ctrl_mode = 0; 4428 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0); 4429 if (rc != 0) { 4430 pr_err("error %d\n", rc); 4431 goto rw_error; 4432 } 4433 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0); 4434 if (rc != 0) { 4435 pr_err("error %d\n", rc); 4436 goto rw_error; 4437 } 4438 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0); 4439 if (rc != 0) { 4440 pr_err("error %d\n", rc); 4441 goto rw_error; 4442 } 4443 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0); 4444 if (rc != 0) { 4445 pr_err("error %d\n", rc); 4446 goto rw_error; 4447 } 4448 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0); 4449 if (rc != 0) { 4450 pr_err("error %d\n", rc); 4451 goto rw_error; 4452 } 4453 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0); 4454 if (rc != 0) { 4455 pr_err("error %d\n", rc); 4456 goto rw_error; 4457 } 4458 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0); 4459 if (rc != 0) { 4460 pr_err("error %d\n", rc); 4461 goto rw_error; 4462 } 4463 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0); 4464 if (rc != 0) { 4465 pr_err("error %d\n", rc); 4466 goto rw_error; 4467 } 4468 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0); 4469 if (rc != 0) { 4470 pr_err("error %d\n", rc); 4471 goto rw_error; 4472 } 4473 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0); 4474 if (rc != 0) { 4475 pr_err("error %d\n", rc); 4476 goto rw_error; 4477 } 4478 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, 1024, 0); 4479 if (rc != 0) { 4480 pr_err("error %d\n", rc); 4481 goto rw_error; 4482 } 4483 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_VSB_AGC_POW_TGT__A, 22600, 0); 4484 if (rc != 0) { 4485 pr_err("error %d\n", rc); 4486 goto rw_error; 4487 } 4488 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, 13200, 0); 4489 if (rc != 0) { 4490 pr_err("error %d\n", rc); 4491 goto rw_error; 4492 } 4493 p_agc_if_settings = &(ext_attr->vsb_if_agc_cfg); 4494 p_agc_rf_settings = &(ext_attr->vsb_rf_agc_cfg); 4495 break; 4496 #ifndef DRXJ_VSB_ONLY 4497 case DRX_STANDARD_ITU_A: 4498 case DRX_STANDARD_ITU_C: 4499 case DRX_STANDARD_ITU_B: 4500 ingain_tgt_max = 5119; 4501 clp_sum_max = 1023; 4502 clp_dir_to = (u16) (-5); 4503 sns_sum_max = 127; 4504 sns_dir_to = (u16) (-3); 4505 ki_innergain_min = 0; 4506 ki_max = 0x0657; 4507 if_iaccu_hi_tgt_min = 2047; 4508 agc_ki_dgain = 0x7; 4509 ki_min = 0x0117; 4510 clp_ctrl_mode = 0; 4511 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0); 4512 if (rc != 0) { 4513 pr_err("error %d\n", rc); 4514 goto rw_error; 4515 } 4516 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0); 4517 if (rc != 0) { 4518 pr_err("error %d\n", rc); 4519 goto rw_error; 4520 } 4521 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0); 4522 if (rc != 0) { 4523 pr_err("error %d\n", rc); 4524 goto rw_error; 4525 } 4526 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0); 4527 if (rc != 0) { 4528 pr_err("error %d\n", rc); 4529 goto rw_error; 4530 } 4531 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0); 4532 if (rc != 0) { 4533 pr_err("error %d\n", rc); 4534 goto rw_error; 4535 } 4536 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0); 4537 if (rc != 0) { 4538 pr_err("error %d\n", rc); 4539 goto rw_error; 4540 } 4541 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0); 4542 if (rc != 0) { 4543 pr_err("error %d\n", rc); 4544 goto rw_error; 4545 } 4546 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0); 4547 if (rc != 0) { 4548 pr_err("error %d\n", rc); 4549 goto rw_error; 4550 } 4551 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0); 4552 if (rc != 0) { 4553 pr_err("error %d\n", rc); 4554 goto rw_error; 4555 } 4556 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0); 4557 if (rc != 0) { 4558 pr_err("error %d\n", rc); 4559 goto rw_error; 4560 } 4561 p_agc_if_settings = &(ext_attr->qam_if_agc_cfg); 4562 p_agc_rf_settings = &(ext_attr->qam_rf_agc_cfg); 4563 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, p_agc_if_settings->top, 0); 4564 if (rc != 0) { 4565 pr_err("error %d\n", rc); 4566 goto rw_error; 4567 } 4568 4569 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &agc_ki, 0); 4570 if (rc != 0) { 4571 pr_err("error %d\n", rc); 4572 goto rw_error; 4573 } 4574 agc_ki &= 0xf000; 4575 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, agc_ki, 0); 4576 if (rc != 0) { 4577 pr_err("error %d\n", rc); 4578 goto rw_error; 4579 } 4580 break; 4581 #endif 4582 default: 4583 return -EINVAL; 4584 } 4585 4586 /* for new AGC interface */ 4587 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_if_settings->top, 0); 4588 if (rc != 0) { 4589 pr_err("error %d\n", rc); 4590 goto rw_error; 4591 } 4592 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, p_agc_if_settings->top, 0); 4593 if (rc != 0) { 4594 pr_err("error %d\n", rc); 4595 goto rw_error; 4596 } /* Gain fed from inner to outer AGC */ 4597 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max, 0); 4598 if (rc != 0) { 4599 pr_err("error %d\n", rc); 4600 goto rw_error; 4601 } 4602 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, if_iaccu_hi_tgt_min, 0); 4603 if (rc != 0) { 4604 pr_err("error %d\n", rc); 4605 goto rw_error; 4606 } 4607 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI__A, 0, 0); 4608 if (rc != 0) { 4609 pr_err("error %d\n", rc); 4610 goto rw_error; 4611 } /* set to p_agc_settings->top before */ 4612 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_LO__A, 0, 0); 4613 if (rc != 0) { 4614 pr_err("error %d\n", rc); 4615 goto rw_error; 4616 } 4617 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, 0, 0); 4618 if (rc != 0) { 4619 pr_err("error %d\n", rc); 4620 goto rw_error; 4621 } 4622 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_LO__A, 0, 0); 4623 if (rc != 0) { 4624 pr_err("error %d\n", rc); 4625 goto rw_error; 4626 } 4627 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_MAX__A, 32767, 0); 4628 if (rc != 0) { 4629 pr_err("error %d\n", rc); 4630 goto rw_error; 4631 } 4632 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max, 0); 4633 if (rc != 0) { 4634 pr_err("error %d\n", rc); 4635 goto rw_error; 4636 } 4637 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max, 0); 4638 if (rc != 0) { 4639 pr_err("error %d\n", rc); 4640 goto rw_error; 4641 } 4642 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, ki_innergain_min, 0); 4643 if (rc != 0) { 4644 pr_err("error %d\n", rc); 4645 goto rw_error; 4646 } 4647 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50, 0); 4648 if (rc != 0) { 4649 pr_err("error %d\n", rc); 4650 goto rw_error; 4651 } 4652 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_CYCLEN__A, 500, 0); 4653 if (rc != 0) { 4654 pr_err("error %d\n", rc); 4655 goto rw_error; 4656 } 4657 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCLEN__A, 500, 0); 4658 if (rc != 0) { 4659 pr_err("error %d\n", rc); 4660 goto rw_error; 4661 } 4662 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20, 0); 4663 if (rc != 0) { 4664 pr_err("error %d\n", rc); 4665 goto rw_error; 4666 } 4667 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MIN__A, ki_min, 0); 4668 if (rc != 0) { 4669 pr_err("error %d\n", rc); 4670 goto rw_error; 4671 } 4672 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAX__A, ki_max, 0); 4673 if (rc != 0) { 4674 pr_err("error %d\n", rc); 4675 goto rw_error; 4676 } 4677 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_RED__A, 0, 0); 4678 if (rc != 0) { 4679 pr_err("error %d\n", rc); 4680 goto rw_error; 4681 } 4682 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MIN__A, 8, 0); 4683 if (rc != 0) { 4684 pr_err("error %d\n", rc); 4685 goto rw_error; 4686 } 4687 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCLEN__A, 500, 0); 4688 if (rc != 0) { 4689 pr_err("error %d\n", rc); 4690 goto rw_error; 4691 } 4692 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to, 0); 4693 if (rc != 0) { 4694 pr_err("error %d\n", rc); 4695 goto rw_error; 4696 } 4697 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MIN__A, 8, 0); 4698 if (rc != 0) { 4699 pr_err("error %d\n", rc); 4700 goto rw_error; 4701 } 4702 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to, 0); 4703 if (rc != 0) { 4704 pr_err("error %d\n", rc); 4705 goto rw_error; 4706 } 4707 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, 50, 0); 4708 if (rc != 0) { 4709 pr_err("error %d\n", rc); 4710 goto rw_error; 4711 } 4712 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode, 0); 4713 if (rc != 0) { 4714 pr_err("error %d\n", rc); 4715 goto rw_error; 4716 } 4717 4718 agc_rf = 0x800 + p_agc_rf_settings->cut_off_current; 4719 if (common_attr->tuner_rf_agc_pol == true) 4720 agc_rf = 0x87ff - agc_rf; 4721 4722 agc_if = 0x800; 4723 if (common_attr->tuner_if_agc_pol == true) 4724 agc_rf = 0x87ff - agc_rf; 4725 4726 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_RF__A, agc_rf, 0); 4727 if (rc != 0) { 4728 pr_err("error %d\n", rc); 4729 goto rw_error; 4730 } 4731 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_IF__A, agc_if, 0); 4732 if (rc != 0) { 4733 pr_err("error %d\n", rc); 4734 goto rw_error; 4735 } 4736 4737 /* Set/restore Ki DGAIN factor */ 4738 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &data, 0); 4739 if (rc != 0) { 4740 pr_err("error %d\n", rc); 4741 goto rw_error; 4742 } 4743 data &= ~SCU_RAM_AGC_KI_DGAIN__M; 4744 data |= (agc_ki_dgain << SCU_RAM_AGC_KI_DGAIN__B); 4745 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, data, 0); 4746 if (rc != 0) { 4747 pr_err("error %d\n", rc); 4748 goto rw_error; 4749 } 4750 4751 return 0; 4752 rw_error: 4753 return rc; 4754 } 4755 4756 /* 4757 * \fn int set_frequency () 4758 * \brief Set frequency shift. 4759 * \param demod instance of demodulator. 4760 * \param channel pointer to channel data. 4761 * \param tuner_freq_offset residual frequency from tuner. 4762 * \return int. 4763 */ 4764 static int 4765 set_frequency(struct drx_demod_instance *demod, 4766 struct drx_channel *channel, s32 tuner_freq_offset) 4767 { 4768 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 4769 struct drxj_data *ext_attr = demod->my_ext_attr; 4770 int rc; 4771 s32 sampling_frequency = 0; 4772 s32 frequency_shift = 0; 4773 s32 if_freq_actual = 0; 4774 s32 rf_freq_residual = -1 * tuner_freq_offset; 4775 s32 adc_freq = 0; 4776 s32 intermediate_freq = 0; 4777 u32 iqm_fs_rate_ofs = 0; 4778 bool adc_flip = true; 4779 bool select_pos_image = false; 4780 bool rf_mirror; 4781 bool tuner_mirror; 4782 bool image_to_select = true; 4783 s32 fm_frequency_shift = 0; 4784 4785 rf_mirror = (ext_attr->mirror == DRX_MIRROR_YES) ? true : false; 4786 tuner_mirror = demod->my_common_attr->mirror_freq_spect ? false : true; 4787 /* 4788 Program frequency shifter 4789 No need to account for mirroring on RF 4790 */ 4791 switch (ext_attr->standard) { 4792 case DRX_STANDARD_ITU_A: 4793 case DRX_STANDARD_ITU_C: 4794 case DRX_STANDARD_PAL_SECAM_LP: 4795 case DRX_STANDARD_8VSB: 4796 select_pos_image = true; 4797 break; 4798 case DRX_STANDARD_FM: 4799 /* After IQM FS sound carrier must appear at 4 Mhz in spect. 4800 Sound carrier is already 3Mhz above centre frequency due 4801 to tuner setting so now add an extra shift of 1MHz... */ 4802 fm_frequency_shift = 1000; 4803 fallthrough; 4804 case DRX_STANDARD_ITU_B: 4805 case DRX_STANDARD_NTSC: 4806 case DRX_STANDARD_PAL_SECAM_BG: 4807 case DRX_STANDARD_PAL_SECAM_DK: 4808 case DRX_STANDARD_PAL_SECAM_I: 4809 case DRX_STANDARD_PAL_SECAM_L: 4810 select_pos_image = false; 4811 break; 4812 default: 4813 return -EINVAL; 4814 } 4815 intermediate_freq = demod->my_common_attr->intermediate_freq; 4816 sampling_frequency = demod->my_common_attr->sys_clock_freq / 3; 4817 if (tuner_mirror) 4818 if_freq_actual = intermediate_freq + rf_freq_residual + fm_frequency_shift; 4819 else 4820 if_freq_actual = intermediate_freq - rf_freq_residual - fm_frequency_shift; 4821 if (if_freq_actual > sampling_frequency / 2) { 4822 /* adc mirrors */ 4823 adc_freq = sampling_frequency - if_freq_actual; 4824 adc_flip = true; 4825 } else { 4826 /* adc doesn't mirror */ 4827 adc_freq = if_freq_actual; 4828 adc_flip = false; 4829 } 4830 4831 frequency_shift = adc_freq; 4832 image_to_select = 4833 (bool) (rf_mirror ^ tuner_mirror ^ adc_flip ^ select_pos_image); 4834 iqm_fs_rate_ofs = frac28(frequency_shift, sampling_frequency); 4835 4836 if (image_to_select) 4837 iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1; 4838 4839 /* Program frequency shifter with tuner offset compensation */ 4840 /* frequency_shift += tuner_freq_offset; TODO */ 4841 rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0); 4842 if (rc != 0) { 4843 pr_err("error %d\n", rc); 4844 goto rw_error; 4845 } 4846 ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs; 4847 ext_attr->pos_image = (bool) (rf_mirror ^ tuner_mirror ^ select_pos_image); 4848 4849 return 0; 4850 rw_error: 4851 return rc; 4852 } 4853 4854 /* 4855 * \fn int get_acc_pkt_err() 4856 * \brief Retrieve signal strength for VSB and QAM. 4857 * \param demod Pointer to demod instance 4858 * \param packet_err Pointer to packet error 4859 * \return int. 4860 * \retval 0 sig_strength contains valid data. 4861 * \retval -EINVAL sig_strength is NULL. 4862 * \retval -EIO Erroneous data, sig_strength contains invalid data. 4863 */ 4864 #ifdef DRXJ_SIGNAL_ACCUM_ERR 4865 static int get_acc_pkt_err(struct drx_demod_instance *demod, u16 *packet_err) 4866 { 4867 int rc; 4868 static u16 pkt_err; 4869 static u16 last_pkt_err; 4870 u16 data = 0; 4871 struct drxj_data *ext_attr = NULL; 4872 struct i2c_device_addr *dev_addr = NULL; 4873 4874 ext_attr = (struct drxj_data *) demod->my_ext_attr; 4875 dev_addr = demod->my_i2c_dev_addr; 4876 4877 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, &data, 0); 4878 if (rc != 0) { 4879 pr_err("error %d\n", rc); 4880 goto rw_error; 4881 } 4882 if (ext_attr->reset_pkt_err_acc) { 4883 last_pkt_err = data; 4884 pkt_err = 0; 4885 ext_attr->reset_pkt_err_acc = false; 4886 } 4887 4888 if (data < last_pkt_err) { 4889 pkt_err += 0xffff - last_pkt_err; 4890 pkt_err += data; 4891 } else { 4892 pkt_err += (data - last_pkt_err); 4893 } 4894 *packet_err = pkt_err; 4895 last_pkt_err = data; 4896 4897 return 0; 4898 rw_error: 4899 return rc; 4900 } 4901 #endif 4902 4903 4904 /*============================================================================*/ 4905 4906 /* 4907 * \fn int set_agc_rf () 4908 * \brief Configure RF AGC 4909 * \param demod instance of demodulator. 4910 * \param agc_settings AGC configuration structure 4911 * \return int. 4912 */ 4913 static int 4914 set_agc_rf(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic) 4915 { 4916 struct i2c_device_addr *dev_addr = NULL; 4917 struct drxj_data *ext_attr = NULL; 4918 struct drxj_cfg_agc *p_agc_settings = NULL; 4919 struct drx_common_attr *common_attr = NULL; 4920 int rc; 4921 drx_write_reg16func_t scu_wr16 = NULL; 4922 drx_read_reg16func_t scu_rr16 = NULL; 4923 4924 common_attr = (struct drx_common_attr *) demod->my_common_attr; 4925 dev_addr = demod->my_i2c_dev_addr; 4926 ext_attr = (struct drxj_data *) demod->my_ext_attr; 4927 4928 if (atomic) { 4929 scu_rr16 = drxj_dap_scu_atomic_read_reg16; 4930 scu_wr16 = drxj_dap_scu_atomic_write_reg16; 4931 } else { 4932 scu_rr16 = drxj_dap_read_reg16; 4933 scu_wr16 = drxj_dap_write_reg16; 4934 } 4935 4936 /* Configure AGC only if standard is currently active */ 4937 if ((ext_attr->standard == agc_settings->standard) || 4938 (DRXJ_ISQAMSTD(ext_attr->standard) && 4939 DRXJ_ISQAMSTD(agc_settings->standard)) || 4940 (DRXJ_ISATVSTD(ext_attr->standard) && 4941 DRXJ_ISATVSTD(agc_settings->standard))) { 4942 u16 data = 0; 4943 4944 switch (agc_settings->ctrl_mode) { 4945 case DRX_AGC_CTRL_AUTO: 4946 4947 /* Enable RF AGC DAC */ 4948 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0); 4949 if (rc != 0) { 4950 pr_err("error %d\n", rc); 4951 goto rw_error; 4952 } 4953 data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE; 4954 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0); 4955 if (rc != 0) { 4956 pr_err("error %d\n", rc); 4957 goto rw_error; 4958 } 4959 4960 /* Enable SCU RF AGC loop */ 4961 rc = (*scu_rr16)(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 data &= ~SCU_RAM_AGC_KI_RF__M; 4967 if (ext_attr->standard == DRX_STANDARD_8VSB) 4968 data |= (2 << SCU_RAM_AGC_KI_RF__B); 4969 else if (DRXJ_ISQAMSTD(ext_attr->standard)) 4970 data |= (5 << SCU_RAM_AGC_KI_RF__B); 4971 else 4972 data |= (4 << SCU_RAM_AGC_KI_RF__B); 4973 4974 if (common_attr->tuner_rf_agc_pol) 4975 data |= SCU_RAM_AGC_KI_INV_RF_POL__M; 4976 else 4977 data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M; 4978 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0); 4979 if (rc != 0) { 4980 pr_err("error %d\n", rc); 4981 goto rw_error; 4982 } 4983 4984 /* Set speed ( using complementary reduction value ) */ 4985 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0); 4986 if (rc != 0) { 4987 pr_err("error %d\n", rc); 4988 goto rw_error; 4989 } 4990 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M; 4991 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); 4992 if (rc != 0) { 4993 pr_err("error %d\n", rc); 4994 goto rw_error; 4995 } 4996 4997 if (agc_settings->standard == DRX_STANDARD_8VSB) 4998 p_agc_settings = &(ext_attr->vsb_if_agc_cfg); 4999 else if (DRXJ_ISQAMSTD(agc_settings->standard)) 5000 p_agc_settings = &(ext_attr->qam_if_agc_cfg); 5001 else if (DRXJ_ISATVSTD(agc_settings->standard)) 5002 p_agc_settings = &(ext_attr->atv_if_agc_cfg); 5003 else 5004 return -EINVAL; 5005 5006 /* Set TOP, only if IF-AGC is in AUTO mode */ 5007 if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) { 5008 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->top, 0); 5009 if (rc != 0) { 5010 pr_err("error %d\n", rc); 5011 goto rw_error; 5012 } 5013 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, agc_settings->top, 0); 5014 if (rc != 0) { 5015 pr_err("error %d\n", rc); 5016 goto rw_error; 5017 } 5018 } 5019 5020 /* Cut-Off current */ 5021 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI_CO__A, agc_settings->cut_off_current, 0); 5022 if (rc != 0) { 5023 pr_err("error %d\n", rc); 5024 goto rw_error; 5025 } 5026 break; 5027 case DRX_AGC_CTRL_USER: 5028 5029 /* Enable RF AGC DAC */ 5030 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0); 5031 if (rc != 0) { 5032 pr_err("error %d\n", rc); 5033 goto rw_error; 5034 } 5035 data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE; 5036 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0); 5037 if (rc != 0) { 5038 pr_err("error %d\n", rc); 5039 goto rw_error; 5040 } 5041 5042 /* Disable SCU RF AGC loop */ 5043 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0); 5044 if (rc != 0) { 5045 pr_err("error %d\n", rc); 5046 goto rw_error; 5047 } 5048 data &= ~SCU_RAM_AGC_KI_RF__M; 5049 if (common_attr->tuner_rf_agc_pol) 5050 data |= SCU_RAM_AGC_KI_INV_RF_POL__M; 5051 else 5052 data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M; 5053 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0); 5054 if (rc != 0) { 5055 pr_err("error %d\n", rc); 5056 goto rw_error; 5057 } 5058 5059 /* Write value to output pin */ 5060 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, agc_settings->output_level, 0); 5061 if (rc != 0) { 5062 pr_err("error %d\n", rc); 5063 goto rw_error; 5064 } 5065 break; 5066 case DRX_AGC_CTRL_OFF: 5067 5068 /* Disable RF AGC DAC */ 5069 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0); 5070 if (rc != 0) { 5071 pr_err("error %d\n", rc); 5072 goto rw_error; 5073 } 5074 data &= (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE); 5075 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0); 5076 if (rc != 0) { 5077 pr_err("error %d\n", rc); 5078 goto rw_error; 5079 } 5080 5081 /* Disable SCU RF AGC loop */ 5082 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0); 5083 if (rc != 0) { 5084 pr_err("error %d\n", rc); 5085 goto rw_error; 5086 } 5087 data &= ~SCU_RAM_AGC_KI_RF__M; 5088 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0); 5089 if (rc != 0) { 5090 pr_err("error %d\n", rc); 5091 goto rw_error; 5092 } 5093 break; 5094 default: 5095 return -EINVAL; 5096 } /* switch ( agcsettings->ctrl_mode ) */ 5097 } 5098 5099 /* Store rf agc settings */ 5100 switch (agc_settings->standard) { 5101 case DRX_STANDARD_8VSB: 5102 ext_attr->vsb_rf_agc_cfg = *agc_settings; 5103 break; 5104 #ifndef DRXJ_VSB_ONLY 5105 case DRX_STANDARD_ITU_A: 5106 case DRX_STANDARD_ITU_B: 5107 case DRX_STANDARD_ITU_C: 5108 ext_attr->qam_rf_agc_cfg = *agc_settings; 5109 break; 5110 #endif 5111 default: 5112 return -EIO; 5113 } 5114 5115 return 0; 5116 rw_error: 5117 return rc; 5118 } 5119 5120 /* 5121 * \fn int set_agc_if () 5122 * \brief Configure If AGC 5123 * \param demod instance of demodulator. 5124 * \param agc_settings AGC configuration structure 5125 * \return int. 5126 */ 5127 static int 5128 set_agc_if(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic) 5129 { 5130 struct i2c_device_addr *dev_addr = NULL; 5131 struct drxj_data *ext_attr = NULL; 5132 struct drxj_cfg_agc *p_agc_settings = NULL; 5133 struct drx_common_attr *common_attr = NULL; 5134 drx_write_reg16func_t scu_wr16 = NULL; 5135 drx_read_reg16func_t scu_rr16 = NULL; 5136 int rc; 5137 5138 common_attr = (struct drx_common_attr *) demod->my_common_attr; 5139 dev_addr = demod->my_i2c_dev_addr; 5140 ext_attr = (struct drxj_data *) demod->my_ext_attr; 5141 5142 if (atomic) { 5143 scu_rr16 = drxj_dap_scu_atomic_read_reg16; 5144 scu_wr16 = drxj_dap_scu_atomic_write_reg16; 5145 } else { 5146 scu_rr16 = drxj_dap_read_reg16; 5147 scu_wr16 = drxj_dap_write_reg16; 5148 } 5149 5150 /* Configure AGC only if standard is currently active */ 5151 if ((ext_attr->standard == agc_settings->standard) || 5152 (DRXJ_ISQAMSTD(ext_attr->standard) && 5153 DRXJ_ISQAMSTD(agc_settings->standard)) || 5154 (DRXJ_ISATVSTD(ext_attr->standard) && 5155 DRXJ_ISATVSTD(agc_settings->standard))) { 5156 u16 data = 0; 5157 5158 switch (agc_settings->ctrl_mode) { 5159 case DRX_AGC_CTRL_AUTO: 5160 /* Enable IF AGC DAC */ 5161 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0); 5162 if (rc != 0) { 5163 pr_err("error %d\n", rc); 5164 goto rw_error; 5165 } 5166 data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE; 5167 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0); 5168 if (rc != 0) { 5169 pr_err("error %d\n", rc); 5170 goto rw_error; 5171 } 5172 5173 /* Enable SCU IF AGC loop */ 5174 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0); 5175 if (rc != 0) { 5176 pr_err("error %d\n", rc); 5177 goto rw_error; 5178 } 5179 data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M; 5180 data &= ~SCU_RAM_AGC_KI_IF__M; 5181 if (ext_attr->standard == DRX_STANDARD_8VSB) 5182 data |= (3 << SCU_RAM_AGC_KI_IF__B); 5183 else if (DRXJ_ISQAMSTD(ext_attr->standard)) 5184 data |= (6 << SCU_RAM_AGC_KI_IF__B); 5185 else 5186 data |= (5 << SCU_RAM_AGC_KI_IF__B); 5187 5188 if (common_attr->tuner_if_agc_pol) 5189 data |= SCU_RAM_AGC_KI_INV_IF_POL__M; 5190 else 5191 data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M; 5192 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0); 5193 if (rc != 0) { 5194 pr_err("error %d\n", rc); 5195 goto rw_error; 5196 } 5197 5198 /* Set speed (using complementary reduction value) */ 5199 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0); 5200 if (rc != 0) { 5201 pr_err("error %d\n", rc); 5202 goto rw_error; 5203 } 5204 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M; 5205 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); 5206 if (rc != 0) { 5207 pr_err("error %d\n", rc); 5208 goto rw_error; 5209 } 5210 5211 if (agc_settings->standard == DRX_STANDARD_8VSB) 5212 p_agc_settings = &(ext_attr->vsb_rf_agc_cfg); 5213 else if (DRXJ_ISQAMSTD(agc_settings->standard)) 5214 p_agc_settings = &(ext_attr->qam_rf_agc_cfg); 5215 else if (DRXJ_ISATVSTD(agc_settings->standard)) 5216 p_agc_settings = &(ext_attr->atv_rf_agc_cfg); 5217 else 5218 return -EINVAL; 5219 5220 /* Restore TOP */ 5221 if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) { 5222 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, p_agc_settings->top, 0); 5223 if (rc != 0) { 5224 pr_err("error %d\n", rc); 5225 goto rw_error; 5226 } 5227 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, p_agc_settings->top, 0); 5228 if (rc != 0) { 5229 pr_err("error %d\n", rc); 5230 goto rw_error; 5231 } 5232 } else { 5233 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, 0, 0); 5234 if (rc != 0) { 5235 pr_err("error %d\n", rc); 5236 goto rw_error; 5237 } 5238 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, 0, 0); 5239 if (rc != 0) { 5240 pr_err("error %d\n", rc); 5241 goto rw_error; 5242 } 5243 } 5244 break; 5245 5246 case DRX_AGC_CTRL_USER: 5247 5248 /* Enable IF AGC DAC */ 5249 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0); 5250 if (rc != 0) { 5251 pr_err("error %d\n", rc); 5252 goto rw_error; 5253 } 5254 data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE; 5255 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0); 5256 if (rc != 0) { 5257 pr_err("error %d\n", rc); 5258 goto rw_error; 5259 } 5260 5261 /* Disable SCU IF AGC loop */ 5262 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0); 5263 if (rc != 0) { 5264 pr_err("error %d\n", rc); 5265 goto rw_error; 5266 } 5267 data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M; 5268 data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M; 5269 if (common_attr->tuner_if_agc_pol) 5270 data |= SCU_RAM_AGC_KI_INV_IF_POL__M; 5271 else 5272 data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M; 5273 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0); 5274 if (rc != 0) { 5275 pr_err("error %d\n", rc); 5276 goto rw_error; 5277 } 5278 5279 /* Write value to output pin */ 5280 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->output_level, 0); 5281 if (rc != 0) { 5282 pr_err("error %d\n", rc); 5283 goto rw_error; 5284 } 5285 break; 5286 5287 case DRX_AGC_CTRL_OFF: 5288 5289 /* Disable If AGC DAC */ 5290 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0); 5291 if (rc != 0) { 5292 pr_err("error %d\n", rc); 5293 goto rw_error; 5294 } 5295 data &= (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE); 5296 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0); 5297 if (rc != 0) { 5298 pr_err("error %d\n", rc); 5299 goto rw_error; 5300 } 5301 5302 /* Disable SCU IF AGC loop */ 5303 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0); 5304 if (rc != 0) { 5305 pr_err("error %d\n", rc); 5306 goto rw_error; 5307 } 5308 data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M; 5309 data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M; 5310 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0); 5311 if (rc != 0) { 5312 pr_err("error %d\n", rc); 5313 goto rw_error; 5314 } 5315 break; 5316 default: 5317 return -EINVAL; 5318 } /* switch ( agcsettings->ctrl_mode ) */ 5319 5320 /* always set the top to support configurations without if-loop */ 5321 rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, agc_settings->top, 0); 5322 if (rc != 0) { 5323 pr_err("error %d\n", rc); 5324 goto rw_error; 5325 } 5326 } 5327 5328 /* Store if agc settings */ 5329 switch (agc_settings->standard) { 5330 case DRX_STANDARD_8VSB: 5331 ext_attr->vsb_if_agc_cfg = *agc_settings; 5332 break; 5333 #ifndef DRXJ_VSB_ONLY 5334 case DRX_STANDARD_ITU_A: 5335 case DRX_STANDARD_ITU_B: 5336 case DRX_STANDARD_ITU_C: 5337 ext_attr->qam_if_agc_cfg = *agc_settings; 5338 break; 5339 #endif 5340 default: 5341 return -EIO; 5342 } 5343 5344 return 0; 5345 rw_error: 5346 return rc; 5347 } 5348 5349 /* 5350 * \fn int set_iqm_af () 5351 * \brief Configure IQM AF registers 5352 * \param demod instance of demodulator. 5353 * \param active 5354 * \return int. 5355 */ 5356 static int set_iqm_af(struct drx_demod_instance *demod, bool active) 5357 { 5358 u16 data = 0; 5359 struct i2c_device_addr *dev_addr = NULL; 5360 int rc; 5361 5362 dev_addr = demod->my_i2c_dev_addr; 5363 5364 /* Configure IQM */ 5365 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0); 5366 if (rc != 0) { 5367 pr_err("error %d\n", rc); 5368 goto rw_error; 5369 } 5370 if (!active) 5371 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)); 5372 else 5373 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); 5374 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0); 5375 if (rc != 0) { 5376 pr_err("error %d\n", rc); 5377 goto rw_error; 5378 } 5379 5380 return 0; 5381 rw_error: 5382 return rc; 5383 } 5384 5385 /*============================================================================*/ 5386 /*== END 8VSB & QAM COMMON DATAPATH FUNCTIONS ==*/ 5387 /*============================================================================*/ 5388 5389 /*============================================================================*/ 5390 /*============================================================================*/ 5391 /*== 8VSB DATAPATH FUNCTIONS ==*/ 5392 /*============================================================================*/ 5393 /*============================================================================*/ 5394 5395 /* 5396 * \fn int power_down_vsb () 5397 * \brief Powr down QAM related blocks. 5398 * \param demod instance of demodulator. 5399 * \param channel pointer to channel data. 5400 * \return int. 5401 */ 5402 static int power_down_vsb(struct drx_demod_instance *demod, bool primary) 5403 { 5404 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 5405 struct drxjscu_cmd cmd_scu = { /* command */ 0, 5406 /* parameter_len */ 0, 5407 /* result_len */ 0, 5408 /* *parameter */ NULL, 5409 /* *result */ NULL 5410 }; 5411 struct drx_cfg_mpeg_output cfg_mpeg_output; 5412 int rc; 5413 u16 cmd_result = 0; 5414 5415 /* 5416 STOP demodulator 5417 reset of FEC and VSB HW 5418 */ 5419 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB | 5420 SCU_RAM_COMMAND_CMD_DEMOD_STOP; 5421 cmd_scu.parameter_len = 0; 5422 cmd_scu.result_len = 1; 5423 cmd_scu.parameter = NULL; 5424 cmd_scu.result = &cmd_result; 5425 rc = scu_command(dev_addr, &cmd_scu); 5426 if (rc != 0) { 5427 pr_err("error %d\n", rc); 5428 goto rw_error; 5429 } 5430 5431 /* stop all comm_exec */ 5432 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0); 5433 if (rc != 0) { 5434 pr_err("error %d\n", rc); 5435 goto rw_error; 5436 } 5437 rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0); 5438 if (rc != 0) { 5439 pr_err("error %d\n", rc); 5440 goto rw_error; 5441 } 5442 if (primary) { 5443 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0); 5444 if (rc != 0) { 5445 pr_err("error %d\n", rc); 5446 goto rw_error; 5447 } 5448 rc = set_iqm_af(demod, false); 5449 if (rc != 0) { 5450 pr_err("error %d\n", rc); 5451 goto rw_error; 5452 } 5453 } else { 5454 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0); 5455 if (rc != 0) { 5456 pr_err("error %d\n", rc); 5457 goto rw_error; 5458 } 5459 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0); 5460 if (rc != 0) { 5461 pr_err("error %d\n", rc); 5462 goto rw_error; 5463 } 5464 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0); 5465 if (rc != 0) { 5466 pr_err("error %d\n", rc); 5467 goto rw_error; 5468 } 5469 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0); 5470 if (rc != 0) { 5471 pr_err("error %d\n", rc); 5472 goto rw_error; 5473 } 5474 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0); 5475 if (rc != 0) { 5476 pr_err("error %d\n", rc); 5477 goto rw_error; 5478 } 5479 } 5480 5481 cfg_mpeg_output.enable_mpeg_output = false; 5482 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output); 5483 if (rc != 0) { 5484 pr_err("error %d\n", rc); 5485 goto rw_error; 5486 } 5487 5488 return 0; 5489 rw_error: 5490 return rc; 5491 } 5492 5493 /* 5494 * \fn int set_vsb_leak_n_gain () 5495 * \brief Set ATSC demod. 5496 * \param demod instance of demodulator. 5497 * \return int. 5498 */ 5499 static int set_vsb_leak_n_gain(struct drx_demod_instance *demod) 5500 { 5501 struct i2c_device_addr *dev_addr = NULL; 5502 int rc; 5503 5504 static const u8 vsb_ffe_leak_gain_ram0[] = { 5505 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO1 */ 5506 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO2 */ 5507 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO3 */ 5508 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO4 */ 5509 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO5 */ 5510 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO6 */ 5511 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO7 */ 5512 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO8 */ 5513 DRXJ_16TO8(0xf), /* FFETRAINLKRATIO9 */ 5514 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO10 */ 5515 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO11 */ 5516 DRXJ_16TO8(0x8), /* FFETRAINLKRATIO12 */ 5517 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO1 */ 5518 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO2 */ 5519 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO3 */ 5520 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO4 */ 5521 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO5 */ 5522 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO6 */ 5523 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO7 */ 5524 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO8 */ 5525 DRXJ_16TO8(0x20), /* FFERCA1TRAINLKRATIO9 */ 5526 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO10 */ 5527 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO11 */ 5528 DRXJ_16TO8(0x10), /* FFERCA1TRAINLKRATIO12 */ 5529 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO1 */ 5530 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO2 */ 5531 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO3 */ 5532 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO4 */ 5533 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO5 */ 5534 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO6 */ 5535 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO7 */ 5536 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO8 */ 5537 DRXJ_16TO8(0x20), /* FFERCA1DATALKRATIO9 */ 5538 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO10 */ 5539 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO11 */ 5540 DRXJ_16TO8(0x10), /* FFERCA1DATALKRATIO12 */ 5541 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO1 */ 5542 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO2 */ 5543 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO3 */ 5544 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO4 */ 5545 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO5 */ 5546 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO6 */ 5547 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO7 */ 5548 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO8 */ 5549 DRXJ_16TO8(0x20), /* FFERCA2TRAINLKRATIO9 */ 5550 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO10 */ 5551 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO11 */ 5552 DRXJ_16TO8(0x10), /* FFERCA2TRAINLKRATIO12 */ 5553 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO1 */ 5554 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO2 */ 5555 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO3 */ 5556 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO4 */ 5557 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO5 */ 5558 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO6 */ 5559 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO7 */ 5560 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO8 */ 5561 DRXJ_16TO8(0x20), /* FFERCA2DATALKRATIO9 */ 5562 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO10 */ 5563 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO11 */ 5564 DRXJ_16TO8(0x10), /* FFERCA2DATALKRATIO12 */ 5565 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO1 */ 5566 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO2 */ 5567 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO3 */ 5568 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO4 */ 5569 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO5 */ 5570 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO6 */ 5571 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO7 */ 5572 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO8 */ 5573 DRXJ_16TO8(0x0e), /* FFEDDM1TRAINLKRATIO9 */ 5574 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO10 */ 5575 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO11 */ 5576 DRXJ_16TO8(0x07), /* FFEDDM1TRAINLKRATIO12 */ 5577 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO1 */ 5578 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO2 */ 5579 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO3 */ 5580 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO4 */ 5581 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO5 */ 5582 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO6 */ 5583 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO7 */ 5584 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO8 */ 5585 DRXJ_16TO8(0x0e), /* FFEDDM1DATALKRATIO9 */ 5586 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO10 */ 5587 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO11 */ 5588 DRXJ_16TO8(0x07), /* FFEDDM1DATALKRATIO12 */ 5589 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO1 */ 5590 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO2 */ 5591 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO3 */ 5592 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO4 */ 5593 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO5 */ 5594 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO6 */ 5595 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO7 */ 5596 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO8 */ 5597 DRXJ_16TO8(0x0c), /* FFEDDM2TRAINLKRATIO9 */ 5598 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO10 */ 5599 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO11 */ 5600 DRXJ_16TO8(0x06), /* FFEDDM2TRAINLKRATIO12 */ 5601 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO1 */ 5602 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO2 */ 5603 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO3 */ 5604 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO4 */ 5605 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO5 */ 5606 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO6 */ 5607 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO7 */ 5608 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO8 */ 5609 DRXJ_16TO8(0x0c), /* FFEDDM2DATALKRATIO9 */ 5610 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO10 */ 5611 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO11 */ 5612 DRXJ_16TO8(0x06), /* FFEDDM2DATALKRATIO12 */ 5613 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN1 */ 5614 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN2 */ 5615 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN3 */ 5616 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN4 */ 5617 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN5 */ 5618 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN6 */ 5619 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN7 */ 5620 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN8 */ 5621 DRXJ_16TO8(0x4040), /* FIRTRAINGAIN9 */ 5622 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN10 */ 5623 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN11 */ 5624 DRXJ_16TO8(0x2020), /* FIRTRAINGAIN12 */ 5625 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN1 */ 5626 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN2 */ 5627 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN3 */ 5628 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN4 */ 5629 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN5 */ 5630 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN6 */ 5631 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN7 */ 5632 DRXJ_16TO8(0x1010) /* FIRRCA1GAIN8 */ 5633 }; 5634 5635 static const u8 vsb_ffe_leak_gain_ram1[] = { 5636 DRXJ_16TO8(0x1010), /* FIRRCA1GAIN9 */ 5637 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN10 */ 5638 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN11 */ 5639 DRXJ_16TO8(0x0808), /* FIRRCA1GAIN12 */ 5640 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN1 */ 5641 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN2 */ 5642 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN3 */ 5643 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN4 */ 5644 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN5 */ 5645 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN6 */ 5646 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN7 */ 5647 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN8 */ 5648 DRXJ_16TO8(0x1010), /* FIRRCA2GAIN9 */ 5649 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN10 */ 5650 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN11 */ 5651 DRXJ_16TO8(0x0808), /* FIRRCA2GAIN12 */ 5652 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN1 */ 5653 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN2 */ 5654 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN3 */ 5655 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN4 */ 5656 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN5 */ 5657 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN6 */ 5658 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN7 */ 5659 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN8 */ 5660 DRXJ_16TO8(0x0606), /* FIRDDM1GAIN9 */ 5661 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN10 */ 5662 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN11 */ 5663 DRXJ_16TO8(0x0303), /* FIRDDM1GAIN12 */ 5664 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN1 */ 5665 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN2 */ 5666 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN3 */ 5667 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN4 */ 5668 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN5 */ 5669 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN6 */ 5670 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN7 */ 5671 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN8 */ 5672 DRXJ_16TO8(0x0505), /* FIRDDM2GAIN9 */ 5673 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN10 */ 5674 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN11 */ 5675 DRXJ_16TO8(0x0303), /* FIRDDM2GAIN12 */ 5676 DRXJ_16TO8(0x001f), /* DFETRAINLKRATIO */ 5677 DRXJ_16TO8(0x01ff), /* DFERCA1TRAINLKRATIO */ 5678 DRXJ_16TO8(0x01ff), /* DFERCA1DATALKRATIO */ 5679 DRXJ_16TO8(0x004f), /* DFERCA2TRAINLKRATIO */ 5680 DRXJ_16TO8(0x004f), /* DFERCA2DATALKRATIO */ 5681 DRXJ_16TO8(0x01ff), /* DFEDDM1TRAINLKRATIO */ 5682 DRXJ_16TO8(0x01ff), /* DFEDDM1DATALKRATIO */ 5683 DRXJ_16TO8(0x0352), /* DFEDDM2TRAINLKRATIO */ 5684 DRXJ_16TO8(0x0352), /* DFEDDM2DATALKRATIO */ 5685 DRXJ_16TO8(0x0000), /* DFETRAINGAIN */ 5686 DRXJ_16TO8(0x2020), /* DFERCA1GAIN */ 5687 DRXJ_16TO8(0x1010), /* DFERCA2GAIN */ 5688 DRXJ_16TO8(0x1818), /* DFEDDM1GAIN */ 5689 DRXJ_16TO8(0x1212) /* DFEDDM2GAIN */ 5690 }; 5691 5692 dev_addr = demod->my_i2c_dev_addr; 5693 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); 5694 if (rc != 0) { 5695 pr_err("error %d\n", rc); 5696 goto rw_error; 5697 } 5698 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); 5699 if (rc != 0) { 5700 pr_err("error %d\n", rc); 5701 goto rw_error; 5702 } 5703 5704 return 0; 5705 rw_error: 5706 return rc; 5707 } 5708 5709 /* 5710 * \fn int set_vsb() 5711 * \brief Set 8VSB demod. 5712 * \param demod instance of demodulator. 5713 * \return int. 5714 * 5715 */ 5716 static int set_vsb(struct drx_demod_instance *demod) 5717 { 5718 struct i2c_device_addr *dev_addr = NULL; 5719 int rc; 5720 struct drx_common_attr *common_attr = NULL; 5721 struct drxjscu_cmd cmd_scu; 5722 struct drxj_data *ext_attr = NULL; 5723 u16 cmd_result = 0; 5724 u16 cmd_param = 0; 5725 static const u8 vsb_taps_re[] = { 5726 DRXJ_16TO8(-2), /* re0 */ 5727 DRXJ_16TO8(4), /* re1 */ 5728 DRXJ_16TO8(1), /* re2 */ 5729 DRXJ_16TO8(-4), /* re3 */ 5730 DRXJ_16TO8(1), /* re4 */ 5731 DRXJ_16TO8(4), /* re5 */ 5732 DRXJ_16TO8(-3), /* re6 */ 5733 DRXJ_16TO8(-3), /* re7 */ 5734 DRXJ_16TO8(6), /* re8 */ 5735 DRXJ_16TO8(1), /* re9 */ 5736 DRXJ_16TO8(-9), /* re10 */ 5737 DRXJ_16TO8(3), /* re11 */ 5738 DRXJ_16TO8(12), /* re12 */ 5739 DRXJ_16TO8(-9), /* re13 */ 5740 DRXJ_16TO8(-15), /* re14 */ 5741 DRXJ_16TO8(17), /* re15 */ 5742 DRXJ_16TO8(19), /* re16 */ 5743 DRXJ_16TO8(-29), /* re17 */ 5744 DRXJ_16TO8(-22), /* re18 */ 5745 DRXJ_16TO8(45), /* re19 */ 5746 DRXJ_16TO8(25), /* re20 */ 5747 DRXJ_16TO8(-70), /* re21 */ 5748 DRXJ_16TO8(-28), /* re22 */ 5749 DRXJ_16TO8(111), /* re23 */ 5750 DRXJ_16TO8(30), /* re24 */ 5751 DRXJ_16TO8(-201), /* re25 */ 5752 DRXJ_16TO8(-31), /* re26 */ 5753 DRXJ_16TO8(629) /* re27 */ 5754 }; 5755 5756 dev_addr = demod->my_i2c_dev_addr; 5757 common_attr = (struct drx_common_attr *) demod->my_common_attr; 5758 ext_attr = (struct drxj_data *) demod->my_ext_attr; 5759 5760 /* stop all comm_exec */ 5761 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0); 5762 if (rc != 0) { 5763 pr_err("error %d\n", rc); 5764 goto rw_error; 5765 } 5766 rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0); 5767 if (rc != 0) { 5768 pr_err("error %d\n", rc); 5769 goto rw_error; 5770 } 5771 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0); 5772 if (rc != 0) { 5773 pr_err("error %d\n", rc); 5774 goto rw_error; 5775 } 5776 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0); 5777 if (rc != 0) { 5778 pr_err("error %d\n", rc); 5779 goto rw_error; 5780 } 5781 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0); 5782 if (rc != 0) { 5783 pr_err("error %d\n", rc); 5784 goto rw_error; 5785 } 5786 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0); 5787 if (rc != 0) { 5788 pr_err("error %d\n", rc); 5789 goto rw_error; 5790 } 5791 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0); 5792 if (rc != 0) { 5793 pr_err("error %d\n", rc); 5794 goto rw_error; 5795 } 5796 5797 /* reset demodulator */ 5798 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB 5799 | SCU_RAM_COMMAND_CMD_DEMOD_RESET; 5800 cmd_scu.parameter_len = 0; 5801 cmd_scu.result_len = 1; 5802 cmd_scu.parameter = NULL; 5803 cmd_scu.result = &cmd_result; 5804 rc = scu_command(dev_addr, &cmd_scu); 5805 if (rc != 0) { 5806 pr_err("error %d\n", rc); 5807 goto rw_error; 5808 } 5809 5810 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_DCF_BYPASS__A, 1, 0); 5811 if (rc != 0) { 5812 pr_err("error %d\n", rc); 5813 goto rw_error; 5814 } 5815 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, IQM_FS_ADJ_SEL_B_VSB, 0); 5816 if (rc != 0) { 5817 pr_err("error %d\n", rc); 5818 goto rw_error; 5819 } 5820 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, IQM_RC_ADJ_SEL_B_VSB, 0); 5821 if (rc != 0) { 5822 pr_err("error %d\n", rc); 5823 goto rw_error; 5824 } 5825 ext_attr->iqm_rc_rate_ofs = 0x00AD0D79; 5826 rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, ext_attr->iqm_rc_rate_ofs, 0); 5827 if (rc != 0) { 5828 pr_err("error %d\n", rc); 5829 goto rw_error; 5830 } 5831 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CFAGC_GAINSHIFT__A, 4, 0); 5832 if (rc != 0) { 5833 pr_err("error %d\n", rc); 5834 goto rw_error; 5835 } 5836 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 1, 0); 5837 if (rc != 0) { 5838 pr_err("error %d\n", rc); 5839 goto rw_error; 5840 } 5841 5842 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_CROUT_ENA__A, 1, 0); 5843 if (rc != 0) { 5844 pr_err("error %d\n", rc); 5845 goto rw_error; 5846 } 5847 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, 28, 0); 5848 if (rc != 0) { 5849 pr_err("error %d\n", rc); 5850 goto rw_error; 5851 } 5852 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_ACTIVE__A, 0, 0); 5853 if (rc != 0) { 5854 pr_err("error %d\n", rc); 5855 goto rw_error; 5856 } 5857 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0); 5858 if (rc != 0) { 5859 pr_err("error %d\n", rc); 5860 goto rw_error; 5861 } 5862 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0); 5863 if (rc != 0) { 5864 pr_err("error %d\n", rc); 5865 goto rw_error; 5866 } 5867 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_VSB__M, 0); 5868 if (rc != 0) { 5869 pr_err("error %d\n", rc); 5870 goto rw_error; 5871 } 5872 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE__A, 1393, 0); 5873 if (rc != 0) { 5874 pr_err("error %d\n", rc); 5875 goto rw_error; 5876 } 5877 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0); 5878 if (rc != 0) { 5879 pr_err("error %d\n", rc); 5880 goto rw_error; 5881 } 5882 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0); 5883 if (rc != 0) { 5884 pr_err("error %d\n", rc); 5885 goto rw_error; 5886 } 5887 5888 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0); 5889 if (rc != 0) { 5890 pr_err("error %d\n", rc); 5891 goto rw_error; 5892 } 5893 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0); 5894 if (rc != 0) { 5895 pr_err("error %d\n", rc); 5896 goto rw_error; 5897 } 5898 5899 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BNTHRESH__A, 330, 0); 5900 if (rc != 0) { 5901 pr_err("error %d\n", rc); 5902 goto rw_error; 5903 } /* set higher threshold */ 5904 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CLPLASTNUM__A, 90, 0); 5905 if (rc != 0) { 5906 pr_err("error %d\n", rc); 5907 goto rw_error; 5908 } /* burst detection on */ 5909 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA1__A, 0x0042, 0); 5910 if (rc != 0) { 5911 pr_err("error %d\n", rc); 5912 goto rw_error; 5913 } /* drop thresholds by 1 dB */ 5914 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA2__A, 0x0053, 0); 5915 if (rc != 0) { 5916 pr_err("error %d\n", rc); 5917 goto rw_error; 5918 } /* drop thresholds by 2 dB */ 5919 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_EQCTRL__A, 0x1, 0); 5920 if (rc != 0) { 5921 pr_err("error %d\n", rc); 5922 goto rw_error; 5923 } /* cma on */ 5924 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0); 5925 if (rc != 0) { 5926 pr_err("error %d\n", rc); 5927 goto rw_error; 5928 } /* GPIO */ 5929 5930 /* Initialize the FEC Subsystem */ 5931 rc = drxj_dap_write_reg16(dev_addr, FEC_TOP_ANNEX__A, FEC_TOP_ANNEX_D, 0); 5932 if (rc != 0) { 5933 pr_err("error %d\n", rc); 5934 goto rw_error; 5935 } 5936 { 5937 u16 fec_oc_snc_mode = 0; 5938 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0); 5939 if (rc != 0) { 5940 pr_err("error %d\n", rc); 5941 goto rw_error; 5942 } 5943 /* output data even when not locked */ 5944 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode | FEC_OC_SNC_MODE_UNLOCK_ENABLE__M, 0); 5945 if (rc != 0) { 5946 pr_err("error %d\n", rc); 5947 goto rw_error; 5948 } 5949 } 5950 5951 /* set clip */ 5952 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0); 5953 if (rc != 0) { 5954 pr_err("error %d\n", rc); 5955 goto rw_error; 5956 } 5957 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 470, 0); 5958 if (rc != 0) { 5959 pr_err("error %d\n", rc); 5960 goto rw_error; 5961 } 5962 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0); 5963 if (rc != 0) { 5964 pr_err("error %d\n", rc); 5965 goto rw_error; 5966 } 5967 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0xD4, 0); 5968 if (rc != 0) { 5969 pr_err("error %d\n", rc); 5970 goto rw_error; 5971 } 5972 /* no transparent, no A&C framing; parity is set in mpegoutput */ 5973 { 5974 u16 fec_oc_reg_mode = 0; 5975 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 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_OC_MODE__A, fec_oc_reg_mode & (~(FEC_OC_MODE_TRANSPARENT__M | FEC_OC_MODE_CLEAR__M | FEC_OC_MODE_RETAIN_FRAMING__M)), 0); 5981 if (rc != 0) { 5982 pr_err("error %d\n", rc); 5983 goto rw_error; 5984 } 5985 } 5986 5987 rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_LO__A, 0, 0); 5988 if (rc != 0) { 5989 pr_err("error %d\n", rc); 5990 goto rw_error; 5991 } /* timeout counter for restarting */ 5992 rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_HI__A, 3, 0); 5993 if (rc != 0) { 5994 pr_err("error %d\n", rc); 5995 goto rw_error; 5996 } 5997 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MODE__A, 0, 0); 5998 if (rc != 0) { 5999 pr_err("error %d\n", rc); 6000 goto rw_error; 6001 } /* bypass disabled */ 6002 /* initialize RS packet error measurement parameters */ 6003 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, FEC_RS_MEASUREMENT_PERIOD, 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, FEC_RS_MEASUREMENT_PRESCALE__A, FEC_RS_MEASUREMENT_PRESCALE, 0); 6009 if (rc != 0) { 6010 pr_err("error %d\n", rc); 6011 goto rw_error; 6012 } 6013 6014 /* init measurement period of MER/SER */ 6015 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_MEASUREMENT_PERIOD__A, VSB_TOP_MEASUREMENT_PERIOD, 0); 6016 if (rc != 0) { 6017 pr_err("error %d\n", rc); 6018 goto rw_error; 6019 } 6020 rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0); 6021 if (rc != 0) { 6022 pr_err("error %d\n", rc); 6023 goto rw_error; 6024 } 6025 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0); 6026 if (rc != 0) { 6027 pr_err("error %d\n", rc); 6028 goto rw_error; 6029 } 6030 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0); 6031 if (rc != 0) { 6032 pr_err("error %d\n", rc); 6033 goto rw_error; 6034 } 6035 6036 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CKGN1TRK__A, 128, 0); 6037 if (rc != 0) { 6038 pr_err("error %d\n", rc); 6039 goto rw_error; 6040 } 6041 /* B-Input to ADC, PGA+filter in standby */ 6042 if (!ext_attr->has_lna) { 6043 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0); 6044 if (rc != 0) { 6045 pr_err("error %d\n", rc); 6046 goto rw_error; 6047 } 6048 } 6049 6050 /* turn on IQMAF. It has to be in front of setAgc**() */ 6051 rc = set_iqm_af(demod, true); 6052 if (rc != 0) { 6053 pr_err("error %d\n", rc); 6054 goto rw_error; 6055 } 6056 rc = adc_synchronization(demod); 6057 if (rc != 0) { 6058 pr_err("error %d\n", rc); 6059 goto rw_error; 6060 } 6061 6062 rc = init_agc(demod); 6063 if (rc != 0) { 6064 pr_err("error %d\n", rc); 6065 goto rw_error; 6066 } 6067 rc = set_agc_if(demod, &(ext_attr->vsb_if_agc_cfg), false); 6068 if (rc != 0) { 6069 pr_err("error %d\n", rc); 6070 goto rw_error; 6071 } 6072 rc = set_agc_rf(demod, &(ext_attr->vsb_rf_agc_cfg), false); 6073 if (rc != 0) { 6074 pr_err("error %d\n", rc); 6075 goto rw_error; 6076 } 6077 { 6078 /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead 6079 of only the gain */ 6080 struct drxj_cfg_afe_gain vsb_pga_cfg = { DRX_STANDARD_8VSB, 0 }; 6081 6082 vsb_pga_cfg.gain = ext_attr->vsb_pga_cfg; 6083 rc = ctrl_set_cfg_afe_gain(demod, &vsb_pga_cfg); 6084 if (rc != 0) { 6085 pr_err("error %d\n", rc); 6086 goto rw_error; 6087 } 6088 } 6089 rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->vsb_pre_saw_cfg)); 6090 if (rc != 0) { 6091 pr_err("error %d\n", rc); 6092 goto rw_error; 6093 } 6094 6095 /* Mpeg output has to be in front of FEC active */ 6096 rc = set_mpegtei_handling(demod); 6097 if (rc != 0) { 6098 pr_err("error %d\n", rc); 6099 goto rw_error; 6100 } 6101 rc = bit_reverse_mpeg_output(demod); 6102 if (rc != 0) { 6103 pr_err("error %d\n", rc); 6104 goto rw_error; 6105 } 6106 rc = set_mpeg_start_width(demod); 6107 if (rc != 0) { 6108 pr_err("error %d\n", rc); 6109 goto rw_error; 6110 } 6111 { 6112 /* TODO: move to set_standard after hardware reset value problem is solved */ 6113 /* Configure initial MPEG output */ 6114 struct drx_cfg_mpeg_output cfg_mpeg_output; 6115 6116 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output)); 6117 cfg_mpeg_output.enable_mpeg_output = true; 6118 6119 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output); 6120 if (rc != 0) { 6121 pr_err("error %d\n", rc); 6122 goto rw_error; 6123 } 6124 } 6125 6126 /* TBD: what parameters should be set */ 6127 cmd_param = 0x00; /* Default mode AGC on, etc */ 6128 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB 6129 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM; 6130 cmd_scu.parameter_len = 1; 6131 cmd_scu.result_len = 1; 6132 cmd_scu.parameter = &cmd_param; 6133 cmd_scu.result = &cmd_result; 6134 rc = scu_command(dev_addr, &cmd_scu); 6135 if (rc != 0) { 6136 pr_err("error %d\n", rc); 6137 goto rw_error; 6138 } 6139 6140 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEAGC_GAINSHIFT__A, 0x0004, 0); 6141 if (rc != 0) { 6142 pr_err("error %d\n", rc); 6143 goto rw_error; 6144 } 6145 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0x00D2, 0); 6146 if (rc != 0) { 6147 pr_err("error %d\n", rc); 6148 goto rw_error; 6149 } 6150 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SYSSMTRNCTRL__A, VSB_TOP_SYSSMTRNCTRL__PRE | VSB_TOP_SYSSMTRNCTRL_NCOTIMEOUTCNTEN__M, 0); 6151 if (rc != 0) { 6152 pr_err("error %d\n", rc); 6153 goto rw_error; 6154 } 6155 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEDETCTRL__A, 0x142, 0); 6156 if (rc != 0) { 6157 pr_err("error %d\n", rc); 6158 goto rw_error; 6159 } 6160 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_LBAGCREFLVL__A, 640, 0); 6161 if (rc != 0) { 6162 pr_err("error %d\n", rc); 6163 goto rw_error; 6164 } 6165 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1ACQ__A, 4, 0); 6166 if (rc != 0) { 6167 pr_err("error %d\n", rc); 6168 goto rw_error; 6169 } 6170 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 2, 0); 6171 if (rc != 0) { 6172 pr_err("error %d\n", rc); 6173 goto rw_error; 6174 } 6175 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN2TRK__A, 3, 0); 6176 if (rc != 0) { 6177 pr_err("error %d\n", rc); 6178 goto rw_error; 6179 } 6180 6181 /* start demodulator */ 6182 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB 6183 | SCU_RAM_COMMAND_CMD_DEMOD_START; 6184 cmd_scu.parameter_len = 0; 6185 cmd_scu.result_len = 1; 6186 cmd_scu.parameter = NULL; 6187 cmd_scu.result = &cmd_result; 6188 rc = scu_command(dev_addr, &cmd_scu); 6189 if (rc != 0) { 6190 pr_err("error %d\n", rc); 6191 goto rw_error; 6192 } 6193 6194 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0); 6195 if (rc != 0) { 6196 pr_err("error %d\n", rc); 6197 goto rw_error; 6198 } 6199 rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_ACTIVE, 0); 6200 if (rc != 0) { 6201 pr_err("error %d\n", rc); 6202 goto rw_error; 6203 } 6204 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0); 6205 if (rc != 0) { 6206 pr_err("error %d\n", rc); 6207 goto rw_error; 6208 } 6209 6210 return 0; 6211 rw_error: 6212 return rc; 6213 } 6214 6215 /* 6216 * \fn static short get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *PckErrs) 6217 * \brief Get the values of packet error in 8VSB mode 6218 * \return Error code 6219 */ 6220 static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, 6221 u32 *pck_errs, u32 *pck_count) 6222 { 6223 int rc; 6224 u16 data = 0; 6225 u16 period = 0; 6226 u16 prescale = 0; 6227 u16 packet_errors_mant = 0; 6228 u16 packet_errors_exp = 0; 6229 6230 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &data, 0); 6231 if (rc != 0) { 6232 pr_err("error %d\n", rc); 6233 goto rw_error; 6234 } 6235 packet_errors_mant = data & FEC_RS_NR_FAILURES_FIXED_MANT__M; 6236 packet_errors_exp = (data & FEC_RS_NR_FAILURES_EXP__M) 6237 >> FEC_RS_NR_FAILURES_EXP__B; 6238 period = FEC_RS_MEASUREMENT_PERIOD; 6239 prescale = FEC_RS_MEASUREMENT_PRESCALE; 6240 /* packet error rate = (error packet number) per second */ 6241 /* 77.3 us is time for per packet */ 6242 if (period * prescale == 0) { 6243 pr_err("error: period and/or prescale is zero!\n"); 6244 return -EIO; 6245 } 6246 *pck_errs = packet_errors_mant * (1 << packet_errors_exp); 6247 *pck_count = period * prescale * 77; 6248 6249 return 0; 6250 rw_error: 6251 return rc; 6252 } 6253 6254 /* 6255 * \fn static short GetVSBBer(struct i2c_device_addr *dev_addr, u32 *ber) 6256 * \brief Get the values of ber in VSB mode 6257 * \return Error code 6258 */ 6259 static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr, 6260 u32 *ber, u32 *cnt) 6261 { 6262 int rc; 6263 u16 data = 0; 6264 u16 period = 0; 6265 u16 prescale = 0; 6266 u16 bit_errors_mant = 0; 6267 u16 bit_errors_exp = 0; 6268 6269 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &data, 0); 6270 if (rc != 0) { 6271 pr_err("error %d\n", rc); 6272 goto rw_error; 6273 } 6274 period = FEC_RS_MEASUREMENT_PERIOD; 6275 prescale = FEC_RS_MEASUREMENT_PRESCALE; 6276 6277 bit_errors_mant = data & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M; 6278 bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M) 6279 >> FEC_RS_NR_BIT_ERRORS_EXP__B; 6280 6281 *cnt = period * prescale * 207 * ((bit_errors_exp > 2) ? 1 : 8); 6282 6283 if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700) 6284 *ber = (*cnt) * 26570; 6285 else { 6286 if (period * prescale == 0) { 6287 pr_err("error: period and/or prescale is zero!\n"); 6288 return -EIO; 6289 } 6290 *ber = bit_errors_mant << ((bit_errors_exp > 2) ? 6291 (bit_errors_exp - 3) : bit_errors_exp); 6292 } 6293 6294 return 0; 6295 rw_error: 6296 return rc; 6297 } 6298 6299 /* 6300 * \fn static short get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber) 6301 * \brief Get the values of ber in VSB mode 6302 * \return Error code 6303 */ 6304 static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, 6305 u32 *ber, u32 *cnt) 6306 { 6307 u16 data = 0; 6308 int rc; 6309 6310 rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0); 6311 if (rc != 0) { 6312 pr_err("error %d\n", rc); 6313 return -EIO; 6314 } 6315 *ber = data; 6316 *cnt = VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT; 6317 6318 return 0; 6319 } 6320 6321 /* 6322 * \fn static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer) 6323 * \brief Get the values of MER 6324 * \return Error code 6325 */ 6326 static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer) 6327 { 6328 int rc; 6329 u16 data_hi = 0; 6330 6331 rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_ERR_ENERGY_H__A, &data_hi, 0); 6332 if (rc != 0) { 6333 pr_err("error %d\n", rc); 6334 goto rw_error; 6335 } 6336 *mer = 6337 (u16) (log1_times100(21504) - log1_times100((data_hi << 6) / 52)); 6338 6339 return 0; 6340 rw_error: 6341 return rc; 6342 } 6343 6344 6345 /*============================================================================*/ 6346 /*== END 8VSB DATAPATH FUNCTIONS ==*/ 6347 /*============================================================================*/ 6348 6349 /*============================================================================*/ 6350 /*============================================================================*/ 6351 /*== QAM DATAPATH FUNCTIONS ==*/ 6352 /*============================================================================*/ 6353 /*============================================================================*/ 6354 6355 /* 6356 * \fn int power_down_qam () 6357 * \brief Powr down QAM related blocks. 6358 * \param demod instance of demodulator. 6359 * \param channel pointer to channel data. 6360 * \return int. 6361 */ 6362 static int power_down_qam(struct drx_demod_instance *demod, bool primary) 6363 { 6364 struct drxjscu_cmd cmd_scu = { /* command */ 0, 6365 /* parameter_len */ 0, 6366 /* result_len */ 0, 6367 /* *parameter */ NULL, 6368 /* *result */ NULL 6369 }; 6370 int rc; 6371 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 6372 struct drx_cfg_mpeg_output cfg_mpeg_output; 6373 struct drx_common_attr *common_attr = demod->my_common_attr; 6374 u16 cmd_result = 0; 6375 6376 /* 6377 STOP demodulator 6378 resets IQM, QAM and FEC HW blocks 6379 */ 6380 /* stop all comm_exec */ 6381 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0); 6382 if (rc != 0) { 6383 pr_err("error %d\n", rc); 6384 goto rw_error; 6385 } 6386 rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0); 6387 if (rc != 0) { 6388 pr_err("error %d\n", rc); 6389 goto rw_error; 6390 } 6391 6392 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM | 6393 SCU_RAM_COMMAND_CMD_DEMOD_STOP; 6394 cmd_scu.parameter_len = 0; 6395 cmd_scu.result_len = 1; 6396 cmd_scu.parameter = NULL; 6397 cmd_scu.result = &cmd_result; 6398 rc = scu_command(dev_addr, &cmd_scu); 6399 if (rc != 0) { 6400 pr_err("error %d\n", rc); 6401 goto rw_error; 6402 } 6403 6404 if (primary) { 6405 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0); 6406 if (rc != 0) { 6407 pr_err("error %d\n", rc); 6408 goto rw_error; 6409 } 6410 rc = set_iqm_af(demod, false); 6411 if (rc != 0) { 6412 pr_err("error %d\n", rc); 6413 goto rw_error; 6414 } 6415 } else { 6416 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0); 6417 if (rc != 0) { 6418 pr_err("error %d\n", rc); 6419 goto rw_error; 6420 } 6421 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0); 6422 if (rc != 0) { 6423 pr_err("error %d\n", rc); 6424 goto rw_error; 6425 } 6426 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0); 6427 if (rc != 0) { 6428 pr_err("error %d\n", rc); 6429 goto rw_error; 6430 } 6431 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0); 6432 if (rc != 0) { 6433 pr_err("error %d\n", rc); 6434 goto rw_error; 6435 } 6436 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0); 6437 if (rc != 0) { 6438 pr_err("error %d\n", rc); 6439 goto rw_error; 6440 } 6441 } 6442 6443 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output)); 6444 cfg_mpeg_output.enable_mpeg_output = false; 6445 6446 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output); 6447 if (rc != 0) { 6448 pr_err("error %d\n", rc); 6449 goto rw_error; 6450 } 6451 6452 return 0; 6453 rw_error: 6454 return rc; 6455 } 6456 6457 /*============================================================================*/ 6458 6459 /* 6460 * \fn int set_qam_measurement () 6461 * \brief Setup of the QAM Measuremnt intervals for signal quality 6462 * \param demod instance of demod. 6463 * \param constellation current constellation. 6464 * \return int. 6465 * 6466 * NOTE: 6467 * Take into account that for certain settings the errorcounters can overflow. 6468 * The implementation does not check this. 6469 * 6470 * TODO: overriding the ext_attr->fec_bits_desired by constellation dependent 6471 * constants to get a measurement period of approx. 1 sec. Remove fec_bits_desired 6472 * field ? 6473 * 6474 */ 6475 #ifndef DRXJ_VSB_ONLY 6476 static int 6477 set_qam_measurement(struct drx_demod_instance *demod, 6478 enum drx_modulation constellation, u32 symbol_rate) 6479 { 6480 struct i2c_device_addr *dev_addr = NULL; /* device address for I2C writes */ 6481 struct drxj_data *ext_attr = NULL; /* Global data container for DRXJ specific data */ 6482 int rc; 6483 u32 fec_bits_desired = 0; /* BER accounting period */ 6484 u16 fec_rs_plen = 0; /* defines RS BER measurement period */ 6485 u16 fec_rs_prescale = 0; /* ReedSolomon Measurement Prescale */ 6486 u32 fec_rs_period = 0; /* Value for corresponding I2C register */ 6487 u32 fec_rs_bit_cnt = 0; /* Actual precise amount of bits */ 6488 u32 fec_oc_snc_fail_period = 0; /* Value for corresponding I2C register */ 6489 u32 qam_vd_period = 0; /* Value for corresponding I2C register */ 6490 u32 qam_vd_bit_cnt = 0; /* Actual precise amount of bits */ 6491 u16 fec_vd_plen = 0; /* no of trellis symbols: VD SER measur period */ 6492 u16 qam_vd_prescale = 0; /* Viterbi Measurement Prescale */ 6493 6494 dev_addr = demod->my_i2c_dev_addr; 6495 ext_attr = (struct drxj_data *) demod->my_ext_attr; 6496 6497 fec_bits_desired = ext_attr->fec_bits_desired; 6498 fec_rs_prescale = ext_attr->fec_rs_prescale; 6499 6500 switch (constellation) { 6501 case DRX_CONSTELLATION_QAM16: 6502 fec_bits_desired = 4 * symbol_rate; 6503 break; 6504 case DRX_CONSTELLATION_QAM32: 6505 fec_bits_desired = 5 * symbol_rate; 6506 break; 6507 case DRX_CONSTELLATION_QAM64: 6508 fec_bits_desired = 6 * symbol_rate; 6509 break; 6510 case DRX_CONSTELLATION_QAM128: 6511 fec_bits_desired = 7 * symbol_rate; 6512 break; 6513 case DRX_CONSTELLATION_QAM256: 6514 fec_bits_desired = 8 * symbol_rate; 6515 break; 6516 default: 6517 return -EINVAL; 6518 } 6519 6520 /* Parameters for Reed-Solomon Decoder */ 6521 /* fecrs_period = (int)ceil(FEC_BITS_DESIRED/(fecrs_prescale*plen)) */ 6522 /* rs_bit_cnt = fecrs_period*fecrs_prescale*plen */ 6523 /* result is within 32 bit arithmetic -> */ 6524 /* no need for mult or frac functions */ 6525 6526 /* TODO: use constant instead of calculation and remove the fec_rs_plen in ext_attr */ 6527 switch (ext_attr->standard) { 6528 case DRX_STANDARD_ITU_A: 6529 case DRX_STANDARD_ITU_C: 6530 fec_rs_plen = 204 * 8; 6531 break; 6532 case DRX_STANDARD_ITU_B: 6533 fec_rs_plen = 128 * 7; 6534 break; 6535 default: 6536 return -EINVAL; 6537 } 6538 6539 ext_attr->fec_rs_plen = fec_rs_plen; /* for getSigQual */ 6540 fec_rs_bit_cnt = fec_rs_prescale * fec_rs_plen; /* temp storage */ 6541 if (fec_rs_bit_cnt == 0) { 6542 pr_err("error: fec_rs_bit_cnt is zero!\n"); 6543 return -EIO; 6544 } 6545 fec_rs_period = fec_bits_desired / fec_rs_bit_cnt + 1; /* ceil */ 6546 if (ext_attr->standard != DRX_STANDARD_ITU_B) 6547 fec_oc_snc_fail_period = fec_rs_period; 6548 6549 /* limit to max 16 bit value (I2C register width) if needed */ 6550 if (fec_rs_period > 0xFFFF) 6551 fec_rs_period = 0xFFFF; 6552 6553 /* write corresponding registers */ 6554 switch (ext_attr->standard) { 6555 case DRX_STANDARD_ITU_A: 6556 case DRX_STANDARD_ITU_C: 6557 break; 6558 case DRX_STANDARD_ITU_B: 6559 switch (constellation) { 6560 case DRX_CONSTELLATION_QAM64: 6561 fec_rs_period = 31581; 6562 fec_oc_snc_fail_period = 17932; 6563 break; 6564 case DRX_CONSTELLATION_QAM256: 6565 fec_rs_period = 45446; 6566 fec_oc_snc_fail_period = 25805; 6567 break; 6568 default: 6569 return -EINVAL; 6570 } 6571 break; 6572 default: 6573 return -EINVAL; 6574 } 6575 6576 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, (u16)fec_oc_snc_fail_period, 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, FEC_RS_MEASUREMENT_PERIOD__A, (u16)fec_rs_period, 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, FEC_RS_MEASUREMENT_PRESCALE__A, fec_rs_prescale, 0); 6587 if (rc != 0) { 6588 pr_err("error %d\n", rc); 6589 goto rw_error; 6590 } 6591 ext_attr->fec_rs_period = (u16) fec_rs_period; 6592 ext_attr->fec_rs_prescale = fec_rs_prescale; 6593 rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0); 6594 if (rc != 0) { 6595 pr_err("error %d\n", rc); 6596 goto rw_error; 6597 } 6598 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0); 6599 if (rc != 0) { 6600 pr_err("error %d\n", rc); 6601 goto rw_error; 6602 } 6603 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0); 6604 if (rc != 0) { 6605 pr_err("error %d\n", rc); 6606 goto rw_error; 6607 } 6608 6609 if (ext_attr->standard == DRX_STANDARD_ITU_B) { 6610 /* Parameters for Viterbi Decoder */ 6611 /* qamvd_period = (int)ceil(FEC_BITS_DESIRED/ */ 6612 /* (qamvd_prescale*plen*(qam_constellation+1))) */ 6613 /* vd_bit_cnt = qamvd_period*qamvd_prescale*plen */ 6614 /* result is within 32 bit arithmetic -> */ 6615 /* no need for mult or frac functions */ 6616 6617 /* a(8 bit) * b(8 bit) = 16 bit result => mult32 not needed */ 6618 fec_vd_plen = ext_attr->fec_vd_plen; 6619 qam_vd_prescale = ext_attr->qam_vd_prescale; 6620 qam_vd_bit_cnt = qam_vd_prescale * fec_vd_plen; /* temp storage */ 6621 6622 switch (constellation) { 6623 case DRX_CONSTELLATION_QAM64: 6624 /* a(16 bit) * b(4 bit) = 20 bit result => mult32 not needed */ 6625 qam_vd_period = 6626 qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM64 + 1) 6627 * (QAM_TOP_CONSTELLATION_QAM64 + 1); 6628 break; 6629 case DRX_CONSTELLATION_QAM256: 6630 /* a(16 bit) * b(5 bit) = 21 bit result => mult32 not needed */ 6631 qam_vd_period = 6632 qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM256 + 1) 6633 * (QAM_TOP_CONSTELLATION_QAM256 + 1); 6634 break; 6635 default: 6636 return -EINVAL; 6637 } 6638 if (qam_vd_period == 0) { 6639 pr_err("error: qam_vd_period is zero!\n"); 6640 return -EIO; 6641 } 6642 qam_vd_period = fec_bits_desired / qam_vd_period; 6643 /* limit to max 16 bit value (I2C register width) if needed */ 6644 if (qam_vd_period > 0xFFFF) 6645 qam_vd_period = 0xFFFF; 6646 6647 /* a(16 bit) * b(16 bit) = 32 bit result => mult32 not needed */ 6648 qam_vd_bit_cnt *= qam_vd_period; 6649 6650 rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PERIOD__A, (u16)qam_vd_period, 0); 6651 if (rc != 0) { 6652 pr_err("error %d\n", rc); 6653 goto rw_error; 6654 } 6655 rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PRESCALE__A, qam_vd_prescale, 0); 6656 if (rc != 0) { 6657 pr_err("error %d\n", rc); 6658 goto rw_error; 6659 } 6660 ext_attr->qam_vd_period = (u16) qam_vd_period; 6661 ext_attr->qam_vd_prescale = qam_vd_prescale; 6662 } 6663 6664 return 0; 6665 rw_error: 6666 return rc; 6667 } 6668 6669 /*============================================================================*/ 6670 6671 /* 6672 * \fn int set_qam16 () 6673 * \brief QAM16 specific setup 6674 * \param demod instance of demod. 6675 * \return int. 6676 */ 6677 static int set_qam16(struct drx_demod_instance *demod) 6678 { 6679 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 6680 int rc; 6681 static const u8 qam_dq_qual_fun[] = { 6682 DRXJ_16TO8(2), /* fun0 */ 6683 DRXJ_16TO8(2), /* fun1 */ 6684 DRXJ_16TO8(2), /* fun2 */ 6685 DRXJ_16TO8(2), /* fun3 */ 6686 DRXJ_16TO8(3), /* fun4 */ 6687 DRXJ_16TO8(3), /* fun5 */ 6688 }; 6689 static const u8 qam_eq_cma_rad[] = { 6690 DRXJ_16TO8(13517), /* RAD0 */ 6691 DRXJ_16TO8(13517), /* RAD1 */ 6692 DRXJ_16TO8(13517), /* RAD2 */ 6693 DRXJ_16TO8(13517), /* RAD3 */ 6694 DRXJ_16TO8(13517), /* RAD4 */ 6695 DRXJ_16TO8(13517), /* RAD5 */ 6696 }; 6697 6698 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0); 6699 if (rc != 0) { 6700 pr_err("error %d\n", rc); 6701 goto rw_error; 6702 } 6703 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); 6704 if (rc != 0) { 6705 pr_err("error %d\n", rc); 6706 goto rw_error; 6707 } 6708 6709 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 140, 0); 6710 if (rc != 0) { 6711 pr_err("error %d\n", rc); 6712 goto rw_error; 6713 } 6714 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0); 6715 if (rc != 0) { 6716 pr_err("error %d\n", rc); 6717 goto rw_error; 6718 } 6719 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 120, 0); 6720 if (rc != 0) { 6721 pr_err("error %d\n", rc); 6722 goto rw_error; 6723 } 6724 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 230, 0); 6725 if (rc != 0) { 6726 pr_err("error %d\n", rc); 6727 goto rw_error; 6728 } 6729 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 95, 0); 6730 if (rc != 0) { 6731 pr_err("error %d\n", rc); 6732 goto rw_error; 6733 } 6734 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 105, 0); 6735 if (rc != 0) { 6736 pr_err("error %d\n", rc); 6737 goto rw_error; 6738 } 6739 6740 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0); 6741 if (rc != 0) { 6742 pr_err("error %d\n", rc); 6743 goto rw_error; 6744 } 6745 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0); 6746 if (rc != 0) { 6747 pr_err("error %d\n", rc); 6748 goto rw_error; 6749 } 6750 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0); 6751 if (rc != 0) { 6752 pr_err("error %d\n", rc); 6753 goto rw_error; 6754 } 6755 6756 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 16, 0); 6757 if (rc != 0) { 6758 pr_err("error %d\n", rc); 6759 goto rw_error; 6760 } 6761 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 220, 0); 6762 if (rc != 0) { 6763 pr_err("error %d\n", rc); 6764 goto rw_error; 6765 } 6766 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 25, 0); 6767 if (rc != 0) { 6768 pr_err("error %d\n", rc); 6769 goto rw_error; 6770 } 6771 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 6, 0); 6772 if (rc != 0) { 6773 pr_err("error %d\n", rc); 6774 goto rw_error; 6775 } 6776 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-24), 0); 6777 if (rc != 0) { 6778 pr_err("error %d\n", rc); 6779 goto rw_error; 6780 } 6781 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-65), 0); 6782 if (rc != 0) { 6783 pr_err("error %d\n", rc); 6784 goto rw_error; 6785 } 6786 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-127), 0); 6787 if (rc != 0) { 6788 pr_err("error %d\n", rc); 6789 goto rw_error; 6790 } 6791 6792 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0); 6793 if (rc != 0) { 6794 pr_err("error %d\n", rc); 6795 goto rw_error; 6796 } 6797 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0); 6798 if (rc != 0) { 6799 pr_err("error %d\n", rc); 6800 goto rw_error; 6801 } 6802 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0); 6803 if (rc != 0) { 6804 pr_err("error %d\n", rc); 6805 goto rw_error; 6806 } 6807 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0); 6808 if (rc != 0) { 6809 pr_err("error %d\n", rc); 6810 goto rw_error; 6811 } 6812 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0); 6813 if (rc != 0) { 6814 pr_err("error %d\n", rc); 6815 goto rw_error; 6816 } 6817 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0); 6818 if (rc != 0) { 6819 pr_err("error %d\n", rc); 6820 goto rw_error; 6821 } 6822 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0); 6823 if (rc != 0) { 6824 pr_err("error %d\n", rc); 6825 goto rw_error; 6826 } 6827 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0); 6828 if (rc != 0) { 6829 pr_err("error %d\n", rc); 6830 goto rw_error; 6831 } 6832 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0); 6833 if (rc != 0) { 6834 pr_err("error %d\n", rc); 6835 goto rw_error; 6836 } 6837 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0); 6838 if (rc != 0) { 6839 pr_err("error %d\n", rc); 6840 goto rw_error; 6841 } 6842 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0); 6843 if (rc != 0) { 6844 pr_err("error %d\n", rc); 6845 goto rw_error; 6846 } 6847 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0); 6848 if (rc != 0) { 6849 pr_err("error %d\n", rc); 6850 goto rw_error; 6851 } 6852 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0); 6853 if (rc != 0) { 6854 pr_err("error %d\n", rc); 6855 goto rw_error; 6856 } 6857 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0); 6858 if (rc != 0) { 6859 pr_err("error %d\n", rc); 6860 goto rw_error; 6861 } 6862 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0); 6863 if (rc != 0) { 6864 pr_err("error %d\n", rc); 6865 goto rw_error; 6866 } 6867 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0); 6868 if (rc != 0) { 6869 pr_err("error %d\n", rc); 6870 goto rw_error; 6871 } 6872 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 240, 0); 6873 if (rc != 0) { 6874 pr_err("error %d\n", rc); 6875 goto rw_error; 6876 } 6877 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0); 6878 if (rc != 0) { 6879 pr_err("error %d\n", rc); 6880 goto rw_error; 6881 } 6882 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0); 6883 if (rc != 0) { 6884 pr_err("error %d\n", rc); 6885 goto rw_error; 6886 } 6887 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0); 6888 if (rc != 0) { 6889 pr_err("error %d\n", rc); 6890 goto rw_error; 6891 } 6892 6893 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 40960, 0); 6894 if (rc != 0) { 6895 pr_err("error %d\n", rc); 6896 goto rw_error; 6897 } 6898 6899 return 0; 6900 rw_error: 6901 return rc; 6902 } 6903 6904 /*============================================================================*/ 6905 6906 /* 6907 * \fn int set_qam32 () 6908 * \brief QAM32 specific setup 6909 * \param demod instance of demod. 6910 * \return int. 6911 */ 6912 static int set_qam32(struct drx_demod_instance *demod) 6913 { 6914 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 6915 int rc; 6916 static const u8 qam_dq_qual_fun[] = { 6917 DRXJ_16TO8(3), /* fun0 */ 6918 DRXJ_16TO8(3), /* fun1 */ 6919 DRXJ_16TO8(3), /* fun2 */ 6920 DRXJ_16TO8(3), /* fun3 */ 6921 DRXJ_16TO8(4), /* fun4 */ 6922 DRXJ_16TO8(4), /* fun5 */ 6923 }; 6924 static const u8 qam_eq_cma_rad[] = { 6925 DRXJ_16TO8(6707), /* RAD0 */ 6926 DRXJ_16TO8(6707), /* RAD1 */ 6927 DRXJ_16TO8(6707), /* RAD2 */ 6928 DRXJ_16TO8(6707), /* RAD3 */ 6929 DRXJ_16TO8(6707), /* RAD4 */ 6930 DRXJ_16TO8(6707), /* RAD5 */ 6931 }; 6932 6933 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0); 6934 if (rc != 0) { 6935 pr_err("error %d\n", rc); 6936 goto rw_error; 6937 } 6938 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); 6939 if (rc != 0) { 6940 pr_err("error %d\n", rc); 6941 goto rw_error; 6942 } 6943 6944 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 90, 0); 6945 if (rc != 0) { 6946 pr_err("error %d\n", rc); 6947 goto rw_error; 6948 } 6949 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0); 6950 if (rc != 0) { 6951 pr_err("error %d\n", rc); 6952 goto rw_error; 6953 } 6954 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0); 6955 if (rc != 0) { 6956 pr_err("error %d\n", rc); 6957 goto rw_error; 6958 } 6959 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 170, 0); 6960 if (rc != 0) { 6961 pr_err("error %d\n", rc); 6962 goto rw_error; 6963 } 6964 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0); 6965 if (rc != 0) { 6966 pr_err("error %d\n", rc); 6967 goto rw_error; 6968 } 6969 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0); 6970 if (rc != 0) { 6971 pr_err("error %d\n", rc); 6972 goto rw_error; 6973 } 6974 6975 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0); 6976 if (rc != 0) { 6977 pr_err("error %d\n", rc); 6978 goto rw_error; 6979 } 6980 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0); 6981 if (rc != 0) { 6982 pr_err("error %d\n", rc); 6983 goto rw_error; 6984 } 6985 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0); 6986 if (rc != 0) { 6987 pr_err("error %d\n", rc); 6988 goto rw_error; 6989 } 6990 6991 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0); 6992 if (rc != 0) { 6993 pr_err("error %d\n", rc); 6994 goto rw_error; 6995 } 6996 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 140, 0); 6997 if (rc != 0) { 6998 pr_err("error %d\n", rc); 6999 goto rw_error; 7000 } 7001 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16)(-8), 0); 7002 if (rc != 0) { 7003 pr_err("error %d\n", rc); 7004 goto rw_error; 7005 } 7006 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16)(-16), 0); 7007 if (rc != 0) { 7008 pr_err("error %d\n", rc); 7009 goto rw_error; 7010 } 7011 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-26), 0); 7012 if (rc != 0) { 7013 pr_err("error %d\n", rc); 7014 goto rw_error; 7015 } 7016 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-56), 0); 7017 if (rc != 0) { 7018 pr_err("error %d\n", rc); 7019 goto rw_error; 7020 } 7021 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-86), 0); 7022 if (rc != 0) { 7023 pr_err("error %d\n", rc); 7024 goto rw_error; 7025 } 7026 7027 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0); 7028 if (rc != 0) { 7029 pr_err("error %d\n", rc); 7030 goto rw_error; 7031 } 7032 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0); 7033 if (rc != 0) { 7034 pr_err("error %d\n", rc); 7035 goto rw_error; 7036 } 7037 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0); 7038 if (rc != 0) { 7039 pr_err("error %d\n", rc); 7040 goto rw_error; 7041 } 7042 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0); 7043 if (rc != 0) { 7044 pr_err("error %d\n", rc); 7045 goto rw_error; 7046 } 7047 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0); 7048 if (rc != 0) { 7049 pr_err("error %d\n", rc); 7050 goto rw_error; 7051 } 7052 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0); 7053 if (rc != 0) { 7054 pr_err("error %d\n", rc); 7055 goto rw_error; 7056 } 7057 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0); 7058 if (rc != 0) { 7059 pr_err("error %d\n", rc); 7060 goto rw_error; 7061 } 7062 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0); 7063 if (rc != 0) { 7064 pr_err("error %d\n", rc); 7065 goto rw_error; 7066 } 7067 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0); 7068 if (rc != 0) { 7069 pr_err("error %d\n", rc); 7070 goto rw_error; 7071 } 7072 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0); 7073 if (rc != 0) { 7074 pr_err("error %d\n", rc); 7075 goto rw_error; 7076 } 7077 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0); 7078 if (rc != 0) { 7079 pr_err("error %d\n", rc); 7080 goto rw_error; 7081 } 7082 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0); 7083 if (rc != 0) { 7084 pr_err("error %d\n", rc); 7085 goto rw_error; 7086 } 7087 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0); 7088 if (rc != 0) { 7089 pr_err("error %d\n", rc); 7090 goto rw_error; 7091 } 7092 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0); 7093 if (rc != 0) { 7094 pr_err("error %d\n", rc); 7095 goto rw_error; 7096 } 7097 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0); 7098 if (rc != 0) { 7099 pr_err("error %d\n", rc); 7100 goto rw_error; 7101 } 7102 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0); 7103 if (rc != 0) { 7104 pr_err("error %d\n", rc); 7105 goto rw_error; 7106 } 7107 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 176, 0); 7108 if (rc != 0) { 7109 pr_err("error %d\n", rc); 7110 goto rw_error; 7111 } 7112 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0); 7113 if (rc != 0) { 7114 pr_err("error %d\n", rc); 7115 goto rw_error; 7116 } 7117 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0); 7118 if (rc != 0) { 7119 pr_err("error %d\n", rc); 7120 goto rw_error; 7121 } 7122 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 8, 0); 7123 if (rc != 0) { 7124 pr_err("error %d\n", rc); 7125 goto rw_error; 7126 } 7127 7128 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20480, 0); 7129 if (rc != 0) { 7130 pr_err("error %d\n", rc); 7131 goto rw_error; 7132 } 7133 7134 return 0; 7135 rw_error: 7136 return rc; 7137 } 7138 7139 /*============================================================================*/ 7140 7141 /* 7142 * \fn int set_qam64 () 7143 * \brief QAM64 specific setup 7144 * \param demod instance of demod. 7145 * \return int. 7146 */ 7147 static int set_qam64(struct drx_demod_instance *demod) 7148 { 7149 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 7150 int rc; 7151 static const u8 qam_dq_qual_fun[] = { 7152 /* this is hw reset value. no necessary to re-write */ 7153 DRXJ_16TO8(4), /* fun0 */ 7154 DRXJ_16TO8(4), /* fun1 */ 7155 DRXJ_16TO8(4), /* fun2 */ 7156 DRXJ_16TO8(4), /* fun3 */ 7157 DRXJ_16TO8(6), /* fun4 */ 7158 DRXJ_16TO8(6), /* fun5 */ 7159 }; 7160 static const u8 qam_eq_cma_rad[] = { 7161 DRXJ_16TO8(13336), /* RAD0 */ 7162 DRXJ_16TO8(12618), /* RAD1 */ 7163 DRXJ_16TO8(11988), /* RAD2 */ 7164 DRXJ_16TO8(13809), /* RAD3 */ 7165 DRXJ_16TO8(13809), /* RAD4 */ 7166 DRXJ_16TO8(15609), /* RAD5 */ 7167 }; 7168 7169 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0); 7170 if (rc != 0) { 7171 pr_err("error %d\n", rc); 7172 goto rw_error; 7173 } 7174 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); 7175 if (rc != 0) { 7176 pr_err("error %d\n", rc); 7177 goto rw_error; 7178 } 7179 7180 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 105, 0); 7181 if (rc != 0) { 7182 pr_err("error %d\n", rc); 7183 goto rw_error; 7184 } 7185 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0); 7186 if (rc != 0) { 7187 pr_err("error %d\n", rc); 7188 goto rw_error; 7189 } 7190 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0); 7191 if (rc != 0) { 7192 pr_err("error %d\n", rc); 7193 goto rw_error; 7194 } 7195 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 195, 0); 7196 if (rc != 0) { 7197 pr_err("error %d\n", rc); 7198 goto rw_error; 7199 } 7200 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0); 7201 if (rc != 0) { 7202 pr_err("error %d\n", rc); 7203 goto rw_error; 7204 } 7205 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 84, 0); 7206 if (rc != 0) { 7207 pr_err("error %d\n", rc); 7208 goto rw_error; 7209 } 7210 7211 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0); 7212 if (rc != 0) { 7213 pr_err("error %d\n", rc); 7214 goto rw_error; 7215 } 7216 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0); 7217 if (rc != 0) { 7218 pr_err("error %d\n", rc); 7219 goto rw_error; 7220 } 7221 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0); 7222 if (rc != 0) { 7223 pr_err("error %d\n", rc); 7224 goto rw_error; 7225 } 7226 7227 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0); 7228 if (rc != 0) { 7229 pr_err("error %d\n", rc); 7230 goto rw_error; 7231 } 7232 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 141, 0); 7233 if (rc != 0) { 7234 pr_err("error %d\n", rc); 7235 goto rw_error; 7236 } 7237 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 7, 0); 7238 if (rc != 0) { 7239 pr_err("error %d\n", rc); 7240 goto rw_error; 7241 } 7242 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 0, 0); 7243 if (rc != 0) { 7244 pr_err("error %d\n", rc); 7245 goto rw_error; 7246 } 7247 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-15), 0); 7248 if (rc != 0) { 7249 pr_err("error %d\n", rc); 7250 goto rw_error; 7251 } 7252 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-45), 0); 7253 if (rc != 0) { 7254 pr_err("error %d\n", rc); 7255 goto rw_error; 7256 } 7257 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-80), 0); 7258 if (rc != 0) { 7259 pr_err("error %d\n", rc); 7260 goto rw_error; 7261 } 7262 7263 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0); 7264 if (rc != 0) { 7265 pr_err("error %d\n", rc); 7266 goto rw_error; 7267 } 7268 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0); 7269 if (rc != 0) { 7270 pr_err("error %d\n", rc); 7271 goto rw_error; 7272 } 7273 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0); 7274 if (rc != 0) { 7275 pr_err("error %d\n", rc); 7276 goto rw_error; 7277 } 7278 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30, 0); 7279 if (rc != 0) { 7280 pr_err("error %d\n", rc); 7281 goto rw_error; 7282 } 7283 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0); 7284 if (rc != 0) { 7285 pr_err("error %d\n", rc); 7286 goto rw_error; 7287 } 7288 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0); 7289 if (rc != 0) { 7290 pr_err("error %d\n", rc); 7291 goto rw_error; 7292 } 7293 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 15, 0); 7294 if (rc != 0) { 7295 pr_err("error %d\n", rc); 7296 goto rw_error; 7297 } 7298 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0); 7299 if (rc != 0) { 7300 pr_err("error %d\n", rc); 7301 goto rw_error; 7302 } 7303 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0); 7304 if (rc != 0) { 7305 pr_err("error %d\n", rc); 7306 goto rw_error; 7307 } 7308 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0); 7309 if (rc != 0) { 7310 pr_err("error %d\n", rc); 7311 goto rw_error; 7312 } 7313 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0); 7314 if (rc != 0) { 7315 pr_err("error %d\n", rc); 7316 goto rw_error; 7317 } 7318 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0); 7319 if (rc != 0) { 7320 pr_err("error %d\n", rc); 7321 goto rw_error; 7322 } 7323 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0); 7324 if (rc != 0) { 7325 pr_err("error %d\n", rc); 7326 goto rw_error; 7327 } 7328 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0); 7329 if (rc != 0) { 7330 pr_err("error %d\n", rc); 7331 goto rw_error; 7332 } 7333 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0); 7334 if (rc != 0) { 7335 pr_err("error %d\n", rc); 7336 goto rw_error; 7337 } 7338 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0); 7339 if (rc != 0) { 7340 pr_err("error %d\n", rc); 7341 goto rw_error; 7342 } 7343 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 160, 0); 7344 if (rc != 0) { 7345 pr_err("error %d\n", rc); 7346 goto rw_error; 7347 } 7348 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0); 7349 if (rc != 0) { 7350 pr_err("error %d\n", rc); 7351 goto rw_error; 7352 } 7353 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0); 7354 if (rc != 0) { 7355 pr_err("error %d\n", rc); 7356 goto rw_error; 7357 } 7358 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0); 7359 if (rc != 0) { 7360 pr_err("error %d\n", rc); 7361 goto rw_error; 7362 } 7363 7364 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43008, 0); 7365 if (rc != 0) { 7366 pr_err("error %d\n", rc); 7367 goto rw_error; 7368 } 7369 7370 return 0; 7371 rw_error: 7372 return rc; 7373 } 7374 7375 /*============================================================================*/ 7376 7377 /* 7378 * \fn int set_qam128 () 7379 * \brief QAM128 specific setup 7380 * \param demod: instance of demod. 7381 * \return int. 7382 */ 7383 static int set_qam128(struct drx_demod_instance *demod) 7384 { 7385 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 7386 int rc; 7387 static const u8 qam_dq_qual_fun[] = { 7388 DRXJ_16TO8(6), /* fun0 */ 7389 DRXJ_16TO8(6), /* fun1 */ 7390 DRXJ_16TO8(6), /* fun2 */ 7391 DRXJ_16TO8(6), /* fun3 */ 7392 DRXJ_16TO8(9), /* fun4 */ 7393 DRXJ_16TO8(9), /* fun5 */ 7394 }; 7395 static const u8 qam_eq_cma_rad[] = { 7396 DRXJ_16TO8(6164), /* RAD0 */ 7397 DRXJ_16TO8(6598), /* RAD1 */ 7398 DRXJ_16TO8(6394), /* RAD2 */ 7399 DRXJ_16TO8(6409), /* RAD3 */ 7400 DRXJ_16TO8(6656), /* RAD4 */ 7401 DRXJ_16TO8(7238), /* RAD5 */ 7402 }; 7403 7404 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0); 7405 if (rc != 0) { 7406 pr_err("error %d\n", rc); 7407 goto rw_error; 7408 } 7409 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); 7410 if (rc != 0) { 7411 pr_err("error %d\n", rc); 7412 goto rw_error; 7413 } 7414 7415 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0); 7416 if (rc != 0) { 7417 pr_err("error %d\n", rc); 7418 goto rw_error; 7419 } 7420 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0); 7421 if (rc != 0) { 7422 pr_err("error %d\n", rc); 7423 goto rw_error; 7424 } 7425 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0); 7426 if (rc != 0) { 7427 pr_err("error %d\n", rc); 7428 goto rw_error; 7429 } 7430 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 140, 0); 7431 if (rc != 0) { 7432 pr_err("error %d\n", rc); 7433 goto rw_error; 7434 } 7435 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0); 7436 if (rc != 0) { 7437 pr_err("error %d\n", rc); 7438 goto rw_error; 7439 } 7440 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0); 7441 if (rc != 0) { 7442 pr_err("error %d\n", rc); 7443 goto rw_error; 7444 } 7445 7446 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0); 7447 if (rc != 0) { 7448 pr_err("error %d\n", rc); 7449 goto rw_error; 7450 } 7451 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0); 7452 if (rc != 0) { 7453 pr_err("error %d\n", rc); 7454 goto rw_error; 7455 } 7456 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0); 7457 if (rc != 0) { 7458 pr_err("error %d\n", rc); 7459 goto rw_error; 7460 } 7461 7462 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0); 7463 if (rc != 0) { 7464 pr_err("error %d\n", rc); 7465 goto rw_error; 7466 } 7467 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 65, 0); 7468 if (rc != 0) { 7469 pr_err("error %d\n", rc); 7470 goto rw_error; 7471 } 7472 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 5, 0); 7473 if (rc != 0) { 7474 pr_err("error %d\n", rc); 7475 goto rw_error; 7476 } 7477 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 3, 0); 7478 if (rc != 0) { 7479 pr_err("error %d\n", rc); 7480 goto rw_error; 7481 } 7482 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-1), 0); 7483 if (rc != 0) { 7484 pr_err("error %d\n", rc); 7485 goto rw_error; 7486 } 7487 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 12, 0); 7488 if (rc != 0) { 7489 pr_err("error %d\n", rc); 7490 goto rw_error; 7491 } 7492 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-23), 0); 7493 if (rc != 0) { 7494 pr_err("error %d\n", rc); 7495 goto rw_error; 7496 } 7497 7498 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0); 7499 if (rc != 0) { 7500 pr_err("error %d\n", rc); 7501 goto rw_error; 7502 } 7503 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0); 7504 if (rc != 0) { 7505 pr_err("error %d\n", rc); 7506 goto rw_error; 7507 } 7508 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0); 7509 if (rc != 0) { 7510 pr_err("error %d\n", rc); 7511 goto rw_error; 7512 } 7513 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40, 0); 7514 if (rc != 0) { 7515 pr_err("error %d\n", rc); 7516 goto rw_error; 7517 } 7518 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0); 7519 if (rc != 0) { 7520 pr_err("error %d\n", rc); 7521 goto rw_error; 7522 } 7523 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0); 7524 if (rc != 0) { 7525 pr_err("error %d\n", rc); 7526 goto rw_error; 7527 } 7528 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20, 0); 7529 if (rc != 0) { 7530 pr_err("error %d\n", rc); 7531 goto rw_error; 7532 } 7533 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0); 7534 if (rc != 0) { 7535 pr_err("error %d\n", rc); 7536 goto rw_error; 7537 } 7538 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0); 7539 if (rc != 0) { 7540 pr_err("error %d\n", rc); 7541 goto rw_error; 7542 } 7543 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0); 7544 if (rc != 0) { 7545 pr_err("error %d\n", rc); 7546 goto rw_error; 7547 } 7548 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0); 7549 if (rc != 0) { 7550 pr_err("error %d\n", rc); 7551 goto rw_error; 7552 } 7553 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0); 7554 if (rc != 0) { 7555 pr_err("error %d\n", rc); 7556 goto rw_error; 7557 } 7558 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0); 7559 if (rc != 0) { 7560 pr_err("error %d\n", rc); 7561 goto rw_error; 7562 } 7563 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0); 7564 if (rc != 0) { 7565 pr_err("error %d\n", rc); 7566 goto rw_error; 7567 } 7568 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0); 7569 if (rc != 0) { 7570 pr_err("error %d\n", rc); 7571 goto rw_error; 7572 } 7573 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0); 7574 if (rc != 0) { 7575 pr_err("error %d\n", rc); 7576 goto rw_error; 7577 } 7578 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 144, 0); 7579 if (rc != 0) { 7580 pr_err("error %d\n", rc); 7581 goto rw_error; 7582 } 7583 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0); 7584 if (rc != 0) { 7585 pr_err("error %d\n", rc); 7586 goto rw_error; 7587 } 7588 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0); 7589 if (rc != 0) { 7590 pr_err("error %d\n", rc); 7591 goto rw_error; 7592 } 7593 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0); 7594 if (rc != 0) { 7595 pr_err("error %d\n", rc); 7596 goto rw_error; 7597 } 7598 7599 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20992, 0); 7600 if (rc != 0) { 7601 pr_err("error %d\n", rc); 7602 goto rw_error; 7603 } 7604 7605 return 0; 7606 rw_error: 7607 return rc; 7608 } 7609 7610 /*============================================================================*/ 7611 7612 /* 7613 * \fn int set_qam256 () 7614 * \brief QAM256 specific setup 7615 * \param demod: instance of demod. 7616 * \return int. 7617 */ 7618 static int set_qam256(struct drx_demod_instance *demod) 7619 { 7620 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 7621 int rc; 7622 static const u8 qam_dq_qual_fun[] = { 7623 DRXJ_16TO8(8), /* fun0 */ 7624 DRXJ_16TO8(8), /* fun1 */ 7625 DRXJ_16TO8(8), /* fun2 */ 7626 DRXJ_16TO8(8), /* fun3 */ 7627 DRXJ_16TO8(12), /* fun4 */ 7628 DRXJ_16TO8(12), /* fun5 */ 7629 }; 7630 static const u8 qam_eq_cma_rad[] = { 7631 DRXJ_16TO8(12345), /* RAD0 */ 7632 DRXJ_16TO8(12345), /* RAD1 */ 7633 DRXJ_16TO8(13626), /* RAD2 */ 7634 DRXJ_16TO8(12931), /* RAD3 */ 7635 DRXJ_16TO8(14719), /* RAD4 */ 7636 DRXJ_16TO8(15356), /* RAD5 */ 7637 }; 7638 7639 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0); 7640 if (rc != 0) { 7641 pr_err("error %d\n", rc); 7642 goto rw_error; 7643 } 7644 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); 7645 if (rc != 0) { 7646 pr_err("error %d\n", rc); 7647 goto rw_error; 7648 } 7649 7650 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0); 7651 if (rc != 0) { 7652 pr_err("error %d\n", rc); 7653 goto rw_error; 7654 } 7655 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0); 7656 if (rc != 0) { 7657 pr_err("error %d\n", rc); 7658 goto rw_error; 7659 } 7660 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0); 7661 if (rc != 0) { 7662 pr_err("error %d\n", rc); 7663 goto rw_error; 7664 } 7665 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 150, 0); 7666 if (rc != 0) { 7667 pr_err("error %d\n", rc); 7668 goto rw_error; 7669 } 7670 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0); 7671 if (rc != 0) { 7672 pr_err("error %d\n", rc); 7673 goto rw_error; 7674 } 7675 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 110, 0); 7676 if (rc != 0) { 7677 pr_err("error %d\n", rc); 7678 goto rw_error; 7679 } 7680 7681 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0); 7682 if (rc != 0) { 7683 pr_err("error %d\n", rc); 7684 goto rw_error; 7685 } 7686 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 16, 0); 7687 if (rc != 0) { 7688 pr_err("error %d\n", rc); 7689 goto rw_error; 7690 } 7691 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0); 7692 if (rc != 0) { 7693 pr_err("error %d\n", rc); 7694 goto rw_error; 7695 } 7696 7697 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0); 7698 if (rc != 0) { 7699 pr_err("error %d\n", rc); 7700 goto rw_error; 7701 } 7702 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 74, 0); 7703 if (rc != 0) { 7704 pr_err("error %d\n", rc); 7705 goto rw_error; 7706 } 7707 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 18, 0); 7708 if (rc != 0) { 7709 pr_err("error %d\n", rc); 7710 goto rw_error; 7711 } 7712 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 13, 0); 7713 if (rc != 0) { 7714 pr_err("error %d\n", rc); 7715 goto rw_error; 7716 } 7717 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, 7, 0); 7718 if (rc != 0) { 7719 pr_err("error %d\n", rc); 7720 goto rw_error; 7721 } 7722 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 0, 0); 7723 if (rc != 0) { 7724 pr_err("error %d\n", rc); 7725 goto rw_error; 7726 } 7727 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-8), 0); 7728 if (rc != 0) { 7729 pr_err("error %d\n", rc); 7730 goto rw_error; 7731 } 7732 7733 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0); 7734 if (rc != 0) { 7735 pr_err("error %d\n", rc); 7736 goto rw_error; 7737 } 7738 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0); 7739 if (rc != 0) { 7740 pr_err("error %d\n", rc); 7741 goto rw_error; 7742 } 7743 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0); 7744 if (rc != 0) { 7745 pr_err("error %d\n", rc); 7746 goto rw_error; 7747 } 7748 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50, 0); 7749 if (rc != 0) { 7750 pr_err("error %d\n", rc); 7751 goto rw_error; 7752 } 7753 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0); 7754 if (rc != 0) { 7755 pr_err("error %d\n", rc); 7756 goto rw_error; 7757 } 7758 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0); 7759 if (rc != 0) { 7760 pr_err("error %d\n", rc); 7761 goto rw_error; 7762 } 7763 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 25, 0); 7764 if (rc != 0) { 7765 pr_err("error %d\n", rc); 7766 goto rw_error; 7767 } 7768 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0); 7769 if (rc != 0) { 7770 pr_err("error %d\n", rc); 7771 goto rw_error; 7772 } 7773 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0); 7774 if (rc != 0) { 7775 pr_err("error %d\n", rc); 7776 goto rw_error; 7777 } 7778 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0); 7779 if (rc != 0) { 7780 pr_err("error %d\n", rc); 7781 goto rw_error; 7782 } 7783 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0); 7784 if (rc != 0) { 7785 pr_err("error %d\n", rc); 7786 goto rw_error; 7787 } 7788 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0); 7789 if (rc != 0) { 7790 pr_err("error %d\n", rc); 7791 goto rw_error; 7792 } 7793 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0); 7794 if (rc != 0) { 7795 pr_err("error %d\n", rc); 7796 goto rw_error; 7797 } 7798 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0); 7799 if (rc != 0) { 7800 pr_err("error %d\n", rc); 7801 goto rw_error; 7802 } 7803 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0); 7804 if (rc != 0) { 7805 pr_err("error %d\n", rc); 7806 goto rw_error; 7807 } 7808 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0); 7809 if (rc != 0) { 7810 pr_err("error %d\n", rc); 7811 goto rw_error; 7812 } 7813 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 80, 0); 7814 if (rc != 0) { 7815 pr_err("error %d\n", rc); 7816 goto rw_error; 7817 } 7818 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0); 7819 if (rc != 0) { 7820 pr_err("error %d\n", rc); 7821 goto rw_error; 7822 } 7823 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0); 7824 if (rc != 0) { 7825 pr_err("error %d\n", rc); 7826 goto rw_error; 7827 } 7828 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0); 7829 if (rc != 0) { 7830 pr_err("error %d\n", rc); 7831 goto rw_error; 7832 } 7833 7834 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43520, 0); 7835 if (rc != 0) { 7836 pr_err("error %d\n", rc); 7837 goto rw_error; 7838 } 7839 7840 return 0; 7841 rw_error: 7842 return rc; 7843 } 7844 7845 /*============================================================================*/ 7846 #define QAM_SET_OP_ALL 0x1 7847 #define QAM_SET_OP_CONSTELLATION 0x2 7848 #define QAM_SET_OP_SPECTRUM 0X4 7849 7850 /* 7851 * \fn int set_qam () 7852 * \brief Set QAM demod. 7853 * \param demod: instance of demod. 7854 * \param channel: pointer to channel data. 7855 * \return int. 7856 */ 7857 static int 7858 set_qam(struct drx_demod_instance *demod, 7859 struct drx_channel *channel, s32 tuner_freq_offset, u32 op) 7860 { 7861 struct i2c_device_addr *dev_addr = NULL; 7862 struct drxj_data *ext_attr = NULL; 7863 struct drx_common_attr *common_attr = NULL; 7864 int rc; 7865 u32 adc_frequency = 0; 7866 u32 iqm_rc_rate = 0; 7867 u16 cmd_result = 0; 7868 u16 lc_symbol_freq = 0; 7869 u16 iqm_rc_stretch = 0; 7870 u16 set_env_parameters = 0; 7871 u16 set_param_parameters[2] = { 0 }; 7872 struct drxjscu_cmd cmd_scu = { /* command */ 0, 7873 /* parameter_len */ 0, 7874 /* result_len */ 0, 7875 /* parameter */ NULL, 7876 /* result */ NULL 7877 }; 7878 static const u8 qam_a_taps[] = { 7879 DRXJ_16TO8(-1), /* re0 */ 7880 DRXJ_16TO8(1), /* re1 */ 7881 DRXJ_16TO8(1), /* re2 */ 7882 DRXJ_16TO8(-1), /* re3 */ 7883 DRXJ_16TO8(-1), /* re4 */ 7884 DRXJ_16TO8(2), /* re5 */ 7885 DRXJ_16TO8(1), /* re6 */ 7886 DRXJ_16TO8(-2), /* re7 */ 7887 DRXJ_16TO8(0), /* re8 */ 7888 DRXJ_16TO8(3), /* re9 */ 7889 DRXJ_16TO8(-1), /* re10 */ 7890 DRXJ_16TO8(-3), /* re11 */ 7891 DRXJ_16TO8(4), /* re12 */ 7892 DRXJ_16TO8(1), /* re13 */ 7893 DRXJ_16TO8(-8), /* re14 */ 7894 DRXJ_16TO8(4), /* re15 */ 7895 DRXJ_16TO8(13), /* re16 */ 7896 DRXJ_16TO8(-13), /* re17 */ 7897 DRXJ_16TO8(-19), /* re18 */ 7898 DRXJ_16TO8(28), /* re19 */ 7899 DRXJ_16TO8(25), /* re20 */ 7900 DRXJ_16TO8(-53), /* re21 */ 7901 DRXJ_16TO8(-31), /* re22 */ 7902 DRXJ_16TO8(96), /* re23 */ 7903 DRXJ_16TO8(37), /* re24 */ 7904 DRXJ_16TO8(-190), /* re25 */ 7905 DRXJ_16TO8(-40), /* re26 */ 7906 DRXJ_16TO8(619) /* re27 */ 7907 }; 7908 static const u8 qam_b64_taps[] = { 7909 DRXJ_16TO8(0), /* re0 */ 7910 DRXJ_16TO8(-2), /* re1 */ 7911 DRXJ_16TO8(1), /* re2 */ 7912 DRXJ_16TO8(2), /* re3 */ 7913 DRXJ_16TO8(-2), /* re4 */ 7914 DRXJ_16TO8(0), /* re5 */ 7915 DRXJ_16TO8(4), /* re6 */ 7916 DRXJ_16TO8(-2), /* re7 */ 7917 DRXJ_16TO8(-4), /* re8 */ 7918 DRXJ_16TO8(4), /* re9 */ 7919 DRXJ_16TO8(3), /* re10 */ 7920 DRXJ_16TO8(-6), /* re11 */ 7921 DRXJ_16TO8(0), /* re12 */ 7922 DRXJ_16TO8(6), /* re13 */ 7923 DRXJ_16TO8(-5), /* re14 */ 7924 DRXJ_16TO8(-3), /* re15 */ 7925 DRXJ_16TO8(11), /* re16 */ 7926 DRXJ_16TO8(-4), /* re17 */ 7927 DRXJ_16TO8(-19), /* re18 */ 7928 DRXJ_16TO8(19), /* re19 */ 7929 DRXJ_16TO8(28), /* re20 */ 7930 DRXJ_16TO8(-45), /* re21 */ 7931 DRXJ_16TO8(-36), /* re22 */ 7932 DRXJ_16TO8(90), /* re23 */ 7933 DRXJ_16TO8(42), /* re24 */ 7934 DRXJ_16TO8(-185), /* re25 */ 7935 DRXJ_16TO8(-46), /* re26 */ 7936 DRXJ_16TO8(614) /* re27 */ 7937 }; 7938 static const u8 qam_b256_taps[] = { 7939 DRXJ_16TO8(-2), /* re0 */ 7940 DRXJ_16TO8(4), /* re1 */ 7941 DRXJ_16TO8(1), /* re2 */ 7942 DRXJ_16TO8(-4), /* re3 */ 7943 DRXJ_16TO8(0), /* re4 */ 7944 DRXJ_16TO8(4), /* re5 */ 7945 DRXJ_16TO8(-2), /* re6 */ 7946 DRXJ_16TO8(-4), /* re7 */ 7947 DRXJ_16TO8(5), /* re8 */ 7948 DRXJ_16TO8(2), /* re9 */ 7949 DRXJ_16TO8(-8), /* re10 */ 7950 DRXJ_16TO8(2), /* re11 */ 7951 DRXJ_16TO8(11), /* re12 */ 7952 DRXJ_16TO8(-8), /* re13 */ 7953 DRXJ_16TO8(-15), /* re14 */ 7954 DRXJ_16TO8(16), /* re15 */ 7955 DRXJ_16TO8(19), /* re16 */ 7956 DRXJ_16TO8(-27), /* re17 */ 7957 DRXJ_16TO8(-22), /* re18 */ 7958 DRXJ_16TO8(44), /* re19 */ 7959 DRXJ_16TO8(26), /* re20 */ 7960 DRXJ_16TO8(-69), /* re21 */ 7961 DRXJ_16TO8(-28), /* re22 */ 7962 DRXJ_16TO8(110), /* re23 */ 7963 DRXJ_16TO8(31), /* re24 */ 7964 DRXJ_16TO8(-201), /* re25 */ 7965 DRXJ_16TO8(-32), /* re26 */ 7966 DRXJ_16TO8(628) /* re27 */ 7967 }; 7968 static const u8 qam_c_taps[] = { 7969 DRXJ_16TO8(-3), /* re0 */ 7970 DRXJ_16TO8(3), /* re1 */ 7971 DRXJ_16TO8(2), /* re2 */ 7972 DRXJ_16TO8(-4), /* re3 */ 7973 DRXJ_16TO8(0), /* re4 */ 7974 DRXJ_16TO8(4), /* re5 */ 7975 DRXJ_16TO8(-1), /* re6 */ 7976 DRXJ_16TO8(-4), /* re7 */ 7977 DRXJ_16TO8(3), /* re8 */ 7978 DRXJ_16TO8(3), /* re9 */ 7979 DRXJ_16TO8(-5), /* re10 */ 7980 DRXJ_16TO8(0), /* re11 */ 7981 DRXJ_16TO8(9), /* re12 */ 7982 DRXJ_16TO8(-4), /* re13 */ 7983 DRXJ_16TO8(-12), /* re14 */ 7984 DRXJ_16TO8(10), /* re15 */ 7985 DRXJ_16TO8(16), /* re16 */ 7986 DRXJ_16TO8(-21), /* re17 */ 7987 DRXJ_16TO8(-20), /* re18 */ 7988 DRXJ_16TO8(37), /* re19 */ 7989 DRXJ_16TO8(25), /* re20 */ 7990 DRXJ_16TO8(-62), /* re21 */ 7991 DRXJ_16TO8(-28), /* re22 */ 7992 DRXJ_16TO8(105), /* re23 */ 7993 DRXJ_16TO8(31), /* re24 */ 7994 DRXJ_16TO8(-197), /* re25 */ 7995 DRXJ_16TO8(-33), /* re26 */ 7996 DRXJ_16TO8(626) /* re27 */ 7997 }; 7998 7999 dev_addr = demod->my_i2c_dev_addr; 8000 ext_attr = (struct drxj_data *) demod->my_ext_attr; 8001 common_attr = (struct drx_common_attr *) demod->my_common_attr; 8002 8003 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) { 8004 if (ext_attr->standard == DRX_STANDARD_ITU_B) { 8005 switch (channel->constellation) { 8006 case DRX_CONSTELLATION_QAM256: 8007 iqm_rc_rate = 0x00AE3562; 8008 lc_symbol_freq = 8009 QAM_LC_SYMBOL_FREQ_FREQ_QAM_B_256; 8010 channel->symbolrate = 5360537; 8011 iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_256; 8012 break; 8013 case DRX_CONSTELLATION_QAM64: 8014 iqm_rc_rate = 0x00C05A0E; 8015 lc_symbol_freq = 409; 8016 channel->symbolrate = 5056941; 8017 iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_64; 8018 break; 8019 default: 8020 return -EINVAL; 8021 } 8022 } else { 8023 adc_frequency = (common_attr->sys_clock_freq * 1000) / 3; 8024 if (channel->symbolrate == 0) { 8025 pr_err("error: channel symbolrate is zero!\n"); 8026 return -EIO; 8027 } 8028 iqm_rc_rate = 8029 (adc_frequency / channel->symbolrate) * (1 << 21) + 8030 (frac28 8031 ((adc_frequency % channel->symbolrate), 8032 channel->symbolrate) >> 7) - (1 << 23); 8033 lc_symbol_freq = 8034 (u16) (frac28 8035 (channel->symbolrate + 8036 (adc_frequency >> 13), 8037 adc_frequency) >> 16); 8038 if (lc_symbol_freq > 511) 8039 lc_symbol_freq = 511; 8040 8041 iqm_rc_stretch = 21; 8042 } 8043 8044 if (ext_attr->standard == DRX_STANDARD_ITU_A) { 8045 set_env_parameters = QAM_TOP_ANNEX_A; /* annex */ 8046 set_param_parameters[0] = channel->constellation; /* constellation */ 8047 set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17; /* interleave mode */ 8048 } else if (ext_attr->standard == DRX_STANDARD_ITU_B) { 8049 set_env_parameters = QAM_TOP_ANNEX_B; /* annex */ 8050 set_param_parameters[0] = channel->constellation; /* constellation */ 8051 set_param_parameters[1] = channel->interleavemode; /* interleave mode */ 8052 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) { 8053 set_env_parameters = QAM_TOP_ANNEX_C; /* annex */ 8054 set_param_parameters[0] = channel->constellation; /* constellation */ 8055 set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17; /* interleave mode */ 8056 } else { 8057 return -EINVAL; 8058 } 8059 } 8060 8061 if (op & QAM_SET_OP_ALL) { 8062 /* 8063 STEP 1: reset demodulator 8064 resets IQM, QAM and FEC HW blocks 8065 resets SCU variables 8066 */ 8067 /* stop all comm_exec */ 8068 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0); 8069 if (rc != 0) { 8070 pr_err("error %d\n", rc); 8071 goto rw_error; 8072 } 8073 rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0); 8074 if (rc != 0) { 8075 pr_err("error %d\n", rc); 8076 goto rw_error; 8077 } 8078 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0); 8079 if (rc != 0) { 8080 pr_err("error %d\n", rc); 8081 goto rw_error; 8082 } 8083 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0); 8084 if (rc != 0) { 8085 pr_err("error %d\n", rc); 8086 goto rw_error; 8087 } 8088 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0); 8089 if (rc != 0) { 8090 pr_err("error %d\n", rc); 8091 goto rw_error; 8092 } 8093 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0); 8094 if (rc != 0) { 8095 pr_err("error %d\n", rc); 8096 goto rw_error; 8097 } 8098 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0); 8099 if (rc != 0) { 8100 pr_err("error %d\n", rc); 8101 goto rw_error; 8102 } 8103 8104 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM | 8105 SCU_RAM_COMMAND_CMD_DEMOD_RESET; 8106 cmd_scu.parameter_len = 0; 8107 cmd_scu.result_len = 1; 8108 cmd_scu.parameter = NULL; 8109 cmd_scu.result = &cmd_result; 8110 rc = scu_command(dev_addr, &cmd_scu); 8111 if (rc != 0) { 8112 pr_err("error %d\n", rc); 8113 goto rw_error; 8114 } 8115 } 8116 8117 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) { 8118 /* 8119 STEP 2: configure demodulator 8120 -set env 8121 -set params (resets IQM,QAM,FEC HW; initializes some SCU variables ) 8122 */ 8123 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM | 8124 SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV; 8125 cmd_scu.parameter_len = 1; 8126 cmd_scu.result_len = 1; 8127 cmd_scu.parameter = &set_env_parameters; 8128 cmd_scu.result = &cmd_result; 8129 rc = scu_command(dev_addr, &cmd_scu); 8130 if (rc != 0) { 8131 pr_err("error %d\n", rc); 8132 goto rw_error; 8133 } 8134 8135 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM | 8136 SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM; 8137 cmd_scu.parameter_len = 2; 8138 cmd_scu.result_len = 1; 8139 cmd_scu.parameter = set_param_parameters; 8140 cmd_scu.result = &cmd_result; 8141 rc = scu_command(dev_addr, &cmd_scu); 8142 if (rc != 0) { 8143 pr_err("error %d\n", rc); 8144 goto rw_error; 8145 } 8146 /* set symbol rate */ 8147 rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate, 0); 8148 if (rc != 0) { 8149 pr_err("error %d\n", rc); 8150 goto rw_error; 8151 } 8152 ext_attr->iqm_rc_rate_ofs = iqm_rc_rate; 8153 rc = set_qam_measurement(demod, channel->constellation, channel->symbolrate); 8154 if (rc != 0) { 8155 pr_err("error %d\n", rc); 8156 goto rw_error; 8157 } 8158 } 8159 /* STEP 3: enable the system in a mode where the ADC provides valid signal 8160 setup constellation independent registers */ 8161 /* from qam_cmd.py script (qam_driver_b) */ 8162 /* TODO: remove re-writes of HW reset values */ 8163 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_SPECTRUM)) { 8164 rc = set_frequency(demod, channel, tuner_freq_offset); 8165 if (rc != 0) { 8166 pr_err("error %d\n", rc); 8167 goto rw_error; 8168 } 8169 } 8170 8171 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) { 8172 8173 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_SYMBOL_FREQ__A, lc_symbol_freq, 0); 8174 if (rc != 0) { 8175 pr_err("error %d\n", rc); 8176 goto rw_error; 8177 } 8178 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, iqm_rc_stretch, 0); 8179 if (rc != 0) { 8180 pr_err("error %d\n", rc); 8181 goto rw_error; 8182 } 8183 } 8184 8185 if (op & QAM_SET_OP_ALL) { 8186 if (!ext_attr->has_lna) { 8187 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0); 8188 if (rc != 0) { 8189 pr_err("error %d\n", rc); 8190 goto rw_error; 8191 } 8192 } 8193 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0); 8194 if (rc != 0) { 8195 pr_err("error %d\n", rc); 8196 goto rw_error; 8197 } 8198 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0); 8199 if (rc != 0) { 8200 pr_err("error %d\n", rc); 8201 goto rw_error; 8202 } 8203 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_QAM__M, 0); 8204 if (rc != 0) { 8205 pr_err("error %d\n", rc); 8206 goto rw_error; 8207 } 8208 8209 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_WR_RSV_0__A, 0x5f, 0); 8210 if (rc != 0) { 8211 pr_err("error %d\n", rc); 8212 goto rw_error; 8213 } /* scu temporary shut down agc */ 8214 8215 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SYNC_SEL__A, 3, 0); 8216 if (rc != 0) { 8217 pr_err("error %d\n", rc); 8218 goto rw_error; 8219 } 8220 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0); 8221 if (rc != 0) { 8222 pr_err("error %d\n", rc); 8223 goto rw_error; 8224 } 8225 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 448, 0); 8226 if (rc != 0) { 8227 pr_err("error %d\n", rc); 8228 goto rw_error; 8229 } 8230 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0); 8231 if (rc != 0) { 8232 pr_err("error %d\n", rc); 8233 goto rw_error; 8234 } 8235 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, 4, 0); 8236 if (rc != 0) { 8237 pr_err("error %d\n", rc); 8238 goto rw_error; 8239 } 8240 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, 0x10, 0); 8241 if (rc != 0) { 8242 pr_err("error %d\n", rc); 8243 goto rw_error; 8244 } 8245 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, 11, 0); 8246 if (rc != 0) { 8247 pr_err("error %d\n", rc); 8248 goto rw_error; 8249 } 8250 8251 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0); 8252 if (rc != 0) { 8253 pr_err("error %d\n", rc); 8254 goto rw_error; 8255 } 8256 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE, 0); 8257 if (rc != 0) { 8258 pr_err("error %d\n", rc); 8259 goto rw_error; 8260 } /*! reset default val ! */ 8261 8262 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE, 0); 8263 if (rc != 0) { 8264 pr_err("error %d\n", rc); 8265 goto rw_error; 8266 } /*! reset default val ! */ 8267 if (ext_attr->standard == DRX_STANDARD_ITU_B) { 8268 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, QAM_SY_SYNC_LWM__PRE, 0); 8269 if (rc != 0) { 8270 pr_err("error %d\n", rc); 8271 goto rw_error; 8272 } /*! reset default val ! */ 8273 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, QAM_SY_SYNC_AWM__PRE, 0); 8274 if (rc != 0) { 8275 pr_err("error %d\n", rc); 8276 goto rw_error; 8277 } /*! reset default val ! */ 8278 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0); 8279 if (rc != 0) { 8280 pr_err("error %d\n", rc); 8281 goto rw_error; 8282 } /*! reset default val ! */ 8283 } else { 8284 switch (channel->constellation) { 8285 case DRX_CONSTELLATION_QAM16: 8286 case DRX_CONSTELLATION_QAM64: 8287 case DRX_CONSTELLATION_QAM256: 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, 0x04, 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, QAM_SY_SYNC_HWM__PRE, 0); 8299 if (rc != 0) { 8300 pr_err("error %d\n", rc); 8301 goto rw_error; 8302 } /*! reset default val ! */ 8303 break; 8304 case DRX_CONSTELLATION_QAM32: 8305 case DRX_CONSTELLATION_QAM128: 8306 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0); 8307 if (rc != 0) { 8308 pr_err("error %d\n", rc); 8309 goto rw_error; 8310 } 8311 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x05, 0); 8312 if (rc != 0) { 8313 pr_err("error %d\n", rc); 8314 goto rw_error; 8315 } 8316 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, 0x06, 0); 8317 if (rc != 0) { 8318 pr_err("error %d\n", rc); 8319 goto rw_error; 8320 } 8321 break; 8322 default: 8323 return -EIO; 8324 } /* switch */ 8325 } 8326 8327 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, QAM_LC_MODE__PRE, 0); 8328 if (rc != 0) { 8329 pr_err("error %d\n", rc); 8330 goto rw_error; 8331 } /*! reset default val ! */ 8332 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_RATE_LIMIT__A, 3, 0); 8333 if (rc != 0) { 8334 pr_err("error %d\n", rc); 8335 goto rw_error; 8336 } 8337 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORP__A, 4, 0); 8338 if (rc != 0) { 8339 pr_err("error %d\n", rc); 8340 goto rw_error; 8341 } 8342 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORI__A, 4, 0); 8343 if (rc != 0) { 8344 pr_err("error %d\n", rc); 8345 goto rw_error; 8346 } 8347 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, 7, 0); 8348 if (rc != 0) { 8349 pr_err("error %d\n", rc); 8350 goto rw_error; 8351 } 8352 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB0__A, 1, 0); 8353 if (rc != 0) { 8354 pr_err("error %d\n", rc); 8355 goto rw_error; 8356 } 8357 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB1__A, 1, 0); 8358 if (rc != 0) { 8359 pr_err("error %d\n", rc); 8360 goto rw_error; 8361 } 8362 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB2__A, 1, 0); 8363 if (rc != 0) { 8364 pr_err("error %d\n", rc); 8365 goto rw_error; 8366 } 8367 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB3__A, 1, 0); 8368 if (rc != 0) { 8369 pr_err("error %d\n", rc); 8370 goto rw_error; 8371 } 8372 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB4__A, 2, 0); 8373 if (rc != 0) { 8374 pr_err("error %d\n", rc); 8375 goto rw_error; 8376 } 8377 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB5__A, 2, 0); 8378 if (rc != 0) { 8379 pr_err("error %d\n", rc); 8380 goto rw_error; 8381 } 8382 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB6__A, 2, 0); 8383 if (rc != 0) { 8384 pr_err("error %d\n", rc); 8385 goto rw_error; 8386 } 8387 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB8__A, 2, 0); 8388 if (rc != 0) { 8389 pr_err("error %d\n", rc); 8390 goto rw_error; 8391 } 8392 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB9__A, 2, 0); 8393 if (rc != 0) { 8394 pr_err("error %d\n", rc); 8395 goto rw_error; 8396 } 8397 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB10__A, 2, 0); 8398 if (rc != 0) { 8399 pr_err("error %d\n", rc); 8400 goto rw_error; 8401 } 8402 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB12__A, 2, 0); 8403 if (rc != 0) { 8404 pr_err("error %d\n", rc); 8405 goto rw_error; 8406 } 8407 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB15__A, 3, 0); 8408 if (rc != 0) { 8409 pr_err("error %d\n", rc); 8410 goto rw_error; 8411 } 8412 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB16__A, 3, 0); 8413 if (rc != 0) { 8414 pr_err("error %d\n", rc); 8415 goto rw_error; 8416 } 8417 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB20__A, 4, 0); 8418 if (rc != 0) { 8419 pr_err("error %d\n", rc); 8420 goto rw_error; 8421 } 8422 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB25__A, 4, 0); 8423 if (rc != 0) { 8424 pr_err("error %d\n", rc); 8425 goto rw_error; 8426 } 8427 8428 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, 1, 0); 8429 if (rc != 0) { 8430 pr_err("error %d\n", rc); 8431 goto rw_error; 8432 } 8433 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, 1, 0); 8434 if (rc != 0) { 8435 pr_err("error %d\n", rc); 8436 goto rw_error; 8437 } 8438 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_ADJ_SEL__A, 1, 0); 8439 if (rc != 0) { 8440 pr_err("error %d\n", rc); 8441 goto rw_error; 8442 } 8443 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 0, 0); 8444 if (rc != 0) { 8445 pr_err("error %d\n", rc); 8446 goto rw_error; 8447 } 8448 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0); 8449 if (rc != 0) { 8450 pr_err("error %d\n", rc); 8451 goto rw_error; 8452 } 8453 8454 /* No more resets of the IQM, current standard correctly set => 8455 now AGCs can be configured. */ 8456 /* turn on IQMAF. It has to be in front of setAgc**() */ 8457 rc = set_iqm_af(demod, true); 8458 if (rc != 0) { 8459 pr_err("error %d\n", rc); 8460 goto rw_error; 8461 } 8462 rc = adc_synchronization(demod); 8463 if (rc != 0) { 8464 pr_err("error %d\n", rc); 8465 goto rw_error; 8466 } 8467 8468 rc = init_agc(demod); 8469 if (rc != 0) { 8470 pr_err("error %d\n", rc); 8471 goto rw_error; 8472 } 8473 rc = set_agc_if(demod, &(ext_attr->qam_if_agc_cfg), false); 8474 if (rc != 0) { 8475 pr_err("error %d\n", rc); 8476 goto rw_error; 8477 } 8478 rc = set_agc_rf(demod, &(ext_attr->qam_rf_agc_cfg), false); 8479 if (rc != 0) { 8480 pr_err("error %d\n", rc); 8481 goto rw_error; 8482 } 8483 { 8484 /* TODO fix this, store a struct drxj_cfg_afe_gain structure in struct drxj_data instead 8485 of only the gain */ 8486 struct drxj_cfg_afe_gain qam_pga_cfg = { DRX_STANDARD_ITU_B, 0 }; 8487 8488 qam_pga_cfg.gain = ext_attr->qam_pga_cfg; 8489 rc = ctrl_set_cfg_afe_gain(demod, &qam_pga_cfg); 8490 if (rc != 0) { 8491 pr_err("error %d\n", rc); 8492 goto rw_error; 8493 } 8494 } 8495 rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->qam_pre_saw_cfg)); 8496 if (rc != 0) { 8497 pr_err("error %d\n", rc); 8498 goto rw_error; 8499 } 8500 } 8501 8502 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) { 8503 if (ext_attr->standard == DRX_STANDARD_ITU_A) { 8504 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0); 8505 if (rc != 0) { 8506 pr_err("error %d\n", rc); 8507 goto rw_error; 8508 } 8509 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0); 8510 if (rc != 0) { 8511 pr_err("error %d\n", rc); 8512 goto rw_error; 8513 } 8514 } else if (ext_attr->standard == DRX_STANDARD_ITU_B) { 8515 switch (channel->constellation) { 8516 case DRX_CONSTELLATION_QAM64: 8517 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0); 8518 if (rc != 0) { 8519 pr_err("error %d\n", rc); 8520 goto rw_error; 8521 } 8522 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0); 8523 if (rc != 0) { 8524 pr_err("error %d\n", rc); 8525 goto rw_error; 8526 } 8527 break; 8528 case DRX_CONSTELLATION_QAM256: 8529 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0); 8530 if (rc != 0) { 8531 pr_err("error %d\n", rc); 8532 goto rw_error; 8533 } 8534 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0); 8535 if (rc != 0) { 8536 pr_err("error %d\n", rc); 8537 goto rw_error; 8538 } 8539 break; 8540 default: 8541 return -EIO; 8542 } 8543 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) { 8544 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0); 8545 if (rc != 0) { 8546 pr_err("error %d\n", rc); 8547 goto rw_error; 8548 } 8549 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0); 8550 if (rc != 0) { 8551 pr_err("error %d\n", rc); 8552 goto rw_error; 8553 } 8554 } 8555 8556 /* SETP 4: constellation specific setup */ 8557 switch (channel->constellation) { 8558 case DRX_CONSTELLATION_QAM16: 8559 rc = set_qam16(demod); 8560 if (rc != 0) { 8561 pr_err("error %d\n", rc); 8562 goto rw_error; 8563 } 8564 break; 8565 case DRX_CONSTELLATION_QAM32: 8566 rc = set_qam32(demod); 8567 if (rc != 0) { 8568 pr_err("error %d\n", rc); 8569 goto rw_error; 8570 } 8571 break; 8572 case DRX_CONSTELLATION_QAM64: 8573 rc = set_qam64(demod); 8574 if (rc != 0) { 8575 pr_err("error %d\n", rc); 8576 goto rw_error; 8577 } 8578 break; 8579 case DRX_CONSTELLATION_QAM128: 8580 rc = set_qam128(demod); 8581 if (rc != 0) { 8582 pr_err("error %d\n", rc); 8583 goto rw_error; 8584 } 8585 break; 8586 case DRX_CONSTELLATION_QAM256: 8587 rc = set_qam256(demod); 8588 if (rc != 0) { 8589 pr_err("error %d\n", rc); 8590 goto rw_error; 8591 } 8592 break; 8593 default: 8594 return -EIO; 8595 } /* switch */ 8596 } 8597 8598 if ((op & QAM_SET_OP_ALL)) { 8599 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0); 8600 if (rc != 0) { 8601 pr_err("error %d\n", rc); 8602 goto rw_error; 8603 } 8604 8605 /* Mpeg output has to be in front of FEC active */ 8606 rc = set_mpegtei_handling(demod); 8607 if (rc != 0) { 8608 pr_err("error %d\n", rc); 8609 goto rw_error; 8610 } 8611 rc = bit_reverse_mpeg_output(demod); 8612 if (rc != 0) { 8613 pr_err("error %d\n", rc); 8614 goto rw_error; 8615 } 8616 rc = set_mpeg_start_width(demod); 8617 if (rc != 0) { 8618 pr_err("error %d\n", rc); 8619 goto rw_error; 8620 } 8621 { 8622 /* TODO: move to set_standard after hardware reset value problem is solved */ 8623 /* Configure initial MPEG output */ 8624 struct drx_cfg_mpeg_output cfg_mpeg_output; 8625 8626 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output)); 8627 cfg_mpeg_output.enable_mpeg_output = true; 8628 8629 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output); 8630 if (rc != 0) { 8631 pr_err("error %d\n", rc); 8632 goto rw_error; 8633 } 8634 } 8635 } 8636 8637 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) { 8638 8639 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */ 8640 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM | 8641 SCU_RAM_COMMAND_CMD_DEMOD_START; 8642 cmd_scu.parameter_len = 0; 8643 cmd_scu.result_len = 1; 8644 cmd_scu.parameter = NULL; 8645 cmd_scu.result = &cmd_result; 8646 rc = scu_command(dev_addr, &cmd_scu); 8647 if (rc != 0) { 8648 pr_err("error %d\n", rc); 8649 goto rw_error; 8650 } 8651 } 8652 8653 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0); 8654 if (rc != 0) { 8655 pr_err("error %d\n", rc); 8656 goto rw_error; 8657 } 8658 rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE, 0); 8659 if (rc != 0) { 8660 pr_err("error %d\n", rc); 8661 goto rw_error; 8662 } 8663 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0); 8664 if (rc != 0) { 8665 pr_err("error %d\n", rc); 8666 goto rw_error; 8667 } 8668 8669 return 0; 8670 rw_error: 8671 return rc; 8672 } 8673 8674 /*============================================================================*/ 8675 static int ctrl_get_qam_sig_quality(struct drx_demod_instance *demod); 8676 8677 static int qam_flip_spec(struct drx_demod_instance *demod, struct drx_channel *channel) 8678 { 8679 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 8680 struct drxj_data *ext_attr = demod->my_ext_attr; 8681 int rc; 8682 u32 iqm_fs_rate_ofs = 0; 8683 u32 iqm_fs_rate_lo = 0; 8684 u16 qam_ctl_ena = 0; 8685 u16 data = 0; 8686 u16 equ_mode = 0; 8687 u16 fsm_state = 0; 8688 int i = 0; 8689 int ofsofs = 0; 8690 8691 /* Silence the controlling of lc, equ, and the acquisition state machine */ 8692 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, &qam_ctl_ena, 0); 8693 if (rc != 0) { 8694 pr_err("error %d\n", rc); 8695 goto rw_error; 8696 } 8697 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); 8698 if (rc != 0) { 8699 pr_err("error %d\n", rc); 8700 goto rw_error; 8701 } 8702 8703 /* freeze the frequency control loop */ 8704 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF__A, 0, 0); 8705 if (rc != 0) { 8706 pr_err("error %d\n", rc); 8707 goto rw_error; 8708 } 8709 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF1__A, 0, 0); 8710 if (rc != 0) { 8711 pr_err("error %d\n", rc); 8712 goto rw_error; 8713 } 8714 8715 rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, &iqm_fs_rate_ofs, 0); 8716 if (rc != 0) { 8717 pr_err("error %d\n", rc); 8718 goto rw_error; 8719 } 8720 rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_LO__A, &iqm_fs_rate_lo, 0); 8721 if (rc != 0) { 8722 pr_err("error %d\n", rc); 8723 goto rw_error; 8724 } 8725 ofsofs = iqm_fs_rate_lo - iqm_fs_rate_ofs; 8726 iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1; 8727 iqm_fs_rate_ofs -= 2 * ofsofs; 8728 8729 /* freeze dq/fq updating */ 8730 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0); 8731 if (rc != 0) { 8732 pr_err("error %d\n", rc); 8733 goto rw_error; 8734 } 8735 data = (data & 0xfff9); 8736 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0); 8737 if (rc != 0) { 8738 pr_err("error %d\n", rc); 8739 goto rw_error; 8740 } 8741 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0); 8742 if (rc != 0) { 8743 pr_err("error %d\n", rc); 8744 goto rw_error; 8745 } 8746 8747 /* lc_cp / _ci / _ca */ 8748 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CI__A, 0, 0); 8749 if (rc != 0) { 8750 pr_err("error %d\n", rc); 8751 goto rw_error; 8752 } 8753 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_EP__A, 0, 0); 8754 if (rc != 0) { 8755 pr_err("error %d\n", rc); 8756 goto rw_error; 8757 } 8758 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_LA_FACTOR__A, 0, 0); 8759 if (rc != 0) { 8760 pr_err("error %d\n", rc); 8761 goto rw_error; 8762 } 8763 8764 /* flip the spec */ 8765 rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0); 8766 if (rc != 0) { 8767 pr_err("error %d\n", rc); 8768 goto rw_error; 8769 } 8770 ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs; 8771 ext_attr->pos_image = (ext_attr->pos_image) ? false : true; 8772 8773 /* freeze dq/fq updating */ 8774 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0); 8775 if (rc != 0) { 8776 pr_err("error %d\n", rc); 8777 goto rw_error; 8778 } 8779 equ_mode = data; 8780 data = (data & 0xfff9); 8781 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0); 8782 if (rc != 0) { 8783 pr_err("error %d\n", rc); 8784 goto rw_error; 8785 } 8786 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0); 8787 if (rc != 0) { 8788 pr_err("error %d\n", rc); 8789 goto rw_error; 8790 } 8791 8792 for (i = 0; i < 28; i++) { 8793 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_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 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), -data, 0); 8799 if (rc != 0) { 8800 pr_err("error %d\n", rc); 8801 goto rw_error; 8802 } 8803 } 8804 8805 for (i = 0; i < 24; i++) { 8806 rc = drxj_dap_read_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), &data, 0); 8807 if (rc != 0) { 8808 pr_err("error %d\n", rc); 8809 goto rw_error; 8810 } 8811 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), -data, 0); 8812 if (rc != 0) { 8813 pr_err("error %d\n", rc); 8814 goto rw_error; 8815 } 8816 } 8817 8818 data = equ_mode; 8819 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0); 8820 if (rc != 0) { 8821 pr_err("error %d\n", rc); 8822 goto rw_error; 8823 } 8824 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0); 8825 if (rc != 0) { 8826 pr_err("error %d\n", rc); 8827 goto rw_error; 8828 } 8829 8830 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE_TGT__A, 4, 0); 8831 if (rc != 0) { 8832 pr_err("error %d\n", rc); 8833 goto rw_error; 8834 } 8835 8836 i = 0; 8837 while ((fsm_state != 4) && (i++ < 100)) { 8838 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE__A, &fsm_state, 0); 8839 if (rc != 0) { 8840 pr_err("error %d\n", rc); 8841 goto rw_error; 8842 } 8843 } 8844 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, (qam_ctl_ena | 0x0016), 0); 8845 if (rc != 0) { 8846 pr_err("error %d\n", rc); 8847 goto rw_error; 8848 } 8849 8850 return 0; 8851 rw_error: 8852 return rc; 8853 8854 } 8855 8856 #define NO_LOCK 0x0 8857 #define DEMOD_LOCKED 0x1 8858 #define SYNC_FLIPPED 0x2 8859 #define SPEC_MIRRORED 0x4 8860 /* 8861 * \fn int qam64auto () 8862 * \brief auto do sync pattern switching and mirroring. 8863 * \param demod: instance of demod. 8864 * \param channel: pointer to channel data. 8865 * \param tuner_freq_offset: tuner frequency offset. 8866 * \param lock_status: pointer to lock status. 8867 * \return int. 8868 */ 8869 static int 8870 qam64auto(struct drx_demod_instance *demod, 8871 struct drx_channel *channel, 8872 s32 tuner_freq_offset, enum drx_lock_status *lock_status) 8873 { 8874 struct drxj_data *ext_attr = demod->my_ext_attr; 8875 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 8876 struct drx39xxj_state *state = dev_addr->user_data; 8877 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache; 8878 int rc; 8879 u32 lck_state = NO_LOCK; 8880 u32 start_time = 0; 8881 u32 d_locked_time = 0; 8882 u32 timeout_ofs = 0; 8883 u16 data = 0; 8884 8885 /* external attributes for storing acquired channel constellation */ 8886 *lock_status = DRX_NOT_LOCKED; 8887 start_time = jiffies_to_msecs(jiffies); 8888 lck_state = NO_LOCK; 8889 do { 8890 rc = ctrl_lock_status(demod, lock_status); 8891 if (rc != 0) { 8892 pr_err("error %d\n", rc); 8893 goto rw_error; 8894 } 8895 8896 switch (lck_state) { 8897 case NO_LOCK: 8898 if (*lock_status == DRXJ_DEMOD_LOCK) { 8899 rc = ctrl_get_qam_sig_quality(demod); 8900 if (rc != 0) { 8901 pr_err("error %d\n", rc); 8902 goto rw_error; 8903 } 8904 if (p->cnr.stat[0].svalue > 20800) { 8905 lck_state = DEMOD_LOCKED; 8906 /* some delay to see if fec_lock possible TODO find the right value */ 8907 timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME; /* see something, waiting longer */ 8908 d_locked_time = jiffies_to_msecs(jiffies); 8909 } 8910 } 8911 break; 8912 case DEMOD_LOCKED: 8913 if ((*lock_status == DRXJ_DEMOD_LOCK) && /* still demod_lock in 150ms */ 8914 ((jiffies_to_msecs(jiffies) - d_locked_time) > 8915 DRXJ_QAM_FEC_LOCK_WAITTIME)) { 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 | 0x1, 0); 8922 if (rc != 0) { 8923 pr_err("error %d\n", rc); 8924 goto rw_error; 8925 } 8926 lck_state = SYNC_FLIPPED; 8927 msleep(10); 8928 } 8929 break; 8930 case SYNC_FLIPPED: 8931 if (*lock_status == DRXJ_DEMOD_LOCK) { 8932 if (channel->mirror == DRX_MIRROR_AUTO) { 8933 /* flip sync pattern back */ 8934 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0); 8935 if (rc != 0) { 8936 pr_err("error %d\n", rc); 8937 goto rw_error; 8938 } 8939 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data & 0xFFFE, 0); 8940 if (rc != 0) { 8941 pr_err("error %d\n", rc); 8942 goto rw_error; 8943 } 8944 /* flip spectrum */ 8945 ext_attr->mirror = DRX_MIRROR_YES; 8946 rc = qam_flip_spec(demod, channel); 8947 if (rc != 0) { 8948 pr_err("error %d\n", rc); 8949 goto rw_error; 8950 } 8951 lck_state = SPEC_MIRRORED; 8952 /* reset timer TODO: still need 500ms? */ 8953 start_time = d_locked_time = 8954 jiffies_to_msecs(jiffies); 8955 timeout_ofs = 0; 8956 } else { /* no need to wait lock */ 8957 8958 start_time = 8959 jiffies_to_msecs(jiffies) - 8960 DRXJ_QAM_MAX_WAITTIME - timeout_ofs; 8961 } 8962 } 8963 break; 8964 case SPEC_MIRRORED: 8965 if ((*lock_status == DRXJ_DEMOD_LOCK) && /* still demod_lock in 150ms */ 8966 ((jiffies_to_msecs(jiffies) - d_locked_time) > 8967 DRXJ_QAM_FEC_LOCK_WAITTIME)) { 8968 rc = ctrl_get_qam_sig_quality(demod); 8969 if (rc != 0) { 8970 pr_err("error %d\n", rc); 8971 goto rw_error; 8972 } 8973 if (p->cnr.stat[0].svalue > 20800) { 8974 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0); 8975 if (rc != 0) { 8976 pr_err("error %d\n", rc); 8977 goto rw_error; 8978 } 8979 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0); 8980 if (rc != 0) { 8981 pr_err("error %d\n", rc); 8982 goto rw_error; 8983 } 8984 /* no need to wait lock */ 8985 start_time = 8986 jiffies_to_msecs(jiffies) - 8987 DRXJ_QAM_MAX_WAITTIME - timeout_ofs; 8988 } 8989 } 8990 break; 8991 default: 8992 break; 8993 } 8994 msleep(10); 8995 } while 8996 ((*lock_status != DRX_LOCKED) && 8997 (*lock_status != DRX_NEVER_LOCK) && 8998 ((jiffies_to_msecs(jiffies) - start_time) < 8999 (DRXJ_QAM_MAX_WAITTIME + timeout_ofs)) 9000 ); 9001 /* Returning control to application ... */ 9002 9003 return 0; 9004 rw_error: 9005 return rc; 9006 } 9007 9008 /* 9009 * \fn int qam256auto () 9010 * \brief auto do sync pattern switching and mirroring. 9011 * \param demod: instance of demod. 9012 * \param channel: pointer to channel data. 9013 * \param tuner_freq_offset: tuner frequency offset. 9014 * \param lock_status: pointer to lock status. 9015 * \return int. 9016 */ 9017 static int 9018 qam256auto(struct drx_demod_instance *demod, 9019 struct drx_channel *channel, 9020 s32 tuner_freq_offset, enum drx_lock_status *lock_status) 9021 { 9022 struct drxj_data *ext_attr = demod->my_ext_attr; 9023 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 9024 struct drx39xxj_state *state = dev_addr->user_data; 9025 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache; 9026 int rc; 9027 u32 lck_state = NO_LOCK; 9028 u32 start_time = 0; 9029 u32 d_locked_time = 0; 9030 u32 timeout_ofs = DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME; 9031 9032 /* external attributes for storing acquired channel constellation */ 9033 *lock_status = DRX_NOT_LOCKED; 9034 start_time = jiffies_to_msecs(jiffies); 9035 lck_state = NO_LOCK; 9036 do { 9037 rc = ctrl_lock_status(demod, lock_status); 9038 if (rc != 0) { 9039 pr_err("error %d\n", rc); 9040 goto rw_error; 9041 } 9042 switch (lck_state) { 9043 case NO_LOCK: 9044 if (*lock_status == DRXJ_DEMOD_LOCK) { 9045 rc = ctrl_get_qam_sig_quality(demod); 9046 if (rc != 0) { 9047 pr_err("error %d\n", rc); 9048 goto rw_error; 9049 } 9050 if (p->cnr.stat[0].svalue > 26800) { 9051 lck_state = DEMOD_LOCKED; 9052 timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME; /* see something, wait longer */ 9053 d_locked_time = jiffies_to_msecs(jiffies); 9054 } 9055 } 9056 break; 9057 case DEMOD_LOCKED: 9058 if (*lock_status == DRXJ_DEMOD_LOCK) { 9059 if ((channel->mirror == DRX_MIRROR_AUTO) && 9060 ((jiffies_to_msecs(jiffies) - d_locked_time) > 9061 DRXJ_QAM_FEC_LOCK_WAITTIME)) { 9062 ext_attr->mirror = DRX_MIRROR_YES; 9063 rc = qam_flip_spec(demod, channel); 9064 if (rc != 0) { 9065 pr_err("error %d\n", rc); 9066 goto rw_error; 9067 } 9068 lck_state = SPEC_MIRRORED; 9069 /* reset timer TODO: still need 300ms? */ 9070 start_time = jiffies_to_msecs(jiffies); 9071 timeout_ofs = -DRXJ_QAM_MAX_WAITTIME / 2; 9072 } 9073 } 9074 break; 9075 case SPEC_MIRRORED: 9076 break; 9077 default: 9078 break; 9079 } 9080 msleep(10); 9081 } while 9082 ((*lock_status < DRX_LOCKED) && 9083 (*lock_status != DRX_NEVER_LOCK) && 9084 ((jiffies_to_msecs(jiffies) - start_time) < 9085 (DRXJ_QAM_MAX_WAITTIME + timeout_ofs))); 9086 9087 return 0; 9088 rw_error: 9089 return rc; 9090 } 9091 9092 /* 9093 * \fn int set_qam_channel () 9094 * \brief Set QAM channel according to the requested constellation. 9095 * \param demod: instance of demod. 9096 * \param channel: pointer to channel data. 9097 * \return int. 9098 */ 9099 static int 9100 set_qam_channel(struct drx_demod_instance *demod, 9101 struct drx_channel *channel, s32 tuner_freq_offset) 9102 { 9103 struct drxj_data *ext_attr = NULL; 9104 int rc; 9105 enum drx_lock_status lock_status = DRX_NOT_LOCKED; 9106 bool auto_flag = false; 9107 9108 /* external attributes for storing acquired channel constellation */ 9109 ext_attr = (struct drxj_data *) demod->my_ext_attr; 9110 9111 /* set QAM channel constellation */ 9112 switch (channel->constellation) { 9113 case DRX_CONSTELLATION_QAM16: 9114 case DRX_CONSTELLATION_QAM32: 9115 case DRX_CONSTELLATION_QAM128: 9116 return -EINVAL; 9117 case DRX_CONSTELLATION_QAM64: 9118 case DRX_CONSTELLATION_QAM256: 9119 if (ext_attr->standard != DRX_STANDARD_ITU_B) 9120 return -EINVAL; 9121 9122 ext_attr->constellation = channel->constellation; 9123 if (channel->mirror == DRX_MIRROR_AUTO) 9124 ext_attr->mirror = DRX_MIRROR_NO; 9125 else 9126 ext_attr->mirror = channel->mirror; 9127 9128 rc = set_qam(demod, channel, tuner_freq_offset, QAM_SET_OP_ALL); 9129 if (rc != 0) { 9130 pr_err("error %d\n", rc); 9131 goto rw_error; 9132 } 9133 9134 if (channel->constellation == DRX_CONSTELLATION_QAM64) 9135 rc = qam64auto(demod, channel, tuner_freq_offset, 9136 &lock_status); 9137 else 9138 rc = qam256auto(demod, channel, tuner_freq_offset, 9139 &lock_status); 9140 if (rc != 0) { 9141 pr_err("error %d\n", rc); 9142 goto rw_error; 9143 } 9144 break; 9145 case DRX_CONSTELLATION_AUTO: /* for channel scan */ 9146 if (ext_attr->standard == DRX_STANDARD_ITU_B) { 9147 u16 qam_ctl_ena = 0; 9148 9149 auto_flag = true; 9150 9151 /* try to lock default QAM constellation: QAM256 */ 9152 channel->constellation = DRX_CONSTELLATION_QAM256; 9153 ext_attr->constellation = DRX_CONSTELLATION_QAM256; 9154 if (channel->mirror == DRX_MIRROR_AUTO) 9155 ext_attr->mirror = DRX_MIRROR_NO; 9156 else 9157 ext_attr->mirror = channel->mirror; 9158 rc = set_qam(demod, channel, tuner_freq_offset, 9159 QAM_SET_OP_ALL); 9160 if (rc != 0) { 9161 pr_err("error %d\n", rc); 9162 goto rw_error; 9163 } 9164 rc = qam256auto(demod, channel, tuner_freq_offset, 9165 &lock_status); 9166 if (rc != 0) { 9167 pr_err("error %d\n", rc); 9168 goto rw_error; 9169 } 9170 9171 if (lock_status >= DRX_LOCKED) { 9172 channel->constellation = DRX_CONSTELLATION_AUTO; 9173 break; 9174 } 9175 9176 /* QAM254 not locked. Try QAM64 constellation */ 9177 channel->constellation = DRX_CONSTELLATION_QAM64; 9178 ext_attr->constellation = DRX_CONSTELLATION_QAM64; 9179 if (channel->mirror == DRX_MIRROR_AUTO) 9180 ext_attr->mirror = DRX_MIRROR_NO; 9181 else 9182 ext_attr->mirror = channel->mirror; 9183 9184 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, 9185 SCU_RAM_QAM_CTL_ENA__A, 9186 &qam_ctl_ena, 0); 9187 if (rc != 0) { 9188 pr_err("error %d\n", rc); 9189 goto rw_error; 9190 } 9191 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, 9192 SCU_RAM_QAM_CTL_ENA__A, 9193 qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0); 9194 if (rc != 0) { 9195 pr_err("error %d\n", rc); 9196 goto rw_error; 9197 } 9198 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, 9199 SCU_RAM_QAM_FSM_STATE_TGT__A, 9200 0x2, 0); 9201 if (rc != 0) { 9202 pr_err("error %d\n", rc); 9203 goto rw_error; 9204 } /* force to rate hunting */ 9205 9206 rc = set_qam(demod, channel, tuner_freq_offset, 9207 QAM_SET_OP_CONSTELLATION); 9208 if (rc != 0) { 9209 pr_err("error %d\n", rc); 9210 goto rw_error; 9211 } 9212 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, 9213 SCU_RAM_QAM_CTL_ENA__A, 9214 qam_ctl_ena, 0); 9215 if (rc != 0) { 9216 pr_err("error %d\n", rc); 9217 goto rw_error; 9218 } 9219 9220 rc = qam64auto(demod, channel, tuner_freq_offset, 9221 &lock_status); 9222 if (rc != 0) { 9223 pr_err("error %d\n", rc); 9224 goto rw_error; 9225 } 9226 9227 channel->constellation = DRX_CONSTELLATION_AUTO; 9228 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) { 9229 u16 qam_ctl_ena = 0; 9230 9231 channel->constellation = DRX_CONSTELLATION_QAM64; 9232 ext_attr->constellation = DRX_CONSTELLATION_QAM64; 9233 auto_flag = true; 9234 9235 if (channel->mirror == DRX_MIRROR_AUTO) 9236 ext_attr->mirror = DRX_MIRROR_NO; 9237 else 9238 ext_attr->mirror = channel->mirror; 9239 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, 9240 SCU_RAM_QAM_CTL_ENA__A, 9241 &qam_ctl_ena, 0); 9242 if (rc != 0) { 9243 pr_err("error %d\n", rc); 9244 goto rw_error; 9245 } 9246 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, 9247 SCU_RAM_QAM_CTL_ENA__A, 9248 qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0); 9249 if (rc != 0) { 9250 pr_err("error %d\n", rc); 9251 goto rw_error; 9252 } 9253 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, 9254 SCU_RAM_QAM_FSM_STATE_TGT__A, 9255 0x2, 0); 9256 if (rc != 0) { 9257 pr_err("error %d\n", rc); 9258 goto rw_error; 9259 } /* force to rate hunting */ 9260 9261 rc = set_qam(demod, channel, tuner_freq_offset, 9262 QAM_SET_OP_CONSTELLATION); 9263 if (rc != 0) { 9264 pr_err("error %d\n", rc); 9265 goto rw_error; 9266 } 9267 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, 9268 SCU_RAM_QAM_CTL_ENA__A, 9269 qam_ctl_ena, 0); 9270 if (rc != 0) { 9271 pr_err("error %d\n", rc); 9272 goto rw_error; 9273 } 9274 rc = qam64auto(demod, channel, tuner_freq_offset, 9275 &lock_status); 9276 if (rc != 0) { 9277 pr_err("error %d\n", rc); 9278 goto rw_error; 9279 } 9280 channel->constellation = DRX_CONSTELLATION_AUTO; 9281 } else { 9282 return -EINVAL; 9283 } 9284 break; 9285 default: 9286 return -EINVAL; 9287 } 9288 9289 return 0; 9290 rw_error: 9291 /* restore starting value */ 9292 if (auto_flag) 9293 channel->constellation = DRX_CONSTELLATION_AUTO; 9294 return rc; 9295 } 9296 9297 /*============================================================================*/ 9298 9299 /* 9300 * \fn static short get_qamrs_err_count(struct i2c_device_addr *dev_addr) 9301 * \brief Get RS error count in QAM mode (used for post RS BER calculation) 9302 * \return Error code 9303 * 9304 * precondition: measurement period & measurement prescale must be set 9305 * 9306 */ 9307 static int 9308 get_qamrs_err_count(struct i2c_device_addr *dev_addr, 9309 struct drxjrs_errors *rs_errors) 9310 { 9311 int rc; 9312 u16 nr_bit_errors = 0, 9313 nr_symbol_errors = 0, 9314 nr_packet_errors = 0, nr_failures = 0, nr_snc_par_fail_count = 0; 9315 9316 /* check arguments */ 9317 if (dev_addr == NULL) 9318 return -EINVAL; 9319 9320 /* all reported errors are received in the */ 9321 /* most recently finished measurement period */ 9322 /* no of pre RS bit errors */ 9323 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &nr_bit_errors, 0); 9324 if (rc != 0) { 9325 pr_err("error %d\n", rc); 9326 goto rw_error; 9327 } 9328 /* no of symbol errors */ 9329 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_SYMBOL_ERRORS__A, &nr_symbol_errors, 0); 9330 if (rc != 0) { 9331 pr_err("error %d\n", rc); 9332 goto rw_error; 9333 } 9334 /* no of packet errors */ 9335 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_PACKET_ERRORS__A, &nr_packet_errors, 0); 9336 if (rc != 0) { 9337 pr_err("error %d\n", rc); 9338 goto rw_error; 9339 } 9340 /* no of failures to decode */ 9341 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &nr_failures, 0); 9342 if (rc != 0) { 9343 pr_err("error %d\n", rc); 9344 goto rw_error; 9345 } 9346 /* no of post RS bit erros */ 9347 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_COUNT__A, &nr_snc_par_fail_count, 0); 9348 if (rc != 0) { 9349 pr_err("error %d\n", rc); 9350 goto rw_error; 9351 } 9352 /* TODO: NOTE */ 9353 /* These register values are fetched in non-atomic fashion */ 9354 /* It is possible that the read values contain unrelated information */ 9355 9356 rs_errors->nr_bit_errors = nr_bit_errors & FEC_RS_NR_BIT_ERRORS__M; 9357 rs_errors->nr_symbol_errors = nr_symbol_errors & FEC_RS_NR_SYMBOL_ERRORS__M; 9358 rs_errors->nr_packet_errors = nr_packet_errors & FEC_RS_NR_PACKET_ERRORS__M; 9359 rs_errors->nr_failures = nr_failures & FEC_RS_NR_FAILURES__M; 9360 rs_errors->nr_snc_par_fail_count = 9361 nr_snc_par_fail_count & FEC_OC_SNC_FAIL_COUNT__M; 9362 9363 return 0; 9364 rw_error: 9365 return rc; 9366 } 9367 9368 /*============================================================================*/ 9369 9370 /* 9371 * \fn int get_sig_strength() 9372 * \brief Retrieve signal strength for VSB and QAM. 9373 * \param demod Pointer to demod instance 9374 * \param u16-t Pointer to signal strength data; range 0, .. , 100. 9375 * \return int. 9376 * \retval 0 sig_strength contains valid data. 9377 * \retval -EINVAL sig_strength is NULL. 9378 * \retval -EIO Erroneous data, sig_strength contains invalid data. 9379 */ 9380 #define DRXJ_AGC_TOP 0x2800 9381 #define DRXJ_AGC_SNS 0x1600 9382 #define DRXJ_RFAGC_MAX 0x3fff 9383 #define DRXJ_RFAGC_MIN 0x800 9384 9385 static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength) 9386 { 9387 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 9388 int rc; 9389 u16 rf_gain = 0; 9390 u16 if_gain = 0; 9391 u16 if_agc_sns = 0; 9392 u16 if_agc_top = 0; 9393 u16 rf_agc_max = 0; 9394 u16 rf_agc_min = 0; 9395 9396 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_IF__A, &if_gain, 0); 9397 if (rc != 0) { 9398 pr_err("error %d\n", rc); 9399 goto rw_error; 9400 } 9401 if_gain &= IQM_AF_AGC_IF__M; 9402 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_RF__A, &rf_gain, 0); 9403 if (rc != 0) { 9404 pr_err("error %d\n", rc); 9405 goto rw_error; 9406 } 9407 rf_gain &= IQM_AF_AGC_RF__M; 9408 9409 if_agc_sns = DRXJ_AGC_SNS; 9410 if_agc_top = DRXJ_AGC_TOP; 9411 rf_agc_max = DRXJ_RFAGC_MAX; 9412 rf_agc_min = DRXJ_RFAGC_MIN; 9413 9414 if (if_gain > if_agc_top) { 9415 if (rf_gain > rf_agc_max) 9416 *sig_strength = 100; 9417 else if (rf_gain > rf_agc_min) { 9418 if (rf_agc_max == rf_agc_min) { 9419 pr_err("error: rf_agc_max == rf_agc_min\n"); 9420 return -EIO; 9421 } 9422 *sig_strength = 9423 75 + 25 * (rf_gain - rf_agc_min) / (rf_agc_max - 9424 rf_agc_min); 9425 } else 9426 *sig_strength = 75; 9427 } else if (if_gain > if_agc_sns) { 9428 if (if_agc_top == if_agc_sns) { 9429 pr_err("error: if_agc_top == if_agc_sns\n"); 9430 return -EIO; 9431 } 9432 *sig_strength = 9433 20 + 55 * (if_gain - if_agc_sns) / (if_agc_top - if_agc_sns); 9434 } else { 9435 if (!if_agc_sns) { 9436 pr_err("error: if_agc_sns is zero!\n"); 9437 return -EIO; 9438 } 9439 *sig_strength = (20 * if_gain / if_agc_sns); 9440 } 9441 9442 if (*sig_strength <= 7) 9443 *sig_strength = 0; 9444 9445 return 0; 9446 rw_error: 9447 return rc; 9448 } 9449 9450 /* 9451 * \fn int ctrl_get_qam_sig_quality() 9452 * \brief Retrieve QAM signal quality from device. 9453 * \param devmod Pointer to demodulator instance. 9454 * \param sig_quality Pointer to signal quality data. 9455 * \return int. 9456 * \retval 0 sig_quality contains valid data. 9457 * \retval -EINVAL sig_quality is NULL. 9458 * \retval -EIO Erroneous data, sig_quality contains invalid data. 9459 9460 * Pre-condition: Device must be started and in lock. 9461 */ 9462 static int 9463 ctrl_get_qam_sig_quality(struct drx_demod_instance *demod) 9464 { 9465 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 9466 struct drxj_data *ext_attr = demod->my_ext_attr; 9467 struct drx39xxj_state *state = dev_addr->user_data; 9468 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache; 9469 struct drxjrs_errors measuredrs_errors = { 0, 0, 0, 0, 0 }; 9470 enum drx_modulation constellation = ext_attr->constellation; 9471 int rc; 9472 9473 u32 pre_bit_err_rs = 0; /* pre RedSolomon Bit Error Rate */ 9474 u32 post_bit_err_rs = 0; /* post RedSolomon Bit Error Rate */ 9475 u32 pkt_errs = 0; /* no of packet errors in RS */ 9476 u16 qam_sl_err_power = 0; /* accumulated error between raw and sliced symbols */ 9477 u16 qsym_err_vd = 0; /* quadrature symbol errors in QAM_VD */ 9478 u16 fec_oc_period = 0; /* SNC sync failure measurement period */ 9479 u16 fec_rs_prescale = 0; /* ReedSolomon Measurement Prescale */ 9480 u16 fec_rs_period = 0; /* Value for corresponding I2C register */ 9481 /* calculation constants */ 9482 u32 rs_bit_cnt = 0; /* RedSolomon Bit Count */ 9483 u32 qam_sl_sig_power = 0; /* used for MER, depends of QAM constellation */ 9484 /* intermediate results */ 9485 u32 e = 0; /* exponent value used for QAM BER/SER */ 9486 u32 m = 0; /* mantisa value used for QAM BER/SER */ 9487 u32 ber_cnt = 0; /* BER count */ 9488 /* signal quality info */ 9489 u32 qam_sl_mer = 0; /* QAM MER */ 9490 u32 qam_pre_rs_ber = 0; /* Pre RedSolomon BER */ 9491 u32 qam_post_rs_ber = 0; /* Post RedSolomon BER */ 9492 u32 qam_vd_ser = 0; /* ViterbiDecoder SER */ 9493 u16 qam_vd_prescale = 0; /* Viterbi Measurement Prescale */ 9494 u16 qam_vd_period = 0; /* Viterbi Measurement period */ 9495 u32 vd_bit_cnt = 0; /* ViterbiDecoder Bit Count */ 9496 9497 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 9498 9499 /* read the physical registers */ 9500 /* Get the RS error data */ 9501 rc = get_qamrs_err_count(dev_addr, &measuredrs_errors); 9502 if (rc != 0) { 9503 pr_err("error %d\n", rc); 9504 goto rw_error; 9505 } 9506 /* get the register value needed for MER */ 9507 rc = drxj_dap_read_reg16(dev_addr, QAM_SL_ERR_POWER__A, &qam_sl_err_power, 0); 9508 if (rc != 0) { 9509 pr_err("error %d\n", rc); 9510 goto rw_error; 9511 } 9512 /* get the register value needed for post RS BER */ 9513 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, &fec_oc_period, 0); 9514 if (rc != 0) { 9515 pr_err("error %d\n", rc); 9516 goto rw_error; 9517 } 9518 9519 /* get constants needed for signal quality calculation */ 9520 fec_rs_period = ext_attr->fec_rs_period; 9521 fec_rs_prescale = ext_attr->fec_rs_prescale; 9522 rs_bit_cnt = fec_rs_period * fec_rs_prescale * ext_attr->fec_rs_plen; 9523 qam_vd_period = ext_attr->qam_vd_period; 9524 qam_vd_prescale = ext_attr->qam_vd_prescale; 9525 vd_bit_cnt = qam_vd_period * qam_vd_prescale * ext_attr->fec_vd_plen; 9526 9527 /* DRXJ_QAM_SL_SIG_POWER_QAMxxx * 4 */ 9528 switch (constellation) { 9529 case DRX_CONSTELLATION_QAM16: 9530 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM16 << 2; 9531 break; 9532 case DRX_CONSTELLATION_QAM32: 9533 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM32 << 2; 9534 break; 9535 case DRX_CONSTELLATION_QAM64: 9536 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM64 << 2; 9537 break; 9538 case DRX_CONSTELLATION_QAM128: 9539 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM128 << 2; 9540 break; 9541 case DRX_CONSTELLATION_QAM256: 9542 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM256 << 2; 9543 break; 9544 default: 9545 return -EIO; 9546 } 9547 9548 /* ------------------------------ */ 9549 /* MER Calculation */ 9550 /* ------------------------------ */ 9551 /* MER is good if it is above 27.5 for QAM256 or 21.5 for QAM64 */ 9552 9553 /* 10.0*log10(qam_sl_sig_power * 4.0 / qam_sl_err_power); */ 9554 if (qam_sl_err_power == 0) 9555 qam_sl_mer = 0; 9556 else 9557 qam_sl_mer = log1_times100(qam_sl_sig_power) - log1_times100((u32)qam_sl_err_power); 9558 9559 /* ----------------------------------------- */ 9560 /* Pre Viterbi Symbol Error Rate Calculation */ 9561 /* ----------------------------------------- */ 9562 /* pre viterbi SER is good if it is below 0.025 */ 9563 9564 /* get the register value */ 9565 /* no of quadrature symbol errors */ 9566 rc = drxj_dap_read_reg16(dev_addr, QAM_VD_NR_QSYM_ERRORS__A, &qsym_err_vd, 0); 9567 if (rc != 0) { 9568 pr_err("error %d\n", rc); 9569 goto rw_error; 9570 } 9571 /* Extract the Exponent and the Mantisa */ 9572 /* of number of quadrature symbol errors */ 9573 e = (qsym_err_vd & QAM_VD_NR_QSYM_ERRORS_EXP__M) >> 9574 QAM_VD_NR_QSYM_ERRORS_EXP__B; 9575 m = (qsym_err_vd & QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__M) >> 9576 QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B; 9577 9578 if ((m << e) >> 3 > 549752) 9579 qam_vd_ser = 500000 * vd_bit_cnt * ((e > 2) ? 1 : 8) / 8; 9580 else 9581 qam_vd_ser = m << ((e > 2) ? (e - 3) : e); 9582 9583 /* --------------------------------------- */ 9584 /* pre and post RedSolomon BER Calculation */ 9585 /* --------------------------------------- */ 9586 /* pre RS BER is good if it is below 3.5e-4 */ 9587 9588 /* get the register values */ 9589 pre_bit_err_rs = (u32) measuredrs_errors.nr_bit_errors; 9590 pkt_errs = post_bit_err_rs = (u32) measuredrs_errors.nr_snc_par_fail_count; 9591 9592 /* Extract the Exponent and the Mantisa of the */ 9593 /* pre Reed-Solomon bit error count */ 9594 e = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_EXP__M) >> 9595 FEC_RS_NR_BIT_ERRORS_EXP__B; 9596 m = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M) >> 9597 FEC_RS_NR_BIT_ERRORS_FIXED_MANT__B; 9598 9599 ber_cnt = m << e; 9600 9601 /*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */ 9602 if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0) 9603 qam_pre_rs_ber = 500000 * rs_bit_cnt >> e; 9604 else 9605 qam_pre_rs_ber = ber_cnt; 9606 9607 /* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) / */ 9608 /* (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A) */ 9609 /* 9610 => c = (1000000*100*11.17)/1504 = 9611 post RS BER = (( c* FEC_OC_SNC_FAIL_COUNT__A) / 9612 (100 * FEC_OC_SNC_FAIL_PERIOD__A) 9613 *100 and /100 is for more precision. 9614 => (20 bits * 12 bits) /(16 bits * 7 bits) => safe in 32 bits computation 9615 9616 Precision errors still possible. 9617 */ 9618 if (!fec_oc_period) { 9619 qam_post_rs_ber = 0xFFFFFFFF; 9620 } else { 9621 e = post_bit_err_rs * 742686; 9622 m = fec_oc_period * 100; 9623 qam_post_rs_ber = e / m; 9624 } 9625 9626 /* fill signal quality data structure */ 9627 p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER; 9628 p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; 9629 p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER; 9630 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; 9631 p->block_error.stat[0].scale = FE_SCALE_COUNTER; 9632 p->cnr.stat[0].scale = FE_SCALE_DECIBEL; 9633 9634 p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100; 9635 if (ext_attr->standard == DRX_STANDARD_ITU_B) { 9636 p->pre_bit_error.stat[0].uvalue += qam_vd_ser; 9637 p->pre_bit_count.stat[0].uvalue += vd_bit_cnt * ((e > 2) ? 1 : 8) / 8; 9638 } else { 9639 p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber; 9640 p->pre_bit_count.stat[0].uvalue += rs_bit_cnt >> e; 9641 } 9642 9643 p->post_bit_error.stat[0].uvalue += qam_post_rs_ber; 9644 p->post_bit_count.stat[0].uvalue += rs_bit_cnt >> e; 9645 9646 p->block_error.stat[0].uvalue += pkt_errs; 9647 9648 #ifdef DRXJ_SIGNAL_ACCUM_ERR 9649 rc = get_acc_pkt_err(demod, &sig_quality->packet_error); 9650 if (rc != 0) { 9651 pr_err("error %d\n", rc); 9652 goto rw_error; 9653 } 9654 #endif 9655 9656 return 0; 9657 rw_error: 9658 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 9659 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 9660 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 9661 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 9662 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 9663 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 9664 9665 return rc; 9666 } 9667 9668 #endif /* #ifndef DRXJ_VSB_ONLY */ 9669 9670 /*============================================================================*/ 9671 /*== END QAM DATAPATH FUNCTIONS ==*/ 9672 /*============================================================================*/ 9673 9674 /*============================================================================*/ 9675 /*============================================================================*/ 9676 /*== ATV DATAPATH FUNCTIONS ==*/ 9677 /*============================================================================*/ 9678 /*============================================================================*/ 9679 9680 /* 9681 Implementation notes. 9682 9683 NTSC/FM AGCs 9684 9685 Four AGCs are used for NTSC: 9686 (1) RF (used to attenuate the input signal in case of to much power) 9687 (2) IF (used to attenuate the input signal in case of to much power) 9688 (3) Video AGC (used to amplify the output signal in case input to low) 9689 (4) SIF AGC (used to amplify the output signal in case input to low) 9690 9691 Video AGC is coupled to RF and IF. SIF AGC is not coupled. It is assumed 9692 that the coupling between Video AGC and the RF and IF AGCs also works in 9693 favor of the SIF AGC. 9694 9695 Three AGCs are used for FM: 9696 (1) RF (used to attenuate the input signal in case of to much power) 9697 (2) IF (used to attenuate the input signal in case of to much power) 9698 (3) SIF AGC (used to amplify the output signal in case input to low) 9699 9700 The SIF AGC is now coupled to the RF/IF AGCs. 9701 The SIF AGC is needed for both SIF output and the internal SIF signal to 9702 the AUD block. 9703 9704 RF and IF AGCs DACs are part of AFE, Video and SIF AGC DACs are part of 9705 the ATV block. The AGC control algorithms are all implemented in 9706 microcode. 9707 9708 ATV SETTINGS 9709 9710 (Shadow settings will not be used for now, they will be implemented 9711 later on because of the schedule) 9712 9713 Several HW/SCU "settings" can be used for ATV. The standard selection 9714 will reset most of these settings. To avoid that the end user application 9715 has to perform these settings each time the ATV or FM standards is 9716 selected the driver will shadow these settings. This enables the end user 9717 to perform the settings only once after a drx_open(). The driver must 9718 write the shadow settings to HW/SCU in case: 9719 ( setstandard FM/ATV) || 9720 ( settings have changed && FM/ATV standard is active) 9721 The shadow settings will be stored in the device specific data container. 9722 A set of flags will be defined to flag changes in shadow settings. 9723 A routine will be implemented to write all changed shadow settings to 9724 HW/SCU. 9725 9726 The "settings" will consist of: AGC settings, filter settings etc. 9727 9728 Disadvantage of use of shadow settings: 9729 Direct changes in HW/SCU registers will not be reflected in the 9730 shadow settings and these changes will be overwritten during a next 9731 update. This can happen during evaluation. This will not be a problem 9732 for normal customer usage. 9733 */ 9734 /* -------------------------------------------------------------------------- */ 9735 9736 /* 9737 * \fn int power_down_atv () 9738 * \brief Power down ATV. 9739 * \param demod instance of demodulator 9740 * \param standard either NTSC or FM (sub strandard for ATV ) 9741 * \return int. 9742 * 9743 * Stops and thus resets ATV and IQM block 9744 * SIF and CVBS ADC are powered down 9745 * Calls audio power down 9746 */ 9747 static int 9748 power_down_atv(struct drx_demod_instance *demod, enum drx_standard standard, bool primary) 9749 { 9750 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 9751 struct drxjscu_cmd cmd_scu = { /* command */ 0, 9752 /* parameter_len */ 0, 9753 /* result_len */ 0, 9754 /* *parameter */ NULL, 9755 /* *result */ NULL 9756 }; 9757 int rc; 9758 u16 cmd_result = 0; 9759 9760 /* ATV NTSC */ 9761 9762 /* Stop ATV SCU (will reset ATV and IQM hardware */ 9763 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_ATV | 9764 SCU_RAM_COMMAND_CMD_DEMOD_STOP; 9765 cmd_scu.parameter_len = 0; 9766 cmd_scu.result_len = 1; 9767 cmd_scu.parameter = NULL; 9768 cmd_scu.result = &cmd_result; 9769 rc = scu_command(dev_addr, &cmd_scu); 9770 if (rc != 0) { 9771 pr_err("error %d\n", rc); 9772 goto rw_error; 9773 } 9774 /* Disable ATV outputs (ATV reset enables CVBS, undo this) */ 9775 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); 9776 if (rc != 0) { 9777 pr_err("error %d\n", rc); 9778 goto rw_error; 9779 } 9780 9781 rc = drxj_dap_write_reg16(dev_addr, ATV_COMM_EXEC__A, ATV_COMM_EXEC_STOP, 0); 9782 if (rc != 0) { 9783 pr_err("error %d\n", rc); 9784 goto rw_error; 9785 } 9786 if (primary) { 9787 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0); 9788 if (rc != 0) { 9789 pr_err("error %d\n", rc); 9790 goto rw_error; 9791 } 9792 rc = set_iqm_af(demod, false); 9793 if (rc != 0) { 9794 pr_err("error %d\n", rc); 9795 goto rw_error; 9796 } 9797 } else { 9798 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0); 9799 if (rc != 0) { 9800 pr_err("error %d\n", rc); 9801 goto rw_error; 9802 } 9803 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0); 9804 if (rc != 0) { 9805 pr_err("error %d\n", rc); 9806 goto rw_error; 9807 } 9808 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0); 9809 if (rc != 0) { 9810 pr_err("error %d\n", rc); 9811 goto rw_error; 9812 } 9813 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0); 9814 if (rc != 0) { 9815 pr_err("error %d\n", rc); 9816 goto rw_error; 9817 } 9818 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0); 9819 if (rc != 0) { 9820 pr_err("error %d\n", rc); 9821 goto rw_error; 9822 } 9823 } 9824 rc = power_down_aud(demod); 9825 if (rc != 0) { 9826 pr_err("error %d\n", rc); 9827 goto rw_error; 9828 } 9829 9830 return 0; 9831 rw_error: 9832 return rc; 9833 } 9834 9835 /*============================================================================*/ 9836 9837 /* 9838 * \brief Power up AUD. 9839 * \param demod instance of demodulator 9840 * \return int. 9841 * 9842 */ 9843 static int power_down_aud(struct drx_demod_instance *demod) 9844 { 9845 struct i2c_device_addr *dev_addr = NULL; 9846 struct drxj_data *ext_attr = NULL; 9847 int rc; 9848 9849 dev_addr = (struct i2c_device_addr *)demod->my_i2c_dev_addr; 9850 ext_attr = (struct drxj_data *) demod->my_ext_attr; 9851 9852 rc = drxj_dap_write_reg16(dev_addr, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP, 0); 9853 if (rc != 0) { 9854 pr_err("error %d\n", rc); 9855 goto rw_error; 9856 } 9857 9858 ext_attr->aud_data.audio_is_active = false; 9859 9860 return 0; 9861 rw_error: 9862 return rc; 9863 } 9864 9865 /* 9866 * \fn int set_orx_nsu_aox() 9867 * \brief Configure OrxNsuAox for OOB 9868 * \param demod instance of demodulator. 9869 * \param active 9870 * \return int. 9871 */ 9872 static int set_orx_nsu_aox(struct drx_demod_instance *demod, bool active) 9873 { 9874 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 9875 int rc; 9876 u16 data = 0; 9877 9878 /* Configure NSU_AOX */ 9879 rc = drxj_dap_read_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, &data, 0); 9880 if (rc != 0) { 9881 pr_err("error %d\n", rc); 9882 goto rw_error; 9883 } 9884 if (!active) 9885 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)); 9886 else 9887 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); 9888 rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, data, 0); 9889 if (rc != 0) { 9890 pr_err("error %d\n", rc); 9891 goto rw_error; 9892 } 9893 9894 return 0; 9895 rw_error: 9896 return rc; 9897 } 9898 9899 /* 9900 * \fn int ctrl_set_oob() 9901 * \brief Set OOB channel to be used. 9902 * \param demod instance of demodulator 9903 * \param oob_param OOB parameters for channel setting. 9904 * \frequency should be in KHz 9905 * \return int. 9906 * 9907 * Accepts only. Returns error otherwise. 9908 * Demapper value is written after scu_command START 9909 * because START command causes COMM_EXEC transition 9910 * from 0 to 1 which causes all registers to be 9911 * overwritten with initial value 9912 * 9913 */ 9914 9915 /* Nyquist filter impulse response */ 9916 #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 */ 9917 #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 */ 9918 #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) */ 9919 9920 /* Coefficients for the nyquist filter (total: 27 taps) */ 9921 #define NYQFILTERLEN 27 9922 9923 static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_param) 9924 { 9925 int rc; 9926 s32 freq = 0; /* KHz */ 9927 struct i2c_device_addr *dev_addr = NULL; 9928 struct drxj_data *ext_attr = NULL; 9929 u16 i = 0; 9930 bool mirror_freq_spect_oob = false; 9931 u16 trk_filter_value = 0; 9932 struct drxjscu_cmd scu_cmd; 9933 u16 set_param_parameters[3]; 9934 u16 cmd_result[2] = { 0, 0 }; 9935 s16 nyquist_coeffs[4][(NYQFILTERLEN + 1) / 2] = { 9936 IMPULSE_COSINE_ALPHA_0_3, /* Target Mode 0 */ 9937 IMPULSE_COSINE_ALPHA_0_3, /* Target Mode 1 */ 9938 IMPULSE_COSINE_ALPHA_0_5, /* Target Mode 2 */ 9939 IMPULSE_COSINE_ALPHA_RO_0_5 /* Target Mode 3 */ 9940 }; 9941 u8 mode_val[4] = { 2, 2, 0, 1 }; 9942 u8 pfi_coeffs[4][6] = { 9943 {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) */ 9944 {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) */ 9945 {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) */ 9946 {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) */ 9947 }; 9948 u16 mode_index; 9949 9950 dev_addr = demod->my_i2c_dev_addr; 9951 ext_attr = (struct drxj_data *) demod->my_ext_attr; 9952 mirror_freq_spect_oob = ext_attr->mirror_freq_spect_oob; 9953 9954 /* Check parameters */ 9955 if (oob_param == NULL) { 9956 /* power off oob module */ 9957 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB 9958 | SCU_RAM_COMMAND_CMD_DEMOD_STOP; 9959 scu_cmd.parameter_len = 0; 9960 scu_cmd.result_len = 1; 9961 scu_cmd.result = cmd_result; 9962 rc = scu_command(dev_addr, &scu_cmd); 9963 if (rc != 0) { 9964 pr_err("error %d\n", rc); 9965 goto rw_error; 9966 } 9967 rc = set_orx_nsu_aox(demod, false); 9968 if (rc != 0) { 9969 pr_err("error %d\n", rc); 9970 goto rw_error; 9971 } 9972 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0); 9973 if (rc != 0) { 9974 pr_err("error %d\n", rc); 9975 goto rw_error; 9976 } 9977 9978 ext_attr->oob_power_on = false; 9979 return 0; 9980 } 9981 9982 freq = oob_param->frequency; 9983 if ((freq < 70000) || (freq > 130000)) 9984 return -EIO; 9985 freq = (freq - 50000) / 50; 9986 9987 { 9988 u16 index = 0; 9989 u16 remainder = 0; 9990 u16 *trk_filtercfg = ext_attr->oob_trk_filter_cfg; 9991 9992 index = (u16) ((freq - 400) / 200); 9993 remainder = (u16) ((freq - 400) % 200); 9994 trk_filter_value = 9995 trk_filtercfg[index] - (trk_filtercfg[index] - 9996 trk_filtercfg[index + 9997 1]) / 10 * remainder / 9998 20; 9999 } 10000 10001 /********/ 10002 /* Stop */ 10003 /********/ 10004 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0); 10005 if (rc != 0) { 10006 pr_err("error %d\n", rc); 10007 goto rw_error; 10008 } 10009 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB 10010 | SCU_RAM_COMMAND_CMD_DEMOD_STOP; 10011 scu_cmd.parameter_len = 0; 10012 scu_cmd.result_len = 1; 10013 scu_cmd.result = cmd_result; 10014 rc = scu_command(dev_addr, &scu_cmd); 10015 if (rc != 0) { 10016 pr_err("error %d\n", rc); 10017 goto rw_error; 10018 } 10019 /********/ 10020 /* Reset */ 10021 /********/ 10022 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB 10023 | SCU_RAM_COMMAND_CMD_DEMOD_RESET; 10024 scu_cmd.parameter_len = 0; 10025 scu_cmd.result_len = 1; 10026 scu_cmd.result = cmd_result; 10027 rc = scu_command(dev_addr, &scu_cmd); 10028 if (rc != 0) { 10029 pr_err("error %d\n", rc); 10030 goto rw_error; 10031 } 10032 /**********/ 10033 /* SET_ENV */ 10034 /**********/ 10035 /* set frequency, spectrum inversion and data rate */ 10036 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB 10037 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV; 10038 scu_cmd.parameter_len = 3; 10039 /* 1-data rate;2-frequency */ 10040 switch (oob_param->standard) { 10041 case DRX_OOB_MODE_A: 10042 if ( 10043 /* signal is transmitted inverted */ 10044 ((oob_param->spectrum_inverted == true) && 10045 /* and tuner is not mirroring the signal */ 10046 (!mirror_freq_spect_oob)) | 10047 /* or */ 10048 /* signal is transmitted noninverted */ 10049 ((oob_param->spectrum_inverted == false) && 10050 /* and tuner is mirroring the signal */ 10051 (mirror_freq_spect_oob)) 10052 ) 10053 set_param_parameters[0] = 10054 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_INVSPEC; 10055 else 10056 set_param_parameters[0] = 10057 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_REGSPEC; 10058 break; 10059 case DRX_OOB_MODE_B_GRADE_A: 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_1544KBPS_INVSPEC; 10073 else 10074 set_param_parameters[0] = 10075 SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_REGSPEC; 10076 break; 10077 case DRX_OOB_MODE_B_GRADE_B: 10078 default: 10079 if ( 10080 /* signal is transmitted inverted */ 10081 ((oob_param->spectrum_inverted == true) && 10082 /* and tuner is not mirroring the signal */ 10083 (!mirror_freq_spect_oob)) | 10084 /* or */ 10085 /* signal is transmitted noninverted */ 10086 ((oob_param->spectrum_inverted == false) && 10087 /* and tuner is mirroring the signal */ 10088 (mirror_freq_spect_oob)) 10089 ) 10090 set_param_parameters[0] = 10091 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_INVSPEC; 10092 else 10093 set_param_parameters[0] = 10094 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_REGSPEC; 10095 break; 10096 } 10097 set_param_parameters[1] = (u16) (freq & 0xFFFF); 10098 set_param_parameters[2] = trk_filter_value; 10099 scu_cmd.parameter = set_param_parameters; 10100 scu_cmd.result_len = 1; 10101 scu_cmd.result = cmd_result; 10102 mode_index = mode_val[(set_param_parameters[0] & 0xC0) >> 6]; 10103 rc = scu_command(dev_addr, &scu_cmd); 10104 if (rc != 0) { 10105 pr_err("error %d\n", rc); 10106 goto rw_error; 10107 } 10108 10109 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0); 10110 if (rc != 0) { 10111 pr_err("error %d\n", rc); 10112 goto rw_error; 10113 } /* Write magic word to enable pdr reg write */ 10114 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); 10115 if (rc != 0) { 10116 pr_err("error %d\n", rc); 10117 goto rw_error; 10118 } 10119 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); 10120 if (rc != 0) { 10121 pr_err("error %d\n", rc); 10122 goto rw_error; 10123 } 10124 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0); 10125 if (rc != 0) { 10126 pr_err("error %d\n", rc); 10127 goto rw_error; 10128 } /* Write magic word to disable pdr reg write */ 10129 10130 rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_COMM_KEY__A, 0, 0); 10131 if (rc != 0) { 10132 pr_err("error %d\n", rc); 10133 goto rw_error; 10134 } 10135 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_LEN_W__A, 16000, 0); 10136 if (rc != 0) { 10137 pr_err("error %d\n", rc); 10138 goto rw_error; 10139 } 10140 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_THR_W__A, 40, 0); 10141 if (rc != 0) { 10142 pr_err("error %d\n", rc); 10143 goto rw_error; 10144 } 10145 10146 /* ddc */ 10147 rc = drxj_dap_write_reg16(dev_addr, ORX_DDC_OFO_SET_W__A, ORX_DDC_OFO_SET_W__PRE, 0); 10148 if (rc != 0) { 10149 pr_err("error %d\n", rc); 10150 goto rw_error; 10151 } 10152 10153 /* nsu */ 10154 rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_LOPOW_W__A, ext_attr->oob_lo_pow, 0); 10155 if (rc != 0) { 10156 pr_err("error %d\n", rc); 10157 goto rw_error; 10158 } 10159 10160 /* initialization for target mode */ 10161 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TARGET_MODE__A, SCU_RAM_ORX_TARGET_MODE_2048KBPS_SQRT, 0); 10162 if (rc != 0) { 10163 pr_err("error %d\n", rc); 10164 goto rw_error; 10165 } 10166 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FREQ_GAIN_CORR__A, SCU_RAM_ORX_FREQ_GAIN_CORR_2048KBPS, 0); 10167 if (rc != 0) { 10168 pr_err("error %d\n", rc); 10169 goto rw_error; 10170 } 10171 10172 /* Reset bits for timing and freq. recovery */ 10173 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CPH__A, 0x0001, 0); 10174 if (rc != 0) { 10175 pr_err("error %d\n", rc); 10176 goto rw_error; 10177 } 10178 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CTI__A, 0x0002, 0); 10179 if (rc != 0) { 10180 pr_err("error %d\n", rc); 10181 goto rw_error; 10182 } 10183 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRN__A, 0x0004, 0); 10184 if (rc != 0) { 10185 pr_err("error %d\n", rc); 10186 goto rw_error; 10187 } 10188 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRP__A, 0x0008, 0); 10189 if (rc != 0) { 10190 pr_err("error %d\n", rc); 10191 goto rw_error; 10192 } 10193 10194 /* AGN_LOCK = {2048>>3, -2048, 8, -8, 0, 1}; */ 10195 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TH__A, 2048 >> 3, 0); 10196 if (rc != 0) { 10197 pr_err("error %d\n", rc); 10198 goto rw_error; 10199 } 10200 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TOTH__A, (u16)(-2048), 0); 10201 if (rc != 0) { 10202 pr_err("error %d\n", rc); 10203 goto rw_error; 10204 } 10205 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_ONLOCK_TTH__A, 8, 0); 10206 if (rc != 0) { 10207 pr_err("error %d\n", rc); 10208 goto rw_error; 10209 } 10210 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_UNLOCK_TTH__A, (u16)(-8), 0); 10211 if (rc != 0) { 10212 pr_err("error %d\n", rc); 10213 goto rw_error; 10214 } 10215 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_MASK__A, 1, 0); 10216 if (rc != 0) { 10217 pr_err("error %d\n", rc); 10218 goto rw_error; 10219 } 10220 10221 /* DGN_LOCK = {10, -2048, 8, -8, 0, 1<<1}; */ 10222 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TH__A, 10, 0); 10223 if (rc != 0) { 10224 pr_err("error %d\n", rc); 10225 goto rw_error; 10226 } 10227 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TOTH__A, (u16)(-2048), 0); 10228 if (rc != 0) { 10229 pr_err("error %d\n", rc); 10230 goto rw_error; 10231 } 10232 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_ONLOCK_TTH__A, 8, 0); 10233 if (rc != 0) { 10234 pr_err("error %d\n", rc); 10235 goto rw_error; 10236 } 10237 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_UNLOCK_TTH__A, (u16)(-8), 0); 10238 if (rc != 0) { 10239 pr_err("error %d\n", rc); 10240 goto rw_error; 10241 } 10242 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_MASK__A, 1 << 1, 0); 10243 if (rc != 0) { 10244 pr_err("error %d\n", rc); 10245 goto rw_error; 10246 } 10247 10248 /* FRQ_LOCK = {15,-2048, 8, -8, 0, 1<<2}; */ 10249 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TH__A, 17, 0); 10250 if (rc != 0) { 10251 pr_err("error %d\n", rc); 10252 goto rw_error; 10253 } 10254 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TOTH__A, (u16)(-2048), 0); 10255 if (rc != 0) { 10256 pr_err("error %d\n", rc); 10257 goto rw_error; 10258 } 10259 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_ONLOCK_TTH__A, 8, 0); 10260 if (rc != 0) { 10261 pr_err("error %d\n", rc); 10262 goto rw_error; 10263 } 10264 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_UNLOCK_TTH__A, (u16)(-8), 0); 10265 if (rc != 0) { 10266 pr_err("error %d\n", rc); 10267 goto rw_error; 10268 } 10269 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_MASK__A, 1 << 2, 0); 10270 if (rc != 0) { 10271 pr_err("error %d\n", rc); 10272 goto rw_error; 10273 } 10274 10275 /* PHA_LOCK = {5000, -2048, 8, -8, 0, 1<<3}; */ 10276 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TH__A, 3000, 0); 10277 if (rc != 0) { 10278 pr_err("error %d\n", rc); 10279 goto rw_error; 10280 } 10281 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TOTH__A, (u16)(-2048), 0); 10282 if (rc != 0) { 10283 pr_err("error %d\n", rc); 10284 goto rw_error; 10285 } 10286 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_ONLOCK_TTH__A, 8, 0); 10287 if (rc != 0) { 10288 pr_err("error %d\n", rc); 10289 goto rw_error; 10290 } 10291 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_UNLOCK_TTH__A, (u16)(-8), 0); 10292 if (rc != 0) { 10293 pr_err("error %d\n", rc); 10294 goto rw_error; 10295 } 10296 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_MASK__A, 1 << 3, 0); 10297 if (rc != 0) { 10298 pr_err("error %d\n", rc); 10299 goto rw_error; 10300 } 10301 10302 /* TIM_LOCK = {300, -2048, 8, -8, 0, 1<<4}; */ 10303 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TH__A, 400, 0); 10304 if (rc != 0) { 10305 pr_err("error %d\n", rc); 10306 goto rw_error; 10307 } 10308 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TOTH__A, (u16)(-2048), 0); 10309 if (rc != 0) { 10310 pr_err("error %d\n", rc); 10311 goto rw_error; 10312 } 10313 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_ONLOCK_TTH__A, 8, 0); 10314 if (rc != 0) { 10315 pr_err("error %d\n", rc); 10316 goto rw_error; 10317 } 10318 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_UNLOCK_TTH__A, (u16)(-8), 0); 10319 if (rc != 0) { 10320 pr_err("error %d\n", rc); 10321 goto rw_error; 10322 } 10323 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_MASK__A, 1 << 4, 0); 10324 if (rc != 0) { 10325 pr_err("error %d\n", rc); 10326 goto rw_error; 10327 } 10328 10329 /* EQU_LOCK = {20, -2048, 8, -8, 0, 1<<5}; */ 10330 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TH__A, 20, 0); 10331 if (rc != 0) { 10332 pr_err("error %d\n", rc); 10333 goto rw_error; 10334 } 10335 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TOTH__A, (u16)(-2048), 0); 10336 if (rc != 0) { 10337 pr_err("error %d\n", rc); 10338 goto rw_error; 10339 } 10340 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_ONLOCK_TTH__A, 4, 0); 10341 if (rc != 0) { 10342 pr_err("error %d\n", rc); 10343 goto rw_error; 10344 } 10345 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_UNLOCK_TTH__A, (u16)(-4), 0); 10346 if (rc != 0) { 10347 pr_err("error %d\n", rc); 10348 goto rw_error; 10349 } 10350 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_MASK__A, 1 << 5, 0); 10351 if (rc != 0) { 10352 pr_err("error %d\n", rc); 10353 goto rw_error; 10354 } 10355 10356 /* PRE-Filter coefficients (PFI) */ 10357 rc = drxdap_fasi_write_block(dev_addr, ORX_FWP_PFI_A_W__A, sizeof(pfi_coeffs[mode_index]), ((u8 *)pfi_coeffs[mode_index]), 0); 10358 if (rc != 0) { 10359 pr_err("error %d\n", rc); 10360 goto rw_error; 10361 } 10362 rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_MDE_W__A, mode_index, 0); 10363 if (rc != 0) { 10364 pr_err("error %d\n", rc); 10365 goto rw_error; 10366 } 10367 10368 /* NYQUIST-Filter coefficients (NYQ) */ 10369 for (i = 0; i < (NYQFILTERLEN + 1) / 2; i++) { 10370 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, i, 0); 10371 if (rc != 0) { 10372 pr_err("error %d\n", rc); 10373 goto rw_error; 10374 } 10375 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_COF_RW__A, nyquist_coeffs[mode_index][i], 0); 10376 if (rc != 0) { 10377 pr_err("error %d\n", rc); 10378 goto rw_error; 10379 } 10380 } 10381 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, 31, 0); 10382 if (rc != 0) { 10383 pr_err("error %d\n", rc); 10384 goto rw_error; 10385 } 10386 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_ACTIVE, 0); 10387 if (rc != 0) { 10388 pr_err("error %d\n", rc); 10389 goto rw_error; 10390 } 10391 /********/ 10392 /* Start */ 10393 /********/ 10394 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB 10395 | SCU_RAM_COMMAND_CMD_DEMOD_START; 10396 scu_cmd.parameter_len = 0; 10397 scu_cmd.result_len = 1; 10398 scu_cmd.result = cmd_result; 10399 rc = scu_command(dev_addr, &scu_cmd); 10400 if (rc != 0) { 10401 pr_err("error %d\n", rc); 10402 goto rw_error; 10403 } 10404 10405 rc = set_orx_nsu_aox(demod, true); 10406 if (rc != 0) { 10407 pr_err("error %d\n", rc); 10408 goto rw_error; 10409 } 10410 rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STHR_W__A, ext_attr->oob_pre_saw, 0); 10411 if (rc != 0) { 10412 pr_err("error %d\n", rc); 10413 goto rw_error; 10414 } 10415 10416 ext_attr->oob_power_on = true; 10417 10418 return 0; 10419 rw_error: 10420 return rc; 10421 } 10422 10423 /*============================================================================*/ 10424 /*== END OOB DATAPATH FUNCTIONS ==*/ 10425 /*============================================================================*/ 10426 10427 /*============================================================================= 10428 ===== MC command related functions ========================================== 10429 ===========================================================================*/ 10430 10431 /*============================================================================= 10432 ===== ctrl_set_channel() ========================================================== 10433 ===========================================================================*/ 10434 /* 10435 * \fn int ctrl_set_channel() 10436 * \brief Select a new transmission channel. 10437 * \param demod instance of demod. 10438 * \param channel Pointer to channel data. 10439 * \return int. 10440 * 10441 * In case the tuner module is not used and in case of NTSC/FM the pogrammer 10442 * must tune the tuner to the centre frequency of the NTSC/FM channel. 10443 * 10444 */ 10445 static int 10446 ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel) 10447 { 10448 int rc; 10449 s32 tuner_freq_offset = 0; 10450 struct drxj_data *ext_attr = NULL; 10451 struct i2c_device_addr *dev_addr = NULL; 10452 enum drx_standard standard = DRX_STANDARD_UNKNOWN; 10453 #ifndef DRXJ_VSB_ONLY 10454 u32 min_symbol_rate = 0; 10455 u32 max_symbol_rate = 0; 10456 int bandwidth_temp = 0; 10457 int bandwidth = 0; 10458 #endif 10459 /*== check arguments ======================================================*/ 10460 if ((demod == NULL) || (channel == NULL)) 10461 return -EINVAL; 10462 10463 dev_addr = demod->my_i2c_dev_addr; 10464 ext_attr = (struct drxj_data *) demod->my_ext_attr; 10465 standard = ext_attr->standard; 10466 10467 /* check valid standards */ 10468 switch (standard) { 10469 case DRX_STANDARD_8VSB: 10470 #ifndef DRXJ_VSB_ONLY 10471 case DRX_STANDARD_ITU_A: 10472 case DRX_STANDARD_ITU_B: 10473 case DRX_STANDARD_ITU_C: 10474 #endif /* DRXJ_VSB_ONLY */ 10475 break; 10476 case DRX_STANDARD_UNKNOWN: 10477 default: 10478 return -EINVAL; 10479 } 10480 10481 /* check bandwidth QAM annex B, NTSC and 8VSB */ 10482 if ((standard == DRX_STANDARD_ITU_B) || 10483 (standard == DRX_STANDARD_8VSB) || 10484 (standard == DRX_STANDARD_NTSC)) { 10485 switch (channel->bandwidth) { 10486 case DRX_BANDWIDTH_6MHZ: 10487 case DRX_BANDWIDTH_UNKNOWN: 10488 channel->bandwidth = DRX_BANDWIDTH_6MHZ; 10489 break; 10490 case DRX_BANDWIDTH_8MHZ: 10491 case DRX_BANDWIDTH_7MHZ: 10492 default: 10493 return -EINVAL; 10494 } 10495 } 10496 10497 /* For QAM annex A and annex C: 10498 -check symbolrate and constellation 10499 -derive bandwidth from symbolrate (input bandwidth is ignored) 10500 */ 10501 #ifndef DRXJ_VSB_ONLY 10502 if ((standard == DRX_STANDARD_ITU_A) || 10503 (standard == DRX_STANDARD_ITU_C)) { 10504 struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SAW }; 10505 int bw_rolloff_factor = 0; 10506 10507 bw_rolloff_factor = (standard == DRX_STANDARD_ITU_A) ? 115 : 113; 10508 min_symbol_rate = DRXJ_QAM_SYMBOLRATE_MIN; 10509 max_symbol_rate = DRXJ_QAM_SYMBOLRATE_MAX; 10510 /* config SMA_TX pin to SAW switch mode */ 10511 rc = ctrl_set_uio_cfg(demod, &uio_cfg); 10512 if (rc != 0) { 10513 pr_err("error %d\n", rc); 10514 goto rw_error; 10515 } 10516 10517 if (channel->symbolrate < min_symbol_rate || 10518 channel->symbolrate > max_symbol_rate) { 10519 return -EINVAL; 10520 } 10521 10522 switch (channel->constellation) { 10523 case DRX_CONSTELLATION_QAM16: 10524 case DRX_CONSTELLATION_QAM32: 10525 case DRX_CONSTELLATION_QAM64: 10526 case DRX_CONSTELLATION_QAM128: 10527 case DRX_CONSTELLATION_QAM256: 10528 bandwidth_temp = channel->symbolrate * bw_rolloff_factor; 10529 bandwidth = bandwidth_temp / 100; 10530 10531 if ((bandwidth_temp % 100) >= 50) 10532 bandwidth++; 10533 10534 if (bandwidth <= 6100000) { 10535 channel->bandwidth = DRX_BANDWIDTH_6MHZ; 10536 } else if ((bandwidth > 6100000) 10537 && (bandwidth <= 7100000)) { 10538 channel->bandwidth = DRX_BANDWIDTH_7MHZ; 10539 } else if (bandwidth > 7100000) { 10540 channel->bandwidth = DRX_BANDWIDTH_8MHZ; 10541 } 10542 break; 10543 default: 10544 return -EINVAL; 10545 } 10546 } 10547 10548 /* For QAM annex B: 10549 -check constellation 10550 */ 10551 if (standard == DRX_STANDARD_ITU_B) { 10552 switch (channel->constellation) { 10553 case DRX_CONSTELLATION_AUTO: 10554 case DRX_CONSTELLATION_QAM256: 10555 case DRX_CONSTELLATION_QAM64: 10556 break; 10557 default: 10558 return -EINVAL; 10559 } 10560 10561 switch (channel->interleavemode) { 10562 case DRX_INTERLEAVEMODE_I128_J1: 10563 case DRX_INTERLEAVEMODE_I128_J1_V2: 10564 case DRX_INTERLEAVEMODE_I128_J2: 10565 case DRX_INTERLEAVEMODE_I64_J2: 10566 case DRX_INTERLEAVEMODE_I128_J3: 10567 case DRX_INTERLEAVEMODE_I32_J4: 10568 case DRX_INTERLEAVEMODE_I128_J4: 10569 case DRX_INTERLEAVEMODE_I16_J8: 10570 case DRX_INTERLEAVEMODE_I128_J5: 10571 case DRX_INTERLEAVEMODE_I8_J16: 10572 case DRX_INTERLEAVEMODE_I128_J6: 10573 case DRX_INTERLEAVEMODE_I128_J7: 10574 case DRX_INTERLEAVEMODE_I128_J8: 10575 case DRX_INTERLEAVEMODE_I12_J17: 10576 case DRX_INTERLEAVEMODE_I5_J4: 10577 case DRX_INTERLEAVEMODE_B52_M240: 10578 case DRX_INTERLEAVEMODE_B52_M720: 10579 case DRX_INTERLEAVEMODE_UNKNOWN: 10580 case DRX_INTERLEAVEMODE_AUTO: 10581 break; 10582 default: 10583 return -EINVAL; 10584 } 10585 } 10586 10587 if ((ext_attr->uio_sma_tx_mode) == DRX_UIO_MODE_FIRMWARE_SAW) { 10588 /* SAW SW, user UIO is used for switchable SAW */ 10589 struct drxuio_data uio1 = { DRX_UIO1, false }; 10590 10591 switch (channel->bandwidth) { 10592 case DRX_BANDWIDTH_8MHZ: 10593 uio1.value = true; 10594 break; 10595 case DRX_BANDWIDTH_7MHZ: 10596 uio1.value = false; 10597 break; 10598 case DRX_BANDWIDTH_6MHZ: 10599 uio1.value = false; 10600 break; 10601 case DRX_BANDWIDTH_UNKNOWN: 10602 default: 10603 return -EINVAL; 10604 } 10605 10606 rc = ctrl_uio_write(demod, &uio1); 10607 if (rc != 0) { 10608 pr_err("error %d\n", rc); 10609 goto rw_error; 10610 } 10611 } 10612 #endif /* DRXJ_VSB_ONLY */ 10613 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0); 10614 if (rc != 0) { 10615 pr_err("error %d\n", rc); 10616 goto rw_error; 10617 } 10618 10619 tuner_freq_offset = 0; 10620 10621 /*== Setup demod for specific standard ====================================*/ 10622 switch (standard) { 10623 case DRX_STANDARD_8VSB: 10624 if (channel->mirror == DRX_MIRROR_AUTO) 10625 ext_attr->mirror = DRX_MIRROR_NO; 10626 else 10627 ext_attr->mirror = channel->mirror; 10628 rc = set_vsb(demod); 10629 if (rc != 0) { 10630 pr_err("error %d\n", rc); 10631 goto rw_error; 10632 } 10633 rc = set_frequency(demod, channel, tuner_freq_offset); 10634 if (rc != 0) { 10635 pr_err("error %d\n", rc); 10636 goto rw_error; 10637 } 10638 break; 10639 #ifndef DRXJ_VSB_ONLY 10640 case DRX_STANDARD_ITU_A: 10641 case DRX_STANDARD_ITU_B: 10642 case DRX_STANDARD_ITU_C: 10643 rc = set_qam_channel(demod, channel, tuner_freq_offset); 10644 if (rc != 0) { 10645 pr_err("error %d\n", rc); 10646 goto rw_error; 10647 } 10648 break; 10649 #endif 10650 case DRX_STANDARD_UNKNOWN: 10651 default: 10652 return -EIO; 10653 } 10654 10655 /* flag the packet error counter reset */ 10656 ext_attr->reset_pkt_err_acc = true; 10657 10658 return 0; 10659 rw_error: 10660 return rc; 10661 } 10662 10663 /*============================================================================= 10664 ===== SigQuality() ========================================================== 10665 ===========================================================================*/ 10666 10667 /* 10668 * \fn int ctrl_sig_quality() 10669 * \brief Retrieve signal quality form device. 10670 * \param devmod Pointer to demodulator instance. 10671 * \param sig_quality Pointer to signal quality data. 10672 * \return int. 10673 * \retval 0 sig_quality contains valid data. 10674 * \retval -EINVAL sig_quality is NULL. 10675 * \retval -EIO Erroneous data, sig_quality contains invalid data. 10676 10677 */ 10678 static int 10679 ctrl_sig_quality(struct drx_demod_instance *demod, 10680 enum drx_lock_status lock_status) 10681 { 10682 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 10683 struct drxj_data *ext_attr = demod->my_ext_attr; 10684 struct drx39xxj_state *state = dev_addr->user_data; 10685 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache; 10686 enum drx_standard standard = ext_attr->standard; 10687 int rc; 10688 u32 ber, cnt, err, pkt; 10689 u16 mer, strength = 0; 10690 10691 rc = get_sig_strength(demod, &strength); 10692 if (rc < 0) { 10693 pr_err("error getting signal strength %d\n", rc); 10694 p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10695 } else { 10696 p->strength.stat[0].scale = FE_SCALE_RELATIVE; 10697 p->strength.stat[0].uvalue = 65535UL * strength/ 100; 10698 } 10699 10700 switch (standard) { 10701 case DRX_STANDARD_8VSB: 10702 #ifdef DRXJ_SIGNAL_ACCUM_ERR 10703 rc = get_acc_pkt_err(demod, &pkt); 10704 if (rc != 0) { 10705 pr_err("error %d\n", rc); 10706 goto rw_error; 10707 } 10708 #endif 10709 if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) { 10710 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10711 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10712 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10713 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10714 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10715 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10716 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10717 } else { 10718 rc = get_vsb_post_rs_pck_err(dev_addr, &err, &pkt); 10719 if (rc != 0) { 10720 pr_err("error %d getting UCB\n", rc); 10721 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10722 } else { 10723 p->block_error.stat[0].scale = FE_SCALE_COUNTER; 10724 p->block_error.stat[0].uvalue += err; 10725 p->block_count.stat[0].scale = FE_SCALE_COUNTER; 10726 p->block_count.stat[0].uvalue += pkt; 10727 } 10728 10729 /* PostViterbi is compute in steps of 10^(-6) */ 10730 rc = get_vs_bpre_viterbi_ber(dev_addr, &ber, &cnt); 10731 if (rc != 0) { 10732 pr_err("error %d getting pre-ber\n", rc); 10733 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10734 } else { 10735 p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER; 10736 p->pre_bit_error.stat[0].uvalue += ber; 10737 p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER; 10738 p->pre_bit_count.stat[0].uvalue += cnt; 10739 } 10740 10741 rc = get_vs_bpost_viterbi_ber(dev_addr, &ber, &cnt); 10742 if (rc != 0) { 10743 pr_err("error %d getting post-ber\n", rc); 10744 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10745 } else { 10746 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; 10747 p->post_bit_error.stat[0].uvalue += ber; 10748 p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; 10749 p->post_bit_count.stat[0].uvalue += cnt; 10750 } 10751 rc = get_vsbmer(dev_addr, &mer); 10752 if (rc != 0) { 10753 pr_err("error %d getting MER\n", rc); 10754 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 10755 } else { 10756 p->cnr.stat[0].svalue = mer * 100; 10757 p->cnr.stat[0].scale = FE_SCALE_DECIBEL; 10758 } 10759 } 10760 break; 10761 #ifndef DRXJ_VSB_ONLY 10762 case DRX_STANDARD_ITU_A: 10763 case DRX_STANDARD_ITU_B: 10764 case DRX_STANDARD_ITU_C: 10765 rc = ctrl_get_qam_sig_quality(demod); 10766 if (rc != 0) { 10767 pr_err("error %d\n", rc); 10768 goto rw_error; 10769 } 10770 break; 10771 #endif 10772 default: 10773 return -EIO; 10774 } 10775 10776 return 0; 10777 rw_error: 10778 return rc; 10779 } 10780 10781 /*============================================================================*/ 10782 10783 /* 10784 * \fn int ctrl_lock_status() 10785 * \brief Retrieve lock status . 10786 * \param dev_addr Pointer to demodulator device address. 10787 * \param lock_stat Pointer to lock status structure. 10788 * \return int. 10789 * 10790 */ 10791 static int 10792 ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat) 10793 { 10794 enum drx_standard standard = DRX_STANDARD_UNKNOWN; 10795 struct drxj_data *ext_attr = NULL; 10796 struct i2c_device_addr *dev_addr = NULL; 10797 struct drxjscu_cmd cmd_scu = { /* command */ 0, 10798 /* parameter_len */ 0, 10799 /* result_len */ 0, 10800 /* *parameter */ NULL, 10801 /* *result */ NULL 10802 }; 10803 int rc; 10804 u16 cmd_result[2] = { 0, 0 }; 10805 u16 demod_lock = SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_DEMOD_LOCKED; 10806 10807 /* check arguments */ 10808 if ((demod == NULL) || (lock_stat == NULL)) 10809 return -EINVAL; 10810 10811 dev_addr = demod->my_i2c_dev_addr; 10812 ext_attr = (struct drxj_data *) demod->my_ext_attr; 10813 standard = ext_attr->standard; 10814 10815 *lock_stat = DRX_NOT_LOCKED; 10816 10817 /* define the SCU command code */ 10818 switch (standard) { 10819 case DRX_STANDARD_8VSB: 10820 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB | 10821 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK; 10822 demod_lock |= 0x6; 10823 break; 10824 #ifndef DRXJ_VSB_ONLY 10825 case DRX_STANDARD_ITU_A: 10826 case DRX_STANDARD_ITU_B: 10827 case DRX_STANDARD_ITU_C: 10828 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM | 10829 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK; 10830 break; 10831 #endif 10832 case DRX_STANDARD_UNKNOWN: 10833 default: 10834 return -EIO; 10835 } 10836 10837 /* define the SCU command parameters and execute the command */ 10838 cmd_scu.parameter_len = 0; 10839 cmd_scu.result_len = 2; 10840 cmd_scu.parameter = NULL; 10841 cmd_scu.result = cmd_result; 10842 rc = scu_command(dev_addr, &cmd_scu); 10843 if (rc != 0) { 10844 pr_err("error %d\n", rc); 10845 goto rw_error; 10846 } 10847 10848 /* set the lock status */ 10849 if (cmd_scu.result[1] < demod_lock) { 10850 /* 0x0000 NOT LOCKED */ 10851 *lock_stat = DRX_NOT_LOCKED; 10852 } else if (cmd_scu.result[1] < SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_LOCKED) { 10853 *lock_stat = DRXJ_DEMOD_LOCK; 10854 } else if (cmd_scu.result[1] < 10855 SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_NEVER_LOCK) { 10856 /* 0x8000 DEMOD + FEC LOCKED (system lock) */ 10857 *lock_stat = DRX_LOCKED; 10858 } else { 10859 /* 0xC000 NEVER LOCKED */ 10860 /* (system will never be able to lock to the signal) */ 10861 *lock_stat = DRX_NEVER_LOCK; 10862 } 10863 10864 return 0; 10865 rw_error: 10866 return rc; 10867 } 10868 10869 /*============================================================================*/ 10870 10871 /* 10872 * \fn int ctrl_set_standard() 10873 * \brief Set modulation standard to be used. 10874 * \param standard Modulation standard. 10875 * \return int. 10876 * 10877 * Setup stuff for the desired demodulation standard. 10878 * Disable and power down the previous selected demodulation standard 10879 * 10880 */ 10881 static int 10882 ctrl_set_standard(struct drx_demod_instance *demod, enum drx_standard *standard) 10883 { 10884 struct drxj_data *ext_attr = NULL; 10885 int rc; 10886 enum drx_standard prev_standard; 10887 10888 /* check arguments */ 10889 if ((standard == NULL) || (demod == NULL)) 10890 return -EINVAL; 10891 10892 ext_attr = (struct drxj_data *) demod->my_ext_attr; 10893 prev_standard = ext_attr->standard; 10894 10895 /* 10896 Stop and power down previous standard 10897 */ 10898 switch (prev_standard) { 10899 #ifndef DRXJ_VSB_ONLY 10900 case DRX_STANDARD_ITU_A: 10901 case DRX_STANDARD_ITU_B: 10902 case DRX_STANDARD_ITU_C: 10903 rc = power_down_qam(demod, false); 10904 if (rc != 0) { 10905 pr_err("error %d\n", rc); 10906 goto rw_error; 10907 } 10908 break; 10909 #endif 10910 case DRX_STANDARD_8VSB: 10911 rc = power_down_vsb(demod, false); 10912 if (rc != 0) { 10913 pr_err("error %d\n", rc); 10914 goto rw_error; 10915 } 10916 break; 10917 case DRX_STANDARD_UNKNOWN: 10918 /* Do nothing */ 10919 break; 10920 case DRX_STANDARD_AUTO: 10921 default: 10922 return -EINVAL; 10923 } 10924 10925 /* 10926 Initialize channel independent registers 10927 Power up new standard 10928 */ 10929 ext_attr->standard = *standard; 10930 10931 switch (*standard) { 10932 #ifndef DRXJ_VSB_ONLY 10933 case DRX_STANDARD_ITU_A: 10934 case DRX_STANDARD_ITU_B: 10935 case DRX_STANDARD_ITU_C: 10936 do { 10937 u16 dummy; 10938 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SCU_RAM_VERSION_HI__A, &dummy, 0); 10939 if (rc != 0) { 10940 pr_err("error %d\n", rc); 10941 goto rw_error; 10942 } 10943 } while (0); 10944 break; 10945 #endif 10946 case DRX_STANDARD_8VSB: 10947 rc = set_vsb_leak_n_gain(demod); 10948 if (rc != 0) { 10949 pr_err("error %d\n", rc); 10950 goto rw_error; 10951 } 10952 break; 10953 default: 10954 ext_attr->standard = DRX_STANDARD_UNKNOWN; 10955 return -EINVAL; 10956 break; 10957 } 10958 10959 return 0; 10960 rw_error: 10961 /* Don't know what the standard is now ... try again */ 10962 ext_attr->standard = DRX_STANDARD_UNKNOWN; 10963 return rc; 10964 } 10965 10966 /*============================================================================*/ 10967 10968 static void drxj_reset_mode(struct drxj_data *ext_attr) 10969 { 10970 /* Initialize default AFE configuration for QAM */ 10971 if (ext_attr->has_lna) { 10972 /* IF AGC off, PGA active */ 10973 #ifndef DRXJ_VSB_ONLY 10974 ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B; 10975 ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF; 10976 ext_attr->qam_pga_cfg = 140 + (11 * 13); 10977 #endif 10978 ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB; 10979 ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF; 10980 ext_attr->vsb_pga_cfg = 140 + (11 * 13); 10981 } else { 10982 /* IF AGC on, PGA not active */ 10983 #ifndef DRXJ_VSB_ONLY 10984 ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B; 10985 ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO; 10986 ext_attr->qam_if_agc_cfg.min_output_level = 0; 10987 ext_attr->qam_if_agc_cfg.max_output_level = 0x7FFF; 10988 ext_attr->qam_if_agc_cfg.speed = 3; 10989 ext_attr->qam_if_agc_cfg.top = 1297; 10990 ext_attr->qam_pga_cfg = 140; 10991 #endif 10992 ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB; 10993 ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO; 10994 ext_attr->vsb_if_agc_cfg.min_output_level = 0; 10995 ext_attr->vsb_if_agc_cfg.max_output_level = 0x7FFF; 10996 ext_attr->vsb_if_agc_cfg.speed = 3; 10997 ext_attr->vsb_if_agc_cfg.top = 1024; 10998 ext_attr->vsb_pga_cfg = 140; 10999 } 11000 /* TODO: remove min_output_level and max_output_level for both QAM and VSB after */ 11001 /* mc has not used them */ 11002 #ifndef DRXJ_VSB_ONLY 11003 ext_attr->qam_rf_agc_cfg.standard = DRX_STANDARD_ITU_B; 11004 ext_attr->qam_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO; 11005 ext_attr->qam_rf_agc_cfg.min_output_level = 0; 11006 ext_attr->qam_rf_agc_cfg.max_output_level = 0x7FFF; 11007 ext_attr->qam_rf_agc_cfg.speed = 3; 11008 ext_attr->qam_rf_agc_cfg.top = 9500; 11009 ext_attr->qam_rf_agc_cfg.cut_off_current = 4000; 11010 ext_attr->qam_pre_saw_cfg.standard = DRX_STANDARD_ITU_B; 11011 ext_attr->qam_pre_saw_cfg.reference = 0x07; 11012 ext_attr->qam_pre_saw_cfg.use_pre_saw = true; 11013 #endif 11014 /* Initialize default AFE configuration for VSB */ 11015 ext_attr->vsb_rf_agc_cfg.standard = DRX_STANDARD_8VSB; 11016 ext_attr->vsb_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO; 11017 ext_attr->vsb_rf_agc_cfg.min_output_level = 0; 11018 ext_attr->vsb_rf_agc_cfg.max_output_level = 0x7FFF; 11019 ext_attr->vsb_rf_agc_cfg.speed = 3; 11020 ext_attr->vsb_rf_agc_cfg.top = 9500; 11021 ext_attr->vsb_rf_agc_cfg.cut_off_current = 4000; 11022 ext_attr->vsb_pre_saw_cfg.standard = DRX_STANDARD_8VSB; 11023 ext_attr->vsb_pre_saw_cfg.reference = 0x07; 11024 ext_attr->vsb_pre_saw_cfg.use_pre_saw = true; 11025 } 11026 11027 /* 11028 * \fn int ctrl_power_mode() 11029 * \brief Set the power mode of the device to the specified power mode 11030 * \param demod Pointer to demodulator instance. 11031 * \param mode Pointer to new power mode. 11032 * \return int. 11033 * \retval 0 Success 11034 * \retval -EIO I2C error or other failure 11035 * \retval -EINVAL Invalid mode argument. 11036 * 11037 * 11038 */ 11039 static int 11040 ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode) 11041 { 11042 struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL; 11043 struct drxj_data *ext_attr = (struct drxj_data *) NULL; 11044 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)NULL; 11045 int rc; 11046 u16 sio_cc_pwd_mode = 0; 11047 11048 common_attr = (struct drx_common_attr *) demod->my_common_attr; 11049 ext_attr = (struct drxj_data *) demod->my_ext_attr; 11050 dev_addr = demod->my_i2c_dev_addr; 11051 11052 /* Check arguments */ 11053 if (mode == NULL) 11054 return -EINVAL; 11055 11056 /* If already in requested power mode, do nothing */ 11057 if (common_attr->current_power_mode == *mode) 11058 return 0; 11059 11060 switch (*mode) { 11061 case DRX_POWER_UP: 11062 case DRXJ_POWER_DOWN_MAIN_PATH: 11063 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE; 11064 break; 11065 case DRXJ_POWER_DOWN_CORE: 11066 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK; 11067 break; 11068 case DRXJ_POWER_DOWN_PLL: 11069 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL; 11070 break; 11071 case DRX_POWER_DOWN: 11072 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC; 11073 break; 11074 default: 11075 /* Unknow sleep mode */ 11076 return -EINVAL; 11077 break; 11078 } 11079 11080 /* Check if device needs to be powered up */ 11081 if ((common_attr->current_power_mode != DRX_POWER_UP)) { 11082 rc = power_up_device(demod); 11083 if (rc != 0) { 11084 pr_err("error %d\n", rc); 11085 goto rw_error; 11086 } 11087 } 11088 11089 if (*mode == DRX_POWER_UP) { 11090 /* Restore analog & pin configuration */ 11091 11092 /* Initialize default AFE configuration for VSB */ 11093 drxj_reset_mode(ext_attr); 11094 } else { 11095 /* Power down to requested mode */ 11096 /* Backup some register settings */ 11097 /* Set pins with possible pull-ups connected to them in input mode */ 11098 /* Analog power down */ 11099 /* ADC power down */ 11100 /* Power down device */ 11101 /* stop all comm_exec */ 11102 /* 11103 Stop and power down previous standard 11104 */ 11105 11106 switch (ext_attr->standard) { 11107 case DRX_STANDARD_ITU_A: 11108 case DRX_STANDARD_ITU_B: 11109 case DRX_STANDARD_ITU_C: 11110 rc = power_down_qam(demod, true); 11111 if (rc != 0) { 11112 pr_err("error %d\n", rc); 11113 goto rw_error; 11114 } 11115 break; 11116 case DRX_STANDARD_8VSB: 11117 rc = power_down_vsb(demod, true); 11118 if (rc != 0) { 11119 pr_err("error %d\n", rc); 11120 goto rw_error; 11121 } 11122 break; 11123 case DRX_STANDARD_PAL_SECAM_BG: 11124 case DRX_STANDARD_PAL_SECAM_DK: 11125 case DRX_STANDARD_PAL_SECAM_I: 11126 case DRX_STANDARD_PAL_SECAM_L: 11127 case DRX_STANDARD_PAL_SECAM_LP: 11128 case DRX_STANDARD_NTSC: 11129 case DRX_STANDARD_FM: 11130 rc = power_down_atv(demod, ext_attr->standard, true); 11131 if (rc != 0) { 11132 pr_err("error %d\n", rc); 11133 goto rw_error; 11134 } 11135 break; 11136 case DRX_STANDARD_UNKNOWN: 11137 /* Do nothing */ 11138 break; 11139 case DRX_STANDARD_AUTO: 11140 default: 11141 return -EIO; 11142 } 11143 ext_attr->standard = DRX_STANDARD_UNKNOWN; 11144 } 11145 11146 if (*mode != DRXJ_POWER_DOWN_MAIN_PATH) { 11147 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode, 0); 11148 if (rc != 0) { 11149 pr_err("error %d\n", rc); 11150 goto rw_error; 11151 } 11152 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0); 11153 if (rc != 0) { 11154 pr_err("error %d\n", rc); 11155 goto rw_error; 11156 } 11157 11158 if ((*mode != DRX_POWER_UP)) { 11159 /* Initialize HI, wakeup key especially before put IC to sleep */ 11160 rc = init_hi(demod); 11161 if (rc != 0) { 11162 pr_err("error %d\n", rc); 11163 goto rw_error; 11164 } 11165 11166 ext_attr->hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ; 11167 rc = hi_cfg_command(demod); 11168 if (rc != 0) { 11169 pr_err("error %d\n", rc); 11170 goto rw_error; 11171 } 11172 } 11173 } 11174 11175 common_attr->current_power_mode = *mode; 11176 11177 return 0; 11178 rw_error: 11179 return rc; 11180 } 11181 11182 /*============================================================================*/ 11183 /*== CTRL Set/Get Config related functions ===================================*/ 11184 /*============================================================================*/ 11185 11186 /* 11187 * \fn int ctrl_set_cfg_pre_saw() 11188 * \brief Set Pre-saw reference. 11189 * \param demod demod instance 11190 * \param u16 * 11191 * \return int. 11192 * 11193 * Check arguments 11194 * Dispatch handling to standard specific function. 11195 * 11196 */ 11197 static int 11198 ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw) 11199 { 11200 struct i2c_device_addr *dev_addr = NULL; 11201 struct drxj_data *ext_attr = NULL; 11202 int rc; 11203 11204 dev_addr = demod->my_i2c_dev_addr; 11205 ext_attr = (struct drxj_data *) demod->my_ext_attr; 11206 11207 /* check arguments */ 11208 if ((pre_saw == NULL) || (pre_saw->reference > IQM_AF_PDREF__M) 11209 ) { 11210 return -EINVAL; 11211 } 11212 11213 /* Only if standard is currently active */ 11214 if ((ext_attr->standard == pre_saw->standard) || 11215 (DRXJ_ISQAMSTD(ext_attr->standard) && 11216 DRXJ_ISQAMSTD(pre_saw->standard)) || 11217 (DRXJ_ISATVSTD(ext_attr->standard) && 11218 DRXJ_ISATVSTD(pre_saw->standard))) { 11219 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, pre_saw->reference, 0); 11220 if (rc != 0) { 11221 pr_err("error %d\n", rc); 11222 goto rw_error; 11223 } 11224 } 11225 11226 /* Store pre-saw settings */ 11227 switch (pre_saw->standard) { 11228 case DRX_STANDARD_8VSB: 11229 ext_attr->vsb_pre_saw_cfg = *pre_saw; 11230 break; 11231 #ifndef DRXJ_VSB_ONLY 11232 case DRX_STANDARD_ITU_A: 11233 case DRX_STANDARD_ITU_B: 11234 case DRX_STANDARD_ITU_C: 11235 ext_attr->qam_pre_saw_cfg = *pre_saw; 11236 break; 11237 #endif 11238 default: 11239 return -EINVAL; 11240 } 11241 11242 return 0; 11243 rw_error: 11244 return rc; 11245 } 11246 11247 /*============================================================================*/ 11248 11249 /* 11250 * \fn int ctrl_set_cfg_afe_gain() 11251 * \brief Set AFE Gain. 11252 * \param demod demod instance 11253 * \param u16 * 11254 * \return int. 11255 * 11256 * Check arguments 11257 * Dispatch handling to standard specific function. 11258 * 11259 */ 11260 static int 11261 ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain) 11262 { 11263 struct i2c_device_addr *dev_addr = NULL; 11264 struct drxj_data *ext_attr = NULL; 11265 int rc; 11266 u8 gain = 0; 11267 11268 /* check arguments */ 11269 if (afe_gain == NULL) 11270 return -EINVAL; 11271 11272 dev_addr = demod->my_i2c_dev_addr; 11273 ext_attr = (struct drxj_data *) demod->my_ext_attr; 11274 11275 switch (afe_gain->standard) { 11276 case DRX_STANDARD_8VSB: fallthrough; 11277 #ifndef DRXJ_VSB_ONLY 11278 case DRX_STANDARD_ITU_A: 11279 case DRX_STANDARD_ITU_B: 11280 case DRX_STANDARD_ITU_C: 11281 #endif 11282 /* Do nothing */ 11283 break; 11284 default: 11285 return -EINVAL; 11286 } 11287 11288 /* TODO PGA gain is also written by microcode (at least by QAM and VSB) 11289 So I (PJ) think interface requires choice between auto, user mode */ 11290 11291 if (afe_gain->gain >= 329) 11292 gain = 15; 11293 else if (afe_gain->gain <= 147) 11294 gain = 0; 11295 else 11296 gain = (afe_gain->gain - 140 + 6) / 13; 11297 11298 /* Only if standard is currently active */ 11299 if (ext_attr->standard == afe_gain->standard) { 11300 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, gain, 0); 11301 if (rc != 0) { 11302 pr_err("error %d\n", rc); 11303 goto rw_error; 11304 } 11305 } 11306 11307 /* Store AFE Gain settings */ 11308 switch (afe_gain->standard) { 11309 case DRX_STANDARD_8VSB: 11310 ext_attr->vsb_pga_cfg = gain * 13 + 140; 11311 break; 11312 #ifndef DRXJ_VSB_ONLY 11313 case DRX_STANDARD_ITU_A: 11314 case DRX_STANDARD_ITU_B: 11315 case DRX_STANDARD_ITU_C: 11316 ext_attr->qam_pga_cfg = gain * 13 + 140; 11317 break; 11318 #endif 11319 default: 11320 return -EIO; 11321 } 11322 11323 return 0; 11324 rw_error: 11325 return rc; 11326 } 11327 11328 /*============================================================================*/ 11329 11330 11331 /*============================================================================= 11332 ===== EXPORTED FUNCTIONS ====================================================*/ 11333 11334 static int drx_ctrl_u_code(struct drx_demod_instance *demod, 11335 struct drxu_code_info *mc_info, 11336 enum drxu_code_action action); 11337 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state); 11338 11339 /* 11340 * \fn drxj_open() 11341 * \brief Open the demod instance, configure device, configure drxdriver 11342 * \return Status_t Return status. 11343 * 11344 * drxj_open() can be called with a NULL ucode image => no ucode upload. 11345 * This means that drxj_open() must NOT contain SCU commands or, in general, 11346 * rely on SCU or AUD ucode to be present. 11347 * 11348 */ 11349 11350 static int drxj_open(struct drx_demod_instance *demod) 11351 { 11352 struct i2c_device_addr *dev_addr = NULL; 11353 struct drxj_data *ext_attr = NULL; 11354 struct drx_common_attr *common_attr = NULL; 11355 u32 driver_version = 0; 11356 struct drxu_code_info ucode_info; 11357 struct drx_cfg_mpeg_output cfg_mpeg_output; 11358 int rc; 11359 enum drx_power_mode power_mode = DRX_POWER_UP; 11360 11361 if ((demod == NULL) || 11362 (demod->my_common_attr == NULL) || 11363 (demod->my_ext_attr == NULL) || 11364 (demod->my_i2c_dev_addr == NULL) || 11365 (demod->my_common_attr->is_opened)) { 11366 return -EINVAL; 11367 } 11368 11369 /* Check arguments */ 11370 if (demod->my_ext_attr == NULL) 11371 return -EINVAL; 11372 11373 dev_addr = demod->my_i2c_dev_addr; 11374 ext_attr = (struct drxj_data *) demod->my_ext_attr; 11375 common_attr = (struct drx_common_attr *) demod->my_common_attr; 11376 11377 rc = ctrl_power_mode(demod, &power_mode); 11378 if (rc != 0) { 11379 pr_err("error %d\n", rc); 11380 goto rw_error; 11381 } 11382 if (power_mode != DRX_POWER_UP) { 11383 rc = -EINVAL; 11384 pr_err("failed to powerup device\n"); 11385 goto rw_error; 11386 } 11387 11388 /* has to be in front of setIqmAf and setOrxNsuAox */ 11389 rc = get_device_capabilities(demod); 11390 if (rc != 0) { 11391 pr_err("error %d\n", rc); 11392 goto rw_error; 11393 } 11394 11395 /* 11396 * Soft reset of sys- and osc-clockdomain 11397 * 11398 * HACK: On windows, it writes a 0x07 here, instead of just 0x03. 11399 * As we didn't load the firmware here yet, we should do the same. 11400 * Btw, this is coherent with DRX-K, where we send reset codes 11401 * for modulation (OFTM, in DRX-k), SYS and OSC clock domains. 11402 */ 11403 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); 11404 if (rc != 0) { 11405 pr_err("error %d\n", rc); 11406 goto rw_error; 11407 } 11408 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0); 11409 if (rc != 0) { 11410 pr_err("error %d\n", rc); 11411 goto rw_error; 11412 } 11413 msleep(1); 11414 11415 /* TODO first make sure that everything keeps working before enabling this */ 11416 /* PowerDownAnalogBlocks() */ 11417 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); 11418 if (rc != 0) { 11419 pr_err("error %d\n", rc); 11420 goto rw_error; 11421 } 11422 11423 rc = set_iqm_af(demod, false); 11424 if (rc != 0) { 11425 pr_err("error %d\n", rc); 11426 goto rw_error; 11427 } 11428 rc = set_orx_nsu_aox(demod, false); 11429 if (rc != 0) { 11430 pr_err("error %d\n", rc); 11431 goto rw_error; 11432 } 11433 11434 rc = init_hi(demod); 11435 if (rc != 0) { 11436 pr_err("error %d\n", rc); 11437 goto rw_error; 11438 } 11439 11440 /* disable mpegoutput pins */ 11441 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output)); 11442 cfg_mpeg_output.enable_mpeg_output = false; 11443 11444 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output); 11445 if (rc != 0) { 11446 pr_err("error %d\n", rc); 11447 goto rw_error; 11448 } 11449 /* Stop AUD Inform SetAudio it will need to do all setting */ 11450 rc = power_down_aud(demod); 11451 if (rc != 0) { 11452 pr_err("error %d\n", rc); 11453 goto rw_error; 11454 } 11455 /* Stop SCU */ 11456 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP, 0); 11457 if (rc != 0) { 11458 pr_err("error %d\n", rc); 11459 goto rw_error; 11460 } 11461 11462 /* Upload microcode */ 11463 if (common_attr->microcode_file != NULL) { 11464 /* Dirty trick to use common ucode upload & verify, 11465 pretend device is already open */ 11466 common_attr->is_opened = true; 11467 ucode_info.mc_file = common_attr->microcode_file; 11468 11469 if (DRX_ISPOWERDOWNMODE(demod->my_common_attr->current_power_mode)) { 11470 pr_err("Should powerup before loading the firmware."); 11471 return -EINVAL; 11472 } 11473 11474 rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_UPLOAD); 11475 if (rc != 0) { 11476 pr_err("error %d while uploading the firmware\n", rc); 11477 goto rw_error; 11478 } 11479 if (common_attr->verify_microcode == true) { 11480 rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_VERIFY); 11481 if (rc != 0) { 11482 pr_err("error %d while verifying the firmware\n", 11483 rc); 11484 goto rw_error; 11485 } 11486 } 11487 common_attr->is_opened = false; 11488 } 11489 11490 /* Run SCU for a little while to initialize microcode version numbers */ 11491 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0); 11492 if (rc != 0) { 11493 pr_err("error %d\n", rc); 11494 goto rw_error; 11495 } 11496 11497 /* Initialize scan timeout */ 11498 common_attr->scan_demod_lock_timeout = DRXJ_SCAN_TIMEOUT; 11499 common_attr->scan_desired_lock = DRX_LOCKED; 11500 11501 drxj_reset_mode(ext_attr); 11502 ext_attr->standard = DRX_STANDARD_UNKNOWN; 11503 11504 rc = smart_ant_init(demod); 11505 if (rc != 0) { 11506 pr_err("error %d\n", rc); 11507 goto rw_error; 11508 } 11509 11510 /* Stamp driver version number in SCU data RAM in BCD code 11511 Done to enable field application engineers to retrieve drxdriver version 11512 via I2C from SCU RAM 11513 */ 11514 driver_version = (VERSION_MAJOR / 100) % 10; 11515 driver_version <<= 4; 11516 driver_version += (VERSION_MAJOR / 10) % 10; 11517 driver_version <<= 4; 11518 driver_version += (VERSION_MAJOR % 10); 11519 driver_version <<= 4; 11520 driver_version += (VERSION_MINOR % 10); 11521 driver_version <<= 4; 11522 driver_version += (VERSION_PATCH / 1000) % 10; 11523 driver_version <<= 4; 11524 driver_version += (VERSION_PATCH / 100) % 10; 11525 driver_version <<= 4; 11526 driver_version += (VERSION_PATCH / 10) % 10; 11527 driver_version <<= 4; 11528 driver_version += (VERSION_PATCH % 10); 11529 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_HI__A, (u16)(driver_version >> 16), 0); 11530 if (rc != 0) { 11531 pr_err("error %d\n", rc); 11532 goto rw_error; 11533 } 11534 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_LO__A, (u16)(driver_version & 0xFFFF), 0); 11535 if (rc != 0) { 11536 pr_err("error %d\n", rc); 11537 goto rw_error; 11538 } 11539 11540 rc = ctrl_set_oob(demod, NULL); 11541 if (rc != 0) { 11542 pr_err("error %d\n", rc); 11543 goto rw_error; 11544 } 11545 11546 /* refresh the audio data structure with default */ 11547 ext_attr->aud_data = drxj_default_aud_data_g; 11548 11549 demod->my_common_attr->is_opened = true; 11550 drxj_set_lna_state(demod, false); 11551 return 0; 11552 rw_error: 11553 common_attr->is_opened = false; 11554 return rc; 11555 } 11556 11557 /*============================================================================*/ 11558 /* 11559 * \fn drxj_close() 11560 * \brief Close the demod instance, power down the device 11561 * \return Status_t Return status. 11562 * 11563 */ 11564 static int drxj_close(struct drx_demod_instance *demod) 11565 { 11566 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 11567 int rc; 11568 enum drx_power_mode power_mode = DRX_POWER_UP; 11569 11570 if ((demod->my_common_attr == NULL) || 11571 (demod->my_ext_attr == NULL) || 11572 (demod->my_i2c_dev_addr == NULL) || 11573 (!demod->my_common_attr->is_opened)) { 11574 return -EINVAL; 11575 } 11576 11577 /* power up */ 11578 rc = ctrl_power_mode(demod, &power_mode); 11579 if (rc != 0) { 11580 pr_err("error %d\n", rc); 11581 goto rw_error; 11582 } 11583 11584 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0); 11585 if (rc != 0) { 11586 pr_err("error %d\n", rc); 11587 goto rw_error; 11588 } 11589 power_mode = DRX_POWER_DOWN; 11590 rc = ctrl_power_mode(demod, &power_mode); 11591 if (rc != 0) { 11592 pr_err("error %d\n", rc); 11593 goto rw_error; 11594 } 11595 11596 DRX_ATTR_ISOPENED(demod) = false; 11597 11598 return 0; 11599 rw_error: 11600 DRX_ATTR_ISOPENED(demod) = false; 11601 11602 return rc; 11603 } 11604 11605 /* 11606 * Microcode related functions 11607 */ 11608 11609 /* 11610 * drx_u_code_compute_crc - Compute CRC of block of microcode data. 11611 * @block_data: Pointer to microcode data. 11612 * @nr_words: Size of microcode block (number of 16 bits words). 11613 * 11614 * returns The computed CRC residue. 11615 */ 11616 static u16 drx_u_code_compute_crc(u8 *block_data, u16 nr_words) 11617 { 11618 u16 i = 0; 11619 u16 j = 0; 11620 u32 crc_word = 0; 11621 u32 carry = 0; 11622 11623 while (i < nr_words) { 11624 crc_word |= (u32)be16_to_cpu(*(__be16 *)(block_data)); 11625 for (j = 0; j < 16; j++) { 11626 crc_word <<= 1; 11627 if (carry != 0) 11628 crc_word ^= 0x80050000UL; 11629 carry = crc_word & 0x80000000UL; 11630 } 11631 i++; 11632 block_data += (sizeof(u16)); 11633 } 11634 return (u16)(crc_word >> 16); 11635 } 11636 11637 /* 11638 * drx_check_firmware - checks if the loaded firmware is valid 11639 * 11640 * @demod: demod structure 11641 * @mc_data: pointer to the start of the firmware 11642 * @size: firmware size 11643 */ 11644 static int drx_check_firmware(struct drx_demod_instance *demod, u8 *mc_data, 11645 unsigned size) 11646 { 11647 struct drxu_code_block_hdr block_hdr; 11648 int i; 11649 unsigned count = 2 * sizeof(u16); 11650 u32 mc_dev_type, mc_version, mc_base_version; 11651 u16 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data + sizeof(u16))); 11652 11653 /* 11654 * Scan microcode blocks first for version info 11655 * and firmware check 11656 */ 11657 11658 /* Clear version block */ 11659 DRX_ATTR_MCRECORD(demod).aux_type = 0; 11660 DRX_ATTR_MCRECORD(demod).mc_dev_type = 0; 11661 DRX_ATTR_MCRECORD(demod).mc_version = 0; 11662 DRX_ATTR_MCRECORD(demod).mc_base_version = 0; 11663 11664 for (i = 0; i < mc_nr_of_blks; i++) { 11665 if (count + 3 * sizeof(u16) + sizeof(u32) > size) 11666 goto eof; 11667 11668 /* Process block header */ 11669 block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data + count)); 11670 count += sizeof(u32); 11671 block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data + count)); 11672 count += sizeof(u16); 11673 block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data + count)); 11674 count += sizeof(u16); 11675 block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data + count)); 11676 count += sizeof(u16); 11677 11678 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n", 11679 count, block_hdr.addr, block_hdr.size, block_hdr.flags, 11680 block_hdr.CRC); 11681 11682 if (block_hdr.flags & 0x8) { 11683 u8 *auxblk = ((void *)mc_data) + block_hdr.addr; 11684 u16 auxtype; 11685 11686 if (block_hdr.addr + sizeof(u16) > size) 11687 goto eof; 11688 11689 auxtype = be16_to_cpu(*(__be16 *)(auxblk)); 11690 11691 /* Aux block. Check type */ 11692 if (DRX_ISMCVERTYPE(auxtype)) { 11693 if (block_hdr.addr + 2 * sizeof(u16) + 2 * sizeof (u32) > size) 11694 goto eof; 11695 11696 auxblk += sizeof(u16); 11697 mc_dev_type = be32_to_cpu(*(__be32 *)(auxblk)); 11698 auxblk += sizeof(u32); 11699 mc_version = be32_to_cpu(*(__be32 *)(auxblk)); 11700 auxblk += sizeof(u32); 11701 mc_base_version = be32_to_cpu(*(__be32 *)(auxblk)); 11702 11703 DRX_ATTR_MCRECORD(demod).aux_type = auxtype; 11704 DRX_ATTR_MCRECORD(demod).mc_dev_type = mc_dev_type; 11705 DRX_ATTR_MCRECORD(demod).mc_version = mc_version; 11706 DRX_ATTR_MCRECORD(demod).mc_base_version = mc_base_version; 11707 11708 pr_info("Firmware dev %x, ver %x, base ver %x\n", 11709 mc_dev_type, mc_version, mc_base_version); 11710 11711 } 11712 } else if (count + block_hdr.size * sizeof(u16) > size) 11713 goto eof; 11714 11715 count += block_hdr.size * sizeof(u16); 11716 } 11717 return 0; 11718 eof: 11719 pr_err("Firmware is truncated at pos %u/%u\n", count, size); 11720 return -EINVAL; 11721 } 11722 11723 /* 11724 * drx_ctrl_u_code - Handle microcode upload or verify. 11725 * @dev_addr: Address of device. 11726 * @mc_info: Pointer to information about microcode data. 11727 * @action: Either UCODE_UPLOAD or UCODE_VERIFY 11728 * 11729 * This function returns: 11730 * 0: 11731 * - In case of UCODE_UPLOAD: code is successfully uploaded. 11732 * - In case of UCODE_VERIFY: image on device is equal to 11733 * image provided to this control function. 11734 * -EIO: 11735 * - In case of UCODE_UPLOAD: I2C error. 11736 * - In case of UCODE_VERIFY: I2C error or image on device 11737 * is not equal to image provided to this control function. 11738 * -EINVAL: 11739 * - Invalid arguments. 11740 * - Provided image is corrupt 11741 */ 11742 static int drx_ctrl_u_code(struct drx_demod_instance *demod, 11743 struct drxu_code_info *mc_info, 11744 enum drxu_code_action action) 11745 { 11746 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr; 11747 int rc; 11748 u16 i = 0; 11749 u16 mc_nr_of_blks = 0; 11750 u16 mc_magic_word = 0; 11751 const u8 *mc_data_init = NULL; 11752 u8 *mc_data = NULL; 11753 unsigned size; 11754 char *mc_file; 11755 11756 /* Check arguments */ 11757 if (!mc_info || !mc_info->mc_file) 11758 return -EINVAL; 11759 11760 mc_file = mc_info->mc_file; 11761 11762 if (!demod->firmware) { 11763 const struct firmware *fw = NULL; 11764 11765 rc = request_firmware(&fw, mc_file, demod->i2c->dev.parent); 11766 if (rc < 0) { 11767 pr_err("Couldn't read firmware %s\n", mc_file); 11768 return rc; 11769 } 11770 demod->firmware = fw; 11771 11772 if (demod->firmware->size < 2 * sizeof(u16)) { 11773 rc = -EINVAL; 11774 pr_err("Firmware is too short!\n"); 11775 goto release; 11776 } 11777 11778 pr_info("Firmware %s, size %zu\n", 11779 mc_file, demod->firmware->size); 11780 } 11781 11782 mc_data_init = demod->firmware->data; 11783 size = demod->firmware->size; 11784 11785 mc_data = (void *)mc_data_init; 11786 /* Check data */ 11787 mc_magic_word = be16_to_cpu(*(__be16 *)(mc_data)); 11788 mc_data += sizeof(u16); 11789 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data)); 11790 mc_data += sizeof(u16); 11791 11792 if ((mc_magic_word != DRX_UCODE_MAGIC_WORD) || (mc_nr_of_blks == 0)) { 11793 rc = -EINVAL; 11794 pr_err("Firmware magic word doesn't match\n"); 11795 goto release; 11796 } 11797 11798 if (action == UCODE_UPLOAD) { 11799 rc = drx_check_firmware(demod, (u8 *)mc_data_init, size); 11800 if (rc) 11801 goto release; 11802 pr_info("Uploading firmware %s\n", mc_file); 11803 } else { 11804 pr_info("Verifying if firmware upload was ok.\n"); 11805 } 11806 11807 /* Process microcode blocks */ 11808 for (i = 0; i < mc_nr_of_blks; i++) { 11809 struct drxu_code_block_hdr block_hdr; 11810 u16 mc_block_nr_bytes = 0; 11811 11812 /* Process block header */ 11813 block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data)); 11814 mc_data += sizeof(u32); 11815 block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data)); 11816 mc_data += sizeof(u16); 11817 block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data)); 11818 mc_data += sizeof(u16); 11819 block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data)); 11820 mc_data += sizeof(u16); 11821 11822 pr_debug("%zd: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n", 11823 (mc_data - mc_data_init), block_hdr.addr, 11824 block_hdr.size, block_hdr.flags, block_hdr.CRC); 11825 11826 /* Check block header on: 11827 - data larger than 64Kb 11828 - if CRC enabled check CRC 11829 */ 11830 if ((block_hdr.size > 0x7FFF) || 11831 (((block_hdr.flags & DRX_UCODE_CRC_FLAG) != 0) && 11832 (block_hdr.CRC != drx_u_code_compute_crc(mc_data, block_hdr.size))) 11833 ) { 11834 /* Wrong data ! */ 11835 rc = -EINVAL; 11836 pr_err("firmware CRC is wrong\n"); 11837 goto release; 11838 } 11839 11840 if (!block_hdr.size) 11841 continue; 11842 11843 mc_block_nr_bytes = block_hdr.size * ((u16) sizeof(u16)); 11844 11845 /* Perform the desired action */ 11846 switch (action) { 11847 case UCODE_UPLOAD: /* Upload microcode */ 11848 if (drxdap_fasi_write_block(dev_addr, 11849 block_hdr.addr, 11850 mc_block_nr_bytes, 11851 mc_data, 0x0000)) { 11852 rc = -EIO; 11853 pr_err("error writing firmware at pos %zd\n", 11854 mc_data - mc_data_init); 11855 goto release; 11856 } 11857 break; 11858 case UCODE_VERIFY: { /* Verify uploaded microcode */ 11859 int result = 0; 11860 u8 mc_data_buffer[DRX_UCODE_MAX_BUF_SIZE]; 11861 u32 bytes_to_comp = 0; 11862 u32 bytes_left = mc_block_nr_bytes; 11863 u32 curr_addr = block_hdr.addr; 11864 u8 *curr_ptr = mc_data; 11865 11866 while (bytes_left != 0) { 11867 if (bytes_left > DRX_UCODE_MAX_BUF_SIZE) 11868 bytes_to_comp = DRX_UCODE_MAX_BUF_SIZE; 11869 else 11870 bytes_to_comp = bytes_left; 11871 11872 if (drxdap_fasi_read_block(dev_addr, 11873 curr_addr, 11874 (u16)bytes_to_comp, 11875 (u8 *)mc_data_buffer, 11876 0x0000)) { 11877 pr_err("error reading firmware at pos %zd\n", 11878 mc_data - mc_data_init); 11879 return -EIO; 11880 } 11881 11882 result = memcmp(curr_ptr, mc_data_buffer, 11883 bytes_to_comp); 11884 11885 if (result) { 11886 pr_err("error verifying firmware at pos %zd\n", 11887 mc_data - mc_data_init); 11888 return -EIO; 11889 } 11890 11891 curr_addr += ((dr_xaddr_t)(bytes_to_comp / 2)); 11892 curr_ptr =&(curr_ptr[bytes_to_comp]); 11893 bytes_left -=((u32) bytes_to_comp); 11894 } 11895 break; 11896 } 11897 default: 11898 return -EINVAL; 11899 break; 11900 11901 } 11902 mc_data += mc_block_nr_bytes; 11903 } 11904 11905 return 0; 11906 11907 release: 11908 release_firmware(demod->firmware); 11909 demod->firmware = NULL; 11910 11911 return rc; 11912 } 11913 11914 /* caller is expected to check if lna is supported before enabling */ 11915 static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state) 11916 { 11917 struct drxuio_cfg uio_cfg; 11918 struct drxuio_data uio_data; 11919 int result; 11920 11921 uio_cfg.uio = DRX_UIO1; 11922 uio_cfg.mode = DRX_UIO_MODE_READWRITE; 11923 /* Configure user-I/O #3: enable read/write */ 11924 result = ctrl_set_uio_cfg(demod, &uio_cfg); 11925 if (result) { 11926 pr_err("Failed to setup LNA GPIO!\n"); 11927 return result; 11928 } 11929 11930 uio_data.uio = DRX_UIO1; 11931 uio_data.value = state; 11932 result = ctrl_uio_write(demod, &uio_data); 11933 if (result != 0) { 11934 pr_err("Failed to %sable LNA!\n", 11935 state ? "en" : "dis"); 11936 return result; 11937 } 11938 return 0; 11939 } 11940 11941 /* 11942 * The Linux DVB Driver for Micronas DRX39xx family (drx3933j) 11943 * 11944 * Written by Devin Heitmueller <devin.heitmueller@kernellabs.com> 11945 */ 11946 11947 static int drx39xxj_set_powerstate(struct dvb_frontend *fe, int enable) 11948 { 11949 struct drx39xxj_state *state = fe->demodulator_priv; 11950 struct drx_demod_instance *demod = state->demod; 11951 int result; 11952 enum drx_power_mode power_mode; 11953 11954 if (enable) 11955 power_mode = DRX_POWER_UP; 11956 else 11957 power_mode = DRX_POWER_DOWN; 11958 11959 result = ctrl_power_mode(demod, &power_mode); 11960 if (result != 0) { 11961 pr_err("Power state change failed\n"); 11962 return 0; 11963 } 11964 11965 return 0; 11966 } 11967 11968 static int drx39xxj_read_status(struct dvb_frontend *fe, enum fe_status *status) 11969 { 11970 struct drx39xxj_state *state = fe->demodulator_priv; 11971 struct drx_demod_instance *demod = state->demod; 11972 int result; 11973 enum drx_lock_status lock_status; 11974 11975 *status = 0; 11976 11977 result = ctrl_lock_status(demod, &lock_status); 11978 if (result != 0) { 11979 pr_err("drx39xxj: could not get lock status!\n"); 11980 *status = 0; 11981 } 11982 11983 switch (lock_status) { 11984 case DRX_NEVER_LOCK: 11985 *status = 0; 11986 pr_err("drx says NEVER_LOCK\n"); 11987 break; 11988 case DRX_NOT_LOCKED: 11989 *status = 0; 11990 break; 11991 case DRX_LOCK_STATE_1: 11992 case DRX_LOCK_STATE_2: 11993 case DRX_LOCK_STATE_3: 11994 case DRX_LOCK_STATE_4: 11995 case DRX_LOCK_STATE_5: 11996 case DRX_LOCK_STATE_6: 11997 case DRX_LOCK_STATE_7: 11998 case DRX_LOCK_STATE_8: 11999 case DRX_LOCK_STATE_9: 12000 *status = FE_HAS_SIGNAL 12001 | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC; 12002 break; 12003 case DRX_LOCKED: 12004 *status = FE_HAS_SIGNAL 12005 | FE_HAS_CARRIER 12006 | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; 12007 break; 12008 default: 12009 pr_err("Lock state unknown %d\n", lock_status); 12010 } 12011 ctrl_sig_quality(demod, lock_status); 12012 12013 return 0; 12014 } 12015 12016 static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber) 12017 { 12018 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 12019 12020 if (p->pre_bit_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) { 12021 *ber = 0; 12022 return 0; 12023 } 12024 12025 if (!p->pre_bit_count.stat[0].uvalue) { 12026 if (!p->pre_bit_error.stat[0].uvalue) 12027 *ber = 0; 12028 else 12029 *ber = 1000000; 12030 } else { 12031 *ber = frac_times1e6(p->pre_bit_error.stat[0].uvalue, 12032 p->pre_bit_count.stat[0].uvalue); 12033 } 12034 return 0; 12035 } 12036 12037 static int drx39xxj_read_signal_strength(struct dvb_frontend *fe, 12038 u16 *strength) 12039 { 12040 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 12041 12042 if (p->strength.stat[0].scale == FE_SCALE_NOT_AVAILABLE) { 12043 *strength = 0; 12044 return 0; 12045 } 12046 12047 *strength = p->strength.stat[0].uvalue; 12048 return 0; 12049 } 12050 12051 static int drx39xxj_read_snr(struct dvb_frontend *fe, u16 *snr) 12052 { 12053 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 12054 u64 tmp64; 12055 12056 if (p->cnr.stat[0].scale == FE_SCALE_NOT_AVAILABLE) { 12057 *snr = 0; 12058 return 0; 12059 } 12060 12061 tmp64 = p->cnr.stat[0].svalue; 12062 do_div(tmp64, 10); 12063 *snr = tmp64; 12064 return 0; 12065 } 12066 12067 static int drx39xxj_read_ucblocks(struct dvb_frontend *fe, u32 *ucb) 12068 { 12069 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 12070 12071 if (p->block_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) { 12072 *ucb = 0; 12073 return 0; 12074 } 12075 12076 *ucb = p->block_error.stat[0].uvalue; 12077 return 0; 12078 } 12079 12080 static int drx39xxj_set_frontend(struct dvb_frontend *fe) 12081 { 12082 #ifdef DJH_DEBUG 12083 int i; 12084 #endif 12085 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 12086 struct drx39xxj_state *state = fe->demodulator_priv; 12087 struct drx_demod_instance *demod = state->demod; 12088 enum drx_standard standard = DRX_STANDARD_8VSB; 12089 struct drx_channel channel; 12090 int result; 12091 static const struct drx_channel def_channel = { 12092 /* frequency */ 0, 12093 /* bandwidth */ DRX_BANDWIDTH_6MHZ, 12094 /* mirror */ DRX_MIRROR_NO, 12095 /* constellation */ DRX_CONSTELLATION_AUTO, 12096 /* hierarchy */ DRX_HIERARCHY_UNKNOWN, 12097 /* priority */ DRX_PRIORITY_UNKNOWN, 12098 /* coderate */ DRX_CODERATE_UNKNOWN, 12099 /* guard */ DRX_GUARD_UNKNOWN, 12100 /* fftmode */ DRX_FFTMODE_UNKNOWN, 12101 /* classification */ DRX_CLASSIFICATION_AUTO, 12102 /* symbolrate */ 5057000, 12103 /* interleavemode */ DRX_INTERLEAVEMODE_UNKNOWN, 12104 /* ldpc */ DRX_LDPC_UNKNOWN, 12105 /* carrier */ DRX_CARRIER_UNKNOWN, 12106 /* frame mode */ DRX_FRAMEMODE_UNKNOWN 12107 }; 12108 u32 constellation = DRX_CONSTELLATION_AUTO; 12109 12110 /* Bring the demod out of sleep */ 12111 drx39xxj_set_powerstate(fe, 1); 12112 12113 if (fe->ops.tuner_ops.set_params) { 12114 u32 int_freq; 12115 12116 if (fe->ops.i2c_gate_ctrl) 12117 fe->ops.i2c_gate_ctrl(fe, 1); 12118 12119 /* Set tuner to desired frequency and standard */ 12120 fe->ops.tuner_ops.set_params(fe); 12121 12122 /* Use the tuner's IF */ 12123 if (fe->ops.tuner_ops.get_if_frequency) { 12124 fe->ops.tuner_ops.get_if_frequency(fe, &int_freq); 12125 demod->my_common_attr->intermediate_freq = int_freq / 1000; 12126 } 12127 12128 if (fe->ops.i2c_gate_ctrl) 12129 fe->ops.i2c_gate_ctrl(fe, 0); 12130 } 12131 12132 switch (p->delivery_system) { 12133 case SYS_ATSC: 12134 standard = DRX_STANDARD_8VSB; 12135 break; 12136 case SYS_DVBC_ANNEX_B: 12137 standard = DRX_STANDARD_ITU_B; 12138 12139 switch (p->modulation) { 12140 case QAM_64: 12141 constellation = DRX_CONSTELLATION_QAM64; 12142 break; 12143 case QAM_256: 12144 constellation = DRX_CONSTELLATION_QAM256; 12145 break; 12146 default: 12147 constellation = DRX_CONSTELLATION_AUTO; 12148 break; 12149 } 12150 break; 12151 default: 12152 return -EINVAL; 12153 } 12154 /* Set the standard (will be powered up if necessary */ 12155 result = ctrl_set_standard(demod, &standard); 12156 if (result != 0) { 12157 pr_err("Failed to set standard! result=%02x\n", 12158 result); 12159 return -EINVAL; 12160 } 12161 12162 /* set channel parameters */ 12163 channel = def_channel; 12164 channel.frequency = p->frequency / 1000; 12165 channel.bandwidth = DRX_BANDWIDTH_6MHZ; 12166 channel.constellation = constellation; 12167 12168 /* program channel */ 12169 result = ctrl_set_channel(demod, &channel); 12170 if (result != 0) { 12171 pr_err("Failed to set channel!\n"); 12172 return -EINVAL; 12173 } 12174 /* Just for giggles, let's shut off the LNA again.... */ 12175 drxj_set_lna_state(demod, false); 12176 12177 /* After set_frontend, except for strength, stats aren't available */ 12178 p->strength.stat[0].scale = FE_SCALE_RELATIVE; 12179 12180 return 0; 12181 } 12182 12183 static int drx39xxj_sleep(struct dvb_frontend *fe) 12184 { 12185 /* power-down the demodulator */ 12186 return drx39xxj_set_powerstate(fe, 0); 12187 } 12188 12189 static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) 12190 { 12191 struct drx39xxj_state *state = fe->demodulator_priv; 12192 struct drx_demod_instance *demod = state->demod; 12193 bool i2c_gate_state; 12194 int result; 12195 12196 #ifdef DJH_DEBUG 12197 pr_debug("i2c gate call: enable=%d state=%d\n", enable, 12198 state->i2c_gate_open); 12199 #endif 12200 12201 if (enable) 12202 i2c_gate_state = true; 12203 else 12204 i2c_gate_state = false; 12205 12206 if (state->i2c_gate_open == enable) { 12207 /* We're already in the desired state */ 12208 return 0; 12209 } 12210 12211 result = ctrl_i2c_bridge(demod, &i2c_gate_state); 12212 if (result != 0) { 12213 pr_err("drx39xxj: could not open i2c gate [%d]\n", 12214 result); 12215 dump_stack(); 12216 } else { 12217 state->i2c_gate_open = enable; 12218 } 12219 return 0; 12220 } 12221 12222 static int drx39xxj_init(struct dvb_frontend *fe) 12223 { 12224 struct drx39xxj_state *state = fe->demodulator_priv; 12225 struct drx_demod_instance *demod = state->demod; 12226 int rc = 0; 12227 12228 if (fe->exit == DVB_FE_DEVICE_RESUME) { 12229 /* so drxj_open() does what it needs to do */ 12230 demod->my_common_attr->is_opened = false; 12231 rc = drxj_open(demod); 12232 if (rc != 0) 12233 pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc); 12234 } else 12235 drx39xxj_set_powerstate(fe, 1); 12236 12237 return rc; 12238 } 12239 12240 static int drx39xxj_set_lna(struct dvb_frontend *fe) 12241 { 12242 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 12243 struct drx39xxj_state *state = fe->demodulator_priv; 12244 struct drx_demod_instance *demod = state->demod; 12245 struct drxj_data *ext_attr = demod->my_ext_attr; 12246 12247 if (c->lna) { 12248 if (!ext_attr->has_lna) { 12249 pr_err("LNA is not supported on this device!\n"); 12250 return -EINVAL; 12251 12252 } 12253 } 12254 12255 return drxj_set_lna_state(demod, c->lna); 12256 } 12257 12258 static int drx39xxj_get_tune_settings(struct dvb_frontend *fe, 12259 struct dvb_frontend_tune_settings *tune) 12260 { 12261 tune->min_delay_ms = 1000; 12262 return 0; 12263 } 12264 12265 static void drx39xxj_release(struct dvb_frontend *fe) 12266 { 12267 struct drx39xxj_state *state = fe->demodulator_priv; 12268 struct drx_demod_instance *demod = state->demod; 12269 12270 /* if device is removed don't access it */ 12271 if (fe->exit != DVB_FE_DEVICE_REMOVED) 12272 drxj_close(demod); 12273 12274 kfree(demod->my_ext_attr); 12275 kfree(demod->my_common_attr); 12276 kfree(demod->my_i2c_dev_addr); 12277 release_firmware(demod->firmware); 12278 kfree(demod); 12279 kfree(state); 12280 } 12281 12282 static const struct dvb_frontend_ops drx39xxj_ops; 12283 12284 struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c) 12285 { 12286 struct drx39xxj_state *state = NULL; 12287 struct i2c_device_addr *demod_addr = NULL; 12288 struct drx_common_attr *demod_comm_attr = NULL; 12289 struct drxj_data *demod_ext_attr = NULL; 12290 struct drx_demod_instance *demod = NULL; 12291 struct dtv_frontend_properties *p; 12292 int result; 12293 12294 /* allocate memory for the internal state */ 12295 state = kzalloc(sizeof(struct drx39xxj_state), GFP_KERNEL); 12296 if (state == NULL) 12297 goto error; 12298 12299 demod = kmemdup(&drxj_default_demod_g, 12300 sizeof(struct drx_demod_instance), GFP_KERNEL); 12301 if (demod == NULL) 12302 goto error; 12303 12304 demod_addr = kmemdup(&drxj_default_addr_g, 12305 sizeof(struct i2c_device_addr), GFP_KERNEL); 12306 if (demod_addr == NULL) 12307 goto error; 12308 12309 demod_comm_attr = kmemdup(&drxj_default_comm_attr_g, 12310 sizeof(struct drx_common_attr), GFP_KERNEL); 12311 if (demod_comm_attr == NULL) 12312 goto error; 12313 12314 demod_ext_attr = kmemdup(&drxj_data_g, sizeof(struct drxj_data), 12315 GFP_KERNEL); 12316 if (demod_ext_attr == NULL) 12317 goto error; 12318 12319 /* setup the state */ 12320 state->i2c = i2c; 12321 state->demod = demod; 12322 12323 /* setup the demod data */ 12324 demod->my_i2c_dev_addr = demod_addr; 12325 demod->my_common_attr = demod_comm_attr; 12326 demod->my_i2c_dev_addr->user_data = state; 12327 demod->my_common_attr->microcode_file = DRX39XX_MAIN_FIRMWARE; 12328 demod->my_common_attr->verify_microcode = true; 12329 demod->my_common_attr->intermediate_freq = 5000; 12330 demod->my_common_attr->current_power_mode = DRX_POWER_DOWN; 12331 demod->my_ext_attr = demod_ext_attr; 12332 ((struct drxj_data *)demod_ext_attr)->uio_sma_tx_mode = DRX_UIO_MODE_READWRITE; 12333 demod->i2c = i2c; 12334 12335 result = drxj_open(demod); 12336 if (result != 0) { 12337 pr_err("DRX open failed! Aborting\n"); 12338 goto error; 12339 } 12340 12341 /* create dvb_frontend */ 12342 memcpy(&state->frontend.ops, &drx39xxj_ops, 12343 sizeof(struct dvb_frontend_ops)); 12344 12345 state->frontend.demodulator_priv = state; 12346 12347 /* Initialize stats - needed for DVBv5 stats to work */ 12348 p = &state->frontend.dtv_property_cache; 12349 p->strength.len = 1; 12350 p->pre_bit_count.len = 1; 12351 p->pre_bit_error.len = 1; 12352 p->post_bit_count.len = 1; 12353 p->post_bit_error.len = 1; 12354 p->block_count.len = 1; 12355 p->block_error.len = 1; 12356 p->cnr.len = 1; 12357 12358 p->strength.stat[0].scale = FE_SCALE_RELATIVE; 12359 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 12360 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 12361 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 12362 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 12363 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 12364 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 12365 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 12366 12367 return &state->frontend; 12368 12369 error: 12370 kfree(demod_ext_attr); 12371 kfree(demod_comm_attr); 12372 kfree(demod_addr); 12373 kfree(demod); 12374 kfree(state); 12375 12376 return NULL; 12377 } 12378 EXPORT_SYMBOL(drx39xxj_attach); 12379 12380 static const struct dvb_frontend_ops drx39xxj_ops = { 12381 .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B }, 12382 .info = { 12383 .name = "Micronas DRX39xxj family Frontend", 12384 .frequency_min_hz = 51 * MHz, 12385 .frequency_max_hz = 858 * MHz, 12386 .frequency_stepsize_hz = 62500, 12387 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB 12388 }, 12389 12390 .init = drx39xxj_init, 12391 .i2c_gate_ctrl = drx39xxj_i2c_gate_ctrl, 12392 .sleep = drx39xxj_sleep, 12393 .set_frontend = drx39xxj_set_frontend, 12394 .get_tune_settings = drx39xxj_get_tune_settings, 12395 .read_status = drx39xxj_read_status, 12396 .read_ber = drx39xxj_read_ber, 12397 .read_signal_strength = drx39xxj_read_signal_strength, 12398 .read_snr = drx39xxj_read_snr, 12399 .read_ucblocks = drx39xxj_read_ucblocks, 12400 .release = drx39xxj_release, 12401 .set_lna = drx39xxj_set_lna, 12402 }; 12403 12404 MODULE_DESCRIPTION("Micronas DRX39xxj Frontend"); 12405 MODULE_AUTHOR("Devin Heitmueller"); 12406 MODULE_LICENSE("GPL"); 12407 MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE); 12408