blob: 21dca5bdca779a1e4384f5a9ed922e9331637909 [file] [log] [blame]
Steven Toth52c99bd2008-05-01 04:57:01 -03001/*
Steven Toth48937292008-05-01 07:15:38 -03002 MaxLinear MXL5005S VSB/QAM/DVBT tuner driver
Steven Toth7f5c3af2008-05-01 06:51:36 -03003
Steven Toth48937292008-05-01 07:15:38 -03004 Copyright (C) 2008 MaxLinear
5 Copyright (C) 2006 Steven Toth <stoth@hauppauge.com>
6 Functions:
7 mxl5005s_reset()
8 mxl5005s_writereg()
9 mxl5005s_writeregs()
10 mxl5005s_init()
11 mxl5005s_reconfigure()
12 mxl5005s_AssignTunerMode()
13 mxl5005s_set_params()
14 mxl5005s_get_frequency()
15 mxl5005s_get_bandwidth()
16 mxl5005s_release()
17 mxl5005s_attach()
18
19 Copyright (c) 2008 Realtek
20 Copyright (c) 2008 Jan Hoogenraad, Barnaby Shearer, Andy Hasper
21 Functions:
22 mxl5005s_SetRfFreqHz()
23
24 This program is free software; you can redistribute it and/or modify
25 it under the terms of the GNU General Public License as published by
26 the Free Software Foundation; either version 2 of the License, or
27 (at your option) any later version.
28
29 This program is distributed in the hope that it will be useful,
30 but WITHOUT ANY WARRANTY; without even the implied warranty of
31 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 GNU General Public License for more details.
33
34 You should have received a copy of the GNU General Public License
35 along with this program; if not, write to the Free Software
36 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
37
38*/
39
40/*
41 History of this driver (Steven Toth):
42 I was given a public release of a linux driver that included
43 support for the MaxLinear MXL5005S silicon tuner. Analysis of
44 the tuner driver showed clearly three things.
45
46 1. The tuner driver didn't support the LinuxTV tuner API
47 so the code Realtek added had to be removed.
48
49 2. A significant amount of the driver is reference driver code
50 from MaxLinear, I felt it was important to identify and
51 preserve this.
52
53 3. New code has to be added to interface correctly with the
54 LinuxTV API, as a regular kernel module.
55
56 Other than the reference driver enum's, I've clearly marked
57 sections of the code and retained the copyright of the
58 respective owners.
59*/
Steven Toth5c1b2052008-05-01 07:04:09 -030060#include <linux/kernel.h>
61#include <linux/init.h>
62#include <linux/module.h>
63#include <linux/string.h>
64#include <linux/slab.h>
65#include <linux/delay.h>
66#include "dvb_frontend.h"
Steven Toth2637d5b2008-05-01 05:01:31 -030067#include "mxl5005s.h"
Steven Toth52c99bd2008-05-01 04:57:01 -030068
Steven Toth48937292008-05-01 07:15:38 -030069static int debug = 2;
Steven Toth85d220d2008-05-01 05:48:14 -030070
71#define dprintk(level, arg...) do { \
Steven Toth48937292008-05-01 07:15:38 -030072 if (level <= debug) \
Steven Toth85d220d2008-05-01 05:48:14 -030073 printk(arg); \
74 } while (0)
75
76#define TUNER_REGS_NUM 104
77#define INITCTRL_NUM 40
78
79#ifdef _MXL_PRODUCTION
80#define CHCTRL_NUM 39
81#else
82#define CHCTRL_NUM 36
83#endif
84
85#define MXLCTRL_NUM 189
86#define MASTER_CONTROL_ADDR 9
87
Steven Toth85d220d2008-05-01 05:48:14 -030088/* Enumeration of Master Control Register State */
Steven Tothd211017b2008-05-01 19:35:54 -030089enum master_control_state {
Steven Toth85d220d2008-05-01 05:48:14 -030090 MC_LOAD_START = 1,
91 MC_POWER_DOWN,
92 MC_SYNTH_RESET,
93 MC_SEQ_OFF
Steven Tothd211017b2008-05-01 19:35:54 -030094};
Steven Toth85d220d2008-05-01 05:48:14 -030095
Steven Toth85d220d2008-05-01 05:48:14 -030096/* Enumeration of MXL5005 Tuner Modulation Type */
Steven Tothd211017b2008-05-01 19:35:54 -030097enum {
Steven Toth85d220d2008-05-01 05:48:14 -030098 MXL_DEFAULT_MODULATION = 0,
99 MXL_DVBT,
100 MXL_ATSC,
101 MXL_QAM,
102 MXL_ANALOG_CABLE,
103 MXL_ANALOG_OTA
Steven Tothd211017b2008-05-01 19:35:54 -0300104} tuner_modu_type;
Steven Toth85d220d2008-05-01 05:48:14 -0300105
Steven Toth85d220d2008-05-01 05:48:14 -0300106/* MXL5005 Tuner Register Struct */
Steven Tothd211017b2008-05-01 19:35:54 -0300107struct TunerReg {
Steven Toth85d220d2008-05-01 05:48:14 -0300108 u16 Reg_Num; /* Tuner Register Address */
Steven Tothd211017b2008-05-01 19:35:54 -0300109 u16 Reg_Val; /* Current sw programmed value waiting to be writen */
110};
Steven Toth85d220d2008-05-01 05:48:14 -0300111
Steven Tothd211017b2008-05-01 19:35:54 -0300112enum {
Steven Toth85d220d2008-05-01 05:48:14 -0300113 /* Initialization Control Names */
114 DN_IQTN_AMP_CUT = 1, /* 1 */
115 BB_MODE, /* 2 */
116 BB_BUF, /* 3 */
117 BB_BUF_OA, /* 4 */
118 BB_ALPF_BANDSELECT, /* 5 */
119 BB_IQSWAP, /* 6 */
120 BB_DLPF_BANDSEL, /* 7 */
121 RFSYN_CHP_GAIN, /* 8 */
122 RFSYN_EN_CHP_HIGAIN, /* 9 */
123 AGC_IF, /* 10 */
124 AGC_RF, /* 11 */
125 IF_DIVVAL, /* 12 */
126 IF_VCO_BIAS, /* 13 */
127 CHCAL_INT_MOD_IF, /* 14 */
128 CHCAL_FRAC_MOD_IF, /* 15 */
129 DRV_RES_SEL, /* 16 */
130 I_DRIVER, /* 17 */
131 EN_AAF, /* 18 */
132 EN_3P, /* 19 */
133 EN_AUX_3P, /* 20 */
134 SEL_AAF_BAND, /* 21 */
135 SEQ_ENCLK16_CLK_OUT, /* 22 */
136 SEQ_SEL4_16B, /* 23 */
137 XTAL_CAPSELECT, /* 24 */
138 IF_SEL_DBL, /* 25 */
139 RFSYN_R_DIV, /* 26 */
140 SEQ_EXTSYNTHCALIF, /* 27 */
141 SEQ_EXTDCCAL, /* 28 */
142 AGC_EN_RSSI, /* 29 */
143 RFA_ENCLKRFAGC, /* 30 */
144 RFA_RSSI_REFH, /* 31 */
145 RFA_RSSI_REF, /* 32 */
146 RFA_RSSI_REFL, /* 33 */
147 RFA_FLR, /* 34 */
148 RFA_CEIL, /* 35 */
149 SEQ_EXTIQFSMPULSE, /* 36 */
150 OVERRIDE_1, /* 37 */
151 BB_INITSTATE_DLPF_TUNE, /* 38 */
152 TG_R_DIV, /* 39 */
153 EN_CHP_LIN_B, /* 40 */
154
155 /* Channel Change Control Names */
156 DN_POLY = 51, /* 51 */
157 DN_RFGAIN, /* 52 */
158 DN_CAP_RFLPF, /* 53 */
159 DN_EN_VHFUHFBAR, /* 54 */
160 DN_GAIN_ADJUST, /* 55 */
161 DN_IQTNBUF_AMP, /* 56 */
162 DN_IQTNGNBFBIAS_BST, /* 57 */
163 RFSYN_EN_OUTMUX, /* 58 */
164 RFSYN_SEL_VCO_OUT, /* 59 */
165 RFSYN_SEL_VCO_HI, /* 60 */
166 RFSYN_SEL_DIVM, /* 61 */
167 RFSYN_RF_DIV_BIAS, /* 62 */
168 DN_SEL_FREQ, /* 63 */
169 RFSYN_VCO_BIAS, /* 64 */
170 CHCAL_INT_MOD_RF, /* 65 */
171 CHCAL_FRAC_MOD_RF, /* 66 */
172 RFSYN_LPF_R, /* 67 */
173 CHCAL_EN_INT_RF, /* 68 */
174 TG_LO_DIVVAL, /* 69 */
175 TG_LO_SELVAL, /* 70 */
176 TG_DIV_VAL, /* 71 */
177 TG_VCO_BIAS, /* 72 */
178 SEQ_EXTPOWERUP, /* 73 */
179 OVERRIDE_2, /* 74 */
180 OVERRIDE_3, /* 75 */
181 OVERRIDE_4, /* 76 */
182 SEQ_FSM_PULSE, /* 77 */
183 GPIO_4B, /* 78 */
184 GPIO_3B, /* 79 */
185 GPIO_4, /* 80 */
186 GPIO_3, /* 81 */
187 GPIO_1B, /* 82 */
188 DAC_A_ENABLE, /* 83 */
189 DAC_B_ENABLE, /* 84 */
190 DAC_DIN_A, /* 85 */
191 DAC_DIN_B, /* 86 */
192#ifdef _MXL_PRODUCTION
193 RFSYN_EN_DIV, /* 87 */
194 RFSYN_DIVM, /* 88 */
195 DN_BYPASS_AGC_I2C /* 89 */
196#endif
197} MXL5005_ControlName;
198
199/*
200 * The following context is source code provided by MaxLinear.
201 * MaxLinear source code - Common_MXL.h (?)
202 */
203
204/* Constants */
205#define MXL5005S_REG_WRITING_TABLE_LEN_MAX 104
206#define MXL5005S_LATCH_BYTE 0xfe
207
208/* Register address, MSB, and LSB */
209#define MXL5005S_BB_IQSWAP_ADDR 59
210#define MXL5005S_BB_IQSWAP_MSB 0
211#define MXL5005S_BB_IQSWAP_LSB 0
212
213#define MXL5005S_BB_DLPF_BANDSEL_ADDR 53
214#define MXL5005S_BB_DLPF_BANDSEL_MSB 4
215#define MXL5005S_BB_DLPF_BANDSEL_LSB 3
216
217/* Standard modes */
Steven Tothd211017b2008-05-01 19:35:54 -0300218enum {
Steven Toth85d220d2008-05-01 05:48:14 -0300219 MXL5005S_STANDARD_DVBT,
220 MXL5005S_STANDARD_ATSC,
221};
222#define MXL5005S_STANDARD_MODE_NUM 2
223
224/* Bandwidth modes */
Steven Tothd211017b2008-05-01 19:35:54 -0300225enum {
Steven Toth85d220d2008-05-01 05:48:14 -0300226 MXL5005S_BANDWIDTH_6MHZ = 6000000,
227 MXL5005S_BANDWIDTH_7MHZ = 7000000,
228 MXL5005S_BANDWIDTH_8MHZ = 8000000,
229};
230#define MXL5005S_BANDWIDTH_MODE_NUM 3
231
Steven Toth3935c252008-05-01 05:45:44 -0300232/* MXL5005 Tuner Control Struct */
Steven Tothd211017b2008-05-01 19:35:54 -0300233struct TunerControl {
Steven Toth3935c252008-05-01 05:45:44 -0300234 u16 Ctrl_Num; /* Control Number */
235 u16 size; /* Number of bits to represent Value */
Steven Tothd211017b2008-05-01 19:35:54 -0300236 u16 addr[25]; /* Array of Tuner Register Address for each bit pos */
237 u16 bit[25]; /* Array of bit pos in Reg Addr for each bit pos */
Steven Toth3935c252008-05-01 05:45:44 -0300238 u16 val[25]; /* Binary representation of Value */
Steven Tothd211017b2008-05-01 19:35:54 -0300239};
Steven Toth52c99bd2008-05-01 04:57:01 -0300240
Steven Toth3935c252008-05-01 05:45:44 -0300241/* MXL5005 Tuner Struct */
Steven Tothd211017b2008-05-01 19:35:54 -0300242struct mxl5005s_state {
Steven Toth3935c252008-05-01 05:45:44 -0300243 u8 Mode; /* 0: Analog Mode ; 1: Digital Mode */
244 u8 IF_Mode; /* for Analog Mode, 0: zero IF; 1: low IF */
245 u32 Chan_Bandwidth; /* filter channel bandwidth (6, 7, 8) */
246 u32 IF_OUT; /* Desired IF Out Frequency */
247 u16 IF_OUT_LOAD; /* IF Out Load Resistor (200/300 Ohms) */
248 u32 RF_IN; /* RF Input Frequency */
249 u32 Fxtal; /* XTAL Frequency */
250 u8 AGC_Mode; /* AGC Mode 0: Dual AGC; 1: Single AGC */
251 u16 TOP; /* Value: take over point */
Steven Tothd211017b2008-05-01 19:35:54 -0300252 u8 CLOCK_OUT; /* 0: turn off clk out; 1: turn on clock out */
Steven Toth3935c252008-05-01 05:45:44 -0300253 u8 DIV_OUT; /* 4MHz or 16MHz */
254 u8 CAPSELECT; /* 0: disable On-Chip pulling cap; 1: enable */
255 u8 EN_RSSI; /* 0: disable RSSI; 1: enable RSSI */
Steven Tothd211017b2008-05-01 19:35:54 -0300256
257 /* Modulation Type; */
258 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
259 u8 Mod_Type;
260
261 /* Tracking Filter Type */
262 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
263 u8 TF_Type;
Steven Toth52c99bd2008-05-01 04:57:01 -0300264
Steven Toth3935c252008-05-01 05:45:44 -0300265 /* Calculated Settings */
266 u32 RF_LO; /* Synth RF LO Frequency */
267 u32 IF_LO; /* Synth IF LO Frequency */
268 u32 TG_LO; /* Synth TG_LO Frequency */
Steven Toth52c99bd2008-05-01 04:57:01 -0300269
Steven Toth3935c252008-05-01 05:45:44 -0300270 /* Pointers to ControlName Arrays */
Steven Tothd211017b2008-05-01 19:35:54 -0300271 u16 Init_Ctrl_Num; /* Number of INIT Control Names */
272 struct TunerControl
273 Init_Ctrl[INITCTRL_NUM]; /* INIT Control Names Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300274
Steven Tothd211017b2008-05-01 19:35:54 -0300275 u16 CH_Ctrl_Num; /* Number of CH Control Names */
276 struct TunerControl
277 CH_Ctrl[CHCTRL_NUM]; /* CH Control Name Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300278
Steven Tothd211017b2008-05-01 19:35:54 -0300279 u16 MXL_Ctrl_Num; /* Number of MXL Control Names */
280 struct TunerControl
281 MXL_Ctrl[MXLCTRL_NUM]; /* MXL Control Name Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300282
Steven Toth3935c252008-05-01 05:45:44 -0300283 /* Pointer to Tuner Register Array */
Steven Tothd211017b2008-05-01 19:35:54 -0300284 u16 TunerRegs_Num; /* Number of Tuner Registers */
285 struct TunerReg
286 TunerRegs[TUNER_REGS_NUM]; /* Tuner Register Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300287
Steven Toth85d220d2008-05-01 05:48:14 -0300288 /* Linux driver framework specific */
Steven Toth48937292008-05-01 07:15:38 -0300289 struct mxl5005s_config *config;
Steven Toth85d220d2008-05-01 05:48:14 -0300290 struct dvb_frontend *frontend;
291 struct i2c_adapter *i2c;
Steven Toth48937292008-05-01 07:15:38 -0300292
293 /* Cache values */
294 u32 current_mode;
295
Steven Toth3935c252008-05-01 05:45:44 -0300296};
Steven Toth52c99bd2008-05-01 04:57:01 -0300297
Steven Toth85d220d2008-05-01 05:48:14 -0300298u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value);
299u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value);
300u16 MXL_GetMasterControl(u8 *MasterReg, int state);
301void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal);
Steven Tothd211017b2008-05-01 19:35:54 -0300302u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum,
303 u8 *RegVal, int *count);
Steven Toth85d220d2008-05-01 05:48:14 -0300304u32 MXL_Ceiling(u32 value, u32 resolution);
305u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal);
306u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal);
Steven Tothd211017b2008-05-01 19:35:54 -0300307u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum,
308 u32 value, u16 controlGroup);
Steven Toth85d220d2008-05-01 05:48:14 -0300309u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val);
Steven Tothd211017b2008-05-01 19:35:54 -0300310u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
311 u8 *RegVal, int *count);
Steven Toth85d220d2008-05-01 05:48:14 -0300312u32 MXL_GetXtalInt(u32 Xtal_Freq);
313u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq);
314void MXL_SynthIFLO_Calc(struct dvb_frontend *fe);
315void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe);
Steven Tothd211017b2008-05-01 19:35:54 -0300316u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,
317 u8 *RegVal, int *count);
318int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable,
319 u8 *datatable, u8 len);
Steven Toth85d220d2008-05-01 05:48:14 -0300320u16 MXL_IFSynthInit(struct dvb_frontend *fe);
Steven Tothd211017b2008-05-01 19:35:54 -0300321int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,
322 u32 bandwidth);
Steven Toth48937292008-05-01 07:15:38 -0300323int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type, u32 bandwidth);
324
325/* ----------------------------------------------------------------
326 * Begin: Custom code salvaged from the Realtek driver.
327 * Copyright (c) 2008 Realtek
328 * Copyright (c) 2008 Jan Hoogenraad, Barnaby Shearer, Andy Hasper
329 * This code is placed under the terms of the GNU General Public License
330 *
331 * Released by Realtek under GPLv2.
332 * Thanks to Realtek for a lot of support we received !
333 *
334 * Revision: 080314 - original version
335 */
Steven Toth52c99bd2008-05-01 04:57:01 -0300336
Steven Toth85d220d2008-05-01 05:48:14 -0300337int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz)
Steven Toth52c99bd2008-05-01 04:57:01 -0300338{
Steven Toth85d220d2008-05-01 05:48:14 -0300339 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -0300340 unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
341 unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
342 int TableLen;
343
Steven Toth85d220d2008-05-01 05:48:14 -0300344 u32 IfDivval;
Steven Toth52c99bd2008-05-01 04:57:01 -0300345 unsigned char MasterControlByte;
346
Steven Toth85d220d2008-05-01 05:48:14 -0300347 dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300348
Steven Tothd211017b2008-05-01 19:35:54 -0300349 /* Set MxL5005S tuner RF frequency according to example code. */
Steven Toth52c99bd2008-05-01 04:57:01 -0300350
Steven Tothd211017b2008-05-01 19:35:54 -0300351 /* Tuner RF frequency setting stage 0 */
352 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
Steven Toth52c99bd2008-05-01 04:57:01 -0300353 AddrTable[0] = MASTER_CONTROL_ADDR;
Steven Toth85d220d2008-05-01 05:48:14 -0300354 ByteTable[0] |= state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300355
Steven Toth48937292008-05-01 07:15:38 -0300356 mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300357
Steven Tothd211017b2008-05-01 19:35:54 -0300358 /* Tuner RF frequency setting stage 1 */
Steven Toth85d220d2008-05-01 05:48:14 -0300359 MXL_TuneRF(fe, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300360
Steven Toth85d220d2008-05-01 05:48:14 -0300361 MXL_ControlRead(fe, IF_DIVVAL, &IfDivval);
Steven Toth52c99bd2008-05-01 04:57:01 -0300362
Steven Toth85d220d2008-05-01 05:48:14 -0300363 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0);
364 MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1);
365 MXL_ControlWrite(fe, IF_DIVVAL, 8);
Steven Tothd211017b2008-05-01 19:35:54 -0300366 MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300367
Steven Tothd211017b2008-05-01 19:35:54 -0300368 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);
Steven Toth52c99bd2008-05-01 04:57:01 -0300369 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Tothd211017b2008-05-01 19:35:54 -0300370 ByteTable[TableLen] = MasterControlByte |
371 state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300372 TableLen += 1;
373
Steven Toth48937292008-05-01 07:15:38 -0300374 mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300375
Steven Tothd211017b2008-05-01 19:35:54 -0300376 /* Wait 30 ms. */
Steven Toth48937292008-05-01 07:15:38 -0300377 msleep(150);
Steven Toth52c99bd2008-05-01 04:57:01 -0300378
Steven Tothd211017b2008-05-01 19:35:54 -0300379 /* Tuner RF frequency setting stage 2 */
380 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1);
381 MXL_ControlWrite(fe, IF_DIVVAL, IfDivval);
382 MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300383
Steven Tothd211017b2008-05-01 19:35:54 -0300384 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);
Steven Toth52c99bd2008-05-01 04:57:01 -0300385 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Tothd211017b2008-05-01 19:35:54 -0300386 ByteTable[TableLen] = MasterControlByte |
387 state->config->AgcMasterByte ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300388 TableLen += 1;
389
Steven Toth48937292008-05-01 07:15:38 -0300390 mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
391
392 msleep(100);
Steven Toth8c66a192008-05-01 06:35:48 -0300393
Steven Toth85d220d2008-05-01 05:48:14 -0300394 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300395}
Steven Toth48937292008-05-01 07:15:38 -0300396/* End: Custom code taken from the Realtek driver */
Steven Toth52c99bd2008-05-01 04:57:01 -0300397
Steven Toth48937292008-05-01 07:15:38 -0300398/* ----------------------------------------------------------------
399 * Begin: Reference driver code found in the Realtek driver.
400 * Copyright (c) 2008 MaxLinear
401 */
Steven Toth3935c252008-05-01 05:45:44 -0300402u16 MXL5005_RegisterInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300403{
Steven Toth85d220d2008-05-01 05:48:14 -0300404 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300405 state->TunerRegs_Num = TUNER_REGS_NUM ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300406
Steven Toth3935c252008-05-01 05:45:44 -0300407 state->TunerRegs[0].Reg_Num = 9 ;
408 state->TunerRegs[0].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300409
Steven Toth3935c252008-05-01 05:45:44 -0300410 state->TunerRegs[1].Reg_Num = 11 ;
411 state->TunerRegs[1].Reg_Val = 0x19 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300412
Steven Toth3935c252008-05-01 05:45:44 -0300413 state->TunerRegs[2].Reg_Num = 12 ;
414 state->TunerRegs[2].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300415
Steven Toth3935c252008-05-01 05:45:44 -0300416 state->TunerRegs[3].Reg_Num = 13 ;
417 state->TunerRegs[3].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300418
Steven Toth3935c252008-05-01 05:45:44 -0300419 state->TunerRegs[4].Reg_Num = 14 ;
420 state->TunerRegs[4].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300421
Steven Toth3935c252008-05-01 05:45:44 -0300422 state->TunerRegs[5].Reg_Num = 15 ;
423 state->TunerRegs[5].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300424
Steven Toth3935c252008-05-01 05:45:44 -0300425 state->TunerRegs[6].Reg_Num = 16 ;
426 state->TunerRegs[6].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300427
Steven Toth3935c252008-05-01 05:45:44 -0300428 state->TunerRegs[7].Reg_Num = 17 ;
429 state->TunerRegs[7].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300430
Steven Toth3935c252008-05-01 05:45:44 -0300431 state->TunerRegs[8].Reg_Num = 18 ;
432 state->TunerRegs[8].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300433
Steven Toth3935c252008-05-01 05:45:44 -0300434 state->TunerRegs[9].Reg_Num = 19 ;
435 state->TunerRegs[9].Reg_Val = 0x34 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300436
Steven Toth3935c252008-05-01 05:45:44 -0300437 state->TunerRegs[10].Reg_Num = 21 ;
438 state->TunerRegs[10].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300439
Steven Toth3935c252008-05-01 05:45:44 -0300440 state->TunerRegs[11].Reg_Num = 22 ;
441 state->TunerRegs[11].Reg_Val = 0x6B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300442
Steven Toth3935c252008-05-01 05:45:44 -0300443 state->TunerRegs[12].Reg_Num = 23 ;
444 state->TunerRegs[12].Reg_Val = 0x35 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300445
Steven Toth3935c252008-05-01 05:45:44 -0300446 state->TunerRegs[13].Reg_Num = 24 ;
447 state->TunerRegs[13].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300448
Steven Toth3935c252008-05-01 05:45:44 -0300449 state->TunerRegs[14].Reg_Num = 25 ;
450 state->TunerRegs[14].Reg_Val = 0x3E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300451
Steven Toth3935c252008-05-01 05:45:44 -0300452 state->TunerRegs[15].Reg_Num = 26 ;
453 state->TunerRegs[15].Reg_Val = 0x82 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300454
Steven Toth3935c252008-05-01 05:45:44 -0300455 state->TunerRegs[16].Reg_Num = 31 ;
456 state->TunerRegs[16].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300457
Steven Toth3935c252008-05-01 05:45:44 -0300458 state->TunerRegs[17].Reg_Num = 32 ;
459 state->TunerRegs[17].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300460
Steven Toth3935c252008-05-01 05:45:44 -0300461 state->TunerRegs[18].Reg_Num = 33 ;
462 state->TunerRegs[18].Reg_Val = 0x53 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300463
Steven Toth3935c252008-05-01 05:45:44 -0300464 state->TunerRegs[19].Reg_Num = 34 ;
465 state->TunerRegs[19].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300466
Steven Toth3935c252008-05-01 05:45:44 -0300467 state->TunerRegs[20].Reg_Num = 35 ;
468 state->TunerRegs[20].Reg_Val = 0xC9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300469
Steven Toth3935c252008-05-01 05:45:44 -0300470 state->TunerRegs[21].Reg_Num = 36 ;
471 state->TunerRegs[21].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300472
Steven Toth3935c252008-05-01 05:45:44 -0300473 state->TunerRegs[22].Reg_Num = 37 ;
474 state->TunerRegs[22].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300475
Steven Toth3935c252008-05-01 05:45:44 -0300476 state->TunerRegs[23].Reg_Num = 41 ;
477 state->TunerRegs[23].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300478
Steven Toth3935c252008-05-01 05:45:44 -0300479 state->TunerRegs[24].Reg_Num = 42 ;
480 state->TunerRegs[24].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300481
Steven Toth3935c252008-05-01 05:45:44 -0300482 state->TunerRegs[25].Reg_Num = 43 ;
483 state->TunerRegs[25].Reg_Val = 0x43 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300484
Steven Toth3935c252008-05-01 05:45:44 -0300485 state->TunerRegs[26].Reg_Num = 44 ;
486 state->TunerRegs[26].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300487
Steven Toth3935c252008-05-01 05:45:44 -0300488 state->TunerRegs[27].Reg_Num = 45 ;
489 state->TunerRegs[27].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300490
Steven Toth3935c252008-05-01 05:45:44 -0300491 state->TunerRegs[28].Reg_Num = 46 ;
492 state->TunerRegs[28].Reg_Val = 0x88 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300493
Steven Toth3935c252008-05-01 05:45:44 -0300494 state->TunerRegs[29].Reg_Num = 47 ;
495 state->TunerRegs[29].Reg_Val = 0x86 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300496
Steven Toth3935c252008-05-01 05:45:44 -0300497 state->TunerRegs[30].Reg_Num = 48 ;
498 state->TunerRegs[30].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300499
Steven Toth3935c252008-05-01 05:45:44 -0300500 state->TunerRegs[31].Reg_Num = 49 ;
501 state->TunerRegs[31].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300502
Steven Toth3935c252008-05-01 05:45:44 -0300503 state->TunerRegs[32].Reg_Num = 53 ;
504 state->TunerRegs[32].Reg_Val = 0x94 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300505
Steven Toth3935c252008-05-01 05:45:44 -0300506 state->TunerRegs[33].Reg_Num = 54 ;
507 state->TunerRegs[33].Reg_Val = 0xFA ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300508
Steven Toth3935c252008-05-01 05:45:44 -0300509 state->TunerRegs[34].Reg_Num = 55 ;
510 state->TunerRegs[34].Reg_Val = 0x92 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300511
Steven Toth3935c252008-05-01 05:45:44 -0300512 state->TunerRegs[35].Reg_Num = 56 ;
513 state->TunerRegs[35].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300514
Steven Toth3935c252008-05-01 05:45:44 -0300515 state->TunerRegs[36].Reg_Num = 57 ;
516 state->TunerRegs[36].Reg_Val = 0x41 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300517
Steven Toth3935c252008-05-01 05:45:44 -0300518 state->TunerRegs[37].Reg_Num = 58 ;
519 state->TunerRegs[37].Reg_Val = 0xDB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300520
Steven Toth3935c252008-05-01 05:45:44 -0300521 state->TunerRegs[38].Reg_Num = 59 ;
522 state->TunerRegs[38].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300523
Steven Toth3935c252008-05-01 05:45:44 -0300524 state->TunerRegs[39].Reg_Num = 60 ;
525 state->TunerRegs[39].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300526
Steven Toth3935c252008-05-01 05:45:44 -0300527 state->TunerRegs[40].Reg_Num = 61 ;
528 state->TunerRegs[40].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300529
Steven Toth3935c252008-05-01 05:45:44 -0300530 state->TunerRegs[41].Reg_Num = 62 ;
531 state->TunerRegs[41].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300532
Steven Toth3935c252008-05-01 05:45:44 -0300533 state->TunerRegs[42].Reg_Num = 65 ;
534 state->TunerRegs[42].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300535
Steven Toth3935c252008-05-01 05:45:44 -0300536 state->TunerRegs[43].Reg_Num = 66 ;
537 state->TunerRegs[43].Reg_Val = 0xE4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300538
Steven Toth3935c252008-05-01 05:45:44 -0300539 state->TunerRegs[44].Reg_Num = 67 ;
540 state->TunerRegs[44].Reg_Val = 0x90 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300541
Steven Toth3935c252008-05-01 05:45:44 -0300542 state->TunerRegs[45].Reg_Num = 68 ;
543 state->TunerRegs[45].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300544
Steven Toth3935c252008-05-01 05:45:44 -0300545 state->TunerRegs[46].Reg_Num = 69 ;
546 state->TunerRegs[46].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300547
Steven Toth3935c252008-05-01 05:45:44 -0300548 state->TunerRegs[47].Reg_Num = 70 ;
549 state->TunerRegs[47].Reg_Val = 0x50 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300550
Steven Toth3935c252008-05-01 05:45:44 -0300551 state->TunerRegs[48].Reg_Num = 71 ;
552 state->TunerRegs[48].Reg_Val = 0x06 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300553
Steven Toth3935c252008-05-01 05:45:44 -0300554 state->TunerRegs[49].Reg_Num = 72 ;
555 state->TunerRegs[49].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300556
Steven Toth3935c252008-05-01 05:45:44 -0300557 state->TunerRegs[50].Reg_Num = 73 ;
558 state->TunerRegs[50].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300559
Steven Toth3935c252008-05-01 05:45:44 -0300560 state->TunerRegs[51].Reg_Num = 76 ;
561 state->TunerRegs[51].Reg_Val = 0xBB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300562
Steven Toth3935c252008-05-01 05:45:44 -0300563 state->TunerRegs[52].Reg_Num = 77 ;
564 state->TunerRegs[52].Reg_Val = 0x13 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300565
Steven Toth3935c252008-05-01 05:45:44 -0300566 state->TunerRegs[53].Reg_Num = 81 ;
567 state->TunerRegs[53].Reg_Val = 0x04 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300568
Steven Toth3935c252008-05-01 05:45:44 -0300569 state->TunerRegs[54].Reg_Num = 82 ;
570 state->TunerRegs[54].Reg_Val = 0x75 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300571
Steven Toth3935c252008-05-01 05:45:44 -0300572 state->TunerRegs[55].Reg_Num = 83 ;
573 state->TunerRegs[55].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300574
Steven Toth3935c252008-05-01 05:45:44 -0300575 state->TunerRegs[56].Reg_Num = 84 ;
576 state->TunerRegs[56].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300577
Steven Toth3935c252008-05-01 05:45:44 -0300578 state->TunerRegs[57].Reg_Num = 85 ;
579 state->TunerRegs[57].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300580
Steven Toth3935c252008-05-01 05:45:44 -0300581 state->TunerRegs[58].Reg_Num = 91 ;
582 state->TunerRegs[58].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300583
Steven Toth3935c252008-05-01 05:45:44 -0300584 state->TunerRegs[59].Reg_Num = 92 ;
585 state->TunerRegs[59].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300586
Steven Toth3935c252008-05-01 05:45:44 -0300587 state->TunerRegs[60].Reg_Num = 93 ;
588 state->TunerRegs[60].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300589
Steven Toth3935c252008-05-01 05:45:44 -0300590 state->TunerRegs[61].Reg_Num = 94 ;
591 state->TunerRegs[61].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300592
Steven Toth3935c252008-05-01 05:45:44 -0300593 state->TunerRegs[62].Reg_Num = 95 ;
594 state->TunerRegs[62].Reg_Val = 0x0C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300595
Steven Toth3935c252008-05-01 05:45:44 -0300596 state->TunerRegs[63].Reg_Num = 96 ;
597 state->TunerRegs[63].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300598
Steven Toth3935c252008-05-01 05:45:44 -0300599 state->TunerRegs[64].Reg_Num = 97 ;
600 state->TunerRegs[64].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300601
Steven Toth3935c252008-05-01 05:45:44 -0300602 state->TunerRegs[65].Reg_Num = 98 ;
603 state->TunerRegs[65].Reg_Val = 0xE2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300604
Steven Toth3935c252008-05-01 05:45:44 -0300605 state->TunerRegs[66].Reg_Num = 99 ;
606 state->TunerRegs[66].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300607
Steven Toth3935c252008-05-01 05:45:44 -0300608 state->TunerRegs[67].Reg_Num = 100 ;
609 state->TunerRegs[67].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300610
Steven Toth3935c252008-05-01 05:45:44 -0300611 state->TunerRegs[68].Reg_Num = 101 ;
612 state->TunerRegs[68].Reg_Val = 0x12 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300613
Steven Toth3935c252008-05-01 05:45:44 -0300614 state->TunerRegs[69].Reg_Num = 102 ;
615 state->TunerRegs[69].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300616
Steven Toth3935c252008-05-01 05:45:44 -0300617 state->TunerRegs[70].Reg_Num = 103 ;
618 state->TunerRegs[70].Reg_Val = 0x32 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300619
Steven Toth3935c252008-05-01 05:45:44 -0300620 state->TunerRegs[71].Reg_Num = 104 ;
621 state->TunerRegs[71].Reg_Val = 0xB4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300622
Steven Toth3935c252008-05-01 05:45:44 -0300623 state->TunerRegs[72].Reg_Num = 105 ;
624 state->TunerRegs[72].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300625
Steven Toth3935c252008-05-01 05:45:44 -0300626 state->TunerRegs[73].Reg_Num = 106 ;
627 state->TunerRegs[73].Reg_Val = 0x83 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300628
Steven Toth3935c252008-05-01 05:45:44 -0300629 state->TunerRegs[74].Reg_Num = 107 ;
630 state->TunerRegs[74].Reg_Val = 0x84 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300631
Steven Toth3935c252008-05-01 05:45:44 -0300632 state->TunerRegs[75].Reg_Num = 108 ;
633 state->TunerRegs[75].Reg_Val = 0x9C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300634
Steven Toth3935c252008-05-01 05:45:44 -0300635 state->TunerRegs[76].Reg_Num = 109 ;
636 state->TunerRegs[76].Reg_Val = 0x02 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300637
Steven Toth3935c252008-05-01 05:45:44 -0300638 state->TunerRegs[77].Reg_Num = 110 ;
639 state->TunerRegs[77].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300640
Steven Toth3935c252008-05-01 05:45:44 -0300641 state->TunerRegs[78].Reg_Num = 111 ;
642 state->TunerRegs[78].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300643
Steven Toth3935c252008-05-01 05:45:44 -0300644 state->TunerRegs[79].Reg_Num = 112 ;
645 state->TunerRegs[79].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300646
Steven Toth3935c252008-05-01 05:45:44 -0300647 state->TunerRegs[80].Reg_Num = 131 ;
648 state->TunerRegs[80].Reg_Val = 0x8A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300649
Steven Toth3935c252008-05-01 05:45:44 -0300650 state->TunerRegs[81].Reg_Num = 132 ;
651 state->TunerRegs[81].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300652
Steven Toth3935c252008-05-01 05:45:44 -0300653 state->TunerRegs[82].Reg_Num = 133 ;
654 state->TunerRegs[82].Reg_Val = 0x24 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300655
Steven Toth3935c252008-05-01 05:45:44 -0300656 state->TunerRegs[83].Reg_Num = 134 ;
657 state->TunerRegs[83].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300658
Steven Toth3935c252008-05-01 05:45:44 -0300659 state->TunerRegs[84].Reg_Num = 135 ;
660 state->TunerRegs[84].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300661
Steven Toth3935c252008-05-01 05:45:44 -0300662 state->TunerRegs[85].Reg_Num = 136 ;
663 state->TunerRegs[85].Reg_Val = 0x7E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300664
Steven Toth3935c252008-05-01 05:45:44 -0300665 state->TunerRegs[86].Reg_Num = 137 ;
666 state->TunerRegs[86].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300667
Steven Toth3935c252008-05-01 05:45:44 -0300668 state->TunerRegs[87].Reg_Num = 138 ;
669 state->TunerRegs[87].Reg_Val = 0x38 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300670
Steven Toth3935c252008-05-01 05:45:44 -0300671 state->TunerRegs[88].Reg_Num = 146 ;
672 state->TunerRegs[88].Reg_Val = 0xF6 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300673
Steven Toth3935c252008-05-01 05:45:44 -0300674 state->TunerRegs[89].Reg_Num = 147 ;
675 state->TunerRegs[89].Reg_Val = 0x1A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300676
Steven Toth3935c252008-05-01 05:45:44 -0300677 state->TunerRegs[90].Reg_Num = 148 ;
678 state->TunerRegs[90].Reg_Val = 0x62 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300679
Steven Toth3935c252008-05-01 05:45:44 -0300680 state->TunerRegs[91].Reg_Num = 149 ;
681 state->TunerRegs[91].Reg_Val = 0x33 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300682
Steven Toth3935c252008-05-01 05:45:44 -0300683 state->TunerRegs[92].Reg_Num = 150 ;
684 state->TunerRegs[92].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300685
Steven Toth3935c252008-05-01 05:45:44 -0300686 state->TunerRegs[93].Reg_Num = 156 ;
687 state->TunerRegs[93].Reg_Val = 0x56 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300688
Steven Toth3935c252008-05-01 05:45:44 -0300689 state->TunerRegs[94].Reg_Num = 157 ;
690 state->TunerRegs[94].Reg_Val = 0x17 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300691
Steven Toth3935c252008-05-01 05:45:44 -0300692 state->TunerRegs[95].Reg_Num = 158 ;
693 state->TunerRegs[95].Reg_Val = 0xA9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300694
Steven Toth3935c252008-05-01 05:45:44 -0300695 state->TunerRegs[96].Reg_Num = 159 ;
696 state->TunerRegs[96].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300697
Steven Toth3935c252008-05-01 05:45:44 -0300698 state->TunerRegs[97].Reg_Num = 160 ;
699 state->TunerRegs[97].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300700
Steven Toth3935c252008-05-01 05:45:44 -0300701 state->TunerRegs[98].Reg_Num = 161 ;
702 state->TunerRegs[98].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300703
Steven Toth3935c252008-05-01 05:45:44 -0300704 state->TunerRegs[99].Reg_Num = 162 ;
705 state->TunerRegs[99].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300706
Steven Toth3935c252008-05-01 05:45:44 -0300707 state->TunerRegs[100].Reg_Num = 166 ;
708 state->TunerRegs[100].Reg_Val = 0xAE ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300709
Steven Toth3935c252008-05-01 05:45:44 -0300710 state->TunerRegs[101].Reg_Num = 167 ;
711 state->TunerRegs[101].Reg_Val = 0x1B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300712
Steven Toth3935c252008-05-01 05:45:44 -0300713 state->TunerRegs[102].Reg_Num = 168 ;
714 state->TunerRegs[102].Reg_Val = 0xF2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300715
Steven Toth3935c252008-05-01 05:45:44 -0300716 state->TunerRegs[103].Reg_Num = 195 ;
717 state->TunerRegs[103].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300718
719 return 0 ;
720}
721
Steven Toth3935c252008-05-01 05:45:44 -0300722u16 MXL5005_ControlInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300723{
Steven Toth85d220d2008-05-01 05:48:14 -0300724 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300725 state->Init_Ctrl_Num = INITCTRL_NUM;
Steven Toth52c99bd2008-05-01 04:57:01 -0300726
Steven Toth3935c252008-05-01 05:45:44 -0300727 state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;
728 state->Init_Ctrl[0].size = 1 ;
729 state->Init_Ctrl[0].addr[0] = 73;
730 state->Init_Ctrl[0].bit[0] = 7;
731 state->Init_Ctrl[0].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300732
Steven Toth3935c252008-05-01 05:45:44 -0300733 state->Init_Ctrl[1].Ctrl_Num = BB_MODE ;
734 state->Init_Ctrl[1].size = 1 ;
735 state->Init_Ctrl[1].addr[0] = 53;
736 state->Init_Ctrl[1].bit[0] = 2;
737 state->Init_Ctrl[1].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300738
Steven Toth3935c252008-05-01 05:45:44 -0300739 state->Init_Ctrl[2].Ctrl_Num = BB_BUF ;
740 state->Init_Ctrl[2].size = 2 ;
741 state->Init_Ctrl[2].addr[0] = 53;
742 state->Init_Ctrl[2].bit[0] = 1;
743 state->Init_Ctrl[2].val[0] = 0;
744 state->Init_Ctrl[2].addr[1] = 57;
745 state->Init_Ctrl[2].bit[1] = 0;
746 state->Init_Ctrl[2].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300747
Steven Toth3935c252008-05-01 05:45:44 -0300748 state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;
749 state->Init_Ctrl[3].size = 1 ;
750 state->Init_Ctrl[3].addr[0] = 53;
751 state->Init_Ctrl[3].bit[0] = 0;
752 state->Init_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300753
Steven Toth3935c252008-05-01 05:45:44 -0300754 state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;
755 state->Init_Ctrl[4].size = 3 ;
756 state->Init_Ctrl[4].addr[0] = 53;
757 state->Init_Ctrl[4].bit[0] = 5;
758 state->Init_Ctrl[4].val[0] = 0;
759 state->Init_Ctrl[4].addr[1] = 53;
760 state->Init_Ctrl[4].bit[1] = 6;
761 state->Init_Ctrl[4].val[1] = 0;
762 state->Init_Ctrl[4].addr[2] = 53;
763 state->Init_Ctrl[4].bit[2] = 7;
764 state->Init_Ctrl[4].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300765
Steven Toth3935c252008-05-01 05:45:44 -0300766 state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;
767 state->Init_Ctrl[5].size = 1 ;
768 state->Init_Ctrl[5].addr[0] = 59;
769 state->Init_Ctrl[5].bit[0] = 0;
770 state->Init_Ctrl[5].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300771
Steven Toth3935c252008-05-01 05:45:44 -0300772 state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ;
773 state->Init_Ctrl[6].size = 2 ;
774 state->Init_Ctrl[6].addr[0] = 53;
775 state->Init_Ctrl[6].bit[0] = 3;
776 state->Init_Ctrl[6].val[0] = 0;
777 state->Init_Ctrl[6].addr[1] = 53;
778 state->Init_Ctrl[6].bit[1] = 4;
779 state->Init_Ctrl[6].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300780
Steven Toth3935c252008-05-01 05:45:44 -0300781 state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ;
782 state->Init_Ctrl[7].size = 4 ;
783 state->Init_Ctrl[7].addr[0] = 22;
784 state->Init_Ctrl[7].bit[0] = 4;
785 state->Init_Ctrl[7].val[0] = 0;
786 state->Init_Ctrl[7].addr[1] = 22;
787 state->Init_Ctrl[7].bit[1] = 5;
788 state->Init_Ctrl[7].val[1] = 1;
789 state->Init_Ctrl[7].addr[2] = 22;
790 state->Init_Ctrl[7].bit[2] = 6;
791 state->Init_Ctrl[7].val[2] = 1;
792 state->Init_Ctrl[7].addr[3] = 22;
793 state->Init_Ctrl[7].bit[3] = 7;
794 state->Init_Ctrl[7].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300795
Steven Toth3935c252008-05-01 05:45:44 -0300796 state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ;
797 state->Init_Ctrl[8].size = 1 ;
798 state->Init_Ctrl[8].addr[0] = 22;
799 state->Init_Ctrl[8].bit[0] = 2;
800 state->Init_Ctrl[8].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300801
Steven Toth3935c252008-05-01 05:45:44 -0300802 state->Init_Ctrl[9].Ctrl_Num = AGC_IF ;
803 state->Init_Ctrl[9].size = 4 ;
804 state->Init_Ctrl[9].addr[0] = 76;
805 state->Init_Ctrl[9].bit[0] = 0;
806 state->Init_Ctrl[9].val[0] = 1;
807 state->Init_Ctrl[9].addr[1] = 76;
808 state->Init_Ctrl[9].bit[1] = 1;
809 state->Init_Ctrl[9].val[1] = 1;
810 state->Init_Ctrl[9].addr[2] = 76;
811 state->Init_Ctrl[9].bit[2] = 2;
812 state->Init_Ctrl[9].val[2] = 0;
813 state->Init_Ctrl[9].addr[3] = 76;
814 state->Init_Ctrl[9].bit[3] = 3;
815 state->Init_Ctrl[9].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300816
Steven Toth3935c252008-05-01 05:45:44 -0300817 state->Init_Ctrl[10].Ctrl_Num = AGC_RF ;
818 state->Init_Ctrl[10].size = 4 ;
819 state->Init_Ctrl[10].addr[0] = 76;
820 state->Init_Ctrl[10].bit[0] = 4;
821 state->Init_Ctrl[10].val[0] = 1;
822 state->Init_Ctrl[10].addr[1] = 76;
823 state->Init_Ctrl[10].bit[1] = 5;
824 state->Init_Ctrl[10].val[1] = 1;
825 state->Init_Ctrl[10].addr[2] = 76;
826 state->Init_Ctrl[10].bit[2] = 6;
827 state->Init_Ctrl[10].val[2] = 0;
828 state->Init_Ctrl[10].addr[3] = 76;
829 state->Init_Ctrl[10].bit[3] = 7;
830 state->Init_Ctrl[10].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300831
Steven Toth3935c252008-05-01 05:45:44 -0300832 state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ;
833 state->Init_Ctrl[11].size = 5 ;
834 state->Init_Ctrl[11].addr[0] = 43;
835 state->Init_Ctrl[11].bit[0] = 3;
836 state->Init_Ctrl[11].val[0] = 0;
837 state->Init_Ctrl[11].addr[1] = 43;
838 state->Init_Ctrl[11].bit[1] = 4;
839 state->Init_Ctrl[11].val[1] = 0;
840 state->Init_Ctrl[11].addr[2] = 43;
841 state->Init_Ctrl[11].bit[2] = 5;
842 state->Init_Ctrl[11].val[2] = 0;
843 state->Init_Ctrl[11].addr[3] = 43;
844 state->Init_Ctrl[11].bit[3] = 6;
845 state->Init_Ctrl[11].val[3] = 1;
846 state->Init_Ctrl[11].addr[4] = 43;
847 state->Init_Ctrl[11].bit[4] = 7;
848 state->Init_Ctrl[11].val[4] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300849
Steven Toth3935c252008-05-01 05:45:44 -0300850 state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ;
851 state->Init_Ctrl[12].size = 6 ;
852 state->Init_Ctrl[12].addr[0] = 44;
853 state->Init_Ctrl[12].bit[0] = 2;
854 state->Init_Ctrl[12].val[0] = 0;
855 state->Init_Ctrl[12].addr[1] = 44;
856 state->Init_Ctrl[12].bit[1] = 3;
857 state->Init_Ctrl[12].val[1] = 0;
858 state->Init_Ctrl[12].addr[2] = 44;
859 state->Init_Ctrl[12].bit[2] = 4;
860 state->Init_Ctrl[12].val[2] = 0;
861 state->Init_Ctrl[12].addr[3] = 44;
862 state->Init_Ctrl[12].bit[3] = 5;
863 state->Init_Ctrl[12].val[3] = 1;
864 state->Init_Ctrl[12].addr[4] = 44;
865 state->Init_Ctrl[12].bit[4] = 6;
866 state->Init_Ctrl[12].val[4] = 0;
867 state->Init_Ctrl[12].addr[5] = 44;
868 state->Init_Ctrl[12].bit[5] = 7;
869 state->Init_Ctrl[12].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300870
Steven Toth3935c252008-05-01 05:45:44 -0300871 state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ;
872 state->Init_Ctrl[13].size = 7 ;
873 state->Init_Ctrl[13].addr[0] = 11;
874 state->Init_Ctrl[13].bit[0] = 0;
875 state->Init_Ctrl[13].val[0] = 1;
876 state->Init_Ctrl[13].addr[1] = 11;
877 state->Init_Ctrl[13].bit[1] = 1;
878 state->Init_Ctrl[13].val[1] = 0;
879 state->Init_Ctrl[13].addr[2] = 11;
880 state->Init_Ctrl[13].bit[2] = 2;
881 state->Init_Ctrl[13].val[2] = 0;
882 state->Init_Ctrl[13].addr[3] = 11;
883 state->Init_Ctrl[13].bit[3] = 3;
884 state->Init_Ctrl[13].val[3] = 1;
885 state->Init_Ctrl[13].addr[4] = 11;
886 state->Init_Ctrl[13].bit[4] = 4;
887 state->Init_Ctrl[13].val[4] = 1;
888 state->Init_Ctrl[13].addr[5] = 11;
889 state->Init_Ctrl[13].bit[5] = 5;
890 state->Init_Ctrl[13].val[5] = 0;
891 state->Init_Ctrl[13].addr[6] = 11;
892 state->Init_Ctrl[13].bit[6] = 6;
893 state->Init_Ctrl[13].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300894
Steven Toth3935c252008-05-01 05:45:44 -0300895 state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ;
896 state->Init_Ctrl[14].size = 16 ;
897 state->Init_Ctrl[14].addr[0] = 13;
898 state->Init_Ctrl[14].bit[0] = 0;
899 state->Init_Ctrl[14].val[0] = 0;
900 state->Init_Ctrl[14].addr[1] = 13;
901 state->Init_Ctrl[14].bit[1] = 1;
902 state->Init_Ctrl[14].val[1] = 0;
903 state->Init_Ctrl[14].addr[2] = 13;
904 state->Init_Ctrl[14].bit[2] = 2;
905 state->Init_Ctrl[14].val[2] = 0;
906 state->Init_Ctrl[14].addr[3] = 13;
907 state->Init_Ctrl[14].bit[3] = 3;
908 state->Init_Ctrl[14].val[3] = 0;
909 state->Init_Ctrl[14].addr[4] = 13;
910 state->Init_Ctrl[14].bit[4] = 4;
911 state->Init_Ctrl[14].val[4] = 0;
912 state->Init_Ctrl[14].addr[5] = 13;
913 state->Init_Ctrl[14].bit[5] = 5;
914 state->Init_Ctrl[14].val[5] = 0;
915 state->Init_Ctrl[14].addr[6] = 13;
916 state->Init_Ctrl[14].bit[6] = 6;
917 state->Init_Ctrl[14].val[6] = 0;
918 state->Init_Ctrl[14].addr[7] = 13;
919 state->Init_Ctrl[14].bit[7] = 7;
920 state->Init_Ctrl[14].val[7] = 0;
921 state->Init_Ctrl[14].addr[8] = 12;
922 state->Init_Ctrl[14].bit[8] = 0;
923 state->Init_Ctrl[14].val[8] = 0;
924 state->Init_Ctrl[14].addr[9] = 12;
925 state->Init_Ctrl[14].bit[9] = 1;
926 state->Init_Ctrl[14].val[9] = 0;
927 state->Init_Ctrl[14].addr[10] = 12;
928 state->Init_Ctrl[14].bit[10] = 2;
929 state->Init_Ctrl[14].val[10] = 0;
930 state->Init_Ctrl[14].addr[11] = 12;
931 state->Init_Ctrl[14].bit[11] = 3;
932 state->Init_Ctrl[14].val[11] = 0;
933 state->Init_Ctrl[14].addr[12] = 12;
934 state->Init_Ctrl[14].bit[12] = 4;
935 state->Init_Ctrl[14].val[12] = 0;
936 state->Init_Ctrl[14].addr[13] = 12;
937 state->Init_Ctrl[14].bit[13] = 5;
938 state->Init_Ctrl[14].val[13] = 1;
939 state->Init_Ctrl[14].addr[14] = 12;
940 state->Init_Ctrl[14].bit[14] = 6;
941 state->Init_Ctrl[14].val[14] = 1;
942 state->Init_Ctrl[14].addr[15] = 12;
943 state->Init_Ctrl[14].bit[15] = 7;
944 state->Init_Ctrl[14].val[15] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300945
Steven Toth3935c252008-05-01 05:45:44 -0300946 state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ;
947 state->Init_Ctrl[15].size = 3 ;
948 state->Init_Ctrl[15].addr[0] = 147;
949 state->Init_Ctrl[15].bit[0] = 2;
950 state->Init_Ctrl[15].val[0] = 0;
951 state->Init_Ctrl[15].addr[1] = 147;
952 state->Init_Ctrl[15].bit[1] = 3;
953 state->Init_Ctrl[15].val[1] = 1;
954 state->Init_Ctrl[15].addr[2] = 147;
955 state->Init_Ctrl[15].bit[2] = 4;
956 state->Init_Ctrl[15].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300957
Steven Toth3935c252008-05-01 05:45:44 -0300958 state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ;
959 state->Init_Ctrl[16].size = 2 ;
960 state->Init_Ctrl[16].addr[0] = 147;
961 state->Init_Ctrl[16].bit[0] = 0;
962 state->Init_Ctrl[16].val[0] = 0;
963 state->Init_Ctrl[16].addr[1] = 147;
964 state->Init_Ctrl[16].bit[1] = 1;
965 state->Init_Ctrl[16].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300966
Steven Toth3935c252008-05-01 05:45:44 -0300967 state->Init_Ctrl[17].Ctrl_Num = EN_AAF ;
968 state->Init_Ctrl[17].size = 1 ;
969 state->Init_Ctrl[17].addr[0] = 147;
970 state->Init_Ctrl[17].bit[0] = 7;
971 state->Init_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300972
Steven Toth3935c252008-05-01 05:45:44 -0300973 state->Init_Ctrl[18].Ctrl_Num = EN_3P ;
974 state->Init_Ctrl[18].size = 1 ;
975 state->Init_Ctrl[18].addr[0] = 147;
976 state->Init_Ctrl[18].bit[0] = 6;
977 state->Init_Ctrl[18].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300978
Steven Toth3935c252008-05-01 05:45:44 -0300979 state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ;
980 state->Init_Ctrl[19].size = 1 ;
981 state->Init_Ctrl[19].addr[0] = 156;
982 state->Init_Ctrl[19].bit[0] = 0;
983 state->Init_Ctrl[19].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300984
Steven Toth3935c252008-05-01 05:45:44 -0300985 state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ;
986 state->Init_Ctrl[20].size = 1 ;
987 state->Init_Ctrl[20].addr[0] = 147;
988 state->Init_Ctrl[20].bit[0] = 5;
989 state->Init_Ctrl[20].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300990
Steven Toth3935c252008-05-01 05:45:44 -0300991 state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ;
992 state->Init_Ctrl[21].size = 1 ;
993 state->Init_Ctrl[21].addr[0] = 137;
994 state->Init_Ctrl[21].bit[0] = 4;
995 state->Init_Ctrl[21].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300996
Steven Toth3935c252008-05-01 05:45:44 -0300997 state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ;
998 state->Init_Ctrl[22].size = 1 ;
999 state->Init_Ctrl[22].addr[0] = 137;
1000 state->Init_Ctrl[22].bit[0] = 7;
1001 state->Init_Ctrl[22].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001002
Steven Toth3935c252008-05-01 05:45:44 -03001003 state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ;
1004 state->Init_Ctrl[23].size = 1 ;
1005 state->Init_Ctrl[23].addr[0] = 91;
1006 state->Init_Ctrl[23].bit[0] = 5;
1007 state->Init_Ctrl[23].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001008
Steven Toth3935c252008-05-01 05:45:44 -03001009 state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ;
1010 state->Init_Ctrl[24].size = 1 ;
1011 state->Init_Ctrl[24].addr[0] = 43;
1012 state->Init_Ctrl[24].bit[0] = 0;
1013 state->Init_Ctrl[24].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001014
Steven Toth3935c252008-05-01 05:45:44 -03001015 state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ;
1016 state->Init_Ctrl[25].size = 2 ;
1017 state->Init_Ctrl[25].addr[0] = 22;
1018 state->Init_Ctrl[25].bit[0] = 0;
1019 state->Init_Ctrl[25].val[0] = 1;
1020 state->Init_Ctrl[25].addr[1] = 22;
1021 state->Init_Ctrl[25].bit[1] = 1;
1022 state->Init_Ctrl[25].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001023
Steven Toth3935c252008-05-01 05:45:44 -03001024 state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ;
1025 state->Init_Ctrl[26].size = 1 ;
1026 state->Init_Ctrl[26].addr[0] = 134;
1027 state->Init_Ctrl[26].bit[0] = 2;
1028 state->Init_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001029
Steven Toth3935c252008-05-01 05:45:44 -03001030 state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ;
1031 state->Init_Ctrl[27].size = 1 ;
1032 state->Init_Ctrl[27].addr[0] = 137;
1033 state->Init_Ctrl[27].bit[0] = 3;
1034 state->Init_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001035
Steven Toth3935c252008-05-01 05:45:44 -03001036 state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ;
1037 state->Init_Ctrl[28].size = 1 ;
1038 state->Init_Ctrl[28].addr[0] = 77;
1039 state->Init_Ctrl[28].bit[0] = 7;
1040 state->Init_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001041
Steven Toth3935c252008-05-01 05:45:44 -03001042 state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ;
1043 state->Init_Ctrl[29].size = 1 ;
1044 state->Init_Ctrl[29].addr[0] = 166;
1045 state->Init_Ctrl[29].bit[0] = 7;
1046 state->Init_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001047
Steven Toth3935c252008-05-01 05:45:44 -03001048 state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ;
1049 state->Init_Ctrl[30].size = 3 ;
1050 state->Init_Ctrl[30].addr[0] = 166;
1051 state->Init_Ctrl[30].bit[0] = 0;
1052 state->Init_Ctrl[30].val[0] = 0;
1053 state->Init_Ctrl[30].addr[1] = 166;
1054 state->Init_Ctrl[30].bit[1] = 1;
1055 state->Init_Ctrl[30].val[1] = 1;
1056 state->Init_Ctrl[30].addr[2] = 166;
1057 state->Init_Ctrl[30].bit[2] = 2;
1058 state->Init_Ctrl[30].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001059
Steven Toth3935c252008-05-01 05:45:44 -03001060 state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ;
1061 state->Init_Ctrl[31].size = 3 ;
1062 state->Init_Ctrl[31].addr[0] = 166;
1063 state->Init_Ctrl[31].bit[0] = 3;
1064 state->Init_Ctrl[31].val[0] = 1;
1065 state->Init_Ctrl[31].addr[1] = 166;
1066 state->Init_Ctrl[31].bit[1] = 4;
1067 state->Init_Ctrl[31].val[1] = 0;
1068 state->Init_Ctrl[31].addr[2] = 166;
1069 state->Init_Ctrl[31].bit[2] = 5;
1070 state->Init_Ctrl[31].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001071
Steven Toth3935c252008-05-01 05:45:44 -03001072 state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ;
1073 state->Init_Ctrl[32].size = 3 ;
1074 state->Init_Ctrl[32].addr[0] = 167;
1075 state->Init_Ctrl[32].bit[0] = 0;
1076 state->Init_Ctrl[32].val[0] = 1;
1077 state->Init_Ctrl[32].addr[1] = 167;
1078 state->Init_Ctrl[32].bit[1] = 1;
1079 state->Init_Ctrl[32].val[1] = 1;
1080 state->Init_Ctrl[32].addr[2] = 167;
1081 state->Init_Ctrl[32].bit[2] = 2;
1082 state->Init_Ctrl[32].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001083
Steven Toth3935c252008-05-01 05:45:44 -03001084 state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ;
1085 state->Init_Ctrl[33].size = 4 ;
1086 state->Init_Ctrl[33].addr[0] = 168;
1087 state->Init_Ctrl[33].bit[0] = 0;
1088 state->Init_Ctrl[33].val[0] = 0;
1089 state->Init_Ctrl[33].addr[1] = 168;
1090 state->Init_Ctrl[33].bit[1] = 1;
1091 state->Init_Ctrl[33].val[1] = 1;
1092 state->Init_Ctrl[33].addr[2] = 168;
1093 state->Init_Ctrl[33].bit[2] = 2;
1094 state->Init_Ctrl[33].val[2] = 0;
1095 state->Init_Ctrl[33].addr[3] = 168;
1096 state->Init_Ctrl[33].bit[3] = 3;
1097 state->Init_Ctrl[33].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001098
Steven Toth3935c252008-05-01 05:45:44 -03001099 state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ;
1100 state->Init_Ctrl[34].size = 4 ;
1101 state->Init_Ctrl[34].addr[0] = 168;
1102 state->Init_Ctrl[34].bit[0] = 4;
1103 state->Init_Ctrl[34].val[0] = 1;
1104 state->Init_Ctrl[34].addr[1] = 168;
1105 state->Init_Ctrl[34].bit[1] = 5;
1106 state->Init_Ctrl[34].val[1] = 1;
1107 state->Init_Ctrl[34].addr[2] = 168;
1108 state->Init_Ctrl[34].bit[2] = 6;
1109 state->Init_Ctrl[34].val[2] = 1;
1110 state->Init_Ctrl[34].addr[3] = 168;
1111 state->Init_Ctrl[34].bit[3] = 7;
1112 state->Init_Ctrl[34].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001113
Steven Toth3935c252008-05-01 05:45:44 -03001114 state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ;
1115 state->Init_Ctrl[35].size = 1 ;
1116 state->Init_Ctrl[35].addr[0] = 135;
1117 state->Init_Ctrl[35].bit[0] = 0;
1118 state->Init_Ctrl[35].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001119
Steven Toth3935c252008-05-01 05:45:44 -03001120 state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ;
1121 state->Init_Ctrl[36].size = 1 ;
1122 state->Init_Ctrl[36].addr[0] = 56;
1123 state->Init_Ctrl[36].bit[0] = 3;
1124 state->Init_Ctrl[36].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001125
Steven Toth3935c252008-05-01 05:45:44 -03001126 state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ;
1127 state->Init_Ctrl[37].size = 7 ;
1128 state->Init_Ctrl[37].addr[0] = 59;
1129 state->Init_Ctrl[37].bit[0] = 1;
1130 state->Init_Ctrl[37].val[0] = 0;
1131 state->Init_Ctrl[37].addr[1] = 59;
1132 state->Init_Ctrl[37].bit[1] = 2;
1133 state->Init_Ctrl[37].val[1] = 0;
1134 state->Init_Ctrl[37].addr[2] = 59;
1135 state->Init_Ctrl[37].bit[2] = 3;
1136 state->Init_Ctrl[37].val[2] = 0;
1137 state->Init_Ctrl[37].addr[3] = 59;
1138 state->Init_Ctrl[37].bit[3] = 4;
1139 state->Init_Ctrl[37].val[3] = 0;
1140 state->Init_Ctrl[37].addr[4] = 59;
1141 state->Init_Ctrl[37].bit[4] = 5;
1142 state->Init_Ctrl[37].val[4] = 0;
1143 state->Init_Ctrl[37].addr[5] = 59;
1144 state->Init_Ctrl[37].bit[5] = 6;
1145 state->Init_Ctrl[37].val[5] = 0;
1146 state->Init_Ctrl[37].addr[6] = 59;
1147 state->Init_Ctrl[37].bit[6] = 7;
1148 state->Init_Ctrl[37].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001149
Steven Toth3935c252008-05-01 05:45:44 -03001150 state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ;
1151 state->Init_Ctrl[38].size = 6 ;
1152 state->Init_Ctrl[38].addr[0] = 32;
1153 state->Init_Ctrl[38].bit[0] = 2;
1154 state->Init_Ctrl[38].val[0] = 0;
1155 state->Init_Ctrl[38].addr[1] = 32;
1156 state->Init_Ctrl[38].bit[1] = 3;
1157 state->Init_Ctrl[38].val[1] = 0;
1158 state->Init_Ctrl[38].addr[2] = 32;
1159 state->Init_Ctrl[38].bit[2] = 4;
1160 state->Init_Ctrl[38].val[2] = 0;
1161 state->Init_Ctrl[38].addr[3] = 32;
1162 state->Init_Ctrl[38].bit[3] = 5;
1163 state->Init_Ctrl[38].val[3] = 0;
1164 state->Init_Ctrl[38].addr[4] = 32;
1165 state->Init_Ctrl[38].bit[4] = 6;
1166 state->Init_Ctrl[38].val[4] = 1;
1167 state->Init_Ctrl[38].addr[5] = 32;
1168 state->Init_Ctrl[38].bit[5] = 7;
1169 state->Init_Ctrl[38].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001170
Steven Toth3935c252008-05-01 05:45:44 -03001171 state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ;
1172 state->Init_Ctrl[39].size = 1 ;
1173 state->Init_Ctrl[39].addr[0] = 25;
1174 state->Init_Ctrl[39].bit[0] = 3;
1175 state->Init_Ctrl[39].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001176
1177
Steven Toth3935c252008-05-01 05:45:44 -03001178 state->CH_Ctrl_Num = CHCTRL_NUM ;
Steven Toth52c99bd2008-05-01 04:57:01 -03001179
Steven Toth3935c252008-05-01 05:45:44 -03001180 state->CH_Ctrl[0].Ctrl_Num = DN_POLY ;
1181 state->CH_Ctrl[0].size = 2 ;
1182 state->CH_Ctrl[0].addr[0] = 68;
1183 state->CH_Ctrl[0].bit[0] = 6;
1184 state->CH_Ctrl[0].val[0] = 1;
1185 state->CH_Ctrl[0].addr[1] = 68;
1186 state->CH_Ctrl[0].bit[1] = 7;
1187 state->CH_Ctrl[0].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001188
Steven Toth3935c252008-05-01 05:45:44 -03001189 state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ;
1190 state->CH_Ctrl[1].size = 2 ;
1191 state->CH_Ctrl[1].addr[0] = 70;
1192 state->CH_Ctrl[1].bit[0] = 6;
1193 state->CH_Ctrl[1].val[0] = 1;
1194 state->CH_Ctrl[1].addr[1] = 70;
1195 state->CH_Ctrl[1].bit[1] = 7;
1196 state->CH_Ctrl[1].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001197
Steven Toth3935c252008-05-01 05:45:44 -03001198 state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ;
1199 state->CH_Ctrl[2].size = 9 ;
1200 state->CH_Ctrl[2].addr[0] = 69;
1201 state->CH_Ctrl[2].bit[0] = 5;
1202 state->CH_Ctrl[2].val[0] = 0;
1203 state->CH_Ctrl[2].addr[1] = 69;
1204 state->CH_Ctrl[2].bit[1] = 6;
1205 state->CH_Ctrl[2].val[1] = 0;
1206 state->CH_Ctrl[2].addr[2] = 69;
1207 state->CH_Ctrl[2].bit[2] = 7;
1208 state->CH_Ctrl[2].val[2] = 0;
1209 state->CH_Ctrl[2].addr[3] = 68;
1210 state->CH_Ctrl[2].bit[3] = 0;
1211 state->CH_Ctrl[2].val[3] = 0;
1212 state->CH_Ctrl[2].addr[4] = 68;
1213 state->CH_Ctrl[2].bit[4] = 1;
1214 state->CH_Ctrl[2].val[4] = 0;
1215 state->CH_Ctrl[2].addr[5] = 68;
1216 state->CH_Ctrl[2].bit[5] = 2;
1217 state->CH_Ctrl[2].val[5] = 0;
1218 state->CH_Ctrl[2].addr[6] = 68;
1219 state->CH_Ctrl[2].bit[6] = 3;
1220 state->CH_Ctrl[2].val[6] = 0;
1221 state->CH_Ctrl[2].addr[7] = 68;
1222 state->CH_Ctrl[2].bit[7] = 4;
1223 state->CH_Ctrl[2].val[7] = 0;
1224 state->CH_Ctrl[2].addr[8] = 68;
1225 state->CH_Ctrl[2].bit[8] = 5;
1226 state->CH_Ctrl[2].val[8] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001227
Steven Toth3935c252008-05-01 05:45:44 -03001228 state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ;
1229 state->CH_Ctrl[3].size = 1 ;
1230 state->CH_Ctrl[3].addr[0] = 70;
1231 state->CH_Ctrl[3].bit[0] = 5;
1232 state->CH_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001233
Steven Toth3935c252008-05-01 05:45:44 -03001234 state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ;
1235 state->CH_Ctrl[4].size = 3 ;
1236 state->CH_Ctrl[4].addr[0] = 73;
1237 state->CH_Ctrl[4].bit[0] = 4;
1238 state->CH_Ctrl[4].val[0] = 0;
1239 state->CH_Ctrl[4].addr[1] = 73;
1240 state->CH_Ctrl[4].bit[1] = 5;
1241 state->CH_Ctrl[4].val[1] = 1;
1242 state->CH_Ctrl[4].addr[2] = 73;
1243 state->CH_Ctrl[4].bit[2] = 6;
1244 state->CH_Ctrl[4].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001245
Steven Toth3935c252008-05-01 05:45:44 -03001246 state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ;
1247 state->CH_Ctrl[5].size = 4 ;
1248 state->CH_Ctrl[5].addr[0] = 70;
1249 state->CH_Ctrl[5].bit[0] = 0;
1250 state->CH_Ctrl[5].val[0] = 0;
1251 state->CH_Ctrl[5].addr[1] = 70;
1252 state->CH_Ctrl[5].bit[1] = 1;
1253 state->CH_Ctrl[5].val[1] = 0;
1254 state->CH_Ctrl[5].addr[2] = 70;
1255 state->CH_Ctrl[5].bit[2] = 2;
1256 state->CH_Ctrl[5].val[2] = 0;
1257 state->CH_Ctrl[5].addr[3] = 70;
1258 state->CH_Ctrl[5].bit[3] = 3;
1259 state->CH_Ctrl[5].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001260
Steven Toth3935c252008-05-01 05:45:44 -03001261 state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ;
1262 state->CH_Ctrl[6].size = 1 ;
1263 state->CH_Ctrl[6].addr[0] = 70;
1264 state->CH_Ctrl[6].bit[0] = 4;
1265 state->CH_Ctrl[6].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001266
Steven Toth3935c252008-05-01 05:45:44 -03001267 state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ;
1268 state->CH_Ctrl[7].size = 1 ;
1269 state->CH_Ctrl[7].addr[0] = 111;
1270 state->CH_Ctrl[7].bit[0] = 4;
1271 state->CH_Ctrl[7].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001272
Steven Toth3935c252008-05-01 05:45:44 -03001273 state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ;
1274 state->CH_Ctrl[8].size = 1 ;
1275 state->CH_Ctrl[8].addr[0] = 111;
1276 state->CH_Ctrl[8].bit[0] = 7;
1277 state->CH_Ctrl[8].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001278
Steven Toth3935c252008-05-01 05:45:44 -03001279 state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ;
1280 state->CH_Ctrl[9].size = 1 ;
1281 state->CH_Ctrl[9].addr[0] = 111;
1282 state->CH_Ctrl[9].bit[0] = 6;
1283 state->CH_Ctrl[9].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001284
Steven Toth3935c252008-05-01 05:45:44 -03001285 state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ;
1286 state->CH_Ctrl[10].size = 1 ;
1287 state->CH_Ctrl[10].addr[0] = 111;
1288 state->CH_Ctrl[10].bit[0] = 5;
1289 state->CH_Ctrl[10].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001290
Steven Toth3935c252008-05-01 05:45:44 -03001291 state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ;
1292 state->CH_Ctrl[11].size = 2 ;
1293 state->CH_Ctrl[11].addr[0] = 110;
1294 state->CH_Ctrl[11].bit[0] = 0;
1295 state->CH_Ctrl[11].val[0] = 1;
1296 state->CH_Ctrl[11].addr[1] = 110;
1297 state->CH_Ctrl[11].bit[1] = 1;
1298 state->CH_Ctrl[11].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001299
Steven Toth3935c252008-05-01 05:45:44 -03001300 state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ;
1301 state->CH_Ctrl[12].size = 3 ;
1302 state->CH_Ctrl[12].addr[0] = 69;
1303 state->CH_Ctrl[12].bit[0] = 2;
1304 state->CH_Ctrl[12].val[0] = 0;
1305 state->CH_Ctrl[12].addr[1] = 69;
1306 state->CH_Ctrl[12].bit[1] = 3;
1307 state->CH_Ctrl[12].val[1] = 0;
1308 state->CH_Ctrl[12].addr[2] = 69;
1309 state->CH_Ctrl[12].bit[2] = 4;
1310 state->CH_Ctrl[12].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001311
Steven Toth3935c252008-05-01 05:45:44 -03001312 state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ;
1313 state->CH_Ctrl[13].size = 6 ;
1314 state->CH_Ctrl[13].addr[0] = 110;
1315 state->CH_Ctrl[13].bit[0] = 2;
1316 state->CH_Ctrl[13].val[0] = 0;
1317 state->CH_Ctrl[13].addr[1] = 110;
1318 state->CH_Ctrl[13].bit[1] = 3;
1319 state->CH_Ctrl[13].val[1] = 0;
1320 state->CH_Ctrl[13].addr[2] = 110;
1321 state->CH_Ctrl[13].bit[2] = 4;
1322 state->CH_Ctrl[13].val[2] = 0;
1323 state->CH_Ctrl[13].addr[3] = 110;
1324 state->CH_Ctrl[13].bit[3] = 5;
1325 state->CH_Ctrl[13].val[3] = 0;
1326 state->CH_Ctrl[13].addr[4] = 110;
1327 state->CH_Ctrl[13].bit[4] = 6;
1328 state->CH_Ctrl[13].val[4] = 0;
1329 state->CH_Ctrl[13].addr[5] = 110;
1330 state->CH_Ctrl[13].bit[5] = 7;
1331 state->CH_Ctrl[13].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001332
Steven Toth3935c252008-05-01 05:45:44 -03001333 state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ;
1334 state->CH_Ctrl[14].size = 7 ;
1335 state->CH_Ctrl[14].addr[0] = 14;
1336 state->CH_Ctrl[14].bit[0] = 0;
1337 state->CH_Ctrl[14].val[0] = 0;
1338 state->CH_Ctrl[14].addr[1] = 14;
1339 state->CH_Ctrl[14].bit[1] = 1;
1340 state->CH_Ctrl[14].val[1] = 0;
1341 state->CH_Ctrl[14].addr[2] = 14;
1342 state->CH_Ctrl[14].bit[2] = 2;
1343 state->CH_Ctrl[14].val[2] = 0;
1344 state->CH_Ctrl[14].addr[3] = 14;
1345 state->CH_Ctrl[14].bit[3] = 3;
1346 state->CH_Ctrl[14].val[3] = 0;
1347 state->CH_Ctrl[14].addr[4] = 14;
1348 state->CH_Ctrl[14].bit[4] = 4;
1349 state->CH_Ctrl[14].val[4] = 0;
1350 state->CH_Ctrl[14].addr[5] = 14;
1351 state->CH_Ctrl[14].bit[5] = 5;
1352 state->CH_Ctrl[14].val[5] = 0;
1353 state->CH_Ctrl[14].addr[6] = 14;
1354 state->CH_Ctrl[14].bit[6] = 6;
1355 state->CH_Ctrl[14].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001356
Steven Toth3935c252008-05-01 05:45:44 -03001357 state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ;
1358 state->CH_Ctrl[15].size = 18 ;
1359 state->CH_Ctrl[15].addr[0] = 17;
1360 state->CH_Ctrl[15].bit[0] = 6;
1361 state->CH_Ctrl[15].val[0] = 0;
1362 state->CH_Ctrl[15].addr[1] = 17;
1363 state->CH_Ctrl[15].bit[1] = 7;
1364 state->CH_Ctrl[15].val[1] = 0;
1365 state->CH_Ctrl[15].addr[2] = 16;
1366 state->CH_Ctrl[15].bit[2] = 0;
1367 state->CH_Ctrl[15].val[2] = 0;
1368 state->CH_Ctrl[15].addr[3] = 16;
1369 state->CH_Ctrl[15].bit[3] = 1;
1370 state->CH_Ctrl[15].val[3] = 0;
1371 state->CH_Ctrl[15].addr[4] = 16;
1372 state->CH_Ctrl[15].bit[4] = 2;
1373 state->CH_Ctrl[15].val[4] = 0;
1374 state->CH_Ctrl[15].addr[5] = 16;
1375 state->CH_Ctrl[15].bit[5] = 3;
1376 state->CH_Ctrl[15].val[5] = 0;
1377 state->CH_Ctrl[15].addr[6] = 16;
1378 state->CH_Ctrl[15].bit[6] = 4;
1379 state->CH_Ctrl[15].val[6] = 0;
1380 state->CH_Ctrl[15].addr[7] = 16;
1381 state->CH_Ctrl[15].bit[7] = 5;
1382 state->CH_Ctrl[15].val[7] = 0;
1383 state->CH_Ctrl[15].addr[8] = 16;
1384 state->CH_Ctrl[15].bit[8] = 6;
1385 state->CH_Ctrl[15].val[8] = 0;
1386 state->CH_Ctrl[15].addr[9] = 16;
1387 state->CH_Ctrl[15].bit[9] = 7;
1388 state->CH_Ctrl[15].val[9] = 0;
1389 state->CH_Ctrl[15].addr[10] = 15;
1390 state->CH_Ctrl[15].bit[10] = 0;
1391 state->CH_Ctrl[15].val[10] = 0;
1392 state->CH_Ctrl[15].addr[11] = 15;
1393 state->CH_Ctrl[15].bit[11] = 1;
1394 state->CH_Ctrl[15].val[11] = 0;
1395 state->CH_Ctrl[15].addr[12] = 15;
1396 state->CH_Ctrl[15].bit[12] = 2;
1397 state->CH_Ctrl[15].val[12] = 0;
1398 state->CH_Ctrl[15].addr[13] = 15;
1399 state->CH_Ctrl[15].bit[13] = 3;
1400 state->CH_Ctrl[15].val[13] = 0;
1401 state->CH_Ctrl[15].addr[14] = 15;
1402 state->CH_Ctrl[15].bit[14] = 4;
1403 state->CH_Ctrl[15].val[14] = 0;
1404 state->CH_Ctrl[15].addr[15] = 15;
1405 state->CH_Ctrl[15].bit[15] = 5;
1406 state->CH_Ctrl[15].val[15] = 0;
1407 state->CH_Ctrl[15].addr[16] = 15;
1408 state->CH_Ctrl[15].bit[16] = 6;
1409 state->CH_Ctrl[15].val[16] = 1;
1410 state->CH_Ctrl[15].addr[17] = 15;
1411 state->CH_Ctrl[15].bit[17] = 7;
1412 state->CH_Ctrl[15].val[17] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001413
Steven Toth3935c252008-05-01 05:45:44 -03001414 state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ;
1415 state->CH_Ctrl[16].size = 5 ;
1416 state->CH_Ctrl[16].addr[0] = 112;
1417 state->CH_Ctrl[16].bit[0] = 0;
1418 state->CH_Ctrl[16].val[0] = 0;
1419 state->CH_Ctrl[16].addr[1] = 112;
1420 state->CH_Ctrl[16].bit[1] = 1;
1421 state->CH_Ctrl[16].val[1] = 0;
1422 state->CH_Ctrl[16].addr[2] = 112;
1423 state->CH_Ctrl[16].bit[2] = 2;
1424 state->CH_Ctrl[16].val[2] = 0;
1425 state->CH_Ctrl[16].addr[3] = 112;
1426 state->CH_Ctrl[16].bit[3] = 3;
1427 state->CH_Ctrl[16].val[3] = 0;
1428 state->CH_Ctrl[16].addr[4] = 112;
1429 state->CH_Ctrl[16].bit[4] = 4;
1430 state->CH_Ctrl[16].val[4] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001431
Steven Toth3935c252008-05-01 05:45:44 -03001432 state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ;
1433 state->CH_Ctrl[17].size = 1 ;
1434 state->CH_Ctrl[17].addr[0] = 14;
1435 state->CH_Ctrl[17].bit[0] = 7;
1436 state->CH_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001437
Steven Toth3935c252008-05-01 05:45:44 -03001438 state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ;
1439 state->CH_Ctrl[18].size = 4 ;
1440 state->CH_Ctrl[18].addr[0] = 107;
1441 state->CH_Ctrl[18].bit[0] = 3;
1442 state->CH_Ctrl[18].val[0] = 0;
1443 state->CH_Ctrl[18].addr[1] = 107;
1444 state->CH_Ctrl[18].bit[1] = 4;
1445 state->CH_Ctrl[18].val[1] = 0;
1446 state->CH_Ctrl[18].addr[2] = 107;
1447 state->CH_Ctrl[18].bit[2] = 5;
1448 state->CH_Ctrl[18].val[2] = 0;
1449 state->CH_Ctrl[18].addr[3] = 107;
1450 state->CH_Ctrl[18].bit[3] = 6;
1451 state->CH_Ctrl[18].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001452
Steven Toth3935c252008-05-01 05:45:44 -03001453 state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ;
1454 state->CH_Ctrl[19].size = 3 ;
1455 state->CH_Ctrl[19].addr[0] = 107;
1456 state->CH_Ctrl[19].bit[0] = 7;
1457 state->CH_Ctrl[19].val[0] = 1;
1458 state->CH_Ctrl[19].addr[1] = 106;
1459 state->CH_Ctrl[19].bit[1] = 0;
1460 state->CH_Ctrl[19].val[1] = 1;
1461 state->CH_Ctrl[19].addr[2] = 106;
1462 state->CH_Ctrl[19].bit[2] = 1;
1463 state->CH_Ctrl[19].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001464
Steven Toth3935c252008-05-01 05:45:44 -03001465 state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ;
1466 state->CH_Ctrl[20].size = 11 ;
1467 state->CH_Ctrl[20].addr[0] = 109;
1468 state->CH_Ctrl[20].bit[0] = 2;
1469 state->CH_Ctrl[20].val[0] = 0;
1470 state->CH_Ctrl[20].addr[1] = 109;
1471 state->CH_Ctrl[20].bit[1] = 3;
1472 state->CH_Ctrl[20].val[1] = 0;
1473 state->CH_Ctrl[20].addr[2] = 109;
1474 state->CH_Ctrl[20].bit[2] = 4;
1475 state->CH_Ctrl[20].val[2] = 0;
1476 state->CH_Ctrl[20].addr[3] = 109;
1477 state->CH_Ctrl[20].bit[3] = 5;
1478 state->CH_Ctrl[20].val[3] = 0;
1479 state->CH_Ctrl[20].addr[4] = 109;
1480 state->CH_Ctrl[20].bit[4] = 6;
1481 state->CH_Ctrl[20].val[4] = 0;
1482 state->CH_Ctrl[20].addr[5] = 109;
1483 state->CH_Ctrl[20].bit[5] = 7;
1484 state->CH_Ctrl[20].val[5] = 0;
1485 state->CH_Ctrl[20].addr[6] = 108;
1486 state->CH_Ctrl[20].bit[6] = 0;
1487 state->CH_Ctrl[20].val[6] = 0;
1488 state->CH_Ctrl[20].addr[7] = 108;
1489 state->CH_Ctrl[20].bit[7] = 1;
1490 state->CH_Ctrl[20].val[7] = 0;
1491 state->CH_Ctrl[20].addr[8] = 108;
1492 state->CH_Ctrl[20].bit[8] = 2;
1493 state->CH_Ctrl[20].val[8] = 1;
1494 state->CH_Ctrl[20].addr[9] = 108;
1495 state->CH_Ctrl[20].bit[9] = 3;
1496 state->CH_Ctrl[20].val[9] = 1;
1497 state->CH_Ctrl[20].addr[10] = 108;
1498 state->CH_Ctrl[20].bit[10] = 4;
1499 state->CH_Ctrl[20].val[10] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001500
Steven Toth3935c252008-05-01 05:45:44 -03001501 state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ;
1502 state->CH_Ctrl[21].size = 6 ;
1503 state->CH_Ctrl[21].addr[0] = 106;
1504 state->CH_Ctrl[21].bit[0] = 2;
1505 state->CH_Ctrl[21].val[0] = 0;
1506 state->CH_Ctrl[21].addr[1] = 106;
1507 state->CH_Ctrl[21].bit[1] = 3;
1508 state->CH_Ctrl[21].val[1] = 0;
1509 state->CH_Ctrl[21].addr[2] = 106;
1510 state->CH_Ctrl[21].bit[2] = 4;
1511 state->CH_Ctrl[21].val[2] = 0;
1512 state->CH_Ctrl[21].addr[3] = 106;
1513 state->CH_Ctrl[21].bit[3] = 5;
1514 state->CH_Ctrl[21].val[3] = 0;
1515 state->CH_Ctrl[21].addr[4] = 106;
1516 state->CH_Ctrl[21].bit[4] = 6;
1517 state->CH_Ctrl[21].val[4] = 0;
1518 state->CH_Ctrl[21].addr[5] = 106;
1519 state->CH_Ctrl[21].bit[5] = 7;
1520 state->CH_Ctrl[21].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001521
Steven Toth3935c252008-05-01 05:45:44 -03001522 state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ;
1523 state->CH_Ctrl[22].size = 1 ;
1524 state->CH_Ctrl[22].addr[0] = 138;
1525 state->CH_Ctrl[22].bit[0] = 4;
1526 state->CH_Ctrl[22].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001527
Steven Toth3935c252008-05-01 05:45:44 -03001528 state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ;
1529 state->CH_Ctrl[23].size = 1 ;
1530 state->CH_Ctrl[23].addr[0] = 17;
1531 state->CH_Ctrl[23].bit[0] = 5;
1532 state->CH_Ctrl[23].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001533
Steven Toth3935c252008-05-01 05:45:44 -03001534 state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ;
1535 state->CH_Ctrl[24].size = 1 ;
1536 state->CH_Ctrl[24].addr[0] = 111;
1537 state->CH_Ctrl[24].bit[0] = 3;
1538 state->CH_Ctrl[24].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001539
Steven Toth3935c252008-05-01 05:45:44 -03001540 state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ;
1541 state->CH_Ctrl[25].size = 1 ;
1542 state->CH_Ctrl[25].addr[0] = 112;
1543 state->CH_Ctrl[25].bit[0] = 7;
1544 state->CH_Ctrl[25].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001545
Steven Toth3935c252008-05-01 05:45:44 -03001546 state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ;
1547 state->CH_Ctrl[26].size = 1 ;
1548 state->CH_Ctrl[26].addr[0] = 136;
1549 state->CH_Ctrl[26].bit[0] = 7;
1550 state->CH_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001551
Steven Toth3935c252008-05-01 05:45:44 -03001552 state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ;
1553 state->CH_Ctrl[27].size = 1 ;
1554 state->CH_Ctrl[27].addr[0] = 149;
1555 state->CH_Ctrl[27].bit[0] = 7;
1556 state->CH_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001557
Steven Toth3935c252008-05-01 05:45:44 -03001558 state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ;
1559 state->CH_Ctrl[28].size = 1 ;
1560 state->CH_Ctrl[28].addr[0] = 149;
1561 state->CH_Ctrl[28].bit[0] = 6;
1562 state->CH_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001563
Steven Toth3935c252008-05-01 05:45:44 -03001564 state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ;
1565 state->CH_Ctrl[29].size = 1 ;
1566 state->CH_Ctrl[29].addr[0] = 149;
1567 state->CH_Ctrl[29].bit[0] = 5;
1568 state->CH_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001569
Steven Toth3935c252008-05-01 05:45:44 -03001570 state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ;
1571 state->CH_Ctrl[30].size = 1 ;
1572 state->CH_Ctrl[30].addr[0] = 149;
1573 state->CH_Ctrl[30].bit[0] = 4;
1574 state->CH_Ctrl[30].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001575
Steven Toth3935c252008-05-01 05:45:44 -03001576 state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ;
1577 state->CH_Ctrl[31].size = 1 ;
1578 state->CH_Ctrl[31].addr[0] = 149;
1579 state->CH_Ctrl[31].bit[0] = 3;
1580 state->CH_Ctrl[31].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001581
Steven Toth3935c252008-05-01 05:45:44 -03001582 state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ;
1583 state->CH_Ctrl[32].size = 1 ;
1584 state->CH_Ctrl[32].addr[0] = 93;
1585 state->CH_Ctrl[32].bit[0] = 1;
1586 state->CH_Ctrl[32].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001587
Steven Toth3935c252008-05-01 05:45:44 -03001588 state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ;
1589 state->CH_Ctrl[33].size = 1 ;
1590 state->CH_Ctrl[33].addr[0] = 93;
1591 state->CH_Ctrl[33].bit[0] = 0;
1592 state->CH_Ctrl[33].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001593
Steven Toth3935c252008-05-01 05:45:44 -03001594 state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ;
1595 state->CH_Ctrl[34].size = 6 ;
1596 state->CH_Ctrl[34].addr[0] = 92;
1597 state->CH_Ctrl[34].bit[0] = 2;
1598 state->CH_Ctrl[34].val[0] = 0;
1599 state->CH_Ctrl[34].addr[1] = 92;
1600 state->CH_Ctrl[34].bit[1] = 3;
1601 state->CH_Ctrl[34].val[1] = 0;
1602 state->CH_Ctrl[34].addr[2] = 92;
1603 state->CH_Ctrl[34].bit[2] = 4;
1604 state->CH_Ctrl[34].val[2] = 0;
1605 state->CH_Ctrl[34].addr[3] = 92;
1606 state->CH_Ctrl[34].bit[3] = 5;
1607 state->CH_Ctrl[34].val[3] = 0;
1608 state->CH_Ctrl[34].addr[4] = 92;
1609 state->CH_Ctrl[34].bit[4] = 6;
1610 state->CH_Ctrl[34].val[4] = 0;
1611 state->CH_Ctrl[34].addr[5] = 92;
1612 state->CH_Ctrl[34].bit[5] = 7;
1613 state->CH_Ctrl[34].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001614
Steven Toth3935c252008-05-01 05:45:44 -03001615 state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ;
1616 state->CH_Ctrl[35].size = 6 ;
1617 state->CH_Ctrl[35].addr[0] = 93;
1618 state->CH_Ctrl[35].bit[0] = 2;
1619 state->CH_Ctrl[35].val[0] = 0;
1620 state->CH_Ctrl[35].addr[1] = 93;
1621 state->CH_Ctrl[35].bit[1] = 3;
1622 state->CH_Ctrl[35].val[1] = 0;
1623 state->CH_Ctrl[35].addr[2] = 93;
1624 state->CH_Ctrl[35].bit[2] = 4;
1625 state->CH_Ctrl[35].val[2] = 0;
1626 state->CH_Ctrl[35].addr[3] = 93;
1627 state->CH_Ctrl[35].bit[3] = 5;
1628 state->CH_Ctrl[35].val[3] = 0;
1629 state->CH_Ctrl[35].addr[4] = 93;
1630 state->CH_Ctrl[35].bit[4] = 6;
1631 state->CH_Ctrl[35].val[4] = 0;
1632 state->CH_Ctrl[35].addr[5] = 93;
1633 state->CH_Ctrl[35].bit[5] = 7;
1634 state->CH_Ctrl[35].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001635
1636#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03001637 state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ;
1638 state->CH_Ctrl[36].size = 1 ;
1639 state->CH_Ctrl[36].addr[0] = 109;
1640 state->CH_Ctrl[36].bit[0] = 1;
1641 state->CH_Ctrl[36].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001642
Steven Toth3935c252008-05-01 05:45:44 -03001643 state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ;
1644 state->CH_Ctrl[37].size = 2 ;
1645 state->CH_Ctrl[37].addr[0] = 112;
1646 state->CH_Ctrl[37].bit[0] = 5;
1647 state->CH_Ctrl[37].val[0] = 0;
1648 state->CH_Ctrl[37].addr[1] = 112;
1649 state->CH_Ctrl[37].bit[1] = 6;
1650 state->CH_Ctrl[37].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001651
Steven Toth3935c252008-05-01 05:45:44 -03001652 state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ;
1653 state->CH_Ctrl[38].size = 1 ;
1654 state->CH_Ctrl[38].addr[0] = 65;
1655 state->CH_Ctrl[38].bit[0] = 1;
1656 state->CH_Ctrl[38].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001657#endif
1658
1659 return 0 ;
1660}
1661
Steven Toth3935c252008-05-01 05:45:44 -03001662void InitTunerControls(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001663{
Steven Toth3935c252008-05-01 05:45:44 -03001664 MXL5005_RegisterInit(fe);
1665 MXL5005_ControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001666#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03001667 MXL5005_MXLControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001668#endif
1669}
1670
Steven Toth3935c252008-05-01 05:45:44 -03001671u16 MXL5005_TunerConfig(struct dvb_frontend *fe,
Steven Tothd211017b2008-05-01 19:35:54 -03001672 u8 Mode, /* 0: Analog Mode ; 1: Digital Mode */
1673 u8 IF_mode, /* for Analog Mode, 0: zero IF; 1: low IF */
1674 u32 Bandwidth, /* filter channel bandwidth (6, 7, 8) */
1675 u32 IF_out, /* Desired IF Out Frequency */
1676 u32 Fxtal, /* XTAL Frequency */
1677 u8 AGC_Mode, /* AGC Mode - Dual AGC: 0, Single AGC: 1 */
1678 u16 TOP, /* 0: Dual AGC; Value: take over point */
1679 u16 IF_OUT_LOAD, /* IF Out Load Resistor (200 / 300 Ohms) */
1680 u8 CLOCK_OUT, /* 0: turn off clk out; 1: turn on clock out */
1681 u8 DIV_OUT, /* 0: Div-1; 1: Div-4 */
1682 u8 CAPSELECT, /* 0: disable On-Chip pulling cap; 1: enable */
1683 u8 EN_RSSI, /* 0: disable RSSI; 1: enable RSSI */
1684
1685 /* Modulation Type; */
1686 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
1687 u8 Mod_Type,
1688
1689 /* Tracking Filter */
1690 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
1691 u8 TF_Type
1692 )
Steven Toth52c99bd2008-05-01 04:57:01 -03001693{
Steven Toth85d220d2008-05-01 05:48:14 -03001694 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001695 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001696
Steven Toth3935c252008-05-01 05:45:44 -03001697 state->Mode = Mode;
1698 state->IF_Mode = IF_mode;
1699 state->Chan_Bandwidth = Bandwidth;
1700 state->IF_OUT = IF_out;
1701 state->Fxtal = Fxtal;
1702 state->AGC_Mode = AGC_Mode;
1703 state->TOP = TOP;
1704 state->IF_OUT_LOAD = IF_OUT_LOAD;
1705 state->CLOCK_OUT = CLOCK_OUT;
1706 state->DIV_OUT = DIV_OUT;
1707 state->CAPSELECT = CAPSELECT;
1708 state->EN_RSSI = EN_RSSI;
1709 state->Mod_Type = Mod_Type;
1710 state->TF_Type = TF_Type;
Steven Toth52c99bd2008-05-01 04:57:01 -03001711
Steven Totha8214d42008-05-01 05:02:58 -03001712 /* Initialize all the controls and registers */
Steven Toth3935c252008-05-01 05:45:44 -03001713 InitTunerControls(fe);
Steven Totha8214d42008-05-01 05:02:58 -03001714
1715 /* Synthesizer LO frequency calculation */
Steven Toth3935c252008-05-01 05:45:44 -03001716 MXL_SynthIFLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001717
Steven Toth3935c252008-05-01 05:45:44 -03001718 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001719}
1720
Steven Toth3935c252008-05-01 05:45:44 -03001721void MXL_SynthIFLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001722{
Steven Toth85d220d2008-05-01 05:48:14 -03001723 struct mxl5005s_state *state = fe->tuner_priv;
1724 if (state->Mode == 1) /* Digital Mode */
Steven Toth3935c252008-05-01 05:45:44 -03001725 state->IF_LO = state->IF_OUT;
Steven Tothd211017b2008-05-01 19:35:54 -03001726 else /* Analog Mode */ {
1727 if (state->IF_Mode == 0) /* Analog Zero IF mode */
Steven Toth3935c252008-05-01 05:45:44 -03001728 state->IF_LO = state->IF_OUT + 400000;
1729 else /* Analog Low IF mode */
1730 state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2;
Steven Toth52c99bd2008-05-01 04:57:01 -03001731 }
1732}
1733
Steven Toth3935c252008-05-01 05:45:44 -03001734void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001735{
Steven Toth85d220d2008-05-01 05:48:14 -03001736 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001737
1738 if (state->Mode == 1) /* Digital Mode */ {
Steven Tothd211017b2008-05-01 19:35:54 -03001739 /* remove 20.48MHz setting for 2.6.10 */
Steven Toth3935c252008-05-01 05:45:44 -03001740 state->RF_LO = state->RF_IN;
Steven Tothd211017b2008-05-01 19:35:54 -03001741 /* change for 2.6.6 */
1742 state->TG_LO = state->RF_IN - 750000;
Steven Toth3935c252008-05-01 05:45:44 -03001743 } else /* Analog Mode */ {
Steven Tothd211017b2008-05-01 19:35:54 -03001744 if (state->IF_Mode == 0) /* Analog Zero IF mode */ {
Steven Toth3935c252008-05-01 05:45:44 -03001745 state->RF_LO = state->RF_IN - 400000;
1746 state->TG_LO = state->RF_IN - 1750000;
1747 } else /* Analog Low IF mode */ {
1748 state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2;
Steven Tothd211017b2008-05-01 19:35:54 -03001749 state->TG_LO = state->RF_IN -
1750 state->Chan_Bandwidth + 500000;
Steven Toth52c99bd2008-05-01 04:57:01 -03001751 }
1752 }
1753}
1754
Steven Toth3935c252008-05-01 05:45:44 -03001755u16 MXL_OverwriteICDefault(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001756{
Steven Toth3935c252008-05-01 05:45:44 -03001757 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001758
Steven Toth3935c252008-05-01 05:45:44 -03001759 status += MXL_ControlWrite(fe, OVERRIDE_1, 1);
1760 status += MXL_ControlWrite(fe, OVERRIDE_2, 1);
1761 status += MXL_ControlWrite(fe, OVERRIDE_3, 1);
1762 status += MXL_ControlWrite(fe, OVERRIDE_4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001763
Steven Toth3935c252008-05-01 05:45:44 -03001764 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001765}
1766
Steven Toth3935c252008-05-01 05:45:44 -03001767u16 MXL_BlockInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001768{
Steven Toth85d220d2008-05-01 05:48:14 -03001769 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001770 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001771
Steven Toth3935c252008-05-01 05:45:44 -03001772 status += MXL_OverwriteICDefault(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001773
Steven Toth3935c252008-05-01 05:45:44 -03001774 /* Downconverter Control Dig Ana */
1775 status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001776
Steven Toth3935c252008-05-01 05:45:44 -03001777 /* Filter Control Dig Ana */
1778 status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1);
1779 status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2);
1780 status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0);
1781 status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1);
1782 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001783
Steven Toth3935c252008-05-01 05:45:44 -03001784 /* Initialize Low-Pass Filter */
1785 if (state->Mode) { /* Digital Mode */
1786 switch (state->Chan_Bandwidth) {
Steven Tothd211017b2008-05-01 19:35:54 -03001787 case 8000000:
1788 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0);
1789 break;
1790 case 7000000:
1791 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2);
1792 break;
1793 case 6000000:
1794 status += MXL_ControlWrite(fe,
1795 BB_DLPF_BANDSEL, 3);
1796 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001797 }
Steven Toth3935c252008-05-01 05:45:44 -03001798 } else { /* Analog Mode */
1799 switch (state->Chan_Bandwidth) {
Steven Tothd211017b2008-05-01 19:35:54 -03001800 case 8000000: /* Low Zero */
1801 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1802 (state->IF_Mode ? 0 : 3));
1803 break;
1804 case 7000000:
1805 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1806 (state->IF_Mode ? 1 : 4));
1807 break;
1808 case 6000000:
1809 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1810 (state->IF_Mode ? 2 : 5));
1811 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001812 }
1813 }
1814
Steven Toth3935c252008-05-01 05:45:44 -03001815 /* Charge Pump Control Dig Ana */
Steven Tothd211017b2008-05-01 19:35:54 -03001816 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8);
1817 status += MXL_ControlWrite(fe,
1818 RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1);
Steven Toth3935c252008-05-01 05:45:44 -03001819 status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001820
Steven Toth3935c252008-05-01 05:45:44 -03001821 /* AGC TOP Control */
1822 if (state->AGC_Mode == 0) /* Dual AGC */ {
1823 status += MXL_ControlWrite(fe, AGC_IF, 15);
1824 status += MXL_ControlWrite(fe, AGC_RF, 15);
Steven Tothd211017b2008-05-01 19:35:54 -03001825 } else /* Single AGC Mode Dig Ana */
Steven Toth3935c252008-05-01 05:45:44 -03001826 status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03001827
Steven Toth3935c252008-05-01 05:45:44 -03001828 if (state->TOP == 55) /* TOP == 5.5 */
1829 status += MXL_ControlWrite(fe, AGC_IF, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001830
Steven Toth3935c252008-05-01 05:45:44 -03001831 if (state->TOP == 72) /* TOP == 7.2 */
1832 status += MXL_ControlWrite(fe, AGC_IF, 0x1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001833
Steven Toth3935c252008-05-01 05:45:44 -03001834 if (state->TOP == 92) /* TOP == 9.2 */
1835 status += MXL_ControlWrite(fe, AGC_IF, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03001836
Steven Toth3935c252008-05-01 05:45:44 -03001837 if (state->TOP == 110) /* TOP == 11.0 */
1838 status += MXL_ControlWrite(fe, AGC_IF, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03001839
Steven Toth3935c252008-05-01 05:45:44 -03001840 if (state->TOP == 129) /* TOP == 12.9 */
1841 status += MXL_ControlWrite(fe, AGC_IF, 0x4);
Steven Toth52c99bd2008-05-01 04:57:01 -03001842
Steven Toth3935c252008-05-01 05:45:44 -03001843 if (state->TOP == 147) /* TOP == 14.7 */
1844 status += MXL_ControlWrite(fe, AGC_IF, 0x5);
Steven Toth52c99bd2008-05-01 04:57:01 -03001845
Steven Toth3935c252008-05-01 05:45:44 -03001846 if (state->TOP == 168) /* TOP == 16.8 */
1847 status += MXL_ControlWrite(fe, AGC_IF, 0x6);
Steven Toth52c99bd2008-05-01 04:57:01 -03001848
Steven Toth3935c252008-05-01 05:45:44 -03001849 if (state->TOP == 194) /* TOP == 19.4 */
1850 status += MXL_ControlWrite(fe, AGC_IF, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03001851
Steven Toth3935c252008-05-01 05:45:44 -03001852 if (state->TOP == 212) /* TOP == 21.2 */
1853 status += MXL_ControlWrite(fe, AGC_IF, 0x9);
Steven Toth52c99bd2008-05-01 04:57:01 -03001854
Steven Toth3935c252008-05-01 05:45:44 -03001855 if (state->TOP == 232) /* TOP == 23.2 */
1856 status += MXL_ControlWrite(fe, AGC_IF, 0xA);
Steven Toth52c99bd2008-05-01 04:57:01 -03001857
Steven Toth3935c252008-05-01 05:45:44 -03001858 if (state->TOP == 252) /* TOP == 25.2 */
1859 status += MXL_ControlWrite(fe, AGC_IF, 0xB);
Steven Toth52c99bd2008-05-01 04:57:01 -03001860
Steven Toth3935c252008-05-01 05:45:44 -03001861 if (state->TOP == 271) /* TOP == 27.1 */
1862 status += MXL_ControlWrite(fe, AGC_IF, 0xC);
Steven Toth52c99bd2008-05-01 04:57:01 -03001863
Steven Toth3935c252008-05-01 05:45:44 -03001864 if (state->TOP == 292) /* TOP == 29.2 */
1865 status += MXL_ControlWrite(fe, AGC_IF, 0xD);
Steven Toth52c99bd2008-05-01 04:57:01 -03001866
Steven Toth3935c252008-05-01 05:45:44 -03001867 if (state->TOP == 317) /* TOP == 31.7 */
1868 status += MXL_ControlWrite(fe, AGC_IF, 0xE);
Steven Toth52c99bd2008-05-01 04:57:01 -03001869
Steven Toth3935c252008-05-01 05:45:44 -03001870 if (state->TOP == 349) /* TOP == 34.9 */
1871 status += MXL_ControlWrite(fe, AGC_IF, 0xF);
Steven Toth52c99bd2008-05-01 04:57:01 -03001872
Steven Toth3935c252008-05-01 05:45:44 -03001873 /* IF Synthesizer Control */
1874 status += MXL_IFSynthInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001875
Steven Toth3935c252008-05-01 05:45:44 -03001876 /* IF UpConverter Control */
1877 if (state->IF_OUT_LOAD == 200) {
1878 status += MXL_ControlWrite(fe, DRV_RES_SEL, 6);
1879 status += MXL_ControlWrite(fe, I_DRIVER, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03001880 }
Steven Toth3935c252008-05-01 05:45:44 -03001881 if (state->IF_OUT_LOAD == 300) {
1882 status += MXL_ControlWrite(fe, DRV_RES_SEL, 4);
1883 status += MXL_ControlWrite(fe, I_DRIVER, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001884 }
1885
Steven Toth3935c252008-05-01 05:45:44 -03001886 /* Anti-Alias Filtering Control
1887 * initialise Anti-Aliasing Filter
1888 */
1889 if (state->Mode) { /* Digital Mode */
1890 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) {
1891 status += MXL_ControlWrite(fe, EN_AAF, 1);
1892 status += MXL_ControlWrite(fe, EN_3P, 1);
1893 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1894 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001895 }
Steven Tothd211017b2008-05-01 19:35:54 -03001896 if ((state->IF_OUT == 36125000UL) ||
1897 (state->IF_OUT == 36150000UL)) {
Steven Toth3935c252008-05-01 05:45:44 -03001898 status += MXL_ControlWrite(fe, EN_AAF, 1);
1899 status += MXL_ControlWrite(fe, EN_3P, 1);
1900 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1901 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001902 }
Steven Toth3935c252008-05-01 05:45:44 -03001903 if (state->IF_OUT > 36150000UL) {
1904 status += MXL_ControlWrite(fe, EN_AAF, 0);
1905 status += MXL_ControlWrite(fe, EN_3P, 1);
1906 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1907 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001908 }
Steven Toth3935c252008-05-01 05:45:44 -03001909 } else { /* Analog Mode */
Steven Tothd211017b2008-05-01 19:35:54 -03001910 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03001911 status += MXL_ControlWrite(fe, EN_AAF, 1);
1912 status += MXL_ControlWrite(fe, EN_3P, 1);
1913 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1914 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001915 }
Steven Tothd211017b2008-05-01 19:35:54 -03001916 if (state->IF_OUT > 5000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03001917 status += MXL_ControlWrite(fe, EN_AAF, 0);
1918 status += MXL_ControlWrite(fe, EN_3P, 0);
1919 status += MXL_ControlWrite(fe, EN_AUX_3P, 0);
1920 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001921 }
1922 }
1923
Steven Toth3935c252008-05-01 05:45:44 -03001924 /* Demod Clock Out */
1925 if (state->CLOCK_OUT)
1926 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001927 else
Steven Toth3935c252008-05-01 05:45:44 -03001928 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001929
Steven Toth3935c252008-05-01 05:45:44 -03001930 if (state->DIV_OUT == 1)
1931 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1);
1932 if (state->DIV_OUT == 0)
1933 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001934
Steven Toth3935c252008-05-01 05:45:44 -03001935 /* Crystal Control */
1936 if (state->CAPSELECT)
1937 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001938 else
Steven Toth3935c252008-05-01 05:45:44 -03001939 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001940
Steven Toth3935c252008-05-01 05:45:44 -03001941 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
1942 status += MXL_ControlWrite(fe, IF_SEL_DBL, 1);
1943 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
1944 status += MXL_ControlWrite(fe, IF_SEL_DBL, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001945
Steven Toth3935c252008-05-01 05:45:44 -03001946 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
1947 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3);
1948 if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL)
1949 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001950
Steven Toth3935c252008-05-01 05:45:44 -03001951 /* Misc Controls */
Steven Toth85d220d2008-05-01 05:48:14 -03001952 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */
Steven Toth3935c252008-05-01 05:45:44 -03001953 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001954 else
Steven Toth3935c252008-05-01 05:45:44 -03001955 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001956
Steven Toth3935c252008-05-01 05:45:44 -03001957 /* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */
Steven Toth52c99bd2008-05-01 04:57:01 -03001958
Steven Toth3935c252008-05-01 05:45:44 -03001959 /* Set TG_R_DIV */
Steven Tothd211017b2008-05-01 19:35:54 -03001960 status += MXL_ControlWrite(fe, TG_R_DIV,
1961 MXL_Ceiling(state->Fxtal, 1000000));
Steven Toth52c99bd2008-05-01 04:57:01 -03001962
Steven Toth3935c252008-05-01 05:45:44 -03001963 /* Apply Default value to BB_INITSTATE_DLPF_TUNE */
Steven Toth52c99bd2008-05-01 04:57:01 -03001964
Steven Toth3935c252008-05-01 05:45:44 -03001965 /* RSSI Control */
Steven Tothd211017b2008-05-01 19:35:54 -03001966 if (state->EN_RSSI) {
Steven Toth3935c252008-05-01 05:45:44 -03001967 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
1968 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
1969 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
1970 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
1971
1972 /* RSSI reference point */
1973 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
1974 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3);
1975 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
1976
1977 /* TOP point */
1978 status += MXL_ControlWrite(fe, RFA_FLR, 0);
1979 status += MXL_ControlWrite(fe, RFA_CEIL, 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03001980 }
1981
Steven Toth3935c252008-05-01 05:45:44 -03001982 /* Modulation type bit settings
1983 * Override the control values preset
1984 */
Steven Tothd211017b2008-05-01 19:35:54 -03001985 if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */ {
Steven Toth3935c252008-05-01 05:45:44 -03001986 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03001987
Steven Toth3935c252008-05-01 05:45:44 -03001988 /* Enable RSSI */
1989 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
1990 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
1991 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
1992 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
1993
1994 /* RSSI reference point */
1995 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
1996 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
1997 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
1998
1999 /* TOP point */
2000 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2001 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2002 if (state->IF_OUT <= 6280000UL) /* Low IF */
2003 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2004 else /* High IF */
2005 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002006
2007 }
Steven Tothd211017b2008-05-01 19:35:54 -03002008 if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */ {
Steven Toth85d220d2008-05-01 05:48:14 -03002009 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002010
Steven Toth3935c252008-05-01 05:45:44 -03002011 /* Enable RSSI */
2012 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2013 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2014 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2015 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002016
Steven Toth3935c252008-05-01 05:45:44 -03002017 /* RSSI reference point */
2018 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2019 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4);
2020 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2021
2022 /* TOP point */
2023 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2024 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2025 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1);
Steven Tothd211017b2008-05-01 19:35:54 -03002026 /* Low Zero */
2027 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);
2028
Steven Toth3935c252008-05-01 05:45:44 -03002029 if (state->IF_OUT <= 6280000UL) /* Low IF */
2030 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2031 else /* High IF */
2032 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002033 }
Steven Tothd211017b2008-05-01 19:35:54 -03002034 if (state->Mod_Type == MXL_QAM) /* QAM Mode */ {
Steven Toth3935c252008-05-01 05:45:44 -03002035 state->Mode = MXL_DIGITAL_MODE;
Steven Toth52c99bd2008-05-01 04:57:01 -03002036
Steven Toth3935c252008-05-01 05:45:44 -03002037 /* state->AGC_Mode = 1; */ /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002038
Steven Toth3935c252008-05-01 05:45:44 -03002039 /* Disable RSSI */ /* change here for v2.6.5 */
2040 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2041 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2042 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2043 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002044
Steven Toth3935c252008-05-01 05:45:44 -03002045 /* RSSI reference point */
2046 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2047 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2048 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
Steven Tothd211017b2008-05-01 19:35:54 -03002049 /* change here for v2.6.5 */
2050 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002051
Steven Toth3935c252008-05-01 05:45:44 -03002052 if (state->IF_OUT <= 6280000UL) /* Low IF */
2053 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2054 else /* High IF */
2055 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth48937292008-05-01 07:15:38 -03002056 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
2057
Steven Toth52c99bd2008-05-01 04:57:01 -03002058 }
Steven Toth3935c252008-05-01 05:45:44 -03002059 if (state->Mod_Type == MXL_ANALOG_CABLE) {
2060 /* Analog Cable Mode */
Steven Toth85d220d2008-05-01 05:48:14 -03002061 /* state->Mode = MXL_DIGITAL_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002062
Steven Toth3935c252008-05-01 05:45:44 -03002063 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002064
Steven Toth3935c252008-05-01 05:45:44 -03002065 /* Disable RSSI */
2066 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2067 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2068 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2069 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Tothd211017b2008-05-01 19:35:54 -03002070 /* change for 2.6.3 */
2071 status += MXL_ControlWrite(fe, AGC_IF, 1);
Steven Toth3935c252008-05-01 05:45:44 -03002072 status += MXL_ControlWrite(fe, AGC_RF, 15);
2073 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002074 }
2075
Steven Toth3935c252008-05-01 05:45:44 -03002076 if (state->Mod_Type == MXL_ANALOG_OTA) {
2077 /* Analog OTA Terrestrial mode add for 2.6.7 */
2078 /* state->Mode = MXL_ANALOG_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002079
Steven Toth3935c252008-05-01 05:45:44 -03002080 /* Enable RSSI */
2081 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2082 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2083 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2084 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002085
Steven Toth3935c252008-05-01 05:45:44 -03002086 /* RSSI reference point */
2087 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2088 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2089 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2090 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2091 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002092 }
2093
Steven Toth3935c252008-05-01 05:45:44 -03002094 /* RSSI disable */
Steven Tothd211017b2008-05-01 19:35:54 -03002095 if (state->EN_RSSI == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03002096 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2097 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2098 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2099 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002100 }
2101
Steven Toth3935c252008-05-01 05:45:44 -03002102 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03002103}
2104
Steven Toth85d220d2008-05-01 05:48:14 -03002105u16 MXL_IFSynthInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03002106{
Steven Toth85d220d2008-05-01 05:48:14 -03002107 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03002108 u16 status = 0 ;
Steven Totha8214d42008-05-01 05:02:58 -03002109 u32 Fref = 0 ;
2110 u32 Kdbl, intModVal ;
2111 u32 fracModVal ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002112 Kdbl = 2 ;
2113
Steven Toth3935c252008-05-01 05:45:44 -03002114 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002115 Kdbl = 2 ;
Steven Toth3935c252008-05-01 05:45:44 -03002116 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002117 Kdbl = 1 ;
2118
Steven Tothd211017b2008-05-01 19:35:54 -03002119 /* IF Synthesizer Control */
2120 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF mode */ {
Steven Toth85d220d2008-05-01 05:48:14 -03002121 if (state->IF_LO == 41000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002122 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2123 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002124 Fref = 328000000UL ;
2125 }
Steven Toth85d220d2008-05-01 05:48:14 -03002126 if (state->IF_LO == 47000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002127 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2128 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002129 Fref = 376000000UL ;
2130 }
Steven Toth85d220d2008-05-01 05:48:14 -03002131 if (state->IF_LO == 54000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002132 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2133 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002134 Fref = 324000000UL ;
2135 }
Steven Toth85d220d2008-05-01 05:48:14 -03002136 if (state->IF_LO == 60000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002137 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2138 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002139 Fref = 360000000UL ;
2140 }
Steven Toth85d220d2008-05-01 05:48:14 -03002141 if (state->IF_LO == 39250000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002142 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2143 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002144 Fref = 314000000UL ;
2145 }
Steven Toth85d220d2008-05-01 05:48:14 -03002146 if (state->IF_LO == 39650000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002147 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2148 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002149 Fref = 317200000UL ;
2150 }
Steven Toth85d220d2008-05-01 05:48:14 -03002151 if (state->IF_LO == 40150000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002152 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2153 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002154 Fref = 321200000UL ;
2155 }
Steven Toth85d220d2008-05-01 05:48:14 -03002156 if (state->IF_LO == 40650000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002157 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2158 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002159 Fref = 325200000UL ;
2160 }
2161 }
2162
Steven Tothd211017b2008-05-01 19:35:54 -03002163 if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0)) {
Steven Toth85d220d2008-05-01 05:48:14 -03002164 if (state->IF_LO == 57000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002165 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2166 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002167 Fref = 342000000UL ;
2168 }
Steven Toth85d220d2008-05-01 05:48:14 -03002169 if (state->IF_LO == 44000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002170 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2171 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002172 Fref = 352000000UL ;
2173 }
Steven Toth85d220d2008-05-01 05:48:14 -03002174 if (state->IF_LO == 43750000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002175 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2176 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002177 Fref = 350000000UL ;
2178 }
Steven Toth85d220d2008-05-01 05:48:14 -03002179 if (state->IF_LO == 36650000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002180 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2181 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002182 Fref = 366500000UL ;
2183 }
Steven Toth85d220d2008-05-01 05:48:14 -03002184 if (state->IF_LO == 36150000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002185 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2186 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002187 Fref = 361500000UL ;
2188 }
Steven Toth85d220d2008-05-01 05:48:14 -03002189 if (state->IF_LO == 36000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002190 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2191 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002192 Fref = 360000000UL ;
2193 }
Steven Toth85d220d2008-05-01 05:48:14 -03002194 if (state->IF_LO == 35250000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002195 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2196 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002197 Fref = 352500000UL ;
2198 }
Steven Toth85d220d2008-05-01 05:48:14 -03002199 if (state->IF_LO == 34750000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002200 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2201 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002202 Fref = 347500000UL ;
2203 }
Steven Toth85d220d2008-05-01 05:48:14 -03002204 if (state->IF_LO == 6280000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002205 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2206 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002207 Fref = 376800000UL ;
2208 }
Steven Toth85d220d2008-05-01 05:48:14 -03002209 if (state->IF_LO == 5000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002210 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);
2211 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002212 Fref = 360000000UL ;
2213 }
Steven Toth85d220d2008-05-01 05:48:14 -03002214 if (state->IF_LO == 4500000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002215 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);
2216 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002217 Fref = 360000000UL ;
2218 }
Steven Toth85d220d2008-05-01 05:48:14 -03002219 if (state->IF_LO == 4570000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002220 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);
2221 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002222 Fref = 365600000UL ;
2223 }
Steven Toth85d220d2008-05-01 05:48:14 -03002224 if (state->IF_LO == 4000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002225 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05);
2226 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002227 Fref = 360000000UL ;
2228 }
Steven Tothd211017b2008-05-01 19:35:54 -03002229 if (state->IF_LO == 57400000UL) {
2230 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2231 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002232 Fref = 344400000UL ;
2233 }
Steven Tothd211017b2008-05-01 19:35:54 -03002234 if (state->IF_LO == 44400000UL) {
2235 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2236 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002237 Fref = 355200000UL ;
2238 }
Steven Tothd211017b2008-05-01 19:35:54 -03002239 if (state->IF_LO == 44150000UL) {
2240 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2241 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002242 Fref = 353200000UL ;
2243 }
Steven Tothd211017b2008-05-01 19:35:54 -03002244 if (state->IF_LO == 37050000UL) {
2245 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2246 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002247 Fref = 370500000UL ;
2248 }
Steven Tothd211017b2008-05-01 19:35:54 -03002249 if (state->IF_LO == 36550000UL) {
2250 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2251 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002252 Fref = 365500000UL ;
2253 }
Steven Toth85d220d2008-05-01 05:48:14 -03002254 if (state->IF_LO == 36125000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002255 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2256 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002257 Fref = 361250000UL ;
2258 }
Steven Toth85d220d2008-05-01 05:48:14 -03002259 if (state->IF_LO == 6000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002260 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2261 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002262 Fref = 360000000UL ;
2263 }
Steven Tothd211017b2008-05-01 19:35:54 -03002264 if (state->IF_LO == 5400000UL) {
2265 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2266 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002267 Fref = 324000000UL ;
2268 }
Steven Toth85d220d2008-05-01 05:48:14 -03002269 if (state->IF_LO == 5380000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002270 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2271 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002272 Fref = 322800000UL ;
2273 }
Steven Toth85d220d2008-05-01 05:48:14 -03002274 if (state->IF_LO == 5200000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002275 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);
2276 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002277 Fref = 374400000UL ;
2278 }
Steven Tothd211017b2008-05-01 19:35:54 -03002279 if (state->IF_LO == 4900000UL) {
2280 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);
2281 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002282 Fref = 352800000UL ;
2283 }
Steven Tothd211017b2008-05-01 19:35:54 -03002284 if (state->IF_LO == 4400000UL) {
2285 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);
2286 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002287 Fref = 352000000UL ;
2288 }
Steven Tothd211017b2008-05-01 19:35:54 -03002289 if (state->IF_LO == 4063000UL) /* add for 2.6.8 */ {
2290 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05);
2291 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002292 Fref = 365670000UL ;
2293 }
2294 }
Steven Tothd211017b2008-05-01 19:35:54 -03002295 /* CHCAL_INT_MOD_IF */
2296 /* CHCAL_FRAC_MOD_IF */
2297 intModVal = Fref / (state->Fxtal * Kdbl/2);
2298 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002299
Steven Tothd211017b2008-05-01 19:35:54 -03002300 fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) *
2301 intModVal);
2302
2303 fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000);
2304 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002305
Steven Toth52c99bd2008-05-01 04:57:01 -03002306 return status ;
2307}
2308
Steven Totha8214d42008-05-01 05:02:58 -03002309u32 MXL_GetXtalInt(u32 Xtal_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002310{
2311 if ((Xtal_Freq % 1000000) == 0)
Steven Tothd211017b2008-05-01 19:35:54 -03002312 return (Xtal_Freq / 10000);
Steven Toth52c99bd2008-05-01 04:57:01 -03002313 else
Steven Tothd211017b2008-05-01 19:35:54 -03002314 return (((Xtal_Freq / 1000000) + 1)*100);
Steven Toth52c99bd2008-05-01 04:57:01 -03002315}
2316
Steven Toth3935c252008-05-01 05:45:44 -03002317u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002318{
Steven Toth85d220d2008-05-01 05:48:14 -03002319 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03002320 u16 status = 0;
2321 u32 divider_val, E3, E4, E5, E5A;
2322 u32 Fmax, Fmin, FmaxBin, FminBin;
Steven Totha8214d42008-05-01 05:02:58 -03002323 u32 Kdbl_RF = 2;
Steven Toth3935c252008-05-01 05:45:44 -03002324 u32 tg_divval;
2325 u32 tg_lo;
2326 u32 Xtal_Int;
Steven Toth52c99bd2008-05-01 04:57:01 -03002327
Steven Totha8214d42008-05-01 05:02:58 -03002328 u32 Fref_TG;
2329 u32 Fvco;
Steven Toth52c99bd2008-05-01 04:57:01 -03002330
Steven Toth3935c252008-05-01 05:45:44 -03002331 Xtal_Int = MXL_GetXtalInt(state->Fxtal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002332
Steven Toth3935c252008-05-01 05:45:44 -03002333 state->RF_IN = RF_Freq;
Steven Toth52c99bd2008-05-01 04:57:01 -03002334
Steven Toth3935c252008-05-01 05:45:44 -03002335 MXL_SynthRFTGLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002336
Steven Toth3935c252008-05-01 05:45:44 -03002337 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2338 Kdbl_RF = 2;
2339 if (state->Fxtal > 22000000 && state->Fxtal <= 32000000)
2340 Kdbl_RF = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03002341
Steven Tothd211017b2008-05-01 19:35:54 -03002342 /* Downconverter Controls
2343 * Look-Up Table Implementation for:
2344 * DN_POLY
2345 * DN_RFGAIN
2346 * DN_CAP_RFLPF
2347 * DN_EN_VHFUHFBAR
2348 * DN_GAIN_ADJUST
2349 * Change the boundary reference from RF_IN to RF_LO
2350 */
2351 if (state->RF_LO < 40000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002352 return -1;
Steven Tothd211017b2008-05-01 19:35:54 -03002353
Steven Toth3935c252008-05-01 05:45:44 -03002354 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002355 status += MXL_ControlWrite(fe, DN_POLY, 2);
2356 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2357 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 423);
2358 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2359 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002360 }
Steven Toth3935c252008-05-01 05:45:44 -03002361 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002362 status += MXL_ControlWrite(fe, DN_POLY, 3);
2363 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2364 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 222);
2365 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2366 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002367 }
Steven Toth3935c252008-05-01 05:45:44 -03002368 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002369 status += MXL_ControlWrite(fe, DN_POLY, 3);
2370 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2371 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 147);
2372 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2373 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002374 }
Steven Toth3935c252008-05-01 05:45:44 -03002375 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002376 status += MXL_ControlWrite(fe, DN_POLY, 3);
2377 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2378 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 9);
2379 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2380 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002381 }
Steven Toth3935c252008-05-01 05:45:44 -03002382 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002383 status += MXL_ControlWrite(fe, DN_POLY, 3);
2384 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2385 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);
2386 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2387 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002388 }
Steven Toth3935c252008-05-01 05:45:44 -03002389 if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002390 status += MXL_ControlWrite(fe, DN_POLY, 3);
2391 status += MXL_ControlWrite(fe, DN_RFGAIN, 1);
2392 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);
2393 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0);
2394 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002395 }
Steven Toth3935c252008-05-01 05:45:44 -03002396 if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002397 status += MXL_ControlWrite(fe, DN_POLY, 3);
2398 status += MXL_ControlWrite(fe, DN_RFGAIN, 2);
2399 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);
2400 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0);
2401 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002402 }
Steven Tothd211017b2008-05-01 19:35:54 -03002403 if (state->RF_LO > 900000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002404 return -1;
Steven Tothd211017b2008-05-01 19:35:54 -03002405
2406 /* DN_IQTNBUF_AMP */
2407 /* DN_IQTNGNBFBIAS_BST */
Steven Toth3935c252008-05-01 05:45:44 -03002408 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
2409 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2410 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002411 }
Steven Toth3935c252008-05-01 05:45:44 -03002412 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
2413 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2414 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002415 }
Steven Toth3935c252008-05-01 05:45:44 -03002416 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
2417 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2418 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002419 }
Steven Toth3935c252008-05-01 05:45:44 -03002420 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
2421 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2422 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002423 }
Steven Toth3935c252008-05-01 05:45:44 -03002424 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
2425 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2426 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002427 }
Steven Toth3935c252008-05-01 05:45:44 -03002428 if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) {
2429 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2430 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002431 }
Steven Toth3935c252008-05-01 05:45:44 -03002432 if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) {
2433 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2434 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002435 }
Steven Toth3935c252008-05-01 05:45:44 -03002436 if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) {
2437 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2438 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002439 }
Steven Toth3935c252008-05-01 05:45:44 -03002440 if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) {
2441 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2442 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002443 }
Steven Toth3935c252008-05-01 05:45:44 -03002444 if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) {
2445 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2446 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002447 }
Steven Toth3935c252008-05-01 05:45:44 -03002448 if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) {
2449 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2450 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002451 }
Steven Toth3935c252008-05-01 05:45:44 -03002452 if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) {
2453 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2454 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002455 }
Steven Toth3935c252008-05-01 05:45:44 -03002456 if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) {
2457 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2458 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002459 }
Steven Toth3935c252008-05-01 05:45:44 -03002460 if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) {
2461 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2462 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002463 }
Steven Toth3935c252008-05-01 05:45:44 -03002464 if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) {
2465 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2466 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002467 }
Steven Toth3935c252008-05-01 05:45:44 -03002468 if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) {
2469 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2470 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002471 }
2472
Steven Tothd211017b2008-05-01 19:35:54 -03002473 /*
2474 * Set RF Synth and LO Path Control
2475 *
2476 * Look-Up table implementation for:
2477 * RFSYN_EN_OUTMUX
2478 * RFSYN_SEL_VCO_OUT
2479 * RFSYN_SEL_VCO_HI
2480 * RFSYN_SEL_DIVM
2481 * RFSYN_RF_DIV_BIAS
2482 * DN_SEL_FREQ
2483 *
2484 * Set divider_val, Fmax, Fmix to use in Equations
2485 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002486 FminBin = 28000000UL ;
2487 FmaxBin = 42500000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002488 if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) {
2489 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2490 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2491 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2492 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2493 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2494 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002495 divider_val = 64 ;
2496 Fmax = FmaxBin ;
2497 Fmin = FminBin ;
2498 }
2499 FminBin = 42500000UL ;
2500 FmaxBin = 56000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002501 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2502 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2503 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2504 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2505 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2506 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2507 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002508 divider_val = 64 ;
2509 Fmax = FmaxBin ;
2510 Fmin = FminBin ;
2511 }
2512 FminBin = 56000000UL ;
2513 FmaxBin = 85000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002514 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002515 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2516 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2517 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2518 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2519 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2520 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002521 divider_val = 32 ;
2522 Fmax = FmaxBin ;
2523 Fmin = FminBin ;
2524 }
2525 FminBin = 85000000UL ;
2526 FmaxBin = 112000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002527 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002528 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2529 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2530 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2531 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2532 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2533 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002534 divider_val = 32 ;
2535 Fmax = FmaxBin ;
2536 Fmin = FminBin ;
2537 }
2538 FminBin = 112000000UL ;
2539 FmaxBin = 170000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002540 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002541 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2542 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2543 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2544 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2545 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2546 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002547 divider_val = 16 ;
2548 Fmax = FmaxBin ;
2549 Fmin = FminBin ;
2550 }
2551 FminBin = 170000000UL ;
2552 FmaxBin = 225000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002553 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002554 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2555 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2556 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2557 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2558 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2559 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002560 divider_val = 16 ;
2561 Fmax = FmaxBin ;
2562 Fmin = FminBin ;
2563 }
2564 FminBin = 225000000UL ;
2565 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002566 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002567 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2568 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2569 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2570 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2571 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2572 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 4);
Steven Toth52c99bd2008-05-01 04:57:01 -03002573 divider_val = 8 ;
2574 Fmax = 340000000UL ;
2575 Fmin = FminBin ;
2576 }
2577 FminBin = 300000000UL ;
2578 FmaxBin = 340000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002579 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002580 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2581 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2582 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2583 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2584 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2585 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002586 divider_val = 8 ;
2587 Fmax = FmaxBin ;
2588 Fmin = 225000000UL ;
2589 }
2590 FminBin = 340000000UL ;
2591 FmaxBin = 450000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002592 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002593 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2594 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2595 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2596 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2597 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 2);
2598 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002599 divider_val = 8 ;
2600 Fmax = FmaxBin ;
2601 Fmin = FminBin ;
2602 }
2603 FminBin = 450000000UL ;
2604 FmaxBin = 680000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002605 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002606 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2607 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2608 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2609 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1);
2610 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2611 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002612 divider_val = 4 ;
2613 Fmax = FmaxBin ;
2614 Fmin = FminBin ;
2615 }
2616 FminBin = 680000000UL ;
2617 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002618 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002619 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2620 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2621 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2622 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1);
2623 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2624 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002625 divider_val = 4 ;
2626 Fmax = FmaxBin ;
2627 Fmin = FminBin ;
2628 }
2629
Steven Tothd211017b2008-05-01 19:35:54 -03002630 /* CHCAL_INT_MOD_RF
2631 * CHCAL_FRAC_MOD_RF
2632 * RFSYN_LPF_R
2633 * CHCAL_EN_INT_RF
2634 */
2635 /* Equation E3 RFSYN_VCO_BIAS */
Steven Toth3935c252008-05-01 05:45:44 -03002636 E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ;
Steven Tothd211017b2008-05-01 19:35:54 -03002637 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002638
Steven Tothd211017b2008-05-01 19:35:54 -03002639 /* Equation E4 CHCAL_INT_MOD_RF */
2640 E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000);
2641 MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4);
Steven Toth52c99bd2008-05-01 04:57:01 -03002642
Steven Tothd211017b2008-05-01 19:35:54 -03002643 /* Equation E5 CHCAL_FRAC_MOD_RF CHCAL_EN_INT_RF */
2644 E5 = ((2<<17)*(state->RF_LO/10000*divider_val -
2645 (E4*(2*state->Fxtal*Kdbl_RF)/10000))) /
2646 (2*state->Fxtal*Kdbl_RF/10000);
Steven Toth52c99bd2008-05-01 04:57:01 -03002647
Steven Tothd211017b2008-05-01 19:35:54 -03002648 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);
2649
2650 /* Equation E5A RFSYN_LPF_R */
Steven Toth3935c252008-05-01 05:45:44 -03002651 E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;
Steven Tothd211017b2008-05-01 19:35:54 -03002652 status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A);
Steven Toth52c99bd2008-05-01 04:57:01 -03002653
Steven Tothd211017b2008-05-01 19:35:54 -03002654 /* Euqation E5B CHCAL_EN_INIT_RF */
Steven Toth3935c252008-05-01 05:45:44 -03002655 status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));
Steven Tothd211017b2008-05-01 19:35:54 -03002656 /*if (E5 == 0)
2657 * status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);
2658 *else
2659 * status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);
2660 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002661
Steven Tothd211017b2008-05-01 19:35:54 -03002662 /*
2663 * Set TG Synth
2664 *
2665 * Look-Up table implementation for:
2666 * TG_LO_DIVVAL
2667 * TG_LO_SELVAL
2668 *
2669 * Set divider_val, Fmax, Fmix to use in Equations
2670 */
2671 if (state->TG_LO < 33000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002672 return -1;
Steven Tothd211017b2008-05-01 19:35:54 -03002673
Steven Toth52c99bd2008-05-01 04:57:01 -03002674 FminBin = 33000000UL ;
2675 FmaxBin = 50000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002676 if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002677 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x6);
2678 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002679 divider_val = 36 ;
2680 Fmax = FmaxBin ;
2681 Fmin = FminBin ;
2682 }
2683 FminBin = 50000000UL ;
2684 FmaxBin = 67000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002685 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002686 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x1);
2687 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002688 divider_val = 24 ;
2689 Fmax = FmaxBin ;
2690 Fmin = FminBin ;
2691 }
2692 FminBin = 67000000UL ;
2693 FmaxBin = 100000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002694 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002695 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0xC);
2696 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002697 divider_val = 18 ;
2698 Fmax = FmaxBin ;
2699 Fmin = FminBin ;
2700 }
2701 FminBin = 100000000UL ;
2702 FmaxBin = 150000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002703 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002704 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);
2705 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002706 divider_val = 12 ;
2707 Fmax = FmaxBin ;
2708 Fmin = FminBin ;
2709 }
2710 FminBin = 150000000UL ;
2711 FmaxBin = 200000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002712 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002713 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);
2714 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002715 divider_val = 8 ;
2716 Fmax = FmaxBin ;
2717 Fmin = FminBin ;
2718 }
2719 FminBin = 200000000UL ;
2720 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002721 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002722 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);
2723 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002724 divider_val = 6 ;
2725 Fmax = FmaxBin ;
2726 Fmin = FminBin ;
2727 }
2728 FminBin = 300000000UL ;
2729 FmaxBin = 400000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002730 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002731 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);
2732 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002733 divider_val = 4 ;
2734 Fmax = FmaxBin ;
2735 Fmin = FminBin ;
2736 }
2737 FminBin = 400000000UL ;
2738 FmaxBin = 600000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002739 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002740 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);
2741 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03002742 divider_val = 3 ;
2743 Fmax = FmaxBin ;
2744 Fmin = FminBin ;
2745 }
2746 FminBin = 600000000UL ;
2747 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002748 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002749 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);
2750 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03002751 divider_val = 2 ;
2752 Fmax = FmaxBin ;
2753 Fmin = FminBin ;
2754 }
2755
Steven Tothd211017b2008-05-01 19:35:54 -03002756 /* TG_DIV_VAL */
2757 tg_divval = (state->TG_LO*divider_val/100000) *
2758 (MXL_Ceiling(state->Fxtal, 1000000) * 100) /
2759 (state->Fxtal/1000);
2760
2761 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval);
Steven Toth52c99bd2008-05-01 04:57:01 -03002762
Steven Toth3935c252008-05-01 05:45:44 -03002763 if (state->TG_LO > 600000000UL)
Steven Tothd211017b2008-05-01 19:35:54 -03002764 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002765
2766 Fmax = 1800000000UL ;
2767 Fmin = 1200000000UL ;
2768
Steven Tothd211017b2008-05-01 19:35:54 -03002769 /* prevent overflow of 32 bit unsigned integer, use
2770 * following equation. Edit for v2.6.4
2771 */
2772 /* Fref_TF = Fref_TG * 1000 */
2773 Fref_TG = (state->Fxtal/1000) / MXL_Ceiling(state->Fxtal, 1000000);
Steven Toth52c99bd2008-05-01 04:57:01 -03002774
Steven Tothd211017b2008-05-01 19:35:54 -03002775 /* Fvco = Fvco/10 */
2776 Fvco = (state->TG_LO/10000) * divider_val * Fref_TG;
Steven Toth52c99bd2008-05-01 04:57:01 -03002777
2778 tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8;
2779
Steven Tothd211017b2008-05-01 19:35:54 -03002780 /* below equation is same as above but much harder to debug.
2781 * tg_lo = ( ((Fmax/10000 * Xtal_Int)/100) -
2782 * ((state->TG_LO/10000)*divider_val *
2783 * (state->Fxtal/10000)/100) )*32/((Fmax-Fmin)/10000 *
2784 * Xtal_Int/100) + 8;
2785 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002786
Steven Tothd211017b2008-05-01 19:35:54 -03002787 status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo);
Steven Toth52c99bd2008-05-01 04:57:01 -03002788
Steven Tothd211017b2008-05-01 19:35:54 -03002789 /* add for 2.6.5 Special setting for QAM */
2790 if (state->Mod_Type == MXL_QAM) {
2791 if (state->RF_IN < 680000000)
2792 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2793 else
2794 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002795 }
2796
Steven Tothd211017b2008-05-01 19:35:54 -03002797 /* Off Chip Tracking Filter Control */
2798 if (state->TF_Type == MXL_TF_OFF) {
2799 /* Tracking Filter Off State; turn off all the banks */
2800 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2801 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2802 status += MXL_SetGPIO(fe, 3, 1); /* Bank1 Off */
2803 status += MXL_SetGPIO(fe, 1, 1); /* Bank2 Off */
2804 status += MXL_SetGPIO(fe, 4, 1); /* Bank3 Off */
Steven Toth52c99bd2008-05-01 04:57:01 -03002805 }
2806
Steven Tothd211017b2008-05-01 19:35:54 -03002807 if (state->TF_Type == MXL_TF_C) /* Tracking Filter type C */ {
2808 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2809 status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002810
Steven Tothd211017b2008-05-01 19:35:54 -03002811 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
2812 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2813 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2814 status += MXL_SetGPIO(fe, 3, 0);
2815 status += MXL_SetGPIO(fe, 1, 1);
2816 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002817 }
Steven Tothd211017b2008-05-01 19:35:54 -03002818 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
2819 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2820 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2821 status += MXL_SetGPIO(fe, 3, 1);
2822 status += MXL_SetGPIO(fe, 1, 0);
2823 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002824 }
Steven Tothd211017b2008-05-01 19:35:54 -03002825 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
2826 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2827 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2828 status += MXL_SetGPIO(fe, 3, 1);
2829 status += MXL_SetGPIO(fe, 1, 0);
2830 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002831 }
Steven Tothd211017b2008-05-01 19:35:54 -03002832 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
2833 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2834 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2835 status += MXL_SetGPIO(fe, 3, 1);
2836 status += MXL_SetGPIO(fe, 1, 1);
2837 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002838 }
Steven Tothd211017b2008-05-01 19:35:54 -03002839 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
2840 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2841 status += MXL_ControlWrite(fe, DAC_DIN_B, 29);
2842 status += MXL_SetGPIO(fe, 3, 1);
2843 status += MXL_SetGPIO(fe, 1, 1);
2844 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002845 }
Steven Tothd211017b2008-05-01 19:35:54 -03002846 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
2847 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2848 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2849 status += MXL_SetGPIO(fe, 3, 1);
2850 status += MXL_SetGPIO(fe, 1, 1);
2851 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002852 }
Steven Tothd211017b2008-05-01 19:35:54 -03002853 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
2854 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2855 status += MXL_ControlWrite(fe, DAC_DIN_B, 16);
2856 status += MXL_SetGPIO(fe, 3, 1);
2857 status += MXL_SetGPIO(fe, 1, 1);
2858 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002859 }
Steven Tothd211017b2008-05-01 19:35:54 -03002860 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
2861 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2862 status += MXL_ControlWrite(fe, DAC_DIN_B, 7);
2863 status += MXL_SetGPIO(fe, 3, 1);
2864 status += MXL_SetGPIO(fe, 1, 1);
2865 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002866 }
Steven Tothd211017b2008-05-01 19:35:54 -03002867 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
2868 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2869 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2870 status += MXL_SetGPIO(fe, 3, 1);
2871 status += MXL_SetGPIO(fe, 1, 1);
2872 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002873 }
2874 }
2875
Steven Tothd211017b2008-05-01 19:35:54 -03002876 if (state->TF_Type == MXL_TF_C_H) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002877
Steven Tothd211017b2008-05-01 19:35:54 -03002878 /* Tracking Filter type C-H for Hauppauge only */
2879 status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002880
Steven Tothd211017b2008-05-01 19:35:54 -03002881 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
2882 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2883 status += MXL_SetGPIO(fe, 4, 0);
2884 status += MXL_SetGPIO(fe, 3, 1);
2885 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002886 }
Steven Tothd211017b2008-05-01 19:35:54 -03002887 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
2888 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2889 status += MXL_SetGPIO(fe, 4, 1);
2890 status += MXL_SetGPIO(fe, 3, 0);
2891 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002892 }
Steven Tothd211017b2008-05-01 19:35:54 -03002893 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
2894 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2895 status += MXL_SetGPIO(fe, 4, 1);
2896 status += MXL_SetGPIO(fe, 3, 0);
2897 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002898 }
Steven Tothd211017b2008-05-01 19:35:54 -03002899 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
2900 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2901 status += MXL_SetGPIO(fe, 4, 1);
2902 status += MXL_SetGPIO(fe, 3, 1);
2903 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002904 }
Steven Tothd211017b2008-05-01 19:35:54 -03002905 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
2906 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2907 status += MXL_SetGPIO(fe, 4, 1);
2908 status += MXL_SetGPIO(fe, 3, 1);
2909 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002910 }
Steven Tothd211017b2008-05-01 19:35:54 -03002911 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
2912 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2913 status += MXL_SetGPIO(fe, 4, 1);
2914 status += MXL_SetGPIO(fe, 3, 1);
2915 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002916 }
Steven Tothd211017b2008-05-01 19:35:54 -03002917 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
2918 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2919 status += MXL_SetGPIO(fe, 4, 1);
2920 status += MXL_SetGPIO(fe, 3, 1);
2921 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002922 }
Steven Tothd211017b2008-05-01 19:35:54 -03002923 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
2924 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2925 status += MXL_SetGPIO(fe, 4, 1);
2926 status += MXL_SetGPIO(fe, 3, 1);
2927 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002928 }
Steven Tothd211017b2008-05-01 19:35:54 -03002929 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
2930 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2931 status += MXL_SetGPIO(fe, 4, 1);
2932 status += MXL_SetGPIO(fe, 3, 1);
2933 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002934 }
2935 }
2936
Steven Tothd211017b2008-05-01 19:35:54 -03002937 if (state->TF_Type == MXL_TF_D) { /* Tracking Filter type D */
Steven Toth52c99bd2008-05-01 04:57:01 -03002938
Steven Tothd211017b2008-05-01 19:35:54 -03002939 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002940
Steven Tothd211017b2008-05-01 19:35:54 -03002941 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
2942 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2943 status += MXL_SetGPIO(fe, 4, 0);
2944 status += MXL_SetGPIO(fe, 1, 1);
2945 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002946 }
Steven Tothd211017b2008-05-01 19:35:54 -03002947 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
2948 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2949 status += MXL_SetGPIO(fe, 4, 0);
2950 status += MXL_SetGPIO(fe, 1, 0);
2951 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002952 }
Steven Tothd211017b2008-05-01 19:35:54 -03002953 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
2954 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2955 status += MXL_SetGPIO(fe, 4, 1);
2956 status += MXL_SetGPIO(fe, 1, 0);
2957 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002958 }
Steven Tothd211017b2008-05-01 19:35:54 -03002959 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
2960 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2961 status += MXL_SetGPIO(fe, 4, 1);
2962 status += MXL_SetGPIO(fe, 1, 0);
2963 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002964 }
Steven Tothd211017b2008-05-01 19:35:54 -03002965 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
2966 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2967 status += MXL_SetGPIO(fe, 4, 1);
2968 status += MXL_SetGPIO(fe, 1, 1);
2969 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002970 }
Steven Tothd211017b2008-05-01 19:35:54 -03002971 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
2972 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2973 status += MXL_SetGPIO(fe, 4, 1);
2974 status += MXL_SetGPIO(fe, 1, 1);
2975 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002976 }
Steven Tothd211017b2008-05-01 19:35:54 -03002977 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
2978 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2979 status += MXL_SetGPIO(fe, 4, 1);
2980 status += MXL_SetGPIO(fe, 1, 1);
2981 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002982 }
2983 }
2984
Steven Tothd211017b2008-05-01 19:35:54 -03002985 if (state->TF_Type == MXL_TF_D_L) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002986
Steven Tothd211017b2008-05-01 19:35:54 -03002987 /* Tracking Filter type D-L for Lumanate ONLY change 2.6.3 */
2988 status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002989
Steven Tothd211017b2008-05-01 19:35:54 -03002990 /* if UHF and terrestrial => Turn off Tracking Filter */
2991 if (state->RF_IN >= 471000000 &&
2992 (state->RF_IN - 471000000)%6000000 != 0) {
2993 /* Turn off all the banks */
2994 status += MXL_SetGPIO(fe, 3, 1);
2995 status += MXL_SetGPIO(fe, 1, 1);
2996 status += MXL_SetGPIO(fe, 4, 1);
2997 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2998 status += MXL_ControlWrite(fe, AGC_IF, 10);
2999 } else {
3000 /* if VHF or cable => Turn on Tracking Filter */
3001 if (state->RF_IN >= 43000000 &&
3002 state->RF_IN < 140000000) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003003
Steven Tothd211017b2008-05-01 19:35:54 -03003004 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3005 status += MXL_SetGPIO(fe, 4, 1);
3006 status += MXL_SetGPIO(fe, 1, 1);
3007 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003008 }
Steven Tothd211017b2008-05-01 19:35:54 -03003009 if (state->RF_IN >= 140000000 &&
3010 state->RF_IN < 240000000) {
3011 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3012 status += MXL_SetGPIO(fe, 4, 1);
3013 status += MXL_SetGPIO(fe, 1, 0);
3014 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003015 }
Steven Tothd211017b2008-05-01 19:35:54 -03003016 if (state->RF_IN >= 240000000 &&
3017 state->RF_IN < 340000000) {
3018 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3019 status += MXL_SetGPIO(fe, 4, 0);
3020 status += MXL_SetGPIO(fe, 1, 1);
3021 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003022 }
Steven Tothd211017b2008-05-01 19:35:54 -03003023 if (state->RF_IN >= 340000000 &&
3024 state->RF_IN < 430000000) {
3025 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3026 status += MXL_SetGPIO(fe, 4, 0);
3027 status += MXL_SetGPIO(fe, 1, 0);
3028 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003029 }
Steven Tothd211017b2008-05-01 19:35:54 -03003030 if (state->RF_IN >= 430000000 &&
3031 state->RF_IN < 470000000) {
3032 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3033 status += MXL_SetGPIO(fe, 4, 1);
3034 status += MXL_SetGPIO(fe, 1, 0);
3035 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003036 }
Steven Tothd211017b2008-05-01 19:35:54 -03003037 if (state->RF_IN >= 470000000 &&
3038 state->RF_IN < 570000000) {
3039 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3040 status += MXL_SetGPIO(fe, 4, 0);
3041 status += MXL_SetGPIO(fe, 1, 0);
3042 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003043 }
Steven Tothd211017b2008-05-01 19:35:54 -03003044 if (state->RF_IN >= 570000000 &&
3045 state->RF_IN < 620000000) {
3046 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3047 status += MXL_SetGPIO(fe, 4, 0);
3048 status += MXL_SetGPIO(fe, 1, 1);
3049 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003050 }
Steven Tothd211017b2008-05-01 19:35:54 -03003051 if (state->RF_IN >= 620000000 &&
3052 state->RF_IN < 760000000) {
3053 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3054 status += MXL_SetGPIO(fe, 4, 0);
3055 status += MXL_SetGPIO(fe, 1, 1);
3056 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003057 }
Steven Tothd211017b2008-05-01 19:35:54 -03003058 if (state->RF_IN >= 760000000 &&
3059 state->RF_IN <= 900000000) {
3060 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3061 status += MXL_SetGPIO(fe, 4, 1);
3062 status += MXL_SetGPIO(fe, 1, 1);
3063 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003064 }
3065 }
3066 }
3067
Steven Tothd211017b2008-05-01 19:35:54 -03003068 if (state->TF_Type == MXL_TF_E) /* Tracking Filter type E */ {
Steven Toth52c99bd2008-05-01 04:57:01 -03003069
Steven Tothd211017b2008-05-01 19:35:54 -03003070 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003071
Steven Tothd211017b2008-05-01 19:35:54 -03003072 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
3073 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3074 status += MXL_SetGPIO(fe, 4, 0);
3075 status += MXL_SetGPIO(fe, 1, 1);
3076 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003077 }
Steven Tothd211017b2008-05-01 19:35:54 -03003078 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3079 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3080 status += MXL_SetGPIO(fe, 4, 0);
3081 status += MXL_SetGPIO(fe, 1, 0);
3082 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003083 }
Steven Tothd211017b2008-05-01 19:35:54 -03003084 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
3085 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3086 status += MXL_SetGPIO(fe, 4, 1);
3087 status += MXL_SetGPIO(fe, 1, 0);
3088 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003089 }
Steven Tothd211017b2008-05-01 19:35:54 -03003090 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
3091 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3092 status += MXL_SetGPIO(fe, 4, 1);
3093 status += MXL_SetGPIO(fe, 1, 0);
3094 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003095 }
Steven Tothd211017b2008-05-01 19:35:54 -03003096 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
3097 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3098 status += MXL_SetGPIO(fe, 4, 1);
3099 status += MXL_SetGPIO(fe, 1, 1);
3100 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003101 }
Steven Tothd211017b2008-05-01 19:35:54 -03003102 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
3103 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3104 status += MXL_SetGPIO(fe, 4, 1);
3105 status += MXL_SetGPIO(fe, 1, 1);
3106 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003107 }
Steven Tothd211017b2008-05-01 19:35:54 -03003108 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
3109 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3110 status += MXL_SetGPIO(fe, 4, 1);
3111 status += MXL_SetGPIO(fe, 1, 1);
3112 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003113 }
3114 }
3115
Steven Tothd211017b2008-05-01 19:35:54 -03003116 if (state->TF_Type == MXL_TF_F) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003117
Steven Tothd211017b2008-05-01 19:35:54 -03003118 /* Tracking Filter type F */
3119 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003120
Steven Tothd211017b2008-05-01 19:35:54 -03003121 if (state->RF_IN >= 43000000 && state->RF_IN < 160000000) {
3122 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3123 status += MXL_SetGPIO(fe, 4, 0);
3124 status += MXL_SetGPIO(fe, 1, 1);
3125 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003126 }
Steven Tothd211017b2008-05-01 19:35:54 -03003127 if (state->RF_IN >= 160000000 && state->RF_IN < 210000000) {
3128 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3129 status += MXL_SetGPIO(fe, 4, 0);
3130 status += MXL_SetGPIO(fe, 1, 0);
3131 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003132 }
Steven Tothd211017b2008-05-01 19:35:54 -03003133 if (state->RF_IN >= 210000000 && state->RF_IN < 300000000) {
3134 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3135 status += MXL_SetGPIO(fe, 4, 1);
3136 status += MXL_SetGPIO(fe, 1, 0);
3137 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003138 }
Steven Tothd211017b2008-05-01 19:35:54 -03003139 if (state->RF_IN >= 300000000 && state->RF_IN < 390000000) {
3140 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3141 status += MXL_SetGPIO(fe, 4, 1);
3142 status += MXL_SetGPIO(fe, 1, 0);
3143 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003144 }
Steven Tothd211017b2008-05-01 19:35:54 -03003145 if (state->RF_IN >= 390000000 && state->RF_IN < 515000000) {
3146 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3147 status += MXL_SetGPIO(fe, 4, 1);
3148 status += MXL_SetGPIO(fe, 1, 1);
3149 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003150 }
Steven Tothd211017b2008-05-01 19:35:54 -03003151 if (state->RF_IN >= 515000000 && state->RF_IN < 650000000) {
3152 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3153 status += MXL_SetGPIO(fe, 4, 1);
3154 status += MXL_SetGPIO(fe, 1, 1);
3155 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003156 }
Steven Tothd211017b2008-05-01 19:35:54 -03003157 if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000) {
3158 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3159 status += MXL_SetGPIO(fe, 4, 1);
3160 status += MXL_SetGPIO(fe, 1, 1);
3161 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003162 }
3163 }
3164
Steven Tothd211017b2008-05-01 19:35:54 -03003165 if (state->TF_Type == MXL_TF_E_2) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003166
Steven Tothd211017b2008-05-01 19:35:54 -03003167 /* Tracking Filter type E_2 */
3168 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003169
Steven Tothd211017b2008-05-01 19:35:54 -03003170 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
3171 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3172 status += MXL_SetGPIO(fe, 4, 0);
3173 status += MXL_SetGPIO(fe, 1, 1);
3174 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003175 }
Steven Tothd211017b2008-05-01 19:35:54 -03003176 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3177 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3178 status += MXL_SetGPIO(fe, 4, 0);
3179 status += MXL_SetGPIO(fe, 1, 0);
3180 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003181 }
Steven Tothd211017b2008-05-01 19:35:54 -03003182 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
3183 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3184 status += MXL_SetGPIO(fe, 4, 1);
3185 status += MXL_SetGPIO(fe, 1, 0);
3186 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003187 }
Steven Tothd211017b2008-05-01 19:35:54 -03003188 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3189 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3190 status += MXL_SetGPIO(fe, 4, 1);
3191 status += MXL_SetGPIO(fe, 1, 0);
3192 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003193 }
Steven Tothd211017b2008-05-01 19:35:54 -03003194 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
3195 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3196 status += MXL_SetGPIO(fe, 4, 1);
3197 status += MXL_SetGPIO(fe, 1, 1);
3198 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003199 }
Steven Tothd211017b2008-05-01 19:35:54 -03003200 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
3201 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3202 status += MXL_SetGPIO(fe, 4, 1);
3203 status += MXL_SetGPIO(fe, 1, 1);
3204 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003205 }
Steven Tothd211017b2008-05-01 19:35:54 -03003206 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
3207 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3208 status += MXL_SetGPIO(fe, 4, 1);
3209 status += MXL_SetGPIO(fe, 1, 1);
3210 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003211 }
3212 }
3213
Steven Tothd211017b2008-05-01 19:35:54 -03003214 if (state->TF_Type == MXL_TF_G) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003215
Steven Tothd211017b2008-05-01 19:35:54 -03003216 /* Tracking Filter type G add for v2.6.8 */
3217 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003218
Steven Tothd211017b2008-05-01 19:35:54 -03003219 if (state->RF_IN >= 50000000 && state->RF_IN < 190000000) {
3220
3221 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3222 status += MXL_SetGPIO(fe, 4, 0);
3223 status += MXL_SetGPIO(fe, 1, 1);
3224 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003225 }
Steven Tothd211017b2008-05-01 19:35:54 -03003226 if (state->RF_IN >= 190000000 && state->RF_IN < 280000000) {
3227 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3228 status += MXL_SetGPIO(fe, 4, 0);
3229 status += MXL_SetGPIO(fe, 1, 0);
3230 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003231 }
Steven Tothd211017b2008-05-01 19:35:54 -03003232 if (state->RF_IN >= 280000000 && state->RF_IN < 350000000) {
3233 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3234 status += MXL_SetGPIO(fe, 4, 1);
3235 status += MXL_SetGPIO(fe, 1, 0);
3236 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003237 }
Steven Tothd211017b2008-05-01 19:35:54 -03003238 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3239 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3240 status += MXL_SetGPIO(fe, 4, 1);
3241 status += MXL_SetGPIO(fe, 1, 0);
3242 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003243 }
Steven Tothd211017b2008-05-01 19:35:54 -03003244 if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) {
3245 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3246 status += MXL_SetGPIO(fe, 4, 1);
3247 status += MXL_SetGPIO(fe, 1, 0);
3248 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003249 }
Steven Tothd211017b2008-05-01 19:35:54 -03003250 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
3251 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3252 status += MXL_SetGPIO(fe, 4, 1);
3253 status += MXL_SetGPIO(fe, 1, 1);
3254 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003255 }
Steven Tothd211017b2008-05-01 19:35:54 -03003256 if (state->RF_IN >= 640000000 && state->RF_IN < 820000000) {
3257 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3258 status += MXL_SetGPIO(fe, 4, 1);
3259 status += MXL_SetGPIO(fe, 1, 1);
3260 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003261 }
Steven Tothd211017b2008-05-01 19:35:54 -03003262 if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000) {
3263 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3264 status += MXL_SetGPIO(fe, 4, 1);
3265 status += MXL_SetGPIO(fe, 1, 1);
3266 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003267 }
3268 }
3269
Steven Tothd211017b2008-05-01 19:35:54 -03003270 if (state->TF_Type == MXL_TF_E_NA) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003271
Steven Tothd211017b2008-05-01 19:35:54 -03003272 /* Tracking Filter type E-NA for Empia ONLY change for 2.6.8 */
3273 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003274
Steven Tothd211017b2008-05-01 19:35:54 -03003275 /* if UHF and terrestrial=> Turn off Tracking Filter */
3276 if (state->RF_IN >= 471000000 &&
3277 (state->RF_IN - 471000000)%6000000 != 0) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003278
Steven Tothd211017b2008-05-01 19:35:54 -03003279 /* Turn off all the banks */
3280 status += MXL_SetGPIO(fe, 3, 1);
3281 status += MXL_SetGPIO(fe, 1, 1);
3282 status += MXL_SetGPIO(fe, 4, 1);
3283 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3284
3285 /* 2.6.12 Turn on RSSI */
3286 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
3287 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
3288 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
3289 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
3290
3291 /* RSSI reference point */
3292 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
3293 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
3294 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
3295
3296 /* following parameter is from analog OTA mode,
3297 * can be change to seek better performance */
3298 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
3299 } else {
3300 /* if VHF or Cable => Turn on Tracking Filter */
3301
3302 /* 2.6.12 Turn off RSSI */
3303 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
3304
3305 /* change back from above condition */
3306 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);
Steven Toth52c99bd2008-05-01 04:57:01 -03003307
3308
Steven Tothd211017b2008-05-01 19:35:54 -03003309 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003310
Steven Tothd211017b2008-05-01 19:35:54 -03003311 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3312 status += MXL_SetGPIO(fe, 4, 0);
3313 status += MXL_SetGPIO(fe, 1, 1);
3314 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003315 }
Steven Tothd211017b2008-05-01 19:35:54 -03003316 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3317 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3318 status += MXL_SetGPIO(fe, 4, 0);
3319 status += MXL_SetGPIO(fe, 1, 0);
3320 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003321 }
Steven Tothd211017b2008-05-01 19:35:54 -03003322 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
3323 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3324 status += MXL_SetGPIO(fe, 4, 1);
3325 status += MXL_SetGPIO(fe, 1, 0);
3326 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003327 }
Steven Tothd211017b2008-05-01 19:35:54 -03003328 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3329 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3330 status += MXL_SetGPIO(fe, 4, 1);
3331 status += MXL_SetGPIO(fe, 1, 0);
3332 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003333 }
Steven Tothd211017b2008-05-01 19:35:54 -03003334 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
3335 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3336 status += MXL_SetGPIO(fe, 4, 1);
3337 status += MXL_SetGPIO(fe, 1, 1);
3338 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003339 }
Steven Tothd211017b2008-05-01 19:35:54 -03003340 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
3341 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3342 status += MXL_SetGPIO(fe, 4, 1);
3343 status += MXL_SetGPIO(fe, 1, 1);
3344 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003345 }
Steven Tothd211017b2008-05-01 19:35:54 -03003346 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
3347 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3348 status += MXL_SetGPIO(fe, 4, 1);
3349 status += MXL_SetGPIO(fe, 1, 1);
3350 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003351 }
3352 }
3353 }
3354 return status ;
3355}
3356
Steven Toth3935c252008-05-01 05:45:44 -03003357u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val)
Steven Toth52c99bd2008-05-01 04:57:01 -03003358{
Steven Toth3935c252008-05-01 05:45:44 -03003359 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003360
3361 if (GPIO_Num == 1)
Steven Toth3935c252008-05-01 05:45:44 -03003362 status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1);
3363
3364 /* GPIO2 is not available */
3365
3366 if (GPIO_Num == 3) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003367 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003368 status += MXL_ControlWrite(fe, GPIO_3, 0);
3369 status += MXL_ControlWrite(fe, GPIO_3B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003370 }
3371 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003372 status += MXL_ControlWrite(fe, GPIO_3, 1);
3373 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003374 }
Steven Toth3935c252008-05-01 05:45:44 -03003375 if (GPIO_Val == 3) { /* tri-state */
3376 status += MXL_ControlWrite(fe, GPIO_3, 0);
3377 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003378 }
3379 }
Steven Toth3935c252008-05-01 05:45:44 -03003380 if (GPIO_Num == 4) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003381 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003382 status += MXL_ControlWrite(fe, GPIO_4, 0);
3383 status += MXL_ControlWrite(fe, GPIO_4B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003384 }
3385 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003386 status += MXL_ControlWrite(fe, GPIO_4, 1);
3387 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003388 }
Steven Toth3935c252008-05-01 05:45:44 -03003389 if (GPIO_Val == 3) { /* tri-state */
3390 status += MXL_ControlWrite(fe, GPIO_4, 0);
3391 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003392 }
3393 }
3394
Steven Toth3935c252008-05-01 05:45:44 -03003395 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003396}
3397
Steven Toth3935c252008-05-01 05:45:44 -03003398u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003399{
Steven Toth3935c252008-05-01 05:45:44 -03003400 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003401
Steven Toth3935c252008-05-01 05:45:44 -03003402 /* Will write ALL Matching Control Name */
Steven Tothd211017b2008-05-01 19:35:54 -03003403 /* Write Matching INIT Control */
3404 status += MXL_ControlWrite_Group(fe, ControlNum, value, 1);
3405 /* Write Matching CH Control */
3406 status += MXL_ControlWrite_Group(fe, ControlNum, value, 2);
Steven Toth3935c252008-05-01 05:45:44 -03003407#ifdef _MXL_INTERNAL
Steven Tothd211017b2008-05-01 19:35:54 -03003408 /* Write Matching MXL Control */
3409 status += MXL_ControlWrite_Group(fe, ControlNum, value, 3);
Steven Toth3935c252008-05-01 05:45:44 -03003410#endif
3411 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003412}
3413
Steven Tothd211017b2008-05-01 19:35:54 -03003414u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, u32 value,
3415 u16 controlGroup)
Steven Toth52c99bd2008-05-01 04:57:01 -03003416{
Steven Toth85d220d2008-05-01 05:48:14 -03003417 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03003418 u16 i, j, k;
3419 u32 highLimit;
3420 u32 ctrlVal;
Steven Toth52c99bd2008-05-01 04:57:01 -03003421
Steven Toth3935c252008-05-01 05:45:44 -03003422 if (controlGroup == 1) /* Initial Control */ {
3423
3424 for (i = 0; i < state->Init_Ctrl_Num; i++) {
3425
3426 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3427
3428 highLimit = 1 << state->Init_Ctrl[i].size;
3429 if (value < highLimit) {
3430 for (j = 0; j < state->Init_Ctrl[i].size; j++) {
3431 state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3432 MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]),
3433 (u8)(state->Init_Ctrl[i].bit[j]),
Steven Tothd211017b2008-05-01 19:35:54 -03003434 (u8)((value>>j) & 0x01));
Steven Toth52c99bd2008-05-01 04:57:01 -03003435 }
Steven Toth3935c252008-05-01 05:45:44 -03003436 ctrlVal = 0;
3437 for (k = 0; k < state->Init_Ctrl[i].size; k++)
3438 ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
Steven Tothd211017b2008-05-01 19:35:54 -03003439 } else
Steven Toth3935c252008-05-01 05:45:44 -03003440 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003441 }
3442 }
3443 }
Steven Toth3935c252008-05-01 05:45:44 -03003444 if (controlGroup == 2) /* Chan change Control */ {
3445
3446 for (i = 0; i < state->CH_Ctrl_Num; i++) {
3447
Steven Tothd211017b2008-05-01 19:35:54 -03003448 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003449
3450 highLimit = 1 << state->CH_Ctrl[i].size;
3451 if (value < highLimit) {
3452 for (j = 0; j < state->CH_Ctrl[i].size; j++) {
3453 state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3454 MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]),
3455 (u8)(state->CH_Ctrl[i].bit[j]),
Steven Tothd211017b2008-05-01 19:35:54 -03003456 (u8)((value>>j) & 0x01));
Steven Toth52c99bd2008-05-01 04:57:01 -03003457 }
Steven Toth3935c252008-05-01 05:45:44 -03003458 ctrlVal = 0;
3459 for (k = 0; k < state->CH_Ctrl[i].size; k++)
3460 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
Steven Tothd211017b2008-05-01 19:35:54 -03003461 } else
Steven Toth3935c252008-05-01 05:45:44 -03003462 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003463 }
3464 }
3465 }
3466#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003467 if (controlGroup == 3) /* Maxlinear Control */ {
3468
3469 for (i = 0; i < state->MXL_Ctrl_Num; i++) {
3470
Steven Tothd211017b2008-05-01 19:35:54 -03003471 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003472
Steven Tothd211017b2008-05-01 19:35:54 -03003473 highLimit = (1 << state->MXL_Ctrl[i].size);
Steven Toth3935c252008-05-01 05:45:44 -03003474 if (value < highLimit) {
3475 for (j = 0; j < state->MXL_Ctrl[i].size; j++) {
3476 state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3477 MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]),
3478 (u8)(state->MXL_Ctrl[i].bit[j]),
Steven Tothd211017b2008-05-01 19:35:54 -03003479 (u8)((value>>j) & 0x01));
Steven Toth52c99bd2008-05-01 04:57:01 -03003480 }
Steven Toth3935c252008-05-01 05:45:44 -03003481 ctrlVal = 0;
Steven Tothd211017b2008-05-01 19:35:54 -03003482 for (k = 0; k < state->MXL_Ctrl[i].size; k++)
Steven Toth3935c252008-05-01 05:45:44 -03003483 ctrlVal += state->MXL_Ctrl[i].val[k] * (1 << k);
Steven Tothd211017b2008-05-01 19:35:54 -03003484 } else
Steven Toth3935c252008-05-01 05:45:44 -03003485 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003486 }
3487 }
3488 }
3489#endif
Steven Toth3935c252008-05-01 05:45:44 -03003490 return 0 ; /* successful return */
Steven Toth52c99bd2008-05-01 04:57:01 -03003491}
3492
Steven Toth3935c252008-05-01 05:45:44 -03003493u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003494{
Steven Toth85d220d2008-05-01 05:48:14 -03003495 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003496 int i ;
3497
Steven Toth3935c252008-05-01 05:45:44 -03003498 for (i = 0; i < 104; i++) {
3499 if (RegNum == state->TunerRegs[i].Reg_Num) {
3500 state->TunerRegs[i].Reg_Val = RegVal;
3501 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003502 }
3503 }
3504
Steven Toth3935c252008-05-01 05:45:44 -03003505 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003506}
3507
Steven Toth3935c252008-05-01 05:45:44 -03003508u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003509{
Steven Toth85d220d2008-05-01 05:48:14 -03003510 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003511 int i ;
3512
Steven Toth3935c252008-05-01 05:45:44 -03003513 for (i = 0; i < 104; i++) {
Steven Tothd211017b2008-05-01 19:35:54 -03003514 if (RegNum == state->TunerRegs[i].Reg_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003515 *RegVal = (u8)(state->TunerRegs[i].Reg_Val);
3516 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003517 }
3518 }
3519
Steven Toth3935c252008-05-01 05:45:44 -03003520 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003521}
3522
Steven Toth85d220d2008-05-01 05:48:14 -03003523u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003524{
Steven Toth85d220d2008-05-01 05:48:14 -03003525 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003526 u32 ctrlVal ;
3527 u16 i, k ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003528
Steven Toth3935c252008-05-01 05:45:44 -03003529 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
3530
3531 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3532
3533 ctrlVal = 0;
3534 for (k = 0; k < state->Init_Ctrl[i].size; k++)
Steven Tothd211017b2008-05-01 19:35:54 -03003535 ctrlVal += state->Init_Ctrl[i].val[k] * (1<<k);
Steven Toth3935c252008-05-01 05:45:44 -03003536 *value = ctrlVal;
3537 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003538 }
3539 }
Steven Toth3935c252008-05-01 05:45:44 -03003540
3541 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
3542
3543 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
3544
3545 ctrlVal = 0;
3546 for (k = 0; k < state->CH_Ctrl[i].size; k++)
3547 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
3548 *value = ctrlVal;
3549 return 0;
3550
Steven Toth52c99bd2008-05-01 04:57:01 -03003551 }
3552 }
3553
3554#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003555 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
3556
3557 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
3558
3559 ctrlVal = 0;
3560 for (k = 0; k < state->MXL_Ctrl[i].size; k++)
3561 ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k);
3562 *value = ctrlVal;
3563 return 0;
3564
Steven Toth52c99bd2008-05-01 04:57:01 -03003565 }
3566 }
3567#endif
Steven Toth3935c252008-05-01 05:45:44 -03003568 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003569}
3570
Steven Tothd211017b2008-05-01 19:35:54 -03003571u16 MXL_ControlRegRead(struct dvb_frontend *fe, u16 controlNum, u8 *RegNum,
3572 int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003573{
Steven Toth85d220d2008-05-01 05:48:14 -03003574 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003575 u16 i, j, k ;
3576 u16 Count ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003577
Steven Toth3935c252008-05-01 05:45:44 -03003578 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003579
Steven Tothd211017b2008-05-01 19:35:54 -03003580 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003581
3582 Count = 1;
3583 RegNum[0] = (u8)(state->Init_Ctrl[i].addr[0]);
3584
3585 for (k = 1; k < state->Init_Ctrl[i].size; k++) {
3586
3587 for (j = 0; j < Count; j++) {
3588
Steven Tothd211017b2008-05-01 19:35:54 -03003589 if (state->Init_Ctrl[i].addr[k] !=
3590 RegNum[j]) {
Steven Toth3935c252008-05-01 05:45:44 -03003591
Steven Tothd211017b2008-05-01 19:35:54 -03003592 Count++;
Steven Toth3935c252008-05-01 05:45:44 -03003593 RegNum[Count-1] = (u8)(state->Init_Ctrl[i].addr[k]);
3594
Steven Toth52c99bd2008-05-01 04:57:01 -03003595 }
3596 }
3597
3598 }
Steven Toth3935c252008-05-01 05:45:44 -03003599 *count = Count;
3600 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003601 }
3602 }
Steven Toth3935c252008-05-01 05:45:44 -03003603 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003604
Steven Tothd211017b2008-05-01 19:35:54 -03003605 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003606
3607 Count = 1;
3608 RegNum[0] = (u8)(state->CH_Ctrl[i].addr[0]);
3609
3610 for (k = 1; k < state->CH_Ctrl[i].size; k++) {
3611
Steven Tothd211017b2008-05-01 19:35:54 -03003612 for (j = 0; j < Count; j++) {
Steven Toth3935c252008-05-01 05:45:44 -03003613
Steven Tothd211017b2008-05-01 19:35:54 -03003614 if (state->CH_Ctrl[i].addr[k] !=
3615 RegNum[j]) {
Steven Toth3935c252008-05-01 05:45:44 -03003616
Steven Tothd211017b2008-05-01 19:35:54 -03003617 Count++;
Steven Toth3935c252008-05-01 05:45:44 -03003618 RegNum[Count-1] = (u8)(state->CH_Ctrl[i].addr[k]);
3619
Steven Toth52c99bd2008-05-01 04:57:01 -03003620 }
3621 }
3622 }
Steven Toth3935c252008-05-01 05:45:44 -03003623 *count = Count;
3624 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003625 }
3626 }
3627#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003628 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003629
Steven Tothd211017b2008-05-01 19:35:54 -03003630 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003631
3632 Count = 1;
3633 RegNum[0] = (u8)(state->MXL_Ctrl[i].addr[0]);
3634
3635 for (k = 1; k < state->MXL_Ctrl[i].size; k++) {
3636
Steven Tothd211017b2008-05-01 19:35:54 -03003637 for (j = 0; j < Count; j++) {
Steven Toth3935c252008-05-01 05:45:44 -03003638
Steven Tothd211017b2008-05-01 19:35:54 -03003639 if (state->MXL_Ctrl[i].addr[k] !=
3640 RegNum[j]) {
Steven Toth3935c252008-05-01 05:45:44 -03003641
Steven Tothd211017b2008-05-01 19:35:54 -03003642 Count++;
Steven Toth3935c252008-05-01 05:45:44 -03003643 RegNum[Count-1] = (u8)state->MXL_Ctrl[i].addr[k];
3644
Steven Toth52c99bd2008-05-01 04:57:01 -03003645 }
3646 }
3647 }
Steven Toth3935c252008-05-01 05:45:44 -03003648 *count = Count;
3649 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003650 }
3651 }
3652#endif
Steven Toth3935c252008-05-01 05:45:44 -03003653 *count = 0;
3654 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003655}
3656
Steven Toth3935c252008-05-01 05:45:44 -03003657void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003658{
Steven Toth85d220d2008-05-01 05:48:14 -03003659 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003660 int i ;
3661
Steven Totha8214d42008-05-01 05:02:58 -03003662 const u8 AND_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03003663 0xFE, 0xFD, 0xFB, 0xF7,
3664 0xEF, 0xDF, 0xBF, 0x7F } ;
3665
Steven Totha8214d42008-05-01 05:02:58 -03003666 const u8 OR_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03003667 0x01, 0x02, 0x04, 0x08,
3668 0x10, 0x20, 0x40, 0x80 } ;
3669
Steven Toth3935c252008-05-01 05:45:44 -03003670 for (i = 0; i < state->TunerRegs_Num; i++) {
3671 if (state->TunerRegs[i].Reg_Num == address) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003672 if (bitVal)
Steven Toth3935c252008-05-01 05:45:44 -03003673 state->TunerRegs[i].Reg_Val |= OR_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03003674 else
Steven Toth3935c252008-05-01 05:45:44 -03003675 state->TunerRegs[i].Reg_Val &= AND_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03003676 break ;
3677 }
3678 }
Steven Toth3935c252008-05-01 05:45:44 -03003679}
Steven Toth52c99bd2008-05-01 04:57:01 -03003680
Steven Toth3935c252008-05-01 05:45:44 -03003681u32 MXL_Ceiling(u32 value, u32 resolution)
Steven Toth52c99bd2008-05-01 04:57:01 -03003682{
Steven Toth3935c252008-05-01 05:45:44 -03003683 return (value/resolution + (value % resolution > 0 ? 1 : 0));
3684}
Steven Toth52c99bd2008-05-01 04:57:01 -03003685
Steven Tothd211017b2008-05-01 19:35:54 -03003686/* Retrieve the Initialzation Registers */
3687u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
3688 u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003689{
Steven Totha8214d42008-05-01 05:02:58 -03003690 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003691 int i ;
3692
Steven Toth3935c252008-05-01 05:45:44 -03003693 u8 RegAddr[] = {
3694 11, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73,
3695 76, 77, 91, 134, 135, 137, 147,
3696 156, 166, 167, 168, 25 };
Steven Toth52c99bd2008-05-01 04:57:01 -03003697
Steven Toth3935c252008-05-01 05:45:44 -03003698 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03003699
Steven Toth3935c252008-05-01 05:45:44 -03003700 status += MXL_BlockInit(fe);
3701
3702 for (i = 0 ; i < *count; i++) {
3703 RegNum[i] = RegAddr[i];
3704 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003705 }
3706
Steven Toth3935c252008-05-01 05:45:44 -03003707 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003708}
3709
Steven Tothd211017b2008-05-01 19:35:54 -03003710u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal,
3711 int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003712{
Steven Totha8214d42008-05-01 05:02:58 -03003713 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003714 int i ;
3715
Steven Tothd211017b2008-05-01 19:35:54 -03003716/* add 77, 166, 167, 168 register for 2.6.12 */
Steven Toth52c99bd2008-05-01 04:57:01 -03003717#ifdef _MXL_PRODUCTION
Steven Totha8214d42008-05-01 05:02:58 -03003718 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106,
3719 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003720#else
Steven Totha8214d42008-05-01 05:02:58 -03003721 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106,
3722 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
Steven Tothd211017b2008-05-01 19:35:54 -03003723 /*
3724 u8 RegAddr[171];
3725 for (i = 0; i <= 170; i++)
3726 RegAddr[i] = i;
3727 */
Steven Toth52c99bd2008-05-01 04:57:01 -03003728#endif
3729
Steven Toth3935c252008-05-01 05:45:44 -03003730 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03003731
Steven Toth3935c252008-05-01 05:45:44 -03003732 for (i = 0 ; i < *count; i++) {
3733 RegNum[i] = RegAddr[i];
3734 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003735 }
3736
Steven Toth3935c252008-05-01 05:45:44 -03003737 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003738}
3739
Steven Tothd211017b2008-05-01 19:35:54 -03003740u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal,
3741 int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003742{
Steven Toth3935c252008-05-01 05:45:44 -03003743 u16 status = 0;
3744 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03003745
Steven Toth3935c252008-05-01 05:45:44 -03003746 u8 RegAddr[] = {43, 136};
Steven Toth52c99bd2008-05-01 04:57:01 -03003747
Steven Toth3935c252008-05-01 05:45:44 -03003748 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03003749
Steven Toth3935c252008-05-01 05:45:44 -03003750 for (i = 0; i < *count; i++) {
3751 RegNum[i] = RegAddr[i];
3752 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003753 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003754
Steven Toth3935c252008-05-01 05:45:44 -03003755 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003756}
3757
Steven Tothd211017b2008-05-01 19:35:54 -03003758u16 MXL_GetCHRegister_LowIF(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal,
3759 int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003760{
Steven Toth3935c252008-05-01 05:45:44 -03003761 u16 status = 0;
3762 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03003763
Steven Toth3935c252008-05-01 05:45:44 -03003764 u8 RegAddr[] = { 138 };
Steven Toth52c99bd2008-05-01 04:57:01 -03003765
Steven Toth3935c252008-05-01 05:45:44 -03003766 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03003767
Steven Toth3935c252008-05-01 05:45:44 -03003768 for (i = 0; i < *count; i++) {
3769 RegNum[i] = RegAddr[i];
3770 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003771 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003772
Steven Toth3935c252008-05-01 05:45:44 -03003773 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003774}
3775
Steven Totha8214d42008-05-01 05:02:58 -03003776u16 MXL_GetMasterControl(u8 *MasterReg, int state)
Steven Toth52c99bd2008-05-01 04:57:01 -03003777{
Steven Toth3935c252008-05-01 05:45:44 -03003778 if (state == 1) /* Load_Start */
3779 *MasterReg = 0xF3;
3780 if (state == 2) /* Power_Down */
3781 *MasterReg = 0x41;
3782 if (state == 3) /* Synth_Reset */
3783 *MasterReg = 0xB1;
3784 if (state == 4) /* Seq_Off */
3785 *MasterReg = 0xF1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003786
Steven Toth3935c252008-05-01 05:45:44 -03003787 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003788}
3789
3790#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03003791u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)
Steven Toth52c99bd2008-05-01 04:57:01 -03003792{
Steven Toth85d220d2008-05-01 05:48:14 -03003793 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003794 u16 status = 0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003795
Steven Totha8214d42008-05-01 05:02:58 -03003796 if (VCO_Range == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003797 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3798 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3799 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3800 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3801 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3802 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3803 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Tothd211017b2008-05-01 19:35:54 -03003804 if (state->Mode == 0 && state->IF_Mode == 1) {
3805 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003806 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3807 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3808 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
Steven Tothd211017b2008-05-01 19:35:54 -03003809 status += MXL_ControlWrite(fe,
3810 CHCAL_FRAC_MOD_RF, 180224);
Steven Totha8214d42008-05-01 05:02:58 -03003811 }
Steven Tothd211017b2008-05-01 19:35:54 -03003812 if (state->Mode == 0 && state->IF_Mode == 0) {
3813 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003814 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3815 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3816 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
Steven Tothd211017b2008-05-01 19:35:54 -03003817 status += MXL_ControlWrite(fe,
3818 CHCAL_FRAC_MOD_RF, 222822);
Steven Totha8214d42008-05-01 05:02:58 -03003819 }
Steven Toth3935c252008-05-01 05:45:44 -03003820 if (state->Mode == 1) /* Digital Mode */ {
3821 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3822 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3823 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
Steven Tothd211017b2008-05-01 19:35:54 -03003824 status += MXL_ControlWrite(fe,
3825 CHCAL_FRAC_MOD_RF, 229376);
Steven Totha8214d42008-05-01 05:02:58 -03003826 }
3827 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003828
Steven Totha8214d42008-05-01 05:02:58 -03003829 if (VCO_Range == 2) {
Steven Toth3935c252008-05-01 05:45:44 -03003830 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3831 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3832 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3833 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3834 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3835 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3836 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
3837 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3838 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3839 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
Steven Tothd211017b2008-05-01 19:35:54 -03003840 if (state->Mode == 0 && state->IF_Mode == 1) {
3841 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003842 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3843 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3844 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd211017b2008-05-01 19:35:54 -03003845 status += MXL_ControlWrite(fe,
3846 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003847 }
Steven Tothd211017b2008-05-01 19:35:54 -03003848 if (state->Mode == 0 && state->IF_Mode == 0) {
3849 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003850 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3851 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3852 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd211017b2008-05-01 19:35:54 -03003853 status += MXL_ControlWrite(fe,
3854 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003855 }
Steven Toth3935c252008-05-01 05:45:44 -03003856 if (state->Mode == 1) /* Digital Mode */ {
3857 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3858 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3859 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
Steven Tothd211017b2008-05-01 19:35:54 -03003860 status += MXL_ControlWrite(fe,
3861 CHCAL_FRAC_MOD_RF, 16384);
Steven Totha8214d42008-05-01 05:02:58 -03003862 }
3863 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003864
Steven Totha8214d42008-05-01 05:02:58 -03003865 if (VCO_Range == 3) {
Steven Toth3935c252008-05-01 05:45:44 -03003866 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3867 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3868 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3869 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3870 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3871 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3872 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
3873 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3874 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3875 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd211017b2008-05-01 19:35:54 -03003876 if (state->Mode == 0 && state->IF_Mode == 1) {
3877 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003878 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3879 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3880 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
Steven Tothd211017b2008-05-01 19:35:54 -03003881 status += MXL_ControlWrite(fe,
3882 CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03003883 }
Steven Tothd211017b2008-05-01 19:35:54 -03003884 if (state->Mode == 0 && state->IF_Mode == 0) {
3885 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003886 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3887 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3888 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
Steven Tothd211017b2008-05-01 19:35:54 -03003889 status += MXL_ControlWrite(fe,
3890 CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03003891 }
Steven Toth3935c252008-05-01 05:45:44 -03003892 if (state->Mode == 1) /* Digital Mode */ {
3893 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3894 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3895 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd211017b2008-05-01 19:35:54 -03003896 status += MXL_ControlWrite(fe,
3897 CHCAL_FRAC_MOD_RF, 245760);
Steven Totha8214d42008-05-01 05:02:58 -03003898 }
3899 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003900
Steven Totha8214d42008-05-01 05:02:58 -03003901 if (VCO_Range == 4) {
Steven Toth3935c252008-05-01 05:45:44 -03003902 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3903 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3904 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3905 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3906 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3907 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3908 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
3909 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3910 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3911 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd211017b2008-05-01 19:35:54 -03003912 if (state->Mode == 0 && state->IF_Mode == 1) {
3913 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003914 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3915 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3916 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd211017b2008-05-01 19:35:54 -03003917 status += MXL_ControlWrite(fe,
3918 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003919 }
Steven Tothd211017b2008-05-01 19:35:54 -03003920 if (state->Mode == 0 && state->IF_Mode == 0) {
3921 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003922 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3923 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3924 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd211017b2008-05-01 19:35:54 -03003925 status += MXL_ControlWrite(fe,
3926 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003927 }
Steven Toth3935c252008-05-01 05:45:44 -03003928 if (state->Mode == 1) /* Digital Mode */ {
3929 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3930 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3931 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd211017b2008-05-01 19:35:54 -03003932 status += MXL_ControlWrite(fe,
3933 CHCAL_FRAC_MOD_RF, 212992);
Steven Totha8214d42008-05-01 05:02:58 -03003934 }
3935 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003936
Steven Totha8214d42008-05-01 05:02:58 -03003937 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003938}
3939
Steven Toth3935c252008-05-01 05:45:44 -03003940u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)
Steven Toth52c99bd2008-05-01 04:57:01 -03003941{
Steven Toth85d220d2008-05-01 05:48:14 -03003942 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003943 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003944
3945 if (Hystersis == 1)
Steven Toth3935c252008-05-01 05:45:44 -03003946 status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003947
Steven Totha8214d42008-05-01 05:02:58 -03003948 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003949}
3950#endif
Steven Toth48937292008-05-01 07:15:38 -03003951/* End: Reference driver code found in the Realtek driver that
3952 * is copyright MaxLinear */
Steven Toth52c99bd2008-05-01 04:57:01 -03003953
Steven Toth48937292008-05-01 07:15:38 -03003954/* ----------------------------------------------------------------
3955 * Begin: Everything after here is new code to adapt the
3956 * proprietary Realtek driver into a Linux API tuner.
3957 * Copyright (C) 2008 Steven Toth <stoth@hauppauge.com>
3958 */
3959static int mxl5005s_reset(struct dvb_frontend *fe)
3960{
3961 struct mxl5005s_state *state = fe->tuner_priv;
3962 int ret = 0;
3963
3964 u8 buf[2] = { 0xff, 0x00 };
3965 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
3966 .buf = buf, .len = 2 };
3967
3968 dprintk(2, "%s()\n", __func__);
3969
3970 if (fe->ops.i2c_gate_ctrl)
3971 fe->ops.i2c_gate_ctrl(fe, 1);
3972
3973 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
3974 printk(KERN_WARNING "mxl5005s I2C reset failed\n");
3975 ret = -EREMOTEIO;
3976 }
3977
3978 if (fe->ops.i2c_gate_ctrl)
3979 fe->ops.i2c_gate_ctrl(fe, 0);
3980
3981 return ret;
3982}
3983
3984/* Write a single byte to a single reg, latch the value if required by
3985 * following the transaction with the latch byte.
3986 */
3987static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val, int latch)
3988{
3989 struct mxl5005s_state *state = fe->tuner_priv;
3990 u8 buf[3] = { reg, val, MXL5005S_LATCH_BYTE };
3991 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
3992 .buf = buf, .len = 3 };
3993
3994 if (latch == 0)
3995 msg.len = 2;
3996
Steven Tothd211017b2008-05-01 19:35:54 -03003997 dprintk(2, "%s(0x%x, 0x%x, 0x%x)\n", __func__, reg, val, msg.addr);
Steven Toth48937292008-05-01 07:15:38 -03003998
3999 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
4000 printk(KERN_WARNING "mxl5005s I2C write failed\n");
4001 return -EREMOTEIO;
4002 }
4003 return 0;
4004}
4005
Steven Tothd211017b2008-05-01 19:35:54 -03004006int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable, u8 *datatable,
4007 u8 len)
Steven Toth48937292008-05-01 07:15:38 -03004008{
4009 int ret = 0, i;
4010
4011 if (fe->ops.i2c_gate_ctrl)
4012 fe->ops.i2c_gate_ctrl(fe, 1);
4013
4014 for (i = 0 ; i < len-1; i++) {
4015 ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 0);
4016 if (ret < 0)
4017 break;
4018 }
4019
4020 ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 1);
4021
4022 if (fe->ops.i2c_gate_ctrl)
4023 fe->ops.i2c_gate_ctrl(fe, 0);
4024
4025 return ret;
4026}
Steven Toth7f5c3af2008-05-01 06:51:36 -03004027
Steven Toth85d220d2008-05-01 05:48:14 -03004028
Steven Toth8c66a192008-05-01 06:35:48 -03004029int mxl5005s_init(struct dvb_frontend *fe)
Steven Toth85d220d2008-05-01 05:48:14 -03004030{
Steven Toth48937292008-05-01 07:15:38 -03004031 dprintk(1, "%s()\n", __func__);
4032 return mxl5005s_reconfigure(fe, MXL_QAM, MXL5005S_BANDWIDTH_6MHZ);
4033}
4034
4035int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type, u32 bandwidth)
4036{
4037 struct mxl5005s_state *state = fe->tuner_priv;
4038
4039 u8 AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4040 u8 ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4041 int TableLen;
4042
4043 dprintk(1, "%s(type=%d, bw=%d)\n", __func__, mod_type, bandwidth);
4044
4045 mxl5005s_reset(fe);
4046
4047 /* Tuner initialization stage 0 */
4048 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
4049 AddrTable[0] = MASTER_CONTROL_ADDR;
4050 ByteTable[0] |= state->config->AgcMasterByte;
4051
4052 mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);
4053
4054 mxl5005s_AssignTunerMode(fe, mod_type, bandwidth);
4055
4056 /* Tuner initialization stage 1 */
4057 MXL_GetInitRegister(fe, AddrTable, ByteTable, &TableLen);
4058
4059 mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
4060
4061 return 0;
4062}
4063
Steven Tothd211017b2008-05-01 19:35:54 -03004064int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,
4065 u32 bandwidth)
Steven Toth48937292008-05-01 07:15:38 -03004066{
4067 struct mxl5005s_state *state = fe->tuner_priv;
4068 struct mxl5005s_config *c = state->config;
4069
4070 InitTunerControls(fe);
Steven Toth85d220d2008-05-01 05:48:14 -03004071
4072 /* Set MxL5005S parameters. */
Steven Toth85d220d2008-05-01 05:48:14 -03004073 MXL5005_TunerConfig(
4074 fe,
Steven Toth48937292008-05-01 07:15:38 -03004075 c->mod_mode,
4076 c->if_mode,
4077 bandwidth,
4078 c->if_freq,
4079 c->xtal_freq,
4080 c->agc_mode,
4081 c->top,
4082 c->output_load,
4083 c->clock_out,
4084 c->div_out,
4085 c->cap_select,
4086 c->rssi_enable,
4087 mod_type,
4088 c->tracking_filter);
Steven Toth85d220d2008-05-01 05:48:14 -03004089
Steven Toth48937292008-05-01 07:15:38 -03004090 return 0;
Steven Toth85d220d2008-05-01 05:48:14 -03004091}
4092
4093static int mxl5005s_set_params(struct dvb_frontend *fe,
4094 struct dvb_frontend_parameters *params)
4095{
Steven Toth48937292008-05-01 07:15:38 -03004096 struct mxl5005s_state *state = fe->tuner_priv;
4097 u32 req_mode, req_bw = 0;
4098 int ret;
Steven Toth85d220d2008-05-01 05:48:14 -03004099
Steven Toth48937292008-05-01 07:15:38 -03004100 dprintk(1, "%s()\n", __func__);
Steven Toth85d220d2008-05-01 05:48:14 -03004101
Steven Toth48937292008-05-01 07:15:38 -03004102 if (fe->ops.info.type == FE_ATSC) {
4103 switch (params->u.vsb.modulation) {
4104 case VSB_8:
4105 req_mode = MXL_ATSC; break;
4106 default:
4107 case QAM_64:
4108 case QAM_256:
4109 case QAM_AUTO:
4110 req_mode = MXL_QAM; break;
4111 }
Steven Tothd211017b2008-05-01 19:35:54 -03004112 } else
4113 req_mode = MXL_DVBT;
Steven Toth85d220d2008-05-01 05:48:14 -03004114
Steven Toth48937292008-05-01 07:15:38 -03004115 /* Change tuner for new modulation type if reqd */
4116 if (req_mode != state->current_mode) {
4117 switch (req_mode) {
4118 case VSB_8:
4119 case QAM_64:
4120 case QAM_256:
4121 case QAM_AUTO:
4122 req_bw = MXL5005S_BANDWIDTH_6MHZ;
4123 break;
4124 default:
4125 /* Assume DVB-T */
4126 switch (params->u.ofdm.bandwidth) {
4127 case BANDWIDTH_6_MHZ:
4128 req_bw = MXL5005S_BANDWIDTH_6MHZ;
4129 break;
4130 case BANDWIDTH_7_MHZ:
4131 req_bw = MXL5005S_BANDWIDTH_7MHZ;
4132 break;
4133 case BANDWIDTH_AUTO:
4134 case BANDWIDTH_8_MHZ:
4135 req_bw = MXL5005S_BANDWIDTH_8MHZ;
4136 break;
4137 }
4138 }
4139
4140 state->current_mode = req_mode;
4141 ret = mxl5005s_reconfigure(fe, req_mode, req_bw);
4142
4143 } else
4144 ret = 0;
4145
4146 if (ret == 0) {
4147 dprintk(1, "%s() freq=%d\n", __func__, params->frequency);
4148 ret = mxl5005s_SetRfFreqHz(fe, params->frequency);
4149 }
4150
4151 return ret;
Steven Toth85d220d2008-05-01 05:48:14 -03004152}
4153
4154static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency)
4155{
4156 struct mxl5005s_state *state = fe->tuner_priv;
4157 dprintk(1, "%s()\n", __func__);
4158
4159 *frequency = state->RF_IN;
4160
4161 return 0;
4162}
4163
4164static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
4165{
4166 struct mxl5005s_state *state = fe->tuner_priv;
4167 dprintk(1, "%s()\n", __func__);
4168
4169 *bandwidth = state->Chan_Bandwidth;
4170
4171 return 0;
4172}
4173
Steven Toth85d220d2008-05-01 05:48:14 -03004174static int mxl5005s_release(struct dvb_frontend *fe)
4175{
4176 dprintk(1, "%s()\n", __func__);
4177 kfree(fe->tuner_priv);
4178 fe->tuner_priv = NULL;
4179 return 0;
4180}
4181
4182static const struct dvb_tuner_ops mxl5005s_tuner_ops = {
4183 .info = {
4184 .name = "MaxLinear MXL5005S",
4185 .frequency_min = 48000000,
4186 .frequency_max = 860000000,
4187 .frequency_step = 50000,
4188 },
4189
4190 .release = mxl5005s_release,
4191 .init = mxl5005s_init,
4192
4193 .set_params = mxl5005s_set_params,
4194 .get_frequency = mxl5005s_get_frequency,
4195 .get_bandwidth = mxl5005s_get_bandwidth,
Steven Toth85d220d2008-05-01 05:48:14 -03004196};
4197
4198struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe,
4199 struct i2c_adapter *i2c,
4200 struct mxl5005s_config *config)
4201{
4202 struct mxl5005s_state *state = NULL;
4203 dprintk(1, "%s()\n", __func__);
4204
4205 state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL);
4206 if (state == NULL)
4207 return NULL;
4208
4209 state->frontend = fe;
4210 state->config = config;
4211 state->i2c = i2c;
Steven Toth48937292008-05-01 07:15:38 -03004212 state->current_mode = MXL_QAM;
Steven Toth85d220d2008-05-01 05:48:14 -03004213
Steven Tothd211017b2008-05-01 19:35:54 -03004214 printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n",
4215 config->i2c_address);
Steven Toth85d220d2008-05-01 05:48:14 -03004216
Steven Tothd211017b2008-05-01 19:35:54 -03004217 memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops,
4218 sizeof(struct dvb_tuner_ops));
Steven Toth85d220d2008-05-01 05:48:14 -03004219
4220 fe->tuner_priv = state;
4221 return fe;
4222}
4223EXPORT_SYMBOL(mxl5005s_attach);
4224
4225MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver");
Steven Toth85d220d2008-05-01 05:48:14 -03004226MODULE_AUTHOR("Steven Toth");
4227MODULE_LICENSE("GPL");