blob: aad88d5c0dc23efd2ad71476b5beb184d90b9e26 [file] [log] [blame]
Steven Toth52c99bd2008-05-01 04:57:01 -03001/*
2 * 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 */
24
Steven Toth2637d5b2008-05-01 05:01:31 -030025#include "mxl5005s.h"
Steven Toth52c99bd2008-05-01 04:57:01 -030026
Steven Toth8c66a192008-05-01 06:35:48 -030027static int debug = 2;
Steven Toth85d220d2008-05-01 05:48:14 -030028
29#define dprintk(level, arg...) do { \
Steven Toth8c66a192008-05-01 06:35:48 -030030 if (level <= debug) \
Steven Toth85d220d2008-05-01 05:48:14 -030031 printk(arg); \
32 } while (0)
33
34#define TUNER_REGS_NUM 104
35#define INITCTRL_NUM 40
36
37#ifdef _MXL_PRODUCTION
38#define CHCTRL_NUM 39
39#else
40#define CHCTRL_NUM 36
41#endif
42
43#define MXLCTRL_NUM 189
44#define MASTER_CONTROL_ADDR 9
45
Steven Toth85d220d2008-05-01 05:48:14 -030046/* Enumeration of Master Control Register State */
47typedef enum
48{
49 MC_LOAD_START = 1,
50 MC_POWER_DOWN,
51 MC_SYNTH_RESET,
52 MC_SEQ_OFF
53} Master_Control_State;
54
Steven Toth85d220d2008-05-01 05:48:14 -030055/* Enumeration of MXL5005 Tuner Modulation Type */
56typedef enum
57{
58 MXL_DEFAULT_MODULATION = 0,
59 MXL_DVBT,
60 MXL_ATSC,
61 MXL_QAM,
62 MXL_ANALOG_CABLE,
63 MXL_ANALOG_OTA
64} Tuner_Modu_Type;
65
Steven Toth85d220d2008-05-01 05:48:14 -030066/* MXL5005 Tuner Register Struct */
67typedef struct _TunerReg_struct
68{
69 u16 Reg_Num; /* Tuner Register Address */
70 u16 Reg_Val; /* Current sofware programmed value waiting to be writen */
71} TunerReg_struct;
72
73typedef enum
74{
75 /* Initialization Control Names */
76 DN_IQTN_AMP_CUT = 1, /* 1 */
77 BB_MODE, /* 2 */
78 BB_BUF, /* 3 */
79 BB_BUF_OA, /* 4 */
80 BB_ALPF_BANDSELECT, /* 5 */
81 BB_IQSWAP, /* 6 */
82 BB_DLPF_BANDSEL, /* 7 */
83 RFSYN_CHP_GAIN, /* 8 */
84 RFSYN_EN_CHP_HIGAIN, /* 9 */
85 AGC_IF, /* 10 */
86 AGC_RF, /* 11 */
87 IF_DIVVAL, /* 12 */
88 IF_VCO_BIAS, /* 13 */
89 CHCAL_INT_MOD_IF, /* 14 */
90 CHCAL_FRAC_MOD_IF, /* 15 */
91 DRV_RES_SEL, /* 16 */
92 I_DRIVER, /* 17 */
93 EN_AAF, /* 18 */
94 EN_3P, /* 19 */
95 EN_AUX_3P, /* 20 */
96 SEL_AAF_BAND, /* 21 */
97 SEQ_ENCLK16_CLK_OUT, /* 22 */
98 SEQ_SEL4_16B, /* 23 */
99 XTAL_CAPSELECT, /* 24 */
100 IF_SEL_DBL, /* 25 */
101 RFSYN_R_DIV, /* 26 */
102 SEQ_EXTSYNTHCALIF, /* 27 */
103 SEQ_EXTDCCAL, /* 28 */
104 AGC_EN_RSSI, /* 29 */
105 RFA_ENCLKRFAGC, /* 30 */
106 RFA_RSSI_REFH, /* 31 */
107 RFA_RSSI_REF, /* 32 */
108 RFA_RSSI_REFL, /* 33 */
109 RFA_FLR, /* 34 */
110 RFA_CEIL, /* 35 */
111 SEQ_EXTIQFSMPULSE, /* 36 */
112 OVERRIDE_1, /* 37 */
113 BB_INITSTATE_DLPF_TUNE, /* 38 */
114 TG_R_DIV, /* 39 */
115 EN_CHP_LIN_B, /* 40 */
116
117 /* Channel Change Control Names */
118 DN_POLY = 51, /* 51 */
119 DN_RFGAIN, /* 52 */
120 DN_CAP_RFLPF, /* 53 */
121 DN_EN_VHFUHFBAR, /* 54 */
122 DN_GAIN_ADJUST, /* 55 */
123 DN_IQTNBUF_AMP, /* 56 */
124 DN_IQTNGNBFBIAS_BST, /* 57 */
125 RFSYN_EN_OUTMUX, /* 58 */
126 RFSYN_SEL_VCO_OUT, /* 59 */
127 RFSYN_SEL_VCO_HI, /* 60 */
128 RFSYN_SEL_DIVM, /* 61 */
129 RFSYN_RF_DIV_BIAS, /* 62 */
130 DN_SEL_FREQ, /* 63 */
131 RFSYN_VCO_BIAS, /* 64 */
132 CHCAL_INT_MOD_RF, /* 65 */
133 CHCAL_FRAC_MOD_RF, /* 66 */
134 RFSYN_LPF_R, /* 67 */
135 CHCAL_EN_INT_RF, /* 68 */
136 TG_LO_DIVVAL, /* 69 */
137 TG_LO_SELVAL, /* 70 */
138 TG_DIV_VAL, /* 71 */
139 TG_VCO_BIAS, /* 72 */
140 SEQ_EXTPOWERUP, /* 73 */
141 OVERRIDE_2, /* 74 */
142 OVERRIDE_3, /* 75 */
143 OVERRIDE_4, /* 76 */
144 SEQ_FSM_PULSE, /* 77 */
145 GPIO_4B, /* 78 */
146 GPIO_3B, /* 79 */
147 GPIO_4, /* 80 */
148 GPIO_3, /* 81 */
149 GPIO_1B, /* 82 */
150 DAC_A_ENABLE, /* 83 */
151 DAC_B_ENABLE, /* 84 */
152 DAC_DIN_A, /* 85 */
153 DAC_DIN_B, /* 86 */
154#ifdef _MXL_PRODUCTION
155 RFSYN_EN_DIV, /* 87 */
156 RFSYN_DIVM, /* 88 */
157 DN_BYPASS_AGC_I2C /* 89 */
158#endif
159} MXL5005_ControlName;
160
161/*
162 * The following context is source code provided by MaxLinear.
163 * MaxLinear source code - Common_MXL.h (?)
164 */
165
166/* Constants */
167#define MXL5005S_REG_WRITING_TABLE_LEN_MAX 104
168#define MXL5005S_LATCH_BYTE 0xfe
169
170/* Register address, MSB, and LSB */
171#define MXL5005S_BB_IQSWAP_ADDR 59
172#define MXL5005S_BB_IQSWAP_MSB 0
173#define MXL5005S_BB_IQSWAP_LSB 0
174
175#define MXL5005S_BB_DLPF_BANDSEL_ADDR 53
176#define MXL5005S_BB_DLPF_BANDSEL_MSB 4
177#define MXL5005S_BB_DLPF_BANDSEL_LSB 3
178
179/* Standard modes */
180enum
181{
182 MXL5005S_STANDARD_DVBT,
183 MXL5005S_STANDARD_ATSC,
184};
185#define MXL5005S_STANDARD_MODE_NUM 2
186
187/* Bandwidth modes */
188enum
189{
190 MXL5005S_BANDWIDTH_6MHZ = 6000000,
191 MXL5005S_BANDWIDTH_7MHZ = 7000000,
192 MXL5005S_BANDWIDTH_8MHZ = 8000000,
193};
194#define MXL5005S_BANDWIDTH_MODE_NUM 3
195
Steven Toth3935c252008-05-01 05:45:44 -0300196/* MXL5005 Tuner Control Struct */
197typedef struct _TunerControl_struct {
198 u16 Ctrl_Num; /* Control Number */
199 u16 size; /* Number of bits to represent Value */
200 u16 addr[25]; /* Array of Tuner Register Address for each bit position */
201 u16 bit[25]; /* Array of bit position in Register Address for each bit position */
202 u16 val[25]; /* Binary representation of Value */
203} TunerControl_struct;
Steven Toth52c99bd2008-05-01 04:57:01 -0300204
Steven Toth3935c252008-05-01 05:45:44 -0300205/* MXL5005 Tuner Struct */
206struct mxl5005s_state
Steven Toth52c99bd2008-05-01 04:57:01 -0300207{
Steven Toth3935c252008-05-01 05:45:44 -0300208 u8 Mode; /* 0: Analog Mode ; 1: Digital Mode */
209 u8 IF_Mode; /* for Analog Mode, 0: zero IF; 1: low IF */
210 u32 Chan_Bandwidth; /* filter channel bandwidth (6, 7, 8) */
211 u32 IF_OUT; /* Desired IF Out Frequency */
212 u16 IF_OUT_LOAD; /* IF Out Load Resistor (200/300 Ohms) */
213 u32 RF_IN; /* RF Input Frequency */
214 u32 Fxtal; /* XTAL Frequency */
215 u8 AGC_Mode; /* AGC Mode 0: Dual AGC; 1: Single AGC */
216 u16 TOP; /* Value: take over point */
217 u8 CLOCK_OUT; /* 0: turn off clock out; 1: turn on clock out */
218 u8 DIV_OUT; /* 4MHz or 16MHz */
219 u8 CAPSELECT; /* 0: disable On-Chip pulling cap; 1: enable */
220 u8 EN_RSSI; /* 0: disable RSSI; 1: enable RSSI */
221 u8 Mod_Type; /* Modulation Type; */
222 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
223 u8 TF_Type; /* Tracking Filter Type */
224 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
Steven Toth52c99bd2008-05-01 04:57:01 -0300225
Steven Toth3935c252008-05-01 05:45:44 -0300226 /* Calculated Settings */
227 u32 RF_LO; /* Synth RF LO Frequency */
228 u32 IF_LO; /* Synth IF LO Frequency */
229 u32 TG_LO; /* Synth TG_LO Frequency */
Steven Toth52c99bd2008-05-01 04:57:01 -0300230
Steven Toth3935c252008-05-01 05:45:44 -0300231 /* Pointers to ControlName Arrays */
232 u16 Init_Ctrl_Num; /* Number of INIT Control Names */
233 TunerControl_struct
234 Init_Ctrl[INITCTRL_NUM]; /* INIT Control Names Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300235
Steven Toth3935c252008-05-01 05:45:44 -0300236 u16 CH_Ctrl_Num; /* Number of CH Control Names */
237 TunerControl_struct
238 CH_Ctrl[CHCTRL_NUM]; /* CH Control Name Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300239
Steven Toth3935c252008-05-01 05:45:44 -0300240 u16 MXL_Ctrl_Num; /* Number of MXL Control Names */
241 TunerControl_struct
242 MXL_Ctrl[MXLCTRL_NUM]; /* MXL Control Name Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300243
Steven Toth3935c252008-05-01 05:45:44 -0300244 /* Pointer to Tuner Register Array */
245 u16 TunerRegs_Num; /* Number of Tuner Registers */
246 TunerReg_struct
247 TunerRegs[TUNER_REGS_NUM]; /* Tuner Register Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300248
Steven Toth85d220d2008-05-01 05:48:14 -0300249 /* Linux driver framework specific */
Steven Toth8c66a192008-05-01 06:35:48 -0300250 struct mxl5005s_config *config;
Steven Toth85d220d2008-05-01 05:48:14 -0300251 struct dvb_frontend *frontend;
252 struct i2c_adapter *i2c;
Steven Toth3935c252008-05-01 05:45:44 -0300253};
Steven Toth52c99bd2008-05-01 04:57:01 -0300254
Steven Toth85d220d2008-05-01 05:48:14 -0300255// funcs
256u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value);
257u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value);
258u16 MXL_GetMasterControl(u8 *MasterReg, int state);
259void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal);
260u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal, int *count);
261u32 MXL_Ceiling(u32 value, u32 resolution);
262u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal);
263u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal);
264u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, u32 value, u16 controlGroup);
265u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val);
266u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count);
267u32 MXL_GetXtalInt(u32 Xtal_Freq);
268u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq);
269void MXL_SynthIFLO_Calc(struct dvb_frontend *fe);
270void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe);
271u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal, int *count);
272int mxl5005s_SetRegsWithTable(struct dvb_frontend *fe, u8 *pAddrTable, u8 *pByteTable, int TableLen);
273u16 MXL_IFSynthInit(struct dvb_frontend *fe);
Steven Toth8c66a192008-05-01 06:35:48 -0300274int mxl5005s_AssignTunerMode(struct dvb_frontend *fe);
Steven Toth52c99bd2008-05-01 04:57:01 -0300275
Steven Toth85d220d2008-05-01 05:48:14 -0300276int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz)
Steven Toth52c99bd2008-05-01 04:57:01 -0300277{
Steven Toth85d220d2008-05-01 05:48:14 -0300278 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -0300279 unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
280 unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
281 int TableLen;
282
Steven Toth85d220d2008-05-01 05:48:14 -0300283 u32 IfDivval;
Steven Toth52c99bd2008-05-01 04:57:01 -0300284 unsigned char MasterControlByte;
285
Steven Toth85d220d2008-05-01 05:48:14 -0300286 dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300287
288 // Set MxL5005S tuner RF frequency according to MxL5005S tuner example code.
289
290 // Tuner RF frequency setting stage 0
291 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET) ;
292 AddrTable[0] = MASTER_CONTROL_ADDR;
Steven Toth85d220d2008-05-01 05:48:14 -0300293 ByteTable[0] |= state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300294
Steven Toth85d220d2008-05-01 05:48:14 -0300295 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300296
297 // Tuner RF frequency setting stage 1
Steven Toth85d220d2008-05-01 05:48:14 -0300298 MXL_TuneRF(fe, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300299
Steven Toth85d220d2008-05-01 05:48:14 -0300300 MXL_ControlRead(fe, IF_DIVVAL, &IfDivval);
Steven Toth52c99bd2008-05-01 04:57:01 -0300301
Steven Toth85d220d2008-05-01 05:48:14 -0300302 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0);
303 MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1);
304 MXL_ControlWrite(fe, IF_DIVVAL, 8);
305 MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen) ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300306
307 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
308 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Toth8c66a192008-05-01 06:35:48 -0300309 ByteTable[TableLen] = MasterControlByte | state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300310 TableLen += 1;
311
Steven Toth85d220d2008-05-01 05:48:14 -0300312 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300313
314 // Wait 30 ms.
Steven Toth8c66a192008-05-01 06:35:48 -0300315 msleep(150);
Steven Toth52c99bd2008-05-01 04:57:01 -0300316
317 // Tuner RF frequency setting stage 2
Steven Toth85d220d2008-05-01 05:48:14 -0300318 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1) ;
319 MXL_ControlWrite(fe, IF_DIVVAL, IfDivval) ;
320 MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen) ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300321
322 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
323 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Toth8c66a192008-05-01 06:35:48 -0300324 ByteTable[TableLen] = MasterControlByte | state->config->AgcMasterByte ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300325 TableLen += 1;
326
Steven Toth85d220d2008-05-01 05:48:14 -0300327 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300328
Steven Toth8c66a192008-05-01 06:35:48 -0300329 msleep(100);
330
Steven Toth85d220d2008-05-01 05:48:14 -0300331 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300332}
333
Steven Toth8c66a192008-05-01 06:35:48 -0300334static int mxl5005s_reset(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300335{
Steven Toth85d220d2008-05-01 05:48:14 -0300336 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth8c66a192008-05-01 06:35:48 -0300337 int ret = 0;
338
339 u8 buf[2] = { 0xff, 0x00 };
Steven Toth85d220d2008-05-01 05:48:14 -0300340 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
341 .buf = buf, .len = 2 };
Steven Toth52c99bd2008-05-01 04:57:01 -0300342
Steven Toth8c66a192008-05-01 06:35:48 -0300343 dprintk(2, "%s()\n", __func__);
344
345 if (fe->ops.i2c_gate_ctrl)
346 fe->ops.i2c_gate_ctrl(fe, 1);
347
348 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
349 printk(KERN_WARNING "mxl5005s I2C reset failed\n");
350 ret = -EREMOTEIO;
351 }
352
353 if (fe->ops.i2c_gate_ctrl)
354 fe->ops.i2c_gate_ctrl(fe, 0);
355
356 return ret;
357}
358
359/* Write a single byte to a single reg */
360static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val, int latch)
361{
362 struct mxl5005s_state *state = fe->tuner_priv;
363 u8 buf[3] = { reg, val, MXL5005S_LATCH_BYTE };
364 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
365 .buf = buf, .len = 3 };
366
367 if(latch == 0)
368 msg.len = 2;
369
370 dprintk(2, "%s(reg = 0x%x val = 0x%x addr = 0x%x)\n", __func__, reg, val, msg.addr);
371
Steven Toth85d220d2008-05-01 05:48:14 -0300372 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
373 printk(KERN_WARNING "mxl5005s I2C write failed\n");
374 return -EREMOTEIO;
Steven Toth3935c252008-05-01 05:45:44 -0300375 }
Steven Toth85d220d2008-05-01 05:48:14 -0300376 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300377}
378
Steven Toth85d220d2008-05-01 05:48:14 -0300379int mxl5005s_SetRegsWithTable(struct dvb_frontend *fe, u8 *pAddrTable, u8 *pByteTable, int TableLen)
Steven Toth52c99bd2008-05-01 04:57:01 -0300380{
Steven Toth8c66a192008-05-01 06:35:48 -0300381 int i, ret = 0;
382
383 if (fe->ops.i2c_gate_ctrl)
384 fe->ops.i2c_gate_ctrl(fe, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300385
386 for( i = 0 ; i < TableLen - 1 ; i++)
387 {
Steven Toth8c66a192008-05-01 06:35:48 -0300388 ret = mxl5005s_writereg(fe, pAddrTable[i], pByteTable[i], 0);
389 if (ret < 0)
390 break;
Steven Toth52c99bd2008-05-01 04:57:01 -0300391 }
392
Steven Toth8c66a192008-05-01 06:35:48 -0300393 ret = mxl5005s_writereg(fe, pAddrTable[i], pByteTable[i], 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300394
Steven Toth8c66a192008-05-01 06:35:48 -0300395 if (fe->ops.i2c_gate_ctrl)
396 fe->ops.i2c_gate_ctrl(fe, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -0300397
Steven Toth85d220d2008-05-01 05:48:14 -0300398 return ret;
Steven Toth52c99bd2008-05-01 04:57:01 -0300399}
400
Steven Toth3935c252008-05-01 05:45:44 -0300401int mxl5005s_SetRegMaskBits(struct dvb_frontend *fe,
Steven Toth52c99bd2008-05-01 04:57:01 -0300402 unsigned char RegAddr,
403 unsigned char Msb,
404 unsigned char Lsb,
405 const unsigned char WritingValue
406 )
407{
Steven Toth52c99bd2008-05-01 04:57:01 -0300408 int i;
409
410 unsigned char Mask;
411 unsigned char Shift;
Steven Toth52c99bd2008-05-01 04:57:01 -0300412 unsigned char RegByte;
413
Steven Toth3935c252008-05-01 05:45:44 -0300414 /* Generate mask and shift according to MSB and LSB. */
Steven Toth52c99bd2008-05-01 04:57:01 -0300415 Mask = 0;
416 for(i = Lsb; i < (unsigned char)(Msb + 1); i++)
417 Mask |= 0x1 << i;
418
419 Shift = Lsb;
420
Steven Toth3935c252008-05-01 05:45:44 -0300421 /* Get tuner register byte according to register adddress. */
Steven Toth85d220d2008-05-01 05:48:14 -0300422 MXL_RegRead(fe, RegAddr, &RegByte);
Steven Toth52c99bd2008-05-01 04:57:01 -0300423
Steven Toth3935c252008-05-01 05:45:44 -0300424 /* Reserve register byte unmask bit with mask and inlay writing value into it. */
Steven Toth52c99bd2008-05-01 04:57:01 -0300425 RegByte &= ~Mask;
426 RegByte |= (WritingValue << Shift) & Mask;
427
Steven Toth3935c252008-05-01 05:45:44 -0300428 /* Update tuner register byte table. */
Steven Toth85d220d2008-05-01 05:48:14 -0300429 MXL_RegWrite(fe, RegAddr, RegByte);
Steven Toth52c99bd2008-05-01 04:57:01 -0300430
Steven Toth3935c252008-05-01 05:45:44 -0300431 /* Write tuner register byte with writing byte. */
Steven Toth85d220d2008-05-01 05:48:14 -0300432 return mxl5005s_SetRegsWithTable(fe, &RegAddr, &RegByte, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300433}
434
Steven Toth8c66a192008-05-01 06:35:48 -0300435
Steven Toth52c99bd2008-05-01 04:57:01 -0300436// The following context is source code provided by MaxLinear.
Steven Toth52c99bd2008-05-01 04:57:01 -0300437// MaxLinear source code - MXL5005_Initialize.cpp
Steven Toth3935c252008-05-01 05:45:44 -0300438// DONE
439u16 MXL5005_RegisterInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300440{
Steven Toth85d220d2008-05-01 05:48:14 -0300441 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300442 state->TunerRegs_Num = TUNER_REGS_NUM ;
443// state->TunerRegs = (TunerReg_struct *) calloc( TUNER_REGS_NUM, sizeof(TunerReg_struct) ) ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300444
Steven Toth3935c252008-05-01 05:45:44 -0300445 state->TunerRegs[0].Reg_Num = 9 ;
446 state->TunerRegs[0].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300447
Steven Toth3935c252008-05-01 05:45:44 -0300448 state->TunerRegs[1].Reg_Num = 11 ;
449 state->TunerRegs[1].Reg_Val = 0x19 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300450
Steven Toth3935c252008-05-01 05:45:44 -0300451 state->TunerRegs[2].Reg_Num = 12 ;
452 state->TunerRegs[2].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300453
Steven Toth3935c252008-05-01 05:45:44 -0300454 state->TunerRegs[3].Reg_Num = 13 ;
455 state->TunerRegs[3].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300456
Steven Toth3935c252008-05-01 05:45:44 -0300457 state->TunerRegs[4].Reg_Num = 14 ;
458 state->TunerRegs[4].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300459
Steven Toth3935c252008-05-01 05:45:44 -0300460 state->TunerRegs[5].Reg_Num = 15 ;
461 state->TunerRegs[5].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300462
Steven Toth3935c252008-05-01 05:45:44 -0300463 state->TunerRegs[6].Reg_Num = 16 ;
464 state->TunerRegs[6].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300465
Steven Toth3935c252008-05-01 05:45:44 -0300466 state->TunerRegs[7].Reg_Num = 17 ;
467 state->TunerRegs[7].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300468
Steven Toth3935c252008-05-01 05:45:44 -0300469 state->TunerRegs[8].Reg_Num = 18 ;
470 state->TunerRegs[8].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300471
Steven Toth3935c252008-05-01 05:45:44 -0300472 state->TunerRegs[9].Reg_Num = 19 ;
473 state->TunerRegs[9].Reg_Val = 0x34 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300474
Steven Toth3935c252008-05-01 05:45:44 -0300475 state->TunerRegs[10].Reg_Num = 21 ;
476 state->TunerRegs[10].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300477
Steven Toth3935c252008-05-01 05:45:44 -0300478 state->TunerRegs[11].Reg_Num = 22 ;
479 state->TunerRegs[11].Reg_Val = 0x6B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300480
Steven Toth3935c252008-05-01 05:45:44 -0300481 state->TunerRegs[12].Reg_Num = 23 ;
482 state->TunerRegs[12].Reg_Val = 0x35 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300483
Steven Toth3935c252008-05-01 05:45:44 -0300484 state->TunerRegs[13].Reg_Num = 24 ;
485 state->TunerRegs[13].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300486
Steven Toth3935c252008-05-01 05:45:44 -0300487 state->TunerRegs[14].Reg_Num = 25 ;
488 state->TunerRegs[14].Reg_Val = 0x3E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300489
Steven Toth3935c252008-05-01 05:45:44 -0300490 state->TunerRegs[15].Reg_Num = 26 ;
491 state->TunerRegs[15].Reg_Val = 0x82 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300492
Steven Toth3935c252008-05-01 05:45:44 -0300493 state->TunerRegs[16].Reg_Num = 31 ;
494 state->TunerRegs[16].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300495
Steven Toth3935c252008-05-01 05:45:44 -0300496 state->TunerRegs[17].Reg_Num = 32 ;
497 state->TunerRegs[17].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300498
Steven Toth3935c252008-05-01 05:45:44 -0300499 state->TunerRegs[18].Reg_Num = 33 ;
500 state->TunerRegs[18].Reg_Val = 0x53 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300501
Steven Toth3935c252008-05-01 05:45:44 -0300502 state->TunerRegs[19].Reg_Num = 34 ;
503 state->TunerRegs[19].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300504
Steven Toth3935c252008-05-01 05:45:44 -0300505 state->TunerRegs[20].Reg_Num = 35 ;
506 state->TunerRegs[20].Reg_Val = 0xC9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300507
Steven Toth3935c252008-05-01 05:45:44 -0300508 state->TunerRegs[21].Reg_Num = 36 ;
509 state->TunerRegs[21].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300510
Steven Toth3935c252008-05-01 05:45:44 -0300511 state->TunerRegs[22].Reg_Num = 37 ;
512 state->TunerRegs[22].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300513
Steven Toth3935c252008-05-01 05:45:44 -0300514 state->TunerRegs[23].Reg_Num = 41 ;
515 state->TunerRegs[23].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300516
Steven Toth3935c252008-05-01 05:45:44 -0300517 state->TunerRegs[24].Reg_Num = 42 ;
518 state->TunerRegs[24].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300519
Steven Toth3935c252008-05-01 05:45:44 -0300520 state->TunerRegs[25].Reg_Num = 43 ;
521 state->TunerRegs[25].Reg_Val = 0x43 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300522
Steven Toth3935c252008-05-01 05:45:44 -0300523 state->TunerRegs[26].Reg_Num = 44 ;
524 state->TunerRegs[26].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300525
Steven Toth3935c252008-05-01 05:45:44 -0300526 state->TunerRegs[27].Reg_Num = 45 ;
527 state->TunerRegs[27].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300528
Steven Toth3935c252008-05-01 05:45:44 -0300529 state->TunerRegs[28].Reg_Num = 46 ;
530 state->TunerRegs[28].Reg_Val = 0x88 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300531
Steven Toth3935c252008-05-01 05:45:44 -0300532 state->TunerRegs[29].Reg_Num = 47 ;
533 state->TunerRegs[29].Reg_Val = 0x86 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300534
Steven Toth3935c252008-05-01 05:45:44 -0300535 state->TunerRegs[30].Reg_Num = 48 ;
536 state->TunerRegs[30].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300537
Steven Toth3935c252008-05-01 05:45:44 -0300538 state->TunerRegs[31].Reg_Num = 49 ;
539 state->TunerRegs[31].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300540
Steven Toth3935c252008-05-01 05:45:44 -0300541 state->TunerRegs[32].Reg_Num = 53 ;
542 state->TunerRegs[32].Reg_Val = 0x94 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300543
Steven Toth3935c252008-05-01 05:45:44 -0300544 state->TunerRegs[33].Reg_Num = 54 ;
545 state->TunerRegs[33].Reg_Val = 0xFA ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300546
Steven Toth3935c252008-05-01 05:45:44 -0300547 state->TunerRegs[34].Reg_Num = 55 ;
548 state->TunerRegs[34].Reg_Val = 0x92 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300549
Steven Toth3935c252008-05-01 05:45:44 -0300550 state->TunerRegs[35].Reg_Num = 56 ;
551 state->TunerRegs[35].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300552
Steven Toth3935c252008-05-01 05:45:44 -0300553 state->TunerRegs[36].Reg_Num = 57 ;
554 state->TunerRegs[36].Reg_Val = 0x41 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300555
Steven Toth3935c252008-05-01 05:45:44 -0300556 state->TunerRegs[37].Reg_Num = 58 ;
557 state->TunerRegs[37].Reg_Val = 0xDB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300558
Steven Toth3935c252008-05-01 05:45:44 -0300559 state->TunerRegs[38].Reg_Num = 59 ;
560 state->TunerRegs[38].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300561
Steven Toth3935c252008-05-01 05:45:44 -0300562 state->TunerRegs[39].Reg_Num = 60 ;
563 state->TunerRegs[39].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300564
Steven Toth3935c252008-05-01 05:45:44 -0300565 state->TunerRegs[40].Reg_Num = 61 ;
566 state->TunerRegs[40].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300567
Steven Toth3935c252008-05-01 05:45:44 -0300568 state->TunerRegs[41].Reg_Num = 62 ;
569 state->TunerRegs[41].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300570
Steven Toth3935c252008-05-01 05:45:44 -0300571 state->TunerRegs[42].Reg_Num = 65 ;
572 state->TunerRegs[42].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300573
Steven Toth3935c252008-05-01 05:45:44 -0300574 state->TunerRegs[43].Reg_Num = 66 ;
575 state->TunerRegs[43].Reg_Val = 0xE4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300576
Steven Toth3935c252008-05-01 05:45:44 -0300577 state->TunerRegs[44].Reg_Num = 67 ;
578 state->TunerRegs[44].Reg_Val = 0x90 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300579
Steven Toth3935c252008-05-01 05:45:44 -0300580 state->TunerRegs[45].Reg_Num = 68 ;
581 state->TunerRegs[45].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300582
Steven Toth3935c252008-05-01 05:45:44 -0300583 state->TunerRegs[46].Reg_Num = 69 ;
584 state->TunerRegs[46].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300585
Steven Toth3935c252008-05-01 05:45:44 -0300586 state->TunerRegs[47].Reg_Num = 70 ;
587 state->TunerRegs[47].Reg_Val = 0x50 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300588
Steven Toth3935c252008-05-01 05:45:44 -0300589 state->TunerRegs[48].Reg_Num = 71 ;
590 state->TunerRegs[48].Reg_Val = 0x06 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300591
Steven Toth3935c252008-05-01 05:45:44 -0300592 state->TunerRegs[49].Reg_Num = 72 ;
593 state->TunerRegs[49].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300594
Steven Toth3935c252008-05-01 05:45:44 -0300595 state->TunerRegs[50].Reg_Num = 73 ;
596 state->TunerRegs[50].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300597
Steven Toth3935c252008-05-01 05:45:44 -0300598 state->TunerRegs[51].Reg_Num = 76 ;
599 state->TunerRegs[51].Reg_Val = 0xBB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300600
Steven Toth3935c252008-05-01 05:45:44 -0300601 state->TunerRegs[52].Reg_Num = 77 ;
602 state->TunerRegs[52].Reg_Val = 0x13 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300603
Steven Toth3935c252008-05-01 05:45:44 -0300604 state->TunerRegs[53].Reg_Num = 81 ;
605 state->TunerRegs[53].Reg_Val = 0x04 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300606
Steven Toth3935c252008-05-01 05:45:44 -0300607 state->TunerRegs[54].Reg_Num = 82 ;
608 state->TunerRegs[54].Reg_Val = 0x75 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300609
Steven Toth3935c252008-05-01 05:45:44 -0300610 state->TunerRegs[55].Reg_Num = 83 ;
611 state->TunerRegs[55].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300612
Steven Toth3935c252008-05-01 05:45:44 -0300613 state->TunerRegs[56].Reg_Num = 84 ;
614 state->TunerRegs[56].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300615
Steven Toth3935c252008-05-01 05:45:44 -0300616 state->TunerRegs[57].Reg_Num = 85 ;
617 state->TunerRegs[57].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300618
Steven Toth3935c252008-05-01 05:45:44 -0300619 state->TunerRegs[58].Reg_Num = 91 ;
620 state->TunerRegs[58].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300621
Steven Toth3935c252008-05-01 05:45:44 -0300622 state->TunerRegs[59].Reg_Num = 92 ;
623 state->TunerRegs[59].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300624
Steven Toth3935c252008-05-01 05:45:44 -0300625 state->TunerRegs[60].Reg_Num = 93 ;
626 state->TunerRegs[60].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300627
Steven Toth3935c252008-05-01 05:45:44 -0300628 state->TunerRegs[61].Reg_Num = 94 ;
629 state->TunerRegs[61].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300630
Steven Toth3935c252008-05-01 05:45:44 -0300631 state->TunerRegs[62].Reg_Num = 95 ;
632 state->TunerRegs[62].Reg_Val = 0x0C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300633
Steven Toth3935c252008-05-01 05:45:44 -0300634 state->TunerRegs[63].Reg_Num = 96 ;
635 state->TunerRegs[63].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300636
Steven Toth3935c252008-05-01 05:45:44 -0300637 state->TunerRegs[64].Reg_Num = 97 ;
638 state->TunerRegs[64].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300639
Steven Toth3935c252008-05-01 05:45:44 -0300640 state->TunerRegs[65].Reg_Num = 98 ;
641 state->TunerRegs[65].Reg_Val = 0xE2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300642
Steven Toth3935c252008-05-01 05:45:44 -0300643 state->TunerRegs[66].Reg_Num = 99 ;
644 state->TunerRegs[66].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300645
Steven Toth3935c252008-05-01 05:45:44 -0300646 state->TunerRegs[67].Reg_Num = 100 ;
647 state->TunerRegs[67].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300648
Steven Toth3935c252008-05-01 05:45:44 -0300649 state->TunerRegs[68].Reg_Num = 101 ;
650 state->TunerRegs[68].Reg_Val = 0x12 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300651
Steven Toth3935c252008-05-01 05:45:44 -0300652 state->TunerRegs[69].Reg_Num = 102 ;
653 state->TunerRegs[69].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300654
Steven Toth3935c252008-05-01 05:45:44 -0300655 state->TunerRegs[70].Reg_Num = 103 ;
656 state->TunerRegs[70].Reg_Val = 0x32 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300657
Steven Toth3935c252008-05-01 05:45:44 -0300658 state->TunerRegs[71].Reg_Num = 104 ;
659 state->TunerRegs[71].Reg_Val = 0xB4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300660
Steven Toth3935c252008-05-01 05:45:44 -0300661 state->TunerRegs[72].Reg_Num = 105 ;
662 state->TunerRegs[72].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300663
Steven Toth3935c252008-05-01 05:45:44 -0300664 state->TunerRegs[73].Reg_Num = 106 ;
665 state->TunerRegs[73].Reg_Val = 0x83 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300666
Steven Toth3935c252008-05-01 05:45:44 -0300667 state->TunerRegs[74].Reg_Num = 107 ;
668 state->TunerRegs[74].Reg_Val = 0x84 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300669
Steven Toth3935c252008-05-01 05:45:44 -0300670 state->TunerRegs[75].Reg_Num = 108 ;
671 state->TunerRegs[75].Reg_Val = 0x9C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300672
Steven Toth3935c252008-05-01 05:45:44 -0300673 state->TunerRegs[76].Reg_Num = 109 ;
674 state->TunerRegs[76].Reg_Val = 0x02 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300675
Steven Toth3935c252008-05-01 05:45:44 -0300676 state->TunerRegs[77].Reg_Num = 110 ;
677 state->TunerRegs[77].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300678
Steven Toth3935c252008-05-01 05:45:44 -0300679 state->TunerRegs[78].Reg_Num = 111 ;
680 state->TunerRegs[78].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300681
Steven Toth3935c252008-05-01 05:45:44 -0300682 state->TunerRegs[79].Reg_Num = 112 ;
683 state->TunerRegs[79].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300684
Steven Toth3935c252008-05-01 05:45:44 -0300685 state->TunerRegs[80].Reg_Num = 131 ;
686 state->TunerRegs[80].Reg_Val = 0x8A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300687
Steven Toth3935c252008-05-01 05:45:44 -0300688 state->TunerRegs[81].Reg_Num = 132 ;
689 state->TunerRegs[81].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300690
Steven Toth3935c252008-05-01 05:45:44 -0300691 state->TunerRegs[82].Reg_Num = 133 ;
692 state->TunerRegs[82].Reg_Val = 0x24 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300693
Steven Toth3935c252008-05-01 05:45:44 -0300694 state->TunerRegs[83].Reg_Num = 134 ;
695 state->TunerRegs[83].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300696
Steven Toth3935c252008-05-01 05:45:44 -0300697 state->TunerRegs[84].Reg_Num = 135 ;
698 state->TunerRegs[84].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300699
Steven Toth3935c252008-05-01 05:45:44 -0300700 state->TunerRegs[85].Reg_Num = 136 ;
701 state->TunerRegs[85].Reg_Val = 0x7E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300702
Steven Toth3935c252008-05-01 05:45:44 -0300703 state->TunerRegs[86].Reg_Num = 137 ;
704 state->TunerRegs[86].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300705
Steven Toth3935c252008-05-01 05:45:44 -0300706 state->TunerRegs[87].Reg_Num = 138 ;
707 state->TunerRegs[87].Reg_Val = 0x38 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300708
Steven Toth3935c252008-05-01 05:45:44 -0300709 state->TunerRegs[88].Reg_Num = 146 ;
710 state->TunerRegs[88].Reg_Val = 0xF6 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300711
Steven Toth3935c252008-05-01 05:45:44 -0300712 state->TunerRegs[89].Reg_Num = 147 ;
713 state->TunerRegs[89].Reg_Val = 0x1A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300714
Steven Toth3935c252008-05-01 05:45:44 -0300715 state->TunerRegs[90].Reg_Num = 148 ;
716 state->TunerRegs[90].Reg_Val = 0x62 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300717
Steven Toth3935c252008-05-01 05:45:44 -0300718 state->TunerRegs[91].Reg_Num = 149 ;
719 state->TunerRegs[91].Reg_Val = 0x33 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300720
Steven Toth3935c252008-05-01 05:45:44 -0300721 state->TunerRegs[92].Reg_Num = 150 ;
722 state->TunerRegs[92].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300723
Steven Toth3935c252008-05-01 05:45:44 -0300724 state->TunerRegs[93].Reg_Num = 156 ;
725 state->TunerRegs[93].Reg_Val = 0x56 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300726
Steven Toth3935c252008-05-01 05:45:44 -0300727 state->TunerRegs[94].Reg_Num = 157 ;
728 state->TunerRegs[94].Reg_Val = 0x17 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300729
Steven Toth3935c252008-05-01 05:45:44 -0300730 state->TunerRegs[95].Reg_Num = 158 ;
731 state->TunerRegs[95].Reg_Val = 0xA9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300732
Steven Toth3935c252008-05-01 05:45:44 -0300733 state->TunerRegs[96].Reg_Num = 159 ;
734 state->TunerRegs[96].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300735
Steven Toth3935c252008-05-01 05:45:44 -0300736 state->TunerRegs[97].Reg_Num = 160 ;
737 state->TunerRegs[97].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300738
Steven Toth3935c252008-05-01 05:45:44 -0300739 state->TunerRegs[98].Reg_Num = 161 ;
740 state->TunerRegs[98].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300741
Steven Toth3935c252008-05-01 05:45:44 -0300742 state->TunerRegs[99].Reg_Num = 162 ;
743 state->TunerRegs[99].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300744
Steven Toth3935c252008-05-01 05:45:44 -0300745 state->TunerRegs[100].Reg_Num = 166 ;
746 state->TunerRegs[100].Reg_Val = 0xAE ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300747
Steven Toth3935c252008-05-01 05:45:44 -0300748 state->TunerRegs[101].Reg_Num = 167 ;
749 state->TunerRegs[101].Reg_Val = 0x1B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300750
Steven Toth3935c252008-05-01 05:45:44 -0300751 state->TunerRegs[102].Reg_Num = 168 ;
752 state->TunerRegs[102].Reg_Val = 0xF2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300753
Steven Toth3935c252008-05-01 05:45:44 -0300754 state->TunerRegs[103].Reg_Num = 195 ;
755 state->TunerRegs[103].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300756
757 return 0 ;
758}
759
Steven Toth3935c252008-05-01 05:45:44 -0300760// DONE
761u16 MXL5005_ControlInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300762{
Steven Toth85d220d2008-05-01 05:48:14 -0300763 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300764 state->Init_Ctrl_Num = INITCTRL_NUM;
Steven Toth52c99bd2008-05-01 04:57:01 -0300765
Steven Toth3935c252008-05-01 05:45:44 -0300766 state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;
767 state->Init_Ctrl[0].size = 1 ;
768 state->Init_Ctrl[0].addr[0] = 73;
769 state->Init_Ctrl[0].bit[0] = 7;
770 state->Init_Ctrl[0].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300771
Steven Toth3935c252008-05-01 05:45:44 -0300772 state->Init_Ctrl[1].Ctrl_Num = BB_MODE ;
773 state->Init_Ctrl[1].size = 1 ;
774 state->Init_Ctrl[1].addr[0] = 53;
775 state->Init_Ctrl[1].bit[0] = 2;
776 state->Init_Ctrl[1].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300777
Steven Toth3935c252008-05-01 05:45:44 -0300778 state->Init_Ctrl[2].Ctrl_Num = BB_BUF ;
779 state->Init_Ctrl[2].size = 2 ;
780 state->Init_Ctrl[2].addr[0] = 53;
781 state->Init_Ctrl[2].bit[0] = 1;
782 state->Init_Ctrl[2].val[0] = 0;
783 state->Init_Ctrl[2].addr[1] = 57;
784 state->Init_Ctrl[2].bit[1] = 0;
785 state->Init_Ctrl[2].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300786
Steven Toth3935c252008-05-01 05:45:44 -0300787 state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;
788 state->Init_Ctrl[3].size = 1 ;
789 state->Init_Ctrl[3].addr[0] = 53;
790 state->Init_Ctrl[3].bit[0] = 0;
791 state->Init_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300792
Steven Toth3935c252008-05-01 05:45:44 -0300793 state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;
794 state->Init_Ctrl[4].size = 3 ;
795 state->Init_Ctrl[4].addr[0] = 53;
796 state->Init_Ctrl[4].bit[0] = 5;
797 state->Init_Ctrl[4].val[0] = 0;
798 state->Init_Ctrl[4].addr[1] = 53;
799 state->Init_Ctrl[4].bit[1] = 6;
800 state->Init_Ctrl[4].val[1] = 0;
801 state->Init_Ctrl[4].addr[2] = 53;
802 state->Init_Ctrl[4].bit[2] = 7;
803 state->Init_Ctrl[4].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300804
Steven Toth3935c252008-05-01 05:45:44 -0300805 state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;
806 state->Init_Ctrl[5].size = 1 ;
807 state->Init_Ctrl[5].addr[0] = 59;
808 state->Init_Ctrl[5].bit[0] = 0;
809 state->Init_Ctrl[5].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300810
Steven Toth3935c252008-05-01 05:45:44 -0300811 state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ;
812 state->Init_Ctrl[6].size = 2 ;
813 state->Init_Ctrl[6].addr[0] = 53;
814 state->Init_Ctrl[6].bit[0] = 3;
815 state->Init_Ctrl[6].val[0] = 0;
816 state->Init_Ctrl[6].addr[1] = 53;
817 state->Init_Ctrl[6].bit[1] = 4;
818 state->Init_Ctrl[6].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300819
Steven Toth3935c252008-05-01 05:45:44 -0300820 state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ;
821 state->Init_Ctrl[7].size = 4 ;
822 state->Init_Ctrl[7].addr[0] = 22;
823 state->Init_Ctrl[7].bit[0] = 4;
824 state->Init_Ctrl[7].val[0] = 0;
825 state->Init_Ctrl[7].addr[1] = 22;
826 state->Init_Ctrl[7].bit[1] = 5;
827 state->Init_Ctrl[7].val[1] = 1;
828 state->Init_Ctrl[7].addr[2] = 22;
829 state->Init_Ctrl[7].bit[2] = 6;
830 state->Init_Ctrl[7].val[2] = 1;
831 state->Init_Ctrl[7].addr[3] = 22;
832 state->Init_Ctrl[7].bit[3] = 7;
833 state->Init_Ctrl[7].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300834
Steven Toth3935c252008-05-01 05:45:44 -0300835 state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ;
836 state->Init_Ctrl[8].size = 1 ;
837 state->Init_Ctrl[8].addr[0] = 22;
838 state->Init_Ctrl[8].bit[0] = 2;
839 state->Init_Ctrl[8].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300840
Steven Toth3935c252008-05-01 05:45:44 -0300841 state->Init_Ctrl[9].Ctrl_Num = AGC_IF ;
842 state->Init_Ctrl[9].size = 4 ;
843 state->Init_Ctrl[9].addr[0] = 76;
844 state->Init_Ctrl[9].bit[0] = 0;
845 state->Init_Ctrl[9].val[0] = 1;
846 state->Init_Ctrl[9].addr[1] = 76;
847 state->Init_Ctrl[9].bit[1] = 1;
848 state->Init_Ctrl[9].val[1] = 1;
849 state->Init_Ctrl[9].addr[2] = 76;
850 state->Init_Ctrl[9].bit[2] = 2;
851 state->Init_Ctrl[9].val[2] = 0;
852 state->Init_Ctrl[9].addr[3] = 76;
853 state->Init_Ctrl[9].bit[3] = 3;
854 state->Init_Ctrl[9].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300855
Steven Toth3935c252008-05-01 05:45:44 -0300856 state->Init_Ctrl[10].Ctrl_Num = AGC_RF ;
857 state->Init_Ctrl[10].size = 4 ;
858 state->Init_Ctrl[10].addr[0] = 76;
859 state->Init_Ctrl[10].bit[0] = 4;
860 state->Init_Ctrl[10].val[0] = 1;
861 state->Init_Ctrl[10].addr[1] = 76;
862 state->Init_Ctrl[10].bit[1] = 5;
863 state->Init_Ctrl[10].val[1] = 1;
864 state->Init_Ctrl[10].addr[2] = 76;
865 state->Init_Ctrl[10].bit[2] = 6;
866 state->Init_Ctrl[10].val[2] = 0;
867 state->Init_Ctrl[10].addr[3] = 76;
868 state->Init_Ctrl[10].bit[3] = 7;
869 state->Init_Ctrl[10].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300870
Steven Toth3935c252008-05-01 05:45:44 -0300871 state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ;
872 state->Init_Ctrl[11].size = 5 ;
873 state->Init_Ctrl[11].addr[0] = 43;
874 state->Init_Ctrl[11].bit[0] = 3;
875 state->Init_Ctrl[11].val[0] = 0;
876 state->Init_Ctrl[11].addr[1] = 43;
877 state->Init_Ctrl[11].bit[1] = 4;
878 state->Init_Ctrl[11].val[1] = 0;
879 state->Init_Ctrl[11].addr[2] = 43;
880 state->Init_Ctrl[11].bit[2] = 5;
881 state->Init_Ctrl[11].val[2] = 0;
882 state->Init_Ctrl[11].addr[3] = 43;
883 state->Init_Ctrl[11].bit[3] = 6;
884 state->Init_Ctrl[11].val[3] = 1;
885 state->Init_Ctrl[11].addr[4] = 43;
886 state->Init_Ctrl[11].bit[4] = 7;
887 state->Init_Ctrl[11].val[4] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300888
Steven Toth3935c252008-05-01 05:45:44 -0300889 state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ;
890 state->Init_Ctrl[12].size = 6 ;
891 state->Init_Ctrl[12].addr[0] = 44;
892 state->Init_Ctrl[12].bit[0] = 2;
893 state->Init_Ctrl[12].val[0] = 0;
894 state->Init_Ctrl[12].addr[1] = 44;
895 state->Init_Ctrl[12].bit[1] = 3;
896 state->Init_Ctrl[12].val[1] = 0;
897 state->Init_Ctrl[12].addr[2] = 44;
898 state->Init_Ctrl[12].bit[2] = 4;
899 state->Init_Ctrl[12].val[2] = 0;
900 state->Init_Ctrl[12].addr[3] = 44;
901 state->Init_Ctrl[12].bit[3] = 5;
902 state->Init_Ctrl[12].val[3] = 1;
903 state->Init_Ctrl[12].addr[4] = 44;
904 state->Init_Ctrl[12].bit[4] = 6;
905 state->Init_Ctrl[12].val[4] = 0;
906 state->Init_Ctrl[12].addr[5] = 44;
907 state->Init_Ctrl[12].bit[5] = 7;
908 state->Init_Ctrl[12].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300909
Steven Toth3935c252008-05-01 05:45:44 -0300910 state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ;
911 state->Init_Ctrl[13].size = 7 ;
912 state->Init_Ctrl[13].addr[0] = 11;
913 state->Init_Ctrl[13].bit[0] = 0;
914 state->Init_Ctrl[13].val[0] = 1;
915 state->Init_Ctrl[13].addr[1] = 11;
916 state->Init_Ctrl[13].bit[1] = 1;
917 state->Init_Ctrl[13].val[1] = 0;
918 state->Init_Ctrl[13].addr[2] = 11;
919 state->Init_Ctrl[13].bit[2] = 2;
920 state->Init_Ctrl[13].val[2] = 0;
921 state->Init_Ctrl[13].addr[3] = 11;
922 state->Init_Ctrl[13].bit[3] = 3;
923 state->Init_Ctrl[13].val[3] = 1;
924 state->Init_Ctrl[13].addr[4] = 11;
925 state->Init_Ctrl[13].bit[4] = 4;
926 state->Init_Ctrl[13].val[4] = 1;
927 state->Init_Ctrl[13].addr[5] = 11;
928 state->Init_Ctrl[13].bit[5] = 5;
929 state->Init_Ctrl[13].val[5] = 0;
930 state->Init_Ctrl[13].addr[6] = 11;
931 state->Init_Ctrl[13].bit[6] = 6;
932 state->Init_Ctrl[13].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300933
Steven Toth3935c252008-05-01 05:45:44 -0300934 state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ;
935 state->Init_Ctrl[14].size = 16 ;
936 state->Init_Ctrl[14].addr[0] = 13;
937 state->Init_Ctrl[14].bit[0] = 0;
938 state->Init_Ctrl[14].val[0] = 0;
939 state->Init_Ctrl[14].addr[1] = 13;
940 state->Init_Ctrl[14].bit[1] = 1;
941 state->Init_Ctrl[14].val[1] = 0;
942 state->Init_Ctrl[14].addr[2] = 13;
943 state->Init_Ctrl[14].bit[2] = 2;
944 state->Init_Ctrl[14].val[2] = 0;
945 state->Init_Ctrl[14].addr[3] = 13;
946 state->Init_Ctrl[14].bit[3] = 3;
947 state->Init_Ctrl[14].val[3] = 0;
948 state->Init_Ctrl[14].addr[4] = 13;
949 state->Init_Ctrl[14].bit[4] = 4;
950 state->Init_Ctrl[14].val[4] = 0;
951 state->Init_Ctrl[14].addr[5] = 13;
952 state->Init_Ctrl[14].bit[5] = 5;
953 state->Init_Ctrl[14].val[5] = 0;
954 state->Init_Ctrl[14].addr[6] = 13;
955 state->Init_Ctrl[14].bit[6] = 6;
956 state->Init_Ctrl[14].val[6] = 0;
957 state->Init_Ctrl[14].addr[7] = 13;
958 state->Init_Ctrl[14].bit[7] = 7;
959 state->Init_Ctrl[14].val[7] = 0;
960 state->Init_Ctrl[14].addr[8] = 12;
961 state->Init_Ctrl[14].bit[8] = 0;
962 state->Init_Ctrl[14].val[8] = 0;
963 state->Init_Ctrl[14].addr[9] = 12;
964 state->Init_Ctrl[14].bit[9] = 1;
965 state->Init_Ctrl[14].val[9] = 0;
966 state->Init_Ctrl[14].addr[10] = 12;
967 state->Init_Ctrl[14].bit[10] = 2;
968 state->Init_Ctrl[14].val[10] = 0;
969 state->Init_Ctrl[14].addr[11] = 12;
970 state->Init_Ctrl[14].bit[11] = 3;
971 state->Init_Ctrl[14].val[11] = 0;
972 state->Init_Ctrl[14].addr[12] = 12;
973 state->Init_Ctrl[14].bit[12] = 4;
974 state->Init_Ctrl[14].val[12] = 0;
975 state->Init_Ctrl[14].addr[13] = 12;
976 state->Init_Ctrl[14].bit[13] = 5;
977 state->Init_Ctrl[14].val[13] = 1;
978 state->Init_Ctrl[14].addr[14] = 12;
979 state->Init_Ctrl[14].bit[14] = 6;
980 state->Init_Ctrl[14].val[14] = 1;
981 state->Init_Ctrl[14].addr[15] = 12;
982 state->Init_Ctrl[14].bit[15] = 7;
983 state->Init_Ctrl[14].val[15] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300984
Steven Toth3935c252008-05-01 05:45:44 -0300985 state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ;
986 state->Init_Ctrl[15].size = 3 ;
987 state->Init_Ctrl[15].addr[0] = 147;
988 state->Init_Ctrl[15].bit[0] = 2;
989 state->Init_Ctrl[15].val[0] = 0;
990 state->Init_Ctrl[15].addr[1] = 147;
991 state->Init_Ctrl[15].bit[1] = 3;
992 state->Init_Ctrl[15].val[1] = 1;
993 state->Init_Ctrl[15].addr[2] = 147;
994 state->Init_Ctrl[15].bit[2] = 4;
995 state->Init_Ctrl[15].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300996
Steven Toth3935c252008-05-01 05:45:44 -0300997 state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ;
998 state->Init_Ctrl[16].size = 2 ;
999 state->Init_Ctrl[16].addr[0] = 147;
1000 state->Init_Ctrl[16].bit[0] = 0;
1001 state->Init_Ctrl[16].val[0] = 0;
1002 state->Init_Ctrl[16].addr[1] = 147;
1003 state->Init_Ctrl[16].bit[1] = 1;
1004 state->Init_Ctrl[16].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001005
Steven Toth3935c252008-05-01 05:45:44 -03001006 state->Init_Ctrl[17].Ctrl_Num = EN_AAF ;
1007 state->Init_Ctrl[17].size = 1 ;
1008 state->Init_Ctrl[17].addr[0] = 147;
1009 state->Init_Ctrl[17].bit[0] = 7;
1010 state->Init_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001011
Steven Toth3935c252008-05-01 05:45:44 -03001012 state->Init_Ctrl[18].Ctrl_Num = EN_3P ;
1013 state->Init_Ctrl[18].size = 1 ;
1014 state->Init_Ctrl[18].addr[0] = 147;
1015 state->Init_Ctrl[18].bit[0] = 6;
1016 state->Init_Ctrl[18].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001017
Steven Toth3935c252008-05-01 05:45:44 -03001018 state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ;
1019 state->Init_Ctrl[19].size = 1 ;
1020 state->Init_Ctrl[19].addr[0] = 156;
1021 state->Init_Ctrl[19].bit[0] = 0;
1022 state->Init_Ctrl[19].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001023
Steven Toth3935c252008-05-01 05:45:44 -03001024 state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ;
1025 state->Init_Ctrl[20].size = 1 ;
1026 state->Init_Ctrl[20].addr[0] = 147;
1027 state->Init_Ctrl[20].bit[0] = 5;
1028 state->Init_Ctrl[20].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001029
Steven Toth3935c252008-05-01 05:45:44 -03001030 state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ;
1031 state->Init_Ctrl[21].size = 1 ;
1032 state->Init_Ctrl[21].addr[0] = 137;
1033 state->Init_Ctrl[21].bit[0] = 4;
1034 state->Init_Ctrl[21].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001035
Steven Toth3935c252008-05-01 05:45:44 -03001036 state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ;
1037 state->Init_Ctrl[22].size = 1 ;
1038 state->Init_Ctrl[22].addr[0] = 137;
1039 state->Init_Ctrl[22].bit[0] = 7;
1040 state->Init_Ctrl[22].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001041
Steven Toth3935c252008-05-01 05:45:44 -03001042 state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ;
1043 state->Init_Ctrl[23].size = 1 ;
1044 state->Init_Ctrl[23].addr[0] = 91;
1045 state->Init_Ctrl[23].bit[0] = 5;
1046 state->Init_Ctrl[23].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001047
Steven Toth3935c252008-05-01 05:45:44 -03001048 state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ;
1049 state->Init_Ctrl[24].size = 1 ;
1050 state->Init_Ctrl[24].addr[0] = 43;
1051 state->Init_Ctrl[24].bit[0] = 0;
1052 state->Init_Ctrl[24].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001053
Steven Toth3935c252008-05-01 05:45:44 -03001054 state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ;
1055 state->Init_Ctrl[25].size = 2 ;
1056 state->Init_Ctrl[25].addr[0] = 22;
1057 state->Init_Ctrl[25].bit[0] = 0;
1058 state->Init_Ctrl[25].val[0] = 1;
1059 state->Init_Ctrl[25].addr[1] = 22;
1060 state->Init_Ctrl[25].bit[1] = 1;
1061 state->Init_Ctrl[25].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001062
Steven Toth3935c252008-05-01 05:45:44 -03001063 state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ;
1064 state->Init_Ctrl[26].size = 1 ;
1065 state->Init_Ctrl[26].addr[0] = 134;
1066 state->Init_Ctrl[26].bit[0] = 2;
1067 state->Init_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001068
Steven Toth3935c252008-05-01 05:45:44 -03001069 state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ;
1070 state->Init_Ctrl[27].size = 1 ;
1071 state->Init_Ctrl[27].addr[0] = 137;
1072 state->Init_Ctrl[27].bit[0] = 3;
1073 state->Init_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001074
Steven Toth3935c252008-05-01 05:45:44 -03001075 state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ;
1076 state->Init_Ctrl[28].size = 1 ;
1077 state->Init_Ctrl[28].addr[0] = 77;
1078 state->Init_Ctrl[28].bit[0] = 7;
1079 state->Init_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001080
Steven Toth3935c252008-05-01 05:45:44 -03001081 state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ;
1082 state->Init_Ctrl[29].size = 1 ;
1083 state->Init_Ctrl[29].addr[0] = 166;
1084 state->Init_Ctrl[29].bit[0] = 7;
1085 state->Init_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001086
Steven Toth3935c252008-05-01 05:45:44 -03001087 state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ;
1088 state->Init_Ctrl[30].size = 3 ;
1089 state->Init_Ctrl[30].addr[0] = 166;
1090 state->Init_Ctrl[30].bit[0] = 0;
1091 state->Init_Ctrl[30].val[0] = 0;
1092 state->Init_Ctrl[30].addr[1] = 166;
1093 state->Init_Ctrl[30].bit[1] = 1;
1094 state->Init_Ctrl[30].val[1] = 1;
1095 state->Init_Ctrl[30].addr[2] = 166;
1096 state->Init_Ctrl[30].bit[2] = 2;
1097 state->Init_Ctrl[30].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001098
Steven Toth3935c252008-05-01 05:45:44 -03001099 state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ;
1100 state->Init_Ctrl[31].size = 3 ;
1101 state->Init_Ctrl[31].addr[0] = 166;
1102 state->Init_Ctrl[31].bit[0] = 3;
1103 state->Init_Ctrl[31].val[0] = 1;
1104 state->Init_Ctrl[31].addr[1] = 166;
1105 state->Init_Ctrl[31].bit[1] = 4;
1106 state->Init_Ctrl[31].val[1] = 0;
1107 state->Init_Ctrl[31].addr[2] = 166;
1108 state->Init_Ctrl[31].bit[2] = 5;
1109 state->Init_Ctrl[31].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001110
Steven Toth3935c252008-05-01 05:45:44 -03001111 state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ;
1112 state->Init_Ctrl[32].size = 3 ;
1113 state->Init_Ctrl[32].addr[0] = 167;
1114 state->Init_Ctrl[32].bit[0] = 0;
1115 state->Init_Ctrl[32].val[0] = 1;
1116 state->Init_Ctrl[32].addr[1] = 167;
1117 state->Init_Ctrl[32].bit[1] = 1;
1118 state->Init_Ctrl[32].val[1] = 1;
1119 state->Init_Ctrl[32].addr[2] = 167;
1120 state->Init_Ctrl[32].bit[2] = 2;
1121 state->Init_Ctrl[32].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001122
Steven Toth3935c252008-05-01 05:45:44 -03001123 state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ;
1124 state->Init_Ctrl[33].size = 4 ;
1125 state->Init_Ctrl[33].addr[0] = 168;
1126 state->Init_Ctrl[33].bit[0] = 0;
1127 state->Init_Ctrl[33].val[0] = 0;
1128 state->Init_Ctrl[33].addr[1] = 168;
1129 state->Init_Ctrl[33].bit[1] = 1;
1130 state->Init_Ctrl[33].val[1] = 1;
1131 state->Init_Ctrl[33].addr[2] = 168;
1132 state->Init_Ctrl[33].bit[2] = 2;
1133 state->Init_Ctrl[33].val[2] = 0;
1134 state->Init_Ctrl[33].addr[3] = 168;
1135 state->Init_Ctrl[33].bit[3] = 3;
1136 state->Init_Ctrl[33].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001137
Steven Toth3935c252008-05-01 05:45:44 -03001138 state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ;
1139 state->Init_Ctrl[34].size = 4 ;
1140 state->Init_Ctrl[34].addr[0] = 168;
1141 state->Init_Ctrl[34].bit[0] = 4;
1142 state->Init_Ctrl[34].val[0] = 1;
1143 state->Init_Ctrl[34].addr[1] = 168;
1144 state->Init_Ctrl[34].bit[1] = 5;
1145 state->Init_Ctrl[34].val[1] = 1;
1146 state->Init_Ctrl[34].addr[2] = 168;
1147 state->Init_Ctrl[34].bit[2] = 6;
1148 state->Init_Ctrl[34].val[2] = 1;
1149 state->Init_Ctrl[34].addr[3] = 168;
1150 state->Init_Ctrl[34].bit[3] = 7;
1151 state->Init_Ctrl[34].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001152
Steven Toth3935c252008-05-01 05:45:44 -03001153 state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ;
1154 state->Init_Ctrl[35].size = 1 ;
1155 state->Init_Ctrl[35].addr[0] = 135;
1156 state->Init_Ctrl[35].bit[0] = 0;
1157 state->Init_Ctrl[35].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001158
Steven Toth3935c252008-05-01 05:45:44 -03001159 state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ;
1160 state->Init_Ctrl[36].size = 1 ;
1161 state->Init_Ctrl[36].addr[0] = 56;
1162 state->Init_Ctrl[36].bit[0] = 3;
1163 state->Init_Ctrl[36].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001164
Steven Toth3935c252008-05-01 05:45:44 -03001165 state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ;
1166 state->Init_Ctrl[37].size = 7 ;
1167 state->Init_Ctrl[37].addr[0] = 59;
1168 state->Init_Ctrl[37].bit[0] = 1;
1169 state->Init_Ctrl[37].val[0] = 0;
1170 state->Init_Ctrl[37].addr[1] = 59;
1171 state->Init_Ctrl[37].bit[1] = 2;
1172 state->Init_Ctrl[37].val[1] = 0;
1173 state->Init_Ctrl[37].addr[2] = 59;
1174 state->Init_Ctrl[37].bit[2] = 3;
1175 state->Init_Ctrl[37].val[2] = 0;
1176 state->Init_Ctrl[37].addr[3] = 59;
1177 state->Init_Ctrl[37].bit[3] = 4;
1178 state->Init_Ctrl[37].val[3] = 0;
1179 state->Init_Ctrl[37].addr[4] = 59;
1180 state->Init_Ctrl[37].bit[4] = 5;
1181 state->Init_Ctrl[37].val[4] = 0;
1182 state->Init_Ctrl[37].addr[5] = 59;
1183 state->Init_Ctrl[37].bit[5] = 6;
1184 state->Init_Ctrl[37].val[5] = 0;
1185 state->Init_Ctrl[37].addr[6] = 59;
1186 state->Init_Ctrl[37].bit[6] = 7;
1187 state->Init_Ctrl[37].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001188
Steven Toth3935c252008-05-01 05:45:44 -03001189 state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ;
1190 state->Init_Ctrl[38].size = 6 ;
1191 state->Init_Ctrl[38].addr[0] = 32;
1192 state->Init_Ctrl[38].bit[0] = 2;
1193 state->Init_Ctrl[38].val[0] = 0;
1194 state->Init_Ctrl[38].addr[1] = 32;
1195 state->Init_Ctrl[38].bit[1] = 3;
1196 state->Init_Ctrl[38].val[1] = 0;
1197 state->Init_Ctrl[38].addr[2] = 32;
1198 state->Init_Ctrl[38].bit[2] = 4;
1199 state->Init_Ctrl[38].val[2] = 0;
1200 state->Init_Ctrl[38].addr[3] = 32;
1201 state->Init_Ctrl[38].bit[3] = 5;
1202 state->Init_Ctrl[38].val[3] = 0;
1203 state->Init_Ctrl[38].addr[4] = 32;
1204 state->Init_Ctrl[38].bit[4] = 6;
1205 state->Init_Ctrl[38].val[4] = 1;
1206 state->Init_Ctrl[38].addr[5] = 32;
1207 state->Init_Ctrl[38].bit[5] = 7;
1208 state->Init_Ctrl[38].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001209
Steven Toth3935c252008-05-01 05:45:44 -03001210 state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ;
1211 state->Init_Ctrl[39].size = 1 ;
1212 state->Init_Ctrl[39].addr[0] = 25;
1213 state->Init_Ctrl[39].bit[0] = 3;
1214 state->Init_Ctrl[39].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001215
1216
Steven Toth3935c252008-05-01 05:45:44 -03001217 state->CH_Ctrl_Num = CHCTRL_NUM ;
Steven Toth52c99bd2008-05-01 04:57:01 -03001218
Steven Toth3935c252008-05-01 05:45:44 -03001219 state->CH_Ctrl[0].Ctrl_Num = DN_POLY ;
1220 state->CH_Ctrl[0].size = 2 ;
1221 state->CH_Ctrl[0].addr[0] = 68;
1222 state->CH_Ctrl[0].bit[0] = 6;
1223 state->CH_Ctrl[0].val[0] = 1;
1224 state->CH_Ctrl[0].addr[1] = 68;
1225 state->CH_Ctrl[0].bit[1] = 7;
1226 state->CH_Ctrl[0].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001227
Steven Toth3935c252008-05-01 05:45:44 -03001228 state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ;
1229 state->CH_Ctrl[1].size = 2 ;
1230 state->CH_Ctrl[1].addr[0] = 70;
1231 state->CH_Ctrl[1].bit[0] = 6;
1232 state->CH_Ctrl[1].val[0] = 1;
1233 state->CH_Ctrl[1].addr[1] = 70;
1234 state->CH_Ctrl[1].bit[1] = 7;
1235 state->CH_Ctrl[1].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001236
Steven Toth3935c252008-05-01 05:45:44 -03001237 state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ;
1238 state->CH_Ctrl[2].size = 9 ;
1239 state->CH_Ctrl[2].addr[0] = 69;
1240 state->CH_Ctrl[2].bit[0] = 5;
1241 state->CH_Ctrl[2].val[0] = 0;
1242 state->CH_Ctrl[2].addr[1] = 69;
1243 state->CH_Ctrl[2].bit[1] = 6;
1244 state->CH_Ctrl[2].val[1] = 0;
1245 state->CH_Ctrl[2].addr[2] = 69;
1246 state->CH_Ctrl[2].bit[2] = 7;
1247 state->CH_Ctrl[2].val[2] = 0;
1248 state->CH_Ctrl[2].addr[3] = 68;
1249 state->CH_Ctrl[2].bit[3] = 0;
1250 state->CH_Ctrl[2].val[3] = 0;
1251 state->CH_Ctrl[2].addr[4] = 68;
1252 state->CH_Ctrl[2].bit[4] = 1;
1253 state->CH_Ctrl[2].val[4] = 0;
1254 state->CH_Ctrl[2].addr[5] = 68;
1255 state->CH_Ctrl[2].bit[5] = 2;
1256 state->CH_Ctrl[2].val[5] = 0;
1257 state->CH_Ctrl[2].addr[6] = 68;
1258 state->CH_Ctrl[2].bit[6] = 3;
1259 state->CH_Ctrl[2].val[6] = 0;
1260 state->CH_Ctrl[2].addr[7] = 68;
1261 state->CH_Ctrl[2].bit[7] = 4;
1262 state->CH_Ctrl[2].val[7] = 0;
1263 state->CH_Ctrl[2].addr[8] = 68;
1264 state->CH_Ctrl[2].bit[8] = 5;
1265 state->CH_Ctrl[2].val[8] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001266
Steven Toth3935c252008-05-01 05:45:44 -03001267 state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ;
1268 state->CH_Ctrl[3].size = 1 ;
1269 state->CH_Ctrl[3].addr[0] = 70;
1270 state->CH_Ctrl[3].bit[0] = 5;
1271 state->CH_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001272
Steven Toth3935c252008-05-01 05:45:44 -03001273 state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ;
1274 state->CH_Ctrl[4].size = 3 ;
1275 state->CH_Ctrl[4].addr[0] = 73;
1276 state->CH_Ctrl[4].bit[0] = 4;
1277 state->CH_Ctrl[4].val[0] = 0;
1278 state->CH_Ctrl[4].addr[1] = 73;
1279 state->CH_Ctrl[4].bit[1] = 5;
1280 state->CH_Ctrl[4].val[1] = 1;
1281 state->CH_Ctrl[4].addr[2] = 73;
1282 state->CH_Ctrl[4].bit[2] = 6;
1283 state->CH_Ctrl[4].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001284
Steven Toth3935c252008-05-01 05:45:44 -03001285 state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ;
1286 state->CH_Ctrl[5].size = 4 ;
1287 state->CH_Ctrl[5].addr[0] = 70;
1288 state->CH_Ctrl[5].bit[0] = 0;
1289 state->CH_Ctrl[5].val[0] = 0;
1290 state->CH_Ctrl[5].addr[1] = 70;
1291 state->CH_Ctrl[5].bit[1] = 1;
1292 state->CH_Ctrl[5].val[1] = 0;
1293 state->CH_Ctrl[5].addr[2] = 70;
1294 state->CH_Ctrl[5].bit[2] = 2;
1295 state->CH_Ctrl[5].val[2] = 0;
1296 state->CH_Ctrl[5].addr[3] = 70;
1297 state->CH_Ctrl[5].bit[3] = 3;
1298 state->CH_Ctrl[5].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001299
Steven Toth3935c252008-05-01 05:45:44 -03001300 state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ;
1301 state->CH_Ctrl[6].size = 1 ;
1302 state->CH_Ctrl[6].addr[0] = 70;
1303 state->CH_Ctrl[6].bit[0] = 4;
1304 state->CH_Ctrl[6].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001305
Steven Toth3935c252008-05-01 05:45:44 -03001306 state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ;
1307 state->CH_Ctrl[7].size = 1 ;
1308 state->CH_Ctrl[7].addr[0] = 111;
1309 state->CH_Ctrl[7].bit[0] = 4;
1310 state->CH_Ctrl[7].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001311
Steven Toth3935c252008-05-01 05:45:44 -03001312 state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ;
1313 state->CH_Ctrl[8].size = 1 ;
1314 state->CH_Ctrl[8].addr[0] = 111;
1315 state->CH_Ctrl[8].bit[0] = 7;
1316 state->CH_Ctrl[8].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001317
Steven Toth3935c252008-05-01 05:45:44 -03001318 state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ;
1319 state->CH_Ctrl[9].size = 1 ;
1320 state->CH_Ctrl[9].addr[0] = 111;
1321 state->CH_Ctrl[9].bit[0] = 6;
1322 state->CH_Ctrl[9].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001323
Steven Toth3935c252008-05-01 05:45:44 -03001324 state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ;
1325 state->CH_Ctrl[10].size = 1 ;
1326 state->CH_Ctrl[10].addr[0] = 111;
1327 state->CH_Ctrl[10].bit[0] = 5;
1328 state->CH_Ctrl[10].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001329
Steven Toth3935c252008-05-01 05:45:44 -03001330 state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ;
1331 state->CH_Ctrl[11].size = 2 ;
1332 state->CH_Ctrl[11].addr[0] = 110;
1333 state->CH_Ctrl[11].bit[0] = 0;
1334 state->CH_Ctrl[11].val[0] = 1;
1335 state->CH_Ctrl[11].addr[1] = 110;
1336 state->CH_Ctrl[11].bit[1] = 1;
1337 state->CH_Ctrl[11].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001338
Steven Toth3935c252008-05-01 05:45:44 -03001339 state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ;
1340 state->CH_Ctrl[12].size = 3 ;
1341 state->CH_Ctrl[12].addr[0] = 69;
1342 state->CH_Ctrl[12].bit[0] = 2;
1343 state->CH_Ctrl[12].val[0] = 0;
1344 state->CH_Ctrl[12].addr[1] = 69;
1345 state->CH_Ctrl[12].bit[1] = 3;
1346 state->CH_Ctrl[12].val[1] = 0;
1347 state->CH_Ctrl[12].addr[2] = 69;
1348 state->CH_Ctrl[12].bit[2] = 4;
1349 state->CH_Ctrl[12].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001350
Steven Toth3935c252008-05-01 05:45:44 -03001351 state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ;
1352 state->CH_Ctrl[13].size = 6 ;
1353 state->CH_Ctrl[13].addr[0] = 110;
1354 state->CH_Ctrl[13].bit[0] = 2;
1355 state->CH_Ctrl[13].val[0] = 0;
1356 state->CH_Ctrl[13].addr[1] = 110;
1357 state->CH_Ctrl[13].bit[1] = 3;
1358 state->CH_Ctrl[13].val[1] = 0;
1359 state->CH_Ctrl[13].addr[2] = 110;
1360 state->CH_Ctrl[13].bit[2] = 4;
1361 state->CH_Ctrl[13].val[2] = 0;
1362 state->CH_Ctrl[13].addr[3] = 110;
1363 state->CH_Ctrl[13].bit[3] = 5;
1364 state->CH_Ctrl[13].val[3] = 0;
1365 state->CH_Ctrl[13].addr[4] = 110;
1366 state->CH_Ctrl[13].bit[4] = 6;
1367 state->CH_Ctrl[13].val[4] = 0;
1368 state->CH_Ctrl[13].addr[5] = 110;
1369 state->CH_Ctrl[13].bit[5] = 7;
1370 state->CH_Ctrl[13].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001371
Steven Toth3935c252008-05-01 05:45:44 -03001372 state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ;
1373 state->CH_Ctrl[14].size = 7 ;
1374 state->CH_Ctrl[14].addr[0] = 14;
1375 state->CH_Ctrl[14].bit[0] = 0;
1376 state->CH_Ctrl[14].val[0] = 0;
1377 state->CH_Ctrl[14].addr[1] = 14;
1378 state->CH_Ctrl[14].bit[1] = 1;
1379 state->CH_Ctrl[14].val[1] = 0;
1380 state->CH_Ctrl[14].addr[2] = 14;
1381 state->CH_Ctrl[14].bit[2] = 2;
1382 state->CH_Ctrl[14].val[2] = 0;
1383 state->CH_Ctrl[14].addr[3] = 14;
1384 state->CH_Ctrl[14].bit[3] = 3;
1385 state->CH_Ctrl[14].val[3] = 0;
1386 state->CH_Ctrl[14].addr[4] = 14;
1387 state->CH_Ctrl[14].bit[4] = 4;
1388 state->CH_Ctrl[14].val[4] = 0;
1389 state->CH_Ctrl[14].addr[5] = 14;
1390 state->CH_Ctrl[14].bit[5] = 5;
1391 state->CH_Ctrl[14].val[5] = 0;
1392 state->CH_Ctrl[14].addr[6] = 14;
1393 state->CH_Ctrl[14].bit[6] = 6;
1394 state->CH_Ctrl[14].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001395
Steven Toth3935c252008-05-01 05:45:44 -03001396 state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ;
1397 state->CH_Ctrl[15].size = 18 ;
1398 state->CH_Ctrl[15].addr[0] = 17;
1399 state->CH_Ctrl[15].bit[0] = 6;
1400 state->CH_Ctrl[15].val[0] = 0;
1401 state->CH_Ctrl[15].addr[1] = 17;
1402 state->CH_Ctrl[15].bit[1] = 7;
1403 state->CH_Ctrl[15].val[1] = 0;
1404 state->CH_Ctrl[15].addr[2] = 16;
1405 state->CH_Ctrl[15].bit[2] = 0;
1406 state->CH_Ctrl[15].val[2] = 0;
1407 state->CH_Ctrl[15].addr[3] = 16;
1408 state->CH_Ctrl[15].bit[3] = 1;
1409 state->CH_Ctrl[15].val[3] = 0;
1410 state->CH_Ctrl[15].addr[4] = 16;
1411 state->CH_Ctrl[15].bit[4] = 2;
1412 state->CH_Ctrl[15].val[4] = 0;
1413 state->CH_Ctrl[15].addr[5] = 16;
1414 state->CH_Ctrl[15].bit[5] = 3;
1415 state->CH_Ctrl[15].val[5] = 0;
1416 state->CH_Ctrl[15].addr[6] = 16;
1417 state->CH_Ctrl[15].bit[6] = 4;
1418 state->CH_Ctrl[15].val[6] = 0;
1419 state->CH_Ctrl[15].addr[7] = 16;
1420 state->CH_Ctrl[15].bit[7] = 5;
1421 state->CH_Ctrl[15].val[7] = 0;
1422 state->CH_Ctrl[15].addr[8] = 16;
1423 state->CH_Ctrl[15].bit[8] = 6;
1424 state->CH_Ctrl[15].val[8] = 0;
1425 state->CH_Ctrl[15].addr[9] = 16;
1426 state->CH_Ctrl[15].bit[9] = 7;
1427 state->CH_Ctrl[15].val[9] = 0;
1428 state->CH_Ctrl[15].addr[10] = 15;
1429 state->CH_Ctrl[15].bit[10] = 0;
1430 state->CH_Ctrl[15].val[10] = 0;
1431 state->CH_Ctrl[15].addr[11] = 15;
1432 state->CH_Ctrl[15].bit[11] = 1;
1433 state->CH_Ctrl[15].val[11] = 0;
1434 state->CH_Ctrl[15].addr[12] = 15;
1435 state->CH_Ctrl[15].bit[12] = 2;
1436 state->CH_Ctrl[15].val[12] = 0;
1437 state->CH_Ctrl[15].addr[13] = 15;
1438 state->CH_Ctrl[15].bit[13] = 3;
1439 state->CH_Ctrl[15].val[13] = 0;
1440 state->CH_Ctrl[15].addr[14] = 15;
1441 state->CH_Ctrl[15].bit[14] = 4;
1442 state->CH_Ctrl[15].val[14] = 0;
1443 state->CH_Ctrl[15].addr[15] = 15;
1444 state->CH_Ctrl[15].bit[15] = 5;
1445 state->CH_Ctrl[15].val[15] = 0;
1446 state->CH_Ctrl[15].addr[16] = 15;
1447 state->CH_Ctrl[15].bit[16] = 6;
1448 state->CH_Ctrl[15].val[16] = 1;
1449 state->CH_Ctrl[15].addr[17] = 15;
1450 state->CH_Ctrl[15].bit[17] = 7;
1451 state->CH_Ctrl[15].val[17] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001452
Steven Toth3935c252008-05-01 05:45:44 -03001453 state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ;
1454 state->CH_Ctrl[16].size = 5 ;
1455 state->CH_Ctrl[16].addr[0] = 112;
1456 state->CH_Ctrl[16].bit[0] = 0;
1457 state->CH_Ctrl[16].val[0] = 0;
1458 state->CH_Ctrl[16].addr[1] = 112;
1459 state->CH_Ctrl[16].bit[1] = 1;
1460 state->CH_Ctrl[16].val[1] = 0;
1461 state->CH_Ctrl[16].addr[2] = 112;
1462 state->CH_Ctrl[16].bit[2] = 2;
1463 state->CH_Ctrl[16].val[2] = 0;
1464 state->CH_Ctrl[16].addr[3] = 112;
1465 state->CH_Ctrl[16].bit[3] = 3;
1466 state->CH_Ctrl[16].val[3] = 0;
1467 state->CH_Ctrl[16].addr[4] = 112;
1468 state->CH_Ctrl[16].bit[4] = 4;
1469 state->CH_Ctrl[16].val[4] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001470
Steven Toth3935c252008-05-01 05:45:44 -03001471 state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ;
1472 state->CH_Ctrl[17].size = 1 ;
1473 state->CH_Ctrl[17].addr[0] = 14;
1474 state->CH_Ctrl[17].bit[0] = 7;
1475 state->CH_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001476
Steven Toth3935c252008-05-01 05:45:44 -03001477 state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ;
1478 state->CH_Ctrl[18].size = 4 ;
1479 state->CH_Ctrl[18].addr[0] = 107;
1480 state->CH_Ctrl[18].bit[0] = 3;
1481 state->CH_Ctrl[18].val[0] = 0;
1482 state->CH_Ctrl[18].addr[1] = 107;
1483 state->CH_Ctrl[18].bit[1] = 4;
1484 state->CH_Ctrl[18].val[1] = 0;
1485 state->CH_Ctrl[18].addr[2] = 107;
1486 state->CH_Ctrl[18].bit[2] = 5;
1487 state->CH_Ctrl[18].val[2] = 0;
1488 state->CH_Ctrl[18].addr[3] = 107;
1489 state->CH_Ctrl[18].bit[3] = 6;
1490 state->CH_Ctrl[18].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001491
Steven Toth3935c252008-05-01 05:45:44 -03001492 state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ;
1493 state->CH_Ctrl[19].size = 3 ;
1494 state->CH_Ctrl[19].addr[0] = 107;
1495 state->CH_Ctrl[19].bit[0] = 7;
1496 state->CH_Ctrl[19].val[0] = 1;
1497 state->CH_Ctrl[19].addr[1] = 106;
1498 state->CH_Ctrl[19].bit[1] = 0;
1499 state->CH_Ctrl[19].val[1] = 1;
1500 state->CH_Ctrl[19].addr[2] = 106;
1501 state->CH_Ctrl[19].bit[2] = 1;
1502 state->CH_Ctrl[19].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001503
Steven Toth3935c252008-05-01 05:45:44 -03001504 state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ;
1505 state->CH_Ctrl[20].size = 11 ;
1506 state->CH_Ctrl[20].addr[0] = 109;
1507 state->CH_Ctrl[20].bit[0] = 2;
1508 state->CH_Ctrl[20].val[0] = 0;
1509 state->CH_Ctrl[20].addr[1] = 109;
1510 state->CH_Ctrl[20].bit[1] = 3;
1511 state->CH_Ctrl[20].val[1] = 0;
1512 state->CH_Ctrl[20].addr[2] = 109;
1513 state->CH_Ctrl[20].bit[2] = 4;
1514 state->CH_Ctrl[20].val[2] = 0;
1515 state->CH_Ctrl[20].addr[3] = 109;
1516 state->CH_Ctrl[20].bit[3] = 5;
1517 state->CH_Ctrl[20].val[3] = 0;
1518 state->CH_Ctrl[20].addr[4] = 109;
1519 state->CH_Ctrl[20].bit[4] = 6;
1520 state->CH_Ctrl[20].val[4] = 0;
1521 state->CH_Ctrl[20].addr[5] = 109;
1522 state->CH_Ctrl[20].bit[5] = 7;
1523 state->CH_Ctrl[20].val[5] = 0;
1524 state->CH_Ctrl[20].addr[6] = 108;
1525 state->CH_Ctrl[20].bit[6] = 0;
1526 state->CH_Ctrl[20].val[6] = 0;
1527 state->CH_Ctrl[20].addr[7] = 108;
1528 state->CH_Ctrl[20].bit[7] = 1;
1529 state->CH_Ctrl[20].val[7] = 0;
1530 state->CH_Ctrl[20].addr[8] = 108;
1531 state->CH_Ctrl[20].bit[8] = 2;
1532 state->CH_Ctrl[20].val[8] = 1;
1533 state->CH_Ctrl[20].addr[9] = 108;
1534 state->CH_Ctrl[20].bit[9] = 3;
1535 state->CH_Ctrl[20].val[9] = 1;
1536 state->CH_Ctrl[20].addr[10] = 108;
1537 state->CH_Ctrl[20].bit[10] = 4;
1538 state->CH_Ctrl[20].val[10] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001539
Steven Toth3935c252008-05-01 05:45:44 -03001540 state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ;
1541 state->CH_Ctrl[21].size = 6 ;
1542 state->CH_Ctrl[21].addr[0] = 106;
1543 state->CH_Ctrl[21].bit[0] = 2;
1544 state->CH_Ctrl[21].val[0] = 0;
1545 state->CH_Ctrl[21].addr[1] = 106;
1546 state->CH_Ctrl[21].bit[1] = 3;
1547 state->CH_Ctrl[21].val[1] = 0;
1548 state->CH_Ctrl[21].addr[2] = 106;
1549 state->CH_Ctrl[21].bit[2] = 4;
1550 state->CH_Ctrl[21].val[2] = 0;
1551 state->CH_Ctrl[21].addr[3] = 106;
1552 state->CH_Ctrl[21].bit[3] = 5;
1553 state->CH_Ctrl[21].val[3] = 0;
1554 state->CH_Ctrl[21].addr[4] = 106;
1555 state->CH_Ctrl[21].bit[4] = 6;
1556 state->CH_Ctrl[21].val[4] = 0;
1557 state->CH_Ctrl[21].addr[5] = 106;
1558 state->CH_Ctrl[21].bit[5] = 7;
1559 state->CH_Ctrl[21].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001560
Steven Toth3935c252008-05-01 05:45:44 -03001561 state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ;
1562 state->CH_Ctrl[22].size = 1 ;
1563 state->CH_Ctrl[22].addr[0] = 138;
1564 state->CH_Ctrl[22].bit[0] = 4;
1565 state->CH_Ctrl[22].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001566
Steven Toth3935c252008-05-01 05:45:44 -03001567 state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ;
1568 state->CH_Ctrl[23].size = 1 ;
1569 state->CH_Ctrl[23].addr[0] = 17;
1570 state->CH_Ctrl[23].bit[0] = 5;
1571 state->CH_Ctrl[23].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001572
Steven Toth3935c252008-05-01 05:45:44 -03001573 state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ;
1574 state->CH_Ctrl[24].size = 1 ;
1575 state->CH_Ctrl[24].addr[0] = 111;
1576 state->CH_Ctrl[24].bit[0] = 3;
1577 state->CH_Ctrl[24].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001578
Steven Toth3935c252008-05-01 05:45:44 -03001579 state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ;
1580 state->CH_Ctrl[25].size = 1 ;
1581 state->CH_Ctrl[25].addr[0] = 112;
1582 state->CH_Ctrl[25].bit[0] = 7;
1583 state->CH_Ctrl[25].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001584
Steven Toth3935c252008-05-01 05:45:44 -03001585 state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ;
1586 state->CH_Ctrl[26].size = 1 ;
1587 state->CH_Ctrl[26].addr[0] = 136;
1588 state->CH_Ctrl[26].bit[0] = 7;
1589 state->CH_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001590
Steven Toth3935c252008-05-01 05:45:44 -03001591 state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ;
1592 state->CH_Ctrl[27].size = 1 ;
1593 state->CH_Ctrl[27].addr[0] = 149;
1594 state->CH_Ctrl[27].bit[0] = 7;
1595 state->CH_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001596
Steven Toth3935c252008-05-01 05:45:44 -03001597 state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ;
1598 state->CH_Ctrl[28].size = 1 ;
1599 state->CH_Ctrl[28].addr[0] = 149;
1600 state->CH_Ctrl[28].bit[0] = 6;
1601 state->CH_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001602
Steven Toth3935c252008-05-01 05:45:44 -03001603 state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ;
1604 state->CH_Ctrl[29].size = 1 ;
1605 state->CH_Ctrl[29].addr[0] = 149;
1606 state->CH_Ctrl[29].bit[0] = 5;
1607 state->CH_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001608
Steven Toth3935c252008-05-01 05:45:44 -03001609 state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ;
1610 state->CH_Ctrl[30].size = 1 ;
1611 state->CH_Ctrl[30].addr[0] = 149;
1612 state->CH_Ctrl[30].bit[0] = 4;
1613 state->CH_Ctrl[30].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001614
Steven Toth3935c252008-05-01 05:45:44 -03001615 state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ;
1616 state->CH_Ctrl[31].size = 1 ;
1617 state->CH_Ctrl[31].addr[0] = 149;
1618 state->CH_Ctrl[31].bit[0] = 3;
1619 state->CH_Ctrl[31].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001620
Steven Toth3935c252008-05-01 05:45:44 -03001621 state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ;
1622 state->CH_Ctrl[32].size = 1 ;
1623 state->CH_Ctrl[32].addr[0] = 93;
1624 state->CH_Ctrl[32].bit[0] = 1;
1625 state->CH_Ctrl[32].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001626
Steven Toth3935c252008-05-01 05:45:44 -03001627 state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ;
1628 state->CH_Ctrl[33].size = 1 ;
1629 state->CH_Ctrl[33].addr[0] = 93;
1630 state->CH_Ctrl[33].bit[0] = 0;
1631 state->CH_Ctrl[33].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001632
Steven Toth3935c252008-05-01 05:45:44 -03001633 state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ;
1634 state->CH_Ctrl[34].size = 6 ;
1635 state->CH_Ctrl[34].addr[0] = 92;
1636 state->CH_Ctrl[34].bit[0] = 2;
1637 state->CH_Ctrl[34].val[0] = 0;
1638 state->CH_Ctrl[34].addr[1] = 92;
1639 state->CH_Ctrl[34].bit[1] = 3;
1640 state->CH_Ctrl[34].val[1] = 0;
1641 state->CH_Ctrl[34].addr[2] = 92;
1642 state->CH_Ctrl[34].bit[2] = 4;
1643 state->CH_Ctrl[34].val[2] = 0;
1644 state->CH_Ctrl[34].addr[3] = 92;
1645 state->CH_Ctrl[34].bit[3] = 5;
1646 state->CH_Ctrl[34].val[3] = 0;
1647 state->CH_Ctrl[34].addr[4] = 92;
1648 state->CH_Ctrl[34].bit[4] = 6;
1649 state->CH_Ctrl[34].val[4] = 0;
1650 state->CH_Ctrl[34].addr[5] = 92;
1651 state->CH_Ctrl[34].bit[5] = 7;
1652 state->CH_Ctrl[34].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001653
Steven Toth3935c252008-05-01 05:45:44 -03001654 state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ;
1655 state->CH_Ctrl[35].size = 6 ;
1656 state->CH_Ctrl[35].addr[0] = 93;
1657 state->CH_Ctrl[35].bit[0] = 2;
1658 state->CH_Ctrl[35].val[0] = 0;
1659 state->CH_Ctrl[35].addr[1] = 93;
1660 state->CH_Ctrl[35].bit[1] = 3;
1661 state->CH_Ctrl[35].val[1] = 0;
1662 state->CH_Ctrl[35].addr[2] = 93;
1663 state->CH_Ctrl[35].bit[2] = 4;
1664 state->CH_Ctrl[35].val[2] = 0;
1665 state->CH_Ctrl[35].addr[3] = 93;
1666 state->CH_Ctrl[35].bit[3] = 5;
1667 state->CH_Ctrl[35].val[3] = 0;
1668 state->CH_Ctrl[35].addr[4] = 93;
1669 state->CH_Ctrl[35].bit[4] = 6;
1670 state->CH_Ctrl[35].val[4] = 0;
1671 state->CH_Ctrl[35].addr[5] = 93;
1672 state->CH_Ctrl[35].bit[5] = 7;
1673 state->CH_Ctrl[35].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001674
1675#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03001676 state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ;
1677 state->CH_Ctrl[36].size = 1 ;
1678 state->CH_Ctrl[36].addr[0] = 109;
1679 state->CH_Ctrl[36].bit[0] = 1;
1680 state->CH_Ctrl[36].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001681
Steven Toth3935c252008-05-01 05:45:44 -03001682 state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ;
1683 state->CH_Ctrl[37].size = 2 ;
1684 state->CH_Ctrl[37].addr[0] = 112;
1685 state->CH_Ctrl[37].bit[0] = 5;
1686 state->CH_Ctrl[37].val[0] = 0;
1687 state->CH_Ctrl[37].addr[1] = 112;
1688 state->CH_Ctrl[37].bit[1] = 6;
1689 state->CH_Ctrl[37].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001690
Steven Toth3935c252008-05-01 05:45:44 -03001691 state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ;
1692 state->CH_Ctrl[38].size = 1 ;
1693 state->CH_Ctrl[38].addr[0] = 65;
1694 state->CH_Ctrl[38].bit[0] = 1;
1695 state->CH_Ctrl[38].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001696#endif
1697
1698 return 0 ;
1699}
1700
Steven Toth52c99bd2008-05-01 04:57:01 -03001701// MaxLinear source code - MXL5005_c.cpp
Steven Toth52c99bd2008-05-01 04:57:01 -03001702// MXL5005.cpp : Defines the initialization routines for the DLL.
1703// 2.6.12
Steven Toth3935c252008-05-01 05:45:44 -03001704// DONE
1705void InitTunerControls(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001706{
Steven Toth3935c252008-05-01 05:45:44 -03001707 MXL5005_RegisterInit(fe);
1708 MXL5005_ControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001709#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03001710 MXL5005_MXLControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001711#endif
1712}
1713
Steven Toth52c99bd2008-05-01 04:57:01 -03001714///////////////////////////////////////////////////////////////////////////////
1715// //
1716// Function: MXL_ConfigTuner //
1717// //
1718// Description: Configure MXL5005Tuner structure for desired //
1719// Channel Bandwidth/Channel Frequency //
1720// //
1721// //
1722// Functions used: //
Steven Totha8214d42008-05-01 05:02:58 -03001723// MXL_SynthIFLO_Calc //
Steven Toth52c99bd2008-05-01 04:57:01 -03001724// //
1725// Inputs: //
1726// Tuner_struct: structure defined at higher level //
1727// Mode: Tuner Mode (Analog/Digital) //
1728// IF_Mode: IF Mode ( Zero/Low ) //
Steven Toth3935c252008-05-01 05:45:44 -03001729// Bandwidth: Filter Channel Bandwidth (in Hz) //
Steven Toth52c99bd2008-05-01 04:57:01 -03001730// IF_out: Desired IF out Frequency (in Hz) //
1731// Fxtal: Crystal Frerquency (in Hz) //
Steven Toth3935c252008-05-01 05:45:44 -03001732// TOP: 0: Dual AGC; Value: take over point //
1733// IF_OUT_LOAD: IF out load resistor (200/300 Ohms) //
1734// CLOCK_OUT: 0: Turn off clock out; 1: turn on clock out //
1735// DIV_OUT: 0: Div-1; 1: Div-4 //
1736// CAPSELECT: 0: Disable On-chip pulling cap; 1: Enable //
1737// EN_RSSI: 0: Disable RSSI; 1: Enable RSSI //
Steven Toth52c99bd2008-05-01 04:57:01 -03001738// //
1739// Outputs: //
1740// Tuner //
1741// //
1742// Return: //
1743// 0 : Successful //
1744// > 0 : Failed //
1745// //
1746///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03001747// DONE
1748u16 MXL5005_TunerConfig(struct dvb_frontend *fe,
1749 u8 Mode, /* 0: Analog Mode ; 1: Digital Mode */
1750 u8 IF_mode, /* for Analog Mode, 0: zero IF; 1: low IF */
1751 u32 Bandwidth, /* filter channel bandwidth (6, 7, 8) */
1752 u32 IF_out, /* Desired IF Out Frequency */
1753 u32 Fxtal, /* XTAL Frequency */
1754 u8 AGC_Mode, /* AGC Mode - Dual AGC: 0, Single AGC: 1 */
1755 u16 TOP, /* 0: Dual AGC; Value: take over point */
1756 u16 IF_OUT_LOAD, /* IF Out Load Resistor (200 / 300 Ohms) */
1757 u8 CLOCK_OUT, /* 0: turn off clock out; 1: turn on clock out */
1758 u8 DIV_OUT, /* 0: Div-1; 1: Div-4 */
1759 u8 CAPSELECT, /* 0: disable On-Chip pulling cap; 1: enable */
1760 u8 EN_RSSI, /* 0: disable RSSI; 1: enable RSSI */
1761 u8 Mod_Type, /* Modulation Type; */
1762 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
1763 u8 TF_Type /* Tracking Filter */
1764 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
Steven Toth52c99bd2008-05-01 04:57:01 -03001765 )
1766{
Steven Toth85d220d2008-05-01 05:48:14 -03001767 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001768 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001769
Steven Toth3935c252008-05-01 05:45:44 -03001770 state->Mode = Mode;
1771 state->IF_Mode = IF_mode;
1772 state->Chan_Bandwidth = Bandwidth;
1773 state->IF_OUT = IF_out;
1774 state->Fxtal = Fxtal;
1775 state->AGC_Mode = AGC_Mode;
1776 state->TOP = TOP;
1777 state->IF_OUT_LOAD = IF_OUT_LOAD;
1778 state->CLOCK_OUT = CLOCK_OUT;
1779 state->DIV_OUT = DIV_OUT;
1780 state->CAPSELECT = CAPSELECT;
1781 state->EN_RSSI = EN_RSSI;
1782 state->Mod_Type = Mod_Type;
1783 state->TF_Type = TF_Type;
Steven Toth52c99bd2008-05-01 04:57:01 -03001784
Steven Totha8214d42008-05-01 05:02:58 -03001785 /* Initialize all the controls and registers */
Steven Toth3935c252008-05-01 05:45:44 -03001786 InitTunerControls(fe);
Steven Totha8214d42008-05-01 05:02:58 -03001787
1788 /* Synthesizer LO frequency calculation */
Steven Toth3935c252008-05-01 05:45:44 -03001789 MXL_SynthIFLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001790
Steven Toth3935c252008-05-01 05:45:44 -03001791 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001792}
1793
1794///////////////////////////////////////////////////////////////////////////////
1795// //
1796// Function: MXL_SynthIFLO_Calc //
1797// //
1798// Description: Calculate Internal IF-LO Frequency //
1799// //
1800// Globals: //
1801// NONE //
1802// //
1803// Functions used: //
1804// NONE //
1805// //
1806// Inputs: //
1807// Tuner_struct: structure defined at higher level //
1808// //
1809// Outputs: //
1810// Tuner //
1811// //
1812// Return: //
1813// 0 : Successful //
1814// > 0 : Failed //
1815// //
1816///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03001817// DONE
1818void MXL_SynthIFLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001819{
Steven Toth85d220d2008-05-01 05:48:14 -03001820 struct mxl5005s_state *state = fe->tuner_priv;
1821 if (state->Mode == 1) /* Digital Mode */
Steven Toth3935c252008-05-01 05:45:44 -03001822 state->IF_LO = state->IF_OUT;
1823 else /* Analog Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03001824 {
Steven Toth3935c252008-05-01 05:45:44 -03001825 if(state->IF_Mode == 0) /* Analog Zero IF mode */
1826 state->IF_LO = state->IF_OUT + 400000;
1827 else /* Analog Low IF mode */
1828 state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2;
Steven Toth52c99bd2008-05-01 04:57:01 -03001829 }
1830}
1831
1832///////////////////////////////////////////////////////////////////////////////
1833// //
1834// Function: MXL_SynthRFTGLO_Calc //
1835// //
1836// Description: Calculate Internal RF-LO frequency and //
1837// internal Tone-Gen(TG)-LO frequency //
1838// //
1839// Globals: //
1840// NONE //
1841// //
1842// Functions used: //
1843// NONE //
1844// //
1845// Inputs: //
1846// Tuner_struct: structure defined at higher level //
1847// //
1848// Outputs: //
1849// Tuner //
1850// //
1851// Return: //
1852// 0 : Successful //
1853// > 0 : Failed //
1854// //
1855///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03001856// DONE
1857void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001858{
Steven Toth85d220d2008-05-01 05:48:14 -03001859 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001860
1861 if (state->Mode == 1) /* Digital Mode */ {
Steven Toth52c99bd2008-05-01 04:57:01 -03001862 //remove 20.48MHz setting for 2.6.10
Steven Toth3935c252008-05-01 05:45:44 -03001863 state->RF_LO = state->RF_IN;
1864 state->TG_LO = state->RF_IN - 750000; //change for 2.6.6
1865 } else /* Analog Mode */ {
1866 if(state->IF_Mode == 0) /* Analog Zero IF mode */ {
1867 state->RF_LO = state->RF_IN - 400000;
1868 state->TG_LO = state->RF_IN - 1750000;
1869 } else /* Analog Low IF mode */ {
1870 state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2;
1871 state->TG_LO = state->RF_IN - state->Chan_Bandwidth + 500000;
Steven Toth52c99bd2008-05-01 04:57:01 -03001872 }
1873 }
1874}
1875
1876///////////////////////////////////////////////////////////////////////////////
1877// //
1878// Function: MXL_OverwriteICDefault //
1879// //
1880// Description: Overwrite the Default Register Setting //
1881// //
1882// //
1883// Functions used: //
1884// //
1885// Inputs: //
1886// Tuner_struct: structure defined at higher level //
1887// Outputs: //
1888// Tuner //
1889// //
1890// Return: //
1891// 0 : Successful //
1892// > 0 : Failed //
1893// //
1894///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03001895// DONE
1896u16 MXL_OverwriteICDefault(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001897{
Steven Toth3935c252008-05-01 05:45:44 -03001898 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001899
Steven Toth3935c252008-05-01 05:45:44 -03001900 status += MXL_ControlWrite(fe, OVERRIDE_1, 1);
1901 status += MXL_ControlWrite(fe, OVERRIDE_2, 1);
1902 status += MXL_ControlWrite(fe, OVERRIDE_3, 1);
1903 status += MXL_ControlWrite(fe, OVERRIDE_4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001904
Steven Toth3935c252008-05-01 05:45:44 -03001905 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001906}
1907
1908///////////////////////////////////////////////////////////////////////////////
1909// //
1910// Function: MXL_BlockInit //
1911// //
1912// Description: Tuner Initialization as a function of 'User Settings' //
1913// * User settings in Tuner strcuture must be assigned //
1914// first //
1915// //
1916// Globals: //
1917// NONE //
1918// //
1919// Functions used: //
1920// Tuner_struct: structure defined at higher level //
1921// //
1922// Inputs: //
1923// Tuner : Tuner structure defined at higher level //
1924// //
1925// Outputs: //
1926// Tuner //
1927// //
1928// Return: //
1929// 0 : Successful //
1930// > 0 : Failed //
1931// //
1932///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03001933// DONE
1934u16 MXL_BlockInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001935{
Steven Toth85d220d2008-05-01 05:48:14 -03001936 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001937 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001938
Steven Toth3935c252008-05-01 05:45:44 -03001939 status += MXL_OverwriteICDefault(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001940
Steven Toth3935c252008-05-01 05:45:44 -03001941 /* Downconverter Control Dig Ana */
1942 status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001943
Steven Toth3935c252008-05-01 05:45:44 -03001944 /* Filter Control Dig Ana */
1945 status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1);
1946 status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2);
1947 status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0);
1948 status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1);
1949 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001950
Steven Toth3935c252008-05-01 05:45:44 -03001951 /* Initialize Low-Pass Filter */
1952 if (state->Mode) { /* Digital Mode */
1953 switch (state->Chan_Bandwidth) {
Steven Toth52c99bd2008-05-01 04:57:01 -03001954 case 8000000:
Steven Toth3935c252008-05-01 05:45:44 -03001955 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0);
1956 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001957 case 7000000:
Steven Toth3935c252008-05-01 05:45:44 -03001958 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2);
1959 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001960 case 6000000:
Steven Toth8c66a192008-05-01 06:35:48 -03001961 printk("%s() doing 6MHz digital\n", __func__);
Steven Toth3935c252008-05-01 05:45:44 -03001962 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 3);
1963 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001964 }
Steven Toth3935c252008-05-01 05:45:44 -03001965 } else { /* Analog Mode */
1966 switch (state->Chan_Bandwidth) {
1967 case 8000000: /* Low Zero */
1968 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 0 : 3));
1969 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001970 case 7000000:
Steven Toth3935c252008-05-01 05:45:44 -03001971 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 1 : 4));
1972 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001973 case 6000000:
Steven Toth3935c252008-05-01 05:45:44 -03001974 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 2 : 5));
1975 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001976 }
1977 }
1978
Steven Toth3935c252008-05-01 05:45:44 -03001979 /* Charge Pump Control Dig Ana */
1980 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8);
1981 status += MXL_ControlWrite(fe, RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1);
1982 status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001983
Steven Toth3935c252008-05-01 05:45:44 -03001984 /* AGC TOP Control */
1985 if (state->AGC_Mode == 0) /* Dual AGC */ {
1986 status += MXL_ControlWrite(fe, AGC_IF, 15);
1987 status += MXL_ControlWrite(fe, AGC_RF, 15);
Steven Toth52c99bd2008-05-01 04:57:01 -03001988 }
Steven Toth3935c252008-05-01 05:45:44 -03001989 else /* Single AGC Mode Dig Ana */
1990 status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03001991
Steven Toth3935c252008-05-01 05:45:44 -03001992 if (state->TOP == 55) /* TOP == 5.5 */
1993 status += MXL_ControlWrite(fe, AGC_IF, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001994
Steven Toth3935c252008-05-01 05:45:44 -03001995 if (state->TOP == 72) /* TOP == 7.2 */
1996 status += MXL_ControlWrite(fe, AGC_IF, 0x1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001997
Steven Toth3935c252008-05-01 05:45:44 -03001998 if (state->TOP == 92) /* TOP == 9.2 */
1999 status += MXL_ControlWrite(fe, AGC_IF, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002000
Steven Toth3935c252008-05-01 05:45:44 -03002001 if (state->TOP == 110) /* TOP == 11.0 */
2002 status += MXL_ControlWrite(fe, AGC_IF, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002003
Steven Toth3935c252008-05-01 05:45:44 -03002004 if (state->TOP == 129) /* TOP == 12.9 */
2005 status += MXL_ControlWrite(fe, AGC_IF, 0x4);
Steven Toth52c99bd2008-05-01 04:57:01 -03002006
Steven Toth3935c252008-05-01 05:45:44 -03002007 if (state->TOP == 147) /* TOP == 14.7 */
2008 status += MXL_ControlWrite(fe, AGC_IF, 0x5);
Steven Toth52c99bd2008-05-01 04:57:01 -03002009
Steven Toth3935c252008-05-01 05:45:44 -03002010 if (state->TOP == 168) /* TOP == 16.8 */
2011 status += MXL_ControlWrite(fe, AGC_IF, 0x6);
Steven Toth52c99bd2008-05-01 04:57:01 -03002012
Steven Toth3935c252008-05-01 05:45:44 -03002013 if (state->TOP == 194) /* TOP == 19.4 */
2014 status += MXL_ControlWrite(fe, AGC_IF, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03002015
Steven Toth3935c252008-05-01 05:45:44 -03002016 if (state->TOP == 212) /* TOP == 21.2 */
2017 status += MXL_ControlWrite(fe, AGC_IF, 0x9);
Steven Toth52c99bd2008-05-01 04:57:01 -03002018
Steven Toth3935c252008-05-01 05:45:44 -03002019 if (state->TOP == 232) /* TOP == 23.2 */
2020 status += MXL_ControlWrite(fe, AGC_IF, 0xA);
Steven Toth52c99bd2008-05-01 04:57:01 -03002021
Steven Toth3935c252008-05-01 05:45:44 -03002022 if (state->TOP == 252) /* TOP == 25.2 */
2023 status += MXL_ControlWrite(fe, AGC_IF, 0xB);
Steven Toth52c99bd2008-05-01 04:57:01 -03002024
Steven Toth3935c252008-05-01 05:45:44 -03002025 if (state->TOP == 271) /* TOP == 27.1 */
2026 status += MXL_ControlWrite(fe, AGC_IF, 0xC);
Steven Toth52c99bd2008-05-01 04:57:01 -03002027
Steven Toth3935c252008-05-01 05:45:44 -03002028 if (state->TOP == 292) /* TOP == 29.2 */
2029 status += MXL_ControlWrite(fe, AGC_IF, 0xD);
Steven Toth52c99bd2008-05-01 04:57:01 -03002030
Steven Toth3935c252008-05-01 05:45:44 -03002031 if (state->TOP == 317) /* TOP == 31.7 */
2032 status += MXL_ControlWrite(fe, AGC_IF, 0xE);
Steven Toth52c99bd2008-05-01 04:57:01 -03002033
Steven Toth3935c252008-05-01 05:45:44 -03002034 if (state->TOP == 349) /* TOP == 34.9 */
2035 status += MXL_ControlWrite(fe, AGC_IF, 0xF);
Steven Toth52c99bd2008-05-01 04:57:01 -03002036
Steven Toth3935c252008-05-01 05:45:44 -03002037 /* IF Synthesizer Control */
2038 status += MXL_IFSynthInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002039
Steven Toth3935c252008-05-01 05:45:44 -03002040 /* IF UpConverter Control */
2041 if (state->IF_OUT_LOAD == 200) {
2042 status += MXL_ControlWrite(fe, DRV_RES_SEL, 6);
2043 status += MXL_ControlWrite(fe, I_DRIVER, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002044 }
Steven Toth3935c252008-05-01 05:45:44 -03002045 if (state->IF_OUT_LOAD == 300) {
2046 status += MXL_ControlWrite(fe, DRV_RES_SEL, 4);
2047 status += MXL_ControlWrite(fe, I_DRIVER, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002048 }
2049
Steven Toth3935c252008-05-01 05:45:44 -03002050 /* Anti-Alias Filtering Control
2051 * initialise Anti-Aliasing Filter
2052 */
2053 if (state->Mode) { /* Digital Mode */
2054 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) {
2055 status += MXL_ControlWrite(fe, EN_AAF, 1);
2056 status += MXL_ControlWrite(fe, EN_3P, 1);
2057 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2058 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002059 }
Steven Toth3935c252008-05-01 05:45:44 -03002060 if ((state->IF_OUT == 36125000UL) || (state->IF_OUT == 36150000UL)) {
2061 status += MXL_ControlWrite(fe, EN_AAF, 1);
2062 status += MXL_ControlWrite(fe, EN_3P, 1);
2063 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2064 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002065 }
Steven Toth3935c252008-05-01 05:45:44 -03002066 if (state->IF_OUT > 36150000UL) {
2067 status += MXL_ControlWrite(fe, EN_AAF, 0);
2068 status += MXL_ControlWrite(fe, EN_3P, 1);
2069 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2070 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002071 }
Steven Toth3935c252008-05-01 05:45:44 -03002072 } else { /* Analog Mode */
2073 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002074 {
Steven Toth3935c252008-05-01 05:45:44 -03002075 status += MXL_ControlWrite(fe, EN_AAF, 1);
2076 status += MXL_ControlWrite(fe, EN_3P, 1);
2077 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2078 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002079 }
Steven Toth3935c252008-05-01 05:45:44 -03002080 if (state->IF_OUT > 5000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002081 {
Steven Toth3935c252008-05-01 05:45:44 -03002082 status += MXL_ControlWrite(fe, EN_AAF, 0);
2083 status += MXL_ControlWrite(fe, EN_3P, 0);
2084 status += MXL_ControlWrite(fe, EN_AUX_3P, 0);
2085 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002086 }
2087 }
2088
Steven Toth3935c252008-05-01 05:45:44 -03002089 /* Demod Clock Out */
2090 if (state->CLOCK_OUT)
2091 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002092 else
Steven Toth3935c252008-05-01 05:45:44 -03002093 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002094
Steven Toth3935c252008-05-01 05:45:44 -03002095 if (state->DIV_OUT == 1)
2096 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1);
2097 if (state->DIV_OUT == 0)
2098 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002099
Steven Toth3935c252008-05-01 05:45:44 -03002100 /* Crystal Control */
2101 if (state->CAPSELECT)
2102 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002103 else
Steven Toth3935c252008-05-01 05:45:44 -03002104 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002105
Steven Toth3935c252008-05-01 05:45:44 -03002106 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
2107 status += MXL_ControlWrite(fe, IF_SEL_DBL, 1);
2108 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
2109 status += MXL_ControlWrite(fe, IF_SEL_DBL, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002110
Steven Toth3935c252008-05-01 05:45:44 -03002111 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2112 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3);
2113 if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL)
2114 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002115
Steven Toth3935c252008-05-01 05:45:44 -03002116 /* Misc Controls */
Steven Toth85d220d2008-05-01 05:48:14 -03002117 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */
Steven Toth3935c252008-05-01 05:45:44 -03002118 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002119 else
Steven Toth3935c252008-05-01 05:45:44 -03002120 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002121
Steven Toth3935c252008-05-01 05:45:44 -03002122 /* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */
Steven Toth52c99bd2008-05-01 04:57:01 -03002123
Steven Toth3935c252008-05-01 05:45:44 -03002124 /* Set TG_R_DIV */
2125 status += MXL_ControlWrite(fe, TG_R_DIV, MXL_Ceiling(state->Fxtal, 1000000));
Steven Toth52c99bd2008-05-01 04:57:01 -03002126
Steven Toth3935c252008-05-01 05:45:44 -03002127 /* Apply Default value to BB_INITSTATE_DLPF_TUNE */
Steven Toth52c99bd2008-05-01 04:57:01 -03002128
Steven Toth3935c252008-05-01 05:45:44 -03002129 /* RSSI Control */
2130 if (state->EN_RSSI)
Steven Toth52c99bd2008-05-01 04:57:01 -03002131 {
Steven Toth3935c252008-05-01 05:45:44 -03002132 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2133 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2134 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2135 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2136
2137 /* RSSI reference point */
2138 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2139 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3);
2140 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2141
2142 /* TOP point */
2143 status += MXL_ControlWrite(fe, RFA_FLR, 0);
2144 status += MXL_ControlWrite(fe, RFA_CEIL, 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03002145 }
2146
Steven Toth3935c252008-05-01 05:45:44 -03002147 /* Modulation type bit settings
2148 * Override the control values preset
2149 */
2150 if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002151 {
Steven Toth3935c252008-05-01 05:45:44 -03002152 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002153
Steven Toth3935c252008-05-01 05:45:44 -03002154 /* Enable RSSI */
2155 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2156 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2157 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2158 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2159
2160 /* RSSI reference point */
2161 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2162 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2163 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2164
2165 /* TOP point */
2166 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2167 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2168 if (state->IF_OUT <= 6280000UL) /* Low IF */
2169 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2170 else /* High IF */
2171 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002172
2173 }
Steven Toth3935c252008-05-01 05:45:44 -03002174 if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002175 {
Steven Toth85d220d2008-05-01 05:48:14 -03002176 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002177
Steven Toth3935c252008-05-01 05:45:44 -03002178 /* Enable RSSI */
2179 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2180 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2181 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2182 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002183
Steven Toth3935c252008-05-01 05:45:44 -03002184 /* RSSI reference point */
2185 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2186 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4);
2187 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2188
2189 /* TOP point */
2190 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2191 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2192 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1);
2193 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5); /* Low Zero */
2194 if (state->IF_OUT <= 6280000UL) /* Low IF */
2195 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2196 else /* High IF */
2197 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002198 }
Steven Toth3935c252008-05-01 05:45:44 -03002199 if (state->Mod_Type == MXL_QAM) /* QAM Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002200 {
Steven Toth3935c252008-05-01 05:45:44 -03002201 state->Mode = MXL_DIGITAL_MODE;
Steven Toth52c99bd2008-05-01 04:57:01 -03002202
Steven Toth3935c252008-05-01 05:45:44 -03002203 /* state->AGC_Mode = 1; */ /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002204
Steven Toth3935c252008-05-01 05:45:44 -03002205 /* Disable RSSI */ /* change here for v2.6.5 */
2206 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2207 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2208 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2209 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002210
Steven Toth3935c252008-05-01 05:45:44 -03002211 /* RSSI reference point */
2212 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2213 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2214 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2215 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); /* change here for v2.6.5 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002216
Steven Toth3935c252008-05-01 05:45:44 -03002217 if (state->IF_OUT <= 6280000UL) /* Low IF */
2218 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2219 else /* High IF */
2220 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth8c66a192008-05-01 06:35:48 -03002221 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
2222
Steven Toth52c99bd2008-05-01 04:57:01 -03002223 }
Steven Toth3935c252008-05-01 05:45:44 -03002224 if (state->Mod_Type == MXL_ANALOG_CABLE) {
2225 /* Analog Cable Mode */
Steven Toth85d220d2008-05-01 05:48:14 -03002226 /* state->Mode = MXL_DIGITAL_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002227
Steven Toth3935c252008-05-01 05:45:44 -03002228 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002229
Steven Toth3935c252008-05-01 05:45:44 -03002230 /* Disable RSSI */
2231 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2232 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2233 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2234 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2235 status += MXL_ControlWrite(fe, AGC_IF, 1); /* change for 2.6.3 */
2236 status += MXL_ControlWrite(fe, AGC_RF, 15);
2237 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002238 }
2239
Steven Toth3935c252008-05-01 05:45:44 -03002240 if (state->Mod_Type == MXL_ANALOG_OTA) {
2241 /* Analog OTA Terrestrial mode add for 2.6.7 */
2242 /* state->Mode = MXL_ANALOG_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002243
Steven Toth3935c252008-05-01 05:45:44 -03002244 /* Enable RSSI */
2245 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2246 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2247 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2248 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002249
Steven Toth3935c252008-05-01 05:45:44 -03002250 /* RSSI reference point */
2251 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2252 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2253 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2254 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
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 /* RSSI disable */
Steven Toth8c66a192008-05-01 06:35:48 -03002259 if(state->EN_RSSI == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03002260 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2261 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2262 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2263 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002264 }
2265
Steven Toth3935c252008-05-01 05:45:44 -03002266 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03002267}
2268
2269///////////////////////////////////////////////////////////////////////////////
2270// //
2271// Function: MXL_IFSynthInit //
2272// //
2273// Description: Tuner IF Synthesizer related register initialization //
2274// //
2275// Globals: //
2276// NONE //
2277// //
2278// Functions used: //
2279// Tuner_struct: structure defined at higher level //
2280// //
2281// Inputs: //
2282// Tuner : Tuner structure defined at higher level //
2283// //
2284// Outputs: //
2285// Tuner //
2286// //
2287// Return: //
2288// 0 : Successful //
2289// > 0 : Failed //
2290// //
2291///////////////////////////////////////////////////////////////////////////////
Steven Toth85d220d2008-05-01 05:48:14 -03002292u16 MXL_IFSynthInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03002293{
Steven Toth85d220d2008-05-01 05:48:14 -03002294 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03002295 u16 status = 0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002296 // Declare Local Variables
Steven Totha8214d42008-05-01 05:02:58 -03002297 u32 Fref = 0 ;
2298 u32 Kdbl, intModVal ;
2299 u32 fracModVal ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002300 Kdbl = 2 ;
2301
Steven Toth3935c252008-05-01 05:45:44 -03002302 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002303 Kdbl = 2 ;
Steven Toth3935c252008-05-01 05:45:44 -03002304 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002305 Kdbl = 1 ;
2306
2307 //
2308 // IF Synthesizer Control
2309 //
Steven Toth85d220d2008-05-01 05:48:14 -03002310 if (state->Mode == 0 && state->IF_Mode == 1) // Analog Low IF mode
Steven Toth52c99bd2008-05-01 04:57:01 -03002311 {
Steven Toth85d220d2008-05-01 05:48:14 -03002312 if (state->IF_LO == 41000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002313 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2314 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002315 Fref = 328000000UL ;
2316 }
Steven Toth85d220d2008-05-01 05:48:14 -03002317 if (state->IF_LO == 47000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002318 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2319 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002320 Fref = 376000000UL ;
2321 }
Steven Toth85d220d2008-05-01 05:48:14 -03002322 if (state->IF_LO == 54000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002323 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2324 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002325 Fref = 324000000UL ;
2326 }
Steven Toth85d220d2008-05-01 05:48:14 -03002327 if (state->IF_LO == 60000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002328 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2329 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002330 Fref = 360000000UL ;
2331 }
Steven Toth85d220d2008-05-01 05:48:14 -03002332 if (state->IF_LO == 39250000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002333 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2334 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002335 Fref = 314000000UL ;
2336 }
Steven Toth85d220d2008-05-01 05:48:14 -03002337 if (state->IF_LO == 39650000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002338 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2339 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002340 Fref = 317200000UL ;
2341 }
Steven Toth85d220d2008-05-01 05:48:14 -03002342 if (state->IF_LO == 40150000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002343 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2344 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002345 Fref = 321200000UL ;
2346 }
Steven Toth85d220d2008-05-01 05:48:14 -03002347 if (state->IF_LO == 40650000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002348 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2349 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002350 Fref = 325200000UL ;
2351 }
2352 }
2353
Steven Toth85d220d2008-05-01 05:48:14 -03002354 if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0))
Steven Toth52c99bd2008-05-01 04:57:01 -03002355 {
Steven Toth85d220d2008-05-01 05:48:14 -03002356 if (state->IF_LO == 57000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002357 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2358 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002359 Fref = 342000000UL ;
2360 }
Steven Toth85d220d2008-05-01 05:48:14 -03002361 if (state->IF_LO == 44000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002362 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2363 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002364 Fref = 352000000UL ;
2365 }
Steven Toth85d220d2008-05-01 05:48:14 -03002366 if (state->IF_LO == 43750000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002367 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2368 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002369 Fref = 350000000UL ;
2370 }
Steven Toth85d220d2008-05-01 05:48:14 -03002371 if (state->IF_LO == 36650000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002372 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2373 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002374 Fref = 366500000UL ;
2375 }
Steven Toth85d220d2008-05-01 05:48:14 -03002376 if (state->IF_LO == 36150000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002377 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2378 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002379 Fref = 361500000UL ;
2380 }
Steven Toth85d220d2008-05-01 05:48:14 -03002381 if (state->IF_LO == 36000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002382 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2383 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002384 Fref = 360000000UL ;
2385 }
Steven Toth85d220d2008-05-01 05:48:14 -03002386 if (state->IF_LO == 35250000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002387 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2388 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002389 Fref = 352500000UL ;
2390 }
Steven Toth85d220d2008-05-01 05:48:14 -03002391 if (state->IF_LO == 34750000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002392 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2393 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002394 Fref = 347500000UL ;
2395 }
Steven Toth85d220d2008-05-01 05:48:14 -03002396 if (state->IF_LO == 6280000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002397 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2398 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002399 Fref = 376800000UL ;
2400 }
Steven Toth85d220d2008-05-01 05:48:14 -03002401 if (state->IF_LO == 5000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002402 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
2403 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002404 Fref = 360000000UL ;
2405 }
Steven Toth85d220d2008-05-01 05:48:14 -03002406 if (state->IF_LO == 4500000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002407 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
2408 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002409 Fref = 360000000UL ;
2410 }
Steven Toth85d220d2008-05-01 05:48:14 -03002411 if (state->IF_LO == 4570000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002412 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
2413 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002414 Fref = 365600000UL ;
2415 }
Steven Toth85d220d2008-05-01 05:48:14 -03002416 if (state->IF_LO == 4000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002417 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05) ;
2418 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002419 Fref = 360000000UL ;
2420 }
Steven Toth85d220d2008-05-01 05:48:14 -03002421 if (state->IF_LO == 57400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002422 {
Steven Toth3935c252008-05-01 05:45:44 -03002423 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2424 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002425 Fref = 344400000UL ;
2426 }
Steven Toth85d220d2008-05-01 05:48:14 -03002427 if (state->IF_LO == 44400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002428 {
Steven Toth3935c252008-05-01 05:45:44 -03002429 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2430 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002431 Fref = 355200000UL ;
2432 }
Steven Toth85d220d2008-05-01 05:48:14 -03002433 if (state->IF_LO == 44150000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002434 {
Steven Toth3935c252008-05-01 05:45:44 -03002435 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2436 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002437 Fref = 353200000UL ;
2438 }
Steven Toth85d220d2008-05-01 05:48:14 -03002439 if (state->IF_LO == 37050000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002440 {
Steven Toth3935c252008-05-01 05:45:44 -03002441 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2442 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002443 Fref = 370500000UL ;
2444 }
Steven Toth85d220d2008-05-01 05:48:14 -03002445 if (state->IF_LO == 36550000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002446 {
Steven Toth3935c252008-05-01 05:45:44 -03002447 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2448 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002449 Fref = 365500000UL ;
2450 }
Steven Toth85d220d2008-05-01 05:48:14 -03002451 if (state->IF_LO == 36125000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002452 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2453 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002454 Fref = 361250000UL ;
2455 }
Steven Toth85d220d2008-05-01 05:48:14 -03002456 if (state->IF_LO == 6000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002457 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2458 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002459 Fref = 360000000UL ;
2460 }
Steven Toth85d220d2008-05-01 05:48:14 -03002461 if (state->IF_LO == 5400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002462 {
Steven Toth3935c252008-05-01 05:45:44 -03002463 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2464 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002465 Fref = 324000000UL ;
2466 }
Steven Toth85d220d2008-05-01 05:48:14 -03002467 if (state->IF_LO == 5380000UL) {
Steven Toth8c66a192008-05-01 06:35:48 -03002468 printk("%s() doing 5.38\n", __func__);
Steven Toth3935c252008-05-01 05:45:44 -03002469 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2470 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002471 Fref = 322800000UL ;
2472 }
Steven Toth85d220d2008-05-01 05:48:14 -03002473 if (state->IF_LO == 5200000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002474 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
2475 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002476 Fref = 374400000UL ;
2477 }
Steven Toth85d220d2008-05-01 05:48:14 -03002478 if (state->IF_LO == 4900000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002479 {
Steven Toth3935c252008-05-01 05:45:44 -03002480 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
2481 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002482 Fref = 352800000UL ;
2483 }
Steven Toth85d220d2008-05-01 05:48:14 -03002484 if (state->IF_LO == 4400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002485 {
Steven Toth3935c252008-05-01 05:45:44 -03002486 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
2487 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002488 Fref = 352000000UL ;
2489 }
Steven Toth85d220d2008-05-01 05:48:14 -03002490 if (state->IF_LO == 4063000UL) //add for 2.6.8
Steven Toth52c99bd2008-05-01 04:57:01 -03002491 {
Steven Toth3935c252008-05-01 05:45:44 -03002492 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05) ;
2493 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002494 Fref = 365670000UL ;
2495 }
2496 }
2497 // CHCAL_INT_MOD_IF
2498 // CHCAL_FRAC_MOD_IF
Steven Toth3935c252008-05-01 05:45:44 -03002499 intModVal = Fref / (state->Fxtal * Kdbl/2) ;
2500 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal ) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002501
Steven Toth3935c252008-05-01 05:45:44 -03002502 fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) * intModVal);
2503 fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000) ;
2504 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002505
Steven Toth52c99bd2008-05-01 04:57:01 -03002506 return status ;
2507}
2508
2509///////////////////////////////////////////////////////////////////////////////
2510// //
2511// Function: MXL_GetXtalInt //
2512// //
Steven Totha8214d42008-05-01 05:02:58 -03002513// Description: return the Crystal Integration Value for //
2514// TG_VCO_BIAS calculation //
Steven Toth52c99bd2008-05-01 04:57:01 -03002515// //
2516// Globals: //
2517// NONE //
2518// //
2519// Functions used: //
Steven Totha8214d42008-05-01 05:02:58 -03002520// NONE //
Steven Toth52c99bd2008-05-01 04:57:01 -03002521// //
2522// Inputs: //
2523// Crystal Frequency Value in Hz //
2524// //
2525// Outputs: //
2526// Calculated Crystal Frequency Integration Value //
2527// //
2528// Return: //
2529// 0 : Successful //
2530// > 0 : Failed //
2531// //
2532///////////////////////////////////////////////////////////////////////////////
Steven Totha8214d42008-05-01 05:02:58 -03002533u32 MXL_GetXtalInt(u32 Xtal_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002534{
2535 if ((Xtal_Freq % 1000000) == 0)
2536 return (Xtal_Freq / 10000) ;
2537 else
2538 return (((Xtal_Freq / 1000000) + 1)*100) ;
2539}
2540
2541///////////////////////////////////////////////////////////////////////////////
2542// //
2543// Function: MXL5005_TuneRF //
2544// //
2545// Description: Set control names to tune to requested RF_IN frequency //
2546// //
2547// Globals: //
2548// None //
2549// //
2550// Functions used: //
2551// MXL_SynthRFTGLO_Calc //
2552// MXL5005_ControlWrite //
Steven Toth3935c252008-05-01 05:45:44 -03002553// MXL_GetXtalInt //
Steven Toth52c99bd2008-05-01 04:57:01 -03002554// //
2555// Inputs: //
2556// Tuner : Tuner structure defined at higher level //
2557// //
2558// Outputs: //
2559// Tuner //
2560// //
2561// Return: //
2562// 0 : Successful //
2563// 1 : Unsuccessful //
2564///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03002565u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002566{
Steven Toth85d220d2008-05-01 05:48:14 -03002567 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03002568 // Declare Local Variables
Steven Toth3935c252008-05-01 05:45:44 -03002569 u16 status = 0;
2570 u32 divider_val, E3, E4, E5, E5A;
2571 u32 Fmax, Fmin, FmaxBin, FminBin;
Steven Totha8214d42008-05-01 05:02:58 -03002572 u32 Kdbl_RF = 2;
Steven Toth3935c252008-05-01 05:45:44 -03002573 u32 tg_divval;
2574 u32 tg_lo;
2575 u32 Xtal_Int;
Steven Toth52c99bd2008-05-01 04:57:01 -03002576
Steven Totha8214d42008-05-01 05:02:58 -03002577 u32 Fref_TG;
2578 u32 Fvco;
2579// u32 temp;
Steven Toth52c99bd2008-05-01 04:57:01 -03002580
2581
Steven Toth3935c252008-05-01 05:45:44 -03002582 Xtal_Int = MXL_GetXtalInt(state->Fxtal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002583
Steven Toth3935c252008-05-01 05:45:44 -03002584 state->RF_IN = RF_Freq;
Steven Toth52c99bd2008-05-01 04:57:01 -03002585
Steven Toth3935c252008-05-01 05:45:44 -03002586 MXL_SynthRFTGLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002587
Steven Toth3935c252008-05-01 05:45:44 -03002588 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2589 Kdbl_RF = 2;
2590 if (state->Fxtal > 22000000 && state->Fxtal <= 32000000)
2591 Kdbl_RF = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03002592
2593 //
2594 // Downconverter Controls
2595 //
2596 // Look-Up Table Implementation for:
2597 // DN_POLY
2598 // DN_RFGAIN
2599 // DN_CAP_RFLPF
2600 // DN_EN_VHFUHFBAR
2601 // DN_GAIN_ADJUST
2602 // Change the boundary reference from RF_IN to RF_LO
Steven Toth3935c252008-05-01 05:45:44 -03002603 if (state->RF_LO < 40000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002604 return -1;
2605 }
Steven Toth3935c252008-05-01 05:45:44 -03002606 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002607 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002608 status += MXL_ControlWrite(fe, DN_POLY, 2);
2609 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2610 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 423);
2611 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2612 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002613 }
Steven Toth3935c252008-05-01 05:45:44 -03002614 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002615 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002616 status += MXL_ControlWrite(fe, DN_POLY, 3);
2617 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2618 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 222);
2619 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2620 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002621 }
Steven Toth3935c252008-05-01 05:45:44 -03002622 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002623 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002624 status += MXL_ControlWrite(fe, DN_POLY, 3);
2625 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2626 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 147);
2627 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2628 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002629 }
Steven Toth3935c252008-05-01 05:45:44 -03002630 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002631 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002632 status += MXL_ControlWrite(fe, DN_POLY, 3);
2633 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2634 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 9);
2635 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2636 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002637 }
Steven Toth3935c252008-05-01 05:45:44 -03002638 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002639 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002640 status += MXL_ControlWrite(fe, DN_POLY, 3) ;
2641 status += MXL_ControlWrite(fe, DN_RFGAIN, 3) ;
2642 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
2643 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1) ;
2644 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002645 }
Steven Toth3935c252008-05-01 05:45:44 -03002646 if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002647 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002648 status += MXL_ControlWrite(fe, DN_POLY, 3) ;
2649 status += MXL_ControlWrite(fe, DN_RFGAIN, 1) ;
2650 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
2651 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0) ;
2652 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002653 }
Steven Toth3935c252008-05-01 05:45:44 -03002654 if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002655 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002656 status += MXL_ControlWrite(fe, DN_POLY, 3) ;
2657 status += MXL_ControlWrite(fe, DN_RFGAIN, 2) ;
2658 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
2659 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0) ;
2660 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002661 }
Steven Toth3935c252008-05-01 05:45:44 -03002662 if (state->RF_LO > 900000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002663 return -1;
2664 }
2665 // DN_IQTNBUF_AMP
2666 // DN_IQTNGNBFBIAS_BST
Steven Toth3935c252008-05-01 05:45:44 -03002667 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
2668 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2669 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002670 }
Steven Toth3935c252008-05-01 05:45:44 -03002671 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
2672 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2673 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002674 }
Steven Toth3935c252008-05-01 05:45:44 -03002675 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
2676 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2677 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002678 }
Steven Toth3935c252008-05-01 05:45:44 -03002679 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
2680 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2681 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002682 }
Steven Toth3935c252008-05-01 05:45:44 -03002683 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
2684 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2685 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002686 }
Steven Toth3935c252008-05-01 05:45:44 -03002687 if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) {
2688 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2689 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002690 }
Steven Toth3935c252008-05-01 05:45:44 -03002691 if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) {
2692 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2693 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002694 }
Steven Toth3935c252008-05-01 05:45:44 -03002695 if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) {
2696 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2697 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002698 }
Steven Toth3935c252008-05-01 05:45:44 -03002699 if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) {
2700 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2701 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002702 }
Steven Toth3935c252008-05-01 05:45:44 -03002703 if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) {
2704 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2705 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002706 }
Steven Toth3935c252008-05-01 05:45:44 -03002707 if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) {
2708 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2709 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002710 }
Steven Toth3935c252008-05-01 05:45:44 -03002711 if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) {
2712 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2713 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002714 }
Steven Toth3935c252008-05-01 05:45:44 -03002715 if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) {
2716 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2717 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002718 }
Steven Toth3935c252008-05-01 05:45:44 -03002719 if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) {
2720 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2721 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002722 }
Steven Toth3935c252008-05-01 05:45:44 -03002723 if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) {
2724 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2725 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002726 }
Steven Toth3935c252008-05-01 05:45:44 -03002727 if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) {
2728 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2729 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002730 }
2731
2732 //
2733 // Set RF Synth and LO Path Control
2734 //
2735 // Look-Up table implementation for:
2736 // RFSYN_EN_OUTMUX
2737 // RFSYN_SEL_VCO_OUT
2738 // RFSYN_SEL_VCO_HI
2739 // RFSYN_SEL_DIVM
2740 // RFSYN_RF_DIV_BIAS
2741 // DN_SEL_FREQ
2742 //
2743 // Set divider_val, Fmax, Fmix to use in Equations
2744 FminBin = 28000000UL ;
2745 FmaxBin = 42500000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002746 if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) {
2747 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2748 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2749 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2750 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2751 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2752 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002753 divider_val = 64 ;
2754 Fmax = FmaxBin ;
2755 Fmin = FminBin ;
2756 }
2757 FminBin = 42500000UL ;
2758 FmaxBin = 56000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002759 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2760 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2761 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2762 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2763 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2764 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2765 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002766 divider_val = 64 ;
2767 Fmax = FmaxBin ;
2768 Fmin = FminBin ;
2769 }
2770 FminBin = 56000000UL ;
2771 FmaxBin = 85000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002772 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2773 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2774 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2775 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2776 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2777 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2778 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002779 divider_val = 32 ;
2780 Fmax = FmaxBin ;
2781 Fmin = FminBin ;
2782 }
2783 FminBin = 85000000UL ;
2784 FmaxBin = 112000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002785 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2786 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2787 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2788 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2789 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2790 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2791 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002792 divider_val = 32 ;
2793 Fmax = FmaxBin ;
2794 Fmin = FminBin ;
2795 }
2796 FminBin = 112000000UL ;
2797 FmaxBin = 170000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002798 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2799 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2800 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2801 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2802 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2803 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2804 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002805 divider_val = 16 ;
2806 Fmax = FmaxBin ;
2807 Fmin = FminBin ;
2808 }
2809 FminBin = 170000000UL ;
2810 FmaxBin = 225000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002811 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2812 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2813 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2814 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2815 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2816 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2817 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002818 divider_val = 16 ;
2819 Fmax = FmaxBin ;
2820 Fmin = FminBin ;
2821 }
2822 FminBin = 225000000UL ;
2823 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002824 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2825 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2826 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2827 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2828 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2829 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2830 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 4) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002831 divider_val = 8 ;
2832 Fmax = 340000000UL ;
2833 Fmin = FminBin ;
2834 }
2835 FminBin = 300000000UL ;
2836 FmaxBin = 340000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002837 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2838 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1) ;
2839 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0) ;
2840 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2841 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2842 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2843 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002844 divider_val = 8 ;
2845 Fmax = FmaxBin ;
2846 Fmin = 225000000UL ;
2847 }
2848 FminBin = 340000000UL ;
2849 FmaxBin = 450000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002850 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2851 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1) ;
2852 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0) ;
2853 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2854 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2855 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 2) ;
2856 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002857 divider_val = 8 ;
2858 Fmax = FmaxBin ;
2859 Fmin = FminBin ;
2860 }
2861 FminBin = 450000000UL ;
2862 FmaxBin = 680000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002863 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2864 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2865 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2866 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2867 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1) ;
2868 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2869 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002870 divider_val = 4 ;
2871 Fmax = FmaxBin ;
2872 Fmin = FminBin ;
2873 }
2874 FminBin = 680000000UL ;
2875 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002876 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2877 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2878 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2879 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2880 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1) ;
2881 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2882 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002883 divider_val = 4 ;
2884 Fmax = FmaxBin ;
2885 Fmin = FminBin ;
2886 }
2887
2888 // CHCAL_INT_MOD_RF
2889 // CHCAL_FRAC_MOD_RF
2890 // RFSYN_LPF_R
2891 // CHCAL_EN_INT_RF
2892
2893 // Equation E3
2894 // RFSYN_VCO_BIAS
Steven Toth3935c252008-05-01 05:45:44 -03002895 E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ;
2896 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002897
2898 // Equation E4
2899 // CHCAL_INT_MOD_RF
Steven Toth3935c252008-05-01 05:45:44 -03002900 E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000) ;
2901 MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002902
2903 // Equation E5
2904 // CHCAL_FRAC_MOD_RF
2905 // CHCAL_EN_INT_RF
Steven Toth3935c252008-05-01 05:45:44 -03002906 E5 = ((2<<17)*(state->RF_LO/10000*divider_val - (E4*(2*state->Fxtal*Kdbl_RF)/10000)))/(2*state->Fxtal*Kdbl_RF/10000) ;
2907 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002908
2909 // Equation E5A
2910 // RFSYN_LPF_R
Steven Toth3935c252008-05-01 05:45:44 -03002911 E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;
2912 status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002913
2914 // Euqation E5B
2915 // CHCAL_EN_INIT_RF
Steven Toth3935c252008-05-01 05:45:44 -03002916 status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));
Steven Toth52c99bd2008-05-01 04:57:01 -03002917 //if (E5 == 0)
Steven Toth3935c252008-05-01 05:45:44 -03002918 // status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002919 //else
Steven Toth3935c252008-05-01 05:45:44 -03002920 // status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002921
2922 //
2923 // Set TG Synth
2924 //
2925 // Look-Up table implementation for:
2926 // TG_LO_DIVVAL
2927 // TG_LO_SELVAL
2928 //
2929 // Set divider_val, Fmax, Fmix to use in Equations
Steven Toth3935c252008-05-01 05:45:44 -03002930 if (state->TG_LO < 33000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002931 return -1;
2932 }
2933 FminBin = 33000000UL ;
2934 FmaxBin = 50000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002935 if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) {
2936 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x6) ;
2937 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002938 divider_val = 36 ;
2939 Fmax = FmaxBin ;
2940 Fmin = FminBin ;
2941 }
2942 FminBin = 50000000UL ;
2943 FmaxBin = 67000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002944 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2945 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x1) ;
2946 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002947 divider_val = 24 ;
2948 Fmax = FmaxBin ;
2949 Fmin = FminBin ;
2950 }
2951 FminBin = 67000000UL ;
2952 FmaxBin = 100000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002953 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2954 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0xC) ;
2955 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002956 divider_val = 18 ;
2957 Fmax = FmaxBin ;
2958 Fmin = FminBin ;
2959 }
2960 FminBin = 100000000UL ;
2961 FmaxBin = 150000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002962 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2963 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
2964 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002965 divider_val = 12 ;
2966 Fmax = FmaxBin ;
2967 Fmin = FminBin ;
2968 }
2969 FminBin = 150000000UL ;
2970 FmaxBin = 200000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002971 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2972 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
2973 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002974 divider_val = 8 ;
2975 Fmax = FmaxBin ;
2976 Fmin = FminBin ;
2977 }
2978 FminBin = 200000000UL ;
2979 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002980 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2981 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
2982 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002983 divider_val = 6 ;
2984 Fmax = FmaxBin ;
2985 Fmin = FminBin ;
2986 }
2987 FminBin = 300000000UL ;
2988 FmaxBin = 400000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002989 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2990 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
2991 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002992 divider_val = 4 ;
2993 Fmax = FmaxBin ;
2994 Fmin = FminBin ;
2995 }
2996 FminBin = 400000000UL ;
2997 FmaxBin = 600000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002998 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2999 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
3000 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003001 divider_val = 3 ;
3002 Fmax = FmaxBin ;
3003 Fmin = FminBin ;
3004 }
3005 FminBin = 600000000UL ;
3006 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003007 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3008 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
3009 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003010 divider_val = 2 ;
3011 Fmax = FmaxBin ;
3012 Fmin = FminBin ;
3013 }
3014
3015 // TG_DIV_VAL
Steven Toth3935c252008-05-01 05:45:44 -03003016 tg_divval = (state->TG_LO*divider_val/100000)
3017 *(MXL_Ceiling(state->Fxtal,1000000) * 100) / (state->Fxtal/1000) ;
3018 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003019
Steven Toth3935c252008-05-01 05:45:44 -03003020 if (state->TG_LO > 600000000UL)
3021 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1 ) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003022
3023 Fmax = 1800000000UL ;
3024 Fmin = 1200000000UL ;
3025
3026
3027
3028 // to prevent overflow of 32 bit unsigned integer, use following equation. Edit for v2.6.4
Steven Toth3935c252008-05-01 05:45:44 -03003029 Fref_TG = (state->Fxtal/1000)/ MXL_Ceiling(state->Fxtal, 1000000) ; // Fref_TF = Fref_TG*1000
Steven Toth52c99bd2008-05-01 04:57:01 -03003030
Steven Toth3935c252008-05-01 05:45:44 -03003031 Fvco = (state->TG_LO/10000) * divider_val * Fref_TG; //Fvco = Fvco/10
Steven Toth52c99bd2008-05-01 04:57:01 -03003032
3033 tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8;
3034
3035 //below equation is same as above but much harder to debug.
Steven Toth3935c252008-05-01 05:45:44 -03003036 //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 -03003037
3038
Steven Toth3935c252008-05-01 05:45:44 -03003039 status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003040
3041
3042
3043 //add for 2.6.5
3044 //Special setting for QAM
Steven Toth3935c252008-05-01 05:45:44 -03003045 if(state->Mod_Type == MXL_QAM)
Steven Toth52c99bd2008-05-01 04:57:01 -03003046 {
Steven Toth3935c252008-05-01 05:45:44 -03003047 if(state->RF_IN < 680000000)
3048 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003049 else
Steven Toth3935c252008-05-01 05:45:44 -03003050 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003051 }
3052
3053
3054 //remove 20.48MHz setting for 2.6.10
3055
3056 //
3057 // Off Chip Tracking Filter Control
3058 //
Steven Toth85d220d2008-05-01 05:48:14 -03003059 if (state->TF_Type == MXL_TF_OFF) // Tracking Filter Off State; turn off all the banks
Steven Toth52c99bd2008-05-01 04:57:01 -03003060 {
Steven Toth3935c252008-05-01 05:45:44 -03003061 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ;
3062 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003063
Steven Toth3935c252008-05-01 05:45:44 -03003064 status += MXL_SetGPIO(fe, 3, 1) ; // turn off Bank 1
3065 status += MXL_SetGPIO(fe, 1, 1) ; // turn off Bank 2
3066 status += MXL_SetGPIO(fe, 4, 1) ; // turn off Bank 3
Steven Toth52c99bd2008-05-01 04:57:01 -03003067 }
3068
Steven Toth85d220d2008-05-01 05:48:14 -03003069 if (state->TF_Type == MXL_TF_C) // Tracking Filter type C
Steven Toth52c99bd2008-05-01 04:57:01 -03003070 {
Steven Toth3935c252008-05-01 05:45:44 -03003071 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ;
3072 status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003073
Steven Toth3935c252008-05-01 05:45:44 -03003074 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003075 {
3076
Steven Toth3935c252008-05-01 05:45:44 -03003077 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3078 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3079 status += MXL_SetGPIO(fe, 3, 0) ; // Bank1 On
3080 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3081 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003082 }
Steven Toth3935c252008-05-01 05:45:44 -03003083 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003084 {
Steven Toth3935c252008-05-01 05:45:44 -03003085 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3086 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3087 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3088 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3089 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003090 }
Steven Toth3935c252008-05-01 05:45:44 -03003091 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003092 {
Steven Toth3935c252008-05-01 05:45:44 -03003093 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3094 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3095 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3096 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3097 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003098 }
Steven Toth3935c252008-05-01 05:45:44 -03003099 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003100 {
Steven Toth3935c252008-05-01 05:45:44 -03003101 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3102 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3103 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3104 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3105 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003106 }
Steven Toth3935c252008-05-01 05:45:44 -03003107 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003108 {
Steven Toth3935c252008-05-01 05:45:44 -03003109 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3110 status += MXL_ControlWrite(fe, DAC_DIN_B, 29) ;
3111 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3112 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3113 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003114 }
Steven Toth3935c252008-05-01 05:45:44 -03003115 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003116 {
Steven Toth3935c252008-05-01 05:45:44 -03003117 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3118 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3119 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3120 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3121 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003122 }
Steven Toth3935c252008-05-01 05:45:44 -03003123 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003124 {
Steven Toth3935c252008-05-01 05:45:44 -03003125 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3126 status += MXL_ControlWrite(fe, DAC_DIN_B, 16) ;
3127 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3128 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3129 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003130 }
Steven Toth3935c252008-05-01 05:45:44 -03003131 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003132 {
Steven Toth3935c252008-05-01 05:45:44 -03003133 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3134 status += MXL_ControlWrite(fe, DAC_DIN_B, 7) ;
3135 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3136 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3137 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003138 }
Steven Toth3935c252008-05-01 05:45:44 -03003139 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003140 {
Steven Toth3935c252008-05-01 05:45:44 -03003141 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3142 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3143 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3144 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3145 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003146 }
3147 }
3148
Steven Toth85d220d2008-05-01 05:48:14 -03003149 if (state->TF_Type == MXL_TF_C_H) // Tracking Filter type C-H for Hauppauge only
Steven Toth52c99bd2008-05-01 04:57:01 -03003150 {
Steven Toth8c66a192008-05-01 06:35:48 -03003151 printk("%s() CH filter\n", __func__);
Steven Toth3935c252008-05-01 05:45:44 -03003152 status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003153
Steven Toth3935c252008-05-01 05:45:44 -03003154 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003155 {
3156
Steven Toth3935c252008-05-01 05:45:44 -03003157 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3158 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3159 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3160 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003161 }
Steven Toth3935c252008-05-01 05:45:44 -03003162 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003163 {
Steven Toth3935c252008-05-01 05:45:44 -03003164 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3165 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3166 status += MXL_SetGPIO(fe, 3, 0) ; // Bank2 On
3167 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003168 }
Steven Toth3935c252008-05-01 05:45:44 -03003169 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003170 {
Steven Toth3935c252008-05-01 05:45:44 -03003171 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3172 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3173 status += MXL_SetGPIO(fe, 3, 0) ; // Bank2 On
3174 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003175 }
Steven Toth3935c252008-05-01 05:45:44 -03003176 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003177 {
Steven Toth3935c252008-05-01 05:45:44 -03003178 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3179 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3180 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3181 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003182 }
Steven Toth3935c252008-05-01 05:45:44 -03003183 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003184 {
Steven Toth3935c252008-05-01 05:45:44 -03003185 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3186 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3187 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3188 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003189 }
Steven Toth3935c252008-05-01 05:45:44 -03003190 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003191 {
Steven Toth3935c252008-05-01 05:45:44 -03003192 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3193 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3194 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3195 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003196 }
Steven Toth3935c252008-05-01 05:45:44 -03003197 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003198 {
Steven Toth3935c252008-05-01 05:45:44 -03003199 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3200 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3201 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3202 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003203 }
Steven Toth3935c252008-05-01 05:45:44 -03003204 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000)
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_SetGPIO(fe, 4, 1) ; // Bank1 Off
3208 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3209 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003210 }
Steven Toth3935c252008-05-01 05:45:44 -03003211 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003212 {
Steven Toth3935c252008-05-01 05:45:44 -03003213 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3214 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3215 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3216 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003217 }
3218 }
3219
Steven Toth85d220d2008-05-01 05:48:14 -03003220 if (state->TF_Type == MXL_TF_D) // Tracking Filter type D
Steven Toth52c99bd2008-05-01 04:57:01 -03003221 {
Steven Toth3935c252008-05-01 05:45:44 -03003222 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003223
Steven Toth3935c252008-05-01 05:45:44 -03003224 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003225 {
3226
Steven Toth3935c252008-05-01 05:45:44 -03003227 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3228 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3229 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3230 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003231 }
Steven Toth3935c252008-05-01 05:45:44 -03003232 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003233 {
Steven Toth3935c252008-05-01 05:45:44 -03003234 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3235 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3236 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3237 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003238 }
Steven Toth3935c252008-05-01 05:45:44 -03003239 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003240 {
Steven Toth3935c252008-05-01 05:45:44 -03003241 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3242 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3243 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3244 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003245 }
Steven Toth3935c252008-05-01 05:45:44 -03003246 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003247 {
Steven Toth3935c252008-05-01 05:45:44 -03003248 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3249 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3250 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3251 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003252 }
Steven Toth3935c252008-05-01 05:45:44 -03003253 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003254 {
Steven Toth3935c252008-05-01 05:45:44 -03003255 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3256 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3257 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3258 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003259 }
Steven Toth3935c252008-05-01 05:45:44 -03003260 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003261 {
Steven Toth3935c252008-05-01 05:45:44 -03003262 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3263 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3264 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3265 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003266 }
Steven Toth3935c252008-05-01 05:45:44 -03003267 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003268 {
Steven Toth3935c252008-05-01 05:45:44 -03003269 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3270 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3271 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3272 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003273 }
3274 }
3275
3276
Steven Toth85d220d2008-05-01 05:48:14 -03003277 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 -03003278 {
Steven Toth3935c252008-05-01 05:45:44 -03003279 status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003280
Steven Totha8214d42008-05-01 05:02:58 -03003281 // if UHF and terrestrial => Turn off Tracking Filter
Steven Toth3935c252008-05-01 05:45:44 -03003282 if (state->RF_IN >= 471000000 && (state->RF_IN - 471000000)%6000000 != 0)
Steven Toth52c99bd2008-05-01 04:57:01 -03003283 {
3284 // Turn off all the banks
Steven Toth3935c252008-05-01 05:45:44 -03003285 status += MXL_SetGPIO(fe, 3, 1) ;
3286 status += MXL_SetGPIO(fe, 1, 1) ;
3287 status += MXL_SetGPIO(fe, 4, 1) ;
3288 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003289
Steven Toth3935c252008-05-01 05:45:44 -03003290 status += MXL_ControlWrite(fe, AGC_IF, 10) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003291 }
3292
3293 else // if VHF or cable => Turn on Tracking Filter
3294 {
Steven Toth3935c252008-05-01 05:45:44 -03003295 if (state->RF_IN >= 43000000 && state->RF_IN < 140000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003296 {
3297
Steven Toth3935c252008-05-01 05:45:44 -03003298 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3299 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
3300 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3301 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003302 }
Steven Toth3935c252008-05-01 05:45:44 -03003303 if (state->RF_IN >= 140000000 && state->RF_IN < 240000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003304 {
Steven Toth3935c252008-05-01 05:45:44 -03003305 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3306 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
3307 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3308 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003309 }
Steven Toth3935c252008-05-01 05:45:44 -03003310 if (state->RF_IN >= 240000000 && state->RF_IN < 340000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003311 {
Steven Toth3935c252008-05-01 05:45:44 -03003312 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3313 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3314 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 On
3315 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003316 }
Steven Toth3935c252008-05-01 05:45:44 -03003317 if (state->RF_IN >= 340000000 && state->RF_IN < 430000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003318 {
Steven Toth3935c252008-05-01 05:45:44 -03003319 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3320 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3321 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3322 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003323 }
Steven Toth3935c252008-05-01 05:45:44 -03003324 if (state->RF_IN >= 430000000 && state->RF_IN < 470000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003325 {
Steven Toth3935c252008-05-01 05:45:44 -03003326 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 Off
3327 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3328 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
3329 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003330 }
Steven Toth3935c252008-05-01 05:45:44 -03003331 if (state->RF_IN >= 470000000 && state->RF_IN < 570000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003332 {
Steven Toth3935c252008-05-01 05:45:44 -03003333 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3334 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3335 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
3336 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003337 }
Steven Toth3935c252008-05-01 05:45:44 -03003338 if (state->RF_IN >= 570000000 && state->RF_IN < 620000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003339 {
Steven Toth3935c252008-05-01 05:45:44 -03003340 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 On
3341 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3342 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3343 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Offq
Steven Toth52c99bd2008-05-01 04:57:01 -03003344 }
Steven Toth3935c252008-05-01 05:45:44 -03003345 if (state->RF_IN >= 620000000 && state->RF_IN < 760000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003346 {
Steven Toth3935c252008-05-01 05:45:44 -03003347 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3348 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3349 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3350 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003351 }
Steven Toth3935c252008-05-01 05:45:44 -03003352 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003353 {
Steven Toth3935c252008-05-01 05:45:44 -03003354 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3355 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3356 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3357 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003358 }
3359 }
3360 }
3361
Steven Toth85d220d2008-05-01 05:48:14 -03003362 if (state->TF_Type == MXL_TF_E) // Tracking Filter type E
Steven Toth52c99bd2008-05-01 04:57:01 -03003363 {
Steven Toth3935c252008-05-01 05:45:44 -03003364 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003365
Steven Toth3935c252008-05-01 05:45:44 -03003366 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003367 {
3368
Steven Toth3935c252008-05-01 05:45:44 -03003369 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3370 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3371 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3372 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003373 }
Steven Toth3935c252008-05-01 05:45:44 -03003374 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003375 {
Steven Toth3935c252008-05-01 05:45:44 -03003376 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3377 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3378 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3379 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003380 }
Steven Toth3935c252008-05-01 05:45:44 -03003381 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003382 {
Steven Toth3935c252008-05-01 05:45:44 -03003383 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3384 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3385 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3386 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003387 }
Steven Toth3935c252008-05-01 05:45:44 -03003388 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003389 {
Steven Toth3935c252008-05-01 05:45:44 -03003390 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3391 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3392 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3393 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003394 }
Steven Toth3935c252008-05-01 05:45:44 -03003395 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003396 {
Steven Toth3935c252008-05-01 05:45:44 -03003397 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3398 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3399 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3400 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003401 }
Steven Toth3935c252008-05-01 05:45:44 -03003402 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003403 {
Steven Toth3935c252008-05-01 05:45:44 -03003404 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3405 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3406 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3407 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003408 }
Steven Toth3935c252008-05-01 05:45:44 -03003409 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003410 {
Steven Toth3935c252008-05-01 05:45:44 -03003411 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3412 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3413 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3414 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003415 }
3416 }
3417
Steven Toth85d220d2008-05-01 05:48:14 -03003418 if (state->TF_Type == MXL_TF_F) // Tracking Filter type F
Steven Toth52c99bd2008-05-01 04:57:01 -03003419 {
Steven Toth3935c252008-05-01 05:45:44 -03003420 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003421
Steven Toth3935c252008-05-01 05:45:44 -03003422 if (state->RF_IN >= 43000000 && state->RF_IN < 160000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003423 {
3424
Steven Toth3935c252008-05-01 05:45:44 -03003425 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3426 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3427 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3428 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003429 }
Steven Toth3935c252008-05-01 05:45:44 -03003430 if (state->RF_IN >= 160000000 && state->RF_IN < 210000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003431 {
Steven Toth3935c252008-05-01 05:45:44 -03003432 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3433 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3434 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3435 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003436 }
Steven Toth3935c252008-05-01 05:45:44 -03003437 if (state->RF_IN >= 210000000 && state->RF_IN < 300000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003438 {
Steven Toth3935c252008-05-01 05:45:44 -03003439 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3440 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3441 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3442 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003443 }
Steven Toth3935c252008-05-01 05:45:44 -03003444 if (state->RF_IN >= 300000000 && state->RF_IN < 390000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003445 {
Steven Toth3935c252008-05-01 05:45:44 -03003446 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3447 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3448 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3449 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003450 }
Steven Toth3935c252008-05-01 05:45:44 -03003451 if (state->RF_IN >= 390000000 && state->RF_IN < 515000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003452 {
Steven Toth3935c252008-05-01 05:45:44 -03003453 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3454 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3455 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3456 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003457 }
Steven Toth3935c252008-05-01 05:45:44 -03003458 if (state->RF_IN >= 515000000 && state->RF_IN < 650000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003459 {
Steven Toth3935c252008-05-01 05:45:44 -03003460 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3461 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3462 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3463 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003464 }
Steven Toth3935c252008-05-01 05:45:44 -03003465 if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003466 {
Steven Toth3935c252008-05-01 05:45:44 -03003467 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3468 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3469 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3470 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003471 }
3472 }
3473
Steven Toth85d220d2008-05-01 05:48:14 -03003474 if (state->TF_Type == MXL_TF_E_2) // Tracking Filter type E_2
Steven Toth52c99bd2008-05-01 04:57:01 -03003475 {
Steven Toth3935c252008-05-01 05:45:44 -03003476 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003477
Steven Toth3935c252008-05-01 05:45:44 -03003478 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003479 {
3480
Steven Toth3935c252008-05-01 05:45:44 -03003481 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3482 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3483 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3484 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003485 }
Steven Toth3935c252008-05-01 05:45:44 -03003486 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003487 {
Steven Toth3935c252008-05-01 05:45:44 -03003488 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3489 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3490 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3491 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003492 }
Steven Toth3935c252008-05-01 05:45:44 -03003493 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003494 {
Steven Toth3935c252008-05-01 05:45:44 -03003495 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3496 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3497 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3498 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003499 }
Steven Toth3935c252008-05-01 05:45:44 -03003500 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003501 {
Steven Toth3935c252008-05-01 05:45:44 -03003502 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3503 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3504 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3505 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003506 }
Steven Toth3935c252008-05-01 05:45:44 -03003507 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003508 {
Steven Toth3935c252008-05-01 05:45:44 -03003509 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3510 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3511 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3512 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003513 }
Steven Toth3935c252008-05-01 05:45:44 -03003514 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003515 {
Steven Toth3935c252008-05-01 05:45:44 -03003516 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3517 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3518 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3519 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003520 }
Steven Toth3935c252008-05-01 05:45:44 -03003521 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003522 {
Steven Toth3935c252008-05-01 05:45:44 -03003523 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3524 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3525 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3526 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003527 }
3528 }
3529
Steven Toth85d220d2008-05-01 05:48:14 -03003530 if (state->TF_Type == MXL_TF_G) // Tracking Filter type G add for v2.6.8
Steven Toth52c99bd2008-05-01 04:57:01 -03003531 {
Steven Toth3935c252008-05-01 05:45:44 -03003532 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003533
Steven Toth3935c252008-05-01 05:45:44 -03003534 if (state->RF_IN >= 50000000 && state->RF_IN < 190000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003535 {
3536
Steven Toth3935c252008-05-01 05:45:44 -03003537 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3538 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3539 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3540 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003541 }
Steven Toth3935c252008-05-01 05:45:44 -03003542 if (state->RF_IN >= 190000000 && state->RF_IN < 280000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003543 {
Steven Toth3935c252008-05-01 05:45:44 -03003544 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3545 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3546 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3547 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003548 }
Steven Toth3935c252008-05-01 05:45:44 -03003549 if (state->RF_IN >= 280000000 && state->RF_IN < 350000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003550 {
Steven Toth3935c252008-05-01 05:45:44 -03003551 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3552 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3553 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3554 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003555 }
Steven Toth3935c252008-05-01 05:45:44 -03003556 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003557 {
Steven Toth3935c252008-05-01 05:45:44 -03003558 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3559 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3560 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3561 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003562 }
Steven Toth3935c252008-05-01 05:45:44 -03003563 if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) //modified for 2.6.11
Steven Toth52c99bd2008-05-01 04:57:01 -03003564 {
Steven Toth3935c252008-05-01 05:45:44 -03003565 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3566 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
3567 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
3568 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003569 }
Steven Toth3935c252008-05-01 05:45:44 -03003570 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003571 {
Steven Toth3935c252008-05-01 05:45:44 -03003572 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3573 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3574 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3575 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003576 }
Steven Toth3935c252008-05-01 05:45:44 -03003577 if (state->RF_IN >= 640000000 && state->RF_IN < 820000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003578 {
Steven Toth3935c252008-05-01 05:45:44 -03003579 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3580 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3581 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3582 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003583 }
Steven Toth3935c252008-05-01 05:45:44 -03003584 if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003585 {
Steven Toth3935c252008-05-01 05:45:44 -03003586 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3587 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3588 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3589 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003590 }
3591 }
3592
Steven Toth85d220d2008-05-01 05:48:14 -03003593 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 -03003594 {
Steven Toth3935c252008-05-01 05:45:44 -03003595 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003596
Steven Totha8214d42008-05-01 05:02:58 -03003597 // if UHF and terrestrial=> Turn off Tracking Filter
Steven Toth3935c252008-05-01 05:45:44 -03003598 if (state->RF_IN >= 471000000 && (state->RF_IN - 471000000)%6000000 != 0)
Steven Toth52c99bd2008-05-01 04:57:01 -03003599 {
3600 // Turn off all the banks
Steven Toth3935c252008-05-01 05:45:44 -03003601 status += MXL_SetGPIO(fe, 3, 1) ;
3602 status += MXL_SetGPIO(fe, 1, 1) ;
3603 status += MXL_SetGPIO(fe, 4, 1) ;
3604 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003605
3606 //2.6.12
3607 //Turn on RSSI
Steven Toth3935c252008-05-01 05:45:44 -03003608 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1) ;
3609 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1) ;
3610 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1) ;
3611 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003612
3613 // RSSI reference point
Steven Toth3935c252008-05-01 05:45:44 -03003614 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5) ;
3615 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3) ;
3616 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003617
3618
Steven Toth3935c252008-05-01 05:45:44 -03003619 //status += MXL_ControlWrite(fe, AGC_IF, 10) ; //doesn't matter since RSSI is turn on
Steven Toth52c99bd2008-05-01 04:57:01 -03003620
3621 //following parameter is from analog OTA mode, can be change to seek better performance
Steven Toth3935c252008-05-01 05:45:44 -03003622 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003623 }
3624
3625 else //if VHF or Cable => Turn on Tracking Filter
3626 {
3627 //2.6.12
3628 //Turn off RSSI
Steven Toth3935c252008-05-01 05:45:44 -03003629 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003630
3631 //change back from above condition
Steven Toth3935c252008-05-01 05:45:44 -03003632 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003633
3634
Steven Toth3935c252008-05-01 05:45:44 -03003635 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003636 {
3637
Steven Toth3935c252008-05-01 05:45:44 -03003638 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3639 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3640 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3641 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003642 }
Steven Toth3935c252008-05-01 05:45:44 -03003643 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003644 {
Steven Toth3935c252008-05-01 05:45:44 -03003645 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3646 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3647 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
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 >= 250000000 && state->RF_IN < 350000000)
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, 0) ; // Bank2 On
3655 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003656 }
Steven Toth3935c252008-05-01 05:45:44 -03003657 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003658 {
Steven Toth3935c252008-05-01 05:45:44 -03003659 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3660 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3661 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
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 >= 400000000 && state->RF_IN < 570000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003665 {
Steven Toth3935c252008-05-01 05:45:44 -03003666 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3667 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3668 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3669 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003670 }
Steven Toth3935c252008-05-01 05:45:44 -03003671 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003672 {
Steven Toth3935c252008-05-01 05:45:44 -03003673 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3674 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3675 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3676 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003677 }
Steven Toth3935c252008-05-01 05:45:44 -03003678 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003679 {
Steven Toth3935c252008-05-01 05:45:44 -03003680 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3681 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3682 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3683 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003684 }
3685 }
3686 }
3687 return status ;
3688}
3689
Steven Toth3935c252008-05-01 05:45:44 -03003690// DONE
3691u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val)
Steven Toth52c99bd2008-05-01 04:57:01 -03003692{
Steven Toth3935c252008-05-01 05:45:44 -03003693 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003694
3695 if (GPIO_Num == 1)
Steven Toth3935c252008-05-01 05:45:44 -03003696 status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1);
3697
3698 /* GPIO2 is not available */
3699
3700 if (GPIO_Num == 3) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003701 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003702 status += MXL_ControlWrite(fe, GPIO_3, 0);
3703 status += MXL_ControlWrite(fe, GPIO_3B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003704 }
3705 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003706 status += MXL_ControlWrite(fe, GPIO_3, 1);
3707 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003708 }
Steven Toth3935c252008-05-01 05:45:44 -03003709 if (GPIO_Val == 3) { /* tri-state */
3710 status += MXL_ControlWrite(fe, GPIO_3, 0);
3711 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003712 }
3713 }
Steven Toth3935c252008-05-01 05:45:44 -03003714 if (GPIO_Num == 4) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003715 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003716 status += MXL_ControlWrite(fe, GPIO_4, 0);
3717 status += MXL_ControlWrite(fe, GPIO_4B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003718 }
3719 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003720 status += MXL_ControlWrite(fe, GPIO_4, 1);
3721 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003722 }
Steven Toth3935c252008-05-01 05:45:44 -03003723 if (GPIO_Val == 3) { /* tri-state */
3724 status += MXL_ControlWrite(fe, GPIO_4, 0);
3725 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003726 }
3727 }
3728
Steven Toth3935c252008-05-01 05:45:44 -03003729 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003730}
3731
3732///////////////////////////////////////////////////////////////////////////////
3733// //
3734// Function: MXL_ControlWrite //
3735// //
3736// Description: Update control name value //
3737// //
3738// Globals: //
3739// NONE //
3740// //
3741// Functions used: //
3742// MXL_ControlWrite( Tuner, controlName, value, Group ) //
3743// //
3744// Inputs: //
3745// Tuner : Tuner structure //
3746// ControlName : Control name to be updated //
3747// value : Value to be written //
3748// //
3749// Outputs: //
3750// Tuner : Tuner structure defined at higher level //
3751// //
3752// Return: //
3753// 0 : Successful write //
3754// >0 : Value exceed maximum allowed for control number //
3755// //
3756///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03003757// DONE
3758u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003759{
Steven Toth3935c252008-05-01 05:45:44 -03003760 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003761
Steven Toth3935c252008-05-01 05:45:44 -03003762 /* Will write ALL Matching Control Name */
Steven Toth85d220d2008-05-01 05:48:14 -03003763 status += MXL_ControlWrite_Group(fe, ControlNum, value, 1); /* Write Matching INIT Control */
3764 status += MXL_ControlWrite_Group(fe, ControlNum, value, 2); /* Write Matching CH Control */
Steven Toth3935c252008-05-01 05:45:44 -03003765#ifdef _MXL_INTERNAL
Steven Toth85d220d2008-05-01 05:48:14 -03003766 status += MXL_ControlWrite_Group(fe, ControlNum, value, 3); /* Write Matching MXL Control */
Steven Toth3935c252008-05-01 05:45:44 -03003767#endif
3768 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003769}
3770
3771///////////////////////////////////////////////////////////////////////////////
3772// //
3773// Function: MXL_ControlWrite //
3774// //
3775// Description: Update control name value //
3776// //
3777// Globals: //
3778// NONE //
3779// //
3780// Functions used: //
3781// strcmp //
3782// //
3783// Inputs: //
3784// Tuner_struct: structure defined at higher level //
3785// ControlName : Control Name //
3786// value : Value Assigned to Control Name //
3787// controlGroup : Control Register Group //
3788// //
3789// Outputs: //
3790// NONE //
3791// //
3792// Return: //
3793// 0 : Successful write //
3794// 1 : Value exceed maximum allowed for control name //
3795// 2 : Control name not found //
3796// //
3797///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03003798// DONE
3799u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, u32 value, u16 controlGroup)
Steven Toth52c99bd2008-05-01 04:57:01 -03003800{
Steven Toth85d220d2008-05-01 05:48:14 -03003801 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03003802 u16 i, j, k;
3803 u32 highLimit;
3804 u32 ctrlVal;
Steven Toth52c99bd2008-05-01 04:57:01 -03003805
Steven Toth3935c252008-05-01 05:45:44 -03003806 if (controlGroup == 1) /* Initial Control */ {
3807
3808 for (i = 0; i < state->Init_Ctrl_Num; i++) {
3809
3810 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3811
3812 highLimit = 1 << state->Init_Ctrl[i].size;
3813 if (value < highLimit) {
3814 for (j = 0; j < state->Init_Ctrl[i].size; j++) {
3815 state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3816 MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]),
3817 (u8)(state->Init_Ctrl[i].bit[j]),
3818 (u8)((value>>j) & 0x01) );
Steven Toth52c99bd2008-05-01 04:57:01 -03003819 }
Steven Toth3935c252008-05-01 05:45:44 -03003820 ctrlVal = 0;
3821 for (k = 0; k < state->Init_Ctrl[i].size; k++)
3822 ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
Steven Toth52c99bd2008-05-01 04:57:01 -03003823 }
3824 else
Steven Toth3935c252008-05-01 05:45:44 -03003825 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003826 }
3827 }
3828 }
Steven Toth3935c252008-05-01 05:45:44 -03003829 if (controlGroup == 2) /* Chan change Control */ {
3830
3831 for (i = 0; i < state->CH_Ctrl_Num; i++) {
3832
3833 if (controlNum == state->CH_Ctrl[i].Ctrl_Num ) {
3834
3835 highLimit = 1 << state->CH_Ctrl[i].size;
3836 if (value < highLimit) {
3837 for (j = 0; j < state->CH_Ctrl[i].size; j++) {
3838 state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3839 MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]),
3840 (u8)(state->CH_Ctrl[i].bit[j]),
3841 (u8)((value>>j) & 0x01) );
Steven Toth52c99bd2008-05-01 04:57:01 -03003842 }
Steven Toth3935c252008-05-01 05:45:44 -03003843 ctrlVal = 0;
3844 for (k = 0; k < state->CH_Ctrl[i].size; k++)
3845 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
Steven Toth52c99bd2008-05-01 04:57:01 -03003846 }
3847 else
Steven Toth3935c252008-05-01 05:45:44 -03003848 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003849 }
3850 }
3851 }
3852#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003853 if (controlGroup == 3) /* Maxlinear Control */ {
3854
3855 for (i = 0; i < state->MXL_Ctrl_Num; i++) {
3856
3857 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num ) {
3858
3859 highLimit = (1 << state->MXL_Ctrl[i].size) ;
3860 if (value < highLimit) {
3861 for (j = 0; j < state->MXL_Ctrl[i].size; j++) {
3862 state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3863 MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]),
3864 (u8)(state->MXL_Ctrl[i].bit[j]),
3865 (u8)((value>>j) & 0x01) );
Steven Toth52c99bd2008-05-01 04:57:01 -03003866 }
Steven Toth3935c252008-05-01 05:45:44 -03003867 ctrlVal = 0;
3868 for(k = 0; k < state->MXL_Ctrl[i].size; k++)
3869 ctrlVal += state->MXL_Ctrl[i].val[k] * (1 << k);
Steven Toth52c99bd2008-05-01 04:57:01 -03003870 }
3871 else
Steven Toth3935c252008-05-01 05:45:44 -03003872 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003873 }
3874 }
3875 }
3876#endif
Steven Toth3935c252008-05-01 05:45:44 -03003877 return 0 ; /* successful return */
Steven Toth52c99bd2008-05-01 04:57:01 -03003878}
3879
3880///////////////////////////////////////////////////////////////////////////////
3881// //
3882// Function: MXL_RegWrite //
3883// //
3884// Description: Update tuner register value //
3885// //
3886// Globals: //
3887// NONE //
3888// //
3889// Functions used: //
3890// NONE //
3891// //
3892// Inputs: //
3893// Tuner_struct: structure defined at higher level //
3894// RegNum : Register address to be assigned a value //
3895// RegVal : Register value to write //
3896// //
3897// Outputs: //
3898// NONE //
3899// //
3900// Return: //
3901// 0 : Successful write //
3902// -1 : Invalid Register Address //
3903// //
3904///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03003905// DONE
3906u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003907{
Steven Toth85d220d2008-05-01 05:48:14 -03003908 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003909 int i ;
3910
Steven Toth3935c252008-05-01 05:45:44 -03003911 for (i = 0; i < 104; i++) {
3912 if (RegNum == state->TunerRegs[i].Reg_Num) {
3913 state->TunerRegs[i].Reg_Val = RegVal;
3914 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003915 }
3916 }
3917
Steven Toth3935c252008-05-01 05:45:44 -03003918 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003919}
3920
3921///////////////////////////////////////////////////////////////////////////////
3922// //
3923// Function: MXL_RegRead //
3924// //
3925// Description: Retrieve tuner register value //
3926// //
3927// Globals: //
3928// NONE //
3929// //
3930// Functions used: //
3931// NONE //
3932// //
3933// Inputs: //
3934// Tuner_struct: structure defined at higher level //
3935// RegNum : Register address to be assigned a value //
3936// //
3937// Outputs: //
3938// RegVal : Retrieved register value //
3939// //
3940// Return: //
3941// 0 : Successful read //
3942// -1 : Invalid Register Address //
3943// //
3944///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03003945// DONE
3946u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003947{
Steven Toth85d220d2008-05-01 05:48:14 -03003948 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003949 int i ;
3950
Steven Toth3935c252008-05-01 05:45:44 -03003951 for (i = 0; i < 104; i++) {
3952 if (RegNum == state->TunerRegs[i].Reg_Num ) {
3953 *RegVal = (u8)(state->TunerRegs[i].Reg_Val);
3954 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003955 }
3956 }
3957
Steven Toth3935c252008-05-01 05:45:44 -03003958 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003959}
3960
3961///////////////////////////////////////////////////////////////////////////////
3962// //
3963// Function: MXL_ControlRead //
3964// //
3965// Description: Retrieve the control value based on the control name //
3966// //
3967// Globals: //
3968// NONE //
3969// //
3970// Inputs: //
3971// Tuner_struct : structure defined at higher level //
3972// ControlName : Control Name //
3973// //
3974// Outputs: //
3975// value : returned control value //
3976// //
3977// Return: //
3978// 0 : Successful read //
3979// -1 : Invalid control name //
3980// //
3981///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03003982// DONE
Steven Toth85d220d2008-05-01 05:48:14 -03003983u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003984{
Steven Toth85d220d2008-05-01 05:48:14 -03003985 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003986 u32 ctrlVal ;
3987 u16 i, k ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003988
Steven Toth3935c252008-05-01 05:45:44 -03003989 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
3990
3991 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3992
3993 ctrlVal = 0;
3994 for (k = 0; k < state->Init_Ctrl[i].size; k++)
3995 ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
3996 *value = ctrlVal;
3997 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003998 }
3999 }
Steven Toth3935c252008-05-01 05:45:44 -03004000
4001 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
4002
4003 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
4004
4005 ctrlVal = 0;
4006 for (k = 0; k < state->CH_Ctrl[i].size; k++)
4007 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
4008 *value = ctrlVal;
4009 return 0;
4010
Steven Toth52c99bd2008-05-01 04:57:01 -03004011 }
4012 }
4013
4014#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03004015 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
4016
4017 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
4018
4019 ctrlVal = 0;
4020 for (k = 0; k < state->MXL_Ctrl[i].size; k++)
4021 ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k);
4022 *value = ctrlVal;
4023 return 0;
4024
Steven Toth52c99bd2008-05-01 04:57:01 -03004025 }
4026 }
4027#endif
Steven Toth3935c252008-05-01 05:45:44 -03004028 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004029}
4030
4031///////////////////////////////////////////////////////////////////////////////
4032// //
4033// Function: MXL_ControlRegRead //
4034// //
4035// Description: Retrieve the register addresses and count related to a //
Steven Totha8214d42008-05-01 05:02:58 -03004036// a specific control name //
Steven Toth52c99bd2008-05-01 04:57:01 -03004037// //
4038// Globals: //
4039// NONE //
4040// //
4041// Inputs: //
4042// Tuner_struct : structure defined at higher level //
4043// ControlName : Control Name //
4044// //
4045// Outputs: //
4046// RegNum : returned register address array //
Steven Totha8214d42008-05-01 05:02:58 -03004047// count : returned register count related to a control //
Steven Toth52c99bd2008-05-01 04:57:01 -03004048// //
4049// Return: //
4050// 0 : Successful read //
4051// -1 : Invalid control name //
4052// //
4053///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03004054// DONE
4055u16 MXL_ControlRegRead(struct dvb_frontend *fe, u16 controlNum, u8 *RegNum, int * count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004056{
Steven Toth85d220d2008-05-01 05:48:14 -03004057 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004058 u16 i, j, k ;
4059 u16 Count ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004060
Steven Toth3935c252008-05-01 05:45:44 -03004061 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004062
Steven Toth3935c252008-05-01 05:45:44 -03004063 if ( controlNum == state->Init_Ctrl[i].Ctrl_Num ) {
4064
4065 Count = 1;
4066 RegNum[0] = (u8)(state->Init_Ctrl[i].addr[0]);
4067
4068 for (k = 1; k < state->Init_Ctrl[i].size; k++) {
4069
4070 for (j = 0; j < Count; j++) {
4071
4072 if (state->Init_Ctrl[i].addr[k] != RegNum[j]) {
4073
4074 Count ++;
4075 RegNum[Count-1] = (u8)(state->Init_Ctrl[i].addr[k]);
4076
Steven Toth52c99bd2008-05-01 04:57:01 -03004077 }
4078 }
4079
4080 }
Steven Toth3935c252008-05-01 05:45:44 -03004081 *count = Count;
4082 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004083 }
4084 }
Steven Toth3935c252008-05-01 05:45:44 -03004085 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004086
Steven Toth3935c252008-05-01 05:45:44 -03004087 if ( controlNum == state->CH_Ctrl[i].Ctrl_Num ) {
4088
4089 Count = 1;
4090 RegNum[0] = (u8)(state->CH_Ctrl[i].addr[0]);
4091
4092 for (k = 1; k < state->CH_Ctrl[i].size; k++) {
4093
4094 for (j= 0; j<Count; j++) {
4095
4096 if (state->CH_Ctrl[i].addr[k] != RegNum[j]) {
4097
4098 Count ++;
4099 RegNum[Count-1] = (u8)(state->CH_Ctrl[i].addr[k]);
4100
Steven Toth52c99bd2008-05-01 04:57:01 -03004101 }
4102 }
4103 }
Steven Toth3935c252008-05-01 05:45:44 -03004104 *count = Count;
4105 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004106 }
4107 }
4108#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03004109 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004110
Steven Toth3935c252008-05-01 05:45:44 -03004111 if ( controlNum == state->MXL_Ctrl[i].Ctrl_Num ) {
4112
4113 Count = 1;
4114 RegNum[0] = (u8)(state->MXL_Ctrl[i].addr[0]);
4115
4116 for (k = 1; k < state->MXL_Ctrl[i].size; k++) {
4117
4118 for (j = 0; j<Count; j++) {
4119
4120 if (state->MXL_Ctrl[i].addr[k] != RegNum[j]) {
4121
4122 Count ++;
4123 RegNum[Count-1] = (u8)state->MXL_Ctrl[i].addr[k];
4124
Steven Toth52c99bd2008-05-01 04:57:01 -03004125 }
4126 }
4127 }
Steven Toth3935c252008-05-01 05:45:44 -03004128 *count = Count;
4129 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004130 }
4131 }
4132#endif
Steven Toth3935c252008-05-01 05:45:44 -03004133 *count = 0;
4134 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004135}
4136
4137///////////////////////////////////////////////////////////////////////////////
4138// //
4139// Function: MXL_RegWriteBit //
4140// //
4141// Description: Write a register for specified register address, //
4142// register bit and register bit value //
4143// //
4144// Globals: //
4145// NONE //
4146// //
4147// Inputs: //
4148// Tuner_struct : structure defined at higher level //
4149// address : register address //
Steven Toth3935c252008-05-01 05:45:44 -03004150// bit : register bit number //
Steven Totha8214d42008-05-01 05:02:58 -03004151// bitVal : register bit value //
Steven Toth52c99bd2008-05-01 04:57:01 -03004152// //
4153// Outputs: //
4154// NONE //
4155// //
4156// Return: //
4157// NONE //
4158// //
4159///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03004160// DONE
4161void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03004162{
Steven Toth85d220d2008-05-01 05:48:14 -03004163 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03004164 int i ;
4165
Steven Totha8214d42008-05-01 05:02:58 -03004166 const u8 AND_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03004167 0xFE, 0xFD, 0xFB, 0xF7,
4168 0xEF, 0xDF, 0xBF, 0x7F } ;
4169
Steven Totha8214d42008-05-01 05:02:58 -03004170 const u8 OR_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03004171 0x01, 0x02, 0x04, 0x08,
4172 0x10, 0x20, 0x40, 0x80 } ;
4173
Steven Toth3935c252008-05-01 05:45:44 -03004174 for (i = 0; i < state->TunerRegs_Num; i++) {
4175 if (state->TunerRegs[i].Reg_Num == address) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004176 if (bitVal)
Steven Toth3935c252008-05-01 05:45:44 -03004177 state->TunerRegs[i].Reg_Val |= OR_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03004178 else
Steven Toth3935c252008-05-01 05:45:44 -03004179 state->TunerRegs[i].Reg_Val &= AND_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03004180 break ;
4181 }
4182 }
Steven Toth3935c252008-05-01 05:45:44 -03004183}
Steven Toth52c99bd2008-05-01 04:57:01 -03004184
4185///////////////////////////////////////////////////////////////////////////////
4186// //
4187// Function: MXL_Ceiling //
4188// //
4189// Description: Complete to closest increment of resolution //
4190// //
4191// Globals: //
4192// NONE //
4193// //
4194// Functions used: //
4195// NONE //
4196// //
4197// Inputs: //
4198// value : Input number to compute //
4199// resolution : Increment step //
4200// //
4201// Outputs: //
4202// NONE //
4203// //
4204// Return: //
4205// Computed value //
4206// //
4207///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03004208// DONE
4209u32 MXL_Ceiling(u32 value, u32 resolution)
Steven Toth52c99bd2008-05-01 04:57:01 -03004210{
Steven Toth3935c252008-05-01 05:45:44 -03004211 return (value/resolution + (value % resolution > 0 ? 1 : 0));
4212}
Steven Toth52c99bd2008-05-01 04:57:01 -03004213
4214//
4215// Retrieve the Initialzation Registers
4216//
Steven Toth3935c252008-05-01 05:45:44 -03004217// DONE
4218u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004219{
Steven Totha8214d42008-05-01 05:02:58 -03004220 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004221 int i ;
4222
Steven Toth3935c252008-05-01 05:45:44 -03004223 u8 RegAddr[] = {
4224 11, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73,
4225 76, 77, 91, 134, 135, 137, 147,
4226 156, 166, 167, 168, 25 };
Steven Toth52c99bd2008-05-01 04:57:01 -03004227
Steven Toth3935c252008-05-01 05:45:44 -03004228 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004229
Steven Toth3935c252008-05-01 05:45:44 -03004230 status += MXL_BlockInit(fe);
4231
4232 for (i = 0 ; i < *count; i++) {
4233 RegNum[i] = RegAddr[i];
4234 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004235 }
4236
Steven Toth3935c252008-05-01 05:45:44 -03004237 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004238}
4239
Steven Toth3935c252008-05-01 05:45:44 -03004240// DONE
4241u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004242{
Steven Totha8214d42008-05-01 05:02:58 -03004243 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004244 int i ;
4245
4246//add 77, 166, 167, 168 register for 2.6.12
4247#ifdef _MXL_PRODUCTION
Steven Totha8214d42008-05-01 05:02:58 -03004248 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106,
4249 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004250#else
Steven Totha8214d42008-05-01 05:02:58 -03004251 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106,
4252 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
4253 //u8 RegAddr[171];
Steven Toth52c99bd2008-05-01 04:57:01 -03004254 //for (i=0; i<=170; i++)
4255 // RegAddr[i] = i;
4256#endif
4257
Steven Toth3935c252008-05-01 05:45:44 -03004258 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004259
Steven Toth3935c252008-05-01 05:45:44 -03004260 for (i = 0 ; i < *count; i++) {
4261 RegNum[i] = RegAddr[i];
4262 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004263 }
4264
Steven Toth3935c252008-05-01 05:45:44 -03004265 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004266}
4267
Steven Toth3935c252008-05-01 05:45:44 -03004268// DONE
4269u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004270{
Steven Toth3935c252008-05-01 05:45:44 -03004271 u16 status = 0;
4272 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03004273
Steven Toth3935c252008-05-01 05:45:44 -03004274 u8 RegAddr[] = {43, 136};
Steven Toth52c99bd2008-05-01 04:57:01 -03004275
Steven Toth3935c252008-05-01 05:45:44 -03004276 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004277
Steven Toth3935c252008-05-01 05:45:44 -03004278 for (i = 0; i < *count; i++) {
4279 RegNum[i] = RegAddr[i];
4280 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004281 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004282
Steven Toth3935c252008-05-01 05:45:44 -03004283 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004284}
4285
Steven Toth3935c252008-05-01 05:45:44 -03004286// DONE
4287u16 MXL_GetCHRegister_LowIF(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004288{
Steven Toth3935c252008-05-01 05:45:44 -03004289 u16 status = 0;
4290 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03004291
Steven Toth3935c252008-05-01 05:45:44 -03004292 u8 RegAddr[] = { 138 };
Steven Toth52c99bd2008-05-01 04:57:01 -03004293
Steven Toth3935c252008-05-01 05:45:44 -03004294 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004295
Steven Toth3935c252008-05-01 05:45:44 -03004296 for (i = 0; i < *count; i++) {
4297 RegNum[i] = RegAddr[i];
4298 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004299 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004300
Steven Toth3935c252008-05-01 05:45:44 -03004301 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004302}
4303
Steven Toth3935c252008-05-01 05:45:44 -03004304// DONE
Steven Totha8214d42008-05-01 05:02:58 -03004305u16 MXL_GetMasterControl(u8 *MasterReg, int state)
Steven Toth52c99bd2008-05-01 04:57:01 -03004306{
Steven Toth3935c252008-05-01 05:45:44 -03004307 if (state == 1) /* Load_Start */
4308 *MasterReg = 0xF3;
4309 if (state == 2) /* Power_Down */
4310 *MasterReg = 0x41;
4311 if (state == 3) /* Synth_Reset */
4312 *MasterReg = 0xB1;
4313 if (state == 4) /* Seq_Off */
4314 *MasterReg = 0xF1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004315
Steven Toth3935c252008-05-01 05:45:44 -03004316 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004317}
4318
4319#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03004320u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)
Steven Toth52c99bd2008-05-01 04:57:01 -03004321{
Steven Toth85d220d2008-05-01 05:48:14 -03004322 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004323 u16 status = 0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004324
Steven Totha8214d42008-05-01 05:02:58 -03004325 if (VCO_Range == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03004326 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4327 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4328 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4329 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4330 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4331 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4332 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4333 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4334 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4335 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4336 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
4337 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 180224);
Steven Totha8214d42008-05-01 05:02:58 -03004338 }
Steven Toth3935c252008-05-01 05:45:44 -03004339 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4340 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4341 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4342 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
4343 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 222822);
Steven Totha8214d42008-05-01 05:02:58 -03004344 }
Steven Toth3935c252008-05-01 05:45:44 -03004345 if (state->Mode == 1) /* Digital Mode */ {
4346 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4347 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4348 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
4349 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 229376);
Steven Totha8214d42008-05-01 05:02:58 -03004350 }
4351 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004352
Steven Totha8214d42008-05-01 05:02:58 -03004353 if (VCO_Range == 2) {
Steven Toth3935c252008-05-01 05:45:44 -03004354 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4355 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4356 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4357 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4358 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4359 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4360 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4361 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4362 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4363 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
4364 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4365 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4366 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4367 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4368 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004369 }
Steven Toth3935c252008-05-01 05:45:44 -03004370 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4371 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4372 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4373 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4374 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004375 }
Steven Toth3935c252008-05-01 05:45:44 -03004376 if (state->Mode == 1) /* Digital Mode */ {
4377 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4378 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4379 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
4380 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 16384);
Steven Totha8214d42008-05-01 05:02:58 -03004381 }
4382 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004383
Steven Totha8214d42008-05-01 05:02:58 -03004384 if (VCO_Range == 3) {
Steven Toth3935c252008-05-01 05:45:44 -03004385 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4386 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4387 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4388 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4389 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4390 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4391 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4392 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4393 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4394 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4395 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4396 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4397 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4398 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
4399 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03004400 }
Steven Toth3935c252008-05-01 05:45:44 -03004401 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4402 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4403 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4404 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
4405 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03004406 }
Steven Toth3935c252008-05-01 05:45:44 -03004407 if (state->Mode == 1) /* Digital Mode */ {
4408 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4409 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4410 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4411 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 245760);
Steven Totha8214d42008-05-01 05:02:58 -03004412 }
4413 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004414
Steven Totha8214d42008-05-01 05:02:58 -03004415 if (VCO_Range == 4) {
Steven Toth3935c252008-05-01 05:45:44 -03004416 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4417 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4418 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4419 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4420 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4421 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4422 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4423 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4424 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4425 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4426 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4427 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4428 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4429 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4430 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004431 }
Steven Toth3935c252008-05-01 05:45:44 -03004432 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4433 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4434 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4435 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4436 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004437 }
Steven Toth3935c252008-05-01 05:45:44 -03004438 if (state->Mode == 1) /* Digital Mode */ {
4439 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4440 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4441 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4442 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 212992);
Steven Totha8214d42008-05-01 05:02:58 -03004443 }
4444 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004445
Steven Totha8214d42008-05-01 05:02:58 -03004446 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004447}
4448
Steven Toth3935c252008-05-01 05:45:44 -03004449// DONE
4450u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)
Steven Toth52c99bd2008-05-01 04:57:01 -03004451{
Steven Toth85d220d2008-05-01 05:48:14 -03004452 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004453 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004454
4455 if (Hystersis == 1)
Steven Toth3935c252008-05-01 05:45:44 -03004456 status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03004457
Steven Totha8214d42008-05-01 05:02:58 -03004458 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004459}
Steven Totha8214d42008-05-01 05:02:58 -03004460
Steven Toth52c99bd2008-05-01 04:57:01 -03004461#endif
4462
Steven Toth85d220d2008-05-01 05:48:14 -03004463/* Linux driver related functions */
4464
Steven Toth8c66a192008-05-01 06:35:48 -03004465int mxl5005s_init(struct dvb_frontend *fe)
Steven Toth85d220d2008-05-01 05:48:14 -03004466{
Steven Toth8c66a192008-05-01 06:35:48 -03004467 struct mxl5005s_state *state = fe->tuner_priv;
4468
4469 u8 AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4470 u8 ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4471 int TableLen;
4472
4473 dprintk(1, "%s()\n", __func__);
4474
4475 mxl5005s_reset(fe);
4476
4477 /* Tuner initialization stage 0 */
4478 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
4479 AddrTable[0] = MASTER_CONTROL_ADDR;
4480 ByteTable[0] |= state->config->AgcMasterByte;
4481
4482 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, 1);
4483
4484 mxl5005s_AssignTunerMode(fe); // tunre_config
4485
4486 /* Tuner initialization stage 1 */
4487 MXL_GetInitRegister(fe, AddrTable, ByteTable, &TableLen);
4488
4489 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, TableLen);
4490
4491 return 0;
4492}
4493
4494int mxl5005s_AssignTunerMode(struct dvb_frontend *fe)
4495{
4496 struct mxl5005s_state *state = fe->tuner_priv;
4497 struct mxl5005s_config *c = state->config;
4498
4499 InitTunerControls(fe);
Steven Toth85d220d2008-05-01 05:48:14 -03004500
4501 /* Set MxL5005S parameters. */
Steven Toth85d220d2008-05-01 05:48:14 -03004502 MXL5005_TunerConfig(
4503 fe,
Steven Toth8c66a192008-05-01 06:35:48 -03004504 c->mod_mode,
4505 c->if_mode,
4506 MXL5005S_BANDWIDTH_6MHZ,
4507 c->if_freq,
4508 c->xtal_freq,
4509 c->agc_mode,
4510 c->top,
4511 c->output_load,
4512 c->clock_out,
4513 c->div_out,
4514 c->cap_select,
4515 c->rssi_enable,
4516 MXL_QAM,
4517 c->tracking_filter);
Steven Toth85d220d2008-05-01 05:48:14 -03004518
4519 return 0;
4520}
4521
4522static int mxl5005s_set_params(struct dvb_frontend *fe,
4523 struct dvb_frontend_parameters *params)
4524{
4525 u32 freq;
4526 u32 bw;
4527
4528 if (fe->ops.info.type == FE_OFDM)
4529 bw = params->u.ofdm.bandwidth;
4530 else
4531 bw = MXL5005S_BANDWIDTH_6MHZ;
4532
4533 freq = params->frequency; /* Hz */
4534 dprintk(1, "%s() freq=%d bw=%d\n", __func__, freq, bw);
4535
Steven Toth8c66a192008-05-01 06:35:48 -03004536 mxl5005s_SetRfFreqHz(fe, freq);
4537
4538 msleep(350);
4539
4540 return 0;
Steven Toth85d220d2008-05-01 05:48:14 -03004541}
4542
4543static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency)
4544{
4545 struct mxl5005s_state *state = fe->tuner_priv;
4546 dprintk(1, "%s()\n", __func__);
4547
4548 *frequency = state->RF_IN;
4549
4550 return 0;
4551}
4552
4553static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
4554{
4555 struct mxl5005s_state *state = fe->tuner_priv;
4556 dprintk(1, "%s()\n", __func__);
4557
4558 *bandwidth = state->Chan_Bandwidth;
4559
4560 return 0;
4561}
4562
4563static int mxl5005s_get_status(struct dvb_frontend *fe, u32 *status)
4564{
4565 dprintk(1, "%s()\n", __func__);
4566
4567 *status = 0;
4568 // *status = TUNER_STATUS_LOCKED;
4569
4570 return 0;
4571}
4572
Steven Toth85d220d2008-05-01 05:48:14 -03004573static int mxl5005s_release(struct dvb_frontend *fe)
4574{
4575 dprintk(1, "%s()\n", __func__);
4576 kfree(fe->tuner_priv);
4577 fe->tuner_priv = NULL;
4578 return 0;
4579}
4580
4581static const struct dvb_tuner_ops mxl5005s_tuner_ops = {
4582 .info = {
4583 .name = "MaxLinear MXL5005S",
4584 .frequency_min = 48000000,
4585 .frequency_max = 860000000,
4586 .frequency_step = 50000,
4587 },
4588
4589 .release = mxl5005s_release,
4590 .init = mxl5005s_init,
4591
4592 .set_params = mxl5005s_set_params,
4593 .get_frequency = mxl5005s_get_frequency,
4594 .get_bandwidth = mxl5005s_get_bandwidth,
4595 .get_status = mxl5005s_get_status
4596};
4597
4598struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe,
4599 struct i2c_adapter *i2c,
4600 struct mxl5005s_config *config)
4601{
4602 struct mxl5005s_state *state = NULL;
4603 dprintk(1, "%s()\n", __func__);
4604
4605 state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL);
4606 if (state == NULL)
4607 return NULL;
4608
4609 state->frontend = fe;
4610 state->config = config;
4611 state->i2c = i2c;
4612
4613 printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n", config->i2c_address);
4614
4615 memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops, sizeof(struct dvb_tuner_ops));
4616
4617 fe->tuner_priv = state;
4618 return fe;
4619}
4620EXPORT_SYMBOL(mxl5005s_attach);
4621
4622MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver");
4623MODULE_AUTHOR("Jan Hoogenraad");
4624MODULE_AUTHOR("Barnaby Shearer");
4625MODULE_AUTHOR("Andy Hasper");
4626MODULE_AUTHOR("Steven Toth");
4627MODULE_LICENSE("GPL");