blob: 96391648871a8953ac7a59be20da774995d2bf4c [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 Tothc6c34b12008-05-03 14:14:54 -0300298static u16 MXL_GetMasterControl(u8 *MasterReg, int state);
299static u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value);
300static u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value);
301static void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit,
302 u8 bitVal);
303static u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum,
Steven Tothd211017b2008-05-01 19:35:54 -0300304 u8 *RegVal, int *count);
Steven Tothc6c34b12008-05-03 14:14:54 -0300305static u32 MXL_Ceiling(u32 value, u32 resolution);
306static u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal);
307static u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal);
308static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum,
Steven Tothd211017b2008-05-01 19:35:54 -0300309 u32 value, u16 controlGroup);
Steven Tothc6c34b12008-05-03 14:14:54 -0300310static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val);
311static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
Steven Tothd211017b2008-05-01 19:35:54 -0300312 u8 *RegVal, int *count);
Steven Tothc6c34b12008-05-03 14:14:54 -0300313static u32 MXL_GetXtalInt(u32 Xtal_Freq);
314static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq);
315static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe);
316static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe);
317static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,
Steven Tothd211017b2008-05-01 19:35:54 -0300318 u8 *RegVal, int *count);
Steven Tothc6c34b12008-05-03 14:14:54 -0300319static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable,
Steven Tothd211017b2008-05-01 19:35:54 -0300320 u8 *datatable, u8 len);
Steven Tothc6c34b12008-05-03 14:14:54 -0300321static u16 MXL_IFSynthInit(struct dvb_frontend *fe);
322static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,
Steven Tothd211017b2008-05-01 19:35:54 -0300323 u32 bandwidth);
Steven Tothc6c34b12008-05-03 14:14:54 -0300324static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type,
325 u32 bandwidth);
Steven Toth48937292008-05-01 07:15:38 -0300326
327/* ----------------------------------------------------------------
328 * Begin: Custom code salvaged from the Realtek driver.
329 * Copyright (c) 2008 Realtek
330 * Copyright (c) 2008 Jan Hoogenraad, Barnaby Shearer, Andy Hasper
331 * This code is placed under the terms of the GNU General Public License
332 *
333 * Released by Realtek under GPLv2.
334 * Thanks to Realtek for a lot of support we received !
335 *
336 * Revision: 080314 - original version
337 */
Steven Toth52c99bd2008-05-01 04:57:01 -0300338
Steven Tothc6c34b12008-05-03 14:14:54 -0300339static int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz)
Steven Toth52c99bd2008-05-01 04:57:01 -0300340{
Steven Toth85d220d2008-05-01 05:48:14 -0300341 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -0300342 unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
343 unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
344 int TableLen;
345
Steven Tothc6c34b12008-05-03 14:14:54 -0300346 u32 IfDivval = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300347 unsigned char MasterControlByte;
348
Steven Toth85d220d2008-05-01 05:48:14 -0300349 dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300350
Steven Tothd211017b2008-05-01 19:35:54 -0300351 /* Set MxL5005S tuner RF frequency according to example code. */
Steven Toth52c99bd2008-05-01 04:57:01 -0300352
Steven Tothd211017b2008-05-01 19:35:54 -0300353 /* Tuner RF frequency setting stage 0 */
354 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
Steven Toth52c99bd2008-05-01 04:57:01 -0300355 AddrTable[0] = MASTER_CONTROL_ADDR;
Steven Toth85d220d2008-05-01 05:48:14 -0300356 ByteTable[0] |= state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300357
Steven Toth48937292008-05-01 07:15:38 -0300358 mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300359
Steven Tothd211017b2008-05-01 19:35:54 -0300360 /* Tuner RF frequency setting stage 1 */
Steven Toth85d220d2008-05-01 05:48:14 -0300361 MXL_TuneRF(fe, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300362
Steven Toth85d220d2008-05-01 05:48:14 -0300363 MXL_ControlRead(fe, IF_DIVVAL, &IfDivval);
Steven Toth52c99bd2008-05-01 04:57:01 -0300364
Steven Toth85d220d2008-05-01 05:48:14 -0300365 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0);
366 MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1);
367 MXL_ControlWrite(fe, IF_DIVVAL, 8);
Steven Tothd211017b2008-05-01 19:35:54 -0300368 MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300369
Steven Tothd211017b2008-05-01 19:35:54 -0300370 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);
Steven Toth52c99bd2008-05-01 04:57:01 -0300371 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Tothd211017b2008-05-01 19:35:54 -0300372 ByteTable[TableLen] = MasterControlByte |
373 state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300374 TableLen += 1;
375
Steven Toth48937292008-05-01 07:15:38 -0300376 mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300377
Steven Tothd211017b2008-05-01 19:35:54 -0300378 /* Wait 30 ms. */
Steven Toth48937292008-05-01 07:15:38 -0300379 msleep(150);
Steven Toth52c99bd2008-05-01 04:57:01 -0300380
Steven Tothd211017b2008-05-01 19:35:54 -0300381 /* Tuner RF frequency setting stage 2 */
382 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1);
383 MXL_ControlWrite(fe, IF_DIVVAL, IfDivval);
384 MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300385
Steven Tothd211017b2008-05-01 19:35:54 -0300386 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);
Steven Toth52c99bd2008-05-01 04:57:01 -0300387 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Tothd211017b2008-05-01 19:35:54 -0300388 ByteTable[TableLen] = MasterControlByte |
389 state->config->AgcMasterByte ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300390 TableLen += 1;
391
Steven Toth48937292008-05-01 07:15:38 -0300392 mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
393
394 msleep(100);
Steven Toth8c66a192008-05-01 06:35:48 -0300395
Steven Toth85d220d2008-05-01 05:48:14 -0300396 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300397}
Steven Toth48937292008-05-01 07:15:38 -0300398/* End: Custom code taken from the Realtek driver */
Steven Toth52c99bd2008-05-01 04:57:01 -0300399
Steven Toth48937292008-05-01 07:15:38 -0300400/* ----------------------------------------------------------------
401 * Begin: Reference driver code found in the Realtek driver.
402 * Copyright (c) 2008 MaxLinear
403 */
Steven Tothc6c34b12008-05-03 14:14:54 -0300404static u16 MXL5005_RegisterInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300405{
Steven Toth85d220d2008-05-01 05:48:14 -0300406 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300407 state->TunerRegs_Num = TUNER_REGS_NUM ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300408
Steven Toth3935c252008-05-01 05:45:44 -0300409 state->TunerRegs[0].Reg_Num = 9 ;
410 state->TunerRegs[0].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300411
Steven Toth3935c252008-05-01 05:45:44 -0300412 state->TunerRegs[1].Reg_Num = 11 ;
413 state->TunerRegs[1].Reg_Val = 0x19 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300414
Steven Toth3935c252008-05-01 05:45:44 -0300415 state->TunerRegs[2].Reg_Num = 12 ;
416 state->TunerRegs[2].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300417
Steven Toth3935c252008-05-01 05:45:44 -0300418 state->TunerRegs[3].Reg_Num = 13 ;
419 state->TunerRegs[3].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300420
Steven Toth3935c252008-05-01 05:45:44 -0300421 state->TunerRegs[4].Reg_Num = 14 ;
422 state->TunerRegs[4].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300423
Steven Toth3935c252008-05-01 05:45:44 -0300424 state->TunerRegs[5].Reg_Num = 15 ;
425 state->TunerRegs[5].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300426
Steven Toth3935c252008-05-01 05:45:44 -0300427 state->TunerRegs[6].Reg_Num = 16 ;
428 state->TunerRegs[6].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300429
Steven Toth3935c252008-05-01 05:45:44 -0300430 state->TunerRegs[7].Reg_Num = 17 ;
431 state->TunerRegs[7].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300432
Steven Toth3935c252008-05-01 05:45:44 -0300433 state->TunerRegs[8].Reg_Num = 18 ;
434 state->TunerRegs[8].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300435
Steven Toth3935c252008-05-01 05:45:44 -0300436 state->TunerRegs[9].Reg_Num = 19 ;
437 state->TunerRegs[9].Reg_Val = 0x34 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300438
Steven Toth3935c252008-05-01 05:45:44 -0300439 state->TunerRegs[10].Reg_Num = 21 ;
440 state->TunerRegs[10].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300441
Steven Toth3935c252008-05-01 05:45:44 -0300442 state->TunerRegs[11].Reg_Num = 22 ;
443 state->TunerRegs[11].Reg_Val = 0x6B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300444
Steven Toth3935c252008-05-01 05:45:44 -0300445 state->TunerRegs[12].Reg_Num = 23 ;
446 state->TunerRegs[12].Reg_Val = 0x35 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300447
Steven Toth3935c252008-05-01 05:45:44 -0300448 state->TunerRegs[13].Reg_Num = 24 ;
449 state->TunerRegs[13].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300450
Steven Toth3935c252008-05-01 05:45:44 -0300451 state->TunerRegs[14].Reg_Num = 25 ;
452 state->TunerRegs[14].Reg_Val = 0x3E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300453
Steven Toth3935c252008-05-01 05:45:44 -0300454 state->TunerRegs[15].Reg_Num = 26 ;
455 state->TunerRegs[15].Reg_Val = 0x82 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300456
Steven Toth3935c252008-05-01 05:45:44 -0300457 state->TunerRegs[16].Reg_Num = 31 ;
458 state->TunerRegs[16].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300459
Steven Toth3935c252008-05-01 05:45:44 -0300460 state->TunerRegs[17].Reg_Num = 32 ;
461 state->TunerRegs[17].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300462
Steven Toth3935c252008-05-01 05:45:44 -0300463 state->TunerRegs[18].Reg_Num = 33 ;
464 state->TunerRegs[18].Reg_Val = 0x53 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300465
Steven Toth3935c252008-05-01 05:45:44 -0300466 state->TunerRegs[19].Reg_Num = 34 ;
467 state->TunerRegs[19].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300468
Steven Toth3935c252008-05-01 05:45:44 -0300469 state->TunerRegs[20].Reg_Num = 35 ;
470 state->TunerRegs[20].Reg_Val = 0xC9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300471
Steven Toth3935c252008-05-01 05:45:44 -0300472 state->TunerRegs[21].Reg_Num = 36 ;
473 state->TunerRegs[21].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300474
Steven Toth3935c252008-05-01 05:45:44 -0300475 state->TunerRegs[22].Reg_Num = 37 ;
476 state->TunerRegs[22].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300477
Steven Toth3935c252008-05-01 05:45:44 -0300478 state->TunerRegs[23].Reg_Num = 41 ;
479 state->TunerRegs[23].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300480
Steven Toth3935c252008-05-01 05:45:44 -0300481 state->TunerRegs[24].Reg_Num = 42 ;
482 state->TunerRegs[24].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300483
Steven Toth3935c252008-05-01 05:45:44 -0300484 state->TunerRegs[25].Reg_Num = 43 ;
485 state->TunerRegs[25].Reg_Val = 0x43 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300486
Steven Toth3935c252008-05-01 05:45:44 -0300487 state->TunerRegs[26].Reg_Num = 44 ;
488 state->TunerRegs[26].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300489
Steven Toth3935c252008-05-01 05:45:44 -0300490 state->TunerRegs[27].Reg_Num = 45 ;
491 state->TunerRegs[27].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300492
Steven Toth3935c252008-05-01 05:45:44 -0300493 state->TunerRegs[28].Reg_Num = 46 ;
494 state->TunerRegs[28].Reg_Val = 0x88 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300495
Steven Toth3935c252008-05-01 05:45:44 -0300496 state->TunerRegs[29].Reg_Num = 47 ;
497 state->TunerRegs[29].Reg_Val = 0x86 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300498
Steven Toth3935c252008-05-01 05:45:44 -0300499 state->TunerRegs[30].Reg_Num = 48 ;
500 state->TunerRegs[30].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300501
Steven Toth3935c252008-05-01 05:45:44 -0300502 state->TunerRegs[31].Reg_Num = 49 ;
503 state->TunerRegs[31].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300504
Steven Toth3935c252008-05-01 05:45:44 -0300505 state->TunerRegs[32].Reg_Num = 53 ;
506 state->TunerRegs[32].Reg_Val = 0x94 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300507
Steven Toth3935c252008-05-01 05:45:44 -0300508 state->TunerRegs[33].Reg_Num = 54 ;
509 state->TunerRegs[33].Reg_Val = 0xFA ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300510
Steven Toth3935c252008-05-01 05:45:44 -0300511 state->TunerRegs[34].Reg_Num = 55 ;
512 state->TunerRegs[34].Reg_Val = 0x92 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300513
Steven Toth3935c252008-05-01 05:45:44 -0300514 state->TunerRegs[35].Reg_Num = 56 ;
515 state->TunerRegs[35].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300516
Steven Toth3935c252008-05-01 05:45:44 -0300517 state->TunerRegs[36].Reg_Num = 57 ;
518 state->TunerRegs[36].Reg_Val = 0x41 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300519
Steven Toth3935c252008-05-01 05:45:44 -0300520 state->TunerRegs[37].Reg_Num = 58 ;
521 state->TunerRegs[37].Reg_Val = 0xDB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300522
Steven Toth3935c252008-05-01 05:45:44 -0300523 state->TunerRegs[38].Reg_Num = 59 ;
524 state->TunerRegs[38].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300525
Steven Toth3935c252008-05-01 05:45:44 -0300526 state->TunerRegs[39].Reg_Num = 60 ;
527 state->TunerRegs[39].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300528
Steven Toth3935c252008-05-01 05:45:44 -0300529 state->TunerRegs[40].Reg_Num = 61 ;
530 state->TunerRegs[40].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300531
Steven Toth3935c252008-05-01 05:45:44 -0300532 state->TunerRegs[41].Reg_Num = 62 ;
533 state->TunerRegs[41].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300534
Steven Toth3935c252008-05-01 05:45:44 -0300535 state->TunerRegs[42].Reg_Num = 65 ;
536 state->TunerRegs[42].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300537
Steven Toth3935c252008-05-01 05:45:44 -0300538 state->TunerRegs[43].Reg_Num = 66 ;
539 state->TunerRegs[43].Reg_Val = 0xE4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300540
Steven Toth3935c252008-05-01 05:45:44 -0300541 state->TunerRegs[44].Reg_Num = 67 ;
542 state->TunerRegs[44].Reg_Val = 0x90 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300543
Steven Toth3935c252008-05-01 05:45:44 -0300544 state->TunerRegs[45].Reg_Num = 68 ;
545 state->TunerRegs[45].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300546
Steven Toth3935c252008-05-01 05:45:44 -0300547 state->TunerRegs[46].Reg_Num = 69 ;
548 state->TunerRegs[46].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300549
Steven Toth3935c252008-05-01 05:45:44 -0300550 state->TunerRegs[47].Reg_Num = 70 ;
551 state->TunerRegs[47].Reg_Val = 0x50 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300552
Steven Toth3935c252008-05-01 05:45:44 -0300553 state->TunerRegs[48].Reg_Num = 71 ;
554 state->TunerRegs[48].Reg_Val = 0x06 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300555
Steven Toth3935c252008-05-01 05:45:44 -0300556 state->TunerRegs[49].Reg_Num = 72 ;
557 state->TunerRegs[49].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300558
Steven Toth3935c252008-05-01 05:45:44 -0300559 state->TunerRegs[50].Reg_Num = 73 ;
560 state->TunerRegs[50].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300561
Steven Toth3935c252008-05-01 05:45:44 -0300562 state->TunerRegs[51].Reg_Num = 76 ;
563 state->TunerRegs[51].Reg_Val = 0xBB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300564
Steven Toth3935c252008-05-01 05:45:44 -0300565 state->TunerRegs[52].Reg_Num = 77 ;
566 state->TunerRegs[52].Reg_Val = 0x13 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300567
Steven Toth3935c252008-05-01 05:45:44 -0300568 state->TunerRegs[53].Reg_Num = 81 ;
569 state->TunerRegs[53].Reg_Val = 0x04 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300570
Steven Toth3935c252008-05-01 05:45:44 -0300571 state->TunerRegs[54].Reg_Num = 82 ;
572 state->TunerRegs[54].Reg_Val = 0x75 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300573
Steven Toth3935c252008-05-01 05:45:44 -0300574 state->TunerRegs[55].Reg_Num = 83 ;
575 state->TunerRegs[55].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300576
Steven Toth3935c252008-05-01 05:45:44 -0300577 state->TunerRegs[56].Reg_Num = 84 ;
578 state->TunerRegs[56].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300579
Steven Toth3935c252008-05-01 05:45:44 -0300580 state->TunerRegs[57].Reg_Num = 85 ;
581 state->TunerRegs[57].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300582
Steven Toth3935c252008-05-01 05:45:44 -0300583 state->TunerRegs[58].Reg_Num = 91 ;
584 state->TunerRegs[58].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300585
Steven Toth3935c252008-05-01 05:45:44 -0300586 state->TunerRegs[59].Reg_Num = 92 ;
587 state->TunerRegs[59].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300588
Steven Toth3935c252008-05-01 05:45:44 -0300589 state->TunerRegs[60].Reg_Num = 93 ;
590 state->TunerRegs[60].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300591
Steven Toth3935c252008-05-01 05:45:44 -0300592 state->TunerRegs[61].Reg_Num = 94 ;
593 state->TunerRegs[61].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300594
Steven Toth3935c252008-05-01 05:45:44 -0300595 state->TunerRegs[62].Reg_Num = 95 ;
596 state->TunerRegs[62].Reg_Val = 0x0C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300597
Steven Toth3935c252008-05-01 05:45:44 -0300598 state->TunerRegs[63].Reg_Num = 96 ;
599 state->TunerRegs[63].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300600
Steven Toth3935c252008-05-01 05:45:44 -0300601 state->TunerRegs[64].Reg_Num = 97 ;
602 state->TunerRegs[64].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300603
Steven Toth3935c252008-05-01 05:45:44 -0300604 state->TunerRegs[65].Reg_Num = 98 ;
605 state->TunerRegs[65].Reg_Val = 0xE2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300606
Steven Toth3935c252008-05-01 05:45:44 -0300607 state->TunerRegs[66].Reg_Num = 99 ;
608 state->TunerRegs[66].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300609
Steven Toth3935c252008-05-01 05:45:44 -0300610 state->TunerRegs[67].Reg_Num = 100 ;
611 state->TunerRegs[67].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300612
Steven Toth3935c252008-05-01 05:45:44 -0300613 state->TunerRegs[68].Reg_Num = 101 ;
614 state->TunerRegs[68].Reg_Val = 0x12 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300615
Steven Toth3935c252008-05-01 05:45:44 -0300616 state->TunerRegs[69].Reg_Num = 102 ;
617 state->TunerRegs[69].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300618
Steven Toth3935c252008-05-01 05:45:44 -0300619 state->TunerRegs[70].Reg_Num = 103 ;
620 state->TunerRegs[70].Reg_Val = 0x32 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300621
Steven Toth3935c252008-05-01 05:45:44 -0300622 state->TunerRegs[71].Reg_Num = 104 ;
623 state->TunerRegs[71].Reg_Val = 0xB4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300624
Steven Toth3935c252008-05-01 05:45:44 -0300625 state->TunerRegs[72].Reg_Num = 105 ;
626 state->TunerRegs[72].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300627
Steven Toth3935c252008-05-01 05:45:44 -0300628 state->TunerRegs[73].Reg_Num = 106 ;
629 state->TunerRegs[73].Reg_Val = 0x83 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300630
Steven Toth3935c252008-05-01 05:45:44 -0300631 state->TunerRegs[74].Reg_Num = 107 ;
632 state->TunerRegs[74].Reg_Val = 0x84 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300633
Steven Toth3935c252008-05-01 05:45:44 -0300634 state->TunerRegs[75].Reg_Num = 108 ;
635 state->TunerRegs[75].Reg_Val = 0x9C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300636
Steven Toth3935c252008-05-01 05:45:44 -0300637 state->TunerRegs[76].Reg_Num = 109 ;
638 state->TunerRegs[76].Reg_Val = 0x02 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300639
Steven Toth3935c252008-05-01 05:45:44 -0300640 state->TunerRegs[77].Reg_Num = 110 ;
641 state->TunerRegs[77].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300642
Steven Toth3935c252008-05-01 05:45:44 -0300643 state->TunerRegs[78].Reg_Num = 111 ;
644 state->TunerRegs[78].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300645
Steven Toth3935c252008-05-01 05:45:44 -0300646 state->TunerRegs[79].Reg_Num = 112 ;
647 state->TunerRegs[79].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300648
Steven Toth3935c252008-05-01 05:45:44 -0300649 state->TunerRegs[80].Reg_Num = 131 ;
650 state->TunerRegs[80].Reg_Val = 0x8A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300651
Steven Toth3935c252008-05-01 05:45:44 -0300652 state->TunerRegs[81].Reg_Num = 132 ;
653 state->TunerRegs[81].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300654
Steven Toth3935c252008-05-01 05:45:44 -0300655 state->TunerRegs[82].Reg_Num = 133 ;
656 state->TunerRegs[82].Reg_Val = 0x24 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300657
Steven Toth3935c252008-05-01 05:45:44 -0300658 state->TunerRegs[83].Reg_Num = 134 ;
659 state->TunerRegs[83].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300660
Steven Toth3935c252008-05-01 05:45:44 -0300661 state->TunerRegs[84].Reg_Num = 135 ;
662 state->TunerRegs[84].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300663
Steven Toth3935c252008-05-01 05:45:44 -0300664 state->TunerRegs[85].Reg_Num = 136 ;
665 state->TunerRegs[85].Reg_Val = 0x7E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300666
Steven Toth3935c252008-05-01 05:45:44 -0300667 state->TunerRegs[86].Reg_Num = 137 ;
668 state->TunerRegs[86].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300669
Steven Toth3935c252008-05-01 05:45:44 -0300670 state->TunerRegs[87].Reg_Num = 138 ;
671 state->TunerRegs[87].Reg_Val = 0x38 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300672
Steven Toth3935c252008-05-01 05:45:44 -0300673 state->TunerRegs[88].Reg_Num = 146 ;
674 state->TunerRegs[88].Reg_Val = 0xF6 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300675
Steven Toth3935c252008-05-01 05:45:44 -0300676 state->TunerRegs[89].Reg_Num = 147 ;
677 state->TunerRegs[89].Reg_Val = 0x1A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300678
Steven Toth3935c252008-05-01 05:45:44 -0300679 state->TunerRegs[90].Reg_Num = 148 ;
680 state->TunerRegs[90].Reg_Val = 0x62 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300681
Steven Toth3935c252008-05-01 05:45:44 -0300682 state->TunerRegs[91].Reg_Num = 149 ;
683 state->TunerRegs[91].Reg_Val = 0x33 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300684
Steven Toth3935c252008-05-01 05:45:44 -0300685 state->TunerRegs[92].Reg_Num = 150 ;
686 state->TunerRegs[92].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300687
Steven Toth3935c252008-05-01 05:45:44 -0300688 state->TunerRegs[93].Reg_Num = 156 ;
689 state->TunerRegs[93].Reg_Val = 0x56 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300690
Steven Toth3935c252008-05-01 05:45:44 -0300691 state->TunerRegs[94].Reg_Num = 157 ;
692 state->TunerRegs[94].Reg_Val = 0x17 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300693
Steven Toth3935c252008-05-01 05:45:44 -0300694 state->TunerRegs[95].Reg_Num = 158 ;
695 state->TunerRegs[95].Reg_Val = 0xA9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300696
Steven Toth3935c252008-05-01 05:45:44 -0300697 state->TunerRegs[96].Reg_Num = 159 ;
698 state->TunerRegs[96].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300699
Steven Toth3935c252008-05-01 05:45:44 -0300700 state->TunerRegs[97].Reg_Num = 160 ;
701 state->TunerRegs[97].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300702
Steven Toth3935c252008-05-01 05:45:44 -0300703 state->TunerRegs[98].Reg_Num = 161 ;
704 state->TunerRegs[98].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300705
Steven Toth3935c252008-05-01 05:45:44 -0300706 state->TunerRegs[99].Reg_Num = 162 ;
707 state->TunerRegs[99].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300708
Steven Toth3935c252008-05-01 05:45:44 -0300709 state->TunerRegs[100].Reg_Num = 166 ;
710 state->TunerRegs[100].Reg_Val = 0xAE ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300711
Steven Toth3935c252008-05-01 05:45:44 -0300712 state->TunerRegs[101].Reg_Num = 167 ;
713 state->TunerRegs[101].Reg_Val = 0x1B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300714
Steven Toth3935c252008-05-01 05:45:44 -0300715 state->TunerRegs[102].Reg_Num = 168 ;
716 state->TunerRegs[102].Reg_Val = 0xF2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300717
Steven Toth3935c252008-05-01 05:45:44 -0300718 state->TunerRegs[103].Reg_Num = 195 ;
719 state->TunerRegs[103].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300720
721 return 0 ;
722}
723
Steven Tothc6c34b12008-05-03 14:14:54 -0300724static u16 MXL5005_ControlInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300725{
Steven Toth85d220d2008-05-01 05:48:14 -0300726 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300727 state->Init_Ctrl_Num = INITCTRL_NUM;
Steven Toth52c99bd2008-05-01 04:57:01 -0300728
Steven Toth3935c252008-05-01 05:45:44 -0300729 state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;
730 state->Init_Ctrl[0].size = 1 ;
731 state->Init_Ctrl[0].addr[0] = 73;
732 state->Init_Ctrl[0].bit[0] = 7;
733 state->Init_Ctrl[0].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300734
Steven Toth3935c252008-05-01 05:45:44 -0300735 state->Init_Ctrl[1].Ctrl_Num = BB_MODE ;
736 state->Init_Ctrl[1].size = 1 ;
737 state->Init_Ctrl[1].addr[0] = 53;
738 state->Init_Ctrl[1].bit[0] = 2;
739 state->Init_Ctrl[1].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300740
Steven Toth3935c252008-05-01 05:45:44 -0300741 state->Init_Ctrl[2].Ctrl_Num = BB_BUF ;
742 state->Init_Ctrl[2].size = 2 ;
743 state->Init_Ctrl[2].addr[0] = 53;
744 state->Init_Ctrl[2].bit[0] = 1;
745 state->Init_Ctrl[2].val[0] = 0;
746 state->Init_Ctrl[2].addr[1] = 57;
747 state->Init_Ctrl[2].bit[1] = 0;
748 state->Init_Ctrl[2].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300749
Steven Toth3935c252008-05-01 05:45:44 -0300750 state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;
751 state->Init_Ctrl[3].size = 1 ;
752 state->Init_Ctrl[3].addr[0] = 53;
753 state->Init_Ctrl[3].bit[0] = 0;
754 state->Init_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300755
Steven Toth3935c252008-05-01 05:45:44 -0300756 state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;
757 state->Init_Ctrl[4].size = 3 ;
758 state->Init_Ctrl[4].addr[0] = 53;
759 state->Init_Ctrl[4].bit[0] = 5;
760 state->Init_Ctrl[4].val[0] = 0;
761 state->Init_Ctrl[4].addr[1] = 53;
762 state->Init_Ctrl[4].bit[1] = 6;
763 state->Init_Ctrl[4].val[1] = 0;
764 state->Init_Ctrl[4].addr[2] = 53;
765 state->Init_Ctrl[4].bit[2] = 7;
766 state->Init_Ctrl[4].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300767
Steven Toth3935c252008-05-01 05:45:44 -0300768 state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;
769 state->Init_Ctrl[5].size = 1 ;
770 state->Init_Ctrl[5].addr[0] = 59;
771 state->Init_Ctrl[5].bit[0] = 0;
772 state->Init_Ctrl[5].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300773
Steven Toth3935c252008-05-01 05:45:44 -0300774 state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ;
775 state->Init_Ctrl[6].size = 2 ;
776 state->Init_Ctrl[6].addr[0] = 53;
777 state->Init_Ctrl[6].bit[0] = 3;
778 state->Init_Ctrl[6].val[0] = 0;
779 state->Init_Ctrl[6].addr[1] = 53;
780 state->Init_Ctrl[6].bit[1] = 4;
781 state->Init_Ctrl[6].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300782
Steven Toth3935c252008-05-01 05:45:44 -0300783 state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ;
784 state->Init_Ctrl[7].size = 4 ;
785 state->Init_Ctrl[7].addr[0] = 22;
786 state->Init_Ctrl[7].bit[0] = 4;
787 state->Init_Ctrl[7].val[0] = 0;
788 state->Init_Ctrl[7].addr[1] = 22;
789 state->Init_Ctrl[7].bit[1] = 5;
790 state->Init_Ctrl[7].val[1] = 1;
791 state->Init_Ctrl[7].addr[2] = 22;
792 state->Init_Ctrl[7].bit[2] = 6;
793 state->Init_Ctrl[7].val[2] = 1;
794 state->Init_Ctrl[7].addr[3] = 22;
795 state->Init_Ctrl[7].bit[3] = 7;
796 state->Init_Ctrl[7].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300797
Steven Toth3935c252008-05-01 05:45:44 -0300798 state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ;
799 state->Init_Ctrl[8].size = 1 ;
800 state->Init_Ctrl[8].addr[0] = 22;
801 state->Init_Ctrl[8].bit[0] = 2;
802 state->Init_Ctrl[8].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300803
Steven Toth3935c252008-05-01 05:45:44 -0300804 state->Init_Ctrl[9].Ctrl_Num = AGC_IF ;
805 state->Init_Ctrl[9].size = 4 ;
806 state->Init_Ctrl[9].addr[0] = 76;
807 state->Init_Ctrl[9].bit[0] = 0;
808 state->Init_Ctrl[9].val[0] = 1;
809 state->Init_Ctrl[9].addr[1] = 76;
810 state->Init_Ctrl[9].bit[1] = 1;
811 state->Init_Ctrl[9].val[1] = 1;
812 state->Init_Ctrl[9].addr[2] = 76;
813 state->Init_Ctrl[9].bit[2] = 2;
814 state->Init_Ctrl[9].val[2] = 0;
815 state->Init_Ctrl[9].addr[3] = 76;
816 state->Init_Ctrl[9].bit[3] = 3;
817 state->Init_Ctrl[9].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300818
Steven Toth3935c252008-05-01 05:45:44 -0300819 state->Init_Ctrl[10].Ctrl_Num = AGC_RF ;
820 state->Init_Ctrl[10].size = 4 ;
821 state->Init_Ctrl[10].addr[0] = 76;
822 state->Init_Ctrl[10].bit[0] = 4;
823 state->Init_Ctrl[10].val[0] = 1;
824 state->Init_Ctrl[10].addr[1] = 76;
825 state->Init_Ctrl[10].bit[1] = 5;
826 state->Init_Ctrl[10].val[1] = 1;
827 state->Init_Ctrl[10].addr[2] = 76;
828 state->Init_Ctrl[10].bit[2] = 6;
829 state->Init_Ctrl[10].val[2] = 0;
830 state->Init_Ctrl[10].addr[3] = 76;
831 state->Init_Ctrl[10].bit[3] = 7;
832 state->Init_Ctrl[10].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300833
Steven Toth3935c252008-05-01 05:45:44 -0300834 state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ;
835 state->Init_Ctrl[11].size = 5 ;
836 state->Init_Ctrl[11].addr[0] = 43;
837 state->Init_Ctrl[11].bit[0] = 3;
838 state->Init_Ctrl[11].val[0] = 0;
839 state->Init_Ctrl[11].addr[1] = 43;
840 state->Init_Ctrl[11].bit[1] = 4;
841 state->Init_Ctrl[11].val[1] = 0;
842 state->Init_Ctrl[11].addr[2] = 43;
843 state->Init_Ctrl[11].bit[2] = 5;
844 state->Init_Ctrl[11].val[2] = 0;
845 state->Init_Ctrl[11].addr[3] = 43;
846 state->Init_Ctrl[11].bit[3] = 6;
847 state->Init_Ctrl[11].val[3] = 1;
848 state->Init_Ctrl[11].addr[4] = 43;
849 state->Init_Ctrl[11].bit[4] = 7;
850 state->Init_Ctrl[11].val[4] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300851
Steven Toth3935c252008-05-01 05:45:44 -0300852 state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ;
853 state->Init_Ctrl[12].size = 6 ;
854 state->Init_Ctrl[12].addr[0] = 44;
855 state->Init_Ctrl[12].bit[0] = 2;
856 state->Init_Ctrl[12].val[0] = 0;
857 state->Init_Ctrl[12].addr[1] = 44;
858 state->Init_Ctrl[12].bit[1] = 3;
859 state->Init_Ctrl[12].val[1] = 0;
860 state->Init_Ctrl[12].addr[2] = 44;
861 state->Init_Ctrl[12].bit[2] = 4;
862 state->Init_Ctrl[12].val[2] = 0;
863 state->Init_Ctrl[12].addr[3] = 44;
864 state->Init_Ctrl[12].bit[3] = 5;
865 state->Init_Ctrl[12].val[3] = 1;
866 state->Init_Ctrl[12].addr[4] = 44;
867 state->Init_Ctrl[12].bit[4] = 6;
868 state->Init_Ctrl[12].val[4] = 0;
869 state->Init_Ctrl[12].addr[5] = 44;
870 state->Init_Ctrl[12].bit[5] = 7;
871 state->Init_Ctrl[12].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300872
Steven Toth3935c252008-05-01 05:45:44 -0300873 state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ;
874 state->Init_Ctrl[13].size = 7 ;
875 state->Init_Ctrl[13].addr[0] = 11;
876 state->Init_Ctrl[13].bit[0] = 0;
877 state->Init_Ctrl[13].val[0] = 1;
878 state->Init_Ctrl[13].addr[1] = 11;
879 state->Init_Ctrl[13].bit[1] = 1;
880 state->Init_Ctrl[13].val[1] = 0;
881 state->Init_Ctrl[13].addr[2] = 11;
882 state->Init_Ctrl[13].bit[2] = 2;
883 state->Init_Ctrl[13].val[2] = 0;
884 state->Init_Ctrl[13].addr[3] = 11;
885 state->Init_Ctrl[13].bit[3] = 3;
886 state->Init_Ctrl[13].val[3] = 1;
887 state->Init_Ctrl[13].addr[4] = 11;
888 state->Init_Ctrl[13].bit[4] = 4;
889 state->Init_Ctrl[13].val[4] = 1;
890 state->Init_Ctrl[13].addr[5] = 11;
891 state->Init_Ctrl[13].bit[5] = 5;
892 state->Init_Ctrl[13].val[5] = 0;
893 state->Init_Ctrl[13].addr[6] = 11;
894 state->Init_Ctrl[13].bit[6] = 6;
895 state->Init_Ctrl[13].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300896
Steven Toth3935c252008-05-01 05:45:44 -0300897 state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ;
898 state->Init_Ctrl[14].size = 16 ;
899 state->Init_Ctrl[14].addr[0] = 13;
900 state->Init_Ctrl[14].bit[0] = 0;
901 state->Init_Ctrl[14].val[0] = 0;
902 state->Init_Ctrl[14].addr[1] = 13;
903 state->Init_Ctrl[14].bit[1] = 1;
904 state->Init_Ctrl[14].val[1] = 0;
905 state->Init_Ctrl[14].addr[2] = 13;
906 state->Init_Ctrl[14].bit[2] = 2;
907 state->Init_Ctrl[14].val[2] = 0;
908 state->Init_Ctrl[14].addr[3] = 13;
909 state->Init_Ctrl[14].bit[3] = 3;
910 state->Init_Ctrl[14].val[3] = 0;
911 state->Init_Ctrl[14].addr[4] = 13;
912 state->Init_Ctrl[14].bit[4] = 4;
913 state->Init_Ctrl[14].val[4] = 0;
914 state->Init_Ctrl[14].addr[5] = 13;
915 state->Init_Ctrl[14].bit[5] = 5;
916 state->Init_Ctrl[14].val[5] = 0;
917 state->Init_Ctrl[14].addr[6] = 13;
918 state->Init_Ctrl[14].bit[6] = 6;
919 state->Init_Ctrl[14].val[6] = 0;
920 state->Init_Ctrl[14].addr[7] = 13;
921 state->Init_Ctrl[14].bit[7] = 7;
922 state->Init_Ctrl[14].val[7] = 0;
923 state->Init_Ctrl[14].addr[8] = 12;
924 state->Init_Ctrl[14].bit[8] = 0;
925 state->Init_Ctrl[14].val[8] = 0;
926 state->Init_Ctrl[14].addr[9] = 12;
927 state->Init_Ctrl[14].bit[9] = 1;
928 state->Init_Ctrl[14].val[9] = 0;
929 state->Init_Ctrl[14].addr[10] = 12;
930 state->Init_Ctrl[14].bit[10] = 2;
931 state->Init_Ctrl[14].val[10] = 0;
932 state->Init_Ctrl[14].addr[11] = 12;
933 state->Init_Ctrl[14].bit[11] = 3;
934 state->Init_Ctrl[14].val[11] = 0;
935 state->Init_Ctrl[14].addr[12] = 12;
936 state->Init_Ctrl[14].bit[12] = 4;
937 state->Init_Ctrl[14].val[12] = 0;
938 state->Init_Ctrl[14].addr[13] = 12;
939 state->Init_Ctrl[14].bit[13] = 5;
940 state->Init_Ctrl[14].val[13] = 1;
941 state->Init_Ctrl[14].addr[14] = 12;
942 state->Init_Ctrl[14].bit[14] = 6;
943 state->Init_Ctrl[14].val[14] = 1;
944 state->Init_Ctrl[14].addr[15] = 12;
945 state->Init_Ctrl[14].bit[15] = 7;
946 state->Init_Ctrl[14].val[15] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300947
Steven Toth3935c252008-05-01 05:45:44 -0300948 state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ;
949 state->Init_Ctrl[15].size = 3 ;
950 state->Init_Ctrl[15].addr[0] = 147;
951 state->Init_Ctrl[15].bit[0] = 2;
952 state->Init_Ctrl[15].val[0] = 0;
953 state->Init_Ctrl[15].addr[1] = 147;
954 state->Init_Ctrl[15].bit[1] = 3;
955 state->Init_Ctrl[15].val[1] = 1;
956 state->Init_Ctrl[15].addr[2] = 147;
957 state->Init_Ctrl[15].bit[2] = 4;
958 state->Init_Ctrl[15].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300959
Steven Toth3935c252008-05-01 05:45:44 -0300960 state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ;
961 state->Init_Ctrl[16].size = 2 ;
962 state->Init_Ctrl[16].addr[0] = 147;
963 state->Init_Ctrl[16].bit[0] = 0;
964 state->Init_Ctrl[16].val[0] = 0;
965 state->Init_Ctrl[16].addr[1] = 147;
966 state->Init_Ctrl[16].bit[1] = 1;
967 state->Init_Ctrl[16].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300968
Steven Toth3935c252008-05-01 05:45:44 -0300969 state->Init_Ctrl[17].Ctrl_Num = EN_AAF ;
970 state->Init_Ctrl[17].size = 1 ;
971 state->Init_Ctrl[17].addr[0] = 147;
972 state->Init_Ctrl[17].bit[0] = 7;
973 state->Init_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300974
Steven Toth3935c252008-05-01 05:45:44 -0300975 state->Init_Ctrl[18].Ctrl_Num = EN_3P ;
976 state->Init_Ctrl[18].size = 1 ;
977 state->Init_Ctrl[18].addr[0] = 147;
978 state->Init_Ctrl[18].bit[0] = 6;
979 state->Init_Ctrl[18].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300980
Steven Toth3935c252008-05-01 05:45:44 -0300981 state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ;
982 state->Init_Ctrl[19].size = 1 ;
983 state->Init_Ctrl[19].addr[0] = 156;
984 state->Init_Ctrl[19].bit[0] = 0;
985 state->Init_Ctrl[19].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300986
Steven Toth3935c252008-05-01 05:45:44 -0300987 state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ;
988 state->Init_Ctrl[20].size = 1 ;
989 state->Init_Ctrl[20].addr[0] = 147;
990 state->Init_Ctrl[20].bit[0] = 5;
991 state->Init_Ctrl[20].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300992
Steven Toth3935c252008-05-01 05:45:44 -0300993 state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ;
994 state->Init_Ctrl[21].size = 1 ;
995 state->Init_Ctrl[21].addr[0] = 137;
996 state->Init_Ctrl[21].bit[0] = 4;
997 state->Init_Ctrl[21].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300998
Steven Toth3935c252008-05-01 05:45:44 -0300999 state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ;
1000 state->Init_Ctrl[22].size = 1 ;
1001 state->Init_Ctrl[22].addr[0] = 137;
1002 state->Init_Ctrl[22].bit[0] = 7;
1003 state->Init_Ctrl[22].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001004
Steven Toth3935c252008-05-01 05:45:44 -03001005 state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ;
1006 state->Init_Ctrl[23].size = 1 ;
1007 state->Init_Ctrl[23].addr[0] = 91;
1008 state->Init_Ctrl[23].bit[0] = 5;
1009 state->Init_Ctrl[23].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001010
Steven Toth3935c252008-05-01 05:45:44 -03001011 state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ;
1012 state->Init_Ctrl[24].size = 1 ;
1013 state->Init_Ctrl[24].addr[0] = 43;
1014 state->Init_Ctrl[24].bit[0] = 0;
1015 state->Init_Ctrl[24].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001016
Steven Toth3935c252008-05-01 05:45:44 -03001017 state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ;
1018 state->Init_Ctrl[25].size = 2 ;
1019 state->Init_Ctrl[25].addr[0] = 22;
1020 state->Init_Ctrl[25].bit[0] = 0;
1021 state->Init_Ctrl[25].val[0] = 1;
1022 state->Init_Ctrl[25].addr[1] = 22;
1023 state->Init_Ctrl[25].bit[1] = 1;
1024 state->Init_Ctrl[25].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001025
Steven Toth3935c252008-05-01 05:45:44 -03001026 state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ;
1027 state->Init_Ctrl[26].size = 1 ;
1028 state->Init_Ctrl[26].addr[0] = 134;
1029 state->Init_Ctrl[26].bit[0] = 2;
1030 state->Init_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001031
Steven Toth3935c252008-05-01 05:45:44 -03001032 state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ;
1033 state->Init_Ctrl[27].size = 1 ;
1034 state->Init_Ctrl[27].addr[0] = 137;
1035 state->Init_Ctrl[27].bit[0] = 3;
1036 state->Init_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001037
Steven Toth3935c252008-05-01 05:45:44 -03001038 state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ;
1039 state->Init_Ctrl[28].size = 1 ;
1040 state->Init_Ctrl[28].addr[0] = 77;
1041 state->Init_Ctrl[28].bit[0] = 7;
1042 state->Init_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001043
Steven Toth3935c252008-05-01 05:45:44 -03001044 state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ;
1045 state->Init_Ctrl[29].size = 1 ;
1046 state->Init_Ctrl[29].addr[0] = 166;
1047 state->Init_Ctrl[29].bit[0] = 7;
1048 state->Init_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001049
Steven Toth3935c252008-05-01 05:45:44 -03001050 state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ;
1051 state->Init_Ctrl[30].size = 3 ;
1052 state->Init_Ctrl[30].addr[0] = 166;
1053 state->Init_Ctrl[30].bit[0] = 0;
1054 state->Init_Ctrl[30].val[0] = 0;
1055 state->Init_Ctrl[30].addr[1] = 166;
1056 state->Init_Ctrl[30].bit[1] = 1;
1057 state->Init_Ctrl[30].val[1] = 1;
1058 state->Init_Ctrl[30].addr[2] = 166;
1059 state->Init_Ctrl[30].bit[2] = 2;
1060 state->Init_Ctrl[30].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001061
Steven Toth3935c252008-05-01 05:45:44 -03001062 state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ;
1063 state->Init_Ctrl[31].size = 3 ;
1064 state->Init_Ctrl[31].addr[0] = 166;
1065 state->Init_Ctrl[31].bit[0] = 3;
1066 state->Init_Ctrl[31].val[0] = 1;
1067 state->Init_Ctrl[31].addr[1] = 166;
1068 state->Init_Ctrl[31].bit[1] = 4;
1069 state->Init_Ctrl[31].val[1] = 0;
1070 state->Init_Ctrl[31].addr[2] = 166;
1071 state->Init_Ctrl[31].bit[2] = 5;
1072 state->Init_Ctrl[31].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001073
Steven Toth3935c252008-05-01 05:45:44 -03001074 state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ;
1075 state->Init_Ctrl[32].size = 3 ;
1076 state->Init_Ctrl[32].addr[0] = 167;
1077 state->Init_Ctrl[32].bit[0] = 0;
1078 state->Init_Ctrl[32].val[0] = 1;
1079 state->Init_Ctrl[32].addr[1] = 167;
1080 state->Init_Ctrl[32].bit[1] = 1;
1081 state->Init_Ctrl[32].val[1] = 1;
1082 state->Init_Ctrl[32].addr[2] = 167;
1083 state->Init_Ctrl[32].bit[2] = 2;
1084 state->Init_Ctrl[32].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001085
Steven Toth3935c252008-05-01 05:45:44 -03001086 state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ;
1087 state->Init_Ctrl[33].size = 4 ;
1088 state->Init_Ctrl[33].addr[0] = 168;
1089 state->Init_Ctrl[33].bit[0] = 0;
1090 state->Init_Ctrl[33].val[0] = 0;
1091 state->Init_Ctrl[33].addr[1] = 168;
1092 state->Init_Ctrl[33].bit[1] = 1;
1093 state->Init_Ctrl[33].val[1] = 1;
1094 state->Init_Ctrl[33].addr[2] = 168;
1095 state->Init_Ctrl[33].bit[2] = 2;
1096 state->Init_Ctrl[33].val[2] = 0;
1097 state->Init_Ctrl[33].addr[3] = 168;
1098 state->Init_Ctrl[33].bit[3] = 3;
1099 state->Init_Ctrl[33].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001100
Steven Toth3935c252008-05-01 05:45:44 -03001101 state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ;
1102 state->Init_Ctrl[34].size = 4 ;
1103 state->Init_Ctrl[34].addr[0] = 168;
1104 state->Init_Ctrl[34].bit[0] = 4;
1105 state->Init_Ctrl[34].val[0] = 1;
1106 state->Init_Ctrl[34].addr[1] = 168;
1107 state->Init_Ctrl[34].bit[1] = 5;
1108 state->Init_Ctrl[34].val[1] = 1;
1109 state->Init_Ctrl[34].addr[2] = 168;
1110 state->Init_Ctrl[34].bit[2] = 6;
1111 state->Init_Ctrl[34].val[2] = 1;
1112 state->Init_Ctrl[34].addr[3] = 168;
1113 state->Init_Ctrl[34].bit[3] = 7;
1114 state->Init_Ctrl[34].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001115
Steven Toth3935c252008-05-01 05:45:44 -03001116 state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ;
1117 state->Init_Ctrl[35].size = 1 ;
1118 state->Init_Ctrl[35].addr[0] = 135;
1119 state->Init_Ctrl[35].bit[0] = 0;
1120 state->Init_Ctrl[35].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001121
Steven Toth3935c252008-05-01 05:45:44 -03001122 state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ;
1123 state->Init_Ctrl[36].size = 1 ;
1124 state->Init_Ctrl[36].addr[0] = 56;
1125 state->Init_Ctrl[36].bit[0] = 3;
1126 state->Init_Ctrl[36].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001127
Steven Toth3935c252008-05-01 05:45:44 -03001128 state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ;
1129 state->Init_Ctrl[37].size = 7 ;
1130 state->Init_Ctrl[37].addr[0] = 59;
1131 state->Init_Ctrl[37].bit[0] = 1;
1132 state->Init_Ctrl[37].val[0] = 0;
1133 state->Init_Ctrl[37].addr[1] = 59;
1134 state->Init_Ctrl[37].bit[1] = 2;
1135 state->Init_Ctrl[37].val[1] = 0;
1136 state->Init_Ctrl[37].addr[2] = 59;
1137 state->Init_Ctrl[37].bit[2] = 3;
1138 state->Init_Ctrl[37].val[2] = 0;
1139 state->Init_Ctrl[37].addr[3] = 59;
1140 state->Init_Ctrl[37].bit[3] = 4;
1141 state->Init_Ctrl[37].val[3] = 0;
1142 state->Init_Ctrl[37].addr[4] = 59;
1143 state->Init_Ctrl[37].bit[4] = 5;
1144 state->Init_Ctrl[37].val[4] = 0;
1145 state->Init_Ctrl[37].addr[5] = 59;
1146 state->Init_Ctrl[37].bit[5] = 6;
1147 state->Init_Ctrl[37].val[5] = 0;
1148 state->Init_Ctrl[37].addr[6] = 59;
1149 state->Init_Ctrl[37].bit[6] = 7;
1150 state->Init_Ctrl[37].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001151
Steven Toth3935c252008-05-01 05:45:44 -03001152 state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ;
1153 state->Init_Ctrl[38].size = 6 ;
1154 state->Init_Ctrl[38].addr[0] = 32;
1155 state->Init_Ctrl[38].bit[0] = 2;
1156 state->Init_Ctrl[38].val[0] = 0;
1157 state->Init_Ctrl[38].addr[1] = 32;
1158 state->Init_Ctrl[38].bit[1] = 3;
1159 state->Init_Ctrl[38].val[1] = 0;
1160 state->Init_Ctrl[38].addr[2] = 32;
1161 state->Init_Ctrl[38].bit[2] = 4;
1162 state->Init_Ctrl[38].val[2] = 0;
1163 state->Init_Ctrl[38].addr[3] = 32;
1164 state->Init_Ctrl[38].bit[3] = 5;
1165 state->Init_Ctrl[38].val[3] = 0;
1166 state->Init_Ctrl[38].addr[4] = 32;
1167 state->Init_Ctrl[38].bit[4] = 6;
1168 state->Init_Ctrl[38].val[4] = 1;
1169 state->Init_Ctrl[38].addr[5] = 32;
1170 state->Init_Ctrl[38].bit[5] = 7;
1171 state->Init_Ctrl[38].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001172
Steven Toth3935c252008-05-01 05:45:44 -03001173 state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ;
1174 state->Init_Ctrl[39].size = 1 ;
1175 state->Init_Ctrl[39].addr[0] = 25;
1176 state->Init_Ctrl[39].bit[0] = 3;
1177 state->Init_Ctrl[39].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001178
1179
Steven Toth3935c252008-05-01 05:45:44 -03001180 state->CH_Ctrl_Num = CHCTRL_NUM ;
Steven Toth52c99bd2008-05-01 04:57:01 -03001181
Steven Toth3935c252008-05-01 05:45:44 -03001182 state->CH_Ctrl[0].Ctrl_Num = DN_POLY ;
1183 state->CH_Ctrl[0].size = 2 ;
1184 state->CH_Ctrl[0].addr[0] = 68;
1185 state->CH_Ctrl[0].bit[0] = 6;
1186 state->CH_Ctrl[0].val[0] = 1;
1187 state->CH_Ctrl[0].addr[1] = 68;
1188 state->CH_Ctrl[0].bit[1] = 7;
1189 state->CH_Ctrl[0].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001190
Steven Toth3935c252008-05-01 05:45:44 -03001191 state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ;
1192 state->CH_Ctrl[1].size = 2 ;
1193 state->CH_Ctrl[1].addr[0] = 70;
1194 state->CH_Ctrl[1].bit[0] = 6;
1195 state->CH_Ctrl[1].val[0] = 1;
1196 state->CH_Ctrl[1].addr[1] = 70;
1197 state->CH_Ctrl[1].bit[1] = 7;
1198 state->CH_Ctrl[1].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001199
Steven Toth3935c252008-05-01 05:45:44 -03001200 state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ;
1201 state->CH_Ctrl[2].size = 9 ;
1202 state->CH_Ctrl[2].addr[0] = 69;
1203 state->CH_Ctrl[2].bit[0] = 5;
1204 state->CH_Ctrl[2].val[0] = 0;
1205 state->CH_Ctrl[2].addr[1] = 69;
1206 state->CH_Ctrl[2].bit[1] = 6;
1207 state->CH_Ctrl[2].val[1] = 0;
1208 state->CH_Ctrl[2].addr[2] = 69;
1209 state->CH_Ctrl[2].bit[2] = 7;
1210 state->CH_Ctrl[2].val[2] = 0;
1211 state->CH_Ctrl[2].addr[3] = 68;
1212 state->CH_Ctrl[2].bit[3] = 0;
1213 state->CH_Ctrl[2].val[3] = 0;
1214 state->CH_Ctrl[2].addr[4] = 68;
1215 state->CH_Ctrl[2].bit[4] = 1;
1216 state->CH_Ctrl[2].val[4] = 0;
1217 state->CH_Ctrl[2].addr[5] = 68;
1218 state->CH_Ctrl[2].bit[5] = 2;
1219 state->CH_Ctrl[2].val[5] = 0;
1220 state->CH_Ctrl[2].addr[6] = 68;
1221 state->CH_Ctrl[2].bit[6] = 3;
1222 state->CH_Ctrl[2].val[6] = 0;
1223 state->CH_Ctrl[2].addr[7] = 68;
1224 state->CH_Ctrl[2].bit[7] = 4;
1225 state->CH_Ctrl[2].val[7] = 0;
1226 state->CH_Ctrl[2].addr[8] = 68;
1227 state->CH_Ctrl[2].bit[8] = 5;
1228 state->CH_Ctrl[2].val[8] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001229
Steven Toth3935c252008-05-01 05:45:44 -03001230 state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ;
1231 state->CH_Ctrl[3].size = 1 ;
1232 state->CH_Ctrl[3].addr[0] = 70;
1233 state->CH_Ctrl[3].bit[0] = 5;
1234 state->CH_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001235
Steven Toth3935c252008-05-01 05:45:44 -03001236 state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ;
1237 state->CH_Ctrl[4].size = 3 ;
1238 state->CH_Ctrl[4].addr[0] = 73;
1239 state->CH_Ctrl[4].bit[0] = 4;
1240 state->CH_Ctrl[4].val[0] = 0;
1241 state->CH_Ctrl[4].addr[1] = 73;
1242 state->CH_Ctrl[4].bit[1] = 5;
1243 state->CH_Ctrl[4].val[1] = 1;
1244 state->CH_Ctrl[4].addr[2] = 73;
1245 state->CH_Ctrl[4].bit[2] = 6;
1246 state->CH_Ctrl[4].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001247
Steven Toth3935c252008-05-01 05:45:44 -03001248 state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ;
1249 state->CH_Ctrl[5].size = 4 ;
1250 state->CH_Ctrl[5].addr[0] = 70;
1251 state->CH_Ctrl[5].bit[0] = 0;
1252 state->CH_Ctrl[5].val[0] = 0;
1253 state->CH_Ctrl[5].addr[1] = 70;
1254 state->CH_Ctrl[5].bit[1] = 1;
1255 state->CH_Ctrl[5].val[1] = 0;
1256 state->CH_Ctrl[5].addr[2] = 70;
1257 state->CH_Ctrl[5].bit[2] = 2;
1258 state->CH_Ctrl[5].val[2] = 0;
1259 state->CH_Ctrl[5].addr[3] = 70;
1260 state->CH_Ctrl[5].bit[3] = 3;
1261 state->CH_Ctrl[5].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001262
Steven Toth3935c252008-05-01 05:45:44 -03001263 state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ;
1264 state->CH_Ctrl[6].size = 1 ;
1265 state->CH_Ctrl[6].addr[0] = 70;
1266 state->CH_Ctrl[6].bit[0] = 4;
1267 state->CH_Ctrl[6].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001268
Steven Toth3935c252008-05-01 05:45:44 -03001269 state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ;
1270 state->CH_Ctrl[7].size = 1 ;
1271 state->CH_Ctrl[7].addr[0] = 111;
1272 state->CH_Ctrl[7].bit[0] = 4;
1273 state->CH_Ctrl[7].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001274
Steven Toth3935c252008-05-01 05:45:44 -03001275 state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ;
1276 state->CH_Ctrl[8].size = 1 ;
1277 state->CH_Ctrl[8].addr[0] = 111;
1278 state->CH_Ctrl[8].bit[0] = 7;
1279 state->CH_Ctrl[8].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001280
Steven Toth3935c252008-05-01 05:45:44 -03001281 state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ;
1282 state->CH_Ctrl[9].size = 1 ;
1283 state->CH_Ctrl[9].addr[0] = 111;
1284 state->CH_Ctrl[9].bit[0] = 6;
1285 state->CH_Ctrl[9].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001286
Steven Toth3935c252008-05-01 05:45:44 -03001287 state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ;
1288 state->CH_Ctrl[10].size = 1 ;
1289 state->CH_Ctrl[10].addr[0] = 111;
1290 state->CH_Ctrl[10].bit[0] = 5;
1291 state->CH_Ctrl[10].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001292
Steven Toth3935c252008-05-01 05:45:44 -03001293 state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ;
1294 state->CH_Ctrl[11].size = 2 ;
1295 state->CH_Ctrl[11].addr[0] = 110;
1296 state->CH_Ctrl[11].bit[0] = 0;
1297 state->CH_Ctrl[11].val[0] = 1;
1298 state->CH_Ctrl[11].addr[1] = 110;
1299 state->CH_Ctrl[11].bit[1] = 1;
1300 state->CH_Ctrl[11].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001301
Steven Toth3935c252008-05-01 05:45:44 -03001302 state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ;
1303 state->CH_Ctrl[12].size = 3 ;
1304 state->CH_Ctrl[12].addr[0] = 69;
1305 state->CH_Ctrl[12].bit[0] = 2;
1306 state->CH_Ctrl[12].val[0] = 0;
1307 state->CH_Ctrl[12].addr[1] = 69;
1308 state->CH_Ctrl[12].bit[1] = 3;
1309 state->CH_Ctrl[12].val[1] = 0;
1310 state->CH_Ctrl[12].addr[2] = 69;
1311 state->CH_Ctrl[12].bit[2] = 4;
1312 state->CH_Ctrl[12].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001313
Steven Toth3935c252008-05-01 05:45:44 -03001314 state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ;
1315 state->CH_Ctrl[13].size = 6 ;
1316 state->CH_Ctrl[13].addr[0] = 110;
1317 state->CH_Ctrl[13].bit[0] = 2;
1318 state->CH_Ctrl[13].val[0] = 0;
1319 state->CH_Ctrl[13].addr[1] = 110;
1320 state->CH_Ctrl[13].bit[1] = 3;
1321 state->CH_Ctrl[13].val[1] = 0;
1322 state->CH_Ctrl[13].addr[2] = 110;
1323 state->CH_Ctrl[13].bit[2] = 4;
1324 state->CH_Ctrl[13].val[2] = 0;
1325 state->CH_Ctrl[13].addr[3] = 110;
1326 state->CH_Ctrl[13].bit[3] = 5;
1327 state->CH_Ctrl[13].val[3] = 0;
1328 state->CH_Ctrl[13].addr[4] = 110;
1329 state->CH_Ctrl[13].bit[4] = 6;
1330 state->CH_Ctrl[13].val[4] = 0;
1331 state->CH_Ctrl[13].addr[5] = 110;
1332 state->CH_Ctrl[13].bit[5] = 7;
1333 state->CH_Ctrl[13].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001334
Steven Toth3935c252008-05-01 05:45:44 -03001335 state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ;
1336 state->CH_Ctrl[14].size = 7 ;
1337 state->CH_Ctrl[14].addr[0] = 14;
1338 state->CH_Ctrl[14].bit[0] = 0;
1339 state->CH_Ctrl[14].val[0] = 0;
1340 state->CH_Ctrl[14].addr[1] = 14;
1341 state->CH_Ctrl[14].bit[1] = 1;
1342 state->CH_Ctrl[14].val[1] = 0;
1343 state->CH_Ctrl[14].addr[2] = 14;
1344 state->CH_Ctrl[14].bit[2] = 2;
1345 state->CH_Ctrl[14].val[2] = 0;
1346 state->CH_Ctrl[14].addr[3] = 14;
1347 state->CH_Ctrl[14].bit[3] = 3;
1348 state->CH_Ctrl[14].val[3] = 0;
1349 state->CH_Ctrl[14].addr[4] = 14;
1350 state->CH_Ctrl[14].bit[4] = 4;
1351 state->CH_Ctrl[14].val[4] = 0;
1352 state->CH_Ctrl[14].addr[5] = 14;
1353 state->CH_Ctrl[14].bit[5] = 5;
1354 state->CH_Ctrl[14].val[5] = 0;
1355 state->CH_Ctrl[14].addr[6] = 14;
1356 state->CH_Ctrl[14].bit[6] = 6;
1357 state->CH_Ctrl[14].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001358
Steven Toth3935c252008-05-01 05:45:44 -03001359 state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ;
1360 state->CH_Ctrl[15].size = 18 ;
1361 state->CH_Ctrl[15].addr[0] = 17;
1362 state->CH_Ctrl[15].bit[0] = 6;
1363 state->CH_Ctrl[15].val[0] = 0;
1364 state->CH_Ctrl[15].addr[1] = 17;
1365 state->CH_Ctrl[15].bit[1] = 7;
1366 state->CH_Ctrl[15].val[1] = 0;
1367 state->CH_Ctrl[15].addr[2] = 16;
1368 state->CH_Ctrl[15].bit[2] = 0;
1369 state->CH_Ctrl[15].val[2] = 0;
1370 state->CH_Ctrl[15].addr[3] = 16;
1371 state->CH_Ctrl[15].bit[3] = 1;
1372 state->CH_Ctrl[15].val[3] = 0;
1373 state->CH_Ctrl[15].addr[4] = 16;
1374 state->CH_Ctrl[15].bit[4] = 2;
1375 state->CH_Ctrl[15].val[4] = 0;
1376 state->CH_Ctrl[15].addr[5] = 16;
1377 state->CH_Ctrl[15].bit[5] = 3;
1378 state->CH_Ctrl[15].val[5] = 0;
1379 state->CH_Ctrl[15].addr[6] = 16;
1380 state->CH_Ctrl[15].bit[6] = 4;
1381 state->CH_Ctrl[15].val[6] = 0;
1382 state->CH_Ctrl[15].addr[7] = 16;
1383 state->CH_Ctrl[15].bit[7] = 5;
1384 state->CH_Ctrl[15].val[7] = 0;
1385 state->CH_Ctrl[15].addr[8] = 16;
1386 state->CH_Ctrl[15].bit[8] = 6;
1387 state->CH_Ctrl[15].val[8] = 0;
1388 state->CH_Ctrl[15].addr[9] = 16;
1389 state->CH_Ctrl[15].bit[9] = 7;
1390 state->CH_Ctrl[15].val[9] = 0;
1391 state->CH_Ctrl[15].addr[10] = 15;
1392 state->CH_Ctrl[15].bit[10] = 0;
1393 state->CH_Ctrl[15].val[10] = 0;
1394 state->CH_Ctrl[15].addr[11] = 15;
1395 state->CH_Ctrl[15].bit[11] = 1;
1396 state->CH_Ctrl[15].val[11] = 0;
1397 state->CH_Ctrl[15].addr[12] = 15;
1398 state->CH_Ctrl[15].bit[12] = 2;
1399 state->CH_Ctrl[15].val[12] = 0;
1400 state->CH_Ctrl[15].addr[13] = 15;
1401 state->CH_Ctrl[15].bit[13] = 3;
1402 state->CH_Ctrl[15].val[13] = 0;
1403 state->CH_Ctrl[15].addr[14] = 15;
1404 state->CH_Ctrl[15].bit[14] = 4;
1405 state->CH_Ctrl[15].val[14] = 0;
1406 state->CH_Ctrl[15].addr[15] = 15;
1407 state->CH_Ctrl[15].bit[15] = 5;
1408 state->CH_Ctrl[15].val[15] = 0;
1409 state->CH_Ctrl[15].addr[16] = 15;
1410 state->CH_Ctrl[15].bit[16] = 6;
1411 state->CH_Ctrl[15].val[16] = 1;
1412 state->CH_Ctrl[15].addr[17] = 15;
1413 state->CH_Ctrl[15].bit[17] = 7;
1414 state->CH_Ctrl[15].val[17] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001415
Steven Toth3935c252008-05-01 05:45:44 -03001416 state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ;
1417 state->CH_Ctrl[16].size = 5 ;
1418 state->CH_Ctrl[16].addr[0] = 112;
1419 state->CH_Ctrl[16].bit[0] = 0;
1420 state->CH_Ctrl[16].val[0] = 0;
1421 state->CH_Ctrl[16].addr[1] = 112;
1422 state->CH_Ctrl[16].bit[1] = 1;
1423 state->CH_Ctrl[16].val[1] = 0;
1424 state->CH_Ctrl[16].addr[2] = 112;
1425 state->CH_Ctrl[16].bit[2] = 2;
1426 state->CH_Ctrl[16].val[2] = 0;
1427 state->CH_Ctrl[16].addr[3] = 112;
1428 state->CH_Ctrl[16].bit[3] = 3;
1429 state->CH_Ctrl[16].val[3] = 0;
1430 state->CH_Ctrl[16].addr[4] = 112;
1431 state->CH_Ctrl[16].bit[4] = 4;
1432 state->CH_Ctrl[16].val[4] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001433
Steven Toth3935c252008-05-01 05:45:44 -03001434 state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ;
1435 state->CH_Ctrl[17].size = 1 ;
1436 state->CH_Ctrl[17].addr[0] = 14;
1437 state->CH_Ctrl[17].bit[0] = 7;
1438 state->CH_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001439
Steven Toth3935c252008-05-01 05:45:44 -03001440 state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ;
1441 state->CH_Ctrl[18].size = 4 ;
1442 state->CH_Ctrl[18].addr[0] = 107;
1443 state->CH_Ctrl[18].bit[0] = 3;
1444 state->CH_Ctrl[18].val[0] = 0;
1445 state->CH_Ctrl[18].addr[1] = 107;
1446 state->CH_Ctrl[18].bit[1] = 4;
1447 state->CH_Ctrl[18].val[1] = 0;
1448 state->CH_Ctrl[18].addr[2] = 107;
1449 state->CH_Ctrl[18].bit[2] = 5;
1450 state->CH_Ctrl[18].val[2] = 0;
1451 state->CH_Ctrl[18].addr[3] = 107;
1452 state->CH_Ctrl[18].bit[3] = 6;
1453 state->CH_Ctrl[18].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001454
Steven Toth3935c252008-05-01 05:45:44 -03001455 state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ;
1456 state->CH_Ctrl[19].size = 3 ;
1457 state->CH_Ctrl[19].addr[0] = 107;
1458 state->CH_Ctrl[19].bit[0] = 7;
1459 state->CH_Ctrl[19].val[0] = 1;
1460 state->CH_Ctrl[19].addr[1] = 106;
1461 state->CH_Ctrl[19].bit[1] = 0;
1462 state->CH_Ctrl[19].val[1] = 1;
1463 state->CH_Ctrl[19].addr[2] = 106;
1464 state->CH_Ctrl[19].bit[2] = 1;
1465 state->CH_Ctrl[19].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001466
Steven Toth3935c252008-05-01 05:45:44 -03001467 state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ;
1468 state->CH_Ctrl[20].size = 11 ;
1469 state->CH_Ctrl[20].addr[0] = 109;
1470 state->CH_Ctrl[20].bit[0] = 2;
1471 state->CH_Ctrl[20].val[0] = 0;
1472 state->CH_Ctrl[20].addr[1] = 109;
1473 state->CH_Ctrl[20].bit[1] = 3;
1474 state->CH_Ctrl[20].val[1] = 0;
1475 state->CH_Ctrl[20].addr[2] = 109;
1476 state->CH_Ctrl[20].bit[2] = 4;
1477 state->CH_Ctrl[20].val[2] = 0;
1478 state->CH_Ctrl[20].addr[3] = 109;
1479 state->CH_Ctrl[20].bit[3] = 5;
1480 state->CH_Ctrl[20].val[3] = 0;
1481 state->CH_Ctrl[20].addr[4] = 109;
1482 state->CH_Ctrl[20].bit[4] = 6;
1483 state->CH_Ctrl[20].val[4] = 0;
1484 state->CH_Ctrl[20].addr[5] = 109;
1485 state->CH_Ctrl[20].bit[5] = 7;
1486 state->CH_Ctrl[20].val[5] = 0;
1487 state->CH_Ctrl[20].addr[6] = 108;
1488 state->CH_Ctrl[20].bit[6] = 0;
1489 state->CH_Ctrl[20].val[6] = 0;
1490 state->CH_Ctrl[20].addr[7] = 108;
1491 state->CH_Ctrl[20].bit[7] = 1;
1492 state->CH_Ctrl[20].val[7] = 0;
1493 state->CH_Ctrl[20].addr[8] = 108;
1494 state->CH_Ctrl[20].bit[8] = 2;
1495 state->CH_Ctrl[20].val[8] = 1;
1496 state->CH_Ctrl[20].addr[9] = 108;
1497 state->CH_Ctrl[20].bit[9] = 3;
1498 state->CH_Ctrl[20].val[9] = 1;
1499 state->CH_Ctrl[20].addr[10] = 108;
1500 state->CH_Ctrl[20].bit[10] = 4;
1501 state->CH_Ctrl[20].val[10] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001502
Steven Toth3935c252008-05-01 05:45:44 -03001503 state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ;
1504 state->CH_Ctrl[21].size = 6 ;
1505 state->CH_Ctrl[21].addr[0] = 106;
1506 state->CH_Ctrl[21].bit[0] = 2;
1507 state->CH_Ctrl[21].val[0] = 0;
1508 state->CH_Ctrl[21].addr[1] = 106;
1509 state->CH_Ctrl[21].bit[1] = 3;
1510 state->CH_Ctrl[21].val[1] = 0;
1511 state->CH_Ctrl[21].addr[2] = 106;
1512 state->CH_Ctrl[21].bit[2] = 4;
1513 state->CH_Ctrl[21].val[2] = 0;
1514 state->CH_Ctrl[21].addr[3] = 106;
1515 state->CH_Ctrl[21].bit[3] = 5;
1516 state->CH_Ctrl[21].val[3] = 0;
1517 state->CH_Ctrl[21].addr[4] = 106;
1518 state->CH_Ctrl[21].bit[4] = 6;
1519 state->CH_Ctrl[21].val[4] = 0;
1520 state->CH_Ctrl[21].addr[5] = 106;
1521 state->CH_Ctrl[21].bit[5] = 7;
1522 state->CH_Ctrl[21].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001523
Steven Toth3935c252008-05-01 05:45:44 -03001524 state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ;
1525 state->CH_Ctrl[22].size = 1 ;
1526 state->CH_Ctrl[22].addr[0] = 138;
1527 state->CH_Ctrl[22].bit[0] = 4;
1528 state->CH_Ctrl[22].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001529
Steven Toth3935c252008-05-01 05:45:44 -03001530 state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ;
1531 state->CH_Ctrl[23].size = 1 ;
1532 state->CH_Ctrl[23].addr[0] = 17;
1533 state->CH_Ctrl[23].bit[0] = 5;
1534 state->CH_Ctrl[23].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001535
Steven Toth3935c252008-05-01 05:45:44 -03001536 state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ;
1537 state->CH_Ctrl[24].size = 1 ;
1538 state->CH_Ctrl[24].addr[0] = 111;
1539 state->CH_Ctrl[24].bit[0] = 3;
1540 state->CH_Ctrl[24].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001541
Steven Toth3935c252008-05-01 05:45:44 -03001542 state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ;
1543 state->CH_Ctrl[25].size = 1 ;
1544 state->CH_Ctrl[25].addr[0] = 112;
1545 state->CH_Ctrl[25].bit[0] = 7;
1546 state->CH_Ctrl[25].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001547
Steven Toth3935c252008-05-01 05:45:44 -03001548 state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ;
1549 state->CH_Ctrl[26].size = 1 ;
1550 state->CH_Ctrl[26].addr[0] = 136;
1551 state->CH_Ctrl[26].bit[0] = 7;
1552 state->CH_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001553
Steven Toth3935c252008-05-01 05:45:44 -03001554 state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ;
1555 state->CH_Ctrl[27].size = 1 ;
1556 state->CH_Ctrl[27].addr[0] = 149;
1557 state->CH_Ctrl[27].bit[0] = 7;
1558 state->CH_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001559
Steven Toth3935c252008-05-01 05:45:44 -03001560 state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ;
1561 state->CH_Ctrl[28].size = 1 ;
1562 state->CH_Ctrl[28].addr[0] = 149;
1563 state->CH_Ctrl[28].bit[0] = 6;
1564 state->CH_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001565
Steven Toth3935c252008-05-01 05:45:44 -03001566 state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ;
1567 state->CH_Ctrl[29].size = 1 ;
1568 state->CH_Ctrl[29].addr[0] = 149;
1569 state->CH_Ctrl[29].bit[0] = 5;
1570 state->CH_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001571
Steven Toth3935c252008-05-01 05:45:44 -03001572 state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ;
1573 state->CH_Ctrl[30].size = 1 ;
1574 state->CH_Ctrl[30].addr[0] = 149;
1575 state->CH_Ctrl[30].bit[0] = 4;
1576 state->CH_Ctrl[30].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001577
Steven Toth3935c252008-05-01 05:45:44 -03001578 state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ;
1579 state->CH_Ctrl[31].size = 1 ;
1580 state->CH_Ctrl[31].addr[0] = 149;
1581 state->CH_Ctrl[31].bit[0] = 3;
1582 state->CH_Ctrl[31].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001583
Steven Toth3935c252008-05-01 05:45:44 -03001584 state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ;
1585 state->CH_Ctrl[32].size = 1 ;
1586 state->CH_Ctrl[32].addr[0] = 93;
1587 state->CH_Ctrl[32].bit[0] = 1;
1588 state->CH_Ctrl[32].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001589
Steven Toth3935c252008-05-01 05:45:44 -03001590 state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ;
1591 state->CH_Ctrl[33].size = 1 ;
1592 state->CH_Ctrl[33].addr[0] = 93;
1593 state->CH_Ctrl[33].bit[0] = 0;
1594 state->CH_Ctrl[33].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001595
Steven Toth3935c252008-05-01 05:45:44 -03001596 state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ;
1597 state->CH_Ctrl[34].size = 6 ;
1598 state->CH_Ctrl[34].addr[0] = 92;
1599 state->CH_Ctrl[34].bit[0] = 2;
1600 state->CH_Ctrl[34].val[0] = 0;
1601 state->CH_Ctrl[34].addr[1] = 92;
1602 state->CH_Ctrl[34].bit[1] = 3;
1603 state->CH_Ctrl[34].val[1] = 0;
1604 state->CH_Ctrl[34].addr[2] = 92;
1605 state->CH_Ctrl[34].bit[2] = 4;
1606 state->CH_Ctrl[34].val[2] = 0;
1607 state->CH_Ctrl[34].addr[3] = 92;
1608 state->CH_Ctrl[34].bit[3] = 5;
1609 state->CH_Ctrl[34].val[3] = 0;
1610 state->CH_Ctrl[34].addr[4] = 92;
1611 state->CH_Ctrl[34].bit[4] = 6;
1612 state->CH_Ctrl[34].val[4] = 0;
1613 state->CH_Ctrl[34].addr[5] = 92;
1614 state->CH_Ctrl[34].bit[5] = 7;
1615 state->CH_Ctrl[34].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001616
Steven Toth3935c252008-05-01 05:45:44 -03001617 state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ;
1618 state->CH_Ctrl[35].size = 6 ;
1619 state->CH_Ctrl[35].addr[0] = 93;
1620 state->CH_Ctrl[35].bit[0] = 2;
1621 state->CH_Ctrl[35].val[0] = 0;
1622 state->CH_Ctrl[35].addr[1] = 93;
1623 state->CH_Ctrl[35].bit[1] = 3;
1624 state->CH_Ctrl[35].val[1] = 0;
1625 state->CH_Ctrl[35].addr[2] = 93;
1626 state->CH_Ctrl[35].bit[2] = 4;
1627 state->CH_Ctrl[35].val[2] = 0;
1628 state->CH_Ctrl[35].addr[3] = 93;
1629 state->CH_Ctrl[35].bit[3] = 5;
1630 state->CH_Ctrl[35].val[3] = 0;
1631 state->CH_Ctrl[35].addr[4] = 93;
1632 state->CH_Ctrl[35].bit[4] = 6;
1633 state->CH_Ctrl[35].val[4] = 0;
1634 state->CH_Ctrl[35].addr[5] = 93;
1635 state->CH_Ctrl[35].bit[5] = 7;
1636 state->CH_Ctrl[35].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001637
1638#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03001639 state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ;
1640 state->CH_Ctrl[36].size = 1 ;
1641 state->CH_Ctrl[36].addr[0] = 109;
1642 state->CH_Ctrl[36].bit[0] = 1;
1643 state->CH_Ctrl[36].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001644
Steven Toth3935c252008-05-01 05:45:44 -03001645 state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ;
1646 state->CH_Ctrl[37].size = 2 ;
1647 state->CH_Ctrl[37].addr[0] = 112;
1648 state->CH_Ctrl[37].bit[0] = 5;
1649 state->CH_Ctrl[37].val[0] = 0;
1650 state->CH_Ctrl[37].addr[1] = 112;
1651 state->CH_Ctrl[37].bit[1] = 6;
1652 state->CH_Ctrl[37].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001653
Steven Toth3935c252008-05-01 05:45:44 -03001654 state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ;
1655 state->CH_Ctrl[38].size = 1 ;
1656 state->CH_Ctrl[38].addr[0] = 65;
1657 state->CH_Ctrl[38].bit[0] = 1;
1658 state->CH_Ctrl[38].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001659#endif
1660
1661 return 0 ;
1662}
1663
Steven Tothc6c34b12008-05-03 14:14:54 -03001664static void InitTunerControls(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001665{
Steven Toth3935c252008-05-01 05:45:44 -03001666 MXL5005_RegisterInit(fe);
1667 MXL5005_ControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001668#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03001669 MXL5005_MXLControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001670#endif
1671}
1672
Steven Tothc6c34b12008-05-03 14:14:54 -03001673static u16 MXL5005_TunerConfig(struct dvb_frontend *fe,
Steven Tothd211017b2008-05-01 19:35:54 -03001674 u8 Mode, /* 0: Analog Mode ; 1: Digital Mode */
1675 u8 IF_mode, /* for Analog Mode, 0: zero IF; 1: low IF */
1676 u32 Bandwidth, /* filter channel bandwidth (6, 7, 8) */
1677 u32 IF_out, /* Desired IF Out Frequency */
1678 u32 Fxtal, /* XTAL Frequency */
1679 u8 AGC_Mode, /* AGC Mode - Dual AGC: 0, Single AGC: 1 */
1680 u16 TOP, /* 0: Dual AGC; Value: take over point */
1681 u16 IF_OUT_LOAD, /* IF Out Load Resistor (200 / 300 Ohms) */
1682 u8 CLOCK_OUT, /* 0: turn off clk out; 1: turn on clock out */
1683 u8 DIV_OUT, /* 0: Div-1; 1: Div-4 */
1684 u8 CAPSELECT, /* 0: disable On-Chip pulling cap; 1: enable */
1685 u8 EN_RSSI, /* 0: disable RSSI; 1: enable RSSI */
1686
1687 /* Modulation Type; */
1688 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
1689 u8 Mod_Type,
1690
1691 /* Tracking Filter */
1692 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
1693 u8 TF_Type
1694 )
Steven Toth52c99bd2008-05-01 04:57:01 -03001695{
Steven Toth85d220d2008-05-01 05:48:14 -03001696 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001697 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001698
Steven Toth3935c252008-05-01 05:45:44 -03001699 state->Mode = Mode;
1700 state->IF_Mode = IF_mode;
1701 state->Chan_Bandwidth = Bandwidth;
1702 state->IF_OUT = IF_out;
1703 state->Fxtal = Fxtal;
1704 state->AGC_Mode = AGC_Mode;
1705 state->TOP = TOP;
1706 state->IF_OUT_LOAD = IF_OUT_LOAD;
1707 state->CLOCK_OUT = CLOCK_OUT;
1708 state->DIV_OUT = DIV_OUT;
1709 state->CAPSELECT = CAPSELECT;
1710 state->EN_RSSI = EN_RSSI;
1711 state->Mod_Type = Mod_Type;
1712 state->TF_Type = TF_Type;
Steven Toth52c99bd2008-05-01 04:57:01 -03001713
Steven Totha8214d42008-05-01 05:02:58 -03001714 /* Initialize all the controls and registers */
Steven Toth3935c252008-05-01 05:45:44 -03001715 InitTunerControls(fe);
Steven Totha8214d42008-05-01 05:02:58 -03001716
1717 /* Synthesizer LO frequency calculation */
Steven Toth3935c252008-05-01 05:45:44 -03001718 MXL_SynthIFLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001719
Steven Toth3935c252008-05-01 05:45:44 -03001720 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001721}
1722
Steven Tothc6c34b12008-05-03 14:14:54 -03001723static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001724{
Steven Toth85d220d2008-05-01 05:48:14 -03001725 struct mxl5005s_state *state = fe->tuner_priv;
1726 if (state->Mode == 1) /* Digital Mode */
Steven Toth3935c252008-05-01 05:45:44 -03001727 state->IF_LO = state->IF_OUT;
Steven Tothd211017b2008-05-01 19:35:54 -03001728 else /* Analog Mode */ {
1729 if (state->IF_Mode == 0) /* Analog Zero IF mode */
Steven Toth3935c252008-05-01 05:45:44 -03001730 state->IF_LO = state->IF_OUT + 400000;
1731 else /* Analog Low IF mode */
1732 state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2;
Steven Toth52c99bd2008-05-01 04:57:01 -03001733 }
1734}
1735
Steven Tothc6c34b12008-05-03 14:14:54 -03001736static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001737{
Steven Toth85d220d2008-05-01 05:48:14 -03001738 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001739
1740 if (state->Mode == 1) /* Digital Mode */ {
Steven Tothd211017b2008-05-01 19:35:54 -03001741 /* remove 20.48MHz setting for 2.6.10 */
Steven Toth3935c252008-05-01 05:45:44 -03001742 state->RF_LO = state->RF_IN;
Steven Tothd211017b2008-05-01 19:35:54 -03001743 /* change for 2.6.6 */
1744 state->TG_LO = state->RF_IN - 750000;
Steven Toth3935c252008-05-01 05:45:44 -03001745 } else /* Analog Mode */ {
Steven Tothd211017b2008-05-01 19:35:54 -03001746 if (state->IF_Mode == 0) /* Analog Zero IF mode */ {
Steven Toth3935c252008-05-01 05:45:44 -03001747 state->RF_LO = state->RF_IN - 400000;
1748 state->TG_LO = state->RF_IN - 1750000;
1749 } else /* Analog Low IF mode */ {
1750 state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2;
Steven Tothd211017b2008-05-01 19:35:54 -03001751 state->TG_LO = state->RF_IN -
1752 state->Chan_Bandwidth + 500000;
Steven Toth52c99bd2008-05-01 04:57:01 -03001753 }
1754 }
1755}
1756
Steven Tothc6c34b12008-05-03 14:14:54 -03001757static u16 MXL_OverwriteICDefault(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001758{
Steven Toth3935c252008-05-01 05:45:44 -03001759 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001760
Steven Toth3935c252008-05-01 05:45:44 -03001761 status += MXL_ControlWrite(fe, OVERRIDE_1, 1);
1762 status += MXL_ControlWrite(fe, OVERRIDE_2, 1);
1763 status += MXL_ControlWrite(fe, OVERRIDE_3, 1);
1764 status += MXL_ControlWrite(fe, OVERRIDE_4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001765
Steven Toth3935c252008-05-01 05:45:44 -03001766 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001767}
1768
Steven Tothc6c34b12008-05-03 14:14:54 -03001769static u16 MXL_BlockInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001770{
Steven Toth85d220d2008-05-01 05:48:14 -03001771 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001772 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001773
Steven Toth3935c252008-05-01 05:45:44 -03001774 status += MXL_OverwriteICDefault(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001775
Steven Toth3935c252008-05-01 05:45:44 -03001776 /* Downconverter Control Dig Ana */
1777 status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001778
Steven Toth3935c252008-05-01 05:45:44 -03001779 /* Filter Control Dig Ana */
1780 status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1);
1781 status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2);
1782 status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0);
1783 status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1);
1784 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001785
Steven Toth3935c252008-05-01 05:45:44 -03001786 /* Initialize Low-Pass Filter */
1787 if (state->Mode) { /* Digital Mode */
1788 switch (state->Chan_Bandwidth) {
Steven Tothd211017b2008-05-01 19:35:54 -03001789 case 8000000:
1790 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0);
1791 break;
1792 case 7000000:
1793 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2);
1794 break;
1795 case 6000000:
1796 status += MXL_ControlWrite(fe,
1797 BB_DLPF_BANDSEL, 3);
1798 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001799 }
Steven Toth3935c252008-05-01 05:45:44 -03001800 } else { /* Analog Mode */
1801 switch (state->Chan_Bandwidth) {
Steven Tothd211017b2008-05-01 19:35:54 -03001802 case 8000000: /* Low Zero */
1803 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1804 (state->IF_Mode ? 0 : 3));
1805 break;
1806 case 7000000:
1807 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1808 (state->IF_Mode ? 1 : 4));
1809 break;
1810 case 6000000:
1811 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1812 (state->IF_Mode ? 2 : 5));
1813 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001814 }
1815 }
1816
Steven Toth3935c252008-05-01 05:45:44 -03001817 /* Charge Pump Control Dig Ana */
Steven Tothd211017b2008-05-01 19:35:54 -03001818 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8);
1819 status += MXL_ControlWrite(fe,
1820 RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1);
Steven Toth3935c252008-05-01 05:45:44 -03001821 status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001822
Steven Toth3935c252008-05-01 05:45:44 -03001823 /* AGC TOP Control */
1824 if (state->AGC_Mode == 0) /* Dual AGC */ {
1825 status += MXL_ControlWrite(fe, AGC_IF, 15);
1826 status += MXL_ControlWrite(fe, AGC_RF, 15);
Steven Tothd211017b2008-05-01 19:35:54 -03001827 } else /* Single AGC Mode Dig Ana */
Steven Toth3935c252008-05-01 05:45:44 -03001828 status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03001829
Steven Toth3935c252008-05-01 05:45:44 -03001830 if (state->TOP == 55) /* TOP == 5.5 */
1831 status += MXL_ControlWrite(fe, AGC_IF, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001832
Steven Toth3935c252008-05-01 05:45:44 -03001833 if (state->TOP == 72) /* TOP == 7.2 */
1834 status += MXL_ControlWrite(fe, AGC_IF, 0x1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001835
Steven Toth3935c252008-05-01 05:45:44 -03001836 if (state->TOP == 92) /* TOP == 9.2 */
1837 status += MXL_ControlWrite(fe, AGC_IF, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03001838
Steven Toth3935c252008-05-01 05:45:44 -03001839 if (state->TOP == 110) /* TOP == 11.0 */
1840 status += MXL_ControlWrite(fe, AGC_IF, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03001841
Steven Toth3935c252008-05-01 05:45:44 -03001842 if (state->TOP == 129) /* TOP == 12.9 */
1843 status += MXL_ControlWrite(fe, AGC_IF, 0x4);
Steven Toth52c99bd2008-05-01 04:57:01 -03001844
Steven Toth3935c252008-05-01 05:45:44 -03001845 if (state->TOP == 147) /* TOP == 14.7 */
1846 status += MXL_ControlWrite(fe, AGC_IF, 0x5);
Steven Toth52c99bd2008-05-01 04:57:01 -03001847
Steven Toth3935c252008-05-01 05:45:44 -03001848 if (state->TOP == 168) /* TOP == 16.8 */
1849 status += MXL_ControlWrite(fe, AGC_IF, 0x6);
Steven Toth52c99bd2008-05-01 04:57:01 -03001850
Steven Toth3935c252008-05-01 05:45:44 -03001851 if (state->TOP == 194) /* TOP == 19.4 */
1852 status += MXL_ControlWrite(fe, AGC_IF, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03001853
Steven Toth3935c252008-05-01 05:45:44 -03001854 if (state->TOP == 212) /* TOP == 21.2 */
1855 status += MXL_ControlWrite(fe, AGC_IF, 0x9);
Steven Toth52c99bd2008-05-01 04:57:01 -03001856
Steven Toth3935c252008-05-01 05:45:44 -03001857 if (state->TOP == 232) /* TOP == 23.2 */
1858 status += MXL_ControlWrite(fe, AGC_IF, 0xA);
Steven Toth52c99bd2008-05-01 04:57:01 -03001859
Steven Toth3935c252008-05-01 05:45:44 -03001860 if (state->TOP == 252) /* TOP == 25.2 */
1861 status += MXL_ControlWrite(fe, AGC_IF, 0xB);
Steven Toth52c99bd2008-05-01 04:57:01 -03001862
Steven Toth3935c252008-05-01 05:45:44 -03001863 if (state->TOP == 271) /* TOP == 27.1 */
1864 status += MXL_ControlWrite(fe, AGC_IF, 0xC);
Steven Toth52c99bd2008-05-01 04:57:01 -03001865
Steven Toth3935c252008-05-01 05:45:44 -03001866 if (state->TOP == 292) /* TOP == 29.2 */
1867 status += MXL_ControlWrite(fe, AGC_IF, 0xD);
Steven Toth52c99bd2008-05-01 04:57:01 -03001868
Steven Toth3935c252008-05-01 05:45:44 -03001869 if (state->TOP == 317) /* TOP == 31.7 */
1870 status += MXL_ControlWrite(fe, AGC_IF, 0xE);
Steven Toth52c99bd2008-05-01 04:57:01 -03001871
Steven Toth3935c252008-05-01 05:45:44 -03001872 if (state->TOP == 349) /* TOP == 34.9 */
1873 status += MXL_ControlWrite(fe, AGC_IF, 0xF);
Steven Toth52c99bd2008-05-01 04:57:01 -03001874
Steven Toth3935c252008-05-01 05:45:44 -03001875 /* IF Synthesizer Control */
1876 status += MXL_IFSynthInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001877
Steven Toth3935c252008-05-01 05:45:44 -03001878 /* IF UpConverter Control */
1879 if (state->IF_OUT_LOAD == 200) {
1880 status += MXL_ControlWrite(fe, DRV_RES_SEL, 6);
1881 status += MXL_ControlWrite(fe, I_DRIVER, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03001882 }
Steven Toth3935c252008-05-01 05:45:44 -03001883 if (state->IF_OUT_LOAD == 300) {
1884 status += MXL_ControlWrite(fe, DRV_RES_SEL, 4);
1885 status += MXL_ControlWrite(fe, I_DRIVER, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001886 }
1887
Steven Toth3935c252008-05-01 05:45:44 -03001888 /* Anti-Alias Filtering Control
1889 * initialise Anti-Aliasing Filter
1890 */
1891 if (state->Mode) { /* Digital Mode */
1892 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) {
1893 status += MXL_ControlWrite(fe, EN_AAF, 1);
1894 status += MXL_ControlWrite(fe, EN_3P, 1);
1895 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1896 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001897 }
Steven Tothd211017b2008-05-01 19:35:54 -03001898 if ((state->IF_OUT == 36125000UL) ||
1899 (state->IF_OUT == 36150000UL)) {
Steven Toth3935c252008-05-01 05:45:44 -03001900 status += MXL_ControlWrite(fe, EN_AAF, 1);
1901 status += MXL_ControlWrite(fe, EN_3P, 1);
1902 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1903 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001904 }
Steven Toth3935c252008-05-01 05:45:44 -03001905 if (state->IF_OUT > 36150000UL) {
1906 status += MXL_ControlWrite(fe, EN_AAF, 0);
1907 status += MXL_ControlWrite(fe, EN_3P, 1);
1908 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1909 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001910 }
Steven Toth3935c252008-05-01 05:45:44 -03001911 } else { /* Analog Mode */
Steven Tothd211017b2008-05-01 19:35:54 -03001912 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03001913 status += MXL_ControlWrite(fe, EN_AAF, 1);
1914 status += MXL_ControlWrite(fe, EN_3P, 1);
1915 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1916 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001917 }
Steven Tothd211017b2008-05-01 19:35:54 -03001918 if (state->IF_OUT > 5000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03001919 status += MXL_ControlWrite(fe, EN_AAF, 0);
1920 status += MXL_ControlWrite(fe, EN_3P, 0);
1921 status += MXL_ControlWrite(fe, EN_AUX_3P, 0);
1922 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001923 }
1924 }
1925
Steven Toth3935c252008-05-01 05:45:44 -03001926 /* Demod Clock Out */
1927 if (state->CLOCK_OUT)
1928 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001929 else
Steven Toth3935c252008-05-01 05:45:44 -03001930 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001931
Steven Toth3935c252008-05-01 05:45:44 -03001932 if (state->DIV_OUT == 1)
1933 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1);
1934 if (state->DIV_OUT == 0)
1935 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001936
Steven Toth3935c252008-05-01 05:45:44 -03001937 /* Crystal Control */
1938 if (state->CAPSELECT)
1939 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001940 else
Steven Toth3935c252008-05-01 05:45:44 -03001941 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001942
Steven Toth3935c252008-05-01 05:45:44 -03001943 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
1944 status += MXL_ControlWrite(fe, IF_SEL_DBL, 1);
1945 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
1946 status += MXL_ControlWrite(fe, IF_SEL_DBL, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001947
Steven Toth3935c252008-05-01 05:45:44 -03001948 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
1949 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3);
1950 if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL)
1951 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001952
Steven Toth3935c252008-05-01 05:45:44 -03001953 /* Misc Controls */
Steven Toth85d220d2008-05-01 05:48:14 -03001954 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */
Steven Toth3935c252008-05-01 05:45:44 -03001955 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001956 else
Steven Toth3935c252008-05-01 05:45:44 -03001957 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001958
Steven Toth3935c252008-05-01 05:45:44 -03001959 /* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */
Steven Toth52c99bd2008-05-01 04:57:01 -03001960
Steven Toth3935c252008-05-01 05:45:44 -03001961 /* Set TG_R_DIV */
Steven Tothd211017b2008-05-01 19:35:54 -03001962 status += MXL_ControlWrite(fe, TG_R_DIV,
1963 MXL_Ceiling(state->Fxtal, 1000000));
Steven Toth52c99bd2008-05-01 04:57:01 -03001964
Steven Toth3935c252008-05-01 05:45:44 -03001965 /* Apply Default value to BB_INITSTATE_DLPF_TUNE */
Steven Toth52c99bd2008-05-01 04:57:01 -03001966
Steven Toth3935c252008-05-01 05:45:44 -03001967 /* RSSI Control */
Steven Tothd211017b2008-05-01 19:35:54 -03001968 if (state->EN_RSSI) {
Steven Toth3935c252008-05-01 05:45:44 -03001969 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
1970 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
1971 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
1972 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
1973
1974 /* RSSI reference point */
1975 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
1976 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3);
1977 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
1978
1979 /* TOP point */
1980 status += MXL_ControlWrite(fe, RFA_FLR, 0);
1981 status += MXL_ControlWrite(fe, RFA_CEIL, 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03001982 }
1983
Steven Toth3935c252008-05-01 05:45:44 -03001984 /* Modulation type bit settings
1985 * Override the control values preset
1986 */
Steven Tothd211017b2008-05-01 19:35:54 -03001987 if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */ {
Steven Toth3935c252008-05-01 05:45:44 -03001988 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03001989
Steven Toth3935c252008-05-01 05:45:44 -03001990 /* Enable RSSI */
1991 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
1992 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
1993 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
1994 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
1995
1996 /* RSSI reference point */
1997 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
1998 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
1999 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2000
2001 /* TOP point */
2002 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2003 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2004 if (state->IF_OUT <= 6280000UL) /* Low IF */
2005 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2006 else /* High IF */
2007 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002008
2009 }
Steven Tothd211017b2008-05-01 19:35:54 -03002010 if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */ {
Steven Toth85d220d2008-05-01 05:48:14 -03002011 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002012
Steven Toth3935c252008-05-01 05:45:44 -03002013 /* Enable RSSI */
2014 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2015 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2016 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2017 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002018
Steven Toth3935c252008-05-01 05:45:44 -03002019 /* RSSI reference point */
2020 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2021 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4);
2022 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2023
2024 /* TOP point */
2025 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2026 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2027 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1);
Steven Tothd211017b2008-05-01 19:35:54 -03002028 /* Low Zero */
2029 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);
2030
Steven Toth3935c252008-05-01 05:45:44 -03002031 if (state->IF_OUT <= 6280000UL) /* Low IF */
2032 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2033 else /* High IF */
2034 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002035 }
Steven Tothd211017b2008-05-01 19:35:54 -03002036 if (state->Mod_Type == MXL_QAM) /* QAM Mode */ {
Steven Toth3935c252008-05-01 05:45:44 -03002037 state->Mode = MXL_DIGITAL_MODE;
Steven Toth52c99bd2008-05-01 04:57:01 -03002038
Steven Toth3935c252008-05-01 05:45:44 -03002039 /* state->AGC_Mode = 1; */ /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002040
Steven Toth3935c252008-05-01 05:45:44 -03002041 /* Disable RSSI */ /* change here for v2.6.5 */
2042 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2043 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2044 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2045 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002046
Steven Toth3935c252008-05-01 05:45:44 -03002047 /* RSSI reference point */
2048 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2049 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2050 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
Steven Tothd211017b2008-05-01 19:35:54 -03002051 /* change here for v2.6.5 */
2052 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002053
Steven Toth3935c252008-05-01 05:45:44 -03002054 if (state->IF_OUT <= 6280000UL) /* Low IF */
2055 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2056 else /* High IF */
2057 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth48937292008-05-01 07:15:38 -03002058 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
2059
Steven Toth52c99bd2008-05-01 04:57:01 -03002060 }
Steven Toth3935c252008-05-01 05:45:44 -03002061 if (state->Mod_Type == MXL_ANALOG_CABLE) {
2062 /* Analog Cable Mode */
Steven Toth85d220d2008-05-01 05:48:14 -03002063 /* state->Mode = MXL_DIGITAL_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002064
Steven Toth3935c252008-05-01 05:45:44 -03002065 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002066
Steven Toth3935c252008-05-01 05:45:44 -03002067 /* Disable RSSI */
2068 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2069 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2070 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2071 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Tothd211017b2008-05-01 19:35:54 -03002072 /* change for 2.6.3 */
2073 status += MXL_ControlWrite(fe, AGC_IF, 1);
Steven Toth3935c252008-05-01 05:45:44 -03002074 status += MXL_ControlWrite(fe, AGC_RF, 15);
2075 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002076 }
2077
Steven Toth3935c252008-05-01 05:45:44 -03002078 if (state->Mod_Type == MXL_ANALOG_OTA) {
2079 /* Analog OTA Terrestrial mode add for 2.6.7 */
2080 /* state->Mode = MXL_ANALOG_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002081
Steven Toth3935c252008-05-01 05:45:44 -03002082 /* Enable RSSI */
2083 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2084 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2085 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2086 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002087
Steven Toth3935c252008-05-01 05:45:44 -03002088 /* RSSI reference point */
2089 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2090 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2091 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2092 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2093 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002094 }
2095
Steven Toth3935c252008-05-01 05:45:44 -03002096 /* RSSI disable */
Steven Tothd211017b2008-05-01 19:35:54 -03002097 if (state->EN_RSSI == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03002098 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2099 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2100 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2101 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002102 }
2103
Steven Toth3935c252008-05-01 05:45:44 -03002104 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03002105}
2106
Steven Tothc6c34b12008-05-03 14:14:54 -03002107static u16 MXL_IFSynthInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03002108{
Steven Toth85d220d2008-05-01 05:48:14 -03002109 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03002110 u16 status = 0 ;
Steven Totha8214d42008-05-01 05:02:58 -03002111 u32 Fref = 0 ;
2112 u32 Kdbl, intModVal ;
2113 u32 fracModVal ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002114 Kdbl = 2 ;
2115
Steven Toth3935c252008-05-01 05:45:44 -03002116 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002117 Kdbl = 2 ;
Steven Toth3935c252008-05-01 05:45:44 -03002118 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002119 Kdbl = 1 ;
2120
Steven Tothd211017b2008-05-01 19:35:54 -03002121 /* IF Synthesizer Control */
2122 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF mode */ {
Steven Toth85d220d2008-05-01 05:48:14 -03002123 if (state->IF_LO == 41000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002124 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2125 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002126 Fref = 328000000UL ;
2127 }
Steven Toth85d220d2008-05-01 05:48:14 -03002128 if (state->IF_LO == 47000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002129 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2130 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002131 Fref = 376000000UL ;
2132 }
Steven Toth85d220d2008-05-01 05:48:14 -03002133 if (state->IF_LO == 54000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002134 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2135 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002136 Fref = 324000000UL ;
2137 }
Steven Toth85d220d2008-05-01 05:48:14 -03002138 if (state->IF_LO == 60000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002139 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2140 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002141 Fref = 360000000UL ;
2142 }
Steven Toth85d220d2008-05-01 05:48:14 -03002143 if (state->IF_LO == 39250000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002144 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2145 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002146 Fref = 314000000UL ;
2147 }
Steven Toth85d220d2008-05-01 05:48:14 -03002148 if (state->IF_LO == 39650000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002149 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2150 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002151 Fref = 317200000UL ;
2152 }
Steven Toth85d220d2008-05-01 05:48:14 -03002153 if (state->IF_LO == 40150000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002154 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2155 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002156 Fref = 321200000UL ;
2157 }
Steven Toth85d220d2008-05-01 05:48:14 -03002158 if (state->IF_LO == 40650000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002159 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2160 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002161 Fref = 325200000UL ;
2162 }
2163 }
2164
Steven Tothd211017b2008-05-01 19:35:54 -03002165 if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0)) {
Steven Toth85d220d2008-05-01 05:48:14 -03002166 if (state->IF_LO == 57000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002167 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2168 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002169 Fref = 342000000UL ;
2170 }
Steven Toth85d220d2008-05-01 05:48:14 -03002171 if (state->IF_LO == 44000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002172 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2173 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002174 Fref = 352000000UL ;
2175 }
Steven Toth85d220d2008-05-01 05:48:14 -03002176 if (state->IF_LO == 43750000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002177 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2178 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002179 Fref = 350000000UL ;
2180 }
Steven Toth85d220d2008-05-01 05:48:14 -03002181 if (state->IF_LO == 36650000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002182 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2183 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002184 Fref = 366500000UL ;
2185 }
Steven Toth85d220d2008-05-01 05:48:14 -03002186 if (state->IF_LO == 36150000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002187 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2188 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002189 Fref = 361500000UL ;
2190 }
Steven Toth85d220d2008-05-01 05:48:14 -03002191 if (state->IF_LO == 36000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002192 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2193 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002194 Fref = 360000000UL ;
2195 }
Steven Toth85d220d2008-05-01 05:48:14 -03002196 if (state->IF_LO == 35250000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002197 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2198 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002199 Fref = 352500000UL ;
2200 }
Steven Toth85d220d2008-05-01 05:48:14 -03002201 if (state->IF_LO == 34750000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002202 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2203 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002204 Fref = 347500000UL ;
2205 }
Steven Toth85d220d2008-05-01 05:48:14 -03002206 if (state->IF_LO == 6280000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002207 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2208 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002209 Fref = 376800000UL ;
2210 }
Steven Toth85d220d2008-05-01 05:48:14 -03002211 if (state->IF_LO == 5000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002212 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);
2213 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002214 Fref = 360000000UL ;
2215 }
Steven Toth85d220d2008-05-01 05:48:14 -03002216 if (state->IF_LO == 4500000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002217 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);
2218 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002219 Fref = 360000000UL ;
2220 }
Steven Toth85d220d2008-05-01 05:48:14 -03002221 if (state->IF_LO == 4570000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002222 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);
2223 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002224 Fref = 365600000UL ;
2225 }
Steven Toth85d220d2008-05-01 05:48:14 -03002226 if (state->IF_LO == 4000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002227 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05);
2228 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002229 Fref = 360000000UL ;
2230 }
Steven Tothd211017b2008-05-01 19:35:54 -03002231 if (state->IF_LO == 57400000UL) {
2232 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2233 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002234 Fref = 344400000UL ;
2235 }
Steven Tothd211017b2008-05-01 19:35:54 -03002236 if (state->IF_LO == 44400000UL) {
2237 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2238 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002239 Fref = 355200000UL ;
2240 }
Steven Tothd211017b2008-05-01 19:35:54 -03002241 if (state->IF_LO == 44150000UL) {
2242 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2243 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002244 Fref = 353200000UL ;
2245 }
Steven Tothd211017b2008-05-01 19:35:54 -03002246 if (state->IF_LO == 37050000UL) {
2247 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2248 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002249 Fref = 370500000UL ;
2250 }
Steven Tothd211017b2008-05-01 19:35:54 -03002251 if (state->IF_LO == 36550000UL) {
2252 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2253 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002254 Fref = 365500000UL ;
2255 }
Steven Toth85d220d2008-05-01 05:48:14 -03002256 if (state->IF_LO == 36125000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002257 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2258 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002259 Fref = 361250000UL ;
2260 }
Steven Toth85d220d2008-05-01 05:48:14 -03002261 if (state->IF_LO == 6000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002262 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2263 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002264 Fref = 360000000UL ;
2265 }
Steven Tothd211017b2008-05-01 19:35:54 -03002266 if (state->IF_LO == 5400000UL) {
2267 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2268 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002269 Fref = 324000000UL ;
2270 }
Steven Toth85d220d2008-05-01 05:48:14 -03002271 if (state->IF_LO == 5380000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002272 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2273 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002274 Fref = 322800000UL ;
2275 }
Steven Toth85d220d2008-05-01 05:48:14 -03002276 if (state->IF_LO == 5200000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002277 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);
2278 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002279 Fref = 374400000UL ;
2280 }
Steven Tothd211017b2008-05-01 19:35:54 -03002281 if (state->IF_LO == 4900000UL) {
2282 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);
2283 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002284 Fref = 352800000UL ;
2285 }
Steven Tothd211017b2008-05-01 19:35:54 -03002286 if (state->IF_LO == 4400000UL) {
2287 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);
2288 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002289 Fref = 352000000UL ;
2290 }
Steven Tothd211017b2008-05-01 19:35:54 -03002291 if (state->IF_LO == 4063000UL) /* add for 2.6.8 */ {
2292 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05);
2293 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002294 Fref = 365670000UL ;
2295 }
2296 }
Steven Tothd211017b2008-05-01 19:35:54 -03002297 /* CHCAL_INT_MOD_IF */
2298 /* CHCAL_FRAC_MOD_IF */
2299 intModVal = Fref / (state->Fxtal * Kdbl/2);
2300 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002301
Steven Tothd211017b2008-05-01 19:35:54 -03002302 fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) *
2303 intModVal);
2304
2305 fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000);
2306 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002307
Steven Toth52c99bd2008-05-01 04:57:01 -03002308 return status ;
2309}
2310
Steven Tothc6c34b12008-05-03 14:14:54 -03002311static u32 MXL_GetXtalInt(u32 Xtal_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002312{
2313 if ((Xtal_Freq % 1000000) == 0)
Steven Tothd211017b2008-05-01 19:35:54 -03002314 return (Xtal_Freq / 10000);
Steven Toth52c99bd2008-05-01 04:57:01 -03002315 else
Steven Tothd211017b2008-05-01 19:35:54 -03002316 return (((Xtal_Freq / 1000000) + 1)*100);
Steven Toth52c99bd2008-05-01 04:57:01 -03002317}
2318
Steven Tothc6c34b12008-05-03 14:14:54 -03002319static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002320{
Steven Toth85d220d2008-05-01 05:48:14 -03002321 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03002322 u16 status = 0;
2323 u32 divider_val, E3, E4, E5, E5A;
2324 u32 Fmax, Fmin, FmaxBin, FminBin;
Steven Totha8214d42008-05-01 05:02:58 -03002325 u32 Kdbl_RF = 2;
Steven Toth3935c252008-05-01 05:45:44 -03002326 u32 tg_divval;
2327 u32 tg_lo;
2328 u32 Xtal_Int;
Steven Toth52c99bd2008-05-01 04:57:01 -03002329
Steven Totha8214d42008-05-01 05:02:58 -03002330 u32 Fref_TG;
2331 u32 Fvco;
Steven Toth52c99bd2008-05-01 04:57:01 -03002332
Steven Toth3935c252008-05-01 05:45:44 -03002333 Xtal_Int = MXL_GetXtalInt(state->Fxtal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002334
Steven Toth3935c252008-05-01 05:45:44 -03002335 state->RF_IN = RF_Freq;
Steven Toth52c99bd2008-05-01 04:57:01 -03002336
Steven Toth3935c252008-05-01 05:45:44 -03002337 MXL_SynthRFTGLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002338
Steven Toth3935c252008-05-01 05:45:44 -03002339 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2340 Kdbl_RF = 2;
2341 if (state->Fxtal > 22000000 && state->Fxtal <= 32000000)
2342 Kdbl_RF = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03002343
Steven Tothd211017b2008-05-01 19:35:54 -03002344 /* Downconverter Controls
2345 * Look-Up Table Implementation for:
2346 * DN_POLY
2347 * DN_RFGAIN
2348 * DN_CAP_RFLPF
2349 * DN_EN_VHFUHFBAR
2350 * DN_GAIN_ADJUST
2351 * Change the boundary reference from RF_IN to RF_LO
2352 */
2353 if (state->RF_LO < 40000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002354 return -1;
Steven Tothd211017b2008-05-01 19:35:54 -03002355
Steven Toth3935c252008-05-01 05:45:44 -03002356 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002357 status += MXL_ControlWrite(fe, DN_POLY, 2);
2358 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2359 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 423);
2360 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2361 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002362 }
Steven Toth3935c252008-05-01 05:45:44 -03002363 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002364 status += MXL_ControlWrite(fe, DN_POLY, 3);
2365 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2366 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 222);
2367 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2368 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002369 }
Steven Toth3935c252008-05-01 05:45:44 -03002370 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002371 status += MXL_ControlWrite(fe, DN_POLY, 3);
2372 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2373 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 147);
2374 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2375 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002376 }
Steven Toth3935c252008-05-01 05:45:44 -03002377 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002378 status += MXL_ControlWrite(fe, DN_POLY, 3);
2379 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2380 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 9);
2381 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2382 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002383 }
Steven Toth3935c252008-05-01 05:45:44 -03002384 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002385 status += MXL_ControlWrite(fe, DN_POLY, 3);
2386 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2387 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);
2388 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2389 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002390 }
Steven Toth3935c252008-05-01 05:45:44 -03002391 if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002392 status += MXL_ControlWrite(fe, DN_POLY, 3);
2393 status += MXL_ControlWrite(fe, DN_RFGAIN, 1);
2394 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);
2395 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0);
2396 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002397 }
Steven Toth3935c252008-05-01 05:45:44 -03002398 if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) {
Steven Tothd211017b2008-05-01 19:35:54 -03002399 status += MXL_ControlWrite(fe, DN_POLY, 3);
2400 status += MXL_ControlWrite(fe, DN_RFGAIN, 2);
2401 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);
2402 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0);
2403 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002404 }
Steven Tothd211017b2008-05-01 19:35:54 -03002405 if (state->RF_LO > 900000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002406 return -1;
Steven Tothd211017b2008-05-01 19:35:54 -03002407
2408 /* DN_IQTNBUF_AMP */
2409 /* DN_IQTNGNBFBIAS_BST */
Steven Toth3935c252008-05-01 05:45:44 -03002410 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
2411 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2412 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002413 }
Steven Toth3935c252008-05-01 05:45:44 -03002414 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
2415 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2416 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002417 }
Steven Toth3935c252008-05-01 05:45:44 -03002418 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
2419 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2420 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002421 }
Steven Toth3935c252008-05-01 05:45:44 -03002422 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
2423 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2424 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002425 }
Steven Toth3935c252008-05-01 05:45:44 -03002426 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
2427 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2428 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002429 }
Steven Toth3935c252008-05-01 05:45:44 -03002430 if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) {
2431 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2432 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002433 }
Steven Toth3935c252008-05-01 05:45:44 -03002434 if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) {
2435 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2436 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002437 }
Steven Toth3935c252008-05-01 05:45:44 -03002438 if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) {
2439 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2440 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002441 }
Steven Toth3935c252008-05-01 05:45:44 -03002442 if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) {
2443 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2444 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002445 }
Steven Toth3935c252008-05-01 05:45:44 -03002446 if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) {
2447 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2448 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002449 }
Steven Toth3935c252008-05-01 05:45:44 -03002450 if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) {
2451 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2452 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002453 }
Steven Toth3935c252008-05-01 05:45:44 -03002454 if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) {
2455 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2456 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002457 }
Steven Toth3935c252008-05-01 05:45:44 -03002458 if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) {
2459 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2460 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002461 }
Steven Toth3935c252008-05-01 05:45:44 -03002462 if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) {
2463 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2464 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002465 }
Steven Toth3935c252008-05-01 05:45:44 -03002466 if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) {
2467 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2468 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002469 }
Steven Toth3935c252008-05-01 05:45:44 -03002470 if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) {
2471 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2472 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002473 }
2474
Steven Tothd211017b2008-05-01 19:35:54 -03002475 /*
2476 * Set RF Synth and LO Path Control
2477 *
2478 * Look-Up table implementation for:
2479 * RFSYN_EN_OUTMUX
2480 * RFSYN_SEL_VCO_OUT
2481 * RFSYN_SEL_VCO_HI
2482 * RFSYN_SEL_DIVM
2483 * RFSYN_RF_DIV_BIAS
2484 * DN_SEL_FREQ
2485 *
2486 * Set divider_val, Fmax, Fmix to use in Equations
2487 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002488 FminBin = 28000000UL ;
2489 FmaxBin = 42500000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002490 if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) {
2491 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2492 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2493 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2494 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2495 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2496 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002497 divider_val = 64 ;
2498 Fmax = FmaxBin ;
2499 Fmin = FminBin ;
2500 }
2501 FminBin = 42500000UL ;
2502 FmaxBin = 56000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002503 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2504 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2505 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2506 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2507 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2508 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2509 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002510 divider_val = 64 ;
2511 Fmax = FmaxBin ;
2512 Fmin = FminBin ;
2513 }
2514 FminBin = 56000000UL ;
2515 FmaxBin = 85000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002516 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002517 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2518 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2519 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2520 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2521 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2522 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002523 divider_val = 32 ;
2524 Fmax = FmaxBin ;
2525 Fmin = FminBin ;
2526 }
2527 FminBin = 85000000UL ;
2528 FmaxBin = 112000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002529 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002530 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2531 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2532 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2533 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2534 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2535 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002536 divider_val = 32 ;
2537 Fmax = FmaxBin ;
2538 Fmin = FminBin ;
2539 }
2540 FminBin = 112000000UL ;
2541 FmaxBin = 170000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002542 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002543 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2544 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2545 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2546 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2547 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2548 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002549 divider_val = 16 ;
2550 Fmax = FmaxBin ;
2551 Fmin = FminBin ;
2552 }
2553 FminBin = 170000000UL ;
2554 FmaxBin = 225000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002555 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002556 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2557 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2558 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2559 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2560 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2561 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002562 divider_val = 16 ;
2563 Fmax = FmaxBin ;
2564 Fmin = FminBin ;
2565 }
2566 FminBin = 225000000UL ;
2567 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002568 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002569 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2570 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2571 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2572 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2573 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2574 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 4);
Steven Toth52c99bd2008-05-01 04:57:01 -03002575 divider_val = 8 ;
2576 Fmax = 340000000UL ;
2577 Fmin = FminBin ;
2578 }
2579 FminBin = 300000000UL ;
2580 FmaxBin = 340000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002581 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002582 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2583 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2584 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2585 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2586 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2587 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002588 divider_val = 8 ;
2589 Fmax = FmaxBin ;
2590 Fmin = 225000000UL ;
2591 }
2592 FminBin = 340000000UL ;
2593 FmaxBin = 450000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002594 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002595 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2596 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2597 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2598 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2599 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 2);
2600 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002601 divider_val = 8 ;
2602 Fmax = FmaxBin ;
2603 Fmin = FminBin ;
2604 }
2605 FminBin = 450000000UL ;
2606 FmaxBin = 680000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002607 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002608 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2609 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2610 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2611 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1);
2612 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2613 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002614 divider_val = 4 ;
2615 Fmax = FmaxBin ;
2616 Fmin = FminBin ;
2617 }
2618 FminBin = 680000000UL ;
2619 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002620 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002621 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2622 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2623 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2624 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1);
2625 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2626 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002627 divider_val = 4 ;
2628 Fmax = FmaxBin ;
2629 Fmin = FminBin ;
2630 }
2631
Steven Tothd211017b2008-05-01 19:35:54 -03002632 /* CHCAL_INT_MOD_RF
2633 * CHCAL_FRAC_MOD_RF
2634 * RFSYN_LPF_R
2635 * CHCAL_EN_INT_RF
2636 */
2637 /* Equation E3 RFSYN_VCO_BIAS */
Steven Toth3935c252008-05-01 05:45:44 -03002638 E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ;
Steven Tothd211017b2008-05-01 19:35:54 -03002639 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002640
Steven Tothd211017b2008-05-01 19:35:54 -03002641 /* Equation E4 CHCAL_INT_MOD_RF */
2642 E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000);
2643 MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4);
Steven Toth52c99bd2008-05-01 04:57:01 -03002644
Steven Tothd211017b2008-05-01 19:35:54 -03002645 /* Equation E5 CHCAL_FRAC_MOD_RF CHCAL_EN_INT_RF */
2646 E5 = ((2<<17)*(state->RF_LO/10000*divider_val -
2647 (E4*(2*state->Fxtal*Kdbl_RF)/10000))) /
2648 (2*state->Fxtal*Kdbl_RF/10000);
Steven Toth52c99bd2008-05-01 04:57:01 -03002649
Steven Tothd211017b2008-05-01 19:35:54 -03002650 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);
2651
2652 /* Equation E5A RFSYN_LPF_R */
Steven Toth3935c252008-05-01 05:45:44 -03002653 E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;
Steven Tothd211017b2008-05-01 19:35:54 -03002654 status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A);
Steven Toth52c99bd2008-05-01 04:57:01 -03002655
Steven Tothd211017b2008-05-01 19:35:54 -03002656 /* Euqation E5B CHCAL_EN_INIT_RF */
Steven Toth3935c252008-05-01 05:45:44 -03002657 status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));
Steven Tothd211017b2008-05-01 19:35:54 -03002658 /*if (E5 == 0)
2659 * status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);
2660 *else
2661 * status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);
2662 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002663
Steven Tothd211017b2008-05-01 19:35:54 -03002664 /*
2665 * Set TG Synth
2666 *
2667 * Look-Up table implementation for:
2668 * TG_LO_DIVVAL
2669 * TG_LO_SELVAL
2670 *
2671 * Set divider_val, Fmax, Fmix to use in Equations
2672 */
2673 if (state->TG_LO < 33000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002674 return -1;
Steven Tothd211017b2008-05-01 19:35:54 -03002675
Steven Toth52c99bd2008-05-01 04:57:01 -03002676 FminBin = 33000000UL ;
2677 FmaxBin = 50000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002678 if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002679 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x6);
2680 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002681 divider_val = 36 ;
2682 Fmax = FmaxBin ;
2683 Fmin = FminBin ;
2684 }
2685 FminBin = 50000000UL ;
2686 FmaxBin = 67000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002687 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002688 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x1);
2689 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002690 divider_val = 24 ;
2691 Fmax = FmaxBin ;
2692 Fmin = FminBin ;
2693 }
2694 FminBin = 67000000UL ;
2695 FmaxBin = 100000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002696 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002697 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0xC);
2698 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002699 divider_val = 18 ;
2700 Fmax = FmaxBin ;
2701 Fmin = FminBin ;
2702 }
2703 FminBin = 100000000UL ;
2704 FmaxBin = 150000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002705 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002706 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);
2707 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002708 divider_val = 12 ;
2709 Fmax = FmaxBin ;
2710 Fmin = FminBin ;
2711 }
2712 FminBin = 150000000UL ;
2713 FmaxBin = 200000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002714 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002715 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);
2716 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002717 divider_val = 8 ;
2718 Fmax = FmaxBin ;
2719 Fmin = FminBin ;
2720 }
2721 FminBin = 200000000UL ;
2722 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002723 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002724 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);
2725 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002726 divider_val = 6 ;
2727 Fmax = FmaxBin ;
2728 Fmin = FminBin ;
2729 }
2730 FminBin = 300000000UL ;
2731 FmaxBin = 400000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002732 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002733 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);
2734 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002735 divider_val = 4 ;
2736 Fmax = FmaxBin ;
2737 Fmin = FminBin ;
2738 }
2739 FminBin = 400000000UL ;
2740 FmaxBin = 600000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002741 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002742 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);
2743 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03002744 divider_val = 3 ;
2745 Fmax = FmaxBin ;
2746 Fmin = FminBin ;
2747 }
2748 FminBin = 600000000UL ;
2749 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002750 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd211017b2008-05-01 19:35:54 -03002751 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);
2752 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03002753 divider_val = 2 ;
2754 Fmax = FmaxBin ;
2755 Fmin = FminBin ;
2756 }
2757
Steven Tothd211017b2008-05-01 19:35:54 -03002758 /* TG_DIV_VAL */
2759 tg_divval = (state->TG_LO*divider_val/100000) *
2760 (MXL_Ceiling(state->Fxtal, 1000000) * 100) /
2761 (state->Fxtal/1000);
2762
2763 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval);
Steven Toth52c99bd2008-05-01 04:57:01 -03002764
Steven Toth3935c252008-05-01 05:45:44 -03002765 if (state->TG_LO > 600000000UL)
Steven Tothd211017b2008-05-01 19:35:54 -03002766 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002767
2768 Fmax = 1800000000UL ;
2769 Fmin = 1200000000UL ;
2770
Steven Tothd211017b2008-05-01 19:35:54 -03002771 /* prevent overflow of 32 bit unsigned integer, use
2772 * following equation. Edit for v2.6.4
2773 */
2774 /* Fref_TF = Fref_TG * 1000 */
2775 Fref_TG = (state->Fxtal/1000) / MXL_Ceiling(state->Fxtal, 1000000);
Steven Toth52c99bd2008-05-01 04:57:01 -03002776
Steven Tothd211017b2008-05-01 19:35:54 -03002777 /* Fvco = Fvco/10 */
2778 Fvco = (state->TG_LO/10000) * divider_val * Fref_TG;
Steven Toth52c99bd2008-05-01 04:57:01 -03002779
2780 tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8;
2781
Steven Tothd211017b2008-05-01 19:35:54 -03002782 /* below equation is same as above but much harder to debug.
2783 * tg_lo = ( ((Fmax/10000 * Xtal_Int)/100) -
2784 * ((state->TG_LO/10000)*divider_val *
2785 * (state->Fxtal/10000)/100) )*32/((Fmax-Fmin)/10000 *
2786 * Xtal_Int/100) + 8;
2787 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002788
Steven Tothd211017b2008-05-01 19:35:54 -03002789 status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo);
Steven Toth52c99bd2008-05-01 04:57:01 -03002790
Steven Tothd211017b2008-05-01 19:35:54 -03002791 /* add for 2.6.5 Special setting for QAM */
2792 if (state->Mod_Type == MXL_QAM) {
2793 if (state->RF_IN < 680000000)
2794 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2795 else
2796 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002797 }
2798
Steven Tothd211017b2008-05-01 19:35:54 -03002799 /* Off Chip Tracking Filter Control */
2800 if (state->TF_Type == MXL_TF_OFF) {
2801 /* Tracking Filter Off State; turn off all the banks */
2802 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2803 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2804 status += MXL_SetGPIO(fe, 3, 1); /* Bank1 Off */
2805 status += MXL_SetGPIO(fe, 1, 1); /* Bank2 Off */
2806 status += MXL_SetGPIO(fe, 4, 1); /* Bank3 Off */
Steven Toth52c99bd2008-05-01 04:57:01 -03002807 }
2808
Steven Tothd211017b2008-05-01 19:35:54 -03002809 if (state->TF_Type == MXL_TF_C) /* Tracking Filter type C */ {
2810 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2811 status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002812
Steven Tothd211017b2008-05-01 19:35:54 -03002813 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
2814 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2815 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2816 status += MXL_SetGPIO(fe, 3, 0);
2817 status += MXL_SetGPIO(fe, 1, 1);
2818 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002819 }
Steven Tothd211017b2008-05-01 19:35:54 -03002820 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
2821 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2822 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2823 status += MXL_SetGPIO(fe, 3, 1);
2824 status += MXL_SetGPIO(fe, 1, 0);
2825 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002826 }
Steven Tothd211017b2008-05-01 19:35:54 -03002827 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
2828 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2829 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2830 status += MXL_SetGPIO(fe, 3, 1);
2831 status += MXL_SetGPIO(fe, 1, 0);
2832 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002833 }
Steven Tothd211017b2008-05-01 19:35:54 -03002834 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
2835 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2836 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2837 status += MXL_SetGPIO(fe, 3, 1);
2838 status += MXL_SetGPIO(fe, 1, 1);
2839 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002840 }
Steven Tothd211017b2008-05-01 19:35:54 -03002841 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
2842 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2843 status += MXL_ControlWrite(fe, DAC_DIN_B, 29);
2844 status += MXL_SetGPIO(fe, 3, 1);
2845 status += MXL_SetGPIO(fe, 1, 1);
2846 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002847 }
Steven Tothd211017b2008-05-01 19:35:54 -03002848 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
2849 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2850 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2851 status += MXL_SetGPIO(fe, 3, 1);
2852 status += MXL_SetGPIO(fe, 1, 1);
2853 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002854 }
Steven Tothd211017b2008-05-01 19:35:54 -03002855 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
2856 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2857 status += MXL_ControlWrite(fe, DAC_DIN_B, 16);
2858 status += MXL_SetGPIO(fe, 3, 1);
2859 status += MXL_SetGPIO(fe, 1, 1);
2860 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002861 }
Steven Tothd211017b2008-05-01 19:35:54 -03002862 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
2863 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2864 status += MXL_ControlWrite(fe, DAC_DIN_B, 7);
2865 status += MXL_SetGPIO(fe, 3, 1);
2866 status += MXL_SetGPIO(fe, 1, 1);
2867 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002868 }
Steven Tothd211017b2008-05-01 19:35:54 -03002869 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
2870 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2871 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2872 status += MXL_SetGPIO(fe, 3, 1);
2873 status += MXL_SetGPIO(fe, 1, 1);
2874 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002875 }
2876 }
2877
Steven Tothd211017b2008-05-01 19:35:54 -03002878 if (state->TF_Type == MXL_TF_C_H) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002879
Steven Tothd211017b2008-05-01 19:35:54 -03002880 /* Tracking Filter type C-H for Hauppauge only */
2881 status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002882
Steven Tothd211017b2008-05-01 19:35:54 -03002883 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
2884 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2885 status += MXL_SetGPIO(fe, 4, 0);
2886 status += MXL_SetGPIO(fe, 3, 1);
2887 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002888 }
Steven Tothd211017b2008-05-01 19:35:54 -03002889 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
2890 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2891 status += MXL_SetGPIO(fe, 4, 1);
2892 status += MXL_SetGPIO(fe, 3, 0);
2893 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002894 }
Steven Tothd211017b2008-05-01 19:35:54 -03002895 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
2896 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2897 status += MXL_SetGPIO(fe, 4, 1);
2898 status += MXL_SetGPIO(fe, 3, 0);
2899 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002900 }
Steven Tothd211017b2008-05-01 19:35:54 -03002901 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
2902 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2903 status += MXL_SetGPIO(fe, 4, 1);
2904 status += MXL_SetGPIO(fe, 3, 1);
2905 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002906 }
Steven Tothd211017b2008-05-01 19:35:54 -03002907 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
2908 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2909 status += MXL_SetGPIO(fe, 4, 1);
2910 status += MXL_SetGPIO(fe, 3, 1);
2911 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002912 }
Steven Tothd211017b2008-05-01 19:35:54 -03002913 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
2914 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2915 status += MXL_SetGPIO(fe, 4, 1);
2916 status += MXL_SetGPIO(fe, 3, 1);
2917 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002918 }
Steven Tothd211017b2008-05-01 19:35:54 -03002919 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
2920 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2921 status += MXL_SetGPIO(fe, 4, 1);
2922 status += MXL_SetGPIO(fe, 3, 1);
2923 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002924 }
Steven Tothd211017b2008-05-01 19:35:54 -03002925 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
2926 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2927 status += MXL_SetGPIO(fe, 4, 1);
2928 status += MXL_SetGPIO(fe, 3, 1);
2929 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002930 }
Steven Tothd211017b2008-05-01 19:35:54 -03002931 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
2932 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2933 status += MXL_SetGPIO(fe, 4, 1);
2934 status += MXL_SetGPIO(fe, 3, 1);
2935 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002936 }
2937 }
2938
Steven Tothd211017b2008-05-01 19:35:54 -03002939 if (state->TF_Type == MXL_TF_D) { /* Tracking Filter type D */
Steven Toth52c99bd2008-05-01 04:57:01 -03002940
Steven Tothd211017b2008-05-01 19:35:54 -03002941 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002942
Steven Tothd211017b2008-05-01 19:35:54 -03002943 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
2944 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2945 status += MXL_SetGPIO(fe, 4, 0);
2946 status += MXL_SetGPIO(fe, 1, 1);
2947 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002948 }
Steven Tothd211017b2008-05-01 19:35:54 -03002949 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
2950 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2951 status += MXL_SetGPIO(fe, 4, 0);
2952 status += MXL_SetGPIO(fe, 1, 0);
2953 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002954 }
Steven Tothd211017b2008-05-01 19:35:54 -03002955 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
2956 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2957 status += MXL_SetGPIO(fe, 4, 1);
2958 status += MXL_SetGPIO(fe, 1, 0);
2959 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002960 }
Steven Tothd211017b2008-05-01 19:35:54 -03002961 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
2962 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2963 status += MXL_SetGPIO(fe, 4, 1);
2964 status += MXL_SetGPIO(fe, 1, 0);
2965 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002966 }
Steven Tothd211017b2008-05-01 19:35:54 -03002967 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
2968 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2969 status += MXL_SetGPIO(fe, 4, 1);
2970 status += MXL_SetGPIO(fe, 1, 1);
2971 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002972 }
Steven Tothd211017b2008-05-01 19:35:54 -03002973 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
2974 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2975 status += MXL_SetGPIO(fe, 4, 1);
2976 status += MXL_SetGPIO(fe, 1, 1);
2977 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002978 }
Steven Tothd211017b2008-05-01 19:35:54 -03002979 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
2980 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2981 status += MXL_SetGPIO(fe, 4, 1);
2982 status += MXL_SetGPIO(fe, 1, 1);
2983 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002984 }
2985 }
2986
Steven Tothd211017b2008-05-01 19:35:54 -03002987 if (state->TF_Type == MXL_TF_D_L) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002988
Steven Tothd211017b2008-05-01 19:35:54 -03002989 /* Tracking Filter type D-L for Lumanate ONLY change 2.6.3 */
2990 status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002991
Steven Tothd211017b2008-05-01 19:35:54 -03002992 /* if UHF and terrestrial => Turn off Tracking Filter */
2993 if (state->RF_IN >= 471000000 &&
2994 (state->RF_IN - 471000000)%6000000 != 0) {
2995 /* Turn off all the banks */
2996 status += MXL_SetGPIO(fe, 3, 1);
2997 status += MXL_SetGPIO(fe, 1, 1);
2998 status += MXL_SetGPIO(fe, 4, 1);
2999 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3000 status += MXL_ControlWrite(fe, AGC_IF, 10);
3001 } else {
3002 /* if VHF or cable => Turn on Tracking Filter */
3003 if (state->RF_IN >= 43000000 &&
3004 state->RF_IN < 140000000) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003005
Steven Tothd211017b2008-05-01 19:35:54 -03003006 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3007 status += MXL_SetGPIO(fe, 4, 1);
3008 status += MXL_SetGPIO(fe, 1, 1);
3009 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003010 }
Steven Tothd211017b2008-05-01 19:35:54 -03003011 if (state->RF_IN >= 140000000 &&
3012 state->RF_IN < 240000000) {
3013 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3014 status += MXL_SetGPIO(fe, 4, 1);
3015 status += MXL_SetGPIO(fe, 1, 0);
3016 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003017 }
Steven Tothd211017b2008-05-01 19:35:54 -03003018 if (state->RF_IN >= 240000000 &&
3019 state->RF_IN < 340000000) {
3020 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3021 status += MXL_SetGPIO(fe, 4, 0);
3022 status += MXL_SetGPIO(fe, 1, 1);
3023 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003024 }
Steven Tothd211017b2008-05-01 19:35:54 -03003025 if (state->RF_IN >= 340000000 &&
3026 state->RF_IN < 430000000) {
3027 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3028 status += MXL_SetGPIO(fe, 4, 0);
3029 status += MXL_SetGPIO(fe, 1, 0);
3030 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003031 }
Steven Tothd211017b2008-05-01 19:35:54 -03003032 if (state->RF_IN >= 430000000 &&
3033 state->RF_IN < 470000000) {
3034 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3035 status += MXL_SetGPIO(fe, 4, 1);
3036 status += MXL_SetGPIO(fe, 1, 0);
3037 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003038 }
Steven Tothd211017b2008-05-01 19:35:54 -03003039 if (state->RF_IN >= 470000000 &&
3040 state->RF_IN < 570000000) {
3041 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3042 status += MXL_SetGPIO(fe, 4, 0);
3043 status += MXL_SetGPIO(fe, 1, 0);
3044 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003045 }
Steven Tothd211017b2008-05-01 19:35:54 -03003046 if (state->RF_IN >= 570000000 &&
3047 state->RF_IN < 620000000) {
3048 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3049 status += MXL_SetGPIO(fe, 4, 0);
3050 status += MXL_SetGPIO(fe, 1, 1);
3051 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003052 }
Steven Tothd211017b2008-05-01 19:35:54 -03003053 if (state->RF_IN >= 620000000 &&
3054 state->RF_IN < 760000000) {
3055 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3056 status += MXL_SetGPIO(fe, 4, 0);
3057 status += MXL_SetGPIO(fe, 1, 1);
3058 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003059 }
Steven Tothd211017b2008-05-01 19:35:54 -03003060 if (state->RF_IN >= 760000000 &&
3061 state->RF_IN <= 900000000) {
3062 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3063 status += MXL_SetGPIO(fe, 4, 1);
3064 status += MXL_SetGPIO(fe, 1, 1);
3065 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003066 }
3067 }
3068 }
3069
Steven Tothd211017b2008-05-01 19:35:54 -03003070 if (state->TF_Type == MXL_TF_E) /* Tracking Filter type E */ {
Steven Toth52c99bd2008-05-01 04:57:01 -03003071
Steven Tothd211017b2008-05-01 19:35:54 -03003072 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003073
Steven Tothd211017b2008-05-01 19:35:54 -03003074 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
3075 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3076 status += MXL_SetGPIO(fe, 4, 0);
3077 status += MXL_SetGPIO(fe, 1, 1);
3078 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003079 }
Steven Tothd211017b2008-05-01 19:35:54 -03003080 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3081 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3082 status += MXL_SetGPIO(fe, 4, 0);
3083 status += MXL_SetGPIO(fe, 1, 0);
3084 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003085 }
Steven Tothd211017b2008-05-01 19:35:54 -03003086 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
3087 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3088 status += MXL_SetGPIO(fe, 4, 1);
3089 status += MXL_SetGPIO(fe, 1, 0);
3090 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003091 }
Steven Tothd211017b2008-05-01 19:35:54 -03003092 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
3093 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3094 status += MXL_SetGPIO(fe, 4, 1);
3095 status += MXL_SetGPIO(fe, 1, 0);
3096 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003097 }
Steven Tothd211017b2008-05-01 19:35:54 -03003098 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
3099 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3100 status += MXL_SetGPIO(fe, 4, 1);
3101 status += MXL_SetGPIO(fe, 1, 1);
3102 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003103 }
Steven Tothd211017b2008-05-01 19:35:54 -03003104 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
3105 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3106 status += MXL_SetGPIO(fe, 4, 1);
3107 status += MXL_SetGPIO(fe, 1, 1);
3108 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003109 }
Steven Tothd211017b2008-05-01 19:35:54 -03003110 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
3111 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3112 status += MXL_SetGPIO(fe, 4, 1);
3113 status += MXL_SetGPIO(fe, 1, 1);
3114 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003115 }
3116 }
3117
Steven Tothd211017b2008-05-01 19:35:54 -03003118 if (state->TF_Type == MXL_TF_F) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003119
Steven Tothd211017b2008-05-01 19:35:54 -03003120 /* Tracking Filter type F */
3121 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003122
Steven Tothd211017b2008-05-01 19:35:54 -03003123 if (state->RF_IN >= 43000000 && state->RF_IN < 160000000) {
3124 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3125 status += MXL_SetGPIO(fe, 4, 0);
3126 status += MXL_SetGPIO(fe, 1, 1);
3127 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003128 }
Steven Tothd211017b2008-05-01 19:35:54 -03003129 if (state->RF_IN >= 160000000 && state->RF_IN < 210000000) {
3130 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3131 status += MXL_SetGPIO(fe, 4, 0);
3132 status += MXL_SetGPIO(fe, 1, 0);
3133 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003134 }
Steven Tothd211017b2008-05-01 19:35:54 -03003135 if (state->RF_IN >= 210000000 && state->RF_IN < 300000000) {
3136 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3137 status += MXL_SetGPIO(fe, 4, 1);
3138 status += MXL_SetGPIO(fe, 1, 0);
3139 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003140 }
Steven Tothd211017b2008-05-01 19:35:54 -03003141 if (state->RF_IN >= 300000000 && state->RF_IN < 390000000) {
3142 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3143 status += MXL_SetGPIO(fe, 4, 1);
3144 status += MXL_SetGPIO(fe, 1, 0);
3145 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003146 }
Steven Tothd211017b2008-05-01 19:35:54 -03003147 if (state->RF_IN >= 390000000 && state->RF_IN < 515000000) {
3148 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3149 status += MXL_SetGPIO(fe, 4, 1);
3150 status += MXL_SetGPIO(fe, 1, 1);
3151 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003152 }
Steven Tothd211017b2008-05-01 19:35:54 -03003153 if (state->RF_IN >= 515000000 && state->RF_IN < 650000000) {
3154 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3155 status += MXL_SetGPIO(fe, 4, 1);
3156 status += MXL_SetGPIO(fe, 1, 1);
3157 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003158 }
Steven Tothd211017b2008-05-01 19:35:54 -03003159 if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000) {
3160 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3161 status += MXL_SetGPIO(fe, 4, 1);
3162 status += MXL_SetGPIO(fe, 1, 1);
3163 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003164 }
3165 }
3166
Steven Tothd211017b2008-05-01 19:35:54 -03003167 if (state->TF_Type == MXL_TF_E_2) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003168
Steven Tothd211017b2008-05-01 19:35:54 -03003169 /* Tracking Filter type E_2 */
3170 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003171
Steven Tothd211017b2008-05-01 19:35:54 -03003172 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
3173 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3174 status += MXL_SetGPIO(fe, 4, 0);
3175 status += MXL_SetGPIO(fe, 1, 1);
3176 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003177 }
Steven Tothd211017b2008-05-01 19:35:54 -03003178 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3179 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3180 status += MXL_SetGPIO(fe, 4, 0);
3181 status += MXL_SetGPIO(fe, 1, 0);
3182 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003183 }
Steven Tothd211017b2008-05-01 19:35:54 -03003184 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
3185 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3186 status += MXL_SetGPIO(fe, 4, 1);
3187 status += MXL_SetGPIO(fe, 1, 0);
3188 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003189 }
Steven Tothd211017b2008-05-01 19:35:54 -03003190 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3191 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3192 status += MXL_SetGPIO(fe, 4, 1);
3193 status += MXL_SetGPIO(fe, 1, 0);
3194 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003195 }
Steven Tothd211017b2008-05-01 19:35:54 -03003196 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
3197 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3198 status += MXL_SetGPIO(fe, 4, 1);
3199 status += MXL_SetGPIO(fe, 1, 1);
3200 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003201 }
Steven Tothd211017b2008-05-01 19:35:54 -03003202 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
3203 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3204 status += MXL_SetGPIO(fe, 4, 1);
3205 status += MXL_SetGPIO(fe, 1, 1);
3206 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003207 }
Steven Tothd211017b2008-05-01 19:35:54 -03003208 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
3209 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3210 status += MXL_SetGPIO(fe, 4, 1);
3211 status += MXL_SetGPIO(fe, 1, 1);
3212 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003213 }
3214 }
3215
Steven Tothd211017b2008-05-01 19:35:54 -03003216 if (state->TF_Type == MXL_TF_G) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003217
Steven Tothd211017b2008-05-01 19:35:54 -03003218 /* Tracking Filter type G add for v2.6.8 */
3219 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003220
Steven Tothd211017b2008-05-01 19:35:54 -03003221 if (state->RF_IN >= 50000000 && state->RF_IN < 190000000) {
3222
3223 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3224 status += MXL_SetGPIO(fe, 4, 0);
3225 status += MXL_SetGPIO(fe, 1, 1);
3226 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003227 }
Steven Tothd211017b2008-05-01 19:35:54 -03003228 if (state->RF_IN >= 190000000 && state->RF_IN < 280000000) {
3229 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3230 status += MXL_SetGPIO(fe, 4, 0);
3231 status += MXL_SetGPIO(fe, 1, 0);
3232 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003233 }
Steven Tothd211017b2008-05-01 19:35:54 -03003234 if (state->RF_IN >= 280000000 && state->RF_IN < 350000000) {
3235 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3236 status += MXL_SetGPIO(fe, 4, 1);
3237 status += MXL_SetGPIO(fe, 1, 0);
3238 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003239 }
Steven Tothd211017b2008-05-01 19:35:54 -03003240 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3241 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3242 status += MXL_SetGPIO(fe, 4, 1);
3243 status += MXL_SetGPIO(fe, 1, 0);
3244 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003245 }
Steven Tothd211017b2008-05-01 19:35:54 -03003246 if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) {
3247 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3248 status += MXL_SetGPIO(fe, 4, 1);
3249 status += MXL_SetGPIO(fe, 1, 0);
3250 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003251 }
Steven Tothd211017b2008-05-01 19:35:54 -03003252 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
3253 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3254 status += MXL_SetGPIO(fe, 4, 1);
3255 status += MXL_SetGPIO(fe, 1, 1);
3256 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003257 }
Steven Tothd211017b2008-05-01 19:35:54 -03003258 if (state->RF_IN >= 640000000 && state->RF_IN < 820000000) {
3259 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3260 status += MXL_SetGPIO(fe, 4, 1);
3261 status += MXL_SetGPIO(fe, 1, 1);
3262 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003263 }
Steven Tothd211017b2008-05-01 19:35:54 -03003264 if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000) {
3265 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3266 status += MXL_SetGPIO(fe, 4, 1);
3267 status += MXL_SetGPIO(fe, 1, 1);
3268 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003269 }
3270 }
3271
Steven Tothd211017b2008-05-01 19:35:54 -03003272 if (state->TF_Type == MXL_TF_E_NA) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003273
Steven Tothd211017b2008-05-01 19:35:54 -03003274 /* Tracking Filter type E-NA for Empia ONLY change for 2.6.8 */
3275 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003276
Steven Tothd211017b2008-05-01 19:35:54 -03003277 /* if UHF and terrestrial=> Turn off Tracking Filter */
3278 if (state->RF_IN >= 471000000 &&
3279 (state->RF_IN - 471000000)%6000000 != 0) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003280
Steven Tothd211017b2008-05-01 19:35:54 -03003281 /* Turn off all the banks */
3282 status += MXL_SetGPIO(fe, 3, 1);
3283 status += MXL_SetGPIO(fe, 1, 1);
3284 status += MXL_SetGPIO(fe, 4, 1);
3285 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3286
3287 /* 2.6.12 Turn on RSSI */
3288 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
3289 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
3290 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
3291 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
3292
3293 /* RSSI reference point */
3294 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
3295 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
3296 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
3297
3298 /* following parameter is from analog OTA mode,
3299 * can be change to seek better performance */
3300 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
3301 } else {
3302 /* if VHF or Cable => Turn on Tracking Filter */
3303
3304 /* 2.6.12 Turn off RSSI */
3305 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
3306
3307 /* change back from above condition */
3308 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);
Steven Toth52c99bd2008-05-01 04:57:01 -03003309
3310
Steven Tothd211017b2008-05-01 19:35:54 -03003311 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003312
Steven Tothd211017b2008-05-01 19:35:54 -03003313 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3314 status += MXL_SetGPIO(fe, 4, 0);
3315 status += MXL_SetGPIO(fe, 1, 1);
3316 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003317 }
Steven Tothd211017b2008-05-01 19:35:54 -03003318 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3319 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3320 status += MXL_SetGPIO(fe, 4, 0);
3321 status += MXL_SetGPIO(fe, 1, 0);
3322 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003323 }
Steven Tothd211017b2008-05-01 19:35:54 -03003324 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
3325 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3326 status += MXL_SetGPIO(fe, 4, 1);
3327 status += MXL_SetGPIO(fe, 1, 0);
3328 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003329 }
Steven Tothd211017b2008-05-01 19:35:54 -03003330 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3331 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3332 status += MXL_SetGPIO(fe, 4, 1);
3333 status += MXL_SetGPIO(fe, 1, 0);
3334 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003335 }
Steven Tothd211017b2008-05-01 19:35:54 -03003336 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
3337 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3338 status += MXL_SetGPIO(fe, 4, 1);
3339 status += MXL_SetGPIO(fe, 1, 1);
3340 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003341 }
Steven Tothd211017b2008-05-01 19:35:54 -03003342 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
3343 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3344 status += MXL_SetGPIO(fe, 4, 1);
3345 status += MXL_SetGPIO(fe, 1, 1);
3346 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003347 }
Steven Tothd211017b2008-05-01 19:35:54 -03003348 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
3349 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3350 status += MXL_SetGPIO(fe, 4, 1);
3351 status += MXL_SetGPIO(fe, 1, 1);
3352 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003353 }
3354 }
3355 }
3356 return status ;
3357}
3358
Steven Tothc6c34b12008-05-03 14:14:54 -03003359static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val)
Steven Toth52c99bd2008-05-01 04:57:01 -03003360{
Steven Toth3935c252008-05-01 05:45:44 -03003361 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003362
3363 if (GPIO_Num == 1)
Steven Toth3935c252008-05-01 05:45:44 -03003364 status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1);
3365
3366 /* GPIO2 is not available */
3367
3368 if (GPIO_Num == 3) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003369 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003370 status += MXL_ControlWrite(fe, GPIO_3, 0);
3371 status += MXL_ControlWrite(fe, GPIO_3B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003372 }
3373 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003374 status += MXL_ControlWrite(fe, GPIO_3, 1);
3375 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003376 }
Steven Toth3935c252008-05-01 05:45:44 -03003377 if (GPIO_Val == 3) { /* tri-state */
3378 status += MXL_ControlWrite(fe, GPIO_3, 0);
3379 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003380 }
3381 }
Steven Toth3935c252008-05-01 05:45:44 -03003382 if (GPIO_Num == 4) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003383 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003384 status += MXL_ControlWrite(fe, GPIO_4, 0);
3385 status += MXL_ControlWrite(fe, GPIO_4B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003386 }
3387 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003388 status += MXL_ControlWrite(fe, GPIO_4, 1);
3389 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003390 }
Steven Toth3935c252008-05-01 05:45:44 -03003391 if (GPIO_Val == 3) { /* tri-state */
3392 status += MXL_ControlWrite(fe, GPIO_4, 0);
3393 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003394 }
3395 }
3396
Steven Toth3935c252008-05-01 05:45:44 -03003397 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003398}
3399
Steven Tothc6c34b12008-05-03 14:14:54 -03003400static u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003401{
Steven Toth3935c252008-05-01 05:45:44 -03003402 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003403
Steven Toth3935c252008-05-01 05:45:44 -03003404 /* Will write ALL Matching Control Name */
Steven Tothd211017b2008-05-01 19:35:54 -03003405 /* Write Matching INIT Control */
3406 status += MXL_ControlWrite_Group(fe, ControlNum, value, 1);
3407 /* Write Matching CH Control */
3408 status += MXL_ControlWrite_Group(fe, ControlNum, value, 2);
Steven Toth3935c252008-05-01 05:45:44 -03003409#ifdef _MXL_INTERNAL
Steven Tothd211017b2008-05-01 19:35:54 -03003410 /* Write Matching MXL Control */
3411 status += MXL_ControlWrite_Group(fe, ControlNum, value, 3);
Steven Toth3935c252008-05-01 05:45:44 -03003412#endif
3413 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003414}
3415
Steven Tothc6c34b12008-05-03 14:14:54 -03003416static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum,
3417 u32 value, u16 controlGroup)
Steven Toth52c99bd2008-05-01 04:57:01 -03003418{
Steven Toth85d220d2008-05-01 05:48:14 -03003419 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03003420 u16 i, j, k;
3421 u32 highLimit;
3422 u32 ctrlVal;
Steven Toth52c99bd2008-05-01 04:57:01 -03003423
Steven Toth3935c252008-05-01 05:45:44 -03003424 if (controlGroup == 1) /* Initial Control */ {
3425
3426 for (i = 0; i < state->Init_Ctrl_Num; i++) {
3427
3428 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3429
3430 highLimit = 1 << state->Init_Ctrl[i].size;
3431 if (value < highLimit) {
3432 for (j = 0; j < state->Init_Ctrl[i].size; j++) {
3433 state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3434 MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]),
3435 (u8)(state->Init_Ctrl[i].bit[j]),
Steven Tothd211017b2008-05-01 19:35:54 -03003436 (u8)((value>>j) & 0x01));
Steven Toth52c99bd2008-05-01 04:57:01 -03003437 }
Steven Toth3935c252008-05-01 05:45:44 -03003438 ctrlVal = 0;
3439 for (k = 0; k < state->Init_Ctrl[i].size; k++)
3440 ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
Steven Tothd211017b2008-05-01 19:35:54 -03003441 } else
Steven Toth3935c252008-05-01 05:45:44 -03003442 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003443 }
3444 }
3445 }
Steven Toth3935c252008-05-01 05:45:44 -03003446 if (controlGroup == 2) /* Chan change Control */ {
3447
3448 for (i = 0; i < state->CH_Ctrl_Num; i++) {
3449
Steven Tothd211017b2008-05-01 19:35:54 -03003450 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003451
3452 highLimit = 1 << state->CH_Ctrl[i].size;
3453 if (value < highLimit) {
3454 for (j = 0; j < state->CH_Ctrl[i].size; j++) {
3455 state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3456 MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]),
3457 (u8)(state->CH_Ctrl[i].bit[j]),
Steven Tothd211017b2008-05-01 19:35:54 -03003458 (u8)((value>>j) & 0x01));
Steven Toth52c99bd2008-05-01 04:57:01 -03003459 }
Steven Toth3935c252008-05-01 05:45:44 -03003460 ctrlVal = 0;
3461 for (k = 0; k < state->CH_Ctrl[i].size; k++)
3462 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
Steven Tothd211017b2008-05-01 19:35:54 -03003463 } else
Steven Toth3935c252008-05-01 05:45:44 -03003464 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003465 }
3466 }
3467 }
3468#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003469 if (controlGroup == 3) /* Maxlinear Control */ {
3470
3471 for (i = 0; i < state->MXL_Ctrl_Num; i++) {
3472
Steven Tothd211017b2008-05-01 19:35:54 -03003473 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003474
Steven Tothd211017b2008-05-01 19:35:54 -03003475 highLimit = (1 << state->MXL_Ctrl[i].size);
Steven Toth3935c252008-05-01 05:45:44 -03003476 if (value < highLimit) {
3477 for (j = 0; j < state->MXL_Ctrl[i].size; j++) {
3478 state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3479 MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]),
3480 (u8)(state->MXL_Ctrl[i].bit[j]),
Steven Tothd211017b2008-05-01 19:35:54 -03003481 (u8)((value>>j) & 0x01));
Steven Toth52c99bd2008-05-01 04:57:01 -03003482 }
Steven Toth3935c252008-05-01 05:45:44 -03003483 ctrlVal = 0;
Steven Tothd211017b2008-05-01 19:35:54 -03003484 for (k = 0; k < state->MXL_Ctrl[i].size; k++)
Steven Toth3935c252008-05-01 05:45:44 -03003485 ctrlVal += state->MXL_Ctrl[i].val[k] * (1 << k);
Steven Tothd211017b2008-05-01 19:35:54 -03003486 } else
Steven Toth3935c252008-05-01 05:45:44 -03003487 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003488 }
3489 }
3490 }
3491#endif
Steven Toth3935c252008-05-01 05:45:44 -03003492 return 0 ; /* successful return */
Steven Toth52c99bd2008-05-01 04:57:01 -03003493}
3494
Steven Tothc6c34b12008-05-03 14:14:54 -03003495static u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003496{
Steven Toth85d220d2008-05-01 05:48:14 -03003497 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003498 int i ;
3499
Steven Toth3935c252008-05-01 05:45:44 -03003500 for (i = 0; i < 104; i++) {
3501 if (RegNum == state->TunerRegs[i].Reg_Num) {
3502 state->TunerRegs[i].Reg_Val = RegVal;
3503 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003504 }
3505 }
3506
Steven Toth3935c252008-05-01 05:45:44 -03003507 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003508}
3509
Steven Tothc6c34b12008-05-03 14:14:54 -03003510static u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003511{
Steven Toth85d220d2008-05-01 05:48:14 -03003512 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003513 int i ;
3514
Steven Toth3935c252008-05-01 05:45:44 -03003515 for (i = 0; i < 104; i++) {
Steven Tothd211017b2008-05-01 19:35:54 -03003516 if (RegNum == state->TunerRegs[i].Reg_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003517 *RegVal = (u8)(state->TunerRegs[i].Reg_Val);
3518 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003519 }
3520 }
3521
Steven Toth3935c252008-05-01 05:45:44 -03003522 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003523}
3524
Steven Tothc6c34b12008-05-03 14:14:54 -03003525static u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003526{
Steven Toth85d220d2008-05-01 05:48:14 -03003527 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003528 u32 ctrlVal ;
3529 u16 i, k ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003530
Steven Toth3935c252008-05-01 05:45:44 -03003531 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
3532
3533 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3534
3535 ctrlVal = 0;
3536 for (k = 0; k < state->Init_Ctrl[i].size; k++)
Steven Tothd211017b2008-05-01 19:35:54 -03003537 ctrlVal += state->Init_Ctrl[i].val[k] * (1<<k);
Steven Toth3935c252008-05-01 05:45:44 -03003538 *value = ctrlVal;
3539 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003540 }
3541 }
Steven Toth3935c252008-05-01 05:45:44 -03003542
3543 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
3544
3545 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
3546
3547 ctrlVal = 0;
3548 for (k = 0; k < state->CH_Ctrl[i].size; k++)
3549 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
3550 *value = ctrlVal;
3551 return 0;
3552
Steven Toth52c99bd2008-05-01 04:57:01 -03003553 }
3554 }
3555
3556#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003557 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
3558
3559 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
3560
3561 ctrlVal = 0;
3562 for (k = 0; k < state->MXL_Ctrl[i].size; k++)
3563 ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k);
3564 *value = ctrlVal;
3565 return 0;
3566
Steven Toth52c99bd2008-05-01 04:57:01 -03003567 }
3568 }
3569#endif
Steven Toth3935c252008-05-01 05:45:44 -03003570 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003571}
3572
Steven Tothc6c34b12008-05-03 14:14:54 -03003573static u16 MXL_ControlRegRead(struct dvb_frontend *fe, u16 controlNum,
3574 u8 *RegNum, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003575{
Steven Toth85d220d2008-05-01 05:48:14 -03003576 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003577 u16 i, j, k ;
3578 u16 Count ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003579
Steven Toth3935c252008-05-01 05:45:44 -03003580 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003581
Steven Tothd211017b2008-05-01 19:35:54 -03003582 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003583
3584 Count = 1;
3585 RegNum[0] = (u8)(state->Init_Ctrl[i].addr[0]);
3586
3587 for (k = 1; k < state->Init_Ctrl[i].size; k++) {
3588
3589 for (j = 0; j < Count; j++) {
3590
Steven Tothd211017b2008-05-01 19:35:54 -03003591 if (state->Init_Ctrl[i].addr[k] !=
3592 RegNum[j]) {
Steven Toth3935c252008-05-01 05:45:44 -03003593
Steven Tothd211017b2008-05-01 19:35:54 -03003594 Count++;
Steven Toth3935c252008-05-01 05:45:44 -03003595 RegNum[Count-1] = (u8)(state->Init_Ctrl[i].addr[k]);
3596
Steven Toth52c99bd2008-05-01 04:57:01 -03003597 }
3598 }
3599
3600 }
Steven Toth3935c252008-05-01 05:45:44 -03003601 *count = Count;
3602 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003603 }
3604 }
Steven Toth3935c252008-05-01 05:45:44 -03003605 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003606
Steven Tothd211017b2008-05-01 19:35:54 -03003607 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003608
3609 Count = 1;
3610 RegNum[0] = (u8)(state->CH_Ctrl[i].addr[0]);
3611
3612 for (k = 1; k < state->CH_Ctrl[i].size; k++) {
3613
Steven Tothd211017b2008-05-01 19:35:54 -03003614 for (j = 0; j < Count; j++) {
Steven Toth3935c252008-05-01 05:45:44 -03003615
Steven Tothd211017b2008-05-01 19:35:54 -03003616 if (state->CH_Ctrl[i].addr[k] !=
3617 RegNum[j]) {
Steven Toth3935c252008-05-01 05:45:44 -03003618
Steven Tothd211017b2008-05-01 19:35:54 -03003619 Count++;
Steven Toth3935c252008-05-01 05:45:44 -03003620 RegNum[Count-1] = (u8)(state->CH_Ctrl[i].addr[k]);
3621
Steven Toth52c99bd2008-05-01 04:57:01 -03003622 }
3623 }
3624 }
Steven Toth3935c252008-05-01 05:45:44 -03003625 *count = Count;
3626 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003627 }
3628 }
3629#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003630 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003631
Steven Tothd211017b2008-05-01 19:35:54 -03003632 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003633
3634 Count = 1;
3635 RegNum[0] = (u8)(state->MXL_Ctrl[i].addr[0]);
3636
3637 for (k = 1; k < state->MXL_Ctrl[i].size; k++) {
3638
Steven Tothd211017b2008-05-01 19:35:54 -03003639 for (j = 0; j < Count; j++) {
Steven Toth3935c252008-05-01 05:45:44 -03003640
Steven Tothd211017b2008-05-01 19:35:54 -03003641 if (state->MXL_Ctrl[i].addr[k] !=
3642 RegNum[j]) {
Steven Toth3935c252008-05-01 05:45:44 -03003643
Steven Tothd211017b2008-05-01 19:35:54 -03003644 Count++;
Steven Toth3935c252008-05-01 05:45:44 -03003645 RegNum[Count-1] = (u8)state->MXL_Ctrl[i].addr[k];
3646
Steven Toth52c99bd2008-05-01 04:57:01 -03003647 }
3648 }
3649 }
Steven Toth3935c252008-05-01 05:45:44 -03003650 *count = Count;
3651 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003652 }
3653 }
3654#endif
Steven Toth3935c252008-05-01 05:45:44 -03003655 *count = 0;
3656 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003657}
3658
Steven Tothc6c34b12008-05-03 14:14:54 -03003659static void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit,
3660 u8 bitVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003661{
Steven Toth85d220d2008-05-01 05:48:14 -03003662 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003663 int i ;
3664
Steven Totha8214d42008-05-01 05:02:58 -03003665 const u8 AND_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03003666 0xFE, 0xFD, 0xFB, 0xF7,
3667 0xEF, 0xDF, 0xBF, 0x7F } ;
3668
Steven Totha8214d42008-05-01 05:02:58 -03003669 const u8 OR_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03003670 0x01, 0x02, 0x04, 0x08,
3671 0x10, 0x20, 0x40, 0x80 } ;
3672
Steven Toth3935c252008-05-01 05:45:44 -03003673 for (i = 0; i < state->TunerRegs_Num; i++) {
3674 if (state->TunerRegs[i].Reg_Num == address) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003675 if (bitVal)
Steven Toth3935c252008-05-01 05:45:44 -03003676 state->TunerRegs[i].Reg_Val |= OR_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03003677 else
Steven Toth3935c252008-05-01 05:45:44 -03003678 state->TunerRegs[i].Reg_Val &= AND_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03003679 break ;
3680 }
3681 }
Steven Toth3935c252008-05-01 05:45:44 -03003682}
Steven Toth52c99bd2008-05-01 04:57:01 -03003683
Steven Tothc6c34b12008-05-03 14:14:54 -03003684static u32 MXL_Ceiling(u32 value, u32 resolution)
Steven Toth52c99bd2008-05-01 04:57:01 -03003685{
Steven Toth3935c252008-05-01 05:45:44 -03003686 return (value/resolution + (value % resolution > 0 ? 1 : 0));
3687}
Steven Toth52c99bd2008-05-01 04:57:01 -03003688
Steven Tothd211017b2008-05-01 19:35:54 -03003689/* Retrieve the Initialzation Registers */
Steven Tothc6c34b12008-05-03 14:14:54 -03003690static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
Steven Tothd211017b2008-05-01 19:35:54 -03003691 u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003692{
Steven Totha8214d42008-05-01 05:02:58 -03003693 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003694 int i ;
3695
Steven Toth3935c252008-05-01 05:45:44 -03003696 u8 RegAddr[] = {
3697 11, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73,
3698 76, 77, 91, 134, 135, 137, 147,
3699 156, 166, 167, 168, 25 };
Steven Toth52c99bd2008-05-01 04:57:01 -03003700
Steven Toth3935c252008-05-01 05:45:44 -03003701 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03003702
Steven Toth3935c252008-05-01 05:45:44 -03003703 status += MXL_BlockInit(fe);
3704
3705 for (i = 0 ; i < *count; i++) {
3706 RegNum[i] = RegAddr[i];
3707 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003708 }
3709
Steven Toth3935c252008-05-01 05:45:44 -03003710 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003711}
3712
Steven Tothc6c34b12008-05-03 14:14:54 -03003713static u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal,
Steven Tothd211017b2008-05-01 19:35:54 -03003714 int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003715{
Steven Totha8214d42008-05-01 05:02:58 -03003716 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003717 int i ;
3718
Steven Tothd211017b2008-05-01 19:35:54 -03003719/* add 77, 166, 167, 168 register for 2.6.12 */
Steven Toth52c99bd2008-05-01 04:57:01 -03003720#ifdef _MXL_PRODUCTION
Steven Totha8214d42008-05-01 05:02:58 -03003721 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106,
3722 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003723#else
Steven Totha8214d42008-05-01 05:02:58 -03003724 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106,
3725 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
Steven Tothd211017b2008-05-01 19:35:54 -03003726 /*
3727 u8 RegAddr[171];
3728 for (i = 0; i <= 170; i++)
3729 RegAddr[i] = i;
3730 */
Steven Toth52c99bd2008-05-01 04:57:01 -03003731#endif
3732
Steven Toth3935c252008-05-01 05:45:44 -03003733 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03003734
Steven Toth3935c252008-05-01 05:45:44 -03003735 for (i = 0 ; i < *count; i++) {
3736 RegNum[i] = RegAddr[i];
3737 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003738 }
3739
Steven Toth3935c252008-05-01 05:45:44 -03003740 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003741}
3742
Steven Tothc6c34b12008-05-03 14:14:54 -03003743static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,
3744 u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003745{
Steven Toth3935c252008-05-01 05:45:44 -03003746 u16 status = 0;
3747 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03003748
Steven Toth3935c252008-05-01 05:45:44 -03003749 u8 RegAddr[] = {43, 136};
Steven Toth52c99bd2008-05-01 04:57:01 -03003750
Steven Toth3935c252008-05-01 05:45:44 -03003751 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03003752
Steven Toth3935c252008-05-01 05:45:44 -03003753 for (i = 0; i < *count; i++) {
3754 RegNum[i] = RegAddr[i];
3755 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003756 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003757
Steven Toth3935c252008-05-01 05:45:44 -03003758 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003759}
3760
Steven Tothc6c34b12008-05-03 14:14:54 -03003761static u16 MXL_GetCHRegister_LowIF(struct dvb_frontend *fe, u8 *RegNum,
3762 u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003763{
Steven Toth3935c252008-05-01 05:45:44 -03003764 u16 status = 0;
3765 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03003766
Steven Toth3935c252008-05-01 05:45:44 -03003767 u8 RegAddr[] = { 138 };
Steven Toth52c99bd2008-05-01 04:57:01 -03003768
Steven Toth3935c252008-05-01 05:45:44 -03003769 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03003770
Steven Toth3935c252008-05-01 05:45:44 -03003771 for (i = 0; i < *count; i++) {
3772 RegNum[i] = RegAddr[i];
3773 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003774 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003775
Steven Toth3935c252008-05-01 05:45:44 -03003776 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003777}
3778
Steven Tothc6c34b12008-05-03 14:14:54 -03003779static u16 MXL_GetMasterControl(u8 *MasterReg, int state)
Steven Toth52c99bd2008-05-01 04:57:01 -03003780{
Steven Toth3935c252008-05-01 05:45:44 -03003781 if (state == 1) /* Load_Start */
3782 *MasterReg = 0xF3;
3783 if (state == 2) /* Power_Down */
3784 *MasterReg = 0x41;
3785 if (state == 3) /* Synth_Reset */
3786 *MasterReg = 0xB1;
3787 if (state == 4) /* Seq_Off */
3788 *MasterReg = 0xF1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003789
Steven Toth3935c252008-05-01 05:45:44 -03003790 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003791}
3792
3793#ifdef _MXL_PRODUCTION
Steven Tothc6c34b12008-05-03 14:14:54 -03003794static u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)
Steven Toth52c99bd2008-05-01 04:57:01 -03003795{
Steven Toth85d220d2008-05-01 05:48:14 -03003796 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003797 u16 status = 0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003798
Steven Totha8214d42008-05-01 05:02:58 -03003799 if (VCO_Range == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003800 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3801 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3802 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3803 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3804 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3805 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3806 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Tothd211017b2008-05-01 19:35:54 -03003807 if (state->Mode == 0 && state->IF_Mode == 1) {
3808 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003809 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3810 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3811 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
Steven Tothd211017b2008-05-01 19:35:54 -03003812 status += MXL_ControlWrite(fe,
3813 CHCAL_FRAC_MOD_RF, 180224);
Steven Totha8214d42008-05-01 05:02:58 -03003814 }
Steven Tothd211017b2008-05-01 19:35:54 -03003815 if (state->Mode == 0 && state->IF_Mode == 0) {
3816 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003817 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3818 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3819 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
Steven Tothd211017b2008-05-01 19:35:54 -03003820 status += MXL_ControlWrite(fe,
3821 CHCAL_FRAC_MOD_RF, 222822);
Steven Totha8214d42008-05-01 05:02:58 -03003822 }
Steven Toth3935c252008-05-01 05:45:44 -03003823 if (state->Mode == 1) /* Digital Mode */ {
3824 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3825 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3826 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
Steven Tothd211017b2008-05-01 19:35:54 -03003827 status += MXL_ControlWrite(fe,
3828 CHCAL_FRAC_MOD_RF, 229376);
Steven Totha8214d42008-05-01 05:02:58 -03003829 }
3830 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003831
Steven Totha8214d42008-05-01 05:02:58 -03003832 if (VCO_Range == 2) {
Steven Toth3935c252008-05-01 05:45:44 -03003833 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3834 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3835 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3836 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3837 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3838 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3839 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
3840 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3841 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3842 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
Steven Tothd211017b2008-05-01 19:35:54 -03003843 if (state->Mode == 0 && state->IF_Mode == 1) {
3844 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003845 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3846 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3847 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd211017b2008-05-01 19:35:54 -03003848 status += MXL_ControlWrite(fe,
3849 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003850 }
Steven Tothd211017b2008-05-01 19:35:54 -03003851 if (state->Mode == 0 && state->IF_Mode == 0) {
3852 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003853 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3854 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3855 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd211017b2008-05-01 19:35:54 -03003856 status += MXL_ControlWrite(fe,
3857 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003858 }
Steven Toth3935c252008-05-01 05:45:44 -03003859 if (state->Mode == 1) /* Digital Mode */ {
3860 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3861 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3862 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
Steven Tothd211017b2008-05-01 19:35:54 -03003863 status += MXL_ControlWrite(fe,
3864 CHCAL_FRAC_MOD_RF, 16384);
Steven Totha8214d42008-05-01 05:02:58 -03003865 }
3866 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003867
Steven Totha8214d42008-05-01 05:02:58 -03003868 if (VCO_Range == 3) {
Steven Toth3935c252008-05-01 05:45:44 -03003869 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3870 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3871 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3872 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3873 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3874 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3875 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
3876 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3877 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3878 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd211017b2008-05-01 19:35:54 -03003879 if (state->Mode == 0 && state->IF_Mode == 1) {
3880 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003881 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3882 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3883 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
Steven Tothd211017b2008-05-01 19:35:54 -03003884 status += MXL_ControlWrite(fe,
3885 CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03003886 }
Steven Tothd211017b2008-05-01 19:35:54 -03003887 if (state->Mode == 0 && state->IF_Mode == 0) {
3888 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003889 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3890 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3891 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
Steven Tothd211017b2008-05-01 19:35:54 -03003892 status += MXL_ControlWrite(fe,
3893 CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03003894 }
Steven Toth3935c252008-05-01 05:45:44 -03003895 if (state->Mode == 1) /* Digital Mode */ {
3896 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3897 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3898 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd211017b2008-05-01 19:35:54 -03003899 status += MXL_ControlWrite(fe,
3900 CHCAL_FRAC_MOD_RF, 245760);
Steven Totha8214d42008-05-01 05:02:58 -03003901 }
3902 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003903
Steven Totha8214d42008-05-01 05:02:58 -03003904 if (VCO_Range == 4) {
Steven Toth3935c252008-05-01 05:45:44 -03003905 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3906 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3907 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3908 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3909 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3910 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3911 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
3912 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3913 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3914 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd211017b2008-05-01 19:35:54 -03003915 if (state->Mode == 0 && state->IF_Mode == 1) {
3916 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003917 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3918 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3919 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd211017b2008-05-01 19:35:54 -03003920 status += MXL_ControlWrite(fe,
3921 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003922 }
Steven Tothd211017b2008-05-01 19:35:54 -03003923 if (state->Mode == 0 && state->IF_Mode == 0) {
3924 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003925 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3926 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3927 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd211017b2008-05-01 19:35:54 -03003928 status += MXL_ControlWrite(fe,
3929 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003930 }
Steven Toth3935c252008-05-01 05:45:44 -03003931 if (state->Mode == 1) /* Digital Mode */ {
3932 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3933 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3934 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd211017b2008-05-01 19:35:54 -03003935 status += MXL_ControlWrite(fe,
3936 CHCAL_FRAC_MOD_RF, 212992);
Steven Totha8214d42008-05-01 05:02:58 -03003937 }
3938 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003939
Steven Totha8214d42008-05-01 05:02:58 -03003940 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003941}
3942
Steven Tothc6c34b12008-05-03 14:14:54 -03003943static u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)
Steven Toth52c99bd2008-05-01 04:57:01 -03003944{
Steven Toth85d220d2008-05-01 05:48:14 -03003945 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003946 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003947
3948 if (Hystersis == 1)
Steven Toth3935c252008-05-01 05:45:44 -03003949 status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003950
Steven Totha8214d42008-05-01 05:02:58 -03003951 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003952}
3953#endif
Steven Toth48937292008-05-01 07:15:38 -03003954/* End: Reference driver code found in the Realtek driver that
3955 * is copyright MaxLinear */
Steven Toth52c99bd2008-05-01 04:57:01 -03003956
Steven Toth48937292008-05-01 07:15:38 -03003957/* ----------------------------------------------------------------
3958 * Begin: Everything after here is new code to adapt the
3959 * proprietary Realtek driver into a Linux API tuner.
3960 * Copyright (C) 2008 Steven Toth <stoth@hauppauge.com>
3961 */
3962static int mxl5005s_reset(struct dvb_frontend *fe)
3963{
3964 struct mxl5005s_state *state = fe->tuner_priv;
3965 int ret = 0;
3966
3967 u8 buf[2] = { 0xff, 0x00 };
3968 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
3969 .buf = buf, .len = 2 };
3970
3971 dprintk(2, "%s()\n", __func__);
3972
3973 if (fe->ops.i2c_gate_ctrl)
3974 fe->ops.i2c_gate_ctrl(fe, 1);
3975
3976 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
3977 printk(KERN_WARNING "mxl5005s I2C reset failed\n");
3978 ret = -EREMOTEIO;
3979 }
3980
3981 if (fe->ops.i2c_gate_ctrl)
3982 fe->ops.i2c_gate_ctrl(fe, 0);
3983
3984 return ret;
3985}
3986
3987/* Write a single byte to a single reg, latch the value if required by
3988 * following the transaction with the latch byte.
3989 */
3990static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val, int latch)
3991{
3992 struct mxl5005s_state *state = fe->tuner_priv;
3993 u8 buf[3] = { reg, val, MXL5005S_LATCH_BYTE };
3994 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
3995 .buf = buf, .len = 3 };
3996
3997 if (latch == 0)
3998 msg.len = 2;
3999
Steven Tothd211017b2008-05-01 19:35:54 -03004000 dprintk(2, "%s(0x%x, 0x%x, 0x%x)\n", __func__, reg, val, msg.addr);
Steven Toth48937292008-05-01 07:15:38 -03004001
4002 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
4003 printk(KERN_WARNING "mxl5005s I2C write failed\n");
4004 return -EREMOTEIO;
4005 }
4006 return 0;
4007}
4008
Steven Tothc6c34b12008-05-03 14:14:54 -03004009static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable,
4010 u8 *datatable, u8 len)
Steven Toth48937292008-05-01 07:15:38 -03004011{
4012 int ret = 0, i;
4013
4014 if (fe->ops.i2c_gate_ctrl)
4015 fe->ops.i2c_gate_ctrl(fe, 1);
4016
4017 for (i = 0 ; i < len-1; i++) {
4018 ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 0);
4019 if (ret < 0)
4020 break;
4021 }
4022
4023 ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 1);
4024
4025 if (fe->ops.i2c_gate_ctrl)
4026 fe->ops.i2c_gate_ctrl(fe, 0);
4027
4028 return ret;
4029}
Steven Toth7f5c3af2008-05-01 06:51:36 -03004030
Steven Tothc6c34b12008-05-03 14:14:54 -03004031static int mxl5005s_init(struct dvb_frontend *fe)
Steven Toth85d220d2008-05-01 05:48:14 -03004032{
Steven Toth48937292008-05-01 07:15:38 -03004033 dprintk(1, "%s()\n", __func__);
4034 return mxl5005s_reconfigure(fe, MXL_QAM, MXL5005S_BANDWIDTH_6MHZ);
4035}
4036
Steven Tothc6c34b12008-05-03 14:14:54 -03004037static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type,
4038 u32 bandwidth)
Steven Toth48937292008-05-01 07:15:38 -03004039{
4040 struct mxl5005s_state *state = fe->tuner_priv;
4041
4042 u8 AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4043 u8 ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4044 int TableLen;
4045
4046 dprintk(1, "%s(type=%d, bw=%d)\n", __func__, mod_type, bandwidth);
4047
4048 mxl5005s_reset(fe);
4049
4050 /* Tuner initialization stage 0 */
4051 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
4052 AddrTable[0] = MASTER_CONTROL_ADDR;
4053 ByteTable[0] |= state->config->AgcMasterByte;
4054
4055 mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);
4056
4057 mxl5005s_AssignTunerMode(fe, mod_type, bandwidth);
4058
4059 /* Tuner initialization stage 1 */
4060 MXL_GetInitRegister(fe, AddrTable, ByteTable, &TableLen);
4061
4062 mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
4063
4064 return 0;
4065}
4066
Steven Tothc6c34b12008-05-03 14:14:54 -03004067static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,
Steven Tothd211017b2008-05-01 19:35:54 -03004068 u32 bandwidth)
Steven Toth48937292008-05-01 07:15:38 -03004069{
4070 struct mxl5005s_state *state = fe->tuner_priv;
4071 struct mxl5005s_config *c = state->config;
4072
4073 InitTunerControls(fe);
Steven Toth85d220d2008-05-01 05:48:14 -03004074
4075 /* Set MxL5005S parameters. */
Steven Toth85d220d2008-05-01 05:48:14 -03004076 MXL5005_TunerConfig(
4077 fe,
Steven Toth48937292008-05-01 07:15:38 -03004078 c->mod_mode,
4079 c->if_mode,
4080 bandwidth,
4081 c->if_freq,
4082 c->xtal_freq,
4083 c->agc_mode,
4084 c->top,
4085 c->output_load,
4086 c->clock_out,
4087 c->div_out,
4088 c->cap_select,
4089 c->rssi_enable,
4090 mod_type,
4091 c->tracking_filter);
Steven Toth85d220d2008-05-01 05:48:14 -03004092
Steven Toth48937292008-05-01 07:15:38 -03004093 return 0;
Steven Toth85d220d2008-05-01 05:48:14 -03004094}
4095
4096static int mxl5005s_set_params(struct dvb_frontend *fe,
4097 struct dvb_frontend_parameters *params)
4098{
Steven Toth48937292008-05-01 07:15:38 -03004099 struct mxl5005s_state *state = fe->tuner_priv;
4100 u32 req_mode, req_bw = 0;
4101 int ret;
Steven Toth85d220d2008-05-01 05:48:14 -03004102
Steven Toth48937292008-05-01 07:15:38 -03004103 dprintk(1, "%s()\n", __func__);
Steven Toth85d220d2008-05-01 05:48:14 -03004104
Steven Toth48937292008-05-01 07:15:38 -03004105 if (fe->ops.info.type == FE_ATSC) {
4106 switch (params->u.vsb.modulation) {
4107 case VSB_8:
4108 req_mode = MXL_ATSC; break;
4109 default:
4110 case QAM_64:
4111 case QAM_256:
4112 case QAM_AUTO:
4113 req_mode = MXL_QAM; break;
4114 }
Steven Tothd211017b2008-05-01 19:35:54 -03004115 } else
4116 req_mode = MXL_DVBT;
Steven Toth85d220d2008-05-01 05:48:14 -03004117
Steven Toth48937292008-05-01 07:15:38 -03004118 /* Change tuner for new modulation type if reqd */
4119 if (req_mode != state->current_mode) {
4120 switch (req_mode) {
4121 case VSB_8:
4122 case QAM_64:
4123 case QAM_256:
4124 case QAM_AUTO:
4125 req_bw = MXL5005S_BANDWIDTH_6MHZ;
4126 break;
4127 default:
4128 /* Assume DVB-T */
4129 switch (params->u.ofdm.bandwidth) {
4130 case BANDWIDTH_6_MHZ:
4131 req_bw = MXL5005S_BANDWIDTH_6MHZ;
4132 break;
4133 case BANDWIDTH_7_MHZ:
4134 req_bw = MXL5005S_BANDWIDTH_7MHZ;
4135 break;
4136 case BANDWIDTH_AUTO:
4137 case BANDWIDTH_8_MHZ:
4138 req_bw = MXL5005S_BANDWIDTH_8MHZ;
4139 break;
4140 }
4141 }
4142
4143 state->current_mode = req_mode;
4144 ret = mxl5005s_reconfigure(fe, req_mode, req_bw);
4145
4146 } else
4147 ret = 0;
4148
4149 if (ret == 0) {
4150 dprintk(1, "%s() freq=%d\n", __func__, params->frequency);
4151 ret = mxl5005s_SetRfFreqHz(fe, params->frequency);
4152 }
4153
4154 return ret;
Steven Toth85d220d2008-05-01 05:48:14 -03004155}
4156
4157static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency)
4158{
4159 struct mxl5005s_state *state = fe->tuner_priv;
4160 dprintk(1, "%s()\n", __func__);
4161
4162 *frequency = state->RF_IN;
4163
4164 return 0;
4165}
4166
4167static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
4168{
4169 struct mxl5005s_state *state = fe->tuner_priv;
4170 dprintk(1, "%s()\n", __func__);
4171
4172 *bandwidth = state->Chan_Bandwidth;
4173
4174 return 0;
4175}
4176
Steven Toth85d220d2008-05-01 05:48:14 -03004177static int mxl5005s_release(struct dvb_frontend *fe)
4178{
4179 dprintk(1, "%s()\n", __func__);
4180 kfree(fe->tuner_priv);
4181 fe->tuner_priv = NULL;
4182 return 0;
4183}
4184
4185static const struct dvb_tuner_ops mxl5005s_tuner_ops = {
4186 .info = {
4187 .name = "MaxLinear MXL5005S",
4188 .frequency_min = 48000000,
4189 .frequency_max = 860000000,
4190 .frequency_step = 50000,
4191 },
4192
4193 .release = mxl5005s_release,
4194 .init = mxl5005s_init,
4195
4196 .set_params = mxl5005s_set_params,
4197 .get_frequency = mxl5005s_get_frequency,
4198 .get_bandwidth = mxl5005s_get_bandwidth,
Steven Toth85d220d2008-05-01 05:48:14 -03004199};
4200
4201struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe,
4202 struct i2c_adapter *i2c,
4203 struct mxl5005s_config *config)
4204{
4205 struct mxl5005s_state *state = NULL;
4206 dprintk(1, "%s()\n", __func__);
4207
4208 state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL);
4209 if (state == NULL)
4210 return NULL;
4211
4212 state->frontend = fe;
4213 state->config = config;
4214 state->i2c = i2c;
Steven Toth48937292008-05-01 07:15:38 -03004215 state->current_mode = MXL_QAM;
Steven Toth85d220d2008-05-01 05:48:14 -03004216
Steven Tothd211017b2008-05-01 19:35:54 -03004217 printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n",
4218 config->i2c_address);
Steven Toth85d220d2008-05-01 05:48:14 -03004219
Steven Tothd211017b2008-05-01 19:35:54 -03004220 memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops,
4221 sizeof(struct dvb_tuner_ops));
Steven Toth85d220d2008-05-01 05:48:14 -03004222
4223 fe->tuner_priv = state;
4224 return fe;
4225}
4226EXPORT_SYMBOL(mxl5005s_attach);
4227
4228MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver");
Steven Toth85d220d2008-05-01 05:48:14 -03004229MODULE_AUTHOR("Steven Toth");
4230MODULE_LICENSE("GPL");