blob: 64aa864c5dbfff021380b46d3f1549e7965bf1c8 [file] [log] [blame]
Steven Toth52c99bd2008-05-01 04:57:01 -03001/*
Steven Toth5c1b2052008-05-01 07:04:09 -03002 * For the Realtek RTL chip RTL2831U
3 * Realtek Release Date: 2008-03-14, ver 080314
4 * Realtek version RTL2831 Linux driver version 080314
5 * ver 080314
6 *
7 * for linux kernel version 2.6.21.4 - 2.6.22-14
8 * support MXL5005s and MT2060 tuners (support tuner auto-detecting)
9 * support two IR types -- RC5 and NEC
10 *
11 * Known boards with Realtek RTL chip RTL2821U
12 * Freecom USB stick 14aa:0160 (version 4)
13 * Conceptronic CTVDIGRCU
14 *
15 * Copyright (c) 2008 Realtek
16 * Copyright (c) 2008 Jan Hoogenraad, Barnaby Shearer, Andy Hasper
17 * This code is placed under the terms of the GNU General Public License
18 *
19 * Released by Realtek under GPLv2.
20 * Thanks to Realtek for a lot of support we received !
21 *
22 * Revision: 080314 - original version
23 */
Steven Toth7f5c3af2008-05-01 06:51:36 -030024
Steven Toth5c1b2052008-05-01 07:04:09 -030025#include <linux/kernel.h>
26#include <linux/init.h>
27#include <linux/module.h>
28#include <linux/string.h>
29#include <linux/slab.h>
30#include <linux/delay.h>
31#include "dvb_frontend.h"
Steven Toth2637d5b2008-05-01 05:01:31 -030032#include "mxl5005s.h"
Steven Toth52c99bd2008-05-01 04:57:01 -030033
Steven Toth5c1b2052008-05-01 07:04:09 -030034static int debug;
Steven Toth85d220d2008-05-01 05:48:14 -030035
36#define dprintk(level, arg...) do { \
Steven Toth5c1b2052008-05-01 07:04:09 -030037 if (debug >= level) \
Steven Toth85d220d2008-05-01 05:48:14 -030038 printk(arg); \
39 } while (0)
40
41#define TUNER_REGS_NUM 104
42#define INITCTRL_NUM 40
43
44#ifdef _MXL_PRODUCTION
45#define CHCTRL_NUM 39
46#else
47#define CHCTRL_NUM 36
48#endif
49
50#define MXLCTRL_NUM 189
51#define MASTER_CONTROL_ADDR 9
52
Steven Toth5c1b2052008-05-01 07:04:09 -030053/* Enumeration of AGC Mode */
54typedef enum
55{
56 MXL_DUAL_AGC = 0,
57 MXL_SINGLE_AGC
58} AGC_Mode;
59
Steven Toth85d220d2008-05-01 05:48:14 -030060/* Enumeration of Master Control Register State */
61typedef enum
62{
63 MC_LOAD_START = 1,
64 MC_POWER_DOWN,
65 MC_SYNTH_RESET,
66 MC_SEQ_OFF
67} Master_Control_State;
68
Steven Toth5c1b2052008-05-01 07:04:09 -030069/* Enumeration of MXL5005 Tuner Mode */
70typedef enum
71{
72 MXL_ANALOG_MODE = 0,
73 MXL_DIGITAL_MODE
74} Tuner_Mode;
75
76/* Enumeration of MXL5005 Tuner IF Mode */
77typedef enum
78{
79 MXL_ZERO_IF = 0,
80 MXL_LOW_IF
81} Tuner_IF_Mode;
82
83/* Enumeration of MXL5005 Tuner Clock Out Mode */
84typedef enum
85{
86 MXL_CLOCK_OUT_DISABLE = 0,
87 MXL_CLOCK_OUT_ENABLE
88} Tuner_Clock_Out;
89
90/* Enumeration of MXL5005 Tuner Div Out Mode */
91typedef enum
92{
93 MXL_DIV_OUT_1 = 0,
94 MXL_DIV_OUT_4
95
96} Tuner_Div_Out;
97
98/* Enumeration of MXL5005 Tuner Pull-up Cap Select Mode */
99typedef enum
100{
101 MXL_CAP_SEL_DISABLE = 0,
102 MXL_CAP_SEL_ENABLE
103
104} Tuner_Cap_Select;
105
106/* Enumeration of MXL5005 Tuner RSSI Mode */
107typedef enum
108{
109 MXL_RSSI_DISABLE = 0,
110 MXL_RSSI_ENABLE
111
112} Tuner_RSSI;
113
Steven Toth85d220d2008-05-01 05:48:14 -0300114/* Enumeration of MXL5005 Tuner Modulation Type */
115typedef enum
116{
117 MXL_DEFAULT_MODULATION = 0,
118 MXL_DVBT,
119 MXL_ATSC,
120 MXL_QAM,
121 MXL_ANALOG_CABLE,
122 MXL_ANALOG_OTA
123} Tuner_Modu_Type;
124
Steven Toth5c1b2052008-05-01 07:04:09 -0300125/* Enumeration of MXL5005 Tuner Tracking Filter Type */
126typedef enum
127{
128 MXL_TF_DEFAULT = 0,
129 MXL_TF_OFF,
130 MXL_TF_C,
131 MXL_TF_C_H,
132 MXL_TF_D,
133 MXL_TF_D_L,
134 MXL_TF_E,
135 MXL_TF_F,
136 MXL_TF_E_2,
137 MXL_TF_E_NA,
138 MXL_TF_G
139} Tuner_TF_Type;
140
Steven Toth85d220d2008-05-01 05:48:14 -0300141/* MXL5005 Tuner Register Struct */
142typedef struct _TunerReg_struct
143{
144 u16 Reg_Num; /* Tuner Register Address */
145 u16 Reg_Val; /* Current sofware programmed value waiting to be writen */
146} TunerReg_struct;
147
148typedef enum
149{
150 /* Initialization Control Names */
151 DN_IQTN_AMP_CUT = 1, /* 1 */
152 BB_MODE, /* 2 */
153 BB_BUF, /* 3 */
154 BB_BUF_OA, /* 4 */
155 BB_ALPF_BANDSELECT, /* 5 */
156 BB_IQSWAP, /* 6 */
157 BB_DLPF_BANDSEL, /* 7 */
158 RFSYN_CHP_GAIN, /* 8 */
159 RFSYN_EN_CHP_HIGAIN, /* 9 */
160 AGC_IF, /* 10 */
161 AGC_RF, /* 11 */
162 IF_DIVVAL, /* 12 */
163 IF_VCO_BIAS, /* 13 */
164 CHCAL_INT_MOD_IF, /* 14 */
165 CHCAL_FRAC_MOD_IF, /* 15 */
166 DRV_RES_SEL, /* 16 */
167 I_DRIVER, /* 17 */
168 EN_AAF, /* 18 */
169 EN_3P, /* 19 */
170 EN_AUX_3P, /* 20 */
171 SEL_AAF_BAND, /* 21 */
172 SEQ_ENCLK16_CLK_OUT, /* 22 */
173 SEQ_SEL4_16B, /* 23 */
174 XTAL_CAPSELECT, /* 24 */
175 IF_SEL_DBL, /* 25 */
176 RFSYN_R_DIV, /* 26 */
177 SEQ_EXTSYNTHCALIF, /* 27 */
178 SEQ_EXTDCCAL, /* 28 */
179 AGC_EN_RSSI, /* 29 */
180 RFA_ENCLKRFAGC, /* 30 */
181 RFA_RSSI_REFH, /* 31 */
182 RFA_RSSI_REF, /* 32 */
183 RFA_RSSI_REFL, /* 33 */
184 RFA_FLR, /* 34 */
185 RFA_CEIL, /* 35 */
186 SEQ_EXTIQFSMPULSE, /* 36 */
187 OVERRIDE_1, /* 37 */
188 BB_INITSTATE_DLPF_TUNE, /* 38 */
189 TG_R_DIV, /* 39 */
190 EN_CHP_LIN_B, /* 40 */
191
192 /* Channel Change Control Names */
193 DN_POLY = 51, /* 51 */
194 DN_RFGAIN, /* 52 */
195 DN_CAP_RFLPF, /* 53 */
196 DN_EN_VHFUHFBAR, /* 54 */
197 DN_GAIN_ADJUST, /* 55 */
198 DN_IQTNBUF_AMP, /* 56 */
199 DN_IQTNGNBFBIAS_BST, /* 57 */
200 RFSYN_EN_OUTMUX, /* 58 */
201 RFSYN_SEL_VCO_OUT, /* 59 */
202 RFSYN_SEL_VCO_HI, /* 60 */
203 RFSYN_SEL_DIVM, /* 61 */
204 RFSYN_RF_DIV_BIAS, /* 62 */
205 DN_SEL_FREQ, /* 63 */
206 RFSYN_VCO_BIAS, /* 64 */
207 CHCAL_INT_MOD_RF, /* 65 */
208 CHCAL_FRAC_MOD_RF, /* 66 */
209 RFSYN_LPF_R, /* 67 */
210 CHCAL_EN_INT_RF, /* 68 */
211 TG_LO_DIVVAL, /* 69 */
212 TG_LO_SELVAL, /* 70 */
213 TG_DIV_VAL, /* 71 */
214 TG_VCO_BIAS, /* 72 */
215 SEQ_EXTPOWERUP, /* 73 */
216 OVERRIDE_2, /* 74 */
217 OVERRIDE_3, /* 75 */
218 OVERRIDE_4, /* 76 */
219 SEQ_FSM_PULSE, /* 77 */
220 GPIO_4B, /* 78 */
221 GPIO_3B, /* 79 */
222 GPIO_4, /* 80 */
223 GPIO_3, /* 81 */
224 GPIO_1B, /* 82 */
225 DAC_A_ENABLE, /* 83 */
226 DAC_B_ENABLE, /* 84 */
227 DAC_DIN_A, /* 85 */
228 DAC_DIN_B, /* 86 */
229#ifdef _MXL_PRODUCTION
230 RFSYN_EN_DIV, /* 87 */
231 RFSYN_DIVM, /* 88 */
232 DN_BYPASS_AGC_I2C /* 89 */
233#endif
234} MXL5005_ControlName;
235
236/*
237 * The following context is source code provided by MaxLinear.
238 * MaxLinear source code - Common_MXL.h (?)
239 */
240
241/* Constants */
242#define MXL5005S_REG_WRITING_TABLE_LEN_MAX 104
243#define MXL5005S_LATCH_BYTE 0xfe
244
245/* Register address, MSB, and LSB */
246#define MXL5005S_BB_IQSWAP_ADDR 59
247#define MXL5005S_BB_IQSWAP_MSB 0
248#define MXL5005S_BB_IQSWAP_LSB 0
249
250#define MXL5005S_BB_DLPF_BANDSEL_ADDR 53
251#define MXL5005S_BB_DLPF_BANDSEL_MSB 4
252#define MXL5005S_BB_DLPF_BANDSEL_LSB 3
253
254/* Standard modes */
255enum
256{
257 MXL5005S_STANDARD_DVBT,
258 MXL5005S_STANDARD_ATSC,
259};
260#define MXL5005S_STANDARD_MODE_NUM 2
261
262/* Bandwidth modes */
263enum
264{
265 MXL5005S_BANDWIDTH_6MHZ = 6000000,
266 MXL5005S_BANDWIDTH_7MHZ = 7000000,
267 MXL5005S_BANDWIDTH_8MHZ = 8000000,
268};
269#define MXL5005S_BANDWIDTH_MODE_NUM 3
270
Steven Toth5c1b2052008-05-01 07:04:09 -0300271/* Top modes */
272enum
273{
274 MXL5005S_TOP_5P5 = 55,
275 MXL5005S_TOP_7P2 = 72,
276 MXL5005S_TOP_9P2 = 92,
277 MXL5005S_TOP_11P0 = 110,
278 MXL5005S_TOP_12P9 = 129,
279 MXL5005S_TOP_14P7 = 147,
280 MXL5005S_TOP_16P8 = 168,
281 MXL5005S_TOP_19P4 = 194,
282 MXL5005S_TOP_21P2 = 212,
283 MXL5005S_TOP_23P2 = 232,
284 MXL5005S_TOP_25P2 = 252,
285 MXL5005S_TOP_27P1 = 271,
286 MXL5005S_TOP_29P2 = 292,
287 MXL5005S_TOP_31P7 = 317,
288 MXL5005S_TOP_34P9 = 349,
289};
290
291/* IF output load */
292enum
293{
294 MXL5005S_IF_OUTPUT_LOAD_200_OHM = 200,
295 MXL5005S_IF_OUTPUT_LOAD_300_OHM = 300,
296};
297
Steven Toth3935c252008-05-01 05:45:44 -0300298/* MXL5005 Tuner Control Struct */
299typedef struct _TunerControl_struct {
300 u16 Ctrl_Num; /* Control Number */
301 u16 size; /* Number of bits to represent Value */
302 u16 addr[25]; /* Array of Tuner Register Address for each bit position */
303 u16 bit[25]; /* Array of bit position in Register Address for each bit position */
304 u16 val[25]; /* Binary representation of Value */
305} TunerControl_struct;
Steven Toth52c99bd2008-05-01 04:57:01 -0300306
Steven Toth3935c252008-05-01 05:45:44 -0300307/* MXL5005 Tuner Struct */
308struct mxl5005s_state
Steven Toth52c99bd2008-05-01 04:57:01 -0300309{
Steven Toth3935c252008-05-01 05:45:44 -0300310 u8 Mode; /* 0: Analog Mode ; 1: Digital Mode */
311 u8 IF_Mode; /* for Analog Mode, 0: zero IF; 1: low IF */
312 u32 Chan_Bandwidth; /* filter channel bandwidth (6, 7, 8) */
313 u32 IF_OUT; /* Desired IF Out Frequency */
314 u16 IF_OUT_LOAD; /* IF Out Load Resistor (200/300 Ohms) */
315 u32 RF_IN; /* RF Input Frequency */
316 u32 Fxtal; /* XTAL Frequency */
317 u8 AGC_Mode; /* AGC Mode 0: Dual AGC; 1: Single AGC */
318 u16 TOP; /* Value: take over point */
319 u8 CLOCK_OUT; /* 0: turn off clock out; 1: turn on clock out */
320 u8 DIV_OUT; /* 4MHz or 16MHz */
321 u8 CAPSELECT; /* 0: disable On-Chip pulling cap; 1: enable */
322 u8 EN_RSSI; /* 0: disable RSSI; 1: enable RSSI */
323 u8 Mod_Type; /* Modulation Type; */
324 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
325 u8 TF_Type; /* Tracking Filter Type */
326 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
Steven Toth52c99bd2008-05-01 04:57:01 -0300327
Steven Toth3935c252008-05-01 05:45:44 -0300328 /* Calculated Settings */
329 u32 RF_LO; /* Synth RF LO Frequency */
330 u32 IF_LO; /* Synth IF LO Frequency */
331 u32 TG_LO; /* Synth TG_LO Frequency */
Steven Toth52c99bd2008-05-01 04:57:01 -0300332
Steven Toth3935c252008-05-01 05:45:44 -0300333 /* Pointers to ControlName Arrays */
334 u16 Init_Ctrl_Num; /* Number of INIT Control Names */
335 TunerControl_struct
336 Init_Ctrl[INITCTRL_NUM]; /* INIT Control Names Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300337
Steven Toth3935c252008-05-01 05:45:44 -0300338 u16 CH_Ctrl_Num; /* Number of CH Control Names */
339 TunerControl_struct
340 CH_Ctrl[CHCTRL_NUM]; /* CH Control Name Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300341
Steven Toth3935c252008-05-01 05:45:44 -0300342 u16 MXL_Ctrl_Num; /* Number of MXL Control Names */
343 TunerControl_struct
344 MXL_Ctrl[MXLCTRL_NUM]; /* MXL Control Name Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300345
Steven Toth3935c252008-05-01 05:45:44 -0300346 /* Pointer to Tuner Register Array */
347 u16 TunerRegs_Num; /* Number of Tuner Registers */
348 TunerReg_struct
349 TunerRegs[TUNER_REGS_NUM]; /* Tuner Register Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300350
Steven Toth85d220d2008-05-01 05:48:14 -0300351 /* Linux driver framework specific */
Steven Toth5c1b2052008-05-01 07:04:09 -0300352 const struct mxl5005s_config *config;
353
Steven Toth85d220d2008-05-01 05:48:14 -0300354 struct dvb_frontend *frontend;
355 struct i2c_adapter *i2c;
Steven Toth3935c252008-05-01 05:45:44 -0300356};
Steven Toth52c99bd2008-05-01 04:57:01 -0300357
Steven Toth5c1b2052008-05-01 07:04:09 -0300358// funcs
Steven Toth85d220d2008-05-01 05:48:14 -0300359u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value);
360u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value);
361u16 MXL_GetMasterControl(u8 *MasterReg, int state);
362void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal);
363u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal, int *count);
364u32 MXL_Ceiling(u32 value, u32 resolution);
365u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal);
366u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal);
367u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, u32 value, u16 controlGroup);
368u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val);
369u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count);
370u32 MXL_GetXtalInt(u32 Xtal_Freq);
371u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq);
372void MXL_SynthIFLO_Calc(struct dvb_frontend *fe);
373void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe);
374u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal, int *count);
Steven Toth5c1b2052008-05-01 07:04:09 -0300375int mxl5005s_SetRegsWithTable(struct dvb_frontend *fe, u8 *pAddrTable, u8 *pByteTable, int TableLen);
Steven Toth85d220d2008-05-01 05:48:14 -0300376u16 MXL_IFSynthInit(struct dvb_frontend *fe);
Steven Toth5c1b2052008-05-01 07:04:09 -0300377static int mxl5005s_init2(struct dvb_frontend *fe);
Steven Toth52c99bd2008-05-01 04:57:01 -0300378
Steven Toth85d220d2008-05-01 05:48:14 -0300379int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz)
Steven Toth52c99bd2008-05-01 04:57:01 -0300380{
Steven Toth85d220d2008-05-01 05:48:14 -0300381 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth5c1b2052008-05-01 07:04:09 -0300382 u8 AgcMasterByte = state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300383 unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
384 unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
385 int TableLen;
386
Steven Toth85d220d2008-05-01 05:48:14 -0300387 u32 IfDivval;
Steven Toth52c99bd2008-05-01 04:57:01 -0300388 unsigned char MasterControlByte;
389
Steven Toth85d220d2008-05-01 05:48:14 -0300390 dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300391
392 // Set MxL5005S tuner RF frequency according to MxL5005S tuner example code.
393
394 // Tuner RF frequency setting stage 0
395 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET) ;
396 AddrTable[0] = MASTER_CONTROL_ADDR;
Steven Toth85d220d2008-05-01 05:48:14 -0300397 ByteTable[0] |= state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300398
Steven Toth5c1b2052008-05-01 07:04:09 -0300399 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300400
401 // Tuner RF frequency setting stage 1
Steven Toth85d220d2008-05-01 05:48:14 -0300402 MXL_TuneRF(fe, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300403
Steven Toth85d220d2008-05-01 05:48:14 -0300404 MXL_ControlRead(fe, IF_DIVVAL, &IfDivval);
Steven Toth52c99bd2008-05-01 04:57:01 -0300405
Steven Toth85d220d2008-05-01 05:48:14 -0300406 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0);
407 MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1);
408 MXL_ControlWrite(fe, IF_DIVVAL, 8);
409 MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen) ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300410
411 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
412 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Toth5c1b2052008-05-01 07:04:09 -0300413 ByteTable[TableLen] = MasterControlByte | AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300414 TableLen += 1;
415
Steven Toth5c1b2052008-05-01 07:04:09 -0300416 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300417
418 // Wait 30 ms.
Steven Toth5c1b2052008-05-01 07:04:09 -0300419 msleep(30);
Steven Toth52c99bd2008-05-01 04:57:01 -0300420
421 // Tuner RF frequency setting stage 2
Steven Toth85d220d2008-05-01 05:48:14 -0300422 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1) ;
423 MXL_ControlWrite(fe, IF_DIVVAL, IfDivval) ;
424 MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen) ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300425
426 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
427 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Toth5c1b2052008-05-01 07:04:09 -0300428 ByteTable[TableLen] = MasterControlByte | AgcMasterByte ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300429 TableLen += 1;
430
Steven Toth5c1b2052008-05-01 07:04:09 -0300431 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, TableLen);
Steven Toth8c66a192008-05-01 06:35:48 -0300432
Steven Toth85d220d2008-05-01 05:48:14 -0300433 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300434}
435
Steven Toth5c1b2052008-05-01 07:04:09 -0300436/* Write a single byte to a single reg */
437static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val)
438{
439 struct mxl5005s_state *state = fe->tuner_priv;
440 u8 buf[2] = { reg, val };
441 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
442 .buf = buf, .len = 2 };
443
444 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
445 printk(KERN_WARNING "mxl5005s I2C write failed\n");
446 return -EREMOTEIO;
447 }
448 return 0;
449}
450
451/* Write a word to a single reg */
452static int mxl5005s_writereg16(struct dvb_frontend *fe, u8 reg, u16 val)
453{
454 struct mxl5005s_state *state = fe->tuner_priv;
455 u8 buf[3] = { reg, val >> 8 , val & 0xff };
456 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
457 .buf = buf, .len = 3 };
458
459 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
460 printk(KERN_WARNING "mxl5005s I2C write16 failed\n");
461 return -EREMOTEIO;
462 }
463 return 0;
464}
465
466int mxl5005s_SetRegsWithTable(struct dvb_frontend *fe, u8 *pAddrTable, u8 *pByteTable, int TableLen)
467{
468 int i, ret;
469 u8 end_two_bytes_buf[]={ 0 , 0 };
470
471 for( i = 0 ; i < TableLen - 1 ; i++)
472 {
473 ret = mxl5005s_writereg(fe, pAddrTable[i], pByteTable[i]);
474 if (!ret)
475 return ret;
476 }
477
478 end_two_bytes_buf[0] = pByteTable[i];
479 end_two_bytes_buf[1] = MXL5005S_LATCH_BYTE;
480
481 ret = mxl5005s_writereg16(fe, pAddrTable[i], (end_two_bytes_buf[0] << 8) | end_two_bytes_buf[1]);
482
483 return ret;
484}
485
486int mxl5005s_SetRegMaskBits(struct dvb_frontend *fe,
487 unsigned char RegAddr,
488 unsigned char Msb,
489 unsigned char Lsb,
490 const unsigned char WritingValue
491 )
492{
493 int i;
494
495 unsigned char Mask;
496 unsigned char Shift;
497 unsigned char RegByte;
498
499 /* Generate mask and shift according to MSB and LSB. */
500 Mask = 0;
501 for(i = Lsb; i < (unsigned char)(Msb + 1); i++)
502 Mask |= 0x1 << i;
503
504 Shift = Lsb;
505
506 /* Get tuner register byte according to register adddress. */
507 MXL_RegRead(fe, RegAddr, &RegByte);
508
509 /* Reserve register byte unmask bit with mask and inlay writing value into it. */
510 RegByte &= ~Mask;
511 RegByte |= (WritingValue << Shift) & Mask;
512
513 /* Update tuner register byte table. */
514 MXL_RegWrite(fe, RegAddr, RegByte);
515
516 /* Write tuner register byte with writing byte. */
517 return mxl5005s_SetRegsWithTable(fe, &RegAddr, &RegByte, 1);
518}
519
520// The following context is source code provided by MaxLinear.
521// MaxLinear source code - MXL5005_Initialize.cpp
522// DONE
Steven Toth3935c252008-05-01 05:45:44 -0300523u16 MXL5005_RegisterInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300524{
Steven Toth85d220d2008-05-01 05:48:14 -0300525 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300526 state->TunerRegs_Num = TUNER_REGS_NUM ;
527// state->TunerRegs = (TunerReg_struct *) calloc( TUNER_REGS_NUM, sizeof(TunerReg_struct) ) ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300528
Steven Toth3935c252008-05-01 05:45:44 -0300529 state->TunerRegs[0].Reg_Num = 9 ;
530 state->TunerRegs[0].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300531
Steven Toth3935c252008-05-01 05:45:44 -0300532 state->TunerRegs[1].Reg_Num = 11 ;
533 state->TunerRegs[1].Reg_Val = 0x19 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300534
Steven Toth3935c252008-05-01 05:45:44 -0300535 state->TunerRegs[2].Reg_Num = 12 ;
536 state->TunerRegs[2].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300537
Steven Toth3935c252008-05-01 05:45:44 -0300538 state->TunerRegs[3].Reg_Num = 13 ;
539 state->TunerRegs[3].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300540
Steven Toth3935c252008-05-01 05:45:44 -0300541 state->TunerRegs[4].Reg_Num = 14 ;
542 state->TunerRegs[4].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300543
Steven Toth3935c252008-05-01 05:45:44 -0300544 state->TunerRegs[5].Reg_Num = 15 ;
545 state->TunerRegs[5].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300546
Steven Toth3935c252008-05-01 05:45:44 -0300547 state->TunerRegs[6].Reg_Num = 16 ;
548 state->TunerRegs[6].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300549
Steven Toth3935c252008-05-01 05:45:44 -0300550 state->TunerRegs[7].Reg_Num = 17 ;
551 state->TunerRegs[7].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300552
Steven Toth3935c252008-05-01 05:45:44 -0300553 state->TunerRegs[8].Reg_Num = 18 ;
554 state->TunerRegs[8].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300555
Steven Toth3935c252008-05-01 05:45:44 -0300556 state->TunerRegs[9].Reg_Num = 19 ;
557 state->TunerRegs[9].Reg_Val = 0x34 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300558
Steven Toth3935c252008-05-01 05:45:44 -0300559 state->TunerRegs[10].Reg_Num = 21 ;
560 state->TunerRegs[10].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300561
Steven Toth3935c252008-05-01 05:45:44 -0300562 state->TunerRegs[11].Reg_Num = 22 ;
563 state->TunerRegs[11].Reg_Val = 0x6B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300564
Steven Toth3935c252008-05-01 05:45:44 -0300565 state->TunerRegs[12].Reg_Num = 23 ;
566 state->TunerRegs[12].Reg_Val = 0x35 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300567
Steven Toth3935c252008-05-01 05:45:44 -0300568 state->TunerRegs[13].Reg_Num = 24 ;
569 state->TunerRegs[13].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300570
Steven Toth3935c252008-05-01 05:45:44 -0300571 state->TunerRegs[14].Reg_Num = 25 ;
572 state->TunerRegs[14].Reg_Val = 0x3E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300573
Steven Toth3935c252008-05-01 05:45:44 -0300574 state->TunerRegs[15].Reg_Num = 26 ;
575 state->TunerRegs[15].Reg_Val = 0x82 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300576
Steven Toth3935c252008-05-01 05:45:44 -0300577 state->TunerRegs[16].Reg_Num = 31 ;
578 state->TunerRegs[16].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300579
Steven Toth3935c252008-05-01 05:45:44 -0300580 state->TunerRegs[17].Reg_Num = 32 ;
581 state->TunerRegs[17].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300582
Steven Toth3935c252008-05-01 05:45:44 -0300583 state->TunerRegs[18].Reg_Num = 33 ;
584 state->TunerRegs[18].Reg_Val = 0x53 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300585
Steven Toth3935c252008-05-01 05:45:44 -0300586 state->TunerRegs[19].Reg_Num = 34 ;
587 state->TunerRegs[19].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300588
Steven Toth3935c252008-05-01 05:45:44 -0300589 state->TunerRegs[20].Reg_Num = 35 ;
590 state->TunerRegs[20].Reg_Val = 0xC9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300591
Steven Toth3935c252008-05-01 05:45:44 -0300592 state->TunerRegs[21].Reg_Num = 36 ;
593 state->TunerRegs[21].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300594
Steven Toth3935c252008-05-01 05:45:44 -0300595 state->TunerRegs[22].Reg_Num = 37 ;
596 state->TunerRegs[22].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300597
Steven Toth3935c252008-05-01 05:45:44 -0300598 state->TunerRegs[23].Reg_Num = 41 ;
599 state->TunerRegs[23].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300600
Steven Toth3935c252008-05-01 05:45:44 -0300601 state->TunerRegs[24].Reg_Num = 42 ;
602 state->TunerRegs[24].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300603
Steven Toth3935c252008-05-01 05:45:44 -0300604 state->TunerRegs[25].Reg_Num = 43 ;
605 state->TunerRegs[25].Reg_Val = 0x43 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300606
Steven Toth3935c252008-05-01 05:45:44 -0300607 state->TunerRegs[26].Reg_Num = 44 ;
608 state->TunerRegs[26].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300609
Steven Toth3935c252008-05-01 05:45:44 -0300610 state->TunerRegs[27].Reg_Num = 45 ;
611 state->TunerRegs[27].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300612
Steven Toth3935c252008-05-01 05:45:44 -0300613 state->TunerRegs[28].Reg_Num = 46 ;
614 state->TunerRegs[28].Reg_Val = 0x88 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300615
Steven Toth3935c252008-05-01 05:45:44 -0300616 state->TunerRegs[29].Reg_Num = 47 ;
617 state->TunerRegs[29].Reg_Val = 0x86 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300618
Steven Toth3935c252008-05-01 05:45:44 -0300619 state->TunerRegs[30].Reg_Num = 48 ;
620 state->TunerRegs[30].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300621
Steven Toth3935c252008-05-01 05:45:44 -0300622 state->TunerRegs[31].Reg_Num = 49 ;
623 state->TunerRegs[31].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300624
Steven Toth3935c252008-05-01 05:45:44 -0300625 state->TunerRegs[32].Reg_Num = 53 ;
626 state->TunerRegs[32].Reg_Val = 0x94 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300627
Steven Toth3935c252008-05-01 05:45:44 -0300628 state->TunerRegs[33].Reg_Num = 54 ;
629 state->TunerRegs[33].Reg_Val = 0xFA ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300630
Steven Toth3935c252008-05-01 05:45:44 -0300631 state->TunerRegs[34].Reg_Num = 55 ;
632 state->TunerRegs[34].Reg_Val = 0x92 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300633
Steven Toth3935c252008-05-01 05:45:44 -0300634 state->TunerRegs[35].Reg_Num = 56 ;
635 state->TunerRegs[35].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300636
Steven Toth3935c252008-05-01 05:45:44 -0300637 state->TunerRegs[36].Reg_Num = 57 ;
638 state->TunerRegs[36].Reg_Val = 0x41 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300639
Steven Toth3935c252008-05-01 05:45:44 -0300640 state->TunerRegs[37].Reg_Num = 58 ;
641 state->TunerRegs[37].Reg_Val = 0xDB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300642
Steven Toth3935c252008-05-01 05:45:44 -0300643 state->TunerRegs[38].Reg_Num = 59 ;
644 state->TunerRegs[38].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300645
Steven Toth3935c252008-05-01 05:45:44 -0300646 state->TunerRegs[39].Reg_Num = 60 ;
647 state->TunerRegs[39].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300648
Steven Toth3935c252008-05-01 05:45:44 -0300649 state->TunerRegs[40].Reg_Num = 61 ;
650 state->TunerRegs[40].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300651
Steven Toth3935c252008-05-01 05:45:44 -0300652 state->TunerRegs[41].Reg_Num = 62 ;
653 state->TunerRegs[41].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300654
Steven Toth3935c252008-05-01 05:45:44 -0300655 state->TunerRegs[42].Reg_Num = 65 ;
656 state->TunerRegs[42].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300657
Steven Toth3935c252008-05-01 05:45:44 -0300658 state->TunerRegs[43].Reg_Num = 66 ;
659 state->TunerRegs[43].Reg_Val = 0xE4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300660
Steven Toth3935c252008-05-01 05:45:44 -0300661 state->TunerRegs[44].Reg_Num = 67 ;
662 state->TunerRegs[44].Reg_Val = 0x90 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300663
Steven Toth3935c252008-05-01 05:45:44 -0300664 state->TunerRegs[45].Reg_Num = 68 ;
665 state->TunerRegs[45].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300666
Steven Toth3935c252008-05-01 05:45:44 -0300667 state->TunerRegs[46].Reg_Num = 69 ;
668 state->TunerRegs[46].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300669
Steven Toth3935c252008-05-01 05:45:44 -0300670 state->TunerRegs[47].Reg_Num = 70 ;
671 state->TunerRegs[47].Reg_Val = 0x50 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300672
Steven Toth3935c252008-05-01 05:45:44 -0300673 state->TunerRegs[48].Reg_Num = 71 ;
674 state->TunerRegs[48].Reg_Val = 0x06 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300675
Steven Toth3935c252008-05-01 05:45:44 -0300676 state->TunerRegs[49].Reg_Num = 72 ;
677 state->TunerRegs[49].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300678
Steven Toth3935c252008-05-01 05:45:44 -0300679 state->TunerRegs[50].Reg_Num = 73 ;
680 state->TunerRegs[50].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300681
Steven Toth3935c252008-05-01 05:45:44 -0300682 state->TunerRegs[51].Reg_Num = 76 ;
683 state->TunerRegs[51].Reg_Val = 0xBB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300684
Steven Toth3935c252008-05-01 05:45:44 -0300685 state->TunerRegs[52].Reg_Num = 77 ;
686 state->TunerRegs[52].Reg_Val = 0x13 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300687
Steven Toth3935c252008-05-01 05:45:44 -0300688 state->TunerRegs[53].Reg_Num = 81 ;
689 state->TunerRegs[53].Reg_Val = 0x04 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300690
Steven Toth3935c252008-05-01 05:45:44 -0300691 state->TunerRegs[54].Reg_Num = 82 ;
692 state->TunerRegs[54].Reg_Val = 0x75 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300693
Steven Toth3935c252008-05-01 05:45:44 -0300694 state->TunerRegs[55].Reg_Num = 83 ;
695 state->TunerRegs[55].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300696
Steven Toth3935c252008-05-01 05:45:44 -0300697 state->TunerRegs[56].Reg_Num = 84 ;
698 state->TunerRegs[56].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300699
Steven Toth3935c252008-05-01 05:45:44 -0300700 state->TunerRegs[57].Reg_Num = 85 ;
701 state->TunerRegs[57].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300702
Steven Toth3935c252008-05-01 05:45:44 -0300703 state->TunerRegs[58].Reg_Num = 91 ;
704 state->TunerRegs[58].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300705
Steven Toth3935c252008-05-01 05:45:44 -0300706 state->TunerRegs[59].Reg_Num = 92 ;
707 state->TunerRegs[59].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300708
Steven Toth3935c252008-05-01 05:45:44 -0300709 state->TunerRegs[60].Reg_Num = 93 ;
710 state->TunerRegs[60].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300711
Steven Toth3935c252008-05-01 05:45:44 -0300712 state->TunerRegs[61].Reg_Num = 94 ;
713 state->TunerRegs[61].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300714
Steven Toth3935c252008-05-01 05:45:44 -0300715 state->TunerRegs[62].Reg_Num = 95 ;
716 state->TunerRegs[62].Reg_Val = 0x0C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300717
Steven Toth3935c252008-05-01 05:45:44 -0300718 state->TunerRegs[63].Reg_Num = 96 ;
719 state->TunerRegs[63].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300720
Steven Toth3935c252008-05-01 05:45:44 -0300721 state->TunerRegs[64].Reg_Num = 97 ;
722 state->TunerRegs[64].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300723
Steven Toth3935c252008-05-01 05:45:44 -0300724 state->TunerRegs[65].Reg_Num = 98 ;
725 state->TunerRegs[65].Reg_Val = 0xE2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300726
Steven Toth3935c252008-05-01 05:45:44 -0300727 state->TunerRegs[66].Reg_Num = 99 ;
728 state->TunerRegs[66].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300729
Steven Toth3935c252008-05-01 05:45:44 -0300730 state->TunerRegs[67].Reg_Num = 100 ;
731 state->TunerRegs[67].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300732
Steven Toth3935c252008-05-01 05:45:44 -0300733 state->TunerRegs[68].Reg_Num = 101 ;
734 state->TunerRegs[68].Reg_Val = 0x12 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300735
Steven Toth3935c252008-05-01 05:45:44 -0300736 state->TunerRegs[69].Reg_Num = 102 ;
737 state->TunerRegs[69].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300738
Steven Toth3935c252008-05-01 05:45:44 -0300739 state->TunerRegs[70].Reg_Num = 103 ;
740 state->TunerRegs[70].Reg_Val = 0x32 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300741
Steven Toth3935c252008-05-01 05:45:44 -0300742 state->TunerRegs[71].Reg_Num = 104 ;
743 state->TunerRegs[71].Reg_Val = 0xB4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300744
Steven Toth3935c252008-05-01 05:45:44 -0300745 state->TunerRegs[72].Reg_Num = 105 ;
746 state->TunerRegs[72].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300747
Steven Toth3935c252008-05-01 05:45:44 -0300748 state->TunerRegs[73].Reg_Num = 106 ;
749 state->TunerRegs[73].Reg_Val = 0x83 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300750
Steven Toth3935c252008-05-01 05:45:44 -0300751 state->TunerRegs[74].Reg_Num = 107 ;
752 state->TunerRegs[74].Reg_Val = 0x84 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300753
Steven Toth3935c252008-05-01 05:45:44 -0300754 state->TunerRegs[75].Reg_Num = 108 ;
755 state->TunerRegs[75].Reg_Val = 0x9C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300756
Steven Toth3935c252008-05-01 05:45:44 -0300757 state->TunerRegs[76].Reg_Num = 109 ;
758 state->TunerRegs[76].Reg_Val = 0x02 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300759
Steven Toth3935c252008-05-01 05:45:44 -0300760 state->TunerRegs[77].Reg_Num = 110 ;
761 state->TunerRegs[77].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300762
Steven Toth3935c252008-05-01 05:45:44 -0300763 state->TunerRegs[78].Reg_Num = 111 ;
764 state->TunerRegs[78].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300765
Steven Toth3935c252008-05-01 05:45:44 -0300766 state->TunerRegs[79].Reg_Num = 112 ;
767 state->TunerRegs[79].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300768
Steven Toth3935c252008-05-01 05:45:44 -0300769 state->TunerRegs[80].Reg_Num = 131 ;
770 state->TunerRegs[80].Reg_Val = 0x8A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300771
Steven Toth3935c252008-05-01 05:45:44 -0300772 state->TunerRegs[81].Reg_Num = 132 ;
773 state->TunerRegs[81].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300774
Steven Toth3935c252008-05-01 05:45:44 -0300775 state->TunerRegs[82].Reg_Num = 133 ;
776 state->TunerRegs[82].Reg_Val = 0x24 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300777
Steven Toth3935c252008-05-01 05:45:44 -0300778 state->TunerRegs[83].Reg_Num = 134 ;
779 state->TunerRegs[83].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300780
Steven Toth3935c252008-05-01 05:45:44 -0300781 state->TunerRegs[84].Reg_Num = 135 ;
782 state->TunerRegs[84].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300783
Steven Toth3935c252008-05-01 05:45:44 -0300784 state->TunerRegs[85].Reg_Num = 136 ;
785 state->TunerRegs[85].Reg_Val = 0x7E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300786
Steven Toth3935c252008-05-01 05:45:44 -0300787 state->TunerRegs[86].Reg_Num = 137 ;
788 state->TunerRegs[86].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300789
Steven Toth3935c252008-05-01 05:45:44 -0300790 state->TunerRegs[87].Reg_Num = 138 ;
791 state->TunerRegs[87].Reg_Val = 0x38 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300792
Steven Toth3935c252008-05-01 05:45:44 -0300793 state->TunerRegs[88].Reg_Num = 146 ;
794 state->TunerRegs[88].Reg_Val = 0xF6 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300795
Steven Toth3935c252008-05-01 05:45:44 -0300796 state->TunerRegs[89].Reg_Num = 147 ;
797 state->TunerRegs[89].Reg_Val = 0x1A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300798
Steven Toth3935c252008-05-01 05:45:44 -0300799 state->TunerRegs[90].Reg_Num = 148 ;
800 state->TunerRegs[90].Reg_Val = 0x62 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300801
Steven Toth3935c252008-05-01 05:45:44 -0300802 state->TunerRegs[91].Reg_Num = 149 ;
803 state->TunerRegs[91].Reg_Val = 0x33 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300804
Steven Toth3935c252008-05-01 05:45:44 -0300805 state->TunerRegs[92].Reg_Num = 150 ;
806 state->TunerRegs[92].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300807
Steven Toth3935c252008-05-01 05:45:44 -0300808 state->TunerRegs[93].Reg_Num = 156 ;
809 state->TunerRegs[93].Reg_Val = 0x56 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300810
Steven Toth3935c252008-05-01 05:45:44 -0300811 state->TunerRegs[94].Reg_Num = 157 ;
812 state->TunerRegs[94].Reg_Val = 0x17 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300813
Steven Toth3935c252008-05-01 05:45:44 -0300814 state->TunerRegs[95].Reg_Num = 158 ;
815 state->TunerRegs[95].Reg_Val = 0xA9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300816
Steven Toth3935c252008-05-01 05:45:44 -0300817 state->TunerRegs[96].Reg_Num = 159 ;
818 state->TunerRegs[96].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300819
Steven Toth3935c252008-05-01 05:45:44 -0300820 state->TunerRegs[97].Reg_Num = 160 ;
821 state->TunerRegs[97].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300822
Steven Toth3935c252008-05-01 05:45:44 -0300823 state->TunerRegs[98].Reg_Num = 161 ;
824 state->TunerRegs[98].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300825
Steven Toth3935c252008-05-01 05:45:44 -0300826 state->TunerRegs[99].Reg_Num = 162 ;
827 state->TunerRegs[99].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300828
Steven Toth3935c252008-05-01 05:45:44 -0300829 state->TunerRegs[100].Reg_Num = 166 ;
830 state->TunerRegs[100].Reg_Val = 0xAE ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300831
Steven Toth3935c252008-05-01 05:45:44 -0300832 state->TunerRegs[101].Reg_Num = 167 ;
833 state->TunerRegs[101].Reg_Val = 0x1B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300834
Steven Toth3935c252008-05-01 05:45:44 -0300835 state->TunerRegs[102].Reg_Num = 168 ;
836 state->TunerRegs[102].Reg_Val = 0xF2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300837
Steven Toth3935c252008-05-01 05:45:44 -0300838 state->TunerRegs[103].Reg_Num = 195 ;
839 state->TunerRegs[103].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300840
841 return 0 ;
842}
843
Steven Toth5c1b2052008-05-01 07:04:09 -0300844// DONE
Steven Toth3935c252008-05-01 05:45:44 -0300845u16 MXL5005_ControlInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300846{
Steven Toth85d220d2008-05-01 05:48:14 -0300847 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300848 state->Init_Ctrl_Num = INITCTRL_NUM;
Steven Toth52c99bd2008-05-01 04:57:01 -0300849
Steven Toth3935c252008-05-01 05:45:44 -0300850 state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;
851 state->Init_Ctrl[0].size = 1 ;
852 state->Init_Ctrl[0].addr[0] = 73;
853 state->Init_Ctrl[0].bit[0] = 7;
854 state->Init_Ctrl[0].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300855
Steven Toth3935c252008-05-01 05:45:44 -0300856 state->Init_Ctrl[1].Ctrl_Num = BB_MODE ;
857 state->Init_Ctrl[1].size = 1 ;
858 state->Init_Ctrl[1].addr[0] = 53;
859 state->Init_Ctrl[1].bit[0] = 2;
860 state->Init_Ctrl[1].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300861
Steven Toth3935c252008-05-01 05:45:44 -0300862 state->Init_Ctrl[2].Ctrl_Num = BB_BUF ;
863 state->Init_Ctrl[2].size = 2 ;
864 state->Init_Ctrl[2].addr[0] = 53;
865 state->Init_Ctrl[2].bit[0] = 1;
866 state->Init_Ctrl[2].val[0] = 0;
867 state->Init_Ctrl[2].addr[1] = 57;
868 state->Init_Ctrl[2].bit[1] = 0;
869 state->Init_Ctrl[2].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300870
Steven Toth3935c252008-05-01 05:45:44 -0300871 state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;
872 state->Init_Ctrl[3].size = 1 ;
873 state->Init_Ctrl[3].addr[0] = 53;
874 state->Init_Ctrl[3].bit[0] = 0;
875 state->Init_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300876
Steven Toth3935c252008-05-01 05:45:44 -0300877 state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;
878 state->Init_Ctrl[4].size = 3 ;
879 state->Init_Ctrl[4].addr[0] = 53;
880 state->Init_Ctrl[4].bit[0] = 5;
881 state->Init_Ctrl[4].val[0] = 0;
882 state->Init_Ctrl[4].addr[1] = 53;
883 state->Init_Ctrl[4].bit[1] = 6;
884 state->Init_Ctrl[4].val[1] = 0;
885 state->Init_Ctrl[4].addr[2] = 53;
886 state->Init_Ctrl[4].bit[2] = 7;
887 state->Init_Ctrl[4].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300888
Steven Toth3935c252008-05-01 05:45:44 -0300889 state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;
890 state->Init_Ctrl[5].size = 1 ;
891 state->Init_Ctrl[5].addr[0] = 59;
892 state->Init_Ctrl[5].bit[0] = 0;
893 state->Init_Ctrl[5].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300894
Steven Toth3935c252008-05-01 05:45:44 -0300895 state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ;
896 state->Init_Ctrl[6].size = 2 ;
897 state->Init_Ctrl[6].addr[0] = 53;
898 state->Init_Ctrl[6].bit[0] = 3;
899 state->Init_Ctrl[6].val[0] = 0;
900 state->Init_Ctrl[6].addr[1] = 53;
901 state->Init_Ctrl[6].bit[1] = 4;
902 state->Init_Ctrl[6].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300903
Steven Toth3935c252008-05-01 05:45:44 -0300904 state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ;
905 state->Init_Ctrl[7].size = 4 ;
906 state->Init_Ctrl[7].addr[0] = 22;
907 state->Init_Ctrl[7].bit[0] = 4;
908 state->Init_Ctrl[7].val[0] = 0;
909 state->Init_Ctrl[7].addr[1] = 22;
910 state->Init_Ctrl[7].bit[1] = 5;
911 state->Init_Ctrl[7].val[1] = 1;
912 state->Init_Ctrl[7].addr[2] = 22;
913 state->Init_Ctrl[7].bit[2] = 6;
914 state->Init_Ctrl[7].val[2] = 1;
915 state->Init_Ctrl[7].addr[3] = 22;
916 state->Init_Ctrl[7].bit[3] = 7;
917 state->Init_Ctrl[7].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300918
Steven Toth3935c252008-05-01 05:45:44 -0300919 state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ;
920 state->Init_Ctrl[8].size = 1 ;
921 state->Init_Ctrl[8].addr[0] = 22;
922 state->Init_Ctrl[8].bit[0] = 2;
923 state->Init_Ctrl[8].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300924
Steven Toth3935c252008-05-01 05:45:44 -0300925 state->Init_Ctrl[9].Ctrl_Num = AGC_IF ;
926 state->Init_Ctrl[9].size = 4 ;
927 state->Init_Ctrl[9].addr[0] = 76;
928 state->Init_Ctrl[9].bit[0] = 0;
929 state->Init_Ctrl[9].val[0] = 1;
930 state->Init_Ctrl[9].addr[1] = 76;
931 state->Init_Ctrl[9].bit[1] = 1;
932 state->Init_Ctrl[9].val[1] = 1;
933 state->Init_Ctrl[9].addr[2] = 76;
934 state->Init_Ctrl[9].bit[2] = 2;
935 state->Init_Ctrl[9].val[2] = 0;
936 state->Init_Ctrl[9].addr[3] = 76;
937 state->Init_Ctrl[9].bit[3] = 3;
938 state->Init_Ctrl[9].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300939
Steven Toth3935c252008-05-01 05:45:44 -0300940 state->Init_Ctrl[10].Ctrl_Num = AGC_RF ;
941 state->Init_Ctrl[10].size = 4 ;
942 state->Init_Ctrl[10].addr[0] = 76;
943 state->Init_Ctrl[10].bit[0] = 4;
944 state->Init_Ctrl[10].val[0] = 1;
945 state->Init_Ctrl[10].addr[1] = 76;
946 state->Init_Ctrl[10].bit[1] = 5;
947 state->Init_Ctrl[10].val[1] = 1;
948 state->Init_Ctrl[10].addr[2] = 76;
949 state->Init_Ctrl[10].bit[2] = 6;
950 state->Init_Ctrl[10].val[2] = 0;
951 state->Init_Ctrl[10].addr[3] = 76;
952 state->Init_Ctrl[10].bit[3] = 7;
953 state->Init_Ctrl[10].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300954
Steven Toth3935c252008-05-01 05:45:44 -0300955 state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ;
956 state->Init_Ctrl[11].size = 5 ;
957 state->Init_Ctrl[11].addr[0] = 43;
958 state->Init_Ctrl[11].bit[0] = 3;
959 state->Init_Ctrl[11].val[0] = 0;
960 state->Init_Ctrl[11].addr[1] = 43;
961 state->Init_Ctrl[11].bit[1] = 4;
962 state->Init_Ctrl[11].val[1] = 0;
963 state->Init_Ctrl[11].addr[2] = 43;
964 state->Init_Ctrl[11].bit[2] = 5;
965 state->Init_Ctrl[11].val[2] = 0;
966 state->Init_Ctrl[11].addr[3] = 43;
967 state->Init_Ctrl[11].bit[3] = 6;
968 state->Init_Ctrl[11].val[3] = 1;
969 state->Init_Ctrl[11].addr[4] = 43;
970 state->Init_Ctrl[11].bit[4] = 7;
971 state->Init_Ctrl[11].val[4] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300972
Steven Toth3935c252008-05-01 05:45:44 -0300973 state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ;
974 state->Init_Ctrl[12].size = 6 ;
975 state->Init_Ctrl[12].addr[0] = 44;
976 state->Init_Ctrl[12].bit[0] = 2;
977 state->Init_Ctrl[12].val[0] = 0;
978 state->Init_Ctrl[12].addr[1] = 44;
979 state->Init_Ctrl[12].bit[1] = 3;
980 state->Init_Ctrl[12].val[1] = 0;
981 state->Init_Ctrl[12].addr[2] = 44;
982 state->Init_Ctrl[12].bit[2] = 4;
983 state->Init_Ctrl[12].val[2] = 0;
984 state->Init_Ctrl[12].addr[3] = 44;
985 state->Init_Ctrl[12].bit[3] = 5;
986 state->Init_Ctrl[12].val[3] = 1;
987 state->Init_Ctrl[12].addr[4] = 44;
988 state->Init_Ctrl[12].bit[4] = 6;
989 state->Init_Ctrl[12].val[4] = 0;
990 state->Init_Ctrl[12].addr[5] = 44;
991 state->Init_Ctrl[12].bit[5] = 7;
992 state->Init_Ctrl[12].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300993
Steven Toth3935c252008-05-01 05:45:44 -0300994 state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ;
995 state->Init_Ctrl[13].size = 7 ;
996 state->Init_Ctrl[13].addr[0] = 11;
997 state->Init_Ctrl[13].bit[0] = 0;
998 state->Init_Ctrl[13].val[0] = 1;
999 state->Init_Ctrl[13].addr[1] = 11;
1000 state->Init_Ctrl[13].bit[1] = 1;
1001 state->Init_Ctrl[13].val[1] = 0;
1002 state->Init_Ctrl[13].addr[2] = 11;
1003 state->Init_Ctrl[13].bit[2] = 2;
1004 state->Init_Ctrl[13].val[2] = 0;
1005 state->Init_Ctrl[13].addr[3] = 11;
1006 state->Init_Ctrl[13].bit[3] = 3;
1007 state->Init_Ctrl[13].val[3] = 1;
1008 state->Init_Ctrl[13].addr[4] = 11;
1009 state->Init_Ctrl[13].bit[4] = 4;
1010 state->Init_Ctrl[13].val[4] = 1;
1011 state->Init_Ctrl[13].addr[5] = 11;
1012 state->Init_Ctrl[13].bit[5] = 5;
1013 state->Init_Ctrl[13].val[5] = 0;
1014 state->Init_Ctrl[13].addr[6] = 11;
1015 state->Init_Ctrl[13].bit[6] = 6;
1016 state->Init_Ctrl[13].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001017
Steven Toth3935c252008-05-01 05:45:44 -03001018 state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ;
1019 state->Init_Ctrl[14].size = 16 ;
1020 state->Init_Ctrl[14].addr[0] = 13;
1021 state->Init_Ctrl[14].bit[0] = 0;
1022 state->Init_Ctrl[14].val[0] = 0;
1023 state->Init_Ctrl[14].addr[1] = 13;
1024 state->Init_Ctrl[14].bit[1] = 1;
1025 state->Init_Ctrl[14].val[1] = 0;
1026 state->Init_Ctrl[14].addr[2] = 13;
1027 state->Init_Ctrl[14].bit[2] = 2;
1028 state->Init_Ctrl[14].val[2] = 0;
1029 state->Init_Ctrl[14].addr[3] = 13;
1030 state->Init_Ctrl[14].bit[3] = 3;
1031 state->Init_Ctrl[14].val[3] = 0;
1032 state->Init_Ctrl[14].addr[4] = 13;
1033 state->Init_Ctrl[14].bit[4] = 4;
1034 state->Init_Ctrl[14].val[4] = 0;
1035 state->Init_Ctrl[14].addr[5] = 13;
1036 state->Init_Ctrl[14].bit[5] = 5;
1037 state->Init_Ctrl[14].val[5] = 0;
1038 state->Init_Ctrl[14].addr[6] = 13;
1039 state->Init_Ctrl[14].bit[6] = 6;
1040 state->Init_Ctrl[14].val[6] = 0;
1041 state->Init_Ctrl[14].addr[7] = 13;
1042 state->Init_Ctrl[14].bit[7] = 7;
1043 state->Init_Ctrl[14].val[7] = 0;
1044 state->Init_Ctrl[14].addr[8] = 12;
1045 state->Init_Ctrl[14].bit[8] = 0;
1046 state->Init_Ctrl[14].val[8] = 0;
1047 state->Init_Ctrl[14].addr[9] = 12;
1048 state->Init_Ctrl[14].bit[9] = 1;
1049 state->Init_Ctrl[14].val[9] = 0;
1050 state->Init_Ctrl[14].addr[10] = 12;
1051 state->Init_Ctrl[14].bit[10] = 2;
1052 state->Init_Ctrl[14].val[10] = 0;
1053 state->Init_Ctrl[14].addr[11] = 12;
1054 state->Init_Ctrl[14].bit[11] = 3;
1055 state->Init_Ctrl[14].val[11] = 0;
1056 state->Init_Ctrl[14].addr[12] = 12;
1057 state->Init_Ctrl[14].bit[12] = 4;
1058 state->Init_Ctrl[14].val[12] = 0;
1059 state->Init_Ctrl[14].addr[13] = 12;
1060 state->Init_Ctrl[14].bit[13] = 5;
1061 state->Init_Ctrl[14].val[13] = 1;
1062 state->Init_Ctrl[14].addr[14] = 12;
1063 state->Init_Ctrl[14].bit[14] = 6;
1064 state->Init_Ctrl[14].val[14] = 1;
1065 state->Init_Ctrl[14].addr[15] = 12;
1066 state->Init_Ctrl[14].bit[15] = 7;
1067 state->Init_Ctrl[14].val[15] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001068
Steven Toth3935c252008-05-01 05:45:44 -03001069 state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ;
1070 state->Init_Ctrl[15].size = 3 ;
1071 state->Init_Ctrl[15].addr[0] = 147;
1072 state->Init_Ctrl[15].bit[0] = 2;
1073 state->Init_Ctrl[15].val[0] = 0;
1074 state->Init_Ctrl[15].addr[1] = 147;
1075 state->Init_Ctrl[15].bit[1] = 3;
1076 state->Init_Ctrl[15].val[1] = 1;
1077 state->Init_Ctrl[15].addr[2] = 147;
1078 state->Init_Ctrl[15].bit[2] = 4;
1079 state->Init_Ctrl[15].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001080
Steven Toth3935c252008-05-01 05:45:44 -03001081 state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ;
1082 state->Init_Ctrl[16].size = 2 ;
1083 state->Init_Ctrl[16].addr[0] = 147;
1084 state->Init_Ctrl[16].bit[0] = 0;
1085 state->Init_Ctrl[16].val[0] = 0;
1086 state->Init_Ctrl[16].addr[1] = 147;
1087 state->Init_Ctrl[16].bit[1] = 1;
1088 state->Init_Ctrl[16].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001089
Steven Toth3935c252008-05-01 05:45:44 -03001090 state->Init_Ctrl[17].Ctrl_Num = EN_AAF ;
1091 state->Init_Ctrl[17].size = 1 ;
1092 state->Init_Ctrl[17].addr[0] = 147;
1093 state->Init_Ctrl[17].bit[0] = 7;
1094 state->Init_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001095
Steven Toth3935c252008-05-01 05:45:44 -03001096 state->Init_Ctrl[18].Ctrl_Num = EN_3P ;
1097 state->Init_Ctrl[18].size = 1 ;
1098 state->Init_Ctrl[18].addr[0] = 147;
1099 state->Init_Ctrl[18].bit[0] = 6;
1100 state->Init_Ctrl[18].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001101
Steven Toth3935c252008-05-01 05:45:44 -03001102 state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ;
1103 state->Init_Ctrl[19].size = 1 ;
1104 state->Init_Ctrl[19].addr[0] = 156;
1105 state->Init_Ctrl[19].bit[0] = 0;
1106 state->Init_Ctrl[19].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001107
Steven Toth3935c252008-05-01 05:45:44 -03001108 state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ;
1109 state->Init_Ctrl[20].size = 1 ;
1110 state->Init_Ctrl[20].addr[0] = 147;
1111 state->Init_Ctrl[20].bit[0] = 5;
1112 state->Init_Ctrl[20].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001113
Steven Toth3935c252008-05-01 05:45:44 -03001114 state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ;
1115 state->Init_Ctrl[21].size = 1 ;
1116 state->Init_Ctrl[21].addr[0] = 137;
1117 state->Init_Ctrl[21].bit[0] = 4;
1118 state->Init_Ctrl[21].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001119
Steven Toth3935c252008-05-01 05:45:44 -03001120 state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ;
1121 state->Init_Ctrl[22].size = 1 ;
1122 state->Init_Ctrl[22].addr[0] = 137;
1123 state->Init_Ctrl[22].bit[0] = 7;
1124 state->Init_Ctrl[22].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001125
Steven Toth3935c252008-05-01 05:45:44 -03001126 state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ;
1127 state->Init_Ctrl[23].size = 1 ;
1128 state->Init_Ctrl[23].addr[0] = 91;
1129 state->Init_Ctrl[23].bit[0] = 5;
1130 state->Init_Ctrl[23].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001131
Steven Toth3935c252008-05-01 05:45:44 -03001132 state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ;
1133 state->Init_Ctrl[24].size = 1 ;
1134 state->Init_Ctrl[24].addr[0] = 43;
1135 state->Init_Ctrl[24].bit[0] = 0;
1136 state->Init_Ctrl[24].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001137
Steven Toth3935c252008-05-01 05:45:44 -03001138 state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ;
1139 state->Init_Ctrl[25].size = 2 ;
1140 state->Init_Ctrl[25].addr[0] = 22;
1141 state->Init_Ctrl[25].bit[0] = 0;
1142 state->Init_Ctrl[25].val[0] = 1;
1143 state->Init_Ctrl[25].addr[1] = 22;
1144 state->Init_Ctrl[25].bit[1] = 1;
1145 state->Init_Ctrl[25].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001146
Steven Toth3935c252008-05-01 05:45:44 -03001147 state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ;
1148 state->Init_Ctrl[26].size = 1 ;
1149 state->Init_Ctrl[26].addr[0] = 134;
1150 state->Init_Ctrl[26].bit[0] = 2;
1151 state->Init_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001152
Steven Toth3935c252008-05-01 05:45:44 -03001153 state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ;
1154 state->Init_Ctrl[27].size = 1 ;
1155 state->Init_Ctrl[27].addr[0] = 137;
1156 state->Init_Ctrl[27].bit[0] = 3;
1157 state->Init_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001158
Steven Toth3935c252008-05-01 05:45:44 -03001159 state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ;
1160 state->Init_Ctrl[28].size = 1 ;
1161 state->Init_Ctrl[28].addr[0] = 77;
1162 state->Init_Ctrl[28].bit[0] = 7;
1163 state->Init_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001164
Steven Toth3935c252008-05-01 05:45:44 -03001165 state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ;
1166 state->Init_Ctrl[29].size = 1 ;
1167 state->Init_Ctrl[29].addr[0] = 166;
1168 state->Init_Ctrl[29].bit[0] = 7;
1169 state->Init_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001170
Steven Toth3935c252008-05-01 05:45:44 -03001171 state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ;
1172 state->Init_Ctrl[30].size = 3 ;
1173 state->Init_Ctrl[30].addr[0] = 166;
1174 state->Init_Ctrl[30].bit[0] = 0;
1175 state->Init_Ctrl[30].val[0] = 0;
1176 state->Init_Ctrl[30].addr[1] = 166;
1177 state->Init_Ctrl[30].bit[1] = 1;
1178 state->Init_Ctrl[30].val[1] = 1;
1179 state->Init_Ctrl[30].addr[2] = 166;
1180 state->Init_Ctrl[30].bit[2] = 2;
1181 state->Init_Ctrl[30].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001182
Steven Toth3935c252008-05-01 05:45:44 -03001183 state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ;
1184 state->Init_Ctrl[31].size = 3 ;
1185 state->Init_Ctrl[31].addr[0] = 166;
1186 state->Init_Ctrl[31].bit[0] = 3;
1187 state->Init_Ctrl[31].val[0] = 1;
1188 state->Init_Ctrl[31].addr[1] = 166;
1189 state->Init_Ctrl[31].bit[1] = 4;
1190 state->Init_Ctrl[31].val[1] = 0;
1191 state->Init_Ctrl[31].addr[2] = 166;
1192 state->Init_Ctrl[31].bit[2] = 5;
1193 state->Init_Ctrl[31].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001194
Steven Toth3935c252008-05-01 05:45:44 -03001195 state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ;
1196 state->Init_Ctrl[32].size = 3 ;
1197 state->Init_Ctrl[32].addr[0] = 167;
1198 state->Init_Ctrl[32].bit[0] = 0;
1199 state->Init_Ctrl[32].val[0] = 1;
1200 state->Init_Ctrl[32].addr[1] = 167;
1201 state->Init_Ctrl[32].bit[1] = 1;
1202 state->Init_Ctrl[32].val[1] = 1;
1203 state->Init_Ctrl[32].addr[2] = 167;
1204 state->Init_Ctrl[32].bit[2] = 2;
1205 state->Init_Ctrl[32].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001206
Steven Toth3935c252008-05-01 05:45:44 -03001207 state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ;
1208 state->Init_Ctrl[33].size = 4 ;
1209 state->Init_Ctrl[33].addr[0] = 168;
1210 state->Init_Ctrl[33].bit[0] = 0;
1211 state->Init_Ctrl[33].val[0] = 0;
1212 state->Init_Ctrl[33].addr[1] = 168;
1213 state->Init_Ctrl[33].bit[1] = 1;
1214 state->Init_Ctrl[33].val[1] = 1;
1215 state->Init_Ctrl[33].addr[2] = 168;
1216 state->Init_Ctrl[33].bit[2] = 2;
1217 state->Init_Ctrl[33].val[2] = 0;
1218 state->Init_Ctrl[33].addr[3] = 168;
1219 state->Init_Ctrl[33].bit[3] = 3;
1220 state->Init_Ctrl[33].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001221
Steven Toth3935c252008-05-01 05:45:44 -03001222 state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ;
1223 state->Init_Ctrl[34].size = 4 ;
1224 state->Init_Ctrl[34].addr[0] = 168;
1225 state->Init_Ctrl[34].bit[0] = 4;
1226 state->Init_Ctrl[34].val[0] = 1;
1227 state->Init_Ctrl[34].addr[1] = 168;
1228 state->Init_Ctrl[34].bit[1] = 5;
1229 state->Init_Ctrl[34].val[1] = 1;
1230 state->Init_Ctrl[34].addr[2] = 168;
1231 state->Init_Ctrl[34].bit[2] = 6;
1232 state->Init_Ctrl[34].val[2] = 1;
1233 state->Init_Ctrl[34].addr[3] = 168;
1234 state->Init_Ctrl[34].bit[3] = 7;
1235 state->Init_Ctrl[34].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001236
Steven Toth3935c252008-05-01 05:45:44 -03001237 state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ;
1238 state->Init_Ctrl[35].size = 1 ;
1239 state->Init_Ctrl[35].addr[0] = 135;
1240 state->Init_Ctrl[35].bit[0] = 0;
1241 state->Init_Ctrl[35].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001242
Steven Toth3935c252008-05-01 05:45:44 -03001243 state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ;
1244 state->Init_Ctrl[36].size = 1 ;
1245 state->Init_Ctrl[36].addr[0] = 56;
1246 state->Init_Ctrl[36].bit[0] = 3;
1247 state->Init_Ctrl[36].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001248
Steven Toth3935c252008-05-01 05:45:44 -03001249 state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ;
1250 state->Init_Ctrl[37].size = 7 ;
1251 state->Init_Ctrl[37].addr[0] = 59;
1252 state->Init_Ctrl[37].bit[0] = 1;
1253 state->Init_Ctrl[37].val[0] = 0;
1254 state->Init_Ctrl[37].addr[1] = 59;
1255 state->Init_Ctrl[37].bit[1] = 2;
1256 state->Init_Ctrl[37].val[1] = 0;
1257 state->Init_Ctrl[37].addr[2] = 59;
1258 state->Init_Ctrl[37].bit[2] = 3;
1259 state->Init_Ctrl[37].val[2] = 0;
1260 state->Init_Ctrl[37].addr[3] = 59;
1261 state->Init_Ctrl[37].bit[3] = 4;
1262 state->Init_Ctrl[37].val[3] = 0;
1263 state->Init_Ctrl[37].addr[4] = 59;
1264 state->Init_Ctrl[37].bit[4] = 5;
1265 state->Init_Ctrl[37].val[4] = 0;
1266 state->Init_Ctrl[37].addr[5] = 59;
1267 state->Init_Ctrl[37].bit[5] = 6;
1268 state->Init_Ctrl[37].val[5] = 0;
1269 state->Init_Ctrl[37].addr[6] = 59;
1270 state->Init_Ctrl[37].bit[6] = 7;
1271 state->Init_Ctrl[37].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001272
Steven Toth3935c252008-05-01 05:45:44 -03001273 state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ;
1274 state->Init_Ctrl[38].size = 6 ;
1275 state->Init_Ctrl[38].addr[0] = 32;
1276 state->Init_Ctrl[38].bit[0] = 2;
1277 state->Init_Ctrl[38].val[0] = 0;
1278 state->Init_Ctrl[38].addr[1] = 32;
1279 state->Init_Ctrl[38].bit[1] = 3;
1280 state->Init_Ctrl[38].val[1] = 0;
1281 state->Init_Ctrl[38].addr[2] = 32;
1282 state->Init_Ctrl[38].bit[2] = 4;
1283 state->Init_Ctrl[38].val[2] = 0;
1284 state->Init_Ctrl[38].addr[3] = 32;
1285 state->Init_Ctrl[38].bit[3] = 5;
1286 state->Init_Ctrl[38].val[3] = 0;
1287 state->Init_Ctrl[38].addr[4] = 32;
1288 state->Init_Ctrl[38].bit[4] = 6;
1289 state->Init_Ctrl[38].val[4] = 1;
1290 state->Init_Ctrl[38].addr[5] = 32;
1291 state->Init_Ctrl[38].bit[5] = 7;
1292 state->Init_Ctrl[38].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001293
Steven Toth3935c252008-05-01 05:45:44 -03001294 state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ;
1295 state->Init_Ctrl[39].size = 1 ;
1296 state->Init_Ctrl[39].addr[0] = 25;
1297 state->Init_Ctrl[39].bit[0] = 3;
1298 state->Init_Ctrl[39].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001299
1300
Steven Toth3935c252008-05-01 05:45:44 -03001301 state->CH_Ctrl_Num = CHCTRL_NUM ;
Steven Toth52c99bd2008-05-01 04:57:01 -03001302
Steven Toth3935c252008-05-01 05:45:44 -03001303 state->CH_Ctrl[0].Ctrl_Num = DN_POLY ;
1304 state->CH_Ctrl[0].size = 2 ;
1305 state->CH_Ctrl[0].addr[0] = 68;
1306 state->CH_Ctrl[0].bit[0] = 6;
1307 state->CH_Ctrl[0].val[0] = 1;
1308 state->CH_Ctrl[0].addr[1] = 68;
1309 state->CH_Ctrl[0].bit[1] = 7;
1310 state->CH_Ctrl[0].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001311
Steven Toth3935c252008-05-01 05:45:44 -03001312 state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ;
1313 state->CH_Ctrl[1].size = 2 ;
1314 state->CH_Ctrl[1].addr[0] = 70;
1315 state->CH_Ctrl[1].bit[0] = 6;
1316 state->CH_Ctrl[1].val[0] = 1;
1317 state->CH_Ctrl[1].addr[1] = 70;
1318 state->CH_Ctrl[1].bit[1] = 7;
1319 state->CH_Ctrl[1].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001320
Steven Toth3935c252008-05-01 05:45:44 -03001321 state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ;
1322 state->CH_Ctrl[2].size = 9 ;
1323 state->CH_Ctrl[2].addr[0] = 69;
1324 state->CH_Ctrl[2].bit[0] = 5;
1325 state->CH_Ctrl[2].val[0] = 0;
1326 state->CH_Ctrl[2].addr[1] = 69;
1327 state->CH_Ctrl[2].bit[1] = 6;
1328 state->CH_Ctrl[2].val[1] = 0;
1329 state->CH_Ctrl[2].addr[2] = 69;
1330 state->CH_Ctrl[2].bit[2] = 7;
1331 state->CH_Ctrl[2].val[2] = 0;
1332 state->CH_Ctrl[2].addr[3] = 68;
1333 state->CH_Ctrl[2].bit[3] = 0;
1334 state->CH_Ctrl[2].val[3] = 0;
1335 state->CH_Ctrl[2].addr[4] = 68;
1336 state->CH_Ctrl[2].bit[4] = 1;
1337 state->CH_Ctrl[2].val[4] = 0;
1338 state->CH_Ctrl[2].addr[5] = 68;
1339 state->CH_Ctrl[2].bit[5] = 2;
1340 state->CH_Ctrl[2].val[5] = 0;
1341 state->CH_Ctrl[2].addr[6] = 68;
1342 state->CH_Ctrl[2].bit[6] = 3;
1343 state->CH_Ctrl[2].val[6] = 0;
1344 state->CH_Ctrl[2].addr[7] = 68;
1345 state->CH_Ctrl[2].bit[7] = 4;
1346 state->CH_Ctrl[2].val[7] = 0;
1347 state->CH_Ctrl[2].addr[8] = 68;
1348 state->CH_Ctrl[2].bit[8] = 5;
1349 state->CH_Ctrl[2].val[8] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001350
Steven Toth3935c252008-05-01 05:45:44 -03001351 state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ;
1352 state->CH_Ctrl[3].size = 1 ;
1353 state->CH_Ctrl[3].addr[0] = 70;
1354 state->CH_Ctrl[3].bit[0] = 5;
1355 state->CH_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001356
Steven Toth3935c252008-05-01 05:45:44 -03001357 state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ;
1358 state->CH_Ctrl[4].size = 3 ;
1359 state->CH_Ctrl[4].addr[0] = 73;
1360 state->CH_Ctrl[4].bit[0] = 4;
1361 state->CH_Ctrl[4].val[0] = 0;
1362 state->CH_Ctrl[4].addr[1] = 73;
1363 state->CH_Ctrl[4].bit[1] = 5;
1364 state->CH_Ctrl[4].val[1] = 1;
1365 state->CH_Ctrl[4].addr[2] = 73;
1366 state->CH_Ctrl[4].bit[2] = 6;
1367 state->CH_Ctrl[4].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001368
Steven Toth3935c252008-05-01 05:45:44 -03001369 state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ;
1370 state->CH_Ctrl[5].size = 4 ;
1371 state->CH_Ctrl[5].addr[0] = 70;
1372 state->CH_Ctrl[5].bit[0] = 0;
1373 state->CH_Ctrl[5].val[0] = 0;
1374 state->CH_Ctrl[5].addr[1] = 70;
1375 state->CH_Ctrl[5].bit[1] = 1;
1376 state->CH_Ctrl[5].val[1] = 0;
1377 state->CH_Ctrl[5].addr[2] = 70;
1378 state->CH_Ctrl[5].bit[2] = 2;
1379 state->CH_Ctrl[5].val[2] = 0;
1380 state->CH_Ctrl[5].addr[3] = 70;
1381 state->CH_Ctrl[5].bit[3] = 3;
1382 state->CH_Ctrl[5].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001383
Steven Toth3935c252008-05-01 05:45:44 -03001384 state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ;
1385 state->CH_Ctrl[6].size = 1 ;
1386 state->CH_Ctrl[6].addr[0] = 70;
1387 state->CH_Ctrl[6].bit[0] = 4;
1388 state->CH_Ctrl[6].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001389
Steven Toth3935c252008-05-01 05:45:44 -03001390 state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ;
1391 state->CH_Ctrl[7].size = 1 ;
1392 state->CH_Ctrl[7].addr[0] = 111;
1393 state->CH_Ctrl[7].bit[0] = 4;
1394 state->CH_Ctrl[7].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001395
Steven Toth3935c252008-05-01 05:45:44 -03001396 state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ;
1397 state->CH_Ctrl[8].size = 1 ;
1398 state->CH_Ctrl[8].addr[0] = 111;
1399 state->CH_Ctrl[8].bit[0] = 7;
1400 state->CH_Ctrl[8].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001401
Steven Toth3935c252008-05-01 05:45:44 -03001402 state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ;
1403 state->CH_Ctrl[9].size = 1 ;
1404 state->CH_Ctrl[9].addr[0] = 111;
1405 state->CH_Ctrl[9].bit[0] = 6;
1406 state->CH_Ctrl[9].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001407
Steven Toth3935c252008-05-01 05:45:44 -03001408 state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ;
1409 state->CH_Ctrl[10].size = 1 ;
1410 state->CH_Ctrl[10].addr[0] = 111;
1411 state->CH_Ctrl[10].bit[0] = 5;
1412 state->CH_Ctrl[10].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001413
Steven Toth3935c252008-05-01 05:45:44 -03001414 state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ;
1415 state->CH_Ctrl[11].size = 2 ;
1416 state->CH_Ctrl[11].addr[0] = 110;
1417 state->CH_Ctrl[11].bit[0] = 0;
1418 state->CH_Ctrl[11].val[0] = 1;
1419 state->CH_Ctrl[11].addr[1] = 110;
1420 state->CH_Ctrl[11].bit[1] = 1;
1421 state->CH_Ctrl[11].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001422
Steven Toth3935c252008-05-01 05:45:44 -03001423 state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ;
1424 state->CH_Ctrl[12].size = 3 ;
1425 state->CH_Ctrl[12].addr[0] = 69;
1426 state->CH_Ctrl[12].bit[0] = 2;
1427 state->CH_Ctrl[12].val[0] = 0;
1428 state->CH_Ctrl[12].addr[1] = 69;
1429 state->CH_Ctrl[12].bit[1] = 3;
1430 state->CH_Ctrl[12].val[1] = 0;
1431 state->CH_Ctrl[12].addr[2] = 69;
1432 state->CH_Ctrl[12].bit[2] = 4;
1433 state->CH_Ctrl[12].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001434
Steven Toth3935c252008-05-01 05:45:44 -03001435 state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ;
1436 state->CH_Ctrl[13].size = 6 ;
1437 state->CH_Ctrl[13].addr[0] = 110;
1438 state->CH_Ctrl[13].bit[0] = 2;
1439 state->CH_Ctrl[13].val[0] = 0;
1440 state->CH_Ctrl[13].addr[1] = 110;
1441 state->CH_Ctrl[13].bit[1] = 3;
1442 state->CH_Ctrl[13].val[1] = 0;
1443 state->CH_Ctrl[13].addr[2] = 110;
1444 state->CH_Ctrl[13].bit[2] = 4;
1445 state->CH_Ctrl[13].val[2] = 0;
1446 state->CH_Ctrl[13].addr[3] = 110;
1447 state->CH_Ctrl[13].bit[3] = 5;
1448 state->CH_Ctrl[13].val[3] = 0;
1449 state->CH_Ctrl[13].addr[4] = 110;
1450 state->CH_Ctrl[13].bit[4] = 6;
1451 state->CH_Ctrl[13].val[4] = 0;
1452 state->CH_Ctrl[13].addr[5] = 110;
1453 state->CH_Ctrl[13].bit[5] = 7;
1454 state->CH_Ctrl[13].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001455
Steven Toth3935c252008-05-01 05:45:44 -03001456 state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ;
1457 state->CH_Ctrl[14].size = 7 ;
1458 state->CH_Ctrl[14].addr[0] = 14;
1459 state->CH_Ctrl[14].bit[0] = 0;
1460 state->CH_Ctrl[14].val[0] = 0;
1461 state->CH_Ctrl[14].addr[1] = 14;
1462 state->CH_Ctrl[14].bit[1] = 1;
1463 state->CH_Ctrl[14].val[1] = 0;
1464 state->CH_Ctrl[14].addr[2] = 14;
1465 state->CH_Ctrl[14].bit[2] = 2;
1466 state->CH_Ctrl[14].val[2] = 0;
1467 state->CH_Ctrl[14].addr[3] = 14;
1468 state->CH_Ctrl[14].bit[3] = 3;
1469 state->CH_Ctrl[14].val[3] = 0;
1470 state->CH_Ctrl[14].addr[4] = 14;
1471 state->CH_Ctrl[14].bit[4] = 4;
1472 state->CH_Ctrl[14].val[4] = 0;
1473 state->CH_Ctrl[14].addr[5] = 14;
1474 state->CH_Ctrl[14].bit[5] = 5;
1475 state->CH_Ctrl[14].val[5] = 0;
1476 state->CH_Ctrl[14].addr[6] = 14;
1477 state->CH_Ctrl[14].bit[6] = 6;
1478 state->CH_Ctrl[14].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001479
Steven Toth3935c252008-05-01 05:45:44 -03001480 state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ;
1481 state->CH_Ctrl[15].size = 18 ;
1482 state->CH_Ctrl[15].addr[0] = 17;
1483 state->CH_Ctrl[15].bit[0] = 6;
1484 state->CH_Ctrl[15].val[0] = 0;
1485 state->CH_Ctrl[15].addr[1] = 17;
1486 state->CH_Ctrl[15].bit[1] = 7;
1487 state->CH_Ctrl[15].val[1] = 0;
1488 state->CH_Ctrl[15].addr[2] = 16;
1489 state->CH_Ctrl[15].bit[2] = 0;
1490 state->CH_Ctrl[15].val[2] = 0;
1491 state->CH_Ctrl[15].addr[3] = 16;
1492 state->CH_Ctrl[15].bit[3] = 1;
1493 state->CH_Ctrl[15].val[3] = 0;
1494 state->CH_Ctrl[15].addr[4] = 16;
1495 state->CH_Ctrl[15].bit[4] = 2;
1496 state->CH_Ctrl[15].val[4] = 0;
1497 state->CH_Ctrl[15].addr[5] = 16;
1498 state->CH_Ctrl[15].bit[5] = 3;
1499 state->CH_Ctrl[15].val[5] = 0;
1500 state->CH_Ctrl[15].addr[6] = 16;
1501 state->CH_Ctrl[15].bit[6] = 4;
1502 state->CH_Ctrl[15].val[6] = 0;
1503 state->CH_Ctrl[15].addr[7] = 16;
1504 state->CH_Ctrl[15].bit[7] = 5;
1505 state->CH_Ctrl[15].val[7] = 0;
1506 state->CH_Ctrl[15].addr[8] = 16;
1507 state->CH_Ctrl[15].bit[8] = 6;
1508 state->CH_Ctrl[15].val[8] = 0;
1509 state->CH_Ctrl[15].addr[9] = 16;
1510 state->CH_Ctrl[15].bit[9] = 7;
1511 state->CH_Ctrl[15].val[9] = 0;
1512 state->CH_Ctrl[15].addr[10] = 15;
1513 state->CH_Ctrl[15].bit[10] = 0;
1514 state->CH_Ctrl[15].val[10] = 0;
1515 state->CH_Ctrl[15].addr[11] = 15;
1516 state->CH_Ctrl[15].bit[11] = 1;
1517 state->CH_Ctrl[15].val[11] = 0;
1518 state->CH_Ctrl[15].addr[12] = 15;
1519 state->CH_Ctrl[15].bit[12] = 2;
1520 state->CH_Ctrl[15].val[12] = 0;
1521 state->CH_Ctrl[15].addr[13] = 15;
1522 state->CH_Ctrl[15].bit[13] = 3;
1523 state->CH_Ctrl[15].val[13] = 0;
1524 state->CH_Ctrl[15].addr[14] = 15;
1525 state->CH_Ctrl[15].bit[14] = 4;
1526 state->CH_Ctrl[15].val[14] = 0;
1527 state->CH_Ctrl[15].addr[15] = 15;
1528 state->CH_Ctrl[15].bit[15] = 5;
1529 state->CH_Ctrl[15].val[15] = 0;
1530 state->CH_Ctrl[15].addr[16] = 15;
1531 state->CH_Ctrl[15].bit[16] = 6;
1532 state->CH_Ctrl[15].val[16] = 1;
1533 state->CH_Ctrl[15].addr[17] = 15;
1534 state->CH_Ctrl[15].bit[17] = 7;
1535 state->CH_Ctrl[15].val[17] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001536
Steven Toth3935c252008-05-01 05:45:44 -03001537 state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ;
1538 state->CH_Ctrl[16].size = 5 ;
1539 state->CH_Ctrl[16].addr[0] = 112;
1540 state->CH_Ctrl[16].bit[0] = 0;
1541 state->CH_Ctrl[16].val[0] = 0;
1542 state->CH_Ctrl[16].addr[1] = 112;
1543 state->CH_Ctrl[16].bit[1] = 1;
1544 state->CH_Ctrl[16].val[1] = 0;
1545 state->CH_Ctrl[16].addr[2] = 112;
1546 state->CH_Ctrl[16].bit[2] = 2;
1547 state->CH_Ctrl[16].val[2] = 0;
1548 state->CH_Ctrl[16].addr[3] = 112;
1549 state->CH_Ctrl[16].bit[3] = 3;
1550 state->CH_Ctrl[16].val[3] = 0;
1551 state->CH_Ctrl[16].addr[4] = 112;
1552 state->CH_Ctrl[16].bit[4] = 4;
1553 state->CH_Ctrl[16].val[4] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001554
Steven Toth3935c252008-05-01 05:45:44 -03001555 state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ;
1556 state->CH_Ctrl[17].size = 1 ;
1557 state->CH_Ctrl[17].addr[0] = 14;
1558 state->CH_Ctrl[17].bit[0] = 7;
1559 state->CH_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001560
Steven Toth3935c252008-05-01 05:45:44 -03001561 state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ;
1562 state->CH_Ctrl[18].size = 4 ;
1563 state->CH_Ctrl[18].addr[0] = 107;
1564 state->CH_Ctrl[18].bit[0] = 3;
1565 state->CH_Ctrl[18].val[0] = 0;
1566 state->CH_Ctrl[18].addr[1] = 107;
1567 state->CH_Ctrl[18].bit[1] = 4;
1568 state->CH_Ctrl[18].val[1] = 0;
1569 state->CH_Ctrl[18].addr[2] = 107;
1570 state->CH_Ctrl[18].bit[2] = 5;
1571 state->CH_Ctrl[18].val[2] = 0;
1572 state->CH_Ctrl[18].addr[3] = 107;
1573 state->CH_Ctrl[18].bit[3] = 6;
1574 state->CH_Ctrl[18].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001575
Steven Toth3935c252008-05-01 05:45:44 -03001576 state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ;
1577 state->CH_Ctrl[19].size = 3 ;
1578 state->CH_Ctrl[19].addr[0] = 107;
1579 state->CH_Ctrl[19].bit[0] = 7;
1580 state->CH_Ctrl[19].val[0] = 1;
1581 state->CH_Ctrl[19].addr[1] = 106;
1582 state->CH_Ctrl[19].bit[1] = 0;
1583 state->CH_Ctrl[19].val[1] = 1;
1584 state->CH_Ctrl[19].addr[2] = 106;
1585 state->CH_Ctrl[19].bit[2] = 1;
1586 state->CH_Ctrl[19].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001587
Steven Toth3935c252008-05-01 05:45:44 -03001588 state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ;
1589 state->CH_Ctrl[20].size = 11 ;
1590 state->CH_Ctrl[20].addr[0] = 109;
1591 state->CH_Ctrl[20].bit[0] = 2;
1592 state->CH_Ctrl[20].val[0] = 0;
1593 state->CH_Ctrl[20].addr[1] = 109;
1594 state->CH_Ctrl[20].bit[1] = 3;
1595 state->CH_Ctrl[20].val[1] = 0;
1596 state->CH_Ctrl[20].addr[2] = 109;
1597 state->CH_Ctrl[20].bit[2] = 4;
1598 state->CH_Ctrl[20].val[2] = 0;
1599 state->CH_Ctrl[20].addr[3] = 109;
1600 state->CH_Ctrl[20].bit[3] = 5;
1601 state->CH_Ctrl[20].val[3] = 0;
1602 state->CH_Ctrl[20].addr[4] = 109;
1603 state->CH_Ctrl[20].bit[4] = 6;
1604 state->CH_Ctrl[20].val[4] = 0;
1605 state->CH_Ctrl[20].addr[5] = 109;
1606 state->CH_Ctrl[20].bit[5] = 7;
1607 state->CH_Ctrl[20].val[5] = 0;
1608 state->CH_Ctrl[20].addr[6] = 108;
1609 state->CH_Ctrl[20].bit[6] = 0;
1610 state->CH_Ctrl[20].val[6] = 0;
1611 state->CH_Ctrl[20].addr[7] = 108;
1612 state->CH_Ctrl[20].bit[7] = 1;
1613 state->CH_Ctrl[20].val[7] = 0;
1614 state->CH_Ctrl[20].addr[8] = 108;
1615 state->CH_Ctrl[20].bit[8] = 2;
1616 state->CH_Ctrl[20].val[8] = 1;
1617 state->CH_Ctrl[20].addr[9] = 108;
1618 state->CH_Ctrl[20].bit[9] = 3;
1619 state->CH_Ctrl[20].val[9] = 1;
1620 state->CH_Ctrl[20].addr[10] = 108;
1621 state->CH_Ctrl[20].bit[10] = 4;
1622 state->CH_Ctrl[20].val[10] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001623
Steven Toth3935c252008-05-01 05:45:44 -03001624 state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ;
1625 state->CH_Ctrl[21].size = 6 ;
1626 state->CH_Ctrl[21].addr[0] = 106;
1627 state->CH_Ctrl[21].bit[0] = 2;
1628 state->CH_Ctrl[21].val[0] = 0;
1629 state->CH_Ctrl[21].addr[1] = 106;
1630 state->CH_Ctrl[21].bit[1] = 3;
1631 state->CH_Ctrl[21].val[1] = 0;
1632 state->CH_Ctrl[21].addr[2] = 106;
1633 state->CH_Ctrl[21].bit[2] = 4;
1634 state->CH_Ctrl[21].val[2] = 0;
1635 state->CH_Ctrl[21].addr[3] = 106;
1636 state->CH_Ctrl[21].bit[3] = 5;
1637 state->CH_Ctrl[21].val[3] = 0;
1638 state->CH_Ctrl[21].addr[4] = 106;
1639 state->CH_Ctrl[21].bit[4] = 6;
1640 state->CH_Ctrl[21].val[4] = 0;
1641 state->CH_Ctrl[21].addr[5] = 106;
1642 state->CH_Ctrl[21].bit[5] = 7;
1643 state->CH_Ctrl[21].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001644
Steven Toth3935c252008-05-01 05:45:44 -03001645 state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ;
1646 state->CH_Ctrl[22].size = 1 ;
1647 state->CH_Ctrl[22].addr[0] = 138;
1648 state->CH_Ctrl[22].bit[0] = 4;
1649 state->CH_Ctrl[22].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001650
Steven Toth3935c252008-05-01 05:45:44 -03001651 state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ;
1652 state->CH_Ctrl[23].size = 1 ;
1653 state->CH_Ctrl[23].addr[0] = 17;
1654 state->CH_Ctrl[23].bit[0] = 5;
1655 state->CH_Ctrl[23].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001656
Steven Toth3935c252008-05-01 05:45:44 -03001657 state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ;
1658 state->CH_Ctrl[24].size = 1 ;
1659 state->CH_Ctrl[24].addr[0] = 111;
1660 state->CH_Ctrl[24].bit[0] = 3;
1661 state->CH_Ctrl[24].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001662
Steven Toth3935c252008-05-01 05:45:44 -03001663 state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ;
1664 state->CH_Ctrl[25].size = 1 ;
1665 state->CH_Ctrl[25].addr[0] = 112;
1666 state->CH_Ctrl[25].bit[0] = 7;
1667 state->CH_Ctrl[25].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001668
Steven Toth3935c252008-05-01 05:45:44 -03001669 state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ;
1670 state->CH_Ctrl[26].size = 1 ;
1671 state->CH_Ctrl[26].addr[0] = 136;
1672 state->CH_Ctrl[26].bit[0] = 7;
1673 state->CH_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001674
Steven Toth3935c252008-05-01 05:45:44 -03001675 state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ;
1676 state->CH_Ctrl[27].size = 1 ;
1677 state->CH_Ctrl[27].addr[0] = 149;
1678 state->CH_Ctrl[27].bit[0] = 7;
1679 state->CH_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001680
Steven Toth3935c252008-05-01 05:45:44 -03001681 state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ;
1682 state->CH_Ctrl[28].size = 1 ;
1683 state->CH_Ctrl[28].addr[0] = 149;
1684 state->CH_Ctrl[28].bit[0] = 6;
1685 state->CH_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001686
Steven Toth3935c252008-05-01 05:45:44 -03001687 state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ;
1688 state->CH_Ctrl[29].size = 1 ;
1689 state->CH_Ctrl[29].addr[0] = 149;
1690 state->CH_Ctrl[29].bit[0] = 5;
1691 state->CH_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001692
Steven Toth3935c252008-05-01 05:45:44 -03001693 state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ;
1694 state->CH_Ctrl[30].size = 1 ;
1695 state->CH_Ctrl[30].addr[0] = 149;
1696 state->CH_Ctrl[30].bit[0] = 4;
1697 state->CH_Ctrl[30].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001698
Steven Toth3935c252008-05-01 05:45:44 -03001699 state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ;
1700 state->CH_Ctrl[31].size = 1 ;
1701 state->CH_Ctrl[31].addr[0] = 149;
1702 state->CH_Ctrl[31].bit[0] = 3;
1703 state->CH_Ctrl[31].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001704
Steven Toth3935c252008-05-01 05:45:44 -03001705 state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ;
1706 state->CH_Ctrl[32].size = 1 ;
1707 state->CH_Ctrl[32].addr[0] = 93;
1708 state->CH_Ctrl[32].bit[0] = 1;
1709 state->CH_Ctrl[32].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001710
Steven Toth3935c252008-05-01 05:45:44 -03001711 state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ;
1712 state->CH_Ctrl[33].size = 1 ;
1713 state->CH_Ctrl[33].addr[0] = 93;
1714 state->CH_Ctrl[33].bit[0] = 0;
1715 state->CH_Ctrl[33].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001716
Steven Toth3935c252008-05-01 05:45:44 -03001717 state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ;
1718 state->CH_Ctrl[34].size = 6 ;
1719 state->CH_Ctrl[34].addr[0] = 92;
1720 state->CH_Ctrl[34].bit[0] = 2;
1721 state->CH_Ctrl[34].val[0] = 0;
1722 state->CH_Ctrl[34].addr[1] = 92;
1723 state->CH_Ctrl[34].bit[1] = 3;
1724 state->CH_Ctrl[34].val[1] = 0;
1725 state->CH_Ctrl[34].addr[2] = 92;
1726 state->CH_Ctrl[34].bit[2] = 4;
1727 state->CH_Ctrl[34].val[2] = 0;
1728 state->CH_Ctrl[34].addr[3] = 92;
1729 state->CH_Ctrl[34].bit[3] = 5;
1730 state->CH_Ctrl[34].val[3] = 0;
1731 state->CH_Ctrl[34].addr[4] = 92;
1732 state->CH_Ctrl[34].bit[4] = 6;
1733 state->CH_Ctrl[34].val[4] = 0;
1734 state->CH_Ctrl[34].addr[5] = 92;
1735 state->CH_Ctrl[34].bit[5] = 7;
1736 state->CH_Ctrl[34].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001737
Steven Toth3935c252008-05-01 05:45:44 -03001738 state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ;
1739 state->CH_Ctrl[35].size = 6 ;
1740 state->CH_Ctrl[35].addr[0] = 93;
1741 state->CH_Ctrl[35].bit[0] = 2;
1742 state->CH_Ctrl[35].val[0] = 0;
1743 state->CH_Ctrl[35].addr[1] = 93;
1744 state->CH_Ctrl[35].bit[1] = 3;
1745 state->CH_Ctrl[35].val[1] = 0;
1746 state->CH_Ctrl[35].addr[2] = 93;
1747 state->CH_Ctrl[35].bit[2] = 4;
1748 state->CH_Ctrl[35].val[2] = 0;
1749 state->CH_Ctrl[35].addr[3] = 93;
1750 state->CH_Ctrl[35].bit[3] = 5;
1751 state->CH_Ctrl[35].val[3] = 0;
1752 state->CH_Ctrl[35].addr[4] = 93;
1753 state->CH_Ctrl[35].bit[4] = 6;
1754 state->CH_Ctrl[35].val[4] = 0;
1755 state->CH_Ctrl[35].addr[5] = 93;
1756 state->CH_Ctrl[35].bit[5] = 7;
1757 state->CH_Ctrl[35].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001758
1759#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03001760 state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ;
1761 state->CH_Ctrl[36].size = 1 ;
1762 state->CH_Ctrl[36].addr[0] = 109;
1763 state->CH_Ctrl[36].bit[0] = 1;
1764 state->CH_Ctrl[36].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001765
Steven Toth3935c252008-05-01 05:45:44 -03001766 state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ;
1767 state->CH_Ctrl[37].size = 2 ;
1768 state->CH_Ctrl[37].addr[0] = 112;
1769 state->CH_Ctrl[37].bit[0] = 5;
1770 state->CH_Ctrl[37].val[0] = 0;
1771 state->CH_Ctrl[37].addr[1] = 112;
1772 state->CH_Ctrl[37].bit[1] = 6;
1773 state->CH_Ctrl[37].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001774
Steven Toth3935c252008-05-01 05:45:44 -03001775 state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ;
1776 state->CH_Ctrl[38].size = 1 ;
1777 state->CH_Ctrl[38].addr[0] = 65;
1778 state->CH_Ctrl[38].bit[0] = 1;
1779 state->CH_Ctrl[38].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001780#endif
1781
1782 return 0 ;
1783}
1784
Steven Toth52c99bd2008-05-01 04:57:01 -03001785// MaxLinear source code - MXL5005_c.cpp
Steven Toth52c99bd2008-05-01 04:57:01 -03001786// MXL5005.cpp : Defines the initialization routines for the DLL.
1787// 2.6.12
Steven Toth5c1b2052008-05-01 07:04:09 -03001788// DONE
Steven Toth3935c252008-05-01 05:45:44 -03001789void InitTunerControls(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001790{
Steven Toth3935c252008-05-01 05:45:44 -03001791 MXL5005_RegisterInit(fe);
1792 MXL5005_ControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001793#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03001794 MXL5005_MXLControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001795#endif
1796}
1797
Steven Toth52c99bd2008-05-01 04:57:01 -03001798///////////////////////////////////////////////////////////////////////////////
1799// //
1800// Function: MXL_ConfigTuner //
1801// //
1802// Description: Configure MXL5005Tuner structure for desired //
1803// Channel Bandwidth/Channel Frequency //
1804// //
1805// //
1806// Functions used: //
Steven Totha8214d42008-05-01 05:02:58 -03001807// MXL_SynthIFLO_Calc //
Steven Toth52c99bd2008-05-01 04:57:01 -03001808// //
1809// Inputs: //
1810// Tuner_struct: structure defined at higher level //
1811// Mode: Tuner Mode (Analog/Digital) //
1812// IF_Mode: IF Mode ( Zero/Low ) //
Steven Toth3935c252008-05-01 05:45:44 -03001813// Bandwidth: Filter Channel Bandwidth (in Hz) //
Steven Toth52c99bd2008-05-01 04:57:01 -03001814// IF_out: Desired IF out Frequency (in Hz) //
1815// Fxtal: Crystal Frerquency (in Hz) //
Steven Toth3935c252008-05-01 05:45:44 -03001816// TOP: 0: Dual AGC; Value: take over point //
1817// IF_OUT_LOAD: IF out load resistor (200/300 Ohms) //
1818// CLOCK_OUT: 0: Turn off clock out; 1: turn on clock out //
1819// DIV_OUT: 0: Div-1; 1: Div-4 //
1820// CAPSELECT: 0: Disable On-chip pulling cap; 1: Enable //
1821// EN_RSSI: 0: Disable RSSI; 1: Enable RSSI //
Steven Toth52c99bd2008-05-01 04:57:01 -03001822// //
1823// Outputs: //
1824// Tuner //
1825// //
1826// Return: //
1827// 0 : Successful //
1828// > 0 : Failed //
1829// //
1830///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03001831// DONE
Steven Toth3935c252008-05-01 05:45:44 -03001832u16 MXL5005_TunerConfig(struct dvb_frontend *fe,
1833 u8 Mode, /* 0: Analog Mode ; 1: Digital Mode */
1834 u8 IF_mode, /* for Analog Mode, 0: zero IF; 1: low IF */
1835 u32 Bandwidth, /* filter channel bandwidth (6, 7, 8) */
1836 u32 IF_out, /* Desired IF Out Frequency */
1837 u32 Fxtal, /* XTAL Frequency */
1838 u8 AGC_Mode, /* AGC Mode - Dual AGC: 0, Single AGC: 1 */
1839 u16 TOP, /* 0: Dual AGC; Value: take over point */
1840 u16 IF_OUT_LOAD, /* IF Out Load Resistor (200 / 300 Ohms) */
1841 u8 CLOCK_OUT, /* 0: turn off clock out; 1: turn on clock out */
1842 u8 DIV_OUT, /* 0: Div-1; 1: Div-4 */
1843 u8 CAPSELECT, /* 0: disable On-Chip pulling cap; 1: enable */
1844 u8 EN_RSSI, /* 0: disable RSSI; 1: enable RSSI */
1845 u8 Mod_Type, /* Modulation Type; */
1846 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
1847 u8 TF_Type /* Tracking Filter */
1848 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
Steven Toth52c99bd2008-05-01 04:57:01 -03001849 )
1850{
Steven Toth85d220d2008-05-01 05:48:14 -03001851 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001852 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001853
Steven Toth3935c252008-05-01 05:45:44 -03001854 state->Mode = Mode;
1855 state->IF_Mode = IF_mode;
1856 state->Chan_Bandwidth = Bandwidth;
1857 state->IF_OUT = IF_out;
1858 state->Fxtal = Fxtal;
1859 state->AGC_Mode = AGC_Mode;
1860 state->TOP = TOP;
1861 state->IF_OUT_LOAD = IF_OUT_LOAD;
1862 state->CLOCK_OUT = CLOCK_OUT;
1863 state->DIV_OUT = DIV_OUT;
1864 state->CAPSELECT = CAPSELECT;
1865 state->EN_RSSI = EN_RSSI;
1866 state->Mod_Type = Mod_Type;
1867 state->TF_Type = TF_Type;
Steven Toth52c99bd2008-05-01 04:57:01 -03001868
Steven Totha8214d42008-05-01 05:02:58 -03001869 /* Initialize all the controls and registers */
Steven Toth3935c252008-05-01 05:45:44 -03001870 InitTunerControls(fe);
Steven Totha8214d42008-05-01 05:02:58 -03001871
1872 /* Synthesizer LO frequency calculation */
Steven Toth3935c252008-05-01 05:45:44 -03001873 MXL_SynthIFLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001874
Steven Toth3935c252008-05-01 05:45:44 -03001875 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001876}
1877
1878///////////////////////////////////////////////////////////////////////////////
1879// //
1880// Function: MXL_SynthIFLO_Calc //
1881// //
1882// Description: Calculate Internal IF-LO Frequency //
1883// //
1884// Globals: //
1885// NONE //
1886// //
1887// Functions used: //
1888// NONE //
1889// //
1890// Inputs: //
1891// Tuner_struct: structure defined at higher level //
1892// //
1893// Outputs: //
1894// Tuner //
1895// //
1896// Return: //
1897// 0 : Successful //
1898// > 0 : Failed //
1899// //
1900///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03001901// DONE
Steven Toth3935c252008-05-01 05:45:44 -03001902void MXL_SynthIFLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001903{
Steven Toth85d220d2008-05-01 05:48:14 -03001904 struct mxl5005s_state *state = fe->tuner_priv;
1905 if (state->Mode == 1) /* Digital Mode */
Steven Toth3935c252008-05-01 05:45:44 -03001906 state->IF_LO = state->IF_OUT;
1907 else /* Analog Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03001908 {
Steven Toth3935c252008-05-01 05:45:44 -03001909 if(state->IF_Mode == 0) /* Analog Zero IF mode */
1910 state->IF_LO = state->IF_OUT + 400000;
1911 else /* Analog Low IF mode */
1912 state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2;
Steven Toth52c99bd2008-05-01 04:57:01 -03001913 }
1914}
1915
1916///////////////////////////////////////////////////////////////////////////////
1917// //
1918// Function: MXL_SynthRFTGLO_Calc //
1919// //
1920// Description: Calculate Internal RF-LO frequency and //
1921// internal Tone-Gen(TG)-LO frequency //
1922// //
1923// Globals: //
1924// NONE //
1925// //
1926// Functions used: //
1927// NONE //
1928// //
1929// Inputs: //
1930// Tuner_struct: structure defined at higher level //
1931// //
1932// Outputs: //
1933// Tuner //
1934// //
1935// Return: //
1936// 0 : Successful //
1937// > 0 : Failed //
1938// //
1939///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03001940// DONE
Steven Toth3935c252008-05-01 05:45:44 -03001941void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001942{
Steven Toth85d220d2008-05-01 05:48:14 -03001943 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001944
1945 if (state->Mode == 1) /* Digital Mode */ {
Steven Toth52c99bd2008-05-01 04:57:01 -03001946 //remove 20.48MHz setting for 2.6.10
Steven Toth3935c252008-05-01 05:45:44 -03001947 state->RF_LO = state->RF_IN;
1948 state->TG_LO = state->RF_IN - 750000; //change for 2.6.6
1949 } else /* Analog Mode */ {
1950 if(state->IF_Mode == 0) /* Analog Zero IF mode */ {
1951 state->RF_LO = state->RF_IN - 400000;
1952 state->TG_LO = state->RF_IN - 1750000;
1953 } else /* Analog Low IF mode */ {
1954 state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2;
1955 state->TG_LO = state->RF_IN - state->Chan_Bandwidth + 500000;
Steven Toth52c99bd2008-05-01 04:57:01 -03001956 }
1957 }
1958}
1959
1960///////////////////////////////////////////////////////////////////////////////
1961// //
1962// Function: MXL_OverwriteICDefault //
1963// //
1964// Description: Overwrite the Default Register Setting //
1965// //
1966// //
1967// Functions used: //
1968// //
1969// Inputs: //
1970// Tuner_struct: structure defined at higher level //
1971// Outputs: //
1972// Tuner //
1973// //
1974// Return: //
1975// 0 : Successful //
1976// > 0 : Failed //
1977// //
1978///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03001979// DONE
Steven Toth3935c252008-05-01 05:45:44 -03001980u16 MXL_OverwriteICDefault(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001981{
Steven Toth3935c252008-05-01 05:45:44 -03001982 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001983
Steven Toth3935c252008-05-01 05:45:44 -03001984 status += MXL_ControlWrite(fe, OVERRIDE_1, 1);
1985 status += MXL_ControlWrite(fe, OVERRIDE_2, 1);
1986 status += MXL_ControlWrite(fe, OVERRIDE_3, 1);
1987 status += MXL_ControlWrite(fe, OVERRIDE_4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001988
Steven Toth3935c252008-05-01 05:45:44 -03001989 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001990}
1991
1992///////////////////////////////////////////////////////////////////////////////
1993// //
1994// Function: MXL_BlockInit //
1995// //
1996// Description: Tuner Initialization as a function of 'User Settings' //
1997// * User settings in Tuner strcuture must be assigned //
1998// first //
1999// //
2000// Globals: //
2001// NONE //
2002// //
2003// Functions used: //
2004// Tuner_struct: structure defined at higher level //
2005// //
2006// Inputs: //
2007// Tuner : Tuner structure defined at higher level //
2008// //
2009// Outputs: //
2010// Tuner //
2011// //
2012// Return: //
2013// 0 : Successful //
2014// > 0 : Failed //
2015// //
2016///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03002017// DONE
Steven Toth3935c252008-05-01 05:45:44 -03002018u16 MXL_BlockInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03002019{
Steven Toth85d220d2008-05-01 05:48:14 -03002020 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03002021 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03002022
Steven Toth3935c252008-05-01 05:45:44 -03002023 status += MXL_OverwriteICDefault(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002024
Steven Toth3935c252008-05-01 05:45:44 -03002025 /* Downconverter Control Dig Ana */
2026 status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002027
Steven Toth3935c252008-05-01 05:45:44 -03002028 /* Filter Control Dig Ana */
2029 status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1);
2030 status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2);
2031 status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0);
2032 status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1);
2033 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002034
Steven Toth3935c252008-05-01 05:45:44 -03002035 /* Initialize Low-Pass Filter */
2036 if (state->Mode) { /* Digital Mode */
2037 switch (state->Chan_Bandwidth) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002038 case 8000000:
Steven Toth3935c252008-05-01 05:45:44 -03002039 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0);
2040 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002041 case 7000000:
Steven Toth3935c252008-05-01 05:45:44 -03002042 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2);
2043 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002044 case 6000000:
Steven Toth3935c252008-05-01 05:45:44 -03002045 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 3);
2046 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002047 }
Steven Toth3935c252008-05-01 05:45:44 -03002048 } else { /* Analog Mode */
2049 switch (state->Chan_Bandwidth) {
2050 case 8000000: /* Low Zero */
2051 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 0 : 3));
2052 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002053 case 7000000:
Steven Toth3935c252008-05-01 05:45:44 -03002054 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 1 : 4));
2055 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002056 case 6000000:
Steven Toth3935c252008-05-01 05:45:44 -03002057 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 2 : 5));
2058 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002059 }
2060 }
2061
Steven Toth3935c252008-05-01 05:45:44 -03002062 /* Charge Pump Control Dig Ana */
2063 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8);
2064 status += MXL_ControlWrite(fe, RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1);
2065 status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002066
Steven Toth3935c252008-05-01 05:45:44 -03002067 /* AGC TOP Control */
2068 if (state->AGC_Mode == 0) /* Dual AGC */ {
2069 status += MXL_ControlWrite(fe, AGC_IF, 15);
2070 status += MXL_ControlWrite(fe, AGC_RF, 15);
Steven Toth52c99bd2008-05-01 04:57:01 -03002071 }
Steven Toth3935c252008-05-01 05:45:44 -03002072 else /* Single AGC Mode Dig Ana */
2073 status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03002074
Steven Toth5c1b2052008-05-01 07:04:09 -03002075
Steven Toth3935c252008-05-01 05:45:44 -03002076 if (state->TOP == 55) /* TOP == 5.5 */
2077 status += MXL_ControlWrite(fe, AGC_IF, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002078
Steven Toth3935c252008-05-01 05:45:44 -03002079 if (state->TOP == 72) /* TOP == 7.2 */
2080 status += MXL_ControlWrite(fe, AGC_IF, 0x1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002081
Steven Toth3935c252008-05-01 05:45:44 -03002082 if (state->TOP == 92) /* TOP == 9.2 */
2083 status += MXL_ControlWrite(fe, AGC_IF, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002084
Steven Toth3935c252008-05-01 05:45:44 -03002085 if (state->TOP == 110) /* TOP == 11.0 */
2086 status += MXL_ControlWrite(fe, AGC_IF, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002087
Steven Toth3935c252008-05-01 05:45:44 -03002088 if (state->TOP == 129) /* TOP == 12.9 */
2089 status += MXL_ControlWrite(fe, AGC_IF, 0x4);
Steven Toth52c99bd2008-05-01 04:57:01 -03002090
Steven Toth3935c252008-05-01 05:45:44 -03002091 if (state->TOP == 147) /* TOP == 14.7 */
2092 status += MXL_ControlWrite(fe, AGC_IF, 0x5);
Steven Toth52c99bd2008-05-01 04:57:01 -03002093
Steven Toth3935c252008-05-01 05:45:44 -03002094 if (state->TOP == 168) /* TOP == 16.8 */
2095 status += MXL_ControlWrite(fe, AGC_IF, 0x6);
Steven Toth52c99bd2008-05-01 04:57:01 -03002096
Steven Toth3935c252008-05-01 05:45:44 -03002097 if (state->TOP == 194) /* TOP == 19.4 */
2098 status += MXL_ControlWrite(fe, AGC_IF, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03002099
Steven Toth3935c252008-05-01 05:45:44 -03002100 if (state->TOP == 212) /* TOP == 21.2 */
2101 status += MXL_ControlWrite(fe, AGC_IF, 0x9);
Steven Toth52c99bd2008-05-01 04:57:01 -03002102
Steven Toth3935c252008-05-01 05:45:44 -03002103 if (state->TOP == 232) /* TOP == 23.2 */
2104 status += MXL_ControlWrite(fe, AGC_IF, 0xA);
Steven Toth52c99bd2008-05-01 04:57:01 -03002105
Steven Toth3935c252008-05-01 05:45:44 -03002106 if (state->TOP == 252) /* TOP == 25.2 */
2107 status += MXL_ControlWrite(fe, AGC_IF, 0xB);
Steven Toth52c99bd2008-05-01 04:57:01 -03002108
Steven Toth3935c252008-05-01 05:45:44 -03002109 if (state->TOP == 271) /* TOP == 27.1 */
2110 status += MXL_ControlWrite(fe, AGC_IF, 0xC);
Steven Toth52c99bd2008-05-01 04:57:01 -03002111
Steven Toth3935c252008-05-01 05:45:44 -03002112 if (state->TOP == 292) /* TOP == 29.2 */
2113 status += MXL_ControlWrite(fe, AGC_IF, 0xD);
Steven Toth52c99bd2008-05-01 04:57:01 -03002114
Steven Toth3935c252008-05-01 05:45:44 -03002115 if (state->TOP == 317) /* TOP == 31.7 */
2116 status += MXL_ControlWrite(fe, AGC_IF, 0xE);
Steven Toth52c99bd2008-05-01 04:57:01 -03002117
Steven Toth3935c252008-05-01 05:45:44 -03002118 if (state->TOP == 349) /* TOP == 34.9 */
2119 status += MXL_ControlWrite(fe, AGC_IF, 0xF);
Steven Toth52c99bd2008-05-01 04:57:01 -03002120
Steven Toth3935c252008-05-01 05:45:44 -03002121 /* IF Synthesizer Control */
2122 status += MXL_IFSynthInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002123
Steven Toth3935c252008-05-01 05:45:44 -03002124 /* IF UpConverter Control */
2125 if (state->IF_OUT_LOAD == 200) {
2126 status += MXL_ControlWrite(fe, DRV_RES_SEL, 6);
2127 status += MXL_ControlWrite(fe, I_DRIVER, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002128 }
Steven Toth3935c252008-05-01 05:45:44 -03002129 if (state->IF_OUT_LOAD == 300) {
2130 status += MXL_ControlWrite(fe, DRV_RES_SEL, 4);
2131 status += MXL_ControlWrite(fe, I_DRIVER, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002132 }
2133
Steven Toth3935c252008-05-01 05:45:44 -03002134 /* Anti-Alias Filtering Control
2135 * initialise Anti-Aliasing Filter
2136 */
2137 if (state->Mode) { /* Digital Mode */
2138 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) {
2139 status += MXL_ControlWrite(fe, EN_AAF, 1);
2140 status += MXL_ControlWrite(fe, EN_3P, 1);
2141 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2142 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002143 }
Steven Toth3935c252008-05-01 05:45:44 -03002144 if ((state->IF_OUT == 36125000UL) || (state->IF_OUT == 36150000UL)) {
2145 status += MXL_ControlWrite(fe, EN_AAF, 1);
2146 status += MXL_ControlWrite(fe, EN_3P, 1);
2147 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2148 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002149 }
Steven Toth3935c252008-05-01 05:45:44 -03002150 if (state->IF_OUT > 36150000UL) {
2151 status += MXL_ControlWrite(fe, EN_AAF, 0);
2152 status += MXL_ControlWrite(fe, EN_3P, 1);
2153 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2154 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002155 }
Steven Toth3935c252008-05-01 05:45:44 -03002156 } else { /* Analog Mode */
2157 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002158 {
Steven Toth3935c252008-05-01 05:45:44 -03002159 status += MXL_ControlWrite(fe, EN_AAF, 1);
2160 status += MXL_ControlWrite(fe, EN_3P, 1);
2161 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2162 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002163 }
Steven Toth3935c252008-05-01 05:45:44 -03002164 if (state->IF_OUT > 5000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002165 {
Steven Toth3935c252008-05-01 05:45:44 -03002166 status += MXL_ControlWrite(fe, EN_AAF, 0);
2167 status += MXL_ControlWrite(fe, EN_3P, 0);
2168 status += MXL_ControlWrite(fe, EN_AUX_3P, 0);
2169 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002170 }
2171 }
2172
Steven Toth3935c252008-05-01 05:45:44 -03002173 /* Demod Clock Out */
2174 if (state->CLOCK_OUT)
2175 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002176 else
Steven Toth3935c252008-05-01 05:45:44 -03002177 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002178
Steven Toth3935c252008-05-01 05:45:44 -03002179 if (state->DIV_OUT == 1)
2180 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1);
2181 if (state->DIV_OUT == 0)
2182 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002183
Steven Toth3935c252008-05-01 05:45:44 -03002184 /* Crystal Control */
2185 if (state->CAPSELECT)
2186 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002187 else
Steven Toth3935c252008-05-01 05:45:44 -03002188 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002189
Steven Toth3935c252008-05-01 05:45:44 -03002190 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
2191 status += MXL_ControlWrite(fe, IF_SEL_DBL, 1);
2192 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
2193 status += MXL_ControlWrite(fe, IF_SEL_DBL, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002194
Steven Toth3935c252008-05-01 05:45:44 -03002195 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2196 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3);
2197 if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL)
2198 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002199
Steven Toth3935c252008-05-01 05:45:44 -03002200 /* Misc Controls */
Steven Toth85d220d2008-05-01 05:48:14 -03002201 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */
Steven Toth3935c252008-05-01 05:45:44 -03002202 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002203 else
Steven Toth3935c252008-05-01 05:45:44 -03002204 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002205
Steven Toth3935c252008-05-01 05:45:44 -03002206 /* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */
Steven Toth52c99bd2008-05-01 04:57:01 -03002207
Steven Toth3935c252008-05-01 05:45:44 -03002208 /* Set TG_R_DIV */
2209 status += MXL_ControlWrite(fe, TG_R_DIV, MXL_Ceiling(state->Fxtal, 1000000));
Steven Toth52c99bd2008-05-01 04:57:01 -03002210
Steven Toth3935c252008-05-01 05:45:44 -03002211 /* Apply Default value to BB_INITSTATE_DLPF_TUNE */
Steven Toth52c99bd2008-05-01 04:57:01 -03002212
Steven Toth3935c252008-05-01 05:45:44 -03002213 /* RSSI Control */
2214 if (state->EN_RSSI)
Steven Toth52c99bd2008-05-01 04:57:01 -03002215 {
Steven Toth3935c252008-05-01 05:45:44 -03002216 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2217 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2218 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2219 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2220
2221 /* RSSI reference point */
2222 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2223 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3);
2224 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2225
2226 /* TOP point */
2227 status += MXL_ControlWrite(fe, RFA_FLR, 0);
2228 status += MXL_ControlWrite(fe, RFA_CEIL, 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03002229 }
2230
Steven Toth3935c252008-05-01 05:45:44 -03002231 /* Modulation type bit settings
2232 * Override the control values preset
2233 */
2234 if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002235 {
Steven Toth3935c252008-05-01 05:45:44 -03002236 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002237
Steven Toth3935c252008-05-01 05:45:44 -03002238 /* Enable RSSI */
2239 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2240 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2241 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2242 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2243
2244 /* RSSI reference point */
2245 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2246 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2247 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2248
2249 /* TOP point */
2250 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2251 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2252 if (state->IF_OUT <= 6280000UL) /* Low IF */
2253 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2254 else /* High IF */
2255 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002256
2257 }
Steven Toth3935c252008-05-01 05:45:44 -03002258 if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002259 {
Steven Toth85d220d2008-05-01 05:48:14 -03002260 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002261
Steven Toth3935c252008-05-01 05:45:44 -03002262 /* Enable RSSI */
2263 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2264 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2265 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2266 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002267
Steven Toth3935c252008-05-01 05:45:44 -03002268 /* RSSI reference point */
2269 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2270 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4);
2271 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2272
2273 /* TOP point */
2274 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2275 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2276 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1);
2277 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5); /* Low Zero */
2278 if (state->IF_OUT <= 6280000UL) /* Low IF */
2279 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2280 else /* High IF */
2281 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002282 }
Steven Toth3935c252008-05-01 05:45:44 -03002283 if (state->Mod_Type == MXL_QAM) /* QAM Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002284 {
Steven Toth3935c252008-05-01 05:45:44 -03002285 state->Mode = MXL_DIGITAL_MODE;
Steven Toth52c99bd2008-05-01 04:57:01 -03002286
Steven Toth3935c252008-05-01 05:45:44 -03002287 /* state->AGC_Mode = 1; */ /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002288
Steven Toth3935c252008-05-01 05:45:44 -03002289 /* Disable RSSI */ /* change here for v2.6.5 */
2290 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2291 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2292 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2293 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002294
Steven Toth3935c252008-05-01 05:45:44 -03002295 /* RSSI reference point */
2296 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2297 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2298 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2299 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); /* change here for v2.6.5 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002300
Steven Toth3935c252008-05-01 05:45:44 -03002301 if (state->IF_OUT <= 6280000UL) /* Low IF */
2302 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2303 else /* High IF */
2304 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002305 }
Steven Toth3935c252008-05-01 05:45:44 -03002306 if (state->Mod_Type == MXL_ANALOG_CABLE) {
2307 /* Analog Cable Mode */
Steven Toth85d220d2008-05-01 05:48:14 -03002308 /* state->Mode = MXL_DIGITAL_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002309
Steven Toth3935c252008-05-01 05:45:44 -03002310 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002311
Steven Toth3935c252008-05-01 05:45:44 -03002312 /* Disable RSSI */
2313 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2314 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2315 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2316 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2317 status += MXL_ControlWrite(fe, AGC_IF, 1); /* change for 2.6.3 */
2318 status += MXL_ControlWrite(fe, AGC_RF, 15);
2319 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002320 }
2321
Steven Toth3935c252008-05-01 05:45:44 -03002322 if (state->Mod_Type == MXL_ANALOG_OTA) {
2323 /* Analog OTA Terrestrial mode add for 2.6.7 */
2324 /* state->Mode = MXL_ANALOG_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002325
Steven Toth3935c252008-05-01 05:45:44 -03002326 /* Enable RSSI */
2327 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2328 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2329 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2330 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002331
Steven Toth3935c252008-05-01 05:45:44 -03002332 /* RSSI reference point */
2333 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2334 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2335 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2336 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2337 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002338 }
2339
Steven Toth3935c252008-05-01 05:45:44 -03002340 /* RSSI disable */
Steven Toth5c1b2052008-05-01 07:04:09 -03002341 if(state->EN_RSSI==0) {
Steven Toth3935c252008-05-01 05:45:44 -03002342 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2343 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2344 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2345 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002346 }
2347
Steven Toth3935c252008-05-01 05:45:44 -03002348 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03002349}
2350
2351///////////////////////////////////////////////////////////////////////////////
2352// //
2353// Function: MXL_IFSynthInit //
2354// //
2355// Description: Tuner IF Synthesizer related register initialization //
2356// //
2357// Globals: //
2358// NONE //
2359// //
2360// Functions used: //
2361// Tuner_struct: structure defined at higher level //
2362// //
2363// Inputs: //
2364// Tuner : Tuner structure defined at higher level //
2365// //
2366// Outputs: //
2367// Tuner //
2368// //
2369// Return: //
2370// 0 : Successful //
2371// > 0 : Failed //
2372// //
2373///////////////////////////////////////////////////////////////////////////////
Steven Toth85d220d2008-05-01 05:48:14 -03002374u16 MXL_IFSynthInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03002375{
Steven Toth85d220d2008-05-01 05:48:14 -03002376 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03002377 u16 status = 0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002378 // Declare Local Variables
Steven Totha8214d42008-05-01 05:02:58 -03002379 u32 Fref = 0 ;
2380 u32 Kdbl, intModVal ;
2381 u32 fracModVal ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002382 Kdbl = 2 ;
2383
Steven Toth3935c252008-05-01 05:45:44 -03002384 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002385 Kdbl = 2 ;
Steven Toth3935c252008-05-01 05:45:44 -03002386 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002387 Kdbl = 1 ;
2388
2389 //
2390 // IF Synthesizer Control
2391 //
Steven Toth85d220d2008-05-01 05:48:14 -03002392 if (state->Mode == 0 && state->IF_Mode == 1) // Analog Low IF mode
Steven Toth52c99bd2008-05-01 04:57:01 -03002393 {
Steven Toth85d220d2008-05-01 05:48:14 -03002394 if (state->IF_LO == 41000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002395 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2396 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002397 Fref = 328000000UL ;
2398 }
Steven Toth85d220d2008-05-01 05:48:14 -03002399 if (state->IF_LO == 47000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002400 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2401 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002402 Fref = 376000000UL ;
2403 }
Steven Toth85d220d2008-05-01 05:48:14 -03002404 if (state->IF_LO == 54000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002405 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2406 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002407 Fref = 324000000UL ;
2408 }
Steven Toth85d220d2008-05-01 05:48:14 -03002409 if (state->IF_LO == 60000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002410 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2411 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002412 Fref = 360000000UL ;
2413 }
Steven Toth85d220d2008-05-01 05:48:14 -03002414 if (state->IF_LO == 39250000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002415 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2416 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002417 Fref = 314000000UL ;
2418 }
Steven Toth85d220d2008-05-01 05:48:14 -03002419 if (state->IF_LO == 39650000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002420 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2421 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002422 Fref = 317200000UL ;
2423 }
Steven Toth85d220d2008-05-01 05:48:14 -03002424 if (state->IF_LO == 40150000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002425 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2426 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002427 Fref = 321200000UL ;
2428 }
Steven Toth85d220d2008-05-01 05:48:14 -03002429 if (state->IF_LO == 40650000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002430 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2431 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002432 Fref = 325200000UL ;
2433 }
2434 }
2435
Steven Toth85d220d2008-05-01 05:48:14 -03002436 if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0))
Steven Toth52c99bd2008-05-01 04:57:01 -03002437 {
Steven Toth85d220d2008-05-01 05:48:14 -03002438 if (state->IF_LO == 57000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002439 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2440 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002441 Fref = 342000000UL ;
2442 }
Steven Toth85d220d2008-05-01 05:48:14 -03002443 if (state->IF_LO == 44000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002444 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2445 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002446 Fref = 352000000UL ;
2447 }
Steven Toth85d220d2008-05-01 05:48:14 -03002448 if (state->IF_LO == 43750000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002449 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2450 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002451 Fref = 350000000UL ;
2452 }
Steven Toth85d220d2008-05-01 05:48:14 -03002453 if (state->IF_LO == 36650000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002454 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2455 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002456 Fref = 366500000UL ;
2457 }
Steven Toth85d220d2008-05-01 05:48:14 -03002458 if (state->IF_LO == 36150000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002459 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2460 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002461 Fref = 361500000UL ;
2462 }
Steven Toth85d220d2008-05-01 05:48:14 -03002463 if (state->IF_LO == 36000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002464 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2465 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002466 Fref = 360000000UL ;
2467 }
Steven Toth85d220d2008-05-01 05:48:14 -03002468 if (state->IF_LO == 35250000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002469 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2470 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002471 Fref = 352500000UL ;
2472 }
Steven Toth85d220d2008-05-01 05:48:14 -03002473 if (state->IF_LO == 34750000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002474 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2475 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002476 Fref = 347500000UL ;
2477 }
Steven Toth85d220d2008-05-01 05:48:14 -03002478 if (state->IF_LO == 6280000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002479 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2480 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002481 Fref = 376800000UL ;
2482 }
Steven Toth85d220d2008-05-01 05:48:14 -03002483 if (state->IF_LO == 5000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002484 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
2485 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002486 Fref = 360000000UL ;
2487 }
Steven Toth85d220d2008-05-01 05:48:14 -03002488 if (state->IF_LO == 4500000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002489 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
2490 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002491 Fref = 360000000UL ;
2492 }
Steven Toth85d220d2008-05-01 05:48:14 -03002493 if (state->IF_LO == 4570000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002494 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
2495 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002496 Fref = 365600000UL ;
2497 }
Steven Toth85d220d2008-05-01 05:48:14 -03002498 if (state->IF_LO == 4000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002499 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05) ;
2500 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002501 Fref = 360000000UL ;
2502 }
Steven Toth85d220d2008-05-01 05:48:14 -03002503 if (state->IF_LO == 57400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002504 {
Steven Toth3935c252008-05-01 05:45:44 -03002505 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2506 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002507 Fref = 344400000UL ;
2508 }
Steven Toth85d220d2008-05-01 05:48:14 -03002509 if (state->IF_LO == 44400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002510 {
Steven Toth3935c252008-05-01 05:45:44 -03002511 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2512 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002513 Fref = 355200000UL ;
2514 }
Steven Toth85d220d2008-05-01 05:48:14 -03002515 if (state->IF_LO == 44150000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002516 {
Steven Toth3935c252008-05-01 05:45:44 -03002517 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2518 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002519 Fref = 353200000UL ;
2520 }
Steven Toth85d220d2008-05-01 05:48:14 -03002521 if (state->IF_LO == 37050000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002522 {
Steven Toth3935c252008-05-01 05:45:44 -03002523 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2524 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002525 Fref = 370500000UL ;
2526 }
Steven Toth85d220d2008-05-01 05:48:14 -03002527 if (state->IF_LO == 36550000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002528 {
Steven Toth3935c252008-05-01 05:45:44 -03002529 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2530 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002531 Fref = 365500000UL ;
2532 }
Steven Toth85d220d2008-05-01 05:48:14 -03002533 if (state->IF_LO == 36125000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002534 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2535 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002536 Fref = 361250000UL ;
2537 }
Steven Toth85d220d2008-05-01 05:48:14 -03002538 if (state->IF_LO == 6000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002539 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2540 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002541 Fref = 360000000UL ;
2542 }
Steven Toth85d220d2008-05-01 05:48:14 -03002543 if (state->IF_LO == 5400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002544 {
Steven Toth3935c252008-05-01 05:45:44 -03002545 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2546 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002547 Fref = 324000000UL ;
2548 }
Steven Toth85d220d2008-05-01 05:48:14 -03002549 if (state->IF_LO == 5380000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002550 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2551 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002552 Fref = 322800000UL ;
2553 }
Steven Toth85d220d2008-05-01 05:48:14 -03002554 if (state->IF_LO == 5200000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002555 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
2556 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002557 Fref = 374400000UL ;
2558 }
Steven Toth85d220d2008-05-01 05:48:14 -03002559 if (state->IF_LO == 4900000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002560 {
Steven Toth3935c252008-05-01 05:45:44 -03002561 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
2562 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002563 Fref = 352800000UL ;
2564 }
Steven Toth85d220d2008-05-01 05:48:14 -03002565 if (state->IF_LO == 4400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002566 {
Steven Toth3935c252008-05-01 05:45:44 -03002567 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
2568 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002569 Fref = 352000000UL ;
2570 }
Steven Toth85d220d2008-05-01 05:48:14 -03002571 if (state->IF_LO == 4063000UL) //add for 2.6.8
Steven Toth52c99bd2008-05-01 04:57:01 -03002572 {
Steven Toth3935c252008-05-01 05:45:44 -03002573 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05) ;
2574 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002575 Fref = 365670000UL ;
2576 }
2577 }
2578 // CHCAL_INT_MOD_IF
2579 // CHCAL_FRAC_MOD_IF
Steven Toth3935c252008-05-01 05:45:44 -03002580 intModVal = Fref / (state->Fxtal * Kdbl/2) ;
2581 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal ) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002582
Steven Toth3935c252008-05-01 05:45:44 -03002583 fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) * intModVal);
2584 fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000) ;
2585 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002586
Steven Toth52c99bd2008-05-01 04:57:01 -03002587 return status ;
2588}
2589
2590///////////////////////////////////////////////////////////////////////////////
2591// //
2592// Function: MXL_GetXtalInt //
2593// //
Steven Totha8214d42008-05-01 05:02:58 -03002594// Description: return the Crystal Integration Value for //
2595// TG_VCO_BIAS calculation //
Steven Toth52c99bd2008-05-01 04:57:01 -03002596// //
2597// Globals: //
2598// NONE //
2599// //
2600// Functions used: //
Steven Totha8214d42008-05-01 05:02:58 -03002601// NONE //
Steven Toth52c99bd2008-05-01 04:57:01 -03002602// //
2603// Inputs: //
2604// Crystal Frequency Value in Hz //
2605// //
2606// Outputs: //
2607// Calculated Crystal Frequency Integration Value //
2608// //
2609// Return: //
2610// 0 : Successful //
2611// > 0 : Failed //
2612// //
2613///////////////////////////////////////////////////////////////////////////////
Steven Totha8214d42008-05-01 05:02:58 -03002614u32 MXL_GetXtalInt(u32 Xtal_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002615{
2616 if ((Xtal_Freq % 1000000) == 0)
2617 return (Xtal_Freq / 10000) ;
2618 else
2619 return (((Xtal_Freq / 1000000) + 1)*100) ;
2620}
2621
2622///////////////////////////////////////////////////////////////////////////////
2623// //
2624// Function: MXL5005_TuneRF //
2625// //
2626// Description: Set control names to tune to requested RF_IN frequency //
2627// //
2628// Globals: //
2629// None //
2630// //
2631// Functions used: //
2632// MXL_SynthRFTGLO_Calc //
2633// MXL5005_ControlWrite //
Steven Toth3935c252008-05-01 05:45:44 -03002634// MXL_GetXtalInt //
Steven Toth52c99bd2008-05-01 04:57:01 -03002635// //
2636// Inputs: //
2637// Tuner : Tuner structure defined at higher level //
2638// //
2639// Outputs: //
2640// Tuner //
2641// //
2642// Return: //
2643// 0 : Successful //
2644// 1 : Unsuccessful //
2645///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03002646u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002647{
Steven Toth85d220d2008-05-01 05:48:14 -03002648 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03002649 // Declare Local Variables
Steven Toth3935c252008-05-01 05:45:44 -03002650 u16 status = 0;
2651 u32 divider_val, E3, E4, E5, E5A;
2652 u32 Fmax, Fmin, FmaxBin, FminBin;
Steven Totha8214d42008-05-01 05:02:58 -03002653 u32 Kdbl_RF = 2;
Steven Toth3935c252008-05-01 05:45:44 -03002654 u32 tg_divval;
2655 u32 tg_lo;
2656 u32 Xtal_Int;
Steven Toth52c99bd2008-05-01 04:57:01 -03002657
Steven Totha8214d42008-05-01 05:02:58 -03002658 u32 Fref_TG;
2659 u32 Fvco;
2660// u32 temp;
Steven Toth52c99bd2008-05-01 04:57:01 -03002661
2662
Steven Toth3935c252008-05-01 05:45:44 -03002663 Xtal_Int = MXL_GetXtalInt(state->Fxtal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002664
Steven Toth3935c252008-05-01 05:45:44 -03002665 state->RF_IN = RF_Freq;
Steven Toth52c99bd2008-05-01 04:57:01 -03002666
Steven Toth3935c252008-05-01 05:45:44 -03002667 MXL_SynthRFTGLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002668
Steven Toth3935c252008-05-01 05:45:44 -03002669 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2670 Kdbl_RF = 2;
2671 if (state->Fxtal > 22000000 && state->Fxtal <= 32000000)
2672 Kdbl_RF = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03002673
2674 //
2675 // Downconverter Controls
2676 //
2677 // Look-Up Table Implementation for:
2678 // DN_POLY
2679 // DN_RFGAIN
2680 // DN_CAP_RFLPF
2681 // DN_EN_VHFUHFBAR
2682 // DN_GAIN_ADJUST
2683 // Change the boundary reference from RF_IN to RF_LO
Steven Toth3935c252008-05-01 05:45:44 -03002684 if (state->RF_LO < 40000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002685 return -1;
2686 }
Steven Toth3935c252008-05-01 05:45:44 -03002687 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002688 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002689 status += MXL_ControlWrite(fe, DN_POLY, 2);
2690 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2691 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 423);
2692 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2693 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002694 }
Steven Toth3935c252008-05-01 05:45:44 -03002695 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002696 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002697 status += MXL_ControlWrite(fe, DN_POLY, 3);
2698 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2699 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 222);
2700 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2701 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002702 }
Steven Toth3935c252008-05-01 05:45:44 -03002703 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002704 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002705 status += MXL_ControlWrite(fe, DN_POLY, 3);
2706 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2707 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 147);
2708 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2709 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002710 }
Steven Toth3935c252008-05-01 05:45:44 -03002711 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002712 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002713 status += MXL_ControlWrite(fe, DN_POLY, 3);
2714 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2715 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 9);
2716 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2717 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002718 }
Steven Toth3935c252008-05-01 05:45:44 -03002719 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002720 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002721 status += MXL_ControlWrite(fe, DN_POLY, 3) ;
2722 status += MXL_ControlWrite(fe, DN_RFGAIN, 3) ;
2723 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
2724 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1) ;
2725 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002726 }
Steven Toth3935c252008-05-01 05:45:44 -03002727 if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002728 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002729 status += MXL_ControlWrite(fe, DN_POLY, 3) ;
2730 status += MXL_ControlWrite(fe, DN_RFGAIN, 1) ;
2731 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
2732 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0) ;
2733 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002734 }
Steven Toth3935c252008-05-01 05:45:44 -03002735 if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002736 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002737 status += MXL_ControlWrite(fe, DN_POLY, 3) ;
2738 status += MXL_ControlWrite(fe, DN_RFGAIN, 2) ;
2739 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
2740 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0) ;
2741 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002742 }
Steven Toth3935c252008-05-01 05:45:44 -03002743 if (state->RF_LO > 900000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002744 return -1;
2745 }
2746 // DN_IQTNBUF_AMP
2747 // DN_IQTNGNBFBIAS_BST
Steven Toth3935c252008-05-01 05:45:44 -03002748 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
2749 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2750 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002751 }
Steven Toth3935c252008-05-01 05:45:44 -03002752 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
2753 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2754 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002755 }
Steven Toth3935c252008-05-01 05:45:44 -03002756 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
2757 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2758 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002759 }
Steven Toth3935c252008-05-01 05:45:44 -03002760 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
2761 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2762 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002763 }
Steven Toth3935c252008-05-01 05:45:44 -03002764 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
2765 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2766 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002767 }
Steven Toth3935c252008-05-01 05:45:44 -03002768 if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) {
2769 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2770 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002771 }
Steven Toth3935c252008-05-01 05:45:44 -03002772 if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) {
2773 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2774 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002775 }
Steven Toth3935c252008-05-01 05:45:44 -03002776 if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) {
2777 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2778 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002779 }
Steven Toth3935c252008-05-01 05:45:44 -03002780 if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) {
2781 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2782 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002783 }
Steven Toth3935c252008-05-01 05:45:44 -03002784 if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) {
2785 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2786 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002787 }
Steven Toth3935c252008-05-01 05:45:44 -03002788 if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) {
2789 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2790 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002791 }
Steven Toth3935c252008-05-01 05:45:44 -03002792 if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) {
2793 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2794 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002795 }
Steven Toth3935c252008-05-01 05:45:44 -03002796 if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) {
2797 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2798 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002799 }
Steven Toth3935c252008-05-01 05:45:44 -03002800 if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) {
2801 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2802 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002803 }
Steven Toth3935c252008-05-01 05:45:44 -03002804 if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) {
2805 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2806 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002807 }
Steven Toth3935c252008-05-01 05:45:44 -03002808 if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) {
2809 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2810 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002811 }
2812
2813 //
2814 // Set RF Synth and LO Path Control
2815 //
2816 // Look-Up table implementation for:
2817 // RFSYN_EN_OUTMUX
2818 // RFSYN_SEL_VCO_OUT
2819 // RFSYN_SEL_VCO_HI
2820 // RFSYN_SEL_DIVM
2821 // RFSYN_RF_DIV_BIAS
2822 // DN_SEL_FREQ
2823 //
2824 // Set divider_val, Fmax, Fmix to use in Equations
2825 FminBin = 28000000UL ;
2826 FmaxBin = 42500000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002827 if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) {
2828 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2829 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2830 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2831 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2832 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2833 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002834 divider_val = 64 ;
2835 Fmax = FmaxBin ;
2836 Fmin = FminBin ;
2837 }
2838 FminBin = 42500000UL ;
2839 FmaxBin = 56000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002840 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2841 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2842 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2843 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2844 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2845 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2846 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002847 divider_val = 64 ;
2848 Fmax = FmaxBin ;
2849 Fmin = FminBin ;
2850 }
2851 FminBin = 56000000UL ;
2852 FmaxBin = 85000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002853 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2854 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2855 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2856 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2857 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2858 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2859 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002860 divider_val = 32 ;
2861 Fmax = FmaxBin ;
2862 Fmin = FminBin ;
2863 }
2864 FminBin = 85000000UL ;
2865 FmaxBin = 112000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002866 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2867 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2868 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2869 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2870 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2871 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2872 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002873 divider_val = 32 ;
2874 Fmax = FmaxBin ;
2875 Fmin = FminBin ;
2876 }
2877 FminBin = 112000000UL ;
2878 FmaxBin = 170000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002879 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2880 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2881 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2882 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2883 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2884 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2885 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002886 divider_val = 16 ;
2887 Fmax = FmaxBin ;
2888 Fmin = FminBin ;
2889 }
2890 FminBin = 170000000UL ;
2891 FmaxBin = 225000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002892 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2893 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2894 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2895 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2896 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2897 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2898 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002899 divider_val = 16 ;
2900 Fmax = FmaxBin ;
2901 Fmin = FminBin ;
2902 }
2903 FminBin = 225000000UL ;
2904 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002905 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2906 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2907 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2908 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2909 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2910 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2911 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 4) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002912 divider_val = 8 ;
2913 Fmax = 340000000UL ;
2914 Fmin = FminBin ;
2915 }
2916 FminBin = 300000000UL ;
2917 FmaxBin = 340000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002918 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2919 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1) ;
2920 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0) ;
2921 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2922 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2923 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2924 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002925 divider_val = 8 ;
2926 Fmax = FmaxBin ;
2927 Fmin = 225000000UL ;
2928 }
2929 FminBin = 340000000UL ;
2930 FmaxBin = 450000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002931 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2932 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1) ;
2933 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0) ;
2934 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2935 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2936 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 2) ;
2937 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002938 divider_val = 8 ;
2939 Fmax = FmaxBin ;
2940 Fmin = FminBin ;
2941 }
2942 FminBin = 450000000UL ;
2943 FmaxBin = 680000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002944 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2945 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2946 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2947 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2948 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1) ;
2949 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2950 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002951 divider_val = 4 ;
2952 Fmax = FmaxBin ;
2953 Fmin = FminBin ;
2954 }
2955 FminBin = 680000000UL ;
2956 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002957 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2958 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2959 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2960 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2961 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1) ;
2962 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2963 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002964 divider_val = 4 ;
2965 Fmax = FmaxBin ;
2966 Fmin = FminBin ;
2967 }
2968
2969 // CHCAL_INT_MOD_RF
2970 // CHCAL_FRAC_MOD_RF
2971 // RFSYN_LPF_R
2972 // CHCAL_EN_INT_RF
2973
2974 // Equation E3
2975 // RFSYN_VCO_BIAS
Steven Toth3935c252008-05-01 05:45:44 -03002976 E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ;
2977 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002978
2979 // Equation E4
2980 // CHCAL_INT_MOD_RF
Steven Toth3935c252008-05-01 05:45:44 -03002981 E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000) ;
2982 MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002983
2984 // Equation E5
2985 // CHCAL_FRAC_MOD_RF
2986 // CHCAL_EN_INT_RF
Steven Toth3935c252008-05-01 05:45:44 -03002987 E5 = ((2<<17)*(state->RF_LO/10000*divider_val - (E4*(2*state->Fxtal*Kdbl_RF)/10000)))/(2*state->Fxtal*Kdbl_RF/10000) ;
2988 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002989
2990 // Equation E5A
2991 // RFSYN_LPF_R
Steven Toth3935c252008-05-01 05:45:44 -03002992 E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;
2993 status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002994
2995 // Euqation E5B
2996 // CHCAL_EN_INIT_RF
Steven Toth3935c252008-05-01 05:45:44 -03002997 status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));
Steven Toth52c99bd2008-05-01 04:57:01 -03002998 //if (E5 == 0)
Steven Toth3935c252008-05-01 05:45:44 -03002999 // status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003000 //else
Steven Toth3935c252008-05-01 05:45:44 -03003001 // status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003002
3003 //
3004 // Set TG Synth
3005 //
3006 // Look-Up table implementation for:
3007 // TG_LO_DIVVAL
3008 // TG_LO_SELVAL
3009 //
3010 // Set divider_val, Fmax, Fmix to use in Equations
Steven Toth3935c252008-05-01 05:45:44 -03003011 if (state->TG_LO < 33000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003012 return -1;
3013 }
3014 FminBin = 33000000UL ;
3015 FmaxBin = 50000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003016 if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) {
3017 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x6) ;
3018 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003019 divider_val = 36 ;
3020 Fmax = FmaxBin ;
3021 Fmin = FminBin ;
3022 }
3023 FminBin = 50000000UL ;
3024 FmaxBin = 67000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003025 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3026 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x1) ;
3027 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003028 divider_val = 24 ;
3029 Fmax = FmaxBin ;
3030 Fmin = FminBin ;
3031 }
3032 FminBin = 67000000UL ;
3033 FmaxBin = 100000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003034 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3035 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0xC) ;
3036 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003037 divider_val = 18 ;
3038 Fmax = FmaxBin ;
3039 Fmin = FminBin ;
3040 }
3041 FminBin = 100000000UL ;
3042 FmaxBin = 150000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003043 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3044 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
3045 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003046 divider_val = 12 ;
3047 Fmax = FmaxBin ;
3048 Fmin = FminBin ;
3049 }
3050 FminBin = 150000000UL ;
3051 FmaxBin = 200000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003052 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3053 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
3054 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003055 divider_val = 8 ;
3056 Fmax = FmaxBin ;
3057 Fmin = FminBin ;
3058 }
3059 FminBin = 200000000UL ;
3060 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003061 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3062 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
3063 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003064 divider_val = 6 ;
3065 Fmax = FmaxBin ;
3066 Fmin = FminBin ;
3067 }
3068 FminBin = 300000000UL ;
3069 FmaxBin = 400000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003070 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3071 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
3072 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003073 divider_val = 4 ;
3074 Fmax = FmaxBin ;
3075 Fmin = FminBin ;
3076 }
3077 FminBin = 400000000UL ;
3078 FmaxBin = 600000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003079 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3080 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
3081 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003082 divider_val = 3 ;
3083 Fmax = FmaxBin ;
3084 Fmin = FminBin ;
3085 }
3086 FminBin = 600000000UL ;
3087 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003088 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3089 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
3090 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003091 divider_val = 2 ;
3092 Fmax = FmaxBin ;
3093 Fmin = FminBin ;
3094 }
3095
3096 // TG_DIV_VAL
Steven Toth3935c252008-05-01 05:45:44 -03003097 tg_divval = (state->TG_LO*divider_val/100000)
3098 *(MXL_Ceiling(state->Fxtal,1000000) * 100) / (state->Fxtal/1000) ;
3099 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003100
Steven Toth3935c252008-05-01 05:45:44 -03003101 if (state->TG_LO > 600000000UL)
3102 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1 ) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003103
3104 Fmax = 1800000000UL ;
3105 Fmin = 1200000000UL ;
3106
3107
3108
3109 // to prevent overflow of 32 bit unsigned integer, use following equation. Edit for v2.6.4
Steven Toth3935c252008-05-01 05:45:44 -03003110 Fref_TG = (state->Fxtal/1000)/ MXL_Ceiling(state->Fxtal, 1000000) ; // Fref_TF = Fref_TG*1000
Steven Toth52c99bd2008-05-01 04:57:01 -03003111
Steven Toth3935c252008-05-01 05:45:44 -03003112 Fvco = (state->TG_LO/10000) * divider_val * Fref_TG; //Fvco = Fvco/10
Steven Toth52c99bd2008-05-01 04:57:01 -03003113
3114 tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8;
3115
3116 //below equation is same as above but much harder to debug.
Steven Toth3935c252008-05-01 05:45:44 -03003117 //tg_lo = ( ((Fmax/10000 * Xtal_Int)/100) - ((state->TG_LO/10000)*divider_val*(state->Fxtal/10000)/100) )*32/((Fmax-Fmin)/10000 * Xtal_Int/100) + 8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003118
3119
Steven Toth3935c252008-05-01 05:45:44 -03003120 status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003121
3122
3123
3124 //add for 2.6.5
3125 //Special setting for QAM
Steven Toth3935c252008-05-01 05:45:44 -03003126 if(state->Mod_Type == MXL_QAM)
Steven Toth52c99bd2008-05-01 04:57:01 -03003127 {
Steven Toth3935c252008-05-01 05:45:44 -03003128 if(state->RF_IN < 680000000)
3129 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003130 else
Steven Toth3935c252008-05-01 05:45:44 -03003131 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003132 }
3133
3134
3135 //remove 20.48MHz setting for 2.6.10
3136
3137 //
3138 // Off Chip Tracking Filter Control
3139 //
Steven Toth85d220d2008-05-01 05:48:14 -03003140 if (state->TF_Type == MXL_TF_OFF) // Tracking Filter Off State; turn off all the banks
Steven Toth52c99bd2008-05-01 04:57:01 -03003141 {
Steven Toth3935c252008-05-01 05:45:44 -03003142 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ;
3143 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003144
Steven Toth3935c252008-05-01 05:45:44 -03003145 status += MXL_SetGPIO(fe, 3, 1) ; // turn off Bank 1
3146 status += MXL_SetGPIO(fe, 1, 1) ; // turn off Bank 2
3147 status += MXL_SetGPIO(fe, 4, 1) ; // turn off Bank 3
Steven Toth52c99bd2008-05-01 04:57:01 -03003148 }
3149
Steven Toth85d220d2008-05-01 05:48:14 -03003150 if (state->TF_Type == MXL_TF_C) // Tracking Filter type C
Steven Toth52c99bd2008-05-01 04:57:01 -03003151 {
Steven Toth3935c252008-05-01 05:45:44 -03003152 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ;
3153 status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003154
Steven Toth3935c252008-05-01 05:45:44 -03003155 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003156 {
3157
Steven Toth3935c252008-05-01 05:45:44 -03003158 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3159 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3160 status += MXL_SetGPIO(fe, 3, 0) ; // Bank1 On
3161 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3162 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003163 }
Steven Toth3935c252008-05-01 05:45:44 -03003164 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003165 {
Steven Toth3935c252008-05-01 05:45:44 -03003166 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3167 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3168 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3169 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3170 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003171 }
Steven Toth3935c252008-05-01 05:45:44 -03003172 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003173 {
Steven Toth3935c252008-05-01 05:45:44 -03003174 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3175 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3176 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3177 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3178 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003179 }
Steven Toth3935c252008-05-01 05:45:44 -03003180 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003181 {
Steven Toth3935c252008-05-01 05:45:44 -03003182 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3183 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3184 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3185 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3186 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003187 }
Steven Toth3935c252008-05-01 05:45:44 -03003188 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003189 {
Steven Toth3935c252008-05-01 05:45:44 -03003190 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3191 status += MXL_ControlWrite(fe, DAC_DIN_B, 29) ;
3192 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3193 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3194 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003195 }
Steven Toth3935c252008-05-01 05:45:44 -03003196 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003197 {
Steven Toth3935c252008-05-01 05:45:44 -03003198 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3199 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3200 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3201 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3202 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003203 }
Steven Toth3935c252008-05-01 05:45:44 -03003204 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003205 {
Steven Toth3935c252008-05-01 05:45:44 -03003206 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3207 status += MXL_ControlWrite(fe, DAC_DIN_B, 16) ;
3208 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3209 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3210 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003211 }
Steven Toth3935c252008-05-01 05:45:44 -03003212 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003213 {
Steven Toth3935c252008-05-01 05:45:44 -03003214 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3215 status += MXL_ControlWrite(fe, DAC_DIN_B, 7) ;
3216 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3217 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3218 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003219 }
Steven Toth3935c252008-05-01 05:45:44 -03003220 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003221 {
Steven Toth3935c252008-05-01 05:45:44 -03003222 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3223 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3224 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3225 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3226 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003227 }
3228 }
3229
Steven Toth85d220d2008-05-01 05:48:14 -03003230 if (state->TF_Type == MXL_TF_C_H) // Tracking Filter type C-H for Hauppauge only
Steven Toth52c99bd2008-05-01 04:57:01 -03003231 {
Steven Toth3935c252008-05-01 05:45:44 -03003232 status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003233
Steven Toth3935c252008-05-01 05:45:44 -03003234 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003235 {
3236
Steven Toth3935c252008-05-01 05:45:44 -03003237 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3238 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3239 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3240 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003241 }
Steven Toth3935c252008-05-01 05:45:44 -03003242 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003243 {
Steven Toth3935c252008-05-01 05:45:44 -03003244 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3245 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3246 status += MXL_SetGPIO(fe, 3, 0) ; // Bank2 On
3247 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003248 }
Steven Toth3935c252008-05-01 05:45:44 -03003249 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003250 {
Steven Toth3935c252008-05-01 05:45:44 -03003251 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3252 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3253 status += MXL_SetGPIO(fe, 3, 0) ; // Bank2 On
3254 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003255 }
Steven Toth3935c252008-05-01 05:45:44 -03003256 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003257 {
Steven Toth3935c252008-05-01 05:45:44 -03003258 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3259 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3260 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3261 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003262 }
Steven Toth3935c252008-05-01 05:45:44 -03003263 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003264 {
Steven Toth3935c252008-05-01 05:45:44 -03003265 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3266 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3267 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3268 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003269 }
Steven Toth3935c252008-05-01 05:45:44 -03003270 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003271 {
Steven Toth3935c252008-05-01 05:45:44 -03003272 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3273 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3274 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3275 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003276 }
Steven Toth3935c252008-05-01 05:45:44 -03003277 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003278 {
Steven Toth3935c252008-05-01 05:45:44 -03003279 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3280 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3281 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3282 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003283 }
Steven Toth3935c252008-05-01 05:45:44 -03003284 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003285 {
Steven Toth3935c252008-05-01 05:45:44 -03003286 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3287 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3288 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3289 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003290 }
Steven Toth3935c252008-05-01 05:45:44 -03003291 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003292 {
Steven Toth3935c252008-05-01 05:45:44 -03003293 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3294 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3295 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3296 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003297 }
3298 }
3299
Steven Toth85d220d2008-05-01 05:48:14 -03003300 if (state->TF_Type == MXL_TF_D) // Tracking Filter type D
Steven Toth52c99bd2008-05-01 04:57:01 -03003301 {
Steven Toth3935c252008-05-01 05:45:44 -03003302 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003303
Steven Toth3935c252008-05-01 05:45:44 -03003304 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003305 {
3306
Steven Toth3935c252008-05-01 05:45:44 -03003307 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3308 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3309 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3310 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003311 }
Steven Toth3935c252008-05-01 05:45:44 -03003312 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003313 {
Steven Toth3935c252008-05-01 05:45:44 -03003314 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3315 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3316 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3317 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003318 }
Steven Toth3935c252008-05-01 05:45:44 -03003319 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003320 {
Steven Toth3935c252008-05-01 05:45:44 -03003321 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3322 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3323 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3324 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003325 }
Steven Toth3935c252008-05-01 05:45:44 -03003326 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003327 {
Steven Toth3935c252008-05-01 05:45:44 -03003328 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3329 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3330 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3331 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003332 }
Steven Toth3935c252008-05-01 05:45:44 -03003333 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003334 {
Steven Toth3935c252008-05-01 05:45:44 -03003335 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3336 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3337 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3338 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003339 }
Steven Toth3935c252008-05-01 05:45:44 -03003340 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003341 {
Steven Toth3935c252008-05-01 05:45:44 -03003342 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3343 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3344 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3345 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003346 }
Steven Toth3935c252008-05-01 05:45:44 -03003347 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003348 {
Steven Toth3935c252008-05-01 05:45:44 -03003349 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3350 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3351 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3352 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003353 }
3354 }
3355
3356
Steven Toth85d220d2008-05-01 05:48:14 -03003357 if (state->TF_Type == MXL_TF_D_L) // Tracking Filter type D-L for Lumanate ONLY change for 2.6.3
Steven Toth52c99bd2008-05-01 04:57:01 -03003358 {
Steven Toth3935c252008-05-01 05:45:44 -03003359 status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003360
Steven Totha8214d42008-05-01 05:02:58 -03003361 // if UHF and terrestrial => Turn off Tracking Filter
Steven Toth3935c252008-05-01 05:45:44 -03003362 if (state->RF_IN >= 471000000 && (state->RF_IN - 471000000)%6000000 != 0)
Steven Toth52c99bd2008-05-01 04:57:01 -03003363 {
3364 // Turn off all the banks
Steven Toth3935c252008-05-01 05:45:44 -03003365 status += MXL_SetGPIO(fe, 3, 1) ;
3366 status += MXL_SetGPIO(fe, 1, 1) ;
3367 status += MXL_SetGPIO(fe, 4, 1) ;
3368 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003369
Steven Toth3935c252008-05-01 05:45:44 -03003370 status += MXL_ControlWrite(fe, AGC_IF, 10) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003371 }
3372
3373 else // if VHF or cable => Turn on Tracking Filter
3374 {
Steven Toth3935c252008-05-01 05:45:44 -03003375 if (state->RF_IN >= 43000000 && state->RF_IN < 140000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003376 {
3377
Steven Toth3935c252008-05-01 05:45:44 -03003378 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3379 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
3380 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3381 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003382 }
Steven Toth3935c252008-05-01 05:45:44 -03003383 if (state->RF_IN >= 140000000 && state->RF_IN < 240000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003384 {
Steven Toth3935c252008-05-01 05:45:44 -03003385 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3386 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
3387 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3388 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003389 }
Steven Toth3935c252008-05-01 05:45:44 -03003390 if (state->RF_IN >= 240000000 && state->RF_IN < 340000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003391 {
Steven Toth3935c252008-05-01 05:45:44 -03003392 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3393 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3394 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 On
3395 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003396 }
Steven Toth3935c252008-05-01 05:45:44 -03003397 if (state->RF_IN >= 340000000 && state->RF_IN < 430000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003398 {
Steven Toth3935c252008-05-01 05:45:44 -03003399 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3400 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3401 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3402 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003403 }
Steven Toth3935c252008-05-01 05:45:44 -03003404 if (state->RF_IN >= 430000000 && state->RF_IN < 470000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003405 {
Steven Toth3935c252008-05-01 05:45:44 -03003406 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 Off
3407 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3408 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
3409 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003410 }
Steven Toth3935c252008-05-01 05:45:44 -03003411 if (state->RF_IN >= 470000000 && state->RF_IN < 570000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003412 {
Steven Toth3935c252008-05-01 05:45:44 -03003413 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3414 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3415 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
3416 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003417 }
Steven Toth3935c252008-05-01 05:45:44 -03003418 if (state->RF_IN >= 570000000 && state->RF_IN < 620000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003419 {
Steven Toth3935c252008-05-01 05:45:44 -03003420 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 On
3421 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3422 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3423 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Offq
Steven Toth52c99bd2008-05-01 04:57:01 -03003424 }
Steven Toth3935c252008-05-01 05:45:44 -03003425 if (state->RF_IN >= 620000000 && state->RF_IN < 760000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003426 {
Steven Toth3935c252008-05-01 05:45:44 -03003427 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3428 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3429 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3430 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003431 }
Steven Toth3935c252008-05-01 05:45:44 -03003432 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003433 {
Steven Toth3935c252008-05-01 05:45:44 -03003434 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3435 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3436 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3437 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003438 }
3439 }
3440 }
3441
Steven Toth85d220d2008-05-01 05:48:14 -03003442 if (state->TF_Type == MXL_TF_E) // Tracking Filter type E
Steven Toth52c99bd2008-05-01 04:57:01 -03003443 {
Steven Toth3935c252008-05-01 05:45:44 -03003444 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003445
Steven Toth3935c252008-05-01 05:45:44 -03003446 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003447 {
3448
Steven Toth3935c252008-05-01 05:45:44 -03003449 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3450 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3451 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3452 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003453 }
Steven Toth3935c252008-05-01 05:45:44 -03003454 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003455 {
Steven Toth3935c252008-05-01 05:45:44 -03003456 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3457 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3458 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3459 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003460 }
Steven Toth3935c252008-05-01 05:45:44 -03003461 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003462 {
Steven Toth3935c252008-05-01 05:45:44 -03003463 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3464 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3465 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3466 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003467 }
Steven Toth3935c252008-05-01 05:45:44 -03003468 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003469 {
Steven Toth3935c252008-05-01 05:45:44 -03003470 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3471 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3472 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3473 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003474 }
Steven Toth3935c252008-05-01 05:45:44 -03003475 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003476 {
Steven Toth3935c252008-05-01 05:45:44 -03003477 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3478 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3479 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3480 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003481 }
Steven Toth3935c252008-05-01 05:45:44 -03003482 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003483 {
Steven Toth3935c252008-05-01 05:45:44 -03003484 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3485 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3486 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3487 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003488 }
Steven Toth3935c252008-05-01 05:45:44 -03003489 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003490 {
Steven Toth3935c252008-05-01 05:45:44 -03003491 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3492 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3493 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3494 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003495 }
3496 }
3497
Steven Toth85d220d2008-05-01 05:48:14 -03003498 if (state->TF_Type == MXL_TF_F) // Tracking Filter type F
Steven Toth52c99bd2008-05-01 04:57:01 -03003499 {
Steven Toth3935c252008-05-01 05:45:44 -03003500 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003501
Steven Toth3935c252008-05-01 05:45:44 -03003502 if (state->RF_IN >= 43000000 && state->RF_IN < 160000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003503 {
3504
Steven Toth3935c252008-05-01 05:45:44 -03003505 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3506 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3507 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3508 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003509 }
Steven Toth3935c252008-05-01 05:45:44 -03003510 if (state->RF_IN >= 160000000 && state->RF_IN < 210000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003511 {
Steven Toth3935c252008-05-01 05:45:44 -03003512 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3513 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3514 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3515 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003516 }
Steven Toth3935c252008-05-01 05:45:44 -03003517 if (state->RF_IN >= 210000000 && state->RF_IN < 300000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003518 {
Steven Toth3935c252008-05-01 05:45:44 -03003519 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3520 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3521 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3522 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003523 }
Steven Toth3935c252008-05-01 05:45:44 -03003524 if (state->RF_IN >= 300000000 && state->RF_IN < 390000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003525 {
Steven Toth3935c252008-05-01 05:45:44 -03003526 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3527 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3528 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3529 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003530 }
Steven Toth3935c252008-05-01 05:45:44 -03003531 if (state->RF_IN >= 390000000 && state->RF_IN < 515000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003532 {
Steven Toth3935c252008-05-01 05:45:44 -03003533 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3534 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3535 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3536 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003537 }
Steven Toth3935c252008-05-01 05:45:44 -03003538 if (state->RF_IN >= 515000000 && state->RF_IN < 650000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003539 {
Steven Toth3935c252008-05-01 05:45:44 -03003540 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3541 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3542 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3543 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003544 }
Steven Toth3935c252008-05-01 05:45:44 -03003545 if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003546 {
Steven Toth3935c252008-05-01 05:45:44 -03003547 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3548 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3549 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3550 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003551 }
3552 }
3553
Steven Toth85d220d2008-05-01 05:48:14 -03003554 if (state->TF_Type == MXL_TF_E_2) // Tracking Filter type E_2
Steven Toth52c99bd2008-05-01 04:57:01 -03003555 {
Steven Toth3935c252008-05-01 05:45:44 -03003556 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003557
Steven Toth3935c252008-05-01 05:45:44 -03003558 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003559 {
3560
Steven Toth3935c252008-05-01 05:45:44 -03003561 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3562 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3563 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3564 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003565 }
Steven Toth3935c252008-05-01 05:45:44 -03003566 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003567 {
Steven Toth3935c252008-05-01 05:45:44 -03003568 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3569 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3570 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3571 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003572 }
Steven Toth3935c252008-05-01 05:45:44 -03003573 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003574 {
Steven Toth3935c252008-05-01 05:45:44 -03003575 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3576 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3577 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3578 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003579 }
Steven Toth3935c252008-05-01 05:45:44 -03003580 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003581 {
Steven Toth3935c252008-05-01 05:45:44 -03003582 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3583 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3584 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3585 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003586 }
Steven Toth3935c252008-05-01 05:45:44 -03003587 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003588 {
Steven Toth3935c252008-05-01 05:45:44 -03003589 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3590 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3591 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3592 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003593 }
Steven Toth3935c252008-05-01 05:45:44 -03003594 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003595 {
Steven Toth3935c252008-05-01 05:45:44 -03003596 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3597 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3598 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3599 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003600 }
Steven Toth3935c252008-05-01 05:45:44 -03003601 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003602 {
Steven Toth3935c252008-05-01 05:45:44 -03003603 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3604 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3605 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3606 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003607 }
3608 }
3609
Steven Toth85d220d2008-05-01 05:48:14 -03003610 if (state->TF_Type == MXL_TF_G) // Tracking Filter type G add for v2.6.8
Steven Toth52c99bd2008-05-01 04:57:01 -03003611 {
Steven Toth3935c252008-05-01 05:45:44 -03003612 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003613
Steven Toth3935c252008-05-01 05:45:44 -03003614 if (state->RF_IN >= 50000000 && state->RF_IN < 190000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003615 {
3616
Steven Toth3935c252008-05-01 05:45:44 -03003617 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3618 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3619 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3620 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003621 }
Steven Toth3935c252008-05-01 05:45:44 -03003622 if (state->RF_IN >= 190000000 && state->RF_IN < 280000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003623 {
Steven Toth3935c252008-05-01 05:45:44 -03003624 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3625 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3626 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3627 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003628 }
Steven Toth3935c252008-05-01 05:45:44 -03003629 if (state->RF_IN >= 280000000 && state->RF_IN < 350000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003630 {
Steven Toth3935c252008-05-01 05:45:44 -03003631 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3632 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3633 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3634 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003635 }
Steven Toth3935c252008-05-01 05:45:44 -03003636 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003637 {
Steven Toth3935c252008-05-01 05:45:44 -03003638 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3639 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3640 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3641 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003642 }
Steven Toth3935c252008-05-01 05:45:44 -03003643 if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) //modified for 2.6.11
Steven Toth52c99bd2008-05-01 04:57:01 -03003644 {
Steven Toth3935c252008-05-01 05:45:44 -03003645 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3646 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
3647 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
3648 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003649 }
Steven Toth3935c252008-05-01 05:45:44 -03003650 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003651 {
Steven Toth3935c252008-05-01 05:45:44 -03003652 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3653 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3654 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3655 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003656 }
Steven Toth3935c252008-05-01 05:45:44 -03003657 if (state->RF_IN >= 640000000 && state->RF_IN < 820000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003658 {
Steven Toth3935c252008-05-01 05:45:44 -03003659 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3660 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3661 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3662 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003663 }
Steven Toth3935c252008-05-01 05:45:44 -03003664 if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003665 {
Steven Toth3935c252008-05-01 05:45:44 -03003666 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3667 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3668 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3669 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003670 }
3671 }
3672
Steven Toth85d220d2008-05-01 05:48:14 -03003673 if (state->TF_Type == MXL_TF_E_NA) // Tracking Filter type E-NA for Empia ONLY change for 2.6.8
Steven Toth52c99bd2008-05-01 04:57:01 -03003674 {
Steven Toth3935c252008-05-01 05:45:44 -03003675 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003676
Steven Totha8214d42008-05-01 05:02:58 -03003677 // if UHF and terrestrial=> Turn off Tracking Filter
Steven Toth3935c252008-05-01 05:45:44 -03003678 if (state->RF_IN >= 471000000 && (state->RF_IN - 471000000)%6000000 != 0)
Steven Toth52c99bd2008-05-01 04:57:01 -03003679 {
3680 // Turn off all the banks
Steven Toth3935c252008-05-01 05:45:44 -03003681 status += MXL_SetGPIO(fe, 3, 1) ;
3682 status += MXL_SetGPIO(fe, 1, 1) ;
3683 status += MXL_SetGPIO(fe, 4, 1) ;
3684 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003685
3686 //2.6.12
3687 //Turn on RSSI
Steven Toth3935c252008-05-01 05:45:44 -03003688 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1) ;
3689 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1) ;
3690 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1) ;
3691 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003692
3693 // RSSI reference point
Steven Toth3935c252008-05-01 05:45:44 -03003694 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5) ;
3695 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3) ;
3696 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003697
3698
Steven Toth3935c252008-05-01 05:45:44 -03003699 //status += MXL_ControlWrite(fe, AGC_IF, 10) ; //doesn't matter since RSSI is turn on
Steven Toth52c99bd2008-05-01 04:57:01 -03003700
3701 //following parameter is from analog OTA mode, can be change to seek better performance
Steven Toth3935c252008-05-01 05:45:44 -03003702 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003703 }
3704
3705 else //if VHF or Cable => Turn on Tracking Filter
3706 {
3707 //2.6.12
3708 //Turn off RSSI
Steven Toth3935c252008-05-01 05:45:44 -03003709 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003710
3711 //change back from above condition
Steven Toth3935c252008-05-01 05:45:44 -03003712 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003713
3714
Steven Toth3935c252008-05-01 05:45:44 -03003715 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003716 {
3717
Steven Toth3935c252008-05-01 05:45:44 -03003718 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3719 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3720 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3721 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003722 }
Steven Toth3935c252008-05-01 05:45:44 -03003723 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003724 {
Steven Toth3935c252008-05-01 05:45:44 -03003725 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3726 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3727 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3728 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003729 }
Steven Toth3935c252008-05-01 05:45:44 -03003730 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003731 {
Steven Toth3935c252008-05-01 05:45:44 -03003732 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3733 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3734 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3735 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003736 }
Steven Toth3935c252008-05-01 05:45:44 -03003737 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003738 {
Steven Toth3935c252008-05-01 05:45:44 -03003739 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3740 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3741 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3742 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003743 }
Steven Toth3935c252008-05-01 05:45:44 -03003744 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003745 {
Steven Toth3935c252008-05-01 05:45:44 -03003746 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3747 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3748 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3749 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003750 }
Steven Toth3935c252008-05-01 05:45:44 -03003751 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003752 {
Steven Toth3935c252008-05-01 05:45:44 -03003753 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3754 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3755 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3756 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003757 }
Steven Toth3935c252008-05-01 05:45:44 -03003758 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003759 {
Steven Toth3935c252008-05-01 05:45:44 -03003760 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3761 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3762 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3763 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003764 }
3765 }
3766 }
3767 return status ;
3768}
3769
Steven Toth5c1b2052008-05-01 07:04:09 -03003770// DONE
Steven Toth3935c252008-05-01 05:45:44 -03003771u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val)
Steven Toth52c99bd2008-05-01 04:57:01 -03003772{
Steven Toth3935c252008-05-01 05:45:44 -03003773 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003774
3775 if (GPIO_Num == 1)
Steven Toth3935c252008-05-01 05:45:44 -03003776 status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1);
3777
3778 /* GPIO2 is not available */
3779
3780 if (GPIO_Num == 3) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003781 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003782 status += MXL_ControlWrite(fe, GPIO_3, 0);
3783 status += MXL_ControlWrite(fe, GPIO_3B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003784 }
3785 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003786 status += MXL_ControlWrite(fe, GPIO_3, 1);
3787 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003788 }
Steven Toth3935c252008-05-01 05:45:44 -03003789 if (GPIO_Val == 3) { /* tri-state */
3790 status += MXL_ControlWrite(fe, GPIO_3, 0);
3791 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003792 }
3793 }
Steven Toth3935c252008-05-01 05:45:44 -03003794 if (GPIO_Num == 4) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003795 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003796 status += MXL_ControlWrite(fe, GPIO_4, 0);
3797 status += MXL_ControlWrite(fe, GPIO_4B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003798 }
3799 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003800 status += MXL_ControlWrite(fe, GPIO_4, 1);
3801 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003802 }
Steven Toth3935c252008-05-01 05:45:44 -03003803 if (GPIO_Val == 3) { /* tri-state */
3804 status += MXL_ControlWrite(fe, GPIO_4, 0);
3805 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003806 }
3807 }
3808
Steven Toth3935c252008-05-01 05:45:44 -03003809 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003810}
3811
3812///////////////////////////////////////////////////////////////////////////////
3813// //
3814// Function: MXL_ControlWrite //
3815// //
3816// Description: Update control name value //
3817// //
3818// Globals: //
3819// NONE //
3820// //
3821// Functions used: //
3822// MXL_ControlWrite( Tuner, controlName, value, Group ) //
3823// //
3824// Inputs: //
3825// Tuner : Tuner structure //
3826// ControlName : Control name to be updated //
3827// value : Value to be written //
3828// //
3829// Outputs: //
3830// Tuner : Tuner structure defined at higher level //
3831// //
3832// Return: //
3833// 0 : Successful write //
3834// >0 : Value exceed maximum allowed for control number //
3835// //
3836///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03003837// DONE
Steven Toth3935c252008-05-01 05:45:44 -03003838u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003839{
Steven Toth3935c252008-05-01 05:45:44 -03003840 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003841
Steven Toth3935c252008-05-01 05:45:44 -03003842 /* Will write ALL Matching Control Name */
Steven Toth85d220d2008-05-01 05:48:14 -03003843 status += MXL_ControlWrite_Group(fe, ControlNum, value, 1); /* Write Matching INIT Control */
3844 status += MXL_ControlWrite_Group(fe, ControlNum, value, 2); /* Write Matching CH Control */
Steven Toth3935c252008-05-01 05:45:44 -03003845#ifdef _MXL_INTERNAL
Steven Toth85d220d2008-05-01 05:48:14 -03003846 status += MXL_ControlWrite_Group(fe, ControlNum, value, 3); /* Write Matching MXL Control */
Steven Toth3935c252008-05-01 05:45:44 -03003847#endif
3848 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003849}
3850
3851///////////////////////////////////////////////////////////////////////////////
3852// //
3853// Function: MXL_ControlWrite //
3854// //
3855// Description: Update control name value //
3856// //
3857// Globals: //
3858// NONE //
3859// //
3860// Functions used: //
3861// strcmp //
3862// //
3863// Inputs: //
3864// Tuner_struct: structure defined at higher level //
3865// ControlName : Control Name //
3866// value : Value Assigned to Control Name //
3867// controlGroup : Control Register Group //
3868// //
3869// Outputs: //
3870// NONE //
3871// //
3872// Return: //
3873// 0 : Successful write //
3874// 1 : Value exceed maximum allowed for control name //
3875// 2 : Control name not found //
3876// //
3877///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03003878// DONE
Steven Toth3935c252008-05-01 05:45:44 -03003879u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, u32 value, u16 controlGroup)
Steven Toth52c99bd2008-05-01 04:57:01 -03003880{
Steven Toth85d220d2008-05-01 05:48:14 -03003881 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03003882 u16 i, j, k;
3883 u32 highLimit;
3884 u32 ctrlVal;
Steven Toth52c99bd2008-05-01 04:57:01 -03003885
Steven Toth3935c252008-05-01 05:45:44 -03003886 if (controlGroup == 1) /* Initial Control */ {
3887
3888 for (i = 0; i < state->Init_Ctrl_Num; i++) {
3889
3890 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3891
3892 highLimit = 1 << state->Init_Ctrl[i].size;
3893 if (value < highLimit) {
3894 for (j = 0; j < state->Init_Ctrl[i].size; j++) {
3895 state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3896 MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]),
3897 (u8)(state->Init_Ctrl[i].bit[j]),
3898 (u8)((value>>j) & 0x01) );
Steven Toth52c99bd2008-05-01 04:57:01 -03003899 }
Steven Toth3935c252008-05-01 05:45:44 -03003900 ctrlVal = 0;
3901 for (k = 0; k < state->Init_Ctrl[i].size; k++)
3902 ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
Steven Toth52c99bd2008-05-01 04:57:01 -03003903 }
3904 else
Steven Toth3935c252008-05-01 05:45:44 -03003905 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003906 }
3907 }
3908 }
Steven Toth3935c252008-05-01 05:45:44 -03003909 if (controlGroup == 2) /* Chan change Control */ {
3910
3911 for (i = 0; i < state->CH_Ctrl_Num; i++) {
3912
3913 if (controlNum == state->CH_Ctrl[i].Ctrl_Num ) {
3914
3915 highLimit = 1 << state->CH_Ctrl[i].size;
3916 if (value < highLimit) {
3917 for (j = 0; j < state->CH_Ctrl[i].size; j++) {
3918 state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3919 MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]),
3920 (u8)(state->CH_Ctrl[i].bit[j]),
3921 (u8)((value>>j) & 0x01) );
Steven Toth52c99bd2008-05-01 04:57:01 -03003922 }
Steven Toth3935c252008-05-01 05:45:44 -03003923 ctrlVal = 0;
3924 for (k = 0; k < state->CH_Ctrl[i].size; k++)
3925 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
Steven Toth52c99bd2008-05-01 04:57:01 -03003926 }
3927 else
Steven Toth3935c252008-05-01 05:45:44 -03003928 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003929 }
3930 }
3931 }
3932#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003933 if (controlGroup == 3) /* Maxlinear Control */ {
3934
3935 for (i = 0; i < state->MXL_Ctrl_Num; i++) {
3936
3937 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num ) {
3938
3939 highLimit = (1 << state->MXL_Ctrl[i].size) ;
3940 if (value < highLimit) {
3941 for (j = 0; j < state->MXL_Ctrl[i].size; j++) {
3942 state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3943 MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]),
3944 (u8)(state->MXL_Ctrl[i].bit[j]),
3945 (u8)((value>>j) & 0x01) );
Steven Toth52c99bd2008-05-01 04:57:01 -03003946 }
Steven Toth3935c252008-05-01 05:45:44 -03003947 ctrlVal = 0;
3948 for(k = 0; k < state->MXL_Ctrl[i].size; k++)
3949 ctrlVal += state->MXL_Ctrl[i].val[k] * (1 << k);
Steven Toth52c99bd2008-05-01 04:57:01 -03003950 }
3951 else
Steven Toth3935c252008-05-01 05:45:44 -03003952 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003953 }
3954 }
3955 }
3956#endif
Steven Toth3935c252008-05-01 05:45:44 -03003957 return 0 ; /* successful return */
Steven Toth52c99bd2008-05-01 04:57:01 -03003958}
3959
3960///////////////////////////////////////////////////////////////////////////////
3961// //
3962// Function: MXL_RegWrite //
3963// //
3964// Description: Update tuner register value //
3965// //
3966// Globals: //
3967// NONE //
3968// //
3969// Functions used: //
3970// NONE //
3971// //
3972// Inputs: //
3973// Tuner_struct: structure defined at higher level //
3974// RegNum : Register address to be assigned a value //
3975// RegVal : Register value to write //
3976// //
3977// Outputs: //
3978// NONE //
3979// //
3980// Return: //
3981// 0 : Successful write //
3982// -1 : Invalid Register Address //
3983// //
3984///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03003985// DONE
Steven Toth3935c252008-05-01 05:45:44 -03003986u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003987{
Steven Toth85d220d2008-05-01 05:48:14 -03003988 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003989 int i ;
3990
Steven Toth3935c252008-05-01 05:45:44 -03003991 for (i = 0; i < 104; i++) {
3992 if (RegNum == state->TunerRegs[i].Reg_Num) {
3993 state->TunerRegs[i].Reg_Val = RegVal;
3994 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003995 }
3996 }
3997
Steven Toth3935c252008-05-01 05:45:44 -03003998 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003999}
4000
4001///////////////////////////////////////////////////////////////////////////////
4002// //
4003// Function: MXL_RegRead //
4004// //
4005// Description: Retrieve tuner register value //
4006// //
4007// Globals: //
4008// NONE //
4009// //
4010// Functions used: //
4011// NONE //
4012// //
4013// Inputs: //
4014// Tuner_struct: structure defined at higher level //
4015// RegNum : Register address to be assigned a value //
4016// //
4017// Outputs: //
4018// RegVal : Retrieved register value //
4019// //
4020// Return: //
4021// 0 : Successful read //
4022// -1 : Invalid Register Address //
4023// //
4024///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03004025// DONE
Steven Toth3935c252008-05-01 05:45:44 -03004026u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03004027{
Steven Toth85d220d2008-05-01 05:48:14 -03004028 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03004029 int i ;
4030
Steven Toth3935c252008-05-01 05:45:44 -03004031 for (i = 0; i < 104; i++) {
4032 if (RegNum == state->TunerRegs[i].Reg_Num ) {
4033 *RegVal = (u8)(state->TunerRegs[i].Reg_Val);
4034 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004035 }
4036 }
4037
Steven Toth3935c252008-05-01 05:45:44 -03004038 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004039}
4040
4041///////////////////////////////////////////////////////////////////////////////
4042// //
4043// Function: MXL_ControlRead //
4044// //
4045// Description: Retrieve the control value based on the control name //
4046// //
4047// Globals: //
4048// NONE //
4049// //
4050// Inputs: //
4051// Tuner_struct : structure defined at higher level //
4052// ControlName : Control Name //
4053// //
4054// Outputs: //
4055// value : returned control value //
4056// //
4057// Return: //
4058// 0 : Successful read //
4059// -1 : Invalid control name //
4060// //
4061///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03004062// DONE
Steven Toth85d220d2008-05-01 05:48:14 -03004063u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value)
Steven Toth52c99bd2008-05-01 04:57:01 -03004064{
Steven Toth85d220d2008-05-01 05:48:14 -03004065 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004066 u32 ctrlVal ;
4067 u16 i, k ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004068
Steven Toth3935c252008-05-01 05:45:44 -03004069 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
4070
4071 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
4072
4073 ctrlVal = 0;
4074 for (k = 0; k < state->Init_Ctrl[i].size; k++)
4075 ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
4076 *value = ctrlVal;
4077 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004078 }
4079 }
Steven Toth3935c252008-05-01 05:45:44 -03004080
4081 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
4082
4083 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
4084
4085 ctrlVal = 0;
4086 for (k = 0; k < state->CH_Ctrl[i].size; k++)
4087 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
4088 *value = ctrlVal;
4089 return 0;
4090
Steven Toth52c99bd2008-05-01 04:57:01 -03004091 }
4092 }
4093
4094#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03004095 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
4096
4097 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
4098
4099 ctrlVal = 0;
4100 for (k = 0; k < state->MXL_Ctrl[i].size; k++)
4101 ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k);
4102 *value = ctrlVal;
4103 return 0;
4104
Steven Toth52c99bd2008-05-01 04:57:01 -03004105 }
4106 }
4107#endif
Steven Toth3935c252008-05-01 05:45:44 -03004108 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004109}
4110
4111///////////////////////////////////////////////////////////////////////////////
4112// //
4113// Function: MXL_ControlRegRead //
4114// //
4115// Description: Retrieve the register addresses and count related to a //
Steven Totha8214d42008-05-01 05:02:58 -03004116// a specific control name //
Steven Toth52c99bd2008-05-01 04:57:01 -03004117// //
4118// Globals: //
4119// NONE //
4120// //
4121// Inputs: //
4122// Tuner_struct : structure defined at higher level //
4123// ControlName : Control Name //
4124// //
4125// Outputs: //
4126// RegNum : returned register address array //
Steven Totha8214d42008-05-01 05:02:58 -03004127// count : returned register count related to a control //
Steven Toth52c99bd2008-05-01 04:57:01 -03004128// //
4129// Return: //
4130// 0 : Successful read //
4131// -1 : Invalid control name //
4132// //
4133///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03004134// DONE
Steven Toth3935c252008-05-01 05:45:44 -03004135u16 MXL_ControlRegRead(struct dvb_frontend *fe, u16 controlNum, u8 *RegNum, int * count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004136{
Steven Toth85d220d2008-05-01 05:48:14 -03004137 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004138 u16 i, j, k ;
4139 u16 Count ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004140
Steven Toth3935c252008-05-01 05:45:44 -03004141 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004142
Steven Toth3935c252008-05-01 05:45:44 -03004143 if ( controlNum == state->Init_Ctrl[i].Ctrl_Num ) {
4144
4145 Count = 1;
4146 RegNum[0] = (u8)(state->Init_Ctrl[i].addr[0]);
4147
4148 for (k = 1; k < state->Init_Ctrl[i].size; k++) {
4149
4150 for (j = 0; j < Count; j++) {
4151
4152 if (state->Init_Ctrl[i].addr[k] != RegNum[j]) {
4153
4154 Count ++;
4155 RegNum[Count-1] = (u8)(state->Init_Ctrl[i].addr[k]);
4156
Steven Toth52c99bd2008-05-01 04:57:01 -03004157 }
4158 }
4159
4160 }
Steven Toth3935c252008-05-01 05:45:44 -03004161 *count = Count;
4162 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004163 }
4164 }
Steven Toth3935c252008-05-01 05:45:44 -03004165 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004166
Steven Toth3935c252008-05-01 05:45:44 -03004167 if ( controlNum == state->CH_Ctrl[i].Ctrl_Num ) {
4168
4169 Count = 1;
4170 RegNum[0] = (u8)(state->CH_Ctrl[i].addr[0]);
4171
4172 for (k = 1; k < state->CH_Ctrl[i].size; k++) {
4173
4174 for (j= 0; j<Count; j++) {
4175
4176 if (state->CH_Ctrl[i].addr[k] != RegNum[j]) {
4177
4178 Count ++;
4179 RegNum[Count-1] = (u8)(state->CH_Ctrl[i].addr[k]);
4180
Steven Toth52c99bd2008-05-01 04:57:01 -03004181 }
4182 }
4183 }
Steven Toth3935c252008-05-01 05:45:44 -03004184 *count = Count;
4185 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004186 }
4187 }
4188#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03004189 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004190
Steven Toth3935c252008-05-01 05:45:44 -03004191 if ( controlNum == state->MXL_Ctrl[i].Ctrl_Num ) {
4192
4193 Count = 1;
4194 RegNum[0] = (u8)(state->MXL_Ctrl[i].addr[0]);
4195
4196 for (k = 1; k < state->MXL_Ctrl[i].size; k++) {
4197
4198 for (j = 0; j<Count; j++) {
4199
4200 if (state->MXL_Ctrl[i].addr[k] != RegNum[j]) {
4201
4202 Count ++;
4203 RegNum[Count-1] = (u8)state->MXL_Ctrl[i].addr[k];
4204
Steven Toth52c99bd2008-05-01 04:57:01 -03004205 }
4206 }
4207 }
Steven Toth3935c252008-05-01 05:45:44 -03004208 *count = Count;
4209 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004210 }
4211 }
4212#endif
Steven Toth3935c252008-05-01 05:45:44 -03004213 *count = 0;
4214 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004215}
4216
4217///////////////////////////////////////////////////////////////////////////////
4218// //
4219// Function: MXL_RegWriteBit //
4220// //
4221// Description: Write a register for specified register address, //
4222// register bit and register bit value //
4223// //
4224// Globals: //
4225// NONE //
4226// //
4227// Inputs: //
4228// Tuner_struct : structure defined at higher level //
4229// address : register address //
Steven Toth3935c252008-05-01 05:45:44 -03004230// bit : register bit number //
Steven Totha8214d42008-05-01 05:02:58 -03004231// bitVal : register bit value //
Steven Toth52c99bd2008-05-01 04:57:01 -03004232// //
4233// Outputs: //
4234// NONE //
4235// //
4236// Return: //
4237// NONE //
4238// //
4239///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03004240// DONE
Steven Toth3935c252008-05-01 05:45:44 -03004241void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03004242{
Steven Toth85d220d2008-05-01 05:48:14 -03004243 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03004244 int i ;
4245
Steven Totha8214d42008-05-01 05:02:58 -03004246 const u8 AND_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03004247 0xFE, 0xFD, 0xFB, 0xF7,
4248 0xEF, 0xDF, 0xBF, 0x7F } ;
4249
Steven Totha8214d42008-05-01 05:02:58 -03004250 const u8 OR_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03004251 0x01, 0x02, 0x04, 0x08,
4252 0x10, 0x20, 0x40, 0x80 } ;
4253
Steven Toth3935c252008-05-01 05:45:44 -03004254 for (i = 0; i < state->TunerRegs_Num; i++) {
4255 if (state->TunerRegs[i].Reg_Num == address) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004256 if (bitVal)
Steven Toth3935c252008-05-01 05:45:44 -03004257 state->TunerRegs[i].Reg_Val |= OR_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03004258 else
Steven Toth3935c252008-05-01 05:45:44 -03004259 state->TunerRegs[i].Reg_Val &= AND_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03004260 break ;
4261 }
4262 }
Steven Toth3935c252008-05-01 05:45:44 -03004263}
Steven Toth52c99bd2008-05-01 04:57:01 -03004264
4265///////////////////////////////////////////////////////////////////////////////
4266// //
4267// Function: MXL_Ceiling //
4268// //
4269// Description: Complete to closest increment of resolution //
4270// //
4271// Globals: //
4272// NONE //
4273// //
4274// Functions used: //
4275// NONE //
4276// //
4277// Inputs: //
4278// value : Input number to compute //
4279// resolution : Increment step //
4280// //
4281// Outputs: //
4282// NONE //
4283// //
4284// Return: //
4285// Computed value //
4286// //
4287///////////////////////////////////////////////////////////////////////////////
Steven Toth5c1b2052008-05-01 07:04:09 -03004288// DONE
Steven Toth3935c252008-05-01 05:45:44 -03004289u32 MXL_Ceiling(u32 value, u32 resolution)
Steven Toth52c99bd2008-05-01 04:57:01 -03004290{
Steven Toth3935c252008-05-01 05:45:44 -03004291 return (value/resolution + (value % resolution > 0 ? 1 : 0));
4292}
Steven Toth52c99bd2008-05-01 04:57:01 -03004293
4294//
4295// Retrieve the Initialzation Registers
4296//
Steven Toth5c1b2052008-05-01 07:04:09 -03004297// DONE
Steven Toth3935c252008-05-01 05:45:44 -03004298u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004299{
Steven Totha8214d42008-05-01 05:02:58 -03004300 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004301 int i ;
4302
Steven Toth3935c252008-05-01 05:45:44 -03004303 u8 RegAddr[] = {
4304 11, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73,
4305 76, 77, 91, 134, 135, 137, 147,
4306 156, 166, 167, 168, 25 };
Steven Toth52c99bd2008-05-01 04:57:01 -03004307
Steven Toth3935c252008-05-01 05:45:44 -03004308 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004309
Steven Toth3935c252008-05-01 05:45:44 -03004310 status += MXL_BlockInit(fe);
4311
4312 for (i = 0 ; i < *count; i++) {
4313 RegNum[i] = RegAddr[i];
4314 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004315 }
4316
Steven Toth3935c252008-05-01 05:45:44 -03004317 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004318}
4319
Steven Toth5c1b2052008-05-01 07:04:09 -03004320// DONE
Steven Toth3935c252008-05-01 05:45:44 -03004321u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004322{
Steven Totha8214d42008-05-01 05:02:58 -03004323 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004324 int i ;
4325
4326//add 77, 166, 167, 168 register for 2.6.12
4327#ifdef _MXL_PRODUCTION
Steven Totha8214d42008-05-01 05:02:58 -03004328 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106,
4329 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004330#else
Steven Totha8214d42008-05-01 05:02:58 -03004331 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106,
4332 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
4333 //u8 RegAddr[171];
Steven Toth52c99bd2008-05-01 04:57:01 -03004334 //for (i=0; i<=170; i++)
4335 // RegAddr[i] = i;
4336#endif
4337
Steven Toth3935c252008-05-01 05:45:44 -03004338 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004339
Steven Toth3935c252008-05-01 05:45:44 -03004340 for (i = 0 ; i < *count; i++) {
4341 RegNum[i] = RegAddr[i];
4342 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004343 }
4344
Steven Toth3935c252008-05-01 05:45:44 -03004345 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004346}
4347
Steven Toth5c1b2052008-05-01 07:04:09 -03004348// DONE
Steven Toth3935c252008-05-01 05:45:44 -03004349u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004350{
Steven Toth3935c252008-05-01 05:45:44 -03004351 u16 status = 0;
4352 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03004353
Steven Toth3935c252008-05-01 05:45:44 -03004354 u8 RegAddr[] = {43, 136};
Steven Toth52c99bd2008-05-01 04:57:01 -03004355
Steven Toth3935c252008-05-01 05:45:44 -03004356 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004357
Steven Toth3935c252008-05-01 05:45:44 -03004358 for (i = 0; i < *count; i++) {
4359 RegNum[i] = RegAddr[i];
4360 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004361 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004362
Steven Toth3935c252008-05-01 05:45:44 -03004363 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004364}
4365
Steven Toth5c1b2052008-05-01 07:04:09 -03004366// DONE
Steven Toth3935c252008-05-01 05:45:44 -03004367u16 MXL_GetCHRegister_LowIF(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004368{
Steven Toth3935c252008-05-01 05:45:44 -03004369 u16 status = 0;
4370 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03004371
Steven Toth3935c252008-05-01 05:45:44 -03004372 u8 RegAddr[] = { 138 };
Steven Toth52c99bd2008-05-01 04:57:01 -03004373
Steven Toth3935c252008-05-01 05:45:44 -03004374 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004375
Steven Toth3935c252008-05-01 05:45:44 -03004376 for (i = 0; i < *count; i++) {
4377 RegNum[i] = RegAddr[i];
4378 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004379 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004380
Steven Toth3935c252008-05-01 05:45:44 -03004381 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004382}
4383
Steven Toth5c1b2052008-05-01 07:04:09 -03004384// DONE
Steven Totha8214d42008-05-01 05:02:58 -03004385u16 MXL_GetMasterControl(u8 *MasterReg, int state)
Steven Toth52c99bd2008-05-01 04:57:01 -03004386{
Steven Toth3935c252008-05-01 05:45:44 -03004387 if (state == 1) /* Load_Start */
4388 *MasterReg = 0xF3;
4389 if (state == 2) /* Power_Down */
4390 *MasterReg = 0x41;
4391 if (state == 3) /* Synth_Reset */
4392 *MasterReg = 0xB1;
4393 if (state == 4) /* Seq_Off */
4394 *MasterReg = 0xF1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004395
Steven Toth3935c252008-05-01 05:45:44 -03004396 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004397}
4398
4399#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03004400u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)
Steven Toth52c99bd2008-05-01 04:57:01 -03004401{
Steven Toth85d220d2008-05-01 05:48:14 -03004402 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004403 u16 status = 0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004404
Steven Totha8214d42008-05-01 05:02:58 -03004405 if (VCO_Range == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03004406 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4407 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4408 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4409 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4410 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4411 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4412 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4413 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4414 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4415 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4416 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
4417 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 180224);
Steven Totha8214d42008-05-01 05:02:58 -03004418 }
Steven Toth3935c252008-05-01 05:45:44 -03004419 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4420 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4421 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4422 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
4423 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 222822);
Steven Totha8214d42008-05-01 05:02:58 -03004424 }
Steven Toth3935c252008-05-01 05:45:44 -03004425 if (state->Mode == 1) /* Digital Mode */ {
4426 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4427 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4428 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
4429 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 229376);
Steven Totha8214d42008-05-01 05:02:58 -03004430 }
4431 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004432
Steven Totha8214d42008-05-01 05:02:58 -03004433 if (VCO_Range == 2) {
Steven Toth3935c252008-05-01 05:45:44 -03004434 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4435 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4436 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4437 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4438 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4439 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4440 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4441 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4442 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4443 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
4444 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4445 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4446 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4447 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4448 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004449 }
Steven Toth3935c252008-05-01 05:45:44 -03004450 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4451 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4452 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4453 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4454 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004455 }
Steven Toth3935c252008-05-01 05:45:44 -03004456 if (state->Mode == 1) /* Digital Mode */ {
4457 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4458 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4459 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
4460 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 16384);
Steven Totha8214d42008-05-01 05:02:58 -03004461 }
4462 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004463
Steven Totha8214d42008-05-01 05:02:58 -03004464 if (VCO_Range == 3) {
Steven Toth3935c252008-05-01 05:45:44 -03004465 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4466 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4467 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4468 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4469 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4470 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4471 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4472 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4473 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4474 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4475 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4476 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4477 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4478 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
4479 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03004480 }
Steven Toth3935c252008-05-01 05:45:44 -03004481 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4482 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4483 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4484 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
4485 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03004486 }
Steven Toth3935c252008-05-01 05:45:44 -03004487 if (state->Mode == 1) /* Digital Mode */ {
4488 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4489 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4490 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4491 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 245760);
Steven Totha8214d42008-05-01 05:02:58 -03004492 }
4493 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004494
Steven Totha8214d42008-05-01 05:02:58 -03004495 if (VCO_Range == 4) {
Steven Toth3935c252008-05-01 05:45:44 -03004496 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4497 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4498 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4499 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4500 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4501 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4502 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4503 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4504 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4505 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4506 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4507 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4508 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4509 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4510 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004511 }
Steven Toth3935c252008-05-01 05:45:44 -03004512 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4513 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4514 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4515 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4516 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004517 }
Steven Toth3935c252008-05-01 05:45:44 -03004518 if (state->Mode == 1) /* Digital Mode */ {
4519 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4520 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4521 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4522 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 212992);
Steven Totha8214d42008-05-01 05:02:58 -03004523 }
4524 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004525
Steven Totha8214d42008-05-01 05:02:58 -03004526 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004527}
4528
Steven Toth5c1b2052008-05-01 07:04:09 -03004529// DONE
Steven Toth3935c252008-05-01 05:45:44 -03004530u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)
Steven Toth52c99bd2008-05-01 04:57:01 -03004531{
Steven Toth85d220d2008-05-01 05:48:14 -03004532 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004533 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004534
4535 if (Hystersis == 1)
Steven Toth3935c252008-05-01 05:45:44 -03004536 status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03004537
Steven Totha8214d42008-05-01 05:02:58 -03004538 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004539}
Steven Toth5c1b2052008-05-01 07:04:09 -03004540
Steven Toth52c99bd2008-05-01 04:57:01 -03004541#endif
4542
Steven Toth5c1b2052008-05-01 07:04:09 -03004543/* Linux driver related functions */
Steven Toth7f5c3af2008-05-01 06:51:36 -03004544
Steven Toth85d220d2008-05-01 05:48:14 -03004545
Steven Toth8c66a192008-05-01 06:35:48 -03004546int mxl5005s_init(struct dvb_frontend *fe)
Steven Toth85d220d2008-05-01 05:48:14 -03004547{
Steven Toth5c1b2052008-05-01 07:04:09 -03004548 int MxlModMode;
4549 int MxlIfMode;
4550 unsigned long MxlBandwitdh;
4551 unsigned long MxlIfFreqHz;
4552 unsigned long MxlCrystalFreqHz;
4553 int MxlAgcMode;
4554 unsigned short MxlTop;
4555 unsigned short MxlIfOutputLoad;
4556 int MxlClockOut;
4557 int MxlDivOut;
4558 int MxlCapSel;
4559 int MxlRssiOnOff;
4560 unsigned char MxlStandard;
4561 unsigned char MxlTfType;
Steven Toth85d220d2008-05-01 05:48:14 -03004562
4563 /* Set MxL5005S parameters. */
Steven Toth5c1b2052008-05-01 07:04:09 -03004564 MxlModMode = MXL_DIGITAL_MODE;
4565 MxlIfMode = MXL_ZERO_IF;
4566// steve
4567 //MxlBandwitdh = MXL5005S_BANDWIDTH_8MHZ;
4568 //MxlIfFreqHz = IF_FREQ_4570000HZ;
4569 MxlBandwitdh = MXL5005S_BANDWIDTH_6MHZ; // config
4570 MxlIfFreqHz = IF_FREQ_5380000HZ; // config
4571 MxlCrystalFreqHz = CRYSTAL_FREQ_16000000HZ; // config
4572 MxlAgcMode = MXL_SINGLE_AGC;
4573 MxlTop = MXL5005S_TOP_25P2;
4574 MxlIfOutputLoad = MXL5005S_IF_OUTPUT_LOAD_200_OHM;
4575 MxlClockOut = MXL_CLOCK_OUT_DISABLE;
4576 MxlDivOut = MXL_DIV_OUT_4;
4577 MxlCapSel = MXL_CAP_SEL_ENABLE;
4578 MxlRssiOnOff = MXL_RSSI_ENABLE; // config
4579 MxlTfType = MXL_TF_C_H; // config
4580
4581 MxlStandard = MXL_ATSC; // config
4582
4583 // TODO: this is bad, it trashes other configs
4584 // Set MxL5005S extra module.
4585 //pExtra->AgcMasterByte = (MxlAgcMode == MXL_DUAL_AGC) ? 0x4 : 0x0;
4586
Steven Toth85d220d2008-05-01 05:48:14 -03004587 MXL5005_TunerConfig(
4588 fe,
Steven Toth5c1b2052008-05-01 07:04:09 -03004589 (unsigned char)MxlModMode,
4590 (unsigned char)MxlIfMode,
4591 MxlBandwitdh,
4592 MxlIfFreqHz,
4593 MxlCrystalFreqHz,
4594 (unsigned char)MxlAgcMode,
4595 MxlTop,
4596 MxlIfOutputLoad,
4597 (unsigned char)MxlClockOut,
4598 (unsigned char)MxlDivOut,
4599 (unsigned char)MxlCapSel,
4600 (unsigned char)MxlRssiOnOff,
4601 MxlStandard, MxlTfType);
Steven Toth85d220d2008-05-01 05:48:14 -03004602
Steven Toth5c1b2052008-05-01 07:04:09 -03004603 return mxl5005s_init2(fe);
Steven Toth85d220d2008-05-01 05:48:14 -03004604}
4605
4606static int mxl5005s_set_params(struct dvb_frontend *fe,
4607 struct dvb_frontend_parameters *params)
4608{
Steven Toth5c1b2052008-05-01 07:04:09 -03004609 u32 freq;
4610 u32 bw;
Steven Toth85d220d2008-05-01 05:48:14 -03004611
Steven Toth5c1b2052008-05-01 07:04:09 -03004612 if (fe->ops.info.type == FE_OFDM)
4613 bw = params->u.ofdm.bandwidth;
4614 else
4615 bw = MXL5005S_BANDWIDTH_6MHZ;
Steven Toth85d220d2008-05-01 05:48:14 -03004616
Steven Toth5c1b2052008-05-01 07:04:09 -03004617 freq = params->frequency; /* Hz */
4618 dprintk(1, "%s() freq=%d bw=%d\n", __func__, freq, bw);
Steven Toth85d220d2008-05-01 05:48:14 -03004619
Steven Toth5c1b2052008-05-01 07:04:09 -03004620 return mxl5005s_SetRfFreqHz(fe, freq);
Steven Toth85d220d2008-05-01 05:48:14 -03004621}
4622
4623static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency)
4624{
4625 struct mxl5005s_state *state = fe->tuner_priv;
4626 dprintk(1, "%s()\n", __func__);
4627
4628 *frequency = state->RF_IN;
4629
4630 return 0;
4631}
4632
4633static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
4634{
4635 struct mxl5005s_state *state = fe->tuner_priv;
4636 dprintk(1, "%s()\n", __func__);
4637
4638 *bandwidth = state->Chan_Bandwidth;
4639
4640 return 0;
4641}
4642
Steven Toth5c1b2052008-05-01 07:04:09 -03004643static int mxl5005s_get_status(struct dvb_frontend *fe, u32 *status)
4644{
4645 dprintk(1, "%s()\n", __func__);
4646
4647 *status = 0;
4648 // *status = TUNER_STATUS_LOCKED;
4649
4650 return 0;
4651}
4652
4653static int mxl5005s_init2(struct dvb_frontend *fe)
4654{
4655 struct mxl5005s_state *state = fe->tuner_priv;
4656 u8 AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4657 u8 ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4658 int TableLen;
4659
4660 dprintk(1, "%s()\n", __func__);
4661
4662 /* Initialize MxL5005S tuner according to MxL5005S tuner example code. */
4663
4664 /* Tuner initialization stage 0 */
4665 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
4666 AddrTable[0] = MASTER_CONTROL_ADDR;
4667 ByteTable[0] |= state->config->AgcMasterByte;
4668
4669 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, 1);
4670
4671 /* Tuner initialization stage 1 */
4672 MXL_GetInitRegister(fe, AddrTable, ByteTable, &TableLen);
4673
4674 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, TableLen);
4675
4676 return 0;
4677}
4678
Steven Toth85d220d2008-05-01 05:48:14 -03004679static int mxl5005s_release(struct dvb_frontend *fe)
4680{
4681 dprintk(1, "%s()\n", __func__);
4682 kfree(fe->tuner_priv);
4683 fe->tuner_priv = NULL;
4684 return 0;
4685}
4686
4687static const struct dvb_tuner_ops mxl5005s_tuner_ops = {
4688 .info = {
4689 .name = "MaxLinear MXL5005S",
4690 .frequency_min = 48000000,
4691 .frequency_max = 860000000,
4692 .frequency_step = 50000,
4693 },
4694
4695 .release = mxl5005s_release,
4696 .init = mxl5005s_init,
4697
4698 .set_params = mxl5005s_set_params,
4699 .get_frequency = mxl5005s_get_frequency,
4700 .get_bandwidth = mxl5005s_get_bandwidth,
Steven Toth5c1b2052008-05-01 07:04:09 -03004701 .get_status = mxl5005s_get_status
Steven Toth85d220d2008-05-01 05:48:14 -03004702};
4703
4704struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe,
4705 struct i2c_adapter *i2c,
4706 struct mxl5005s_config *config)
4707{
4708 struct mxl5005s_state *state = NULL;
4709 dprintk(1, "%s()\n", __func__);
4710
4711 state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL);
4712 if (state == NULL)
4713 return NULL;
4714
4715 state->frontend = fe;
4716 state->config = config;
4717 state->i2c = i2c;
4718
4719 printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n", config->i2c_address);
4720
4721 memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops, sizeof(struct dvb_tuner_ops));
4722
4723 fe->tuner_priv = state;
4724 return fe;
4725}
4726EXPORT_SYMBOL(mxl5005s_attach);
4727
4728MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver");
Steven Toth5c1b2052008-05-01 07:04:09 -03004729MODULE_AUTHOR("Jan Hoogenraad");
4730MODULE_AUTHOR("Barnaby Shearer");
4731MODULE_AUTHOR("Andy Hasper");
Steven Toth85d220d2008-05-01 05:48:14 -03004732MODULE_AUTHOR("Steven Toth");
4733MODULE_LICENSE("GPL");