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