1*b53f2fa1SBrad Love /* SPDX-License-Identifier: GPL-2.0 */ 2*b53f2fa1SBrad Love /* 3*b53f2fa1SBrad Love * Driver for the MaxLinear MxL69x family of combo tuners/demods 4*b53f2fa1SBrad Love * 5*b53f2fa1SBrad Love * Copyright (C) 2020 Brad Love <brad@nextdimension.cc> 6*b53f2fa1SBrad Love * 7*b53f2fa1SBrad Love * based on code: 8*b53f2fa1SBrad Love * Copyright (c) 2016 MaxLinear, Inc. All rights reserved 9*b53f2fa1SBrad Love * which was released under GPL V2 10*b53f2fa1SBrad Love */ 11*b53f2fa1SBrad Love 12*b53f2fa1SBrad Love /***************************************************************************** 13*b53f2fa1SBrad Love * Defines 14*b53f2fa1SBrad Love ***************************************************************************** 15*b53f2fa1SBrad Love */ 16*b53f2fa1SBrad Love #define MXL_EAGLE_HOST_MSG_HEADER_SIZE 8 17*b53f2fa1SBrad Love #define MXL_EAGLE_FW_MAX_SIZE_IN_KB 76 18*b53f2fa1SBrad Love #define MXL_EAGLE_QAM_FFE_TAPS_LENGTH 16 19*b53f2fa1SBrad Love #define MXL_EAGLE_QAM_SPUR_TAPS_LENGTH 32 20*b53f2fa1SBrad Love #define MXL_EAGLE_QAM_DFE_TAPS_LENGTH 72 21*b53f2fa1SBrad Love #define MXL_EAGLE_ATSC_FFE_TAPS_LENGTH 4096 22*b53f2fa1SBrad Love #define MXL_EAGLE_ATSC_DFE_TAPS_LENGTH 384 23*b53f2fa1SBrad Love #define MXL_EAGLE_VERSION_SIZE 5 /* A.B.C.D-RCx */ 24*b53f2fa1SBrad Love #define MXL_EAGLE_FW_LOAD_TIME 50 25*b53f2fa1SBrad Love 26*b53f2fa1SBrad Love #define MXL_EAGLE_FW_MAX_SIZE_IN_KB 76 27*b53f2fa1SBrad Love #define MXL_EAGLE_FW_HEADER_SIZE 16 28*b53f2fa1SBrad Love #define MXL_EAGLE_FW_SEGMENT_HEADER_SIZE 8 29*b53f2fa1SBrad Love #define MXL_EAGLE_MAX_I2C_PACKET_SIZE 58 30*b53f2fa1SBrad Love #define MXL_EAGLE_I2C_MHEADER_SIZE 6 31*b53f2fa1SBrad Love #define MXL_EAGLE_I2C_PHEADER_SIZE 2 32*b53f2fa1SBrad Love 33*b53f2fa1SBrad Love /* Enum of Eagle family devices */ 34*b53f2fa1SBrad Love enum MXL_EAGLE_DEVICE_E { 35*b53f2fa1SBrad Love MXL_EAGLE_DEVICE_691 = 1, /* Device Mxl691 */ 36*b53f2fa1SBrad Love MXL_EAGLE_DEVICE_248 = 2, /* Device Mxl248 */ 37*b53f2fa1SBrad Love MXL_EAGLE_DEVICE_692 = 3, /* Device Mxl692 */ 38*b53f2fa1SBrad Love MXL_EAGLE_DEVICE_MAX, /* No such device */ 39*b53f2fa1SBrad Love }; 40*b53f2fa1SBrad Love 41*b53f2fa1SBrad Love #define VER_A 1 42*b53f2fa1SBrad Love #define VER_B 1 43*b53f2fa1SBrad Love #define VER_C 1 44*b53f2fa1SBrad Love #define VER_D 3 45*b53f2fa1SBrad Love #define VER_E 6 46*b53f2fa1SBrad Love 47*b53f2fa1SBrad Love /* Enum of Host to Eagle I2C protocol opcodes */ 48*b53f2fa1SBrad Love enum MXL_EAGLE_OPCODE_E { 49*b53f2fa1SBrad Love /* DEVICE */ 50*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_DEMODULATOR_TYPE_SET, 51*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_MPEG_OUT_PARAMS_SET, 52*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_POWERMODE_SET, 53*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_GPIO_DIRECTION_SET, 54*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_GPO_LEVEL_SET, 55*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_INTR_MASK_SET, 56*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_IO_MUX_SET, 57*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_VERSION_GET, 58*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_STATUS_GET, 59*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_DEVICE_GPI_LEVEL_GET, 60*b53f2fa1SBrad Love 61*b53f2fa1SBrad Love /* TUNER */ 62*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_TUNER_CHANNEL_TUNE_SET, 63*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_TUNER_LOCK_STATUS_GET, 64*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_TUNER_AGC_STATUS_GET, 65*b53f2fa1SBrad Love 66*b53f2fa1SBrad Love /* ATSC */ 67*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_ATSC_INIT_SET, 68*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_ATSC_ACQUIRE_CARRIER_SET, 69*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_ATSC_STATUS_GET, 70*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_ATSC_ERROR_COUNTERS_GET, 71*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_ATSC_EQUALIZER_FILTER_DFE_TAPS_GET, 72*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_ATSC_EQUALIZER_FILTER_FFE_TAPS_GET, 73*b53f2fa1SBrad Love 74*b53f2fa1SBrad Love /* QAM */ 75*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_PARAMS_SET, 76*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_RESTART_SET, 77*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_STATUS_GET, 78*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_ERROR_COUNTERS_GET, 79*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_CONSTELLATION_VALUE_GET, 80*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_EQUALIZER_FILTER_FFE_GET, 81*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_EQUALIZER_FILTER_SPUR_START_GET, 82*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_EQUALIZER_FILTER_SPUR_END_GET, 83*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_EQUALIZER_FILTER_DFE_TAPS_NUMBER_GET, 84*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_EQUALIZER_FILTER_DFE_START_GET, 85*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_EQUALIZER_FILTER_DFE_MIDDLE_GET, 86*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_QAM_EQUALIZER_FILTER_DFE_END_GET, 87*b53f2fa1SBrad Love 88*b53f2fa1SBrad Love /* OOB */ 89*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_OOB_PARAMS_SET, 90*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_OOB_RESTART_SET, 91*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_OOB_ERROR_COUNTERS_GET, 92*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_OOB_STATUS_GET, 93*b53f2fa1SBrad Love 94*b53f2fa1SBrad Love /* SMA */ 95*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_SMA_INIT_SET, 96*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_SMA_PARAMS_SET, 97*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_SMA_TRANSMIT_SET, 98*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_SMA_RECEIVE_GET, 99*b53f2fa1SBrad Love 100*b53f2fa1SBrad Love /* DEBUG */ 101*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_INTERNAL, 102*b53f2fa1SBrad Love 103*b53f2fa1SBrad Love MXL_EAGLE_OPCODE_MAX = 70, 104*b53f2fa1SBrad Love }; 105*b53f2fa1SBrad Love 106*b53f2fa1SBrad Love /* Enum of Host to Eagle I2C protocol opcodes */ 107*b53f2fa1SBrad Love static const char * const MXL_EAGLE_OPCODE_STRING[] = { 108*b53f2fa1SBrad Love /* DEVICE */ 109*b53f2fa1SBrad Love "DEVICE_DEMODULATOR_TYPE_SET", 110*b53f2fa1SBrad Love "DEVICE_MPEG_OUT_PARAMS_SET", 111*b53f2fa1SBrad Love "DEVICE_POWERMODE_SET", 112*b53f2fa1SBrad Love "DEVICE_GPIO_DIRECTION_SET", 113*b53f2fa1SBrad Love "DEVICE_GPO_LEVEL_SET", 114*b53f2fa1SBrad Love "DEVICE_INTR_MASK_SET", 115*b53f2fa1SBrad Love "DEVICE_IO_MUX_SET", 116*b53f2fa1SBrad Love "DEVICE_VERSION_GET", 117*b53f2fa1SBrad Love "DEVICE_STATUS_GET", 118*b53f2fa1SBrad Love "DEVICE_GPI_LEVEL_GET", 119*b53f2fa1SBrad Love 120*b53f2fa1SBrad Love /* TUNER */ 121*b53f2fa1SBrad Love "TUNER_CHANNEL_TUNE_SET", 122*b53f2fa1SBrad Love "TUNER_LOCK_STATUS_GET", 123*b53f2fa1SBrad Love "TUNER_AGC_STATUS_GET", 124*b53f2fa1SBrad Love 125*b53f2fa1SBrad Love /* ATSC */ 126*b53f2fa1SBrad Love "ATSC_INIT_SET", 127*b53f2fa1SBrad Love "ATSC_ACQUIRE_CARRIER_SET", 128*b53f2fa1SBrad Love "ATSC_STATUS_GET", 129*b53f2fa1SBrad Love "ATSC_ERROR_COUNTERS_GET", 130*b53f2fa1SBrad Love "ATSC_EQUALIZER_FILTER_DFE_TAPS_GET", 131*b53f2fa1SBrad Love "ATSC_EQUALIZER_FILTER_FFE_TAPS_GET", 132*b53f2fa1SBrad Love 133*b53f2fa1SBrad Love /* QAM */ 134*b53f2fa1SBrad Love "QAM_PARAMS_SET", 135*b53f2fa1SBrad Love "QAM_RESTART_SET", 136*b53f2fa1SBrad Love "QAM_STATUS_GET", 137*b53f2fa1SBrad Love "QAM_ERROR_COUNTERS_GET", 138*b53f2fa1SBrad Love "QAM_CONSTELLATION_VALUE_GET", 139*b53f2fa1SBrad Love "QAM_EQUALIZER_FILTER_FFE_GET", 140*b53f2fa1SBrad Love "QAM_EQUALIZER_FILTER_SPUR_START_GET", 141*b53f2fa1SBrad Love "QAM_EQUALIZER_FILTER_SPUR_END_GET", 142*b53f2fa1SBrad Love "QAM_EQUALIZER_FILTER_DFE_TAPS_NUMBER_GET", 143*b53f2fa1SBrad Love "QAM_EQUALIZER_FILTER_DFE_START_GET", 144*b53f2fa1SBrad Love "QAM_EQUALIZER_FILTER_DFE_MIDDLE_GET", 145*b53f2fa1SBrad Love "QAM_EQUALIZER_FILTER_DFE_END_GET", 146*b53f2fa1SBrad Love 147*b53f2fa1SBrad Love /* OOB */ 148*b53f2fa1SBrad Love "OOB_PARAMS_SET", 149*b53f2fa1SBrad Love "OOB_RESTART_SET", 150*b53f2fa1SBrad Love "OOB_ERROR_COUNTERS_GET", 151*b53f2fa1SBrad Love "OOB_STATUS_GET", 152*b53f2fa1SBrad Love 153*b53f2fa1SBrad Love /* SMA */ 154*b53f2fa1SBrad Love "SMA_INIT_SET", 155*b53f2fa1SBrad Love "SMA_PARAMS_SET", 156*b53f2fa1SBrad Love "SMA_TRANSMIT_SET", 157*b53f2fa1SBrad Love "SMA_RECEIVE_GET", 158*b53f2fa1SBrad Love 159*b53f2fa1SBrad Love /* DEBUG */ 160*b53f2fa1SBrad Love "INTERNAL", 161*b53f2fa1SBrad Love }; 162*b53f2fa1SBrad Love 163*b53f2fa1SBrad Love /* Enum of Callabck function types */ 164*b53f2fa1SBrad Love enum MXL_EAGLE_CB_TYPE_E { 165*b53f2fa1SBrad Love MXL_EAGLE_CB_FW_DOWNLOAD = 0, 166*b53f2fa1SBrad Love }; 167*b53f2fa1SBrad Love 168*b53f2fa1SBrad Love /* Enum of power supply types */ 169*b53f2fa1SBrad Love enum MXL_EAGLE_POWER_SUPPLY_SOURCE_E { 170*b53f2fa1SBrad Love MXL_EAGLE_POWER_SUPPLY_SOURCE_SINGLE, /* Single supply of 3.3V */ 171*b53f2fa1SBrad Love MXL_EAGLE_POWER_SUPPLY_SOURCE_DUAL, /* Dual supply, 1.8V & 3.3V */ 172*b53f2fa1SBrad Love }; 173*b53f2fa1SBrad Love 174*b53f2fa1SBrad Love /* Enum of I/O pad drive modes */ 175*b53f2fa1SBrad Love enum MXL_EAGLE_IO_MUX_DRIVE_MODE_E { 176*b53f2fa1SBrad Love MXL_EAGLE_IO_MUX_DRIVE_MODE_1X, 177*b53f2fa1SBrad Love MXL_EAGLE_IO_MUX_DRIVE_MODE_2X, 178*b53f2fa1SBrad Love MXL_EAGLE_IO_MUX_DRIVE_MODE_3X, 179*b53f2fa1SBrad Love MXL_EAGLE_IO_MUX_DRIVE_MODE_4X, 180*b53f2fa1SBrad Love MXL_EAGLE_IO_MUX_DRIVE_MODE_5X, 181*b53f2fa1SBrad Love MXL_EAGLE_IO_MUX_DRIVE_MODE_6X, 182*b53f2fa1SBrad Love MXL_EAGLE_IO_MUX_DRIVE_MODE_7X, 183*b53f2fa1SBrad Love MXL_EAGLE_IO_MUX_DRIVE_MODE_8X, 184*b53f2fa1SBrad Love }; 185*b53f2fa1SBrad Love 186*b53f2fa1SBrad Love /* Enum of demodulator types. Used for selection of demodulator 187*b53f2fa1SBrad Love * type in relevant devices, e.g. ATSC vs. QAM in Mxl691 188*b53f2fa1SBrad Love */ 189*b53f2fa1SBrad Love enum MXL_EAGLE_DEMOD_TYPE_E { 190*b53f2fa1SBrad Love MXL_EAGLE_DEMOD_TYPE_QAM, /* Mxl248 or Mxl692 */ 191*b53f2fa1SBrad Love MXL_EAGLE_DEMOD_TYPE_OOB, /* Mxl248 only */ 192*b53f2fa1SBrad Love MXL_EAGLE_DEMOD_TYPE_ATSC /* Mxl691 or Mxl692 */ 193*b53f2fa1SBrad Love }; 194*b53f2fa1SBrad Love 195*b53f2fa1SBrad Love /* Enum of power modes. Used for initial 196*b53f2fa1SBrad Love * activation, or for activating sleep mode 197*b53f2fa1SBrad Love */ 198*b53f2fa1SBrad Love enum MXL_EAGLE_POWER_MODE_E { 199*b53f2fa1SBrad Love MXL_EAGLE_POWER_MODE_SLEEP, 200*b53f2fa1SBrad Love MXL_EAGLE_POWER_MODE_ACTIVE 201*b53f2fa1SBrad Love }; 202*b53f2fa1SBrad Love 203*b53f2fa1SBrad Love /* Enum of GPIOs, used in device GPIO APIs */ 204*b53f2fa1SBrad Love enum MXL_EAGLE_GPIO_NUMBER_E { 205*b53f2fa1SBrad Love MXL_EAGLE_GPIO_NUMBER_0, 206*b53f2fa1SBrad Love MXL_EAGLE_GPIO_NUMBER_1, 207*b53f2fa1SBrad Love MXL_EAGLE_GPIO_NUMBER_2, 208*b53f2fa1SBrad Love MXL_EAGLE_GPIO_NUMBER_3, 209*b53f2fa1SBrad Love MXL_EAGLE_GPIO_NUMBER_4, 210*b53f2fa1SBrad Love MXL_EAGLE_GPIO_NUMBER_5, 211*b53f2fa1SBrad Love MXL_EAGLE_GPIO_NUMBER_6 212*b53f2fa1SBrad Love }; 213*b53f2fa1SBrad Love 214*b53f2fa1SBrad Love /* Enum of GPIO directions, used in GPIO direction configuration API */ 215*b53f2fa1SBrad Love enum MXL_EAGLE_GPIO_DIRECTION_E { 216*b53f2fa1SBrad Love MXL_EAGLE_GPIO_DIRECTION_INPUT, 217*b53f2fa1SBrad Love MXL_EAGLE_GPIO_DIRECTION_OUTPUT 218*b53f2fa1SBrad Love }; 219*b53f2fa1SBrad Love 220*b53f2fa1SBrad Love /* Enum of GPIO level, used in device GPIO APIs */ 221*b53f2fa1SBrad Love enum MXL_EAGLE_GPIO_LEVEL_E { 222*b53f2fa1SBrad Love MXL_EAGLE_GPIO_LEVEL_LOW, 223*b53f2fa1SBrad Love MXL_EAGLE_GPIO_LEVEL_HIGH, 224*b53f2fa1SBrad Love }; 225*b53f2fa1SBrad Love 226*b53f2fa1SBrad Love /* Enum of I/O Mux function, used in device I/O mux configuration API */ 227*b53f2fa1SBrad Love enum MXL_EAGLE_IOMUX_FUNCTION_E { 228*b53f2fa1SBrad Love MXL_EAGLE_IOMUX_FUNC_FEC_LOCK, 229*b53f2fa1SBrad Love MXL_EAGLE_IOMUX_FUNC_MERR, 230*b53f2fa1SBrad Love }; 231*b53f2fa1SBrad Love 232*b53f2fa1SBrad Love /* Enum of MPEG Data format, used in MPEG and OOB output configuration */ 233*b53f2fa1SBrad Love enum MXL_EAGLE_MPEG_DATA_FORMAT_E { 234*b53f2fa1SBrad Love MXL_EAGLE_DATA_SERIAL_LSB_1ST = 0, 235*b53f2fa1SBrad Love MXL_EAGLE_DATA_SERIAL_MSB_1ST, 236*b53f2fa1SBrad Love 237*b53f2fa1SBrad Love MXL_EAGLE_DATA_SYNC_WIDTH_BIT = 0, 238*b53f2fa1SBrad Love MXL_EAGLE_DATA_SYNC_WIDTH_BYTE 239*b53f2fa1SBrad Love }; 240*b53f2fa1SBrad Love 241*b53f2fa1SBrad Love /* Enum of MPEG Clock format, used in MPEG and OOB output configuration */ 242*b53f2fa1SBrad Love enum MXL_EAGLE_MPEG_CLOCK_FORMAT_E { 243*b53f2fa1SBrad Love MXL_EAGLE_CLOCK_ACTIVE_HIGH = 0, 244*b53f2fa1SBrad Love MXL_EAGLE_CLOCK_ACTIVE_LOW, 245*b53f2fa1SBrad Love 246*b53f2fa1SBrad Love MXL_EAGLE_CLOCK_POSITIVE = 0, 247*b53f2fa1SBrad Love MXL_EAGLE_CLOCK_NEGATIVE, 248*b53f2fa1SBrad Love 249*b53f2fa1SBrad Love MXL_EAGLE_CLOCK_IN_PHASE = 0, 250*b53f2fa1SBrad Love MXL_EAGLE_CLOCK_INVERTED, 251*b53f2fa1SBrad Love }; 252*b53f2fa1SBrad Love 253*b53f2fa1SBrad Love /* Enum of MPEG Clock speeds, used in MPEG output configuration */ 254*b53f2fa1SBrad Love enum MXL_EAGLE_MPEG_CLOCK_RATE_E { 255*b53f2fa1SBrad Love MXL_EAGLE_MPEG_CLOCK_54MHZ, 256*b53f2fa1SBrad Love MXL_EAGLE_MPEG_CLOCK_40_5MHZ, 257*b53f2fa1SBrad Love MXL_EAGLE_MPEG_CLOCK_27MHZ, 258*b53f2fa1SBrad Love MXL_EAGLE_MPEG_CLOCK_13_5MHZ, 259*b53f2fa1SBrad Love }; 260*b53f2fa1SBrad Love 261*b53f2fa1SBrad Love /* Enum of Interrupt mask bit, used in host interrupt configuration */ 262*b53f2fa1SBrad Love enum MXL_EAGLE_INTR_MASK_BITS_E { 263*b53f2fa1SBrad Love MXL_EAGLE_INTR_MASK_DEMOD = 0, 264*b53f2fa1SBrad Love MXL_EAGLE_INTR_MASK_SMA_RX = 1, 265*b53f2fa1SBrad Love MXL_EAGLE_INTR_MASK_WDOG = 31 266*b53f2fa1SBrad Love }; 267*b53f2fa1SBrad Love 268*b53f2fa1SBrad Love /* Enum of QAM Demodulator type, used in QAM configuration */ 269*b53f2fa1SBrad Love enum MXL_EAGLE_QAM_DEMOD_ANNEX_TYPE_E { 270*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_ANNEX_B, /* J.83B */ 271*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_ANNEX_A, /* DVB-C */ 272*b53f2fa1SBrad Love }; 273*b53f2fa1SBrad Love 274*b53f2fa1SBrad Love /* Enum of QAM Demodulator modulation, used in QAM configuration and status */ 275*b53f2fa1SBrad Love enum MXL_EAGLE_QAM_DEMOD_QAM_TYPE_E { 276*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_QAM16, 277*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_QAM64, 278*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_QAM256, 279*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_QAM1024, 280*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_QAM32, 281*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_QAM128, 282*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_QPSK, 283*b53f2fa1SBrad Love MXL_EAGLE_QAM_DEMOD_AUTO, 284*b53f2fa1SBrad Love }; 285*b53f2fa1SBrad Love 286*b53f2fa1SBrad Love /* Enum of Demodulator IQ setup, used in QAM, OOB configuration and status */ 287*b53f2fa1SBrad Love enum MXL_EAGLE_IQ_FLIP_E { 288*b53f2fa1SBrad Love MXL_EAGLE_DEMOD_IQ_NORMAL, 289*b53f2fa1SBrad Love MXL_EAGLE_DEMOD_IQ_FLIPPED, 290*b53f2fa1SBrad Love MXL_EAGLE_DEMOD_IQ_AUTO, 291*b53f2fa1SBrad Love }; 292*b53f2fa1SBrad Love 293*b53f2fa1SBrad Love /* Enum of OOB Demodulator symbol rates, used in OOB configuration */ 294*b53f2fa1SBrad Love enum MXL_EAGLE_OOB_DEMOD_SYMB_RATE_E { 295*b53f2fa1SBrad Love MXL_EAGLE_OOB_DEMOD_SYMB_RATE_0_772MHZ, /* ANSI/SCTE 55-2 0.772 MHz */ 296*b53f2fa1SBrad Love MXL_EAGLE_OOB_DEMOD_SYMB_RATE_1_024MHZ, /* ANSI/SCTE 55-1 1.024 MHz */ 297*b53f2fa1SBrad Love MXL_EAGLE_OOB_DEMOD_SYMB_RATE_1_544MHZ, /* ANSI/SCTE 55-2 1.544 MHz */ 298*b53f2fa1SBrad Love }; 299*b53f2fa1SBrad Love 300*b53f2fa1SBrad Love /* Enum of tuner channel tuning mode */ 301*b53f2fa1SBrad Love enum MXL_EAGLE_TUNER_CHANNEL_TUNE_MODE_E { 302*b53f2fa1SBrad Love MXL_EAGLE_TUNER_CHANNEL_TUNE_MODE_VIEW, /* Normal "view" mode */ 303*b53f2fa1SBrad Love MXL_EAGLE_TUNER_CHANNEL_TUNE_MODE_SCAN, /* Fast "scan" mode */ 304*b53f2fa1SBrad Love }; 305*b53f2fa1SBrad Love 306*b53f2fa1SBrad Love /* Enum of tuner bandwidth */ 307*b53f2fa1SBrad Love enum MXL_EAGLE_TUNER_BW_E { 308*b53f2fa1SBrad Love MXL_EAGLE_TUNER_BW_6MHZ, 309*b53f2fa1SBrad Love MXL_EAGLE_TUNER_BW_7MHZ, 310*b53f2fa1SBrad Love MXL_EAGLE_TUNER_BW_8MHZ, 311*b53f2fa1SBrad Love }; 312*b53f2fa1SBrad Love 313*b53f2fa1SBrad Love /* Enum of tuner bandwidth */ 314*b53f2fa1SBrad Love enum MXL_EAGLE_JUNCTION_TEMPERATURE_E { 315*b53f2fa1SBrad Love MXL_EAGLE_JUNCTION_TEMPERATURE_BELOW_0_CELSIUS = 0, 316*b53f2fa1SBrad Love MXL_EAGLE_JUNCTION_TEMPERATURE_BETWEEN_0_TO_14_CELSIUS = 1, 317*b53f2fa1SBrad Love MXL_EAGLE_JUNCTION_TEMPERATURE_BETWEEN_14_TO_28_CELSIUS = 3, 318*b53f2fa1SBrad Love MXL_EAGLE_JUNCTION_TEMPERATURE_BETWEEN_28_TO_42_CELSIUS = 2, 319*b53f2fa1SBrad Love MXL_EAGLE_JUNCTION_TEMPERATURE_BETWEEN_42_TO_57_CELSIUS = 6, 320*b53f2fa1SBrad Love MXL_EAGLE_JUNCTION_TEMPERATURE_BETWEEN_57_TO_71_CELSIUS = 7, 321*b53f2fa1SBrad Love MXL_EAGLE_JUNCTION_TEMPERATURE_BETWEEN_71_TO_85_CELSIUS = 5, 322*b53f2fa1SBrad Love MXL_EAGLE_JUNCTION_TEMPERATURE_ABOVE_85_CELSIUS = 4, 323*b53f2fa1SBrad Love }; 324*b53f2fa1SBrad Love 325*b53f2fa1SBrad Love /* Struct passed in optional callback used during FW download */ 326*b53f2fa1SBrad Love struct MXL_EAGLE_FW_DOWNLOAD_CB_PAYLOAD_T { 327*b53f2fa1SBrad Love u32 total_len; 328*b53f2fa1SBrad Love u32 downloaded_len; 329*b53f2fa1SBrad Love }; 330*b53f2fa1SBrad Love 331*b53f2fa1SBrad Love /* Struct used of I2C protocol between host and Eagle, internal use only */ 332*b53f2fa1SBrad Love struct __packed MXL_EAGLE_HOST_MSG_HEADER_T { 333*b53f2fa1SBrad Love u8 opcode; 334*b53f2fa1SBrad Love u8 seqnum; 335*b53f2fa1SBrad Love u8 payload_size; 336*b53f2fa1SBrad Love u8 status; 337*b53f2fa1SBrad Love u32 checksum; 338*b53f2fa1SBrad Love }; 339*b53f2fa1SBrad Love 340*b53f2fa1SBrad Love /* Device version information struct */ 341*b53f2fa1SBrad Love struct __packed MXL_EAGLE_DEV_VER_T { 342*b53f2fa1SBrad Love u8 chip_id; 343*b53f2fa1SBrad Love u8 firmware_ver[MXL_EAGLE_VERSION_SIZE]; 344*b53f2fa1SBrad Love u8 mxlware_ver[MXL_EAGLE_VERSION_SIZE]; 345*b53f2fa1SBrad Love }; 346*b53f2fa1SBrad Love 347*b53f2fa1SBrad Love /* Xtal configuration struct */ 348*b53f2fa1SBrad Love struct __packed MXL_EAGLE_DEV_XTAL_T { 349*b53f2fa1SBrad Love u8 xtal_cap; /* accepted range is 1..31 pF. Default is 26 */ 350*b53f2fa1SBrad Love u8 clk_out_enable; 351*b53f2fa1SBrad Love u8 clk_out_div_enable; /* clock out freq is xtal freq / 6 */ 352*b53f2fa1SBrad Love u8 xtal_sharing_enable; /* if enabled set xtal_cap to 25 pF */ 353*b53f2fa1SBrad Love u8 xtal_calibration_enable; /* enable for master, disable for slave */ 354*b53f2fa1SBrad Love }; 355*b53f2fa1SBrad Love 356*b53f2fa1SBrad Love /* GPIO direction struct, internally used in GPIO configuration API */ 357*b53f2fa1SBrad Love struct __packed MXL_EAGLE_DEV_GPIO_DIRECTION_T { 358*b53f2fa1SBrad Love u8 gpio_number; 359*b53f2fa1SBrad Love u8 gpio_direction; 360*b53f2fa1SBrad Love }; 361*b53f2fa1SBrad Love 362*b53f2fa1SBrad Love /* GPO level struct, internally used in GPIO configuration API */ 363*b53f2fa1SBrad Love struct __packed MXL_EAGLE_DEV_GPO_LEVEL_T { 364*b53f2fa1SBrad Love u8 gpio_number; 365*b53f2fa1SBrad Love u8 gpo_level; 366*b53f2fa1SBrad Love }; 367*b53f2fa1SBrad Love 368*b53f2fa1SBrad Love /* Device Status struct */ 369*b53f2fa1SBrad Love struct MXL_EAGLE_DEV_STATUS_T { 370*b53f2fa1SBrad Love u8 temperature; 371*b53f2fa1SBrad Love u8 demod_type; 372*b53f2fa1SBrad Love u8 power_mode; 373*b53f2fa1SBrad Love u8 cpu_utilization_percent; 374*b53f2fa1SBrad Love }; 375*b53f2fa1SBrad Love 376*b53f2fa1SBrad Love /* Device interrupt configuration struct */ 377*b53f2fa1SBrad Love struct __packed MXL_EAGLE_DEV_INTR_CFG_T { 378*b53f2fa1SBrad Love u32 intr_mask; 379*b53f2fa1SBrad Love u8 edge_trigger; 380*b53f2fa1SBrad Love u8 positive_trigger; 381*b53f2fa1SBrad Love u8 global_enable_interrupt; 382*b53f2fa1SBrad Love }; 383*b53f2fa1SBrad Love 384*b53f2fa1SBrad Love /* MPEG pad drive parameters, used on MPEG output configuration */ 385*b53f2fa1SBrad Love /* See MXL_EAGLE_IO_MUX_DRIVE_MODE_E */ 386*b53f2fa1SBrad Love struct MXL_EAGLE_MPEG_PAD_DRIVE_T { 387*b53f2fa1SBrad Love u8 pad_drv_mpeg_syn; 388*b53f2fa1SBrad Love u8 pad_drv_mpeg_dat; 389*b53f2fa1SBrad Love u8 pad_drv_mpeg_val; 390*b53f2fa1SBrad Love u8 pad_drv_mpeg_clk; 391*b53f2fa1SBrad Love }; 392*b53f2fa1SBrad Love 393*b53f2fa1SBrad Love /* MPEGOUT parameter struct, used in MPEG output configuration */ 394*b53f2fa1SBrad Love struct MXL_EAGLE_MPEGOUT_PARAMS_T { 395*b53f2fa1SBrad Love u8 mpeg_parallel; 396*b53f2fa1SBrad Love u8 msb_first; 397*b53f2fa1SBrad Love u8 mpeg_sync_pulse_width; /* See MXL_EAGLE_MPEG_DATA_FORMAT_E */ 398*b53f2fa1SBrad Love u8 mpeg_valid_pol; 399*b53f2fa1SBrad Love u8 mpeg_sync_pol; 400*b53f2fa1SBrad Love u8 mpeg_clk_pol; 401*b53f2fa1SBrad Love u8 mpeg3wire_mode_enable; 402*b53f2fa1SBrad Love u8 mpeg_clk_freq; 403*b53f2fa1SBrad Love struct MXL_EAGLE_MPEG_PAD_DRIVE_T mpeg_pad_drv; 404*b53f2fa1SBrad Love }; 405*b53f2fa1SBrad Love 406*b53f2fa1SBrad Love /* QAM Demodulator parameters struct, used in QAM params configuration */ 407*b53f2fa1SBrad Love struct __packed MXL_EAGLE_QAM_DEMOD_PARAMS_T { 408*b53f2fa1SBrad Love u8 annex_type; 409*b53f2fa1SBrad Love u8 qam_type; 410*b53f2fa1SBrad Love u8 iq_flip; 411*b53f2fa1SBrad Love u8 search_range_idx; 412*b53f2fa1SBrad Love u8 spur_canceller_enable; 413*b53f2fa1SBrad Love u32 symbol_rate_hz; 414*b53f2fa1SBrad Love u32 symbol_rate_256qam_hz; 415*b53f2fa1SBrad Love }; 416*b53f2fa1SBrad Love 417*b53f2fa1SBrad Love /* QAM Demodulator status */ 418*b53f2fa1SBrad Love struct MXL_EAGLE_QAM_DEMOD_STATUS_T { 419*b53f2fa1SBrad Love u8 annex_type; 420*b53f2fa1SBrad Love u8 qam_type; 421*b53f2fa1SBrad Love u8 iq_flip; 422*b53f2fa1SBrad Love u8 interleaver_depth_i; 423*b53f2fa1SBrad Love u8 interleaver_depth_j; 424*b53f2fa1SBrad Love u8 qam_locked; 425*b53f2fa1SBrad Love u8 fec_locked; 426*b53f2fa1SBrad Love u8 mpeg_locked; 427*b53f2fa1SBrad Love u16 snr_db_tenths; 428*b53f2fa1SBrad Love s16 timing_offset; 429*b53f2fa1SBrad Love s32 carrier_offset_hz; 430*b53f2fa1SBrad Love }; 431*b53f2fa1SBrad Love 432*b53f2fa1SBrad Love /* QAM Demodulator error counters */ 433*b53f2fa1SBrad Love struct MXL_EAGLE_QAM_DEMOD_ERROR_COUNTERS_T { 434*b53f2fa1SBrad Love u32 corrected_code_words; 435*b53f2fa1SBrad Love u32 uncorrected_code_words; 436*b53f2fa1SBrad Love u32 total_code_words_received; 437*b53f2fa1SBrad Love u32 corrected_bits; 438*b53f2fa1SBrad Love u32 error_mpeg_frames; 439*b53f2fa1SBrad Love u32 mpeg_frames_received; 440*b53f2fa1SBrad Love u32 erasures; 441*b53f2fa1SBrad Love }; 442*b53f2fa1SBrad Love 443*b53f2fa1SBrad Love /* QAM Demodulator constellation point */ 444*b53f2fa1SBrad Love struct MXL_EAGLE_QAM_DEMOD_CONSTELLATION_VAL_T { 445*b53f2fa1SBrad Love s16 i_value[12]; 446*b53f2fa1SBrad Love s16 q_value[12]; 447*b53f2fa1SBrad Love }; 448*b53f2fa1SBrad Love 449*b53f2fa1SBrad Love /* QAM Demodulator equalizer filter taps */ 450*b53f2fa1SBrad Love struct MXL_EAGLE_QAM_DEMOD_EQU_FILTER_T { 451*b53f2fa1SBrad Love s16 ffe_taps[MXL_EAGLE_QAM_FFE_TAPS_LENGTH]; 452*b53f2fa1SBrad Love s16 spur_taps[MXL_EAGLE_QAM_SPUR_TAPS_LENGTH]; 453*b53f2fa1SBrad Love s16 dfe_taps[MXL_EAGLE_QAM_DFE_TAPS_LENGTH]; 454*b53f2fa1SBrad Love u8 ffe_leading_tap_index; 455*b53f2fa1SBrad Love u8 dfe_taps_number; 456*b53f2fa1SBrad Love }; 457*b53f2fa1SBrad Love 458*b53f2fa1SBrad Love /* OOB Demodulator parameters struct, used in OOB params configuration */ 459*b53f2fa1SBrad Love struct __packed MXL_EAGLE_OOB_DEMOD_PARAMS_T { 460*b53f2fa1SBrad Love u8 symbol_rate; 461*b53f2fa1SBrad Love u8 iq_flip; 462*b53f2fa1SBrad Love u8 clk_pol; 463*b53f2fa1SBrad Love }; 464*b53f2fa1SBrad Love 465*b53f2fa1SBrad Love /* OOB Demodulator error counters */ 466*b53f2fa1SBrad Love struct MXL_EAGLE_OOB_DEMOD_ERROR_COUNTERS_T { 467*b53f2fa1SBrad Love u32 corrected_packets; 468*b53f2fa1SBrad Love u32 uncorrected_packets; 469*b53f2fa1SBrad Love u32 total_packets_received; 470*b53f2fa1SBrad Love }; 471*b53f2fa1SBrad Love 472*b53f2fa1SBrad Love /* OOB status */ 473*b53f2fa1SBrad Love struct __packed MXL_EAGLE_OOB_DEMOD_STATUS_T { 474*b53f2fa1SBrad Love u16 snr_db_tenths; 475*b53f2fa1SBrad Love s16 timing_offset; 476*b53f2fa1SBrad Love s32 carrier_offsetHz; 477*b53f2fa1SBrad Love u8 qam_locked; 478*b53f2fa1SBrad Love u8 fec_locked; 479*b53f2fa1SBrad Love u8 mpeg_locked; 480*b53f2fa1SBrad Love u8 retune_required; 481*b53f2fa1SBrad Love u8 iq_flip; 482*b53f2fa1SBrad Love }; 483*b53f2fa1SBrad Love 484*b53f2fa1SBrad Love /* ATSC Demodulator status */ 485*b53f2fa1SBrad Love struct __packed MXL_EAGLE_ATSC_DEMOD_STATUS_T { 486*b53f2fa1SBrad Love s16 snr_db_tenths; 487*b53f2fa1SBrad Love s16 timing_offset; 488*b53f2fa1SBrad Love s32 carrier_offset_hz; 489*b53f2fa1SBrad Love u8 frame_lock; 490*b53f2fa1SBrad Love u8 atsc_lock; 491*b53f2fa1SBrad Love u8 fec_lock; 492*b53f2fa1SBrad Love }; 493*b53f2fa1SBrad Love 494*b53f2fa1SBrad Love /* ATSC Demodulator error counters */ 495*b53f2fa1SBrad Love struct MXL_EAGLE_ATSC_DEMOD_ERROR_COUNTERS_T { 496*b53f2fa1SBrad Love u32 error_packets; 497*b53f2fa1SBrad Love u32 total_packets; 498*b53f2fa1SBrad Love u32 error_bytes; 499*b53f2fa1SBrad Love }; 500*b53f2fa1SBrad Love 501*b53f2fa1SBrad Love /* ATSC Demodulator equalizers filter taps */ 502*b53f2fa1SBrad Love struct __packed MXL_EAGLE_ATSC_DEMOD_EQU_FILTER_T { 503*b53f2fa1SBrad Love s16 ffe_taps[MXL_EAGLE_ATSC_FFE_TAPS_LENGTH]; 504*b53f2fa1SBrad Love s8 dfe_taps[MXL_EAGLE_ATSC_DFE_TAPS_LENGTH]; 505*b53f2fa1SBrad Love }; 506*b53f2fa1SBrad Love 507*b53f2fa1SBrad Love /* Tuner AGC Status */ 508*b53f2fa1SBrad Love struct __packed MXL_EAGLE_TUNER_AGC_STATUS_T { 509*b53f2fa1SBrad Love u8 locked; 510*b53f2fa1SBrad Love u16 raw_agc_gain; /* AGC gain [dB] = rawAgcGain / 2^6 */ 511*b53f2fa1SBrad Love s16 rx_power_db_hundredths; 512*b53f2fa1SBrad Love }; 513*b53f2fa1SBrad Love 514*b53f2fa1SBrad Love /* Tuner channel tune parameters */ 515*b53f2fa1SBrad Love struct __packed MXL_EAGLE_TUNER_CHANNEL_PARAMS_T { 516*b53f2fa1SBrad Love u32 freq_hz; 517*b53f2fa1SBrad Love u8 tune_mode; 518*b53f2fa1SBrad Love u8 bandwidth; 519*b53f2fa1SBrad Love }; 520*b53f2fa1SBrad Love 521*b53f2fa1SBrad Love /* Tuner channel lock indications */ 522*b53f2fa1SBrad Love struct __packed MXL_EAGLE_TUNER_LOCK_STATUS_T { 523*b53f2fa1SBrad Love u8 rf_pll_locked; 524*b53f2fa1SBrad Love u8 ref_pll_locked; 525*b53f2fa1SBrad Love }; 526*b53f2fa1SBrad Love 527*b53f2fa1SBrad Love /* Smart antenna parameters used in Smart antenna params configuration */ 528*b53f2fa1SBrad Love struct __packed MXL_EAGLE_SMA_PARAMS_T { 529*b53f2fa1SBrad Love u8 full_duplex_enable; 530*b53f2fa1SBrad Love u8 rx_disable; 531*b53f2fa1SBrad Love u8 idle_logic_high; 532*b53f2fa1SBrad Love }; 533*b53f2fa1SBrad Love 534*b53f2fa1SBrad Love /* Smart antenna message format */ 535*b53f2fa1SBrad Love struct __packed MXL_EAGLE_SMA_MESSAGE_T { 536*b53f2fa1SBrad Love u32 payload_bits; 537*b53f2fa1SBrad Love u8 total_num_bits; 538*b53f2fa1SBrad Love }; 539*b53f2fa1SBrad Love 540