Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Defines for the Maxlinear MX58x family of tuners/demods
0004  *
0005  * Copyright (C) 2014 Digital Devices GmbH
0006  *
0007  * based on code:
0008  * Copyright (c) 2011-2013 MaxLinear, Inc. All rights reserved
0009  * which was released under GPL V2
0010  */
0011 
0012 enum MXL_BOOL_E {
0013     MXL_DISABLE = 0,
0014     MXL_ENABLE  = 1,
0015 
0016     MXL_FALSE = 0,
0017     MXL_TRUE  = 1,
0018 
0019     MXL_INVALID = 0,
0020     MXL_VALID   = 1,
0021 
0022     MXL_NO      = 0,
0023     MXL_YES     = 1,
0024 
0025     MXL_OFF     = 0,
0026     MXL_ON      = 1
0027 };
0028 
0029 /* Firmware-Host Command IDs */
0030 enum MXL_HYDRA_HOST_CMD_ID_E {
0031     /* --Device command IDs-- */
0032     MXL_HYDRA_DEV_NO_OP_CMD = 0, /* No OP */
0033 
0034     MXL_HYDRA_DEV_SET_POWER_MODE_CMD = 1,
0035     MXL_HYDRA_DEV_SET_OVERWRITE_DEF_CMD = 2,
0036 
0037     /* Host-used CMD, not used by firmware */
0038     MXL_HYDRA_DEV_FIRMWARE_DOWNLOAD_CMD = 3,
0039 
0040     /* Additional CONTROL types from DTV */
0041     MXL_HYDRA_DEV_SET_BROADCAST_PID_STB_ID_CMD = 4,
0042     MXL_HYDRA_DEV_GET_PMM_SLEEP_CMD = 5,
0043 
0044     /* --Tuner command IDs-- */
0045     MXL_HYDRA_TUNER_TUNE_CMD = 6,
0046     MXL_HYDRA_TUNER_GET_STATUS_CMD = 7,
0047 
0048     /* --Demod command IDs-- */
0049     MXL_HYDRA_DEMOD_SET_PARAM_CMD = 8,
0050     MXL_HYDRA_DEMOD_GET_STATUS_CMD = 9,
0051 
0052     MXL_HYDRA_DEMOD_RESET_FEC_COUNTER_CMD = 10,
0053 
0054     MXL_HYDRA_DEMOD_SET_PKT_NUM_CMD = 11,
0055 
0056     MXL_HYDRA_DEMOD_SET_IQ_SOURCE_CMD = 12,
0057     MXL_HYDRA_DEMOD_GET_IQ_DATA_CMD = 13,
0058 
0059     MXL_HYDRA_DEMOD_GET_M68HC05_VER_CMD = 14,
0060 
0061     MXL_HYDRA_DEMOD_SET_ERROR_COUNTER_MODE_CMD = 15,
0062 
0063     /* --- ABORT channel tune */
0064     MXL_HYDRA_ABORT_TUNE_CMD = 16, /* Abort current tune command. */
0065 
0066     /* --SWM/FSK command IDs-- */
0067     MXL_HYDRA_FSK_RESET_CMD = 17,
0068     MXL_HYDRA_FSK_MSG_CMD = 18,
0069     MXL_HYDRA_FSK_SET_OP_MODE_CMD = 19,
0070 
0071     /* --DiSeqC command IDs-- */
0072     MXL_HYDRA_DISEQC_MSG_CMD = 20,
0073     MXL_HYDRA_DISEQC_COPY_MSG_TO_MAILBOX = 21,
0074     MXL_HYDRA_DISEQC_CFG_MSG_CMD = 22,
0075 
0076     /* --- FFT Debug Command IDs-- */
0077     MXL_HYDRA_REQ_FFT_SPECTRUM_CMD = 23,
0078 
0079     /* -- Demod scramblle code */
0080     MXL_HYDRA_DEMOD_SCRAMBLE_CODE_CMD = 24,
0081 
0082     /* ---For host to know how many commands in total */
0083     MXL_HYDRA_LAST_HOST_CMD = 25,
0084 
0085     MXL_HYDRA_DEMOD_INTR_TYPE_CMD = 47,
0086     MXL_HYDRA_DEV_INTR_CLEAR_CMD = 48,
0087     MXL_HYDRA_TUNER_SPECTRUM_REQ_CMD = 53,
0088     MXL_HYDRA_TUNER_ACTIVATE_CMD = 55,
0089     MXL_HYDRA_DEV_CFG_POWER_MODE_CMD = 56,
0090     MXL_HYDRA_DEV_XTAL_CAP_CMD = 57,
0091     MXL_HYDRA_DEV_CFG_SKU_CMD = 58,
0092     MXL_HYDRA_TUNER_SPECTRUM_MIN_GAIN_CMD = 59,
0093     MXL_HYDRA_DISEQC_CONT_TONE_CFG = 60,
0094     MXL_HYDRA_DEV_RF_WAKE_UP_CMD = 61,
0095     MXL_HYDRA_DEMOD_CFG_EQ_CTRL_PARAM_CMD = 62,
0096     MXL_HYDRA_DEMOD_FREQ_OFFSET_SEARCH_RANGE_CMD = 63,
0097     MXL_HYDRA_DEV_REQ_PWR_FROM_ADCRSSI_CMD = 64,
0098 
0099     MXL_XCPU_PID_FLT_CFG_CMD = 65,
0100     MXL_XCPU_SHMEM_TEST_CMD = 66,
0101     MXL_XCPU_ABORT_TUNE_CMD = 67,
0102     MXL_XCPU_CHAN_TUNE_CMD = 68,
0103     MXL_XCPU_FLT_BOND_HDRS_CMD = 69,
0104 
0105     MXL_HYDRA_DEV_BROADCAST_WAKE_UP_CMD = 70,
0106     MXL_HYDRA_FSK_CFG_FSK_FREQ_CMD = 71,
0107     MXL_HYDRA_FSK_POWER_DOWN_CMD = 72,
0108     MXL_XCPU_CLEAR_CB_STATS_CMD = 73,
0109     MXL_XCPU_CHAN_BOND_RESTART_CMD = 74
0110 };
0111 
0112 #define MXL_ENABLE_BIG_ENDIAN        (0)
0113 
0114 #define MXL_HYDRA_OEM_MAX_BLOCK_WRITE_LENGTH   248
0115 
0116 #define MXL_HYDRA_OEM_MAX_CMD_BUFF_LEN        (248)
0117 
0118 #define MXL_HYDRA_CAP_MIN     10
0119 #define MXL_HYDRA_CAP_MAX     33
0120 
0121 #define MXL_HYDRA_PLID_REG_READ       0xFB   /* Read register PLID */
0122 #define MXL_HYDRA_PLID_REG_WRITE      0xFC   /* Write register PLID */
0123 
0124 #define MXL_HYDRA_PLID_CMD_READ       0xFD   /* Command Read PLID */
0125 #define MXL_HYDRA_PLID_CMD_WRITE      0xFE   /* Command Write PLID */
0126 
0127 #define MXL_HYDRA_REG_SIZE_IN_BYTES   4      /* Hydra register size in bytes */
0128 #define MXL_HYDRA_I2C_HDR_SIZE        (2 * sizeof(u8)) /* PLID + LEN(0xFF) */
0129 #define MXL_HYDRA_CMD_HEADER_SIZE     (MXL_HYDRA_REG_SIZE_IN_BYTES + MXL_HYDRA_I2C_HDR_SIZE)
0130 
0131 #define MXL_HYDRA_SKU_ID_581 0
0132 #define MXL_HYDRA_SKU_ID_584 1
0133 #define MXL_HYDRA_SKU_ID_585 2
0134 #define MXL_HYDRA_SKU_ID_544 3
0135 #define MXL_HYDRA_SKU_ID_561 4
0136 #define MXL_HYDRA_SKU_ID_582 5
0137 #define MXL_HYDRA_SKU_ID_568 6
0138 
0139 /* macro for register write data buffer size
0140  * (PLID + LEN (0xFF) + RegAddr + RegData)
0141  */
0142 #define MXL_HYDRA_REG_WRITE_LEN       (MXL_HYDRA_I2C_HDR_SIZE + (2 * MXL_HYDRA_REG_SIZE_IN_BYTES))
0143 
0144 /* macro to extract a single byte from 4-byte(32-bit) data */
0145 #define GET_BYTE(x, n)  (((x) >> (8*(n))) & 0xFF)
0146 
0147 #define MAX_CMD_DATA 512
0148 
0149 #define MXL_GET_REG_MASK_32(lsb_loc, num_of_bits) ((0xFFFFFFFF >> (32 - (num_of_bits))) << (lsb_loc))
0150 
0151 #define FW_DL_SIGN (0xDEADBEEF)
0152 
0153 #define MBIN_FORMAT_VERSION               '1'
0154 #define MBIN_FILE_HEADER_ID               'M'
0155 #define MBIN_SEGMENT_HEADER_ID            'S'
0156 #define MBIN_MAX_FILE_LENGTH              (1<<23)
0157 
0158 struct MBIN_FILE_HEADER_T {
0159     u8 id;
0160     u8 fmt_version;
0161     u8 header_len;
0162     u8 num_segments;
0163     u8 entry_address[4];
0164     u8 image_size24[3];
0165     u8 image_checksum;
0166     u8 reserved[4];
0167 };
0168 
0169 struct MBIN_FILE_T {
0170     struct MBIN_FILE_HEADER_T header;
0171     u8 data[1];
0172 };
0173 
0174 struct MBIN_SEGMENT_HEADER_T {
0175     u8 id;
0176     u8 len24[3];
0177     u8 address[4];
0178 };
0179 
0180 struct MBIN_SEGMENT_T {
0181     struct MBIN_SEGMENT_HEADER_T header;
0182     u8 data[1];
0183 };
0184 
0185 enum MXL_CMD_TYPE_E { MXL_CMD_WRITE = 0, MXL_CMD_READ };
0186 
0187 #define BUILD_HYDRA_CMD(cmd_id, req_type, size, data_ptr, cmd_buff)     \
0188     do {                                \
0189         cmd_buff[0] = ((req_type == MXL_CMD_WRITE) ? MXL_HYDRA_PLID_CMD_WRITE : MXL_HYDRA_PLID_CMD_READ); \
0190         cmd_buff[1] = (size > 251) ? 0xff : (u8) (size + 4);    \
0191         cmd_buff[2] = size;                 \
0192         cmd_buff[3] = cmd_id;                   \
0193         cmd_buff[4] = 0x00;                 \
0194         cmd_buff[5] = 0x00;                 \
0195         convert_endian(MXL_ENABLE_BIG_ENDIAN, size, (u8 *)data_ptr); \
0196         memcpy((void *)&cmd_buff[6], data_ptr, size);       \
0197     } while (0)
0198 
0199 struct MXL_REG_FIELD_T {
0200     u32 reg_addr;
0201     u8 lsb_pos;
0202     u8 num_of_bits;
0203 };
0204 
0205 struct MXL_DEV_CMD_DATA_T {
0206     u32 data_size;
0207     u8 data[MAX_CMD_DATA];
0208 };
0209 
0210 enum MXL_HYDRA_SKU_TYPE_E {
0211     MXL_HYDRA_SKU_TYPE_MIN = 0x00,
0212     MXL_HYDRA_SKU_TYPE_581 = 0x00,
0213     MXL_HYDRA_SKU_TYPE_584 = 0x01,
0214     MXL_HYDRA_SKU_TYPE_585 = 0x02,
0215     MXL_HYDRA_SKU_TYPE_544 = 0x03,
0216     MXL_HYDRA_SKU_TYPE_561 = 0x04,
0217     MXL_HYDRA_SKU_TYPE_5XX = 0x05,
0218     MXL_HYDRA_SKU_TYPE_5YY = 0x06,
0219     MXL_HYDRA_SKU_TYPE_511 = 0x07,
0220     MXL_HYDRA_SKU_TYPE_561_DE = 0x08,
0221     MXL_HYDRA_SKU_TYPE_582 = 0x09,
0222     MXL_HYDRA_SKU_TYPE_541 = 0x0A,
0223     MXL_HYDRA_SKU_TYPE_568 = 0x0B,
0224     MXL_HYDRA_SKU_TYPE_542 = 0x0C,
0225     MXL_HYDRA_SKU_TYPE_MAX = 0x0D,
0226 };
0227 
0228 struct MXL_HYDRA_SKU_COMMAND_T {
0229     enum MXL_HYDRA_SKU_TYPE_E sku_type;
0230 };
0231 
0232 enum MXL_HYDRA_DEMOD_ID_E {
0233     MXL_HYDRA_DEMOD_ID_0 = 0,
0234     MXL_HYDRA_DEMOD_ID_1,
0235     MXL_HYDRA_DEMOD_ID_2,
0236     MXL_HYDRA_DEMOD_ID_3,
0237     MXL_HYDRA_DEMOD_ID_4,
0238     MXL_HYDRA_DEMOD_ID_5,
0239     MXL_HYDRA_DEMOD_ID_6,
0240     MXL_HYDRA_DEMOD_ID_7,
0241     MXL_HYDRA_DEMOD_MAX
0242 };
0243 
0244 #define MXL_DEMOD_SCRAMBLE_SEQ_LEN  12
0245 
0246 #define MAX_STEP_SIZE_24_XTAL_102_05_KHZ  195
0247 #define MAX_STEP_SIZE_24_XTAL_204_10_KHZ  215
0248 #define MAX_STEP_SIZE_24_XTAL_306_15_KHZ  203
0249 #define MAX_STEP_SIZE_24_XTAL_408_20_KHZ  177
0250 
0251 #define MAX_STEP_SIZE_27_XTAL_102_05_KHZ  195
0252 #define MAX_STEP_SIZE_27_XTAL_204_10_KHZ  215
0253 #define MAX_STEP_SIZE_27_XTAL_306_15_KHZ  203
0254 #define MAX_STEP_SIZE_27_XTAL_408_20_KHZ  177
0255 
0256 #define MXL_HYDRA_SPECTRUM_MIN_FREQ_KHZ  300000
0257 #define MXL_HYDRA_SPECTRUM_MAX_FREQ_KHZ 2350000
0258 
0259 enum MXL_DEMOD_CHAN_PARAMS_OFFSET_E {
0260     DMD_STANDARD_ADDR = 0,
0261     DMD_SPECTRUM_INVERSION_ADDR,
0262     DMD_SPECTRUM_ROLL_OFF_ADDR,
0263     DMD_SYMBOL_RATE_ADDR,
0264     DMD_MODULATION_SCHEME_ADDR,
0265     DMD_FEC_CODE_RATE_ADDR,
0266     DMD_SNR_ADDR,
0267     DMD_FREQ_OFFSET_ADDR,
0268     DMD_CTL_FREQ_OFFSET_ADDR,
0269     DMD_STR_FREQ_OFFSET_ADDR,
0270     DMD_FTL_FREQ_OFFSET_ADDR,
0271     DMD_STR_NBC_SYNC_LOCK_ADDR,
0272     DMD_CYCLE_SLIP_COUNT_ADDR,
0273     DMD_DISPLAY_IQ_ADDR,
0274     DMD_DVBS2_CRC_ERRORS_ADDR,
0275     DMD_DVBS2_PER_COUNT_ADDR,
0276     DMD_DVBS2_PER_WINDOW_ADDR,
0277     DMD_DVBS_CORR_RS_ERRORS_ADDR,
0278     DMD_DVBS_UNCORR_RS_ERRORS_ADDR,
0279     DMD_DVBS_BER_COUNT_ADDR,
0280     DMD_DVBS_BER_WINDOW_ADDR,
0281     DMD_TUNER_ID_ADDR,
0282     DMD_DVBS2_PILOT_ON_OFF_ADDR,
0283     DMD_FREQ_SEARCH_RANGE_IN_KHZ_ADDR,
0284 
0285     MXL_DEMOD_CHAN_PARAMS_BUFF_SIZE,
0286 };
0287 
0288 enum MXL_HYDRA_TUNER_ID_E {
0289     MXL_HYDRA_TUNER_ID_0 = 0,
0290     MXL_HYDRA_TUNER_ID_1,
0291     MXL_HYDRA_TUNER_ID_2,
0292     MXL_HYDRA_TUNER_ID_3,
0293     MXL_HYDRA_TUNER_MAX
0294 };
0295 
0296 enum MXL_HYDRA_BCAST_STD_E {
0297     MXL_HYDRA_DSS = 0,
0298     MXL_HYDRA_DVBS,
0299     MXL_HYDRA_DVBS2,
0300 };
0301 
0302 enum MXL_HYDRA_FEC_E {
0303     MXL_HYDRA_FEC_AUTO = 0,
0304     MXL_HYDRA_FEC_1_2,
0305     MXL_HYDRA_FEC_3_5,
0306     MXL_HYDRA_FEC_2_3,
0307     MXL_HYDRA_FEC_3_4,
0308     MXL_HYDRA_FEC_4_5,
0309     MXL_HYDRA_FEC_5_6,
0310     MXL_HYDRA_FEC_6_7,
0311     MXL_HYDRA_FEC_7_8,
0312     MXL_HYDRA_FEC_8_9,
0313     MXL_HYDRA_FEC_9_10,
0314 };
0315 
0316 enum MXL_HYDRA_MODULATION_E {
0317     MXL_HYDRA_MOD_AUTO = 0,
0318     MXL_HYDRA_MOD_QPSK,
0319     MXL_HYDRA_MOD_8PSK
0320 };
0321 
0322 enum MXL_HYDRA_SPECTRUM_E {
0323     MXL_HYDRA_SPECTRUM_AUTO = 0,
0324     MXL_HYDRA_SPECTRUM_INVERTED,
0325     MXL_HYDRA_SPECTRUM_NON_INVERTED,
0326 };
0327 
0328 enum MXL_HYDRA_ROLLOFF_E {
0329     MXL_HYDRA_ROLLOFF_AUTO  = 0,
0330     MXL_HYDRA_ROLLOFF_0_20,
0331     MXL_HYDRA_ROLLOFF_0_25,
0332     MXL_HYDRA_ROLLOFF_0_35
0333 };
0334 
0335 enum MXL_HYDRA_PILOTS_E {
0336     MXL_HYDRA_PILOTS_OFF  = 0,
0337     MXL_HYDRA_PILOTS_ON,
0338     MXL_HYDRA_PILOTS_AUTO
0339 };
0340 
0341 enum MXL_HYDRA_CONSTELLATION_SRC_E {
0342     MXL_HYDRA_FORMATTER = 0,
0343     MXL_HYDRA_LEGACY_FEC,
0344     MXL_HYDRA_FREQ_RECOVERY,
0345     MXL_HYDRA_NBC,
0346     MXL_HYDRA_CTL,
0347     MXL_HYDRA_EQ,
0348 };
0349 
0350 struct MXL_HYDRA_DEMOD_LOCK_T {
0351     int agc_lock; /* AGC lock info */
0352     int fec_lock; /* Demod FEC block lock info */
0353 };
0354 
0355 struct MXL_HYDRA_DEMOD_STATUS_DVBS_T {
0356     u32 rs_errors;        /* RS decoder err counter */
0357     u32 ber_window;       /* Ber Windows */
0358     u32 ber_count;        /* BER count */
0359     u32 ber_window_iter1; /* Ber Windows - post viterbi */
0360     u32 ber_count_iter1;  /* BER count - post viterbi */
0361 };
0362 
0363 struct MXL_HYDRA_DEMOD_STATUS_DSS_T {
0364     u32 rs_errors;  /* RS decoder err counter */
0365     u32 ber_window; /* Ber Windows */
0366     u32 ber_count;  /* BER count */
0367 };
0368 
0369 struct MXL_HYDRA_DEMOD_STATUS_DVBS2_T {
0370     u32 crc_errors;        /* CRC error counter */
0371     u32 packet_error_count; /* Number of packet errors */
0372     u32 total_packets;     /* Total packets */
0373 };
0374 
0375 struct MXL_HYDRA_DEMOD_STATUS_T {
0376     enum MXL_HYDRA_BCAST_STD_E standard_mask; /* Standard DVB-S, DVB-S2 or DSS */
0377 
0378     union {
0379         struct MXL_HYDRA_DEMOD_STATUS_DVBS_T demod_status_dvbs;   /* DVB-S demod status */
0380         struct MXL_HYDRA_DEMOD_STATUS_DVBS2_T demod_status_dvbs2; /* DVB-S2 demod status */
0381         struct MXL_HYDRA_DEMOD_STATUS_DSS_T demod_status_dss;     /* DSS demod status */
0382     } u;
0383 };
0384 
0385 struct MXL_HYDRA_DEMOD_SIG_OFFSET_INFO_T {
0386     s32 carrier_offset_in_hz; /* CRL offset info */
0387     s32 symbol_offset_in_symbol; /* SRL offset info */
0388 };
0389 
0390 struct MXL_HYDRA_DEMOD_SCRAMBLE_INFO_T {
0391     u8 scramble_sequence[MXL_DEMOD_SCRAMBLE_SEQ_LEN]; /* scramble sequence */
0392     u32 scramble_code; /* scramble gold code */
0393 };
0394 
0395 enum MXL_HYDRA_SPECTRUM_STEP_SIZE_E {
0396     MXL_HYDRA_STEP_SIZE_24_XTAL_102_05KHZ, /* 102.05 KHz for 24 MHz XTAL */
0397     MXL_HYDRA_STEP_SIZE_24_XTAL_204_10KHZ, /* 204.10 KHz for 24 MHz XTAL */
0398     MXL_HYDRA_STEP_SIZE_24_XTAL_306_15KHZ, /* 306.15 KHz for 24 MHz XTAL */
0399     MXL_HYDRA_STEP_SIZE_24_XTAL_408_20KHZ, /* 408.20 KHz for 24 MHz XTAL */
0400 
0401     MXL_HYDRA_STEP_SIZE_27_XTAL_102_05KHZ, /* 102.05 KHz for 27 MHz XTAL */
0402     MXL_HYDRA_STEP_SIZE_27_XTAL_204_35KHZ, /* 204.35 KHz for 27 MHz XTAL */
0403     MXL_HYDRA_STEP_SIZE_27_XTAL_306_52KHZ, /* 306.52 KHz for 27 MHz XTAL */
0404     MXL_HYDRA_STEP_SIZE_27_XTAL_408_69KHZ, /* 408.69 KHz for 27 MHz XTAL */
0405 };
0406 
0407 enum MXL_HYDRA_SPECTRUM_RESOLUTION_E {
0408     MXL_HYDRA_SPECTRUM_RESOLUTION_00_1_DB, /* 0.1 dB */
0409     MXL_HYDRA_SPECTRUM_RESOLUTION_01_0_DB, /* 1.0 dB */
0410     MXL_HYDRA_SPECTRUM_RESOLUTION_05_0_DB, /* 5.0 dB */
0411     MXL_HYDRA_SPECTRUM_RESOLUTION_10_0_DB, /* 10 dB */
0412 };
0413 
0414 enum MXL_HYDRA_SPECTRUM_ERROR_CODE_E {
0415     MXL_SPECTRUM_NO_ERROR,
0416     MXL_SPECTRUM_INVALID_PARAMETER,
0417     MXL_SPECTRUM_INVALID_STEP_SIZE,
0418     MXL_SPECTRUM_BW_CANNOT_BE_COVERED,
0419     MXL_SPECTRUM_DEMOD_BUSY,
0420     MXL_SPECTRUM_TUNER_NOT_ENABLED,
0421 };
0422 
0423 struct MXL_HYDRA_SPECTRUM_REQ_T {
0424     u32 tuner_index; /* TUNER Ctrl: one of MXL58x_TUNER_ID_E */
0425     u32 demod_index; /* DEMOD Ctrl: one of MXL58x_DEMOD_ID_E */
0426     enum MXL_HYDRA_SPECTRUM_STEP_SIZE_E step_size_in_khz;
0427     u32 starting_freq_ink_hz;
0428     u32 total_steps;
0429     enum MXL_HYDRA_SPECTRUM_RESOLUTION_E spectrum_division;
0430 };
0431 
0432 enum MXL_HYDRA_SEARCH_FREQ_OFFSET_TYPE_E {
0433     MXL_HYDRA_SEARCH_MAX_OFFSET = 0, /* DMD searches for max freq offset (i.e. 5MHz) */
0434     MXL_HYDRA_SEARCH_BW_PLUS_ROLLOFF, /* DMD searches for BW + ROLLOFF/2 */
0435 };
0436 
0437 struct MXL58X_CFG_FREQ_OFF_SEARCH_RANGE_T {
0438     u32 demod_index;
0439     enum MXL_HYDRA_SEARCH_FREQ_OFFSET_TYPE_E search_type;
0440 };
0441 
0442 /* there are two slices
0443  * slice0 - TS0, TS1, TS2 & TS3
0444  * slice1 - TS4, TS5, TS6 & TS7
0445  */
0446 #define MXL_HYDRA_TS_SLICE_MAX  2
0447 
0448 #define MAX_FIXED_PID_NUM   32
0449 
0450 #define MXL_HYDRA_NCO_CLK   418 /* 418 MHz */
0451 
0452 #define MXL_HYDRA_MAX_TS_CLOCK  139 /* 139 MHz */
0453 
0454 #define MXL_HYDRA_TS_FIXED_PID_FILT_SIZE          32
0455 
0456 #define MXL_HYDRA_SHARED_PID_FILT_SIZE_DEFAULT    33   /* Shared PID filter size in 1-1 mux mode */
0457 #define MXL_HYDRA_SHARED_PID_FILT_SIZE_2_TO_1     66   /* Shared PID filter size in 2-1 mux mode */
0458 #define MXL_HYDRA_SHARED_PID_FILT_SIZE_4_TO_1     132  /* Shared PID filter size in 4-1 mux mode */
0459 
0460 enum MXL_HYDRA_PID_BANK_TYPE_E {
0461     MXL_HYDRA_SOFTWARE_PID_BANK = 0,
0462     MXL_HYDRA_HARDWARE_PID_BANK,
0463 };
0464 
0465 enum MXL_HYDRA_TS_MUX_MODE_E {
0466     MXL_HYDRA_TS_MUX_PID_REMAP = 0,
0467     MXL_HYDRA_TS_MUX_PREFIX_EXTRA_HEADER = 1,
0468 };
0469 
0470 enum MXL_HYDRA_TS_MUX_TYPE_E {
0471     MXL_HYDRA_TS_MUX_DISABLE = 0, /* No Mux ( 1 TSIF to 1 TSIF) */
0472     MXL_HYDRA_TS_MUX_2_TO_1, /* Mux 2 TSIF to 1 TSIF */
0473     MXL_HYDRA_TS_MUX_4_TO_1, /* Mux 4 TSIF to 1 TSIF */
0474 };
0475 
0476 enum MXL_HYDRA_TS_GROUP_E {
0477     MXL_HYDRA_TS_GROUP_0_3 = 0, /* TS group 0 to 3 (TS0, TS1, TS2 & TS3) */
0478     MXL_HYDRA_TS_GROUP_4_7,     /* TS group 0 to 3 (TS4, TS5, TS6 & TS7) */
0479 };
0480 
0481 enum MXL_HYDRA_TS_PID_FLT_CTRL_E {
0482     MXL_HYDRA_TS_PIDS_ALLOW_ALL = 0, /* Allow all pids */
0483     MXL_HYDRA_TS_PIDS_DROP_ALL,  /* Drop all pids */
0484     MXL_HYDRA_TS_INVALIDATE_PID_FILTER, /* Delete current PD filter in the device */
0485 };
0486 
0487 enum MXL_HYDRA_TS_PID_TYPE_E {
0488     MXL_HYDRA_TS_PID_FIXED = 0,
0489     MXL_HYDRA_TS_PID_REGULAR,
0490 };
0491 
0492 struct MXL_HYDRA_TS_PID_T {
0493     u16 original_pid;           /* pid from TS */
0494     u16 remapped_pid;           /* remapped pid */
0495     enum MXL_BOOL_E enable;         /* enable or disable pid */
0496     enum MXL_BOOL_E allow_or_drop;    /* allow or drop pid */
0497     enum MXL_BOOL_E enable_pid_remap; /* enable or disable pid remap */
0498     u8 bond_id;                 /* Bond ID in A0 always 0 - Only for 568 Sku */
0499     u8 dest_id;                 /* Output port ID for the PID - Only for 568 Sku */
0500 };
0501 
0502 struct MXL_HYDRA_TS_MUX_PREFIX_HEADER_T {
0503     enum MXL_BOOL_E enable;
0504     u8 num_byte;
0505     u8 header[12];
0506 };
0507 
0508 enum MXL_HYDRA_PID_FILTER_BANK_E {
0509     MXL_HYDRA_PID_BANK_A = 0,
0510     MXL_HYDRA_PID_BANK_B,
0511 };
0512 
0513 enum MXL_HYDRA_MPEG_DATA_FMT_E {
0514     MXL_HYDRA_MPEG_SERIAL_MSB_1ST = 0,
0515     MXL_HYDRA_MPEG_SERIAL_LSB_1ST,
0516 
0517     MXL_HYDRA_MPEG_SYNC_WIDTH_BIT = 0,
0518     MXL_HYDRA_MPEG_SYNC_WIDTH_BYTE
0519 };
0520 
0521 enum MXL_HYDRA_MPEG_MODE_E {
0522     MXL_HYDRA_MPEG_MODE_SERIAL_4_WIRE = 0, /* MPEG 4 Wire serial mode */
0523     MXL_HYDRA_MPEG_MODE_SERIAL_3_WIRE,     /* MPEG 3 Wire serial mode */
0524     MXL_HYDRA_MPEG_MODE_SERIAL_2_WIRE,     /* MPEG 2 Wire serial mode */
0525     MXL_HYDRA_MPEG_MODE_PARALLEL           /* MPEG parallel mode - valid only for MxL581 */
0526 };
0527 
0528 enum MXL_HYDRA_MPEG_CLK_TYPE_E {
0529     MXL_HYDRA_MPEG_CLK_CONTINUOUS = 0, /* Continuous MPEG clock */
0530     MXL_HYDRA_MPEG_CLK_GAPPED,         /* Gapped (gated) MPEG clock */
0531 };
0532 
0533 enum MXL_HYDRA_MPEG_CLK_FMT_E {
0534     MXL_HYDRA_MPEG_ACTIVE_LOW = 0,
0535     MXL_HYDRA_MPEG_ACTIVE_HIGH,
0536 
0537     MXL_HYDRA_MPEG_CLK_NEGATIVE = 0,
0538     MXL_HYDRA_MPEG_CLK_POSITIVE,
0539 
0540     MXL_HYDRA_MPEG_CLK_IN_PHASE = 0,
0541     MXL_HYDRA_MPEG_CLK_INVERTED,
0542 };
0543 
0544 enum MXL_HYDRA_MPEG_CLK_PHASE_E {
0545     MXL_HYDRA_MPEG_CLK_PHASE_SHIFT_0_DEG = 0,
0546     MXL_HYDRA_MPEG_CLK_PHASE_SHIFT_90_DEG,
0547     MXL_HYDRA_MPEG_CLK_PHASE_SHIFT_180_DEG,
0548     MXL_HYDRA_MPEG_CLK_PHASE_SHIFT_270_DEG
0549 };
0550 
0551 enum MXL_HYDRA_MPEG_ERR_INDICATION_E {
0552     MXL_HYDRA_MPEG_ERR_REPLACE_SYNC = 0,
0553     MXL_HYDRA_MPEG_ERR_REPLACE_VALID,
0554     MXL_HYDRA_MPEG_ERR_INDICATION_DISABLED
0555 };
0556 
0557 struct MXL_HYDRA_MPEGOUT_PARAM_T {
0558     int                                  enable;               /* Enable or Disable MPEG OUT */
0559     enum MXL_HYDRA_MPEG_CLK_TYPE_E       mpeg_clk_type;          /* Continuous or gapped */
0560     enum MXL_HYDRA_MPEG_CLK_FMT_E        mpeg_clk_pol;           /* MPEG Clk polarity */
0561     u8                                   max_mpeg_clk_rate;       /* Max MPEG Clk rate (0 - 104 MHz, 139 MHz) */
0562     enum MXL_HYDRA_MPEG_CLK_PHASE_E      mpeg_clk_phase;         /* MPEG Clk phase */
0563     enum MXL_HYDRA_MPEG_DATA_FMT_E       lsb_or_msb_first;        /* LSB first or MSB first in TS transmission */
0564     enum MXL_HYDRA_MPEG_DATA_FMT_E       mpeg_sync_pulse_width;   /* MPEG SYNC pulse width (1-bit or 1-byte) */
0565     enum MXL_HYDRA_MPEG_CLK_FMT_E        mpeg_valid_pol;         /* MPEG VALID polarity */
0566     enum MXL_HYDRA_MPEG_CLK_FMT_E        mpeg_sync_pol;          /* MPEG SYNC polarity */
0567     enum MXL_HYDRA_MPEG_MODE_E           mpeg_mode;             /* config 4/3/2-wire serial or parallel TS out */
0568     enum MXL_HYDRA_MPEG_ERR_INDICATION_E mpeg_error_indication;  /* Enable or Disable MPEG error indication */
0569 };
0570 
0571 enum MXL_HYDRA_EXT_TS_IN_ID_E {
0572     MXL_HYDRA_EXT_TS_IN_0 = 0,
0573     MXL_HYDRA_EXT_TS_IN_1,
0574     MXL_HYDRA_EXT_TS_IN_2,
0575     MXL_HYDRA_EXT_TS_IN_3,
0576     MXL_HYDRA_EXT_TS_IN_MAX
0577 };
0578 
0579 enum MXL_HYDRA_TS_OUT_ID_E {
0580     MXL_HYDRA_TS_OUT_0 = 0,
0581     MXL_HYDRA_TS_OUT_1,
0582     MXL_HYDRA_TS_OUT_2,
0583     MXL_HYDRA_TS_OUT_3,
0584     MXL_HYDRA_TS_OUT_4,
0585     MXL_HYDRA_TS_OUT_5,
0586     MXL_HYDRA_TS_OUT_6,
0587     MXL_HYDRA_TS_OUT_7,
0588     MXL_HYDRA_TS_OUT_MAX
0589 };
0590 
0591 enum MXL_HYDRA_TS_DRIVE_STRENGTH_E {
0592     MXL_HYDRA_TS_DRIVE_STRENGTH_1X = 0,
0593     MXL_HYDRA_TS_DRIVE_STRENGTH_2X,
0594     MXL_HYDRA_TS_DRIVE_STRENGTH_3X,
0595     MXL_HYDRA_TS_DRIVE_STRENGTH_4X,
0596     MXL_HYDRA_TS_DRIVE_STRENGTH_5X,
0597     MXL_HYDRA_TS_DRIVE_STRENGTH_6X,
0598     MXL_HYDRA_TS_DRIVE_STRENGTH_7X,
0599     MXL_HYDRA_TS_DRIVE_STRENGTH_8X
0600 };
0601 
0602 enum MXL_HYDRA_DEVICE_E {
0603     MXL_HYDRA_DEVICE_581 = 0,
0604     MXL_HYDRA_DEVICE_584,
0605     MXL_HYDRA_DEVICE_585,
0606     MXL_HYDRA_DEVICE_544,
0607     MXL_HYDRA_DEVICE_561,
0608     MXL_HYDRA_DEVICE_TEST,
0609     MXL_HYDRA_DEVICE_582,
0610     MXL_HYDRA_DEVICE_541,
0611     MXL_HYDRA_DEVICE_568,
0612     MXL_HYDRA_DEVICE_542,
0613     MXL_HYDRA_DEVICE_541S,
0614     MXL_HYDRA_DEVICE_561S,
0615     MXL_HYDRA_DEVICE_581S,
0616     MXL_HYDRA_DEVICE_MAX
0617 };
0618 
0619 /* Demod IQ data */
0620 struct MXL_HYDRA_DEMOD_IQ_SRC_T {
0621     u32 demod_id;
0622     u32 source_of_iq; /* == 0, it means I/Q comes from Formatter
0623              * == 1, Legacy FEC
0624              * == 2, Frequency Recovery
0625              * == 3, NBC
0626              * == 4, CTL
0627              * == 5, EQ
0628              * == 6, FPGA
0629              */
0630 };
0631 
0632 struct MXL_HYDRA_DEMOD_ABORT_TUNE_T {
0633     u32 demod_id;
0634 };
0635 
0636 struct MXL_HYDRA_TUNER_CMD {
0637     u8 tuner_id;
0638     u8 enable;
0639 };
0640 
0641 /* Demod Para for Channel Tune */
0642 struct MXL_HYDRA_DEMOD_PARAM_T {
0643     u32 tuner_index;
0644     u32 demod_index;
0645     u32 frequency_in_hz;     /* Frequency */
0646     u32 standard;          /* one of MXL_HYDRA_BCAST_STD_E */
0647     u32 spectrum_inversion; /* Input : Spectrum inversion. */
0648     u32 roll_off;           /* rollOff (alpha) factor */
0649     u32 symbol_rate_in_hz;    /* Symbol rate */
0650     u32 pilots;            /* TRUE = pilots enabled */
0651     u32 modulation_scheme;  /* Input : Modulation Scheme is one of MXL_HYDRA_MODULATION_E */
0652     u32 fec_code_rate;       /* Input : Forward error correction rate. Is one of MXL_HYDRA_FEC_E */
0653     u32 max_carrier_offset_in_mhz; /* Maximum carrier freq offset in MHz. Same as freqSearchRangeKHz, but in unit of MHz. */
0654 };
0655 
0656 struct MXL_HYDRA_DEMOD_SCRAMBLE_CODE_T {
0657     u32 demod_index;
0658     u8 scramble_sequence[12]; /* scramble sequence */
0659     u32 scramble_code; /* scramble gold code */
0660 };
0661 
0662 struct MXL_INTR_CFG_T {
0663     u32 intr_type;
0664     u32 intr_duration_in_nano_secs;
0665     u32 intr_mask;
0666 };
0667 
0668 struct MXL_HYDRA_POWER_MODE_CMD {
0669     u8 power_mode; /* enumeration values are defined in MXL_HYDRA_PWR_MODE_E (device API.h) */
0670 };
0671 
0672 struct MXL_HYDRA_RF_WAKEUP_PARAM_T {
0673     u32 time_interval_in_seconds; /* in seconds */
0674     u32 tuner_index;
0675     s32 rssi_threshold;
0676 };
0677 
0678 struct MXL_HYDRA_RF_WAKEUP_CFG_T {
0679     u32 tuner_count;
0680     struct MXL_HYDRA_RF_WAKEUP_PARAM_T params;
0681 };
0682 
0683 enum MXL_HYDRA_AUX_CTRL_MODE_E {
0684     MXL_HYDRA_AUX_CTRL_MODE_FSK = 0, /* Select FSK controller */
0685     MXL_HYDRA_AUX_CTRL_MODE_DISEQC,  /* Select DiSEqC controller */
0686 };
0687 
0688 enum MXL_HYDRA_DISEQC_OPMODE_E {
0689     MXL_HYDRA_DISEQC_ENVELOPE_MODE = 0,
0690     MXL_HYDRA_DISEQC_TONE_MODE,
0691 };
0692 
0693 enum MXL_HYDRA_DISEQC_VER_E {
0694     MXL_HYDRA_DISEQC_1_X = 0, /* Config DiSEqC 1.x mode */
0695     MXL_HYDRA_DISEQC_2_X, /* Config DiSEqC 2.x mode */
0696     MXL_HYDRA_DISEQC_DISABLE /* Disable DiSEqC */
0697 };
0698 
0699 enum MXL_HYDRA_DISEQC_CARRIER_FREQ_E {
0700     MXL_HYDRA_DISEQC_CARRIER_FREQ_22KHZ = 0, /* DiSEqC signal frequency of 22 KHz */
0701     MXL_HYDRA_DISEQC_CARRIER_FREQ_33KHZ,     /* DiSEqC signal frequency of 33 KHz */
0702     MXL_HYDRA_DISEQC_CARRIER_FREQ_44KHZ      /* DiSEqC signal frequency of 44 KHz */
0703 };
0704 
0705 enum MXL_HYDRA_DISEQC_ID_E {
0706     MXL_HYDRA_DISEQC_ID_0 = 0,
0707     MXL_HYDRA_DISEQC_ID_1,
0708     MXL_HYDRA_DISEQC_ID_2,
0709     MXL_HYDRA_DISEQC_ID_3
0710 };
0711 
0712 enum MXL_HYDRA_FSK_OP_MODE_E {
0713     MXL_HYDRA_FSK_CFG_TYPE_39KPBS = 0, /* 39.0kbps */
0714     MXL_HYDRA_FSK_CFG_TYPE_39_017KPBS, /* 39.017kbps */
0715     MXL_HYDRA_FSK_CFG_TYPE_115_2KPBS   /* 115.2kbps */
0716 };
0717 
0718 struct MXL58X_DSQ_OP_MODE_T {
0719     u32 diseqc_id; /* DSQ 0, 1, 2 or 3 */
0720     u32 op_mode; /* Envelope mode (0) or internal tone mode (1) */
0721     u32 version; /* 0: 1.0, 1: 1.1, 2: Disable */
0722     u32 center_freq; /* 0: 22KHz, 1: 33KHz and 2: 44 KHz */
0723 };
0724 
0725 struct MXL_HYDRA_DISEQC_CFG_CONT_TONE_T {
0726     u32 diseqc_id;
0727     u32 cont_tone_flag; /* 1: Enable , 0: Disable */
0728 };