blob: 605e28b73263677684a1b554fe245d85ed1ef378 [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
Steven Toth6d897612008-09-03 17:12:12 -03005 Copyright (C) 2006 Steven Toth <stoth@linuxtv.org>
Steven Toth48937292008-05-01 07:15:38 -03006 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
Steven Toth7fa2a142008-05-03 14:25:55 -030019 Copyright (C) 2008 Realtek
20 Copyright (C) 2008 Jan Hoogenraad
Steven Toth48937292008-05-01 07:15:38 -030021 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 Toth77ad55e2008-05-03 14:28:43 -030069static int debug;
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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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
Adrian Bunk38db1432008-05-16 00:15:53 -0300104};
Steven Toth85d220d2008-05-01 05:48:14 -0300105
Steven Toth85d220d2008-05-01 05:48:14 -0300106/* MXL5005 Tuner Register Struct */
Steven Tothd2110172008-05-01 19:35:54 -0300107struct TunerReg {
Steven Toth85d220d2008-05-01 05:48:14 -0300108 u16 Reg_Num; /* Tuner Register Address */
Steven Tothd2110172008-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 Tothd2110172008-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
Adrian Bunk38db1432008-05-16 00:15:53 -0300197};
Steven Toth85d220d2008-05-01 05:48:14 -0300198
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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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 Tothd2110172008-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);
Steven Tothc6c34b12008-05-03 14:14:54 -0300307static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum,
Steven Tothd2110172008-05-01 19:35:54 -0300308 u32 value, u16 controlGroup);
Steven Tothc6c34b12008-05-03 14:14:54 -0300309static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val);
310static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
Steven Tothd2110172008-05-01 19:35:54 -0300311 u8 *RegVal, int *count);
Steven Tothc6c34b12008-05-03 14:14:54 -0300312static u32 MXL_GetXtalInt(u32 Xtal_Freq);
313static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq);
314static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe);
315static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe);
316static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,
Steven Tothd2110172008-05-01 19:35:54 -0300317 u8 *RegVal, int *count);
Steven Tothc6c34b12008-05-03 14:14:54 -0300318static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable,
Steven Tothd2110172008-05-01 19:35:54 -0300319 u8 *datatable, u8 len);
Steven Tothc6c34b12008-05-03 14:14:54 -0300320static u16 MXL_IFSynthInit(struct dvb_frontend *fe);
321static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,
Steven Tothd2110172008-05-01 19:35:54 -0300322 u32 bandwidth);
Steven Tothc6c34b12008-05-03 14:14:54 -0300323static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type,
324 u32 bandwidth);
Steven Toth48937292008-05-01 07:15:38 -0300325
326/* ----------------------------------------------------------------
327 * Begin: Custom code salvaged from the Realtek driver.
Steven Toth7fa2a142008-05-03 14:25:55 -0300328 * Copyright (C) 2008 Realtek
329 * Copyright (C) 2008 Jan Hoogenraad
Steven Toth48937292008-05-01 07:15:38 -0300330 * This code is placed under the terms of the GNU General Public License
331 *
332 * Released by Realtek under GPLv2.
333 * Thanks to Realtek for a lot of support we received !
334 *
335 * Revision: 080314 - original version
336 */
Steven Toth52c99bd2008-05-01 04:57:01 -0300337
Steven Tothc6c34b12008-05-03 14:14:54 -0300338static int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz)
Steven Toth52c99bd2008-05-01 04:57:01 -0300339{
Steven Toth85d220d2008-05-01 05:48:14 -0300340 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -0300341 unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
342 unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
343 int TableLen;
344
Steven Tothc6c34b12008-05-03 14:14:54 -0300345 u32 IfDivval = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300346 unsigned char MasterControlByte;
347
Steven Toth85d220d2008-05-01 05:48:14 -0300348 dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300349
Steven Tothd2110172008-05-01 19:35:54 -0300350 /* Set MxL5005S tuner RF frequency according to example code. */
Steven Toth52c99bd2008-05-01 04:57:01 -0300351
Steven Tothd2110172008-05-01 19:35:54 -0300352 /* Tuner RF frequency setting stage 0 */
353 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
Steven Toth52c99bd2008-05-01 04:57:01 -0300354 AddrTable[0] = MASTER_CONTROL_ADDR;
Steven Toth85d220d2008-05-01 05:48:14 -0300355 ByteTable[0] |= state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300356
Steven Toth48937292008-05-01 07:15:38 -0300357 mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300358
Steven Tothd2110172008-05-01 19:35:54 -0300359 /* Tuner RF frequency setting stage 1 */
Steven Toth85d220d2008-05-01 05:48:14 -0300360 MXL_TuneRF(fe, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300361
Steven Toth85d220d2008-05-01 05:48:14 -0300362 MXL_ControlRead(fe, IF_DIVVAL, &IfDivval);
Steven Toth52c99bd2008-05-01 04:57:01 -0300363
Steven Toth85d220d2008-05-01 05:48:14 -0300364 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0);
365 MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1);
366 MXL_ControlWrite(fe, IF_DIVVAL, 8);
Steven Tothd2110172008-05-01 19:35:54 -0300367 MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300368
Steven Tothd2110172008-05-01 19:35:54 -0300369 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);
Steven Toth52c99bd2008-05-01 04:57:01 -0300370 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Tothd2110172008-05-01 19:35:54 -0300371 ByteTable[TableLen] = MasterControlByte |
372 state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300373 TableLen += 1;
374
Steven Toth48937292008-05-01 07:15:38 -0300375 mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300376
Steven Tothd2110172008-05-01 19:35:54 -0300377 /* Wait 30 ms. */
Steven Toth48937292008-05-01 07:15:38 -0300378 msleep(150);
Steven Toth52c99bd2008-05-01 04:57:01 -0300379
Steven Tothd2110172008-05-01 19:35:54 -0300380 /* Tuner RF frequency setting stage 2 */
381 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1);
382 MXL_ControlWrite(fe, IF_DIVVAL, IfDivval);
383 MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300384
Steven Tothd2110172008-05-01 19:35:54 -0300385 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);
Steven Toth52c99bd2008-05-01 04:57:01 -0300386 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
Steven Tothd2110172008-05-01 19:35:54 -0300387 ByteTable[TableLen] = MasterControlByte |
388 state->config->AgcMasterByte ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300389 TableLen += 1;
390
Steven Toth48937292008-05-01 07:15:38 -0300391 mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
392
393 msleep(100);
Steven Toth8c66a192008-05-01 06:35:48 -0300394
Steven Toth85d220d2008-05-01 05:48:14 -0300395 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300396}
Steven Toth48937292008-05-01 07:15:38 -0300397/* End: Custom code taken from the Realtek driver */
Steven Toth52c99bd2008-05-01 04:57:01 -0300398
Steven Toth48937292008-05-01 07:15:38 -0300399/* ----------------------------------------------------------------
400 * Begin: Reference driver code found in the Realtek driver.
Steven Toth7fa2a142008-05-03 14:25:55 -0300401 * Copyright (C) 2008 MaxLinear
Steven Toth48937292008-05-01 07:15:38 -0300402 */
Steven Tothc6c34b12008-05-03 14:14:54 -0300403static u16 MXL5005_RegisterInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300404{
Steven Toth85d220d2008-05-01 05:48:14 -0300405 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300406 state->TunerRegs_Num = TUNER_REGS_NUM ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300407
Steven Toth3935c252008-05-01 05:45:44 -0300408 state->TunerRegs[0].Reg_Num = 9 ;
409 state->TunerRegs[0].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300410
Steven Toth3935c252008-05-01 05:45:44 -0300411 state->TunerRegs[1].Reg_Num = 11 ;
412 state->TunerRegs[1].Reg_Val = 0x19 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300413
Steven Toth3935c252008-05-01 05:45:44 -0300414 state->TunerRegs[2].Reg_Num = 12 ;
415 state->TunerRegs[2].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300416
Steven Toth3935c252008-05-01 05:45:44 -0300417 state->TunerRegs[3].Reg_Num = 13 ;
418 state->TunerRegs[3].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300419
Steven Toth3935c252008-05-01 05:45:44 -0300420 state->TunerRegs[4].Reg_Num = 14 ;
421 state->TunerRegs[4].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300422
Steven Toth3935c252008-05-01 05:45:44 -0300423 state->TunerRegs[5].Reg_Num = 15 ;
424 state->TunerRegs[5].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300425
Steven Toth3935c252008-05-01 05:45:44 -0300426 state->TunerRegs[6].Reg_Num = 16 ;
427 state->TunerRegs[6].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300428
Steven Toth3935c252008-05-01 05:45:44 -0300429 state->TunerRegs[7].Reg_Num = 17 ;
430 state->TunerRegs[7].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300431
Steven Toth3935c252008-05-01 05:45:44 -0300432 state->TunerRegs[8].Reg_Num = 18 ;
433 state->TunerRegs[8].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300434
Steven Toth3935c252008-05-01 05:45:44 -0300435 state->TunerRegs[9].Reg_Num = 19 ;
436 state->TunerRegs[9].Reg_Val = 0x34 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300437
Steven Toth3935c252008-05-01 05:45:44 -0300438 state->TunerRegs[10].Reg_Num = 21 ;
439 state->TunerRegs[10].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300440
Steven Toth3935c252008-05-01 05:45:44 -0300441 state->TunerRegs[11].Reg_Num = 22 ;
442 state->TunerRegs[11].Reg_Val = 0x6B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300443
Steven Toth3935c252008-05-01 05:45:44 -0300444 state->TunerRegs[12].Reg_Num = 23 ;
445 state->TunerRegs[12].Reg_Val = 0x35 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300446
Steven Toth3935c252008-05-01 05:45:44 -0300447 state->TunerRegs[13].Reg_Num = 24 ;
448 state->TunerRegs[13].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300449
Steven Toth3935c252008-05-01 05:45:44 -0300450 state->TunerRegs[14].Reg_Num = 25 ;
451 state->TunerRegs[14].Reg_Val = 0x3E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300452
Steven Toth3935c252008-05-01 05:45:44 -0300453 state->TunerRegs[15].Reg_Num = 26 ;
454 state->TunerRegs[15].Reg_Val = 0x82 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300455
Steven Toth3935c252008-05-01 05:45:44 -0300456 state->TunerRegs[16].Reg_Num = 31 ;
457 state->TunerRegs[16].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300458
Steven Toth3935c252008-05-01 05:45:44 -0300459 state->TunerRegs[17].Reg_Num = 32 ;
460 state->TunerRegs[17].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300461
Steven Toth3935c252008-05-01 05:45:44 -0300462 state->TunerRegs[18].Reg_Num = 33 ;
463 state->TunerRegs[18].Reg_Val = 0x53 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300464
Steven Toth3935c252008-05-01 05:45:44 -0300465 state->TunerRegs[19].Reg_Num = 34 ;
466 state->TunerRegs[19].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300467
Steven Toth3935c252008-05-01 05:45:44 -0300468 state->TunerRegs[20].Reg_Num = 35 ;
469 state->TunerRegs[20].Reg_Val = 0xC9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300470
Steven Toth3935c252008-05-01 05:45:44 -0300471 state->TunerRegs[21].Reg_Num = 36 ;
472 state->TunerRegs[21].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300473
Steven Toth3935c252008-05-01 05:45:44 -0300474 state->TunerRegs[22].Reg_Num = 37 ;
475 state->TunerRegs[22].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300476
Steven Toth3935c252008-05-01 05:45:44 -0300477 state->TunerRegs[23].Reg_Num = 41 ;
478 state->TunerRegs[23].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300479
Steven Toth3935c252008-05-01 05:45:44 -0300480 state->TunerRegs[24].Reg_Num = 42 ;
481 state->TunerRegs[24].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300482
Steven Toth3935c252008-05-01 05:45:44 -0300483 state->TunerRegs[25].Reg_Num = 43 ;
484 state->TunerRegs[25].Reg_Val = 0x43 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300485
Steven Toth3935c252008-05-01 05:45:44 -0300486 state->TunerRegs[26].Reg_Num = 44 ;
487 state->TunerRegs[26].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300488
Steven Toth3935c252008-05-01 05:45:44 -0300489 state->TunerRegs[27].Reg_Num = 45 ;
490 state->TunerRegs[27].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300491
Steven Toth3935c252008-05-01 05:45:44 -0300492 state->TunerRegs[28].Reg_Num = 46 ;
493 state->TunerRegs[28].Reg_Val = 0x88 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300494
Steven Toth3935c252008-05-01 05:45:44 -0300495 state->TunerRegs[29].Reg_Num = 47 ;
496 state->TunerRegs[29].Reg_Val = 0x86 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300497
Steven Toth3935c252008-05-01 05:45:44 -0300498 state->TunerRegs[30].Reg_Num = 48 ;
499 state->TunerRegs[30].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300500
Steven Toth3935c252008-05-01 05:45:44 -0300501 state->TunerRegs[31].Reg_Num = 49 ;
502 state->TunerRegs[31].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300503
Steven Toth3935c252008-05-01 05:45:44 -0300504 state->TunerRegs[32].Reg_Num = 53 ;
505 state->TunerRegs[32].Reg_Val = 0x94 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300506
Steven Toth3935c252008-05-01 05:45:44 -0300507 state->TunerRegs[33].Reg_Num = 54 ;
508 state->TunerRegs[33].Reg_Val = 0xFA ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300509
Steven Toth3935c252008-05-01 05:45:44 -0300510 state->TunerRegs[34].Reg_Num = 55 ;
511 state->TunerRegs[34].Reg_Val = 0x92 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300512
Steven Toth3935c252008-05-01 05:45:44 -0300513 state->TunerRegs[35].Reg_Num = 56 ;
514 state->TunerRegs[35].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300515
Steven Toth3935c252008-05-01 05:45:44 -0300516 state->TunerRegs[36].Reg_Num = 57 ;
517 state->TunerRegs[36].Reg_Val = 0x41 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300518
Steven Toth3935c252008-05-01 05:45:44 -0300519 state->TunerRegs[37].Reg_Num = 58 ;
520 state->TunerRegs[37].Reg_Val = 0xDB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300521
Steven Toth3935c252008-05-01 05:45:44 -0300522 state->TunerRegs[38].Reg_Num = 59 ;
523 state->TunerRegs[38].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300524
Steven Toth3935c252008-05-01 05:45:44 -0300525 state->TunerRegs[39].Reg_Num = 60 ;
526 state->TunerRegs[39].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300527
Steven Toth3935c252008-05-01 05:45:44 -0300528 state->TunerRegs[40].Reg_Num = 61 ;
529 state->TunerRegs[40].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300530
Steven Toth3935c252008-05-01 05:45:44 -0300531 state->TunerRegs[41].Reg_Num = 62 ;
532 state->TunerRegs[41].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300533
Steven Toth3935c252008-05-01 05:45:44 -0300534 state->TunerRegs[42].Reg_Num = 65 ;
535 state->TunerRegs[42].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300536
Steven Toth3935c252008-05-01 05:45:44 -0300537 state->TunerRegs[43].Reg_Num = 66 ;
538 state->TunerRegs[43].Reg_Val = 0xE4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300539
Steven Toth3935c252008-05-01 05:45:44 -0300540 state->TunerRegs[44].Reg_Num = 67 ;
541 state->TunerRegs[44].Reg_Val = 0x90 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300542
Steven Toth3935c252008-05-01 05:45:44 -0300543 state->TunerRegs[45].Reg_Num = 68 ;
544 state->TunerRegs[45].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300545
Steven Toth3935c252008-05-01 05:45:44 -0300546 state->TunerRegs[46].Reg_Num = 69 ;
547 state->TunerRegs[46].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300548
Steven Toth3935c252008-05-01 05:45:44 -0300549 state->TunerRegs[47].Reg_Num = 70 ;
550 state->TunerRegs[47].Reg_Val = 0x50 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300551
Steven Toth3935c252008-05-01 05:45:44 -0300552 state->TunerRegs[48].Reg_Num = 71 ;
553 state->TunerRegs[48].Reg_Val = 0x06 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300554
Steven Toth3935c252008-05-01 05:45:44 -0300555 state->TunerRegs[49].Reg_Num = 72 ;
556 state->TunerRegs[49].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300557
Steven Toth3935c252008-05-01 05:45:44 -0300558 state->TunerRegs[50].Reg_Num = 73 ;
559 state->TunerRegs[50].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300560
Steven Toth3935c252008-05-01 05:45:44 -0300561 state->TunerRegs[51].Reg_Num = 76 ;
562 state->TunerRegs[51].Reg_Val = 0xBB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300563
Steven Toth3935c252008-05-01 05:45:44 -0300564 state->TunerRegs[52].Reg_Num = 77 ;
565 state->TunerRegs[52].Reg_Val = 0x13 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300566
Steven Toth3935c252008-05-01 05:45:44 -0300567 state->TunerRegs[53].Reg_Num = 81 ;
568 state->TunerRegs[53].Reg_Val = 0x04 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300569
Steven Toth3935c252008-05-01 05:45:44 -0300570 state->TunerRegs[54].Reg_Num = 82 ;
571 state->TunerRegs[54].Reg_Val = 0x75 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300572
Steven Toth3935c252008-05-01 05:45:44 -0300573 state->TunerRegs[55].Reg_Num = 83 ;
574 state->TunerRegs[55].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300575
Steven Toth3935c252008-05-01 05:45:44 -0300576 state->TunerRegs[56].Reg_Num = 84 ;
577 state->TunerRegs[56].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300578
Steven Toth3935c252008-05-01 05:45:44 -0300579 state->TunerRegs[57].Reg_Num = 85 ;
580 state->TunerRegs[57].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300581
Steven Toth3935c252008-05-01 05:45:44 -0300582 state->TunerRegs[58].Reg_Num = 91 ;
583 state->TunerRegs[58].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300584
Steven Toth3935c252008-05-01 05:45:44 -0300585 state->TunerRegs[59].Reg_Num = 92 ;
586 state->TunerRegs[59].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300587
Steven Toth3935c252008-05-01 05:45:44 -0300588 state->TunerRegs[60].Reg_Num = 93 ;
589 state->TunerRegs[60].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300590
Steven Toth3935c252008-05-01 05:45:44 -0300591 state->TunerRegs[61].Reg_Num = 94 ;
592 state->TunerRegs[61].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300593
Steven Toth3935c252008-05-01 05:45:44 -0300594 state->TunerRegs[62].Reg_Num = 95 ;
595 state->TunerRegs[62].Reg_Val = 0x0C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300596
Steven Toth3935c252008-05-01 05:45:44 -0300597 state->TunerRegs[63].Reg_Num = 96 ;
598 state->TunerRegs[63].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300599
Steven Toth3935c252008-05-01 05:45:44 -0300600 state->TunerRegs[64].Reg_Num = 97 ;
601 state->TunerRegs[64].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300602
Steven Toth3935c252008-05-01 05:45:44 -0300603 state->TunerRegs[65].Reg_Num = 98 ;
604 state->TunerRegs[65].Reg_Val = 0xE2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300605
Steven Toth3935c252008-05-01 05:45:44 -0300606 state->TunerRegs[66].Reg_Num = 99 ;
607 state->TunerRegs[66].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300608
Steven Toth3935c252008-05-01 05:45:44 -0300609 state->TunerRegs[67].Reg_Num = 100 ;
610 state->TunerRegs[67].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300611
Steven Toth3935c252008-05-01 05:45:44 -0300612 state->TunerRegs[68].Reg_Num = 101 ;
613 state->TunerRegs[68].Reg_Val = 0x12 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300614
Steven Toth3935c252008-05-01 05:45:44 -0300615 state->TunerRegs[69].Reg_Num = 102 ;
616 state->TunerRegs[69].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300617
Steven Toth3935c252008-05-01 05:45:44 -0300618 state->TunerRegs[70].Reg_Num = 103 ;
619 state->TunerRegs[70].Reg_Val = 0x32 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300620
Steven Toth3935c252008-05-01 05:45:44 -0300621 state->TunerRegs[71].Reg_Num = 104 ;
622 state->TunerRegs[71].Reg_Val = 0xB4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300623
Steven Toth3935c252008-05-01 05:45:44 -0300624 state->TunerRegs[72].Reg_Num = 105 ;
625 state->TunerRegs[72].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300626
Steven Toth3935c252008-05-01 05:45:44 -0300627 state->TunerRegs[73].Reg_Num = 106 ;
628 state->TunerRegs[73].Reg_Val = 0x83 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300629
Steven Toth3935c252008-05-01 05:45:44 -0300630 state->TunerRegs[74].Reg_Num = 107 ;
631 state->TunerRegs[74].Reg_Val = 0x84 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300632
Steven Toth3935c252008-05-01 05:45:44 -0300633 state->TunerRegs[75].Reg_Num = 108 ;
634 state->TunerRegs[75].Reg_Val = 0x9C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300635
Steven Toth3935c252008-05-01 05:45:44 -0300636 state->TunerRegs[76].Reg_Num = 109 ;
637 state->TunerRegs[76].Reg_Val = 0x02 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300638
Steven Toth3935c252008-05-01 05:45:44 -0300639 state->TunerRegs[77].Reg_Num = 110 ;
640 state->TunerRegs[77].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300641
Steven Toth3935c252008-05-01 05:45:44 -0300642 state->TunerRegs[78].Reg_Num = 111 ;
643 state->TunerRegs[78].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300644
Steven Toth3935c252008-05-01 05:45:44 -0300645 state->TunerRegs[79].Reg_Num = 112 ;
646 state->TunerRegs[79].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300647
Steven Toth3935c252008-05-01 05:45:44 -0300648 state->TunerRegs[80].Reg_Num = 131 ;
649 state->TunerRegs[80].Reg_Val = 0x8A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300650
Steven Toth3935c252008-05-01 05:45:44 -0300651 state->TunerRegs[81].Reg_Num = 132 ;
652 state->TunerRegs[81].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300653
Steven Toth3935c252008-05-01 05:45:44 -0300654 state->TunerRegs[82].Reg_Num = 133 ;
655 state->TunerRegs[82].Reg_Val = 0x24 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300656
Steven Toth3935c252008-05-01 05:45:44 -0300657 state->TunerRegs[83].Reg_Num = 134 ;
658 state->TunerRegs[83].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300659
Steven Toth3935c252008-05-01 05:45:44 -0300660 state->TunerRegs[84].Reg_Num = 135 ;
661 state->TunerRegs[84].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300662
Steven Toth3935c252008-05-01 05:45:44 -0300663 state->TunerRegs[85].Reg_Num = 136 ;
664 state->TunerRegs[85].Reg_Val = 0x7E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300665
Steven Toth3935c252008-05-01 05:45:44 -0300666 state->TunerRegs[86].Reg_Num = 137 ;
667 state->TunerRegs[86].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300668
Steven Toth3935c252008-05-01 05:45:44 -0300669 state->TunerRegs[87].Reg_Num = 138 ;
670 state->TunerRegs[87].Reg_Val = 0x38 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300671
Steven Toth3935c252008-05-01 05:45:44 -0300672 state->TunerRegs[88].Reg_Num = 146 ;
673 state->TunerRegs[88].Reg_Val = 0xF6 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300674
Steven Toth3935c252008-05-01 05:45:44 -0300675 state->TunerRegs[89].Reg_Num = 147 ;
676 state->TunerRegs[89].Reg_Val = 0x1A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300677
Steven Toth3935c252008-05-01 05:45:44 -0300678 state->TunerRegs[90].Reg_Num = 148 ;
679 state->TunerRegs[90].Reg_Val = 0x62 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300680
Steven Toth3935c252008-05-01 05:45:44 -0300681 state->TunerRegs[91].Reg_Num = 149 ;
682 state->TunerRegs[91].Reg_Val = 0x33 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300683
Steven Toth3935c252008-05-01 05:45:44 -0300684 state->TunerRegs[92].Reg_Num = 150 ;
685 state->TunerRegs[92].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300686
Steven Toth3935c252008-05-01 05:45:44 -0300687 state->TunerRegs[93].Reg_Num = 156 ;
688 state->TunerRegs[93].Reg_Val = 0x56 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300689
Steven Toth3935c252008-05-01 05:45:44 -0300690 state->TunerRegs[94].Reg_Num = 157 ;
691 state->TunerRegs[94].Reg_Val = 0x17 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300692
Steven Toth3935c252008-05-01 05:45:44 -0300693 state->TunerRegs[95].Reg_Num = 158 ;
694 state->TunerRegs[95].Reg_Val = 0xA9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300695
Steven Toth3935c252008-05-01 05:45:44 -0300696 state->TunerRegs[96].Reg_Num = 159 ;
697 state->TunerRegs[96].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300698
Steven Toth3935c252008-05-01 05:45:44 -0300699 state->TunerRegs[97].Reg_Num = 160 ;
700 state->TunerRegs[97].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300701
Steven Toth3935c252008-05-01 05:45:44 -0300702 state->TunerRegs[98].Reg_Num = 161 ;
703 state->TunerRegs[98].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300704
Steven Toth3935c252008-05-01 05:45:44 -0300705 state->TunerRegs[99].Reg_Num = 162 ;
706 state->TunerRegs[99].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300707
Steven Toth3935c252008-05-01 05:45:44 -0300708 state->TunerRegs[100].Reg_Num = 166 ;
709 state->TunerRegs[100].Reg_Val = 0xAE ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300710
Steven Toth3935c252008-05-01 05:45:44 -0300711 state->TunerRegs[101].Reg_Num = 167 ;
712 state->TunerRegs[101].Reg_Val = 0x1B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300713
Steven Toth3935c252008-05-01 05:45:44 -0300714 state->TunerRegs[102].Reg_Num = 168 ;
715 state->TunerRegs[102].Reg_Val = 0xF2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300716
Steven Toth3935c252008-05-01 05:45:44 -0300717 state->TunerRegs[103].Reg_Num = 195 ;
718 state->TunerRegs[103].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300719
720 return 0 ;
721}
722
Steven Tothc6c34b12008-05-03 14:14:54 -0300723static u16 MXL5005_ControlInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300724{
Steven Toth85d220d2008-05-01 05:48:14 -0300725 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300726 state->Init_Ctrl_Num = INITCTRL_NUM;
Steven Toth52c99bd2008-05-01 04:57:01 -0300727
Steven Toth3935c252008-05-01 05:45:44 -0300728 state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;
729 state->Init_Ctrl[0].size = 1 ;
730 state->Init_Ctrl[0].addr[0] = 73;
731 state->Init_Ctrl[0].bit[0] = 7;
732 state->Init_Ctrl[0].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300733
Steven Toth3935c252008-05-01 05:45:44 -0300734 state->Init_Ctrl[1].Ctrl_Num = BB_MODE ;
735 state->Init_Ctrl[1].size = 1 ;
736 state->Init_Ctrl[1].addr[0] = 53;
737 state->Init_Ctrl[1].bit[0] = 2;
738 state->Init_Ctrl[1].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300739
Steven Toth3935c252008-05-01 05:45:44 -0300740 state->Init_Ctrl[2].Ctrl_Num = BB_BUF ;
741 state->Init_Ctrl[2].size = 2 ;
742 state->Init_Ctrl[2].addr[0] = 53;
743 state->Init_Ctrl[2].bit[0] = 1;
744 state->Init_Ctrl[2].val[0] = 0;
745 state->Init_Ctrl[2].addr[1] = 57;
746 state->Init_Ctrl[2].bit[1] = 0;
747 state->Init_Ctrl[2].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300748
Steven Toth3935c252008-05-01 05:45:44 -0300749 state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;
750 state->Init_Ctrl[3].size = 1 ;
751 state->Init_Ctrl[3].addr[0] = 53;
752 state->Init_Ctrl[3].bit[0] = 0;
753 state->Init_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300754
Steven Toth3935c252008-05-01 05:45:44 -0300755 state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;
756 state->Init_Ctrl[4].size = 3 ;
757 state->Init_Ctrl[4].addr[0] = 53;
758 state->Init_Ctrl[4].bit[0] = 5;
759 state->Init_Ctrl[4].val[0] = 0;
760 state->Init_Ctrl[4].addr[1] = 53;
761 state->Init_Ctrl[4].bit[1] = 6;
762 state->Init_Ctrl[4].val[1] = 0;
763 state->Init_Ctrl[4].addr[2] = 53;
764 state->Init_Ctrl[4].bit[2] = 7;
765 state->Init_Ctrl[4].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300766
Steven Toth3935c252008-05-01 05:45:44 -0300767 state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;
768 state->Init_Ctrl[5].size = 1 ;
769 state->Init_Ctrl[5].addr[0] = 59;
770 state->Init_Ctrl[5].bit[0] = 0;
771 state->Init_Ctrl[5].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300772
Steven Toth3935c252008-05-01 05:45:44 -0300773 state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ;
774 state->Init_Ctrl[6].size = 2 ;
775 state->Init_Ctrl[6].addr[0] = 53;
776 state->Init_Ctrl[6].bit[0] = 3;
777 state->Init_Ctrl[6].val[0] = 0;
778 state->Init_Ctrl[6].addr[1] = 53;
779 state->Init_Ctrl[6].bit[1] = 4;
780 state->Init_Ctrl[6].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300781
Steven Toth3935c252008-05-01 05:45:44 -0300782 state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ;
783 state->Init_Ctrl[7].size = 4 ;
784 state->Init_Ctrl[7].addr[0] = 22;
785 state->Init_Ctrl[7].bit[0] = 4;
786 state->Init_Ctrl[7].val[0] = 0;
787 state->Init_Ctrl[7].addr[1] = 22;
788 state->Init_Ctrl[7].bit[1] = 5;
789 state->Init_Ctrl[7].val[1] = 1;
790 state->Init_Ctrl[7].addr[2] = 22;
791 state->Init_Ctrl[7].bit[2] = 6;
792 state->Init_Ctrl[7].val[2] = 1;
793 state->Init_Ctrl[7].addr[3] = 22;
794 state->Init_Ctrl[7].bit[3] = 7;
795 state->Init_Ctrl[7].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300796
Steven Toth3935c252008-05-01 05:45:44 -0300797 state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ;
798 state->Init_Ctrl[8].size = 1 ;
799 state->Init_Ctrl[8].addr[0] = 22;
800 state->Init_Ctrl[8].bit[0] = 2;
801 state->Init_Ctrl[8].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300802
Steven Toth3935c252008-05-01 05:45:44 -0300803 state->Init_Ctrl[9].Ctrl_Num = AGC_IF ;
804 state->Init_Ctrl[9].size = 4 ;
805 state->Init_Ctrl[9].addr[0] = 76;
806 state->Init_Ctrl[9].bit[0] = 0;
807 state->Init_Ctrl[9].val[0] = 1;
808 state->Init_Ctrl[9].addr[1] = 76;
809 state->Init_Ctrl[9].bit[1] = 1;
810 state->Init_Ctrl[9].val[1] = 1;
811 state->Init_Ctrl[9].addr[2] = 76;
812 state->Init_Ctrl[9].bit[2] = 2;
813 state->Init_Ctrl[9].val[2] = 0;
814 state->Init_Ctrl[9].addr[3] = 76;
815 state->Init_Ctrl[9].bit[3] = 3;
816 state->Init_Ctrl[9].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300817
Steven Toth3935c252008-05-01 05:45:44 -0300818 state->Init_Ctrl[10].Ctrl_Num = AGC_RF ;
819 state->Init_Ctrl[10].size = 4 ;
820 state->Init_Ctrl[10].addr[0] = 76;
821 state->Init_Ctrl[10].bit[0] = 4;
822 state->Init_Ctrl[10].val[0] = 1;
823 state->Init_Ctrl[10].addr[1] = 76;
824 state->Init_Ctrl[10].bit[1] = 5;
825 state->Init_Ctrl[10].val[1] = 1;
826 state->Init_Ctrl[10].addr[2] = 76;
827 state->Init_Ctrl[10].bit[2] = 6;
828 state->Init_Ctrl[10].val[2] = 0;
829 state->Init_Ctrl[10].addr[3] = 76;
830 state->Init_Ctrl[10].bit[3] = 7;
831 state->Init_Ctrl[10].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300832
Steven Toth3935c252008-05-01 05:45:44 -0300833 state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ;
834 state->Init_Ctrl[11].size = 5 ;
835 state->Init_Ctrl[11].addr[0] = 43;
836 state->Init_Ctrl[11].bit[0] = 3;
837 state->Init_Ctrl[11].val[0] = 0;
838 state->Init_Ctrl[11].addr[1] = 43;
839 state->Init_Ctrl[11].bit[1] = 4;
840 state->Init_Ctrl[11].val[1] = 0;
841 state->Init_Ctrl[11].addr[2] = 43;
842 state->Init_Ctrl[11].bit[2] = 5;
843 state->Init_Ctrl[11].val[2] = 0;
844 state->Init_Ctrl[11].addr[3] = 43;
845 state->Init_Ctrl[11].bit[3] = 6;
846 state->Init_Ctrl[11].val[3] = 1;
847 state->Init_Ctrl[11].addr[4] = 43;
848 state->Init_Ctrl[11].bit[4] = 7;
849 state->Init_Ctrl[11].val[4] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300850
Steven Toth3935c252008-05-01 05:45:44 -0300851 state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ;
852 state->Init_Ctrl[12].size = 6 ;
853 state->Init_Ctrl[12].addr[0] = 44;
854 state->Init_Ctrl[12].bit[0] = 2;
855 state->Init_Ctrl[12].val[0] = 0;
856 state->Init_Ctrl[12].addr[1] = 44;
857 state->Init_Ctrl[12].bit[1] = 3;
858 state->Init_Ctrl[12].val[1] = 0;
859 state->Init_Ctrl[12].addr[2] = 44;
860 state->Init_Ctrl[12].bit[2] = 4;
861 state->Init_Ctrl[12].val[2] = 0;
862 state->Init_Ctrl[12].addr[3] = 44;
863 state->Init_Ctrl[12].bit[3] = 5;
864 state->Init_Ctrl[12].val[3] = 1;
865 state->Init_Ctrl[12].addr[4] = 44;
866 state->Init_Ctrl[12].bit[4] = 6;
867 state->Init_Ctrl[12].val[4] = 0;
868 state->Init_Ctrl[12].addr[5] = 44;
869 state->Init_Ctrl[12].bit[5] = 7;
870 state->Init_Ctrl[12].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300871
Steven Toth3935c252008-05-01 05:45:44 -0300872 state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ;
873 state->Init_Ctrl[13].size = 7 ;
874 state->Init_Ctrl[13].addr[0] = 11;
875 state->Init_Ctrl[13].bit[0] = 0;
876 state->Init_Ctrl[13].val[0] = 1;
877 state->Init_Ctrl[13].addr[1] = 11;
878 state->Init_Ctrl[13].bit[1] = 1;
879 state->Init_Ctrl[13].val[1] = 0;
880 state->Init_Ctrl[13].addr[2] = 11;
881 state->Init_Ctrl[13].bit[2] = 2;
882 state->Init_Ctrl[13].val[2] = 0;
883 state->Init_Ctrl[13].addr[3] = 11;
884 state->Init_Ctrl[13].bit[3] = 3;
885 state->Init_Ctrl[13].val[3] = 1;
886 state->Init_Ctrl[13].addr[4] = 11;
887 state->Init_Ctrl[13].bit[4] = 4;
888 state->Init_Ctrl[13].val[4] = 1;
889 state->Init_Ctrl[13].addr[5] = 11;
890 state->Init_Ctrl[13].bit[5] = 5;
891 state->Init_Ctrl[13].val[5] = 0;
892 state->Init_Ctrl[13].addr[6] = 11;
893 state->Init_Ctrl[13].bit[6] = 6;
894 state->Init_Ctrl[13].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300895
Steven Toth3935c252008-05-01 05:45:44 -0300896 state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ;
897 state->Init_Ctrl[14].size = 16 ;
898 state->Init_Ctrl[14].addr[0] = 13;
899 state->Init_Ctrl[14].bit[0] = 0;
900 state->Init_Ctrl[14].val[0] = 0;
901 state->Init_Ctrl[14].addr[1] = 13;
902 state->Init_Ctrl[14].bit[1] = 1;
903 state->Init_Ctrl[14].val[1] = 0;
904 state->Init_Ctrl[14].addr[2] = 13;
905 state->Init_Ctrl[14].bit[2] = 2;
906 state->Init_Ctrl[14].val[2] = 0;
907 state->Init_Ctrl[14].addr[3] = 13;
908 state->Init_Ctrl[14].bit[3] = 3;
909 state->Init_Ctrl[14].val[3] = 0;
910 state->Init_Ctrl[14].addr[4] = 13;
911 state->Init_Ctrl[14].bit[4] = 4;
912 state->Init_Ctrl[14].val[4] = 0;
913 state->Init_Ctrl[14].addr[5] = 13;
914 state->Init_Ctrl[14].bit[5] = 5;
915 state->Init_Ctrl[14].val[5] = 0;
916 state->Init_Ctrl[14].addr[6] = 13;
917 state->Init_Ctrl[14].bit[6] = 6;
918 state->Init_Ctrl[14].val[6] = 0;
919 state->Init_Ctrl[14].addr[7] = 13;
920 state->Init_Ctrl[14].bit[7] = 7;
921 state->Init_Ctrl[14].val[7] = 0;
922 state->Init_Ctrl[14].addr[8] = 12;
923 state->Init_Ctrl[14].bit[8] = 0;
924 state->Init_Ctrl[14].val[8] = 0;
925 state->Init_Ctrl[14].addr[9] = 12;
926 state->Init_Ctrl[14].bit[9] = 1;
927 state->Init_Ctrl[14].val[9] = 0;
928 state->Init_Ctrl[14].addr[10] = 12;
929 state->Init_Ctrl[14].bit[10] = 2;
930 state->Init_Ctrl[14].val[10] = 0;
931 state->Init_Ctrl[14].addr[11] = 12;
932 state->Init_Ctrl[14].bit[11] = 3;
933 state->Init_Ctrl[14].val[11] = 0;
934 state->Init_Ctrl[14].addr[12] = 12;
935 state->Init_Ctrl[14].bit[12] = 4;
936 state->Init_Ctrl[14].val[12] = 0;
937 state->Init_Ctrl[14].addr[13] = 12;
938 state->Init_Ctrl[14].bit[13] = 5;
939 state->Init_Ctrl[14].val[13] = 1;
940 state->Init_Ctrl[14].addr[14] = 12;
941 state->Init_Ctrl[14].bit[14] = 6;
942 state->Init_Ctrl[14].val[14] = 1;
943 state->Init_Ctrl[14].addr[15] = 12;
944 state->Init_Ctrl[14].bit[15] = 7;
945 state->Init_Ctrl[14].val[15] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300946
Steven Toth3935c252008-05-01 05:45:44 -0300947 state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ;
948 state->Init_Ctrl[15].size = 3 ;
949 state->Init_Ctrl[15].addr[0] = 147;
950 state->Init_Ctrl[15].bit[0] = 2;
951 state->Init_Ctrl[15].val[0] = 0;
952 state->Init_Ctrl[15].addr[1] = 147;
953 state->Init_Ctrl[15].bit[1] = 3;
954 state->Init_Ctrl[15].val[1] = 1;
955 state->Init_Ctrl[15].addr[2] = 147;
956 state->Init_Ctrl[15].bit[2] = 4;
957 state->Init_Ctrl[15].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300958
Steven Toth3935c252008-05-01 05:45:44 -0300959 state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ;
960 state->Init_Ctrl[16].size = 2 ;
961 state->Init_Ctrl[16].addr[0] = 147;
962 state->Init_Ctrl[16].bit[0] = 0;
963 state->Init_Ctrl[16].val[0] = 0;
964 state->Init_Ctrl[16].addr[1] = 147;
965 state->Init_Ctrl[16].bit[1] = 1;
966 state->Init_Ctrl[16].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300967
Steven Toth3935c252008-05-01 05:45:44 -0300968 state->Init_Ctrl[17].Ctrl_Num = EN_AAF ;
969 state->Init_Ctrl[17].size = 1 ;
970 state->Init_Ctrl[17].addr[0] = 147;
971 state->Init_Ctrl[17].bit[0] = 7;
972 state->Init_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300973
Steven Toth3935c252008-05-01 05:45:44 -0300974 state->Init_Ctrl[18].Ctrl_Num = EN_3P ;
975 state->Init_Ctrl[18].size = 1 ;
976 state->Init_Ctrl[18].addr[0] = 147;
977 state->Init_Ctrl[18].bit[0] = 6;
978 state->Init_Ctrl[18].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300979
Steven Toth3935c252008-05-01 05:45:44 -0300980 state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ;
981 state->Init_Ctrl[19].size = 1 ;
982 state->Init_Ctrl[19].addr[0] = 156;
983 state->Init_Ctrl[19].bit[0] = 0;
984 state->Init_Ctrl[19].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300985
Steven Toth3935c252008-05-01 05:45:44 -0300986 state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ;
987 state->Init_Ctrl[20].size = 1 ;
988 state->Init_Ctrl[20].addr[0] = 147;
989 state->Init_Ctrl[20].bit[0] = 5;
990 state->Init_Ctrl[20].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300991
Steven Toth3935c252008-05-01 05:45:44 -0300992 state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ;
993 state->Init_Ctrl[21].size = 1 ;
994 state->Init_Ctrl[21].addr[0] = 137;
995 state->Init_Ctrl[21].bit[0] = 4;
996 state->Init_Ctrl[21].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300997
Steven Toth3935c252008-05-01 05:45:44 -0300998 state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ;
999 state->Init_Ctrl[22].size = 1 ;
1000 state->Init_Ctrl[22].addr[0] = 137;
1001 state->Init_Ctrl[22].bit[0] = 7;
1002 state->Init_Ctrl[22].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001003
Steven Toth3935c252008-05-01 05:45:44 -03001004 state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ;
1005 state->Init_Ctrl[23].size = 1 ;
1006 state->Init_Ctrl[23].addr[0] = 91;
1007 state->Init_Ctrl[23].bit[0] = 5;
1008 state->Init_Ctrl[23].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001009
Steven Toth3935c252008-05-01 05:45:44 -03001010 state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ;
1011 state->Init_Ctrl[24].size = 1 ;
1012 state->Init_Ctrl[24].addr[0] = 43;
1013 state->Init_Ctrl[24].bit[0] = 0;
1014 state->Init_Ctrl[24].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001015
Steven Toth3935c252008-05-01 05:45:44 -03001016 state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ;
1017 state->Init_Ctrl[25].size = 2 ;
1018 state->Init_Ctrl[25].addr[0] = 22;
1019 state->Init_Ctrl[25].bit[0] = 0;
1020 state->Init_Ctrl[25].val[0] = 1;
1021 state->Init_Ctrl[25].addr[1] = 22;
1022 state->Init_Ctrl[25].bit[1] = 1;
1023 state->Init_Ctrl[25].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001024
Steven Toth3935c252008-05-01 05:45:44 -03001025 state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ;
1026 state->Init_Ctrl[26].size = 1 ;
1027 state->Init_Ctrl[26].addr[0] = 134;
1028 state->Init_Ctrl[26].bit[0] = 2;
1029 state->Init_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001030
Steven Toth3935c252008-05-01 05:45:44 -03001031 state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ;
1032 state->Init_Ctrl[27].size = 1 ;
1033 state->Init_Ctrl[27].addr[0] = 137;
1034 state->Init_Ctrl[27].bit[0] = 3;
1035 state->Init_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001036
Steven Toth3935c252008-05-01 05:45:44 -03001037 state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ;
1038 state->Init_Ctrl[28].size = 1 ;
1039 state->Init_Ctrl[28].addr[0] = 77;
1040 state->Init_Ctrl[28].bit[0] = 7;
1041 state->Init_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001042
Steven Toth3935c252008-05-01 05:45:44 -03001043 state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ;
1044 state->Init_Ctrl[29].size = 1 ;
1045 state->Init_Ctrl[29].addr[0] = 166;
1046 state->Init_Ctrl[29].bit[0] = 7;
1047 state->Init_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001048
Steven Toth3935c252008-05-01 05:45:44 -03001049 state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ;
1050 state->Init_Ctrl[30].size = 3 ;
1051 state->Init_Ctrl[30].addr[0] = 166;
1052 state->Init_Ctrl[30].bit[0] = 0;
1053 state->Init_Ctrl[30].val[0] = 0;
1054 state->Init_Ctrl[30].addr[1] = 166;
1055 state->Init_Ctrl[30].bit[1] = 1;
1056 state->Init_Ctrl[30].val[1] = 1;
1057 state->Init_Ctrl[30].addr[2] = 166;
1058 state->Init_Ctrl[30].bit[2] = 2;
1059 state->Init_Ctrl[30].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001060
Steven Toth3935c252008-05-01 05:45:44 -03001061 state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ;
1062 state->Init_Ctrl[31].size = 3 ;
1063 state->Init_Ctrl[31].addr[0] = 166;
1064 state->Init_Ctrl[31].bit[0] = 3;
1065 state->Init_Ctrl[31].val[0] = 1;
1066 state->Init_Ctrl[31].addr[1] = 166;
1067 state->Init_Ctrl[31].bit[1] = 4;
1068 state->Init_Ctrl[31].val[1] = 0;
1069 state->Init_Ctrl[31].addr[2] = 166;
1070 state->Init_Ctrl[31].bit[2] = 5;
1071 state->Init_Ctrl[31].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001072
Steven Toth3935c252008-05-01 05:45:44 -03001073 state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ;
1074 state->Init_Ctrl[32].size = 3 ;
1075 state->Init_Ctrl[32].addr[0] = 167;
1076 state->Init_Ctrl[32].bit[0] = 0;
1077 state->Init_Ctrl[32].val[0] = 1;
1078 state->Init_Ctrl[32].addr[1] = 167;
1079 state->Init_Ctrl[32].bit[1] = 1;
1080 state->Init_Ctrl[32].val[1] = 1;
1081 state->Init_Ctrl[32].addr[2] = 167;
1082 state->Init_Ctrl[32].bit[2] = 2;
1083 state->Init_Ctrl[32].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001084
Steven Toth3935c252008-05-01 05:45:44 -03001085 state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ;
1086 state->Init_Ctrl[33].size = 4 ;
1087 state->Init_Ctrl[33].addr[0] = 168;
1088 state->Init_Ctrl[33].bit[0] = 0;
1089 state->Init_Ctrl[33].val[0] = 0;
1090 state->Init_Ctrl[33].addr[1] = 168;
1091 state->Init_Ctrl[33].bit[1] = 1;
1092 state->Init_Ctrl[33].val[1] = 1;
1093 state->Init_Ctrl[33].addr[2] = 168;
1094 state->Init_Ctrl[33].bit[2] = 2;
1095 state->Init_Ctrl[33].val[2] = 0;
1096 state->Init_Ctrl[33].addr[3] = 168;
1097 state->Init_Ctrl[33].bit[3] = 3;
1098 state->Init_Ctrl[33].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001099
Steven Toth3935c252008-05-01 05:45:44 -03001100 state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ;
1101 state->Init_Ctrl[34].size = 4 ;
1102 state->Init_Ctrl[34].addr[0] = 168;
1103 state->Init_Ctrl[34].bit[0] = 4;
1104 state->Init_Ctrl[34].val[0] = 1;
1105 state->Init_Ctrl[34].addr[1] = 168;
1106 state->Init_Ctrl[34].bit[1] = 5;
1107 state->Init_Ctrl[34].val[1] = 1;
1108 state->Init_Ctrl[34].addr[2] = 168;
1109 state->Init_Ctrl[34].bit[2] = 6;
1110 state->Init_Ctrl[34].val[2] = 1;
1111 state->Init_Ctrl[34].addr[3] = 168;
1112 state->Init_Ctrl[34].bit[3] = 7;
1113 state->Init_Ctrl[34].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001114
Steven Toth3935c252008-05-01 05:45:44 -03001115 state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ;
1116 state->Init_Ctrl[35].size = 1 ;
1117 state->Init_Ctrl[35].addr[0] = 135;
1118 state->Init_Ctrl[35].bit[0] = 0;
1119 state->Init_Ctrl[35].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001120
Steven Toth3935c252008-05-01 05:45:44 -03001121 state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ;
1122 state->Init_Ctrl[36].size = 1 ;
1123 state->Init_Ctrl[36].addr[0] = 56;
1124 state->Init_Ctrl[36].bit[0] = 3;
1125 state->Init_Ctrl[36].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001126
Steven Toth3935c252008-05-01 05:45:44 -03001127 state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ;
1128 state->Init_Ctrl[37].size = 7 ;
1129 state->Init_Ctrl[37].addr[0] = 59;
1130 state->Init_Ctrl[37].bit[0] = 1;
1131 state->Init_Ctrl[37].val[0] = 0;
1132 state->Init_Ctrl[37].addr[1] = 59;
1133 state->Init_Ctrl[37].bit[1] = 2;
1134 state->Init_Ctrl[37].val[1] = 0;
1135 state->Init_Ctrl[37].addr[2] = 59;
1136 state->Init_Ctrl[37].bit[2] = 3;
1137 state->Init_Ctrl[37].val[2] = 0;
1138 state->Init_Ctrl[37].addr[3] = 59;
1139 state->Init_Ctrl[37].bit[3] = 4;
1140 state->Init_Ctrl[37].val[3] = 0;
1141 state->Init_Ctrl[37].addr[4] = 59;
1142 state->Init_Ctrl[37].bit[4] = 5;
1143 state->Init_Ctrl[37].val[4] = 0;
1144 state->Init_Ctrl[37].addr[5] = 59;
1145 state->Init_Ctrl[37].bit[5] = 6;
1146 state->Init_Ctrl[37].val[5] = 0;
1147 state->Init_Ctrl[37].addr[6] = 59;
1148 state->Init_Ctrl[37].bit[6] = 7;
1149 state->Init_Ctrl[37].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001150
Steven Toth3935c252008-05-01 05:45:44 -03001151 state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ;
1152 state->Init_Ctrl[38].size = 6 ;
1153 state->Init_Ctrl[38].addr[0] = 32;
1154 state->Init_Ctrl[38].bit[0] = 2;
1155 state->Init_Ctrl[38].val[0] = 0;
1156 state->Init_Ctrl[38].addr[1] = 32;
1157 state->Init_Ctrl[38].bit[1] = 3;
1158 state->Init_Ctrl[38].val[1] = 0;
1159 state->Init_Ctrl[38].addr[2] = 32;
1160 state->Init_Ctrl[38].bit[2] = 4;
1161 state->Init_Ctrl[38].val[2] = 0;
1162 state->Init_Ctrl[38].addr[3] = 32;
1163 state->Init_Ctrl[38].bit[3] = 5;
1164 state->Init_Ctrl[38].val[3] = 0;
1165 state->Init_Ctrl[38].addr[4] = 32;
1166 state->Init_Ctrl[38].bit[4] = 6;
1167 state->Init_Ctrl[38].val[4] = 1;
1168 state->Init_Ctrl[38].addr[5] = 32;
1169 state->Init_Ctrl[38].bit[5] = 7;
1170 state->Init_Ctrl[38].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001171
Steven Toth3935c252008-05-01 05:45:44 -03001172 state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ;
1173 state->Init_Ctrl[39].size = 1 ;
1174 state->Init_Ctrl[39].addr[0] = 25;
1175 state->Init_Ctrl[39].bit[0] = 3;
1176 state->Init_Ctrl[39].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001177
1178
Steven Toth3935c252008-05-01 05:45:44 -03001179 state->CH_Ctrl_Num = CHCTRL_NUM ;
Steven Toth52c99bd2008-05-01 04:57:01 -03001180
Steven Toth3935c252008-05-01 05:45:44 -03001181 state->CH_Ctrl[0].Ctrl_Num = DN_POLY ;
1182 state->CH_Ctrl[0].size = 2 ;
1183 state->CH_Ctrl[0].addr[0] = 68;
1184 state->CH_Ctrl[0].bit[0] = 6;
1185 state->CH_Ctrl[0].val[0] = 1;
1186 state->CH_Ctrl[0].addr[1] = 68;
1187 state->CH_Ctrl[0].bit[1] = 7;
1188 state->CH_Ctrl[0].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001189
Steven Toth3935c252008-05-01 05:45:44 -03001190 state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ;
1191 state->CH_Ctrl[1].size = 2 ;
1192 state->CH_Ctrl[1].addr[0] = 70;
1193 state->CH_Ctrl[1].bit[0] = 6;
1194 state->CH_Ctrl[1].val[0] = 1;
1195 state->CH_Ctrl[1].addr[1] = 70;
1196 state->CH_Ctrl[1].bit[1] = 7;
1197 state->CH_Ctrl[1].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001198
Steven Toth3935c252008-05-01 05:45:44 -03001199 state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ;
1200 state->CH_Ctrl[2].size = 9 ;
1201 state->CH_Ctrl[2].addr[0] = 69;
1202 state->CH_Ctrl[2].bit[0] = 5;
1203 state->CH_Ctrl[2].val[0] = 0;
1204 state->CH_Ctrl[2].addr[1] = 69;
1205 state->CH_Ctrl[2].bit[1] = 6;
1206 state->CH_Ctrl[2].val[1] = 0;
1207 state->CH_Ctrl[2].addr[2] = 69;
1208 state->CH_Ctrl[2].bit[2] = 7;
1209 state->CH_Ctrl[2].val[2] = 0;
1210 state->CH_Ctrl[2].addr[3] = 68;
1211 state->CH_Ctrl[2].bit[3] = 0;
1212 state->CH_Ctrl[2].val[3] = 0;
1213 state->CH_Ctrl[2].addr[4] = 68;
1214 state->CH_Ctrl[2].bit[4] = 1;
1215 state->CH_Ctrl[2].val[4] = 0;
1216 state->CH_Ctrl[2].addr[5] = 68;
1217 state->CH_Ctrl[2].bit[5] = 2;
1218 state->CH_Ctrl[2].val[5] = 0;
1219 state->CH_Ctrl[2].addr[6] = 68;
1220 state->CH_Ctrl[2].bit[6] = 3;
1221 state->CH_Ctrl[2].val[6] = 0;
1222 state->CH_Ctrl[2].addr[7] = 68;
1223 state->CH_Ctrl[2].bit[7] = 4;
1224 state->CH_Ctrl[2].val[7] = 0;
1225 state->CH_Ctrl[2].addr[8] = 68;
1226 state->CH_Ctrl[2].bit[8] = 5;
1227 state->CH_Ctrl[2].val[8] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001228
Steven Toth3935c252008-05-01 05:45:44 -03001229 state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ;
1230 state->CH_Ctrl[3].size = 1 ;
1231 state->CH_Ctrl[3].addr[0] = 70;
1232 state->CH_Ctrl[3].bit[0] = 5;
1233 state->CH_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001234
Steven Toth3935c252008-05-01 05:45:44 -03001235 state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ;
1236 state->CH_Ctrl[4].size = 3 ;
1237 state->CH_Ctrl[4].addr[0] = 73;
1238 state->CH_Ctrl[4].bit[0] = 4;
1239 state->CH_Ctrl[4].val[0] = 0;
1240 state->CH_Ctrl[4].addr[1] = 73;
1241 state->CH_Ctrl[4].bit[1] = 5;
1242 state->CH_Ctrl[4].val[1] = 1;
1243 state->CH_Ctrl[4].addr[2] = 73;
1244 state->CH_Ctrl[4].bit[2] = 6;
1245 state->CH_Ctrl[4].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001246
Steven Toth3935c252008-05-01 05:45:44 -03001247 state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ;
1248 state->CH_Ctrl[5].size = 4 ;
1249 state->CH_Ctrl[5].addr[0] = 70;
1250 state->CH_Ctrl[5].bit[0] = 0;
1251 state->CH_Ctrl[5].val[0] = 0;
1252 state->CH_Ctrl[5].addr[1] = 70;
1253 state->CH_Ctrl[5].bit[1] = 1;
1254 state->CH_Ctrl[5].val[1] = 0;
1255 state->CH_Ctrl[5].addr[2] = 70;
1256 state->CH_Ctrl[5].bit[2] = 2;
1257 state->CH_Ctrl[5].val[2] = 0;
1258 state->CH_Ctrl[5].addr[3] = 70;
1259 state->CH_Ctrl[5].bit[3] = 3;
1260 state->CH_Ctrl[5].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001261
Steven Toth3935c252008-05-01 05:45:44 -03001262 state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ;
1263 state->CH_Ctrl[6].size = 1 ;
1264 state->CH_Ctrl[6].addr[0] = 70;
1265 state->CH_Ctrl[6].bit[0] = 4;
1266 state->CH_Ctrl[6].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001267
Steven Toth3935c252008-05-01 05:45:44 -03001268 state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ;
1269 state->CH_Ctrl[7].size = 1 ;
1270 state->CH_Ctrl[7].addr[0] = 111;
1271 state->CH_Ctrl[7].bit[0] = 4;
1272 state->CH_Ctrl[7].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001273
Steven Toth3935c252008-05-01 05:45:44 -03001274 state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ;
1275 state->CH_Ctrl[8].size = 1 ;
1276 state->CH_Ctrl[8].addr[0] = 111;
1277 state->CH_Ctrl[8].bit[0] = 7;
1278 state->CH_Ctrl[8].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001279
Steven Toth3935c252008-05-01 05:45:44 -03001280 state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ;
1281 state->CH_Ctrl[9].size = 1 ;
1282 state->CH_Ctrl[9].addr[0] = 111;
1283 state->CH_Ctrl[9].bit[0] = 6;
1284 state->CH_Ctrl[9].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001285
Steven Toth3935c252008-05-01 05:45:44 -03001286 state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ;
1287 state->CH_Ctrl[10].size = 1 ;
1288 state->CH_Ctrl[10].addr[0] = 111;
1289 state->CH_Ctrl[10].bit[0] = 5;
1290 state->CH_Ctrl[10].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001291
Steven Toth3935c252008-05-01 05:45:44 -03001292 state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ;
1293 state->CH_Ctrl[11].size = 2 ;
1294 state->CH_Ctrl[11].addr[0] = 110;
1295 state->CH_Ctrl[11].bit[0] = 0;
1296 state->CH_Ctrl[11].val[0] = 1;
1297 state->CH_Ctrl[11].addr[1] = 110;
1298 state->CH_Ctrl[11].bit[1] = 1;
1299 state->CH_Ctrl[11].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001300
Steven Toth3935c252008-05-01 05:45:44 -03001301 state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ;
1302 state->CH_Ctrl[12].size = 3 ;
1303 state->CH_Ctrl[12].addr[0] = 69;
1304 state->CH_Ctrl[12].bit[0] = 2;
1305 state->CH_Ctrl[12].val[0] = 0;
1306 state->CH_Ctrl[12].addr[1] = 69;
1307 state->CH_Ctrl[12].bit[1] = 3;
1308 state->CH_Ctrl[12].val[1] = 0;
1309 state->CH_Ctrl[12].addr[2] = 69;
1310 state->CH_Ctrl[12].bit[2] = 4;
1311 state->CH_Ctrl[12].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001312
Steven Toth3935c252008-05-01 05:45:44 -03001313 state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ;
1314 state->CH_Ctrl[13].size = 6 ;
1315 state->CH_Ctrl[13].addr[0] = 110;
1316 state->CH_Ctrl[13].bit[0] = 2;
1317 state->CH_Ctrl[13].val[0] = 0;
1318 state->CH_Ctrl[13].addr[1] = 110;
1319 state->CH_Ctrl[13].bit[1] = 3;
1320 state->CH_Ctrl[13].val[1] = 0;
1321 state->CH_Ctrl[13].addr[2] = 110;
1322 state->CH_Ctrl[13].bit[2] = 4;
1323 state->CH_Ctrl[13].val[2] = 0;
1324 state->CH_Ctrl[13].addr[3] = 110;
1325 state->CH_Ctrl[13].bit[3] = 5;
1326 state->CH_Ctrl[13].val[3] = 0;
1327 state->CH_Ctrl[13].addr[4] = 110;
1328 state->CH_Ctrl[13].bit[4] = 6;
1329 state->CH_Ctrl[13].val[4] = 0;
1330 state->CH_Ctrl[13].addr[5] = 110;
1331 state->CH_Ctrl[13].bit[5] = 7;
1332 state->CH_Ctrl[13].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001333
Steven Toth3935c252008-05-01 05:45:44 -03001334 state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ;
1335 state->CH_Ctrl[14].size = 7 ;
1336 state->CH_Ctrl[14].addr[0] = 14;
1337 state->CH_Ctrl[14].bit[0] = 0;
1338 state->CH_Ctrl[14].val[0] = 0;
1339 state->CH_Ctrl[14].addr[1] = 14;
1340 state->CH_Ctrl[14].bit[1] = 1;
1341 state->CH_Ctrl[14].val[1] = 0;
1342 state->CH_Ctrl[14].addr[2] = 14;
1343 state->CH_Ctrl[14].bit[2] = 2;
1344 state->CH_Ctrl[14].val[2] = 0;
1345 state->CH_Ctrl[14].addr[3] = 14;
1346 state->CH_Ctrl[14].bit[3] = 3;
1347 state->CH_Ctrl[14].val[3] = 0;
1348 state->CH_Ctrl[14].addr[4] = 14;
1349 state->CH_Ctrl[14].bit[4] = 4;
1350 state->CH_Ctrl[14].val[4] = 0;
1351 state->CH_Ctrl[14].addr[5] = 14;
1352 state->CH_Ctrl[14].bit[5] = 5;
1353 state->CH_Ctrl[14].val[5] = 0;
1354 state->CH_Ctrl[14].addr[6] = 14;
1355 state->CH_Ctrl[14].bit[6] = 6;
1356 state->CH_Ctrl[14].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001357
Steven Toth3935c252008-05-01 05:45:44 -03001358 state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ;
1359 state->CH_Ctrl[15].size = 18 ;
1360 state->CH_Ctrl[15].addr[0] = 17;
1361 state->CH_Ctrl[15].bit[0] = 6;
1362 state->CH_Ctrl[15].val[0] = 0;
1363 state->CH_Ctrl[15].addr[1] = 17;
1364 state->CH_Ctrl[15].bit[1] = 7;
1365 state->CH_Ctrl[15].val[1] = 0;
1366 state->CH_Ctrl[15].addr[2] = 16;
1367 state->CH_Ctrl[15].bit[2] = 0;
1368 state->CH_Ctrl[15].val[2] = 0;
1369 state->CH_Ctrl[15].addr[3] = 16;
1370 state->CH_Ctrl[15].bit[3] = 1;
1371 state->CH_Ctrl[15].val[3] = 0;
1372 state->CH_Ctrl[15].addr[4] = 16;
1373 state->CH_Ctrl[15].bit[4] = 2;
1374 state->CH_Ctrl[15].val[4] = 0;
1375 state->CH_Ctrl[15].addr[5] = 16;
1376 state->CH_Ctrl[15].bit[5] = 3;
1377 state->CH_Ctrl[15].val[5] = 0;
1378 state->CH_Ctrl[15].addr[6] = 16;
1379 state->CH_Ctrl[15].bit[6] = 4;
1380 state->CH_Ctrl[15].val[6] = 0;
1381 state->CH_Ctrl[15].addr[7] = 16;
1382 state->CH_Ctrl[15].bit[7] = 5;
1383 state->CH_Ctrl[15].val[7] = 0;
1384 state->CH_Ctrl[15].addr[8] = 16;
1385 state->CH_Ctrl[15].bit[8] = 6;
1386 state->CH_Ctrl[15].val[8] = 0;
1387 state->CH_Ctrl[15].addr[9] = 16;
1388 state->CH_Ctrl[15].bit[9] = 7;
1389 state->CH_Ctrl[15].val[9] = 0;
1390 state->CH_Ctrl[15].addr[10] = 15;
1391 state->CH_Ctrl[15].bit[10] = 0;
1392 state->CH_Ctrl[15].val[10] = 0;
1393 state->CH_Ctrl[15].addr[11] = 15;
1394 state->CH_Ctrl[15].bit[11] = 1;
1395 state->CH_Ctrl[15].val[11] = 0;
1396 state->CH_Ctrl[15].addr[12] = 15;
1397 state->CH_Ctrl[15].bit[12] = 2;
1398 state->CH_Ctrl[15].val[12] = 0;
1399 state->CH_Ctrl[15].addr[13] = 15;
1400 state->CH_Ctrl[15].bit[13] = 3;
1401 state->CH_Ctrl[15].val[13] = 0;
1402 state->CH_Ctrl[15].addr[14] = 15;
1403 state->CH_Ctrl[15].bit[14] = 4;
1404 state->CH_Ctrl[15].val[14] = 0;
1405 state->CH_Ctrl[15].addr[15] = 15;
1406 state->CH_Ctrl[15].bit[15] = 5;
1407 state->CH_Ctrl[15].val[15] = 0;
1408 state->CH_Ctrl[15].addr[16] = 15;
1409 state->CH_Ctrl[15].bit[16] = 6;
1410 state->CH_Ctrl[15].val[16] = 1;
1411 state->CH_Ctrl[15].addr[17] = 15;
1412 state->CH_Ctrl[15].bit[17] = 7;
1413 state->CH_Ctrl[15].val[17] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001414
Steven Toth3935c252008-05-01 05:45:44 -03001415 state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ;
1416 state->CH_Ctrl[16].size = 5 ;
1417 state->CH_Ctrl[16].addr[0] = 112;
1418 state->CH_Ctrl[16].bit[0] = 0;
1419 state->CH_Ctrl[16].val[0] = 0;
1420 state->CH_Ctrl[16].addr[1] = 112;
1421 state->CH_Ctrl[16].bit[1] = 1;
1422 state->CH_Ctrl[16].val[1] = 0;
1423 state->CH_Ctrl[16].addr[2] = 112;
1424 state->CH_Ctrl[16].bit[2] = 2;
1425 state->CH_Ctrl[16].val[2] = 0;
1426 state->CH_Ctrl[16].addr[3] = 112;
1427 state->CH_Ctrl[16].bit[3] = 3;
1428 state->CH_Ctrl[16].val[3] = 0;
1429 state->CH_Ctrl[16].addr[4] = 112;
1430 state->CH_Ctrl[16].bit[4] = 4;
1431 state->CH_Ctrl[16].val[4] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001432
Steven Toth3935c252008-05-01 05:45:44 -03001433 state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ;
1434 state->CH_Ctrl[17].size = 1 ;
1435 state->CH_Ctrl[17].addr[0] = 14;
1436 state->CH_Ctrl[17].bit[0] = 7;
1437 state->CH_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001438
Steven Toth3935c252008-05-01 05:45:44 -03001439 state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ;
1440 state->CH_Ctrl[18].size = 4 ;
1441 state->CH_Ctrl[18].addr[0] = 107;
1442 state->CH_Ctrl[18].bit[0] = 3;
1443 state->CH_Ctrl[18].val[0] = 0;
1444 state->CH_Ctrl[18].addr[1] = 107;
1445 state->CH_Ctrl[18].bit[1] = 4;
1446 state->CH_Ctrl[18].val[1] = 0;
1447 state->CH_Ctrl[18].addr[2] = 107;
1448 state->CH_Ctrl[18].bit[2] = 5;
1449 state->CH_Ctrl[18].val[2] = 0;
1450 state->CH_Ctrl[18].addr[3] = 107;
1451 state->CH_Ctrl[18].bit[3] = 6;
1452 state->CH_Ctrl[18].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001453
Steven Toth3935c252008-05-01 05:45:44 -03001454 state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ;
1455 state->CH_Ctrl[19].size = 3 ;
1456 state->CH_Ctrl[19].addr[0] = 107;
1457 state->CH_Ctrl[19].bit[0] = 7;
1458 state->CH_Ctrl[19].val[0] = 1;
1459 state->CH_Ctrl[19].addr[1] = 106;
1460 state->CH_Ctrl[19].bit[1] = 0;
1461 state->CH_Ctrl[19].val[1] = 1;
1462 state->CH_Ctrl[19].addr[2] = 106;
1463 state->CH_Ctrl[19].bit[2] = 1;
1464 state->CH_Ctrl[19].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001465
Steven Toth3935c252008-05-01 05:45:44 -03001466 state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ;
1467 state->CH_Ctrl[20].size = 11 ;
1468 state->CH_Ctrl[20].addr[0] = 109;
1469 state->CH_Ctrl[20].bit[0] = 2;
1470 state->CH_Ctrl[20].val[0] = 0;
1471 state->CH_Ctrl[20].addr[1] = 109;
1472 state->CH_Ctrl[20].bit[1] = 3;
1473 state->CH_Ctrl[20].val[1] = 0;
1474 state->CH_Ctrl[20].addr[2] = 109;
1475 state->CH_Ctrl[20].bit[2] = 4;
1476 state->CH_Ctrl[20].val[2] = 0;
1477 state->CH_Ctrl[20].addr[3] = 109;
1478 state->CH_Ctrl[20].bit[3] = 5;
1479 state->CH_Ctrl[20].val[3] = 0;
1480 state->CH_Ctrl[20].addr[4] = 109;
1481 state->CH_Ctrl[20].bit[4] = 6;
1482 state->CH_Ctrl[20].val[4] = 0;
1483 state->CH_Ctrl[20].addr[5] = 109;
1484 state->CH_Ctrl[20].bit[5] = 7;
1485 state->CH_Ctrl[20].val[5] = 0;
1486 state->CH_Ctrl[20].addr[6] = 108;
1487 state->CH_Ctrl[20].bit[6] = 0;
1488 state->CH_Ctrl[20].val[6] = 0;
1489 state->CH_Ctrl[20].addr[7] = 108;
1490 state->CH_Ctrl[20].bit[7] = 1;
1491 state->CH_Ctrl[20].val[7] = 0;
1492 state->CH_Ctrl[20].addr[8] = 108;
1493 state->CH_Ctrl[20].bit[8] = 2;
1494 state->CH_Ctrl[20].val[8] = 1;
1495 state->CH_Ctrl[20].addr[9] = 108;
1496 state->CH_Ctrl[20].bit[9] = 3;
1497 state->CH_Ctrl[20].val[9] = 1;
1498 state->CH_Ctrl[20].addr[10] = 108;
1499 state->CH_Ctrl[20].bit[10] = 4;
1500 state->CH_Ctrl[20].val[10] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001501
Steven Toth3935c252008-05-01 05:45:44 -03001502 state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ;
1503 state->CH_Ctrl[21].size = 6 ;
1504 state->CH_Ctrl[21].addr[0] = 106;
1505 state->CH_Ctrl[21].bit[0] = 2;
1506 state->CH_Ctrl[21].val[0] = 0;
1507 state->CH_Ctrl[21].addr[1] = 106;
1508 state->CH_Ctrl[21].bit[1] = 3;
1509 state->CH_Ctrl[21].val[1] = 0;
1510 state->CH_Ctrl[21].addr[2] = 106;
1511 state->CH_Ctrl[21].bit[2] = 4;
1512 state->CH_Ctrl[21].val[2] = 0;
1513 state->CH_Ctrl[21].addr[3] = 106;
1514 state->CH_Ctrl[21].bit[3] = 5;
1515 state->CH_Ctrl[21].val[3] = 0;
1516 state->CH_Ctrl[21].addr[4] = 106;
1517 state->CH_Ctrl[21].bit[4] = 6;
1518 state->CH_Ctrl[21].val[4] = 0;
1519 state->CH_Ctrl[21].addr[5] = 106;
1520 state->CH_Ctrl[21].bit[5] = 7;
1521 state->CH_Ctrl[21].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001522
Steven Toth3935c252008-05-01 05:45:44 -03001523 state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ;
1524 state->CH_Ctrl[22].size = 1 ;
1525 state->CH_Ctrl[22].addr[0] = 138;
1526 state->CH_Ctrl[22].bit[0] = 4;
1527 state->CH_Ctrl[22].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001528
Steven Toth3935c252008-05-01 05:45:44 -03001529 state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ;
1530 state->CH_Ctrl[23].size = 1 ;
1531 state->CH_Ctrl[23].addr[0] = 17;
1532 state->CH_Ctrl[23].bit[0] = 5;
1533 state->CH_Ctrl[23].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001534
Steven Toth3935c252008-05-01 05:45:44 -03001535 state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ;
1536 state->CH_Ctrl[24].size = 1 ;
1537 state->CH_Ctrl[24].addr[0] = 111;
1538 state->CH_Ctrl[24].bit[0] = 3;
1539 state->CH_Ctrl[24].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001540
Steven Toth3935c252008-05-01 05:45:44 -03001541 state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ;
1542 state->CH_Ctrl[25].size = 1 ;
1543 state->CH_Ctrl[25].addr[0] = 112;
1544 state->CH_Ctrl[25].bit[0] = 7;
1545 state->CH_Ctrl[25].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001546
Steven Toth3935c252008-05-01 05:45:44 -03001547 state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ;
1548 state->CH_Ctrl[26].size = 1 ;
1549 state->CH_Ctrl[26].addr[0] = 136;
1550 state->CH_Ctrl[26].bit[0] = 7;
1551 state->CH_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001552
Steven Toth3935c252008-05-01 05:45:44 -03001553 state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ;
1554 state->CH_Ctrl[27].size = 1 ;
1555 state->CH_Ctrl[27].addr[0] = 149;
1556 state->CH_Ctrl[27].bit[0] = 7;
1557 state->CH_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001558
Steven Toth3935c252008-05-01 05:45:44 -03001559 state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ;
1560 state->CH_Ctrl[28].size = 1 ;
1561 state->CH_Ctrl[28].addr[0] = 149;
1562 state->CH_Ctrl[28].bit[0] = 6;
1563 state->CH_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001564
Steven Toth3935c252008-05-01 05:45:44 -03001565 state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ;
1566 state->CH_Ctrl[29].size = 1 ;
1567 state->CH_Ctrl[29].addr[0] = 149;
1568 state->CH_Ctrl[29].bit[0] = 5;
1569 state->CH_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001570
Steven Toth3935c252008-05-01 05:45:44 -03001571 state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ;
1572 state->CH_Ctrl[30].size = 1 ;
1573 state->CH_Ctrl[30].addr[0] = 149;
1574 state->CH_Ctrl[30].bit[0] = 4;
1575 state->CH_Ctrl[30].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001576
Steven Toth3935c252008-05-01 05:45:44 -03001577 state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ;
1578 state->CH_Ctrl[31].size = 1 ;
1579 state->CH_Ctrl[31].addr[0] = 149;
1580 state->CH_Ctrl[31].bit[0] = 3;
1581 state->CH_Ctrl[31].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001582
Steven Toth3935c252008-05-01 05:45:44 -03001583 state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ;
1584 state->CH_Ctrl[32].size = 1 ;
1585 state->CH_Ctrl[32].addr[0] = 93;
1586 state->CH_Ctrl[32].bit[0] = 1;
1587 state->CH_Ctrl[32].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001588
Steven Toth3935c252008-05-01 05:45:44 -03001589 state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ;
1590 state->CH_Ctrl[33].size = 1 ;
1591 state->CH_Ctrl[33].addr[0] = 93;
1592 state->CH_Ctrl[33].bit[0] = 0;
1593 state->CH_Ctrl[33].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001594
Steven Toth3935c252008-05-01 05:45:44 -03001595 state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ;
1596 state->CH_Ctrl[34].size = 6 ;
1597 state->CH_Ctrl[34].addr[0] = 92;
1598 state->CH_Ctrl[34].bit[0] = 2;
1599 state->CH_Ctrl[34].val[0] = 0;
1600 state->CH_Ctrl[34].addr[1] = 92;
1601 state->CH_Ctrl[34].bit[1] = 3;
1602 state->CH_Ctrl[34].val[1] = 0;
1603 state->CH_Ctrl[34].addr[2] = 92;
1604 state->CH_Ctrl[34].bit[2] = 4;
1605 state->CH_Ctrl[34].val[2] = 0;
1606 state->CH_Ctrl[34].addr[3] = 92;
1607 state->CH_Ctrl[34].bit[3] = 5;
1608 state->CH_Ctrl[34].val[3] = 0;
1609 state->CH_Ctrl[34].addr[4] = 92;
1610 state->CH_Ctrl[34].bit[4] = 6;
1611 state->CH_Ctrl[34].val[4] = 0;
1612 state->CH_Ctrl[34].addr[5] = 92;
1613 state->CH_Ctrl[34].bit[5] = 7;
1614 state->CH_Ctrl[34].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001615
Steven Toth3935c252008-05-01 05:45:44 -03001616 state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ;
1617 state->CH_Ctrl[35].size = 6 ;
1618 state->CH_Ctrl[35].addr[0] = 93;
1619 state->CH_Ctrl[35].bit[0] = 2;
1620 state->CH_Ctrl[35].val[0] = 0;
1621 state->CH_Ctrl[35].addr[1] = 93;
1622 state->CH_Ctrl[35].bit[1] = 3;
1623 state->CH_Ctrl[35].val[1] = 0;
1624 state->CH_Ctrl[35].addr[2] = 93;
1625 state->CH_Ctrl[35].bit[2] = 4;
1626 state->CH_Ctrl[35].val[2] = 0;
1627 state->CH_Ctrl[35].addr[3] = 93;
1628 state->CH_Ctrl[35].bit[3] = 5;
1629 state->CH_Ctrl[35].val[3] = 0;
1630 state->CH_Ctrl[35].addr[4] = 93;
1631 state->CH_Ctrl[35].bit[4] = 6;
1632 state->CH_Ctrl[35].val[4] = 0;
1633 state->CH_Ctrl[35].addr[5] = 93;
1634 state->CH_Ctrl[35].bit[5] = 7;
1635 state->CH_Ctrl[35].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001636
1637#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03001638 state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ;
1639 state->CH_Ctrl[36].size = 1 ;
1640 state->CH_Ctrl[36].addr[0] = 109;
1641 state->CH_Ctrl[36].bit[0] = 1;
1642 state->CH_Ctrl[36].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001643
Steven Toth3935c252008-05-01 05:45:44 -03001644 state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ;
1645 state->CH_Ctrl[37].size = 2 ;
1646 state->CH_Ctrl[37].addr[0] = 112;
1647 state->CH_Ctrl[37].bit[0] = 5;
1648 state->CH_Ctrl[37].val[0] = 0;
1649 state->CH_Ctrl[37].addr[1] = 112;
1650 state->CH_Ctrl[37].bit[1] = 6;
1651 state->CH_Ctrl[37].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001652
Steven Toth3935c252008-05-01 05:45:44 -03001653 state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ;
1654 state->CH_Ctrl[38].size = 1 ;
1655 state->CH_Ctrl[38].addr[0] = 65;
1656 state->CH_Ctrl[38].bit[0] = 1;
1657 state->CH_Ctrl[38].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001658#endif
1659
1660 return 0 ;
1661}
1662
Steven Tothc6c34b12008-05-03 14:14:54 -03001663static void InitTunerControls(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001664{
Steven Toth3935c252008-05-01 05:45:44 -03001665 MXL5005_RegisterInit(fe);
1666 MXL5005_ControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001667#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03001668 MXL5005_MXLControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001669#endif
1670}
1671
Steven Tothc6c34b12008-05-03 14:14:54 -03001672static u16 MXL5005_TunerConfig(struct dvb_frontend *fe,
Steven Tothd2110172008-05-01 19:35:54 -03001673 u8 Mode, /* 0: Analog Mode ; 1: Digital Mode */
1674 u8 IF_mode, /* for Analog Mode, 0: zero IF; 1: low IF */
1675 u32 Bandwidth, /* filter channel bandwidth (6, 7, 8) */
1676 u32 IF_out, /* Desired IF Out Frequency */
1677 u32 Fxtal, /* XTAL Frequency */
1678 u8 AGC_Mode, /* AGC Mode - Dual AGC: 0, Single AGC: 1 */
1679 u16 TOP, /* 0: Dual AGC; Value: take over point */
1680 u16 IF_OUT_LOAD, /* IF Out Load Resistor (200 / 300 Ohms) */
1681 u8 CLOCK_OUT, /* 0: turn off clk out; 1: turn on clock out */
1682 u8 DIV_OUT, /* 0: Div-1; 1: Div-4 */
1683 u8 CAPSELECT, /* 0: disable On-Chip pulling cap; 1: enable */
1684 u8 EN_RSSI, /* 0: disable RSSI; 1: enable RSSI */
1685
1686 /* Modulation Type; */
1687 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
1688 u8 Mod_Type,
1689
1690 /* Tracking Filter */
1691 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
1692 u8 TF_Type
1693 )
Steven Toth52c99bd2008-05-01 04:57:01 -03001694{
Steven Toth85d220d2008-05-01 05:48:14 -03001695 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001696 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001697
Steven Toth3935c252008-05-01 05:45:44 -03001698 state->Mode = Mode;
1699 state->IF_Mode = IF_mode;
1700 state->Chan_Bandwidth = Bandwidth;
1701 state->IF_OUT = IF_out;
1702 state->Fxtal = Fxtal;
1703 state->AGC_Mode = AGC_Mode;
1704 state->TOP = TOP;
1705 state->IF_OUT_LOAD = IF_OUT_LOAD;
1706 state->CLOCK_OUT = CLOCK_OUT;
1707 state->DIV_OUT = DIV_OUT;
1708 state->CAPSELECT = CAPSELECT;
1709 state->EN_RSSI = EN_RSSI;
1710 state->Mod_Type = Mod_Type;
1711 state->TF_Type = TF_Type;
Steven Toth52c99bd2008-05-01 04:57:01 -03001712
Steven Totha8214d42008-05-01 05:02:58 -03001713 /* Initialize all the controls and registers */
Steven Toth3935c252008-05-01 05:45:44 -03001714 InitTunerControls(fe);
Steven Totha8214d42008-05-01 05:02:58 -03001715
1716 /* Synthesizer LO frequency calculation */
Steven Toth3935c252008-05-01 05:45:44 -03001717 MXL_SynthIFLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001718
Steven Toth3935c252008-05-01 05:45:44 -03001719 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001720}
1721
Steven Tothc6c34b12008-05-03 14:14:54 -03001722static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001723{
Steven Toth85d220d2008-05-01 05:48:14 -03001724 struct mxl5005s_state *state = fe->tuner_priv;
1725 if (state->Mode == 1) /* Digital Mode */
Steven Toth3935c252008-05-01 05:45:44 -03001726 state->IF_LO = state->IF_OUT;
Steven Tothd2110172008-05-01 19:35:54 -03001727 else /* Analog Mode */ {
1728 if (state->IF_Mode == 0) /* Analog Zero IF mode */
Steven Toth3935c252008-05-01 05:45:44 -03001729 state->IF_LO = state->IF_OUT + 400000;
1730 else /* Analog Low IF mode */
1731 state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2;
Steven Toth52c99bd2008-05-01 04:57:01 -03001732 }
1733}
1734
Steven Tothc6c34b12008-05-03 14:14:54 -03001735static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001736{
Steven Toth85d220d2008-05-01 05:48:14 -03001737 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001738
1739 if (state->Mode == 1) /* Digital Mode */ {
Steven Tothd2110172008-05-01 19:35:54 -03001740 /* remove 20.48MHz setting for 2.6.10 */
Steven Toth3935c252008-05-01 05:45:44 -03001741 state->RF_LO = state->RF_IN;
Steven Tothd2110172008-05-01 19:35:54 -03001742 /* change for 2.6.6 */
1743 state->TG_LO = state->RF_IN - 750000;
Steven Toth3935c252008-05-01 05:45:44 -03001744 } else /* Analog Mode */ {
Steven Tothd2110172008-05-01 19:35:54 -03001745 if (state->IF_Mode == 0) /* Analog Zero IF mode */ {
Steven Toth3935c252008-05-01 05:45:44 -03001746 state->RF_LO = state->RF_IN - 400000;
1747 state->TG_LO = state->RF_IN - 1750000;
1748 } else /* Analog Low IF mode */ {
1749 state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2;
Steven Tothd2110172008-05-01 19:35:54 -03001750 state->TG_LO = state->RF_IN -
1751 state->Chan_Bandwidth + 500000;
Steven Toth52c99bd2008-05-01 04:57:01 -03001752 }
1753 }
1754}
1755
Steven Tothc6c34b12008-05-03 14:14:54 -03001756static u16 MXL_OverwriteICDefault(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001757{
Steven Toth3935c252008-05-01 05:45:44 -03001758 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001759
Steven Toth3935c252008-05-01 05:45:44 -03001760 status += MXL_ControlWrite(fe, OVERRIDE_1, 1);
1761 status += MXL_ControlWrite(fe, OVERRIDE_2, 1);
1762 status += MXL_ControlWrite(fe, OVERRIDE_3, 1);
1763 status += MXL_ControlWrite(fe, OVERRIDE_4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001764
Steven Toth3935c252008-05-01 05:45:44 -03001765 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001766}
1767
Steven Tothc6c34b12008-05-03 14:14:54 -03001768static u16 MXL_BlockInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001769{
Steven Toth85d220d2008-05-01 05:48:14 -03001770 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001771 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001772
Steven Toth3935c252008-05-01 05:45:44 -03001773 status += MXL_OverwriteICDefault(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001774
Steven Toth3935c252008-05-01 05:45:44 -03001775 /* Downconverter Control Dig Ana */
1776 status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001777
Steven Toth3935c252008-05-01 05:45:44 -03001778 /* Filter Control Dig Ana */
1779 status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1);
1780 status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2);
1781 status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0);
1782 status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1);
1783 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001784
Steven Toth3935c252008-05-01 05:45:44 -03001785 /* Initialize Low-Pass Filter */
1786 if (state->Mode) { /* Digital Mode */
1787 switch (state->Chan_Bandwidth) {
Steven Tothd2110172008-05-01 19:35:54 -03001788 case 8000000:
1789 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0);
1790 break;
1791 case 7000000:
1792 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2);
1793 break;
1794 case 6000000:
1795 status += MXL_ControlWrite(fe,
1796 BB_DLPF_BANDSEL, 3);
1797 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001798 }
Steven Toth3935c252008-05-01 05:45:44 -03001799 } else { /* Analog Mode */
1800 switch (state->Chan_Bandwidth) {
Steven Tothd2110172008-05-01 19:35:54 -03001801 case 8000000: /* Low Zero */
1802 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1803 (state->IF_Mode ? 0 : 3));
1804 break;
1805 case 7000000:
1806 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1807 (state->IF_Mode ? 1 : 4));
1808 break;
1809 case 6000000:
1810 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1811 (state->IF_Mode ? 2 : 5));
1812 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03001813 }
1814 }
1815
Steven Toth3935c252008-05-01 05:45:44 -03001816 /* Charge Pump Control Dig Ana */
Steven Tothd2110172008-05-01 19:35:54 -03001817 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8);
1818 status += MXL_ControlWrite(fe,
1819 RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1);
Steven Toth3935c252008-05-01 05:45:44 -03001820 status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001821
Steven Toth3935c252008-05-01 05:45:44 -03001822 /* AGC TOP Control */
1823 if (state->AGC_Mode == 0) /* Dual AGC */ {
1824 status += MXL_ControlWrite(fe, AGC_IF, 15);
1825 status += MXL_ControlWrite(fe, AGC_RF, 15);
Steven Tothd2110172008-05-01 19:35:54 -03001826 } else /* Single AGC Mode Dig Ana */
Steven Toth3935c252008-05-01 05:45:44 -03001827 status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03001828
Steven Toth3935c252008-05-01 05:45:44 -03001829 if (state->TOP == 55) /* TOP == 5.5 */
1830 status += MXL_ControlWrite(fe, AGC_IF, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001831
Steven Toth3935c252008-05-01 05:45:44 -03001832 if (state->TOP == 72) /* TOP == 7.2 */
1833 status += MXL_ControlWrite(fe, AGC_IF, 0x1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001834
Steven Toth3935c252008-05-01 05:45:44 -03001835 if (state->TOP == 92) /* TOP == 9.2 */
1836 status += MXL_ControlWrite(fe, AGC_IF, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03001837
Steven Toth3935c252008-05-01 05:45:44 -03001838 if (state->TOP == 110) /* TOP == 11.0 */
1839 status += MXL_ControlWrite(fe, AGC_IF, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03001840
Steven Toth3935c252008-05-01 05:45:44 -03001841 if (state->TOP == 129) /* TOP == 12.9 */
1842 status += MXL_ControlWrite(fe, AGC_IF, 0x4);
Steven Toth52c99bd2008-05-01 04:57:01 -03001843
Steven Toth3935c252008-05-01 05:45:44 -03001844 if (state->TOP == 147) /* TOP == 14.7 */
1845 status += MXL_ControlWrite(fe, AGC_IF, 0x5);
Steven Toth52c99bd2008-05-01 04:57:01 -03001846
Steven Toth3935c252008-05-01 05:45:44 -03001847 if (state->TOP == 168) /* TOP == 16.8 */
1848 status += MXL_ControlWrite(fe, AGC_IF, 0x6);
Steven Toth52c99bd2008-05-01 04:57:01 -03001849
Steven Toth3935c252008-05-01 05:45:44 -03001850 if (state->TOP == 194) /* TOP == 19.4 */
1851 status += MXL_ControlWrite(fe, AGC_IF, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03001852
Steven Toth3935c252008-05-01 05:45:44 -03001853 if (state->TOP == 212) /* TOP == 21.2 */
1854 status += MXL_ControlWrite(fe, AGC_IF, 0x9);
Steven Toth52c99bd2008-05-01 04:57:01 -03001855
Steven Toth3935c252008-05-01 05:45:44 -03001856 if (state->TOP == 232) /* TOP == 23.2 */
1857 status += MXL_ControlWrite(fe, AGC_IF, 0xA);
Steven Toth52c99bd2008-05-01 04:57:01 -03001858
Steven Toth3935c252008-05-01 05:45:44 -03001859 if (state->TOP == 252) /* TOP == 25.2 */
1860 status += MXL_ControlWrite(fe, AGC_IF, 0xB);
Steven Toth52c99bd2008-05-01 04:57:01 -03001861
Steven Toth3935c252008-05-01 05:45:44 -03001862 if (state->TOP == 271) /* TOP == 27.1 */
1863 status += MXL_ControlWrite(fe, AGC_IF, 0xC);
Steven Toth52c99bd2008-05-01 04:57:01 -03001864
Steven Toth3935c252008-05-01 05:45:44 -03001865 if (state->TOP == 292) /* TOP == 29.2 */
1866 status += MXL_ControlWrite(fe, AGC_IF, 0xD);
Steven Toth52c99bd2008-05-01 04:57:01 -03001867
Steven Toth3935c252008-05-01 05:45:44 -03001868 if (state->TOP == 317) /* TOP == 31.7 */
1869 status += MXL_ControlWrite(fe, AGC_IF, 0xE);
Steven Toth52c99bd2008-05-01 04:57:01 -03001870
Steven Toth3935c252008-05-01 05:45:44 -03001871 if (state->TOP == 349) /* TOP == 34.9 */
1872 status += MXL_ControlWrite(fe, AGC_IF, 0xF);
Steven Toth52c99bd2008-05-01 04:57:01 -03001873
Steven Toth3935c252008-05-01 05:45:44 -03001874 /* IF Synthesizer Control */
1875 status += MXL_IFSynthInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001876
Steven Toth3935c252008-05-01 05:45:44 -03001877 /* IF UpConverter Control */
1878 if (state->IF_OUT_LOAD == 200) {
1879 status += MXL_ControlWrite(fe, DRV_RES_SEL, 6);
1880 status += MXL_ControlWrite(fe, I_DRIVER, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03001881 }
Steven Toth3935c252008-05-01 05:45:44 -03001882 if (state->IF_OUT_LOAD == 300) {
1883 status += MXL_ControlWrite(fe, DRV_RES_SEL, 4);
1884 status += MXL_ControlWrite(fe, I_DRIVER, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001885 }
1886
Steven Toth3935c252008-05-01 05:45:44 -03001887 /* Anti-Alias Filtering Control
1888 * initialise Anti-Aliasing Filter
1889 */
1890 if (state->Mode) { /* Digital Mode */
1891 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) {
1892 status += MXL_ControlWrite(fe, EN_AAF, 1);
1893 status += MXL_ControlWrite(fe, EN_3P, 1);
1894 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1895 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001896 }
Steven Tothd2110172008-05-01 19:35:54 -03001897 if ((state->IF_OUT == 36125000UL) ||
1898 (state->IF_OUT == 36150000UL)) {
Steven Toth3935c252008-05-01 05:45:44 -03001899 status += MXL_ControlWrite(fe, EN_AAF, 1);
1900 status += MXL_ControlWrite(fe, EN_3P, 1);
1901 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1902 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001903 }
Steven Toth3935c252008-05-01 05:45:44 -03001904 if (state->IF_OUT > 36150000UL) {
1905 status += MXL_ControlWrite(fe, EN_AAF, 0);
1906 status += MXL_ControlWrite(fe, EN_3P, 1);
1907 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1908 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001909 }
Steven Toth3935c252008-05-01 05:45:44 -03001910 } else { /* Analog Mode */
Steven Tothd2110172008-05-01 19:35:54 -03001911 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03001912 status += MXL_ControlWrite(fe, EN_AAF, 1);
1913 status += MXL_ControlWrite(fe, EN_3P, 1);
1914 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1915 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001916 }
Steven Tothd2110172008-05-01 19:35:54 -03001917 if (state->IF_OUT > 5000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03001918 status += MXL_ControlWrite(fe, EN_AAF, 0);
1919 status += MXL_ControlWrite(fe, EN_3P, 0);
1920 status += MXL_ControlWrite(fe, EN_AUX_3P, 0);
1921 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001922 }
1923 }
1924
Steven Toth3935c252008-05-01 05:45:44 -03001925 /* Demod Clock Out */
1926 if (state->CLOCK_OUT)
1927 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001928 else
Steven Toth3935c252008-05-01 05:45:44 -03001929 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001930
Steven Toth3935c252008-05-01 05:45:44 -03001931 if (state->DIV_OUT == 1)
1932 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1);
1933 if (state->DIV_OUT == 0)
1934 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001935
Steven Toth3935c252008-05-01 05:45:44 -03001936 /* Crystal Control */
1937 if (state->CAPSELECT)
1938 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001939 else
Steven Toth3935c252008-05-01 05:45:44 -03001940 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001941
Steven Toth3935c252008-05-01 05:45:44 -03001942 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
1943 status += MXL_ControlWrite(fe, IF_SEL_DBL, 1);
1944 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
1945 status += MXL_ControlWrite(fe, IF_SEL_DBL, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001946
Steven Toth3935c252008-05-01 05:45:44 -03001947 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
1948 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3);
1949 if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL)
1950 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001951
Steven Toth3935c252008-05-01 05:45:44 -03001952 /* Misc Controls */
Steven Toth85d220d2008-05-01 05:48:14 -03001953 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */
Steven Toth3935c252008-05-01 05:45:44 -03001954 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03001955 else
Steven Toth3935c252008-05-01 05:45:44 -03001956 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001957
Steven Toth3935c252008-05-01 05:45:44 -03001958 /* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */
Steven Toth52c99bd2008-05-01 04:57:01 -03001959
Steven Toth3935c252008-05-01 05:45:44 -03001960 /* Set TG_R_DIV */
Steven Tothd2110172008-05-01 19:35:54 -03001961 status += MXL_ControlWrite(fe, TG_R_DIV,
1962 MXL_Ceiling(state->Fxtal, 1000000));
Steven Toth52c99bd2008-05-01 04:57:01 -03001963
Steven Toth3935c252008-05-01 05:45:44 -03001964 /* Apply Default value to BB_INITSTATE_DLPF_TUNE */
Steven Toth52c99bd2008-05-01 04:57:01 -03001965
Steven Toth3935c252008-05-01 05:45:44 -03001966 /* RSSI Control */
Steven Tothd2110172008-05-01 19:35:54 -03001967 if (state->EN_RSSI) {
Steven Toth3935c252008-05-01 05:45:44 -03001968 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
1969 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
1970 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
1971 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
1972
1973 /* RSSI reference point */
1974 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
1975 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3);
1976 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
1977
1978 /* TOP point */
1979 status += MXL_ControlWrite(fe, RFA_FLR, 0);
1980 status += MXL_ControlWrite(fe, RFA_CEIL, 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03001981 }
1982
Steven Toth3935c252008-05-01 05:45:44 -03001983 /* Modulation type bit settings
1984 * Override the control values preset
1985 */
Steven Tothd2110172008-05-01 19:35:54 -03001986 if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */ {
Steven Toth3935c252008-05-01 05:45:44 -03001987 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03001988
Steven Toth3935c252008-05-01 05:45:44 -03001989 /* Enable RSSI */
1990 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
1991 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
1992 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
1993 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
1994
1995 /* RSSI reference point */
1996 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
1997 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
1998 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
1999
2000 /* TOP point */
2001 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2002 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2003 if (state->IF_OUT <= 6280000UL) /* Low IF */
2004 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2005 else /* High IF */
2006 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002007
2008 }
Steven Tothd2110172008-05-01 19:35:54 -03002009 if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */ {
Steven Toth85d220d2008-05-01 05:48:14 -03002010 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002011
Steven Toth3935c252008-05-01 05:45:44 -03002012 /* Enable RSSI */
2013 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2014 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2015 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2016 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002017
Steven Toth3935c252008-05-01 05:45:44 -03002018 /* RSSI reference point */
2019 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2020 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4);
2021 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2022
2023 /* TOP point */
2024 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2025 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2026 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1);
Steven Tothd2110172008-05-01 19:35:54 -03002027 /* Low Zero */
2028 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);
2029
Steven Toth3935c252008-05-01 05:45:44 -03002030 if (state->IF_OUT <= 6280000UL) /* Low IF */
2031 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2032 else /* High IF */
2033 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002034 }
Steven Tothd2110172008-05-01 19:35:54 -03002035 if (state->Mod_Type == MXL_QAM) /* QAM Mode */ {
Steven Toth3935c252008-05-01 05:45:44 -03002036 state->Mode = MXL_DIGITAL_MODE;
Steven Toth52c99bd2008-05-01 04:57:01 -03002037
Steven Toth3935c252008-05-01 05:45:44 -03002038 /* state->AGC_Mode = 1; */ /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002039
Steven Toth3935c252008-05-01 05:45:44 -03002040 /* Disable RSSI */ /* change here for v2.6.5 */
2041 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2042 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2043 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2044 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002045
Steven Toth3935c252008-05-01 05:45:44 -03002046 /* RSSI reference point */
2047 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2048 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2049 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
Steven Tothd2110172008-05-01 19:35:54 -03002050 /* change here for v2.6.5 */
2051 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002052
Steven Toth3935c252008-05-01 05:45:44 -03002053 if (state->IF_OUT <= 6280000UL) /* Low IF */
2054 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2055 else /* High IF */
2056 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth48937292008-05-01 07:15:38 -03002057 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
2058
Steven Toth52c99bd2008-05-01 04:57:01 -03002059 }
Steven Toth3935c252008-05-01 05:45:44 -03002060 if (state->Mod_Type == MXL_ANALOG_CABLE) {
2061 /* Analog Cable Mode */
Steven Toth85d220d2008-05-01 05:48:14 -03002062 /* state->Mode = MXL_DIGITAL_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002063
Steven Toth3935c252008-05-01 05:45:44 -03002064 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002065
Steven Toth3935c252008-05-01 05:45:44 -03002066 /* Disable RSSI */
2067 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2068 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2069 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2070 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Tothd2110172008-05-01 19:35:54 -03002071 /* change for 2.6.3 */
2072 status += MXL_ControlWrite(fe, AGC_IF, 1);
Steven Toth3935c252008-05-01 05:45:44 -03002073 status += MXL_ControlWrite(fe, AGC_RF, 15);
2074 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002075 }
2076
Steven Toth3935c252008-05-01 05:45:44 -03002077 if (state->Mod_Type == MXL_ANALOG_OTA) {
2078 /* Analog OTA Terrestrial mode add for 2.6.7 */
2079 /* state->Mode = MXL_ANALOG_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002080
Steven Toth3935c252008-05-01 05:45:44 -03002081 /* Enable RSSI */
2082 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2083 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2084 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2085 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002086
Steven Toth3935c252008-05-01 05:45:44 -03002087 /* RSSI reference point */
2088 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2089 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2090 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2091 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2092 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002093 }
2094
Steven Toth3935c252008-05-01 05:45:44 -03002095 /* RSSI disable */
Steven Tothd2110172008-05-01 19:35:54 -03002096 if (state->EN_RSSI == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03002097 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2098 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2099 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2100 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002101 }
2102
Steven Toth3935c252008-05-01 05:45:44 -03002103 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03002104}
2105
Steven Tothc6c34b12008-05-03 14:14:54 -03002106static u16 MXL_IFSynthInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03002107{
Steven Toth85d220d2008-05-01 05:48:14 -03002108 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03002109 u16 status = 0 ;
Steven Totha8214d42008-05-01 05:02:58 -03002110 u32 Fref = 0 ;
2111 u32 Kdbl, intModVal ;
2112 u32 fracModVal ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002113 Kdbl = 2 ;
2114
Steven Toth3935c252008-05-01 05:45:44 -03002115 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002116 Kdbl = 2 ;
Steven Toth3935c252008-05-01 05:45:44 -03002117 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002118 Kdbl = 1 ;
2119
Steven Tothd2110172008-05-01 19:35:54 -03002120 /* IF Synthesizer Control */
2121 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF mode */ {
Steven Toth85d220d2008-05-01 05:48:14 -03002122 if (state->IF_LO == 41000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002123 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2124 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002125 Fref = 328000000UL ;
2126 }
Steven Toth85d220d2008-05-01 05:48:14 -03002127 if (state->IF_LO == 47000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002128 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2129 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002130 Fref = 376000000UL ;
2131 }
Steven Toth85d220d2008-05-01 05:48:14 -03002132 if (state->IF_LO == 54000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002133 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2134 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002135 Fref = 324000000UL ;
2136 }
Steven Toth85d220d2008-05-01 05:48:14 -03002137 if (state->IF_LO == 60000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002138 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2139 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002140 Fref = 360000000UL ;
2141 }
Steven Toth85d220d2008-05-01 05:48:14 -03002142 if (state->IF_LO == 39250000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002143 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2144 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002145 Fref = 314000000UL ;
2146 }
Steven Toth85d220d2008-05-01 05:48:14 -03002147 if (state->IF_LO == 39650000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002148 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2149 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002150 Fref = 317200000UL ;
2151 }
Steven Toth85d220d2008-05-01 05:48:14 -03002152 if (state->IF_LO == 40150000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002153 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2154 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002155 Fref = 321200000UL ;
2156 }
Steven Toth85d220d2008-05-01 05:48:14 -03002157 if (state->IF_LO == 40650000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002158 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2159 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002160 Fref = 325200000UL ;
2161 }
2162 }
2163
Steven Tothd2110172008-05-01 19:35:54 -03002164 if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0)) {
Steven Toth85d220d2008-05-01 05:48:14 -03002165 if (state->IF_LO == 57000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002166 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2167 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002168 Fref = 342000000UL ;
2169 }
Steven Toth85d220d2008-05-01 05:48:14 -03002170 if (state->IF_LO == 44000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002171 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2172 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002173 Fref = 352000000UL ;
2174 }
Steven Toth85d220d2008-05-01 05:48:14 -03002175 if (state->IF_LO == 43750000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002176 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2177 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002178 Fref = 350000000UL ;
2179 }
Steven Toth85d220d2008-05-01 05:48:14 -03002180 if (state->IF_LO == 36650000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002181 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2182 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002183 Fref = 366500000UL ;
2184 }
Steven Toth85d220d2008-05-01 05:48:14 -03002185 if (state->IF_LO == 36150000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002186 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2187 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002188 Fref = 361500000UL ;
2189 }
Steven Toth85d220d2008-05-01 05:48:14 -03002190 if (state->IF_LO == 36000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002191 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2192 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002193 Fref = 360000000UL ;
2194 }
Steven Toth85d220d2008-05-01 05:48:14 -03002195 if (state->IF_LO == 35250000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002196 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2197 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002198 Fref = 352500000UL ;
2199 }
Steven Toth85d220d2008-05-01 05:48:14 -03002200 if (state->IF_LO == 34750000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002201 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2202 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002203 Fref = 347500000UL ;
2204 }
Steven Toth85d220d2008-05-01 05:48:14 -03002205 if (state->IF_LO == 6280000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002206 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2207 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002208 Fref = 376800000UL ;
2209 }
Steven Toth85d220d2008-05-01 05:48:14 -03002210 if (state->IF_LO == 5000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002211 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);
2212 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002213 Fref = 360000000UL ;
2214 }
Steven Toth85d220d2008-05-01 05:48:14 -03002215 if (state->IF_LO == 4500000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002216 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);
2217 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002218 Fref = 360000000UL ;
2219 }
Steven Toth85d220d2008-05-01 05:48:14 -03002220 if (state->IF_LO == 4570000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002221 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);
2222 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002223 Fref = 365600000UL ;
2224 }
Steven Toth85d220d2008-05-01 05:48:14 -03002225 if (state->IF_LO == 4000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002226 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05);
2227 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002228 Fref = 360000000UL ;
2229 }
Steven Tothd2110172008-05-01 19:35:54 -03002230 if (state->IF_LO == 57400000UL) {
2231 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);
2232 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002233 Fref = 344400000UL ;
2234 }
Steven Tothd2110172008-05-01 19:35:54 -03002235 if (state->IF_LO == 44400000UL) {
2236 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2237 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002238 Fref = 355200000UL ;
2239 }
Steven Tothd2110172008-05-01 19:35:54 -03002240 if (state->IF_LO == 44150000UL) {
2241 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);
2242 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002243 Fref = 353200000UL ;
2244 }
Steven Tothd2110172008-05-01 19:35:54 -03002245 if (state->IF_LO == 37050000UL) {
2246 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2247 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002248 Fref = 370500000UL ;
2249 }
Steven Tothd2110172008-05-01 19:35:54 -03002250 if (state->IF_LO == 36550000UL) {
2251 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2252 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002253 Fref = 365500000UL ;
2254 }
Steven Toth85d220d2008-05-01 05:48:14 -03002255 if (state->IF_LO == 36125000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002256 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);
2257 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002258 Fref = 361250000UL ;
2259 }
Steven Toth85d220d2008-05-01 05:48:14 -03002260 if (state->IF_LO == 6000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002261 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2262 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002263 Fref = 360000000UL ;
2264 }
Steven Tothd2110172008-05-01 19:35:54 -03002265 if (state->IF_LO == 5400000UL) {
2266 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2267 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002268 Fref = 324000000UL ;
2269 }
Steven Toth85d220d2008-05-01 05:48:14 -03002270 if (state->IF_LO == 5380000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002271 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);
2272 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
Steven Toth52c99bd2008-05-01 04:57:01 -03002273 Fref = 322800000UL ;
2274 }
Steven Toth85d220d2008-05-01 05:48:14 -03002275 if (state->IF_LO == 5200000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002276 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);
2277 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002278 Fref = 374400000UL ;
2279 }
Steven Tothd2110172008-05-01 19:35:54 -03002280 if (state->IF_LO == 4900000UL) {
2281 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);
2282 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002283 Fref = 352800000UL ;
2284 }
Steven Tothd2110172008-05-01 19:35:54 -03002285 if (state->IF_LO == 4400000UL) {
2286 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);
2287 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002288 Fref = 352000000UL ;
2289 }
Steven Tothd2110172008-05-01 19:35:54 -03002290 if (state->IF_LO == 4063000UL) /* add for 2.6.8 */ {
2291 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05);
2292 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
Steven Toth52c99bd2008-05-01 04:57:01 -03002293 Fref = 365670000UL ;
2294 }
2295 }
Steven Tothd2110172008-05-01 19:35:54 -03002296 /* CHCAL_INT_MOD_IF */
2297 /* CHCAL_FRAC_MOD_IF */
2298 intModVal = Fref / (state->Fxtal * Kdbl/2);
2299 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002300
Steven Tothd2110172008-05-01 19:35:54 -03002301 fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) *
2302 intModVal);
2303
2304 fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000);
2305 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002306
Steven Toth52c99bd2008-05-01 04:57:01 -03002307 return status ;
2308}
2309
Steven Tothc6c34b12008-05-03 14:14:54 -03002310static u32 MXL_GetXtalInt(u32 Xtal_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002311{
2312 if ((Xtal_Freq % 1000000) == 0)
Steven Tothd2110172008-05-01 19:35:54 -03002313 return (Xtal_Freq / 10000);
Steven Toth52c99bd2008-05-01 04:57:01 -03002314 else
Steven Tothd2110172008-05-01 19:35:54 -03002315 return (((Xtal_Freq / 1000000) + 1)*100);
Steven Toth52c99bd2008-05-01 04:57:01 -03002316}
2317
Steven Tothc6c34b12008-05-03 14:14:54 -03002318static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002319{
Steven Toth85d220d2008-05-01 05:48:14 -03002320 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03002321 u16 status = 0;
2322 u32 divider_val, E3, E4, E5, E5A;
2323 u32 Fmax, Fmin, FmaxBin, FminBin;
Steven Totha8214d42008-05-01 05:02:58 -03002324 u32 Kdbl_RF = 2;
Steven Toth3935c252008-05-01 05:45:44 -03002325 u32 tg_divval;
2326 u32 tg_lo;
2327 u32 Xtal_Int;
Steven Toth52c99bd2008-05-01 04:57:01 -03002328
Steven Totha8214d42008-05-01 05:02:58 -03002329 u32 Fref_TG;
2330 u32 Fvco;
Steven Toth52c99bd2008-05-01 04:57:01 -03002331
Steven Toth3935c252008-05-01 05:45:44 -03002332 Xtal_Int = MXL_GetXtalInt(state->Fxtal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002333
Steven Toth3935c252008-05-01 05:45:44 -03002334 state->RF_IN = RF_Freq;
Steven Toth52c99bd2008-05-01 04:57:01 -03002335
Steven Toth3935c252008-05-01 05:45:44 -03002336 MXL_SynthRFTGLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002337
Steven Toth3935c252008-05-01 05:45:44 -03002338 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2339 Kdbl_RF = 2;
2340 if (state->Fxtal > 22000000 && state->Fxtal <= 32000000)
2341 Kdbl_RF = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03002342
Steven Tothd2110172008-05-01 19:35:54 -03002343 /* Downconverter Controls
2344 * Look-Up Table Implementation for:
2345 * DN_POLY
2346 * DN_RFGAIN
2347 * DN_CAP_RFLPF
2348 * DN_EN_VHFUHFBAR
2349 * DN_GAIN_ADJUST
2350 * Change the boundary reference from RF_IN to RF_LO
2351 */
2352 if (state->RF_LO < 40000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002353 return -1;
Steven Tothd2110172008-05-01 19:35:54 -03002354
Steven Toth3935c252008-05-01 05:45:44 -03002355 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002356 status += MXL_ControlWrite(fe, DN_POLY, 2);
2357 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2358 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 423);
2359 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2360 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002361 }
Steven Toth3935c252008-05-01 05:45:44 -03002362 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002363 status += MXL_ControlWrite(fe, DN_POLY, 3);
2364 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2365 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 222);
2366 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2367 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002368 }
Steven Toth3935c252008-05-01 05:45:44 -03002369 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002370 status += MXL_ControlWrite(fe, DN_POLY, 3);
2371 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2372 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 147);
2373 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2374 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002375 }
Steven Toth3935c252008-05-01 05:45:44 -03002376 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002377 status += MXL_ControlWrite(fe, DN_POLY, 3);
2378 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2379 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 9);
2380 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2381 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002382 }
Steven Toth3935c252008-05-01 05:45:44 -03002383 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002384 status += MXL_ControlWrite(fe, DN_POLY, 3);
2385 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2386 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);
2387 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2388 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002389 }
Steven Toth3935c252008-05-01 05:45:44 -03002390 if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002391 status += MXL_ControlWrite(fe, DN_POLY, 3);
2392 status += MXL_ControlWrite(fe, DN_RFGAIN, 1);
2393 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);
2394 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0);
2395 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002396 }
Steven Toth3935c252008-05-01 05:45:44 -03002397 if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) {
Steven Tothd2110172008-05-01 19:35:54 -03002398 status += MXL_ControlWrite(fe, DN_POLY, 3);
2399 status += MXL_ControlWrite(fe, DN_RFGAIN, 2);
2400 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);
2401 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0);
2402 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002403 }
Steven Tothd2110172008-05-01 19:35:54 -03002404 if (state->RF_LO > 900000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002405 return -1;
Steven Tothd2110172008-05-01 19:35:54 -03002406
2407 /* DN_IQTNBUF_AMP */
2408 /* DN_IQTNGNBFBIAS_BST */
Steven Toth3935c252008-05-01 05:45:44 -03002409 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
2410 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2411 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002412 }
Steven Toth3935c252008-05-01 05:45:44 -03002413 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
2414 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2415 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002416 }
Steven Toth3935c252008-05-01 05:45:44 -03002417 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
2418 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2419 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002420 }
Steven Toth3935c252008-05-01 05:45:44 -03002421 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
2422 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2423 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002424 }
Steven Toth3935c252008-05-01 05:45:44 -03002425 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
2426 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2427 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002428 }
Steven Toth3935c252008-05-01 05:45:44 -03002429 if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) {
2430 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2431 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002432 }
Steven Toth3935c252008-05-01 05:45:44 -03002433 if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) {
2434 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2435 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002436 }
Steven Toth3935c252008-05-01 05:45:44 -03002437 if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) {
2438 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2439 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002440 }
Steven Toth3935c252008-05-01 05:45:44 -03002441 if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) {
2442 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2443 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002444 }
Steven Toth3935c252008-05-01 05:45:44 -03002445 if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) {
2446 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2447 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002448 }
Steven Toth3935c252008-05-01 05:45:44 -03002449 if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) {
2450 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2451 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002452 }
Steven Toth3935c252008-05-01 05:45:44 -03002453 if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) {
2454 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2455 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002456 }
Steven Toth3935c252008-05-01 05:45:44 -03002457 if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) {
2458 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2459 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002460 }
Steven Toth3935c252008-05-01 05:45:44 -03002461 if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) {
2462 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2463 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002464 }
Steven Toth3935c252008-05-01 05:45:44 -03002465 if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) {
2466 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2467 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002468 }
Steven Toth3935c252008-05-01 05:45:44 -03002469 if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) {
2470 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2471 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002472 }
2473
Steven Tothd2110172008-05-01 19:35:54 -03002474 /*
2475 * Set RF Synth and LO Path Control
2476 *
2477 * Look-Up table implementation for:
2478 * RFSYN_EN_OUTMUX
2479 * RFSYN_SEL_VCO_OUT
2480 * RFSYN_SEL_VCO_HI
2481 * RFSYN_SEL_DIVM
2482 * RFSYN_RF_DIV_BIAS
2483 * DN_SEL_FREQ
2484 *
2485 * Set divider_val, Fmax, Fmix to use in Equations
2486 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002487 FminBin = 28000000UL ;
2488 FmaxBin = 42500000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002489 if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) {
2490 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2491 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2492 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2493 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2494 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2495 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002496 divider_val = 64 ;
2497 Fmax = FmaxBin ;
2498 Fmin = FminBin ;
2499 }
2500 FminBin = 42500000UL ;
2501 FmaxBin = 56000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002502 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2503 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2504 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2505 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2506 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2507 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2508 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002509 divider_val = 64 ;
2510 Fmax = FmaxBin ;
2511 Fmin = FminBin ;
2512 }
2513 FminBin = 56000000UL ;
2514 FmaxBin = 85000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002515 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002516 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2517 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2518 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2519 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2520 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2521 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002522 divider_val = 32 ;
2523 Fmax = FmaxBin ;
2524 Fmin = FminBin ;
2525 }
2526 FminBin = 85000000UL ;
2527 FmaxBin = 112000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002528 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002529 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2530 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2531 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2532 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2533 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2534 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002535 divider_val = 32 ;
2536 Fmax = FmaxBin ;
2537 Fmin = FminBin ;
2538 }
2539 FminBin = 112000000UL ;
2540 FmaxBin = 170000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002541 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002542 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2543 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2544 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2545 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2546 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2547 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002548 divider_val = 16 ;
2549 Fmax = FmaxBin ;
2550 Fmin = FminBin ;
2551 }
2552 FminBin = 170000000UL ;
2553 FmaxBin = 225000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002554 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002555 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2556 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2557 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2558 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2559 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2560 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002561 divider_val = 16 ;
2562 Fmax = FmaxBin ;
2563 Fmin = FminBin ;
2564 }
2565 FminBin = 225000000UL ;
2566 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002567 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002568 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2569 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2570 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2571 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2572 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2573 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 4);
Steven Toth52c99bd2008-05-01 04:57:01 -03002574 divider_val = 8 ;
2575 Fmax = 340000000UL ;
2576 Fmin = FminBin ;
2577 }
2578 FminBin = 300000000UL ;
2579 FmaxBin = 340000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002580 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002581 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2582 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2583 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2584 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2585 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2586 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002587 divider_val = 8 ;
2588 Fmax = FmaxBin ;
2589 Fmin = 225000000UL ;
2590 }
2591 FminBin = 340000000UL ;
2592 FmaxBin = 450000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002593 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002594 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2595 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2596 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2597 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2598 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 2);
2599 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002600 divider_val = 8 ;
2601 Fmax = FmaxBin ;
2602 Fmin = FminBin ;
2603 }
2604 FminBin = 450000000UL ;
2605 FmaxBin = 680000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002606 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002607 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2608 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2609 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2610 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1);
2611 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2612 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002613 divider_val = 4 ;
2614 Fmax = FmaxBin ;
2615 Fmin = FminBin ;
2616 }
2617 FminBin = 680000000UL ;
2618 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002619 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002620 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
2621 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
2622 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2623 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1);
2624 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2625 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002626 divider_val = 4 ;
2627 Fmax = FmaxBin ;
2628 Fmin = FminBin ;
2629 }
2630
Steven Tothd2110172008-05-01 19:35:54 -03002631 /* CHCAL_INT_MOD_RF
2632 * CHCAL_FRAC_MOD_RF
2633 * RFSYN_LPF_R
2634 * CHCAL_EN_INT_RF
2635 */
2636 /* Equation E3 RFSYN_VCO_BIAS */
Steven Toth3935c252008-05-01 05:45:44 -03002637 E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ;
Steven Tothd2110172008-05-01 19:35:54 -03002638 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002639
Steven Tothd2110172008-05-01 19:35:54 -03002640 /* Equation E4 CHCAL_INT_MOD_RF */
2641 E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000);
2642 MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4);
Steven Toth52c99bd2008-05-01 04:57:01 -03002643
Steven Tothd2110172008-05-01 19:35:54 -03002644 /* Equation E5 CHCAL_FRAC_MOD_RF CHCAL_EN_INT_RF */
2645 E5 = ((2<<17)*(state->RF_LO/10000*divider_val -
2646 (E4*(2*state->Fxtal*Kdbl_RF)/10000))) /
2647 (2*state->Fxtal*Kdbl_RF/10000);
Steven Toth52c99bd2008-05-01 04:57:01 -03002648
Steven Tothd2110172008-05-01 19:35:54 -03002649 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);
2650
2651 /* Equation E5A RFSYN_LPF_R */
Steven Toth3935c252008-05-01 05:45:44 -03002652 E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;
Steven Tothd2110172008-05-01 19:35:54 -03002653 status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A);
Steven Toth52c99bd2008-05-01 04:57:01 -03002654
Steven Tothd2110172008-05-01 19:35:54 -03002655 /* Euqation E5B CHCAL_EN_INIT_RF */
Steven Toth3935c252008-05-01 05:45:44 -03002656 status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));
Steven Tothd2110172008-05-01 19:35:54 -03002657 /*if (E5 == 0)
2658 * status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);
2659 *else
2660 * status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);
2661 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002662
Steven Tothd2110172008-05-01 19:35:54 -03002663 /*
2664 * Set TG Synth
2665 *
2666 * Look-Up table implementation for:
2667 * TG_LO_DIVVAL
2668 * TG_LO_SELVAL
2669 *
2670 * Set divider_val, Fmax, Fmix to use in Equations
2671 */
2672 if (state->TG_LO < 33000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002673 return -1;
Steven Tothd2110172008-05-01 19:35:54 -03002674
Steven Toth52c99bd2008-05-01 04:57:01 -03002675 FminBin = 33000000UL ;
2676 FmaxBin = 50000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002677 if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002678 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x6);
2679 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002680 divider_val = 36 ;
2681 Fmax = FmaxBin ;
2682 Fmin = FminBin ;
2683 }
2684 FminBin = 50000000UL ;
2685 FmaxBin = 67000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002686 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002687 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x1);
2688 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002689 divider_val = 24 ;
2690 Fmax = FmaxBin ;
2691 Fmin = FminBin ;
2692 }
2693 FminBin = 67000000UL ;
2694 FmaxBin = 100000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002695 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002696 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0xC);
2697 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002698 divider_val = 18 ;
2699 Fmax = FmaxBin ;
2700 Fmin = FminBin ;
2701 }
2702 FminBin = 100000000UL ;
2703 FmaxBin = 150000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002704 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002705 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);
2706 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002707 divider_val = 12 ;
2708 Fmax = FmaxBin ;
2709 Fmin = FminBin ;
2710 }
2711 FminBin = 150000000UL ;
2712 FmaxBin = 200000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002713 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002714 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);
2715 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002716 divider_val = 8 ;
2717 Fmax = FmaxBin ;
2718 Fmin = FminBin ;
2719 }
2720 FminBin = 200000000UL ;
2721 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002722 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002723 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);
2724 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002725 divider_val = 6 ;
2726 Fmax = FmaxBin ;
2727 Fmin = FminBin ;
2728 }
2729 FminBin = 300000000UL ;
2730 FmaxBin = 400000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002731 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002732 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);
2733 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002734 divider_val = 4 ;
2735 Fmax = FmaxBin ;
2736 Fmin = FminBin ;
2737 }
2738 FminBin = 400000000UL ;
2739 FmaxBin = 600000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002740 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002741 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);
2742 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03002743 divider_val = 3 ;
2744 Fmax = FmaxBin ;
2745 Fmin = FminBin ;
2746 }
2747 FminBin = 600000000UL ;
2748 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002749 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
Steven Tothd2110172008-05-01 19:35:54 -03002750 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);
2751 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03002752 divider_val = 2 ;
2753 Fmax = FmaxBin ;
2754 Fmin = FminBin ;
2755 }
2756
Steven Tothd2110172008-05-01 19:35:54 -03002757 /* TG_DIV_VAL */
2758 tg_divval = (state->TG_LO*divider_val/100000) *
2759 (MXL_Ceiling(state->Fxtal, 1000000) * 100) /
2760 (state->Fxtal/1000);
2761
2762 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval);
Steven Toth52c99bd2008-05-01 04:57:01 -03002763
Steven Toth3935c252008-05-01 05:45:44 -03002764 if (state->TG_LO > 600000000UL)
Steven Tothd2110172008-05-01 19:35:54 -03002765 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002766
2767 Fmax = 1800000000UL ;
2768 Fmin = 1200000000UL ;
2769
Steven Tothd2110172008-05-01 19:35:54 -03002770 /* prevent overflow of 32 bit unsigned integer, use
2771 * following equation. Edit for v2.6.4
2772 */
2773 /* Fref_TF = Fref_TG * 1000 */
2774 Fref_TG = (state->Fxtal/1000) / MXL_Ceiling(state->Fxtal, 1000000);
Steven Toth52c99bd2008-05-01 04:57:01 -03002775
Steven Tothd2110172008-05-01 19:35:54 -03002776 /* Fvco = Fvco/10 */
2777 Fvco = (state->TG_LO/10000) * divider_val * Fref_TG;
Steven Toth52c99bd2008-05-01 04:57:01 -03002778
2779 tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8;
2780
Steven Tothd2110172008-05-01 19:35:54 -03002781 /* below equation is same as above but much harder to debug.
2782 * tg_lo = ( ((Fmax/10000 * Xtal_Int)/100) -
2783 * ((state->TG_LO/10000)*divider_val *
2784 * (state->Fxtal/10000)/100) )*32/((Fmax-Fmin)/10000 *
2785 * Xtal_Int/100) + 8;
2786 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002787
Steven Tothd2110172008-05-01 19:35:54 -03002788 status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo);
Steven Toth52c99bd2008-05-01 04:57:01 -03002789
Steven Tothd2110172008-05-01 19:35:54 -03002790 /* add for 2.6.5 Special setting for QAM */
2791 if (state->Mod_Type == MXL_QAM) {
Devin Heitmueller48c511e2009-10-28 23:10:16 -03002792 if (state->config->qam_gain != 0)
2793 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN,
2794 state->config->qam_gain);
2795 else if (state->RF_IN < 680000000)
Steven Tothd2110172008-05-01 19:35:54 -03002796 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2797 else
2798 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002799 }
2800
Steven Tothd2110172008-05-01 19:35:54 -03002801 /* Off Chip Tracking Filter Control */
2802 if (state->TF_Type == MXL_TF_OFF) {
2803 /* Tracking Filter Off State; turn off all the banks */
2804 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2805 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2806 status += MXL_SetGPIO(fe, 3, 1); /* Bank1 Off */
2807 status += MXL_SetGPIO(fe, 1, 1); /* Bank2 Off */
2808 status += MXL_SetGPIO(fe, 4, 1); /* Bank3 Off */
Steven Toth52c99bd2008-05-01 04:57:01 -03002809 }
2810
Steven Tothd2110172008-05-01 19:35:54 -03002811 if (state->TF_Type == MXL_TF_C) /* Tracking Filter type C */ {
2812 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2813 status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002814
Steven Tothd2110172008-05-01 19:35:54 -03002815 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
2816 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2817 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2818 status += MXL_SetGPIO(fe, 3, 0);
2819 status += MXL_SetGPIO(fe, 1, 1);
2820 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002821 }
Steven Tothd2110172008-05-01 19:35:54 -03002822 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
2823 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2824 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2825 status += MXL_SetGPIO(fe, 3, 1);
2826 status += MXL_SetGPIO(fe, 1, 0);
2827 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002828 }
Steven Tothd2110172008-05-01 19:35:54 -03002829 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
2830 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2831 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2832 status += MXL_SetGPIO(fe, 3, 1);
2833 status += MXL_SetGPIO(fe, 1, 0);
2834 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002835 }
Steven Tothd2110172008-05-01 19:35:54 -03002836 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
2837 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2838 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2839 status += MXL_SetGPIO(fe, 3, 1);
2840 status += MXL_SetGPIO(fe, 1, 1);
2841 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002842 }
Steven Tothd2110172008-05-01 19:35:54 -03002843 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
2844 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2845 status += MXL_ControlWrite(fe, DAC_DIN_B, 29);
2846 status += MXL_SetGPIO(fe, 3, 1);
2847 status += MXL_SetGPIO(fe, 1, 1);
2848 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002849 }
Steven Tothd2110172008-05-01 19:35:54 -03002850 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
2851 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2852 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2853 status += MXL_SetGPIO(fe, 3, 1);
2854 status += MXL_SetGPIO(fe, 1, 1);
2855 status += MXL_SetGPIO(fe, 4, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002856 }
Steven Tothd2110172008-05-01 19:35:54 -03002857 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
2858 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2859 status += MXL_ControlWrite(fe, DAC_DIN_B, 16);
2860 status += MXL_SetGPIO(fe, 3, 1);
2861 status += MXL_SetGPIO(fe, 1, 1);
2862 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002863 }
Steven Tothd2110172008-05-01 19:35:54 -03002864 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
2865 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2866 status += MXL_ControlWrite(fe, DAC_DIN_B, 7);
2867 status += MXL_SetGPIO(fe, 3, 1);
2868 status += MXL_SetGPIO(fe, 1, 1);
2869 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002870 }
Steven Tothd2110172008-05-01 19:35:54 -03002871 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
2872 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2873 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2874 status += MXL_SetGPIO(fe, 3, 1);
2875 status += MXL_SetGPIO(fe, 1, 1);
2876 status += MXL_SetGPIO(fe, 4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002877 }
2878 }
2879
Steven Tothd2110172008-05-01 19:35:54 -03002880 if (state->TF_Type == MXL_TF_C_H) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002881
Steven Tothd2110172008-05-01 19:35:54 -03002882 /* Tracking Filter type C-H for Hauppauge only */
2883 status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002884
Steven Tothd2110172008-05-01 19:35:54 -03002885 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
2886 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2887 status += MXL_SetGPIO(fe, 4, 0);
2888 status += MXL_SetGPIO(fe, 3, 1);
2889 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002890 }
Steven Tothd2110172008-05-01 19:35:54 -03002891 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
2892 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2893 status += MXL_SetGPIO(fe, 4, 1);
2894 status += MXL_SetGPIO(fe, 3, 0);
2895 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002896 }
Steven Tothd2110172008-05-01 19:35:54 -03002897 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
2898 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2899 status += MXL_SetGPIO(fe, 4, 1);
2900 status += MXL_SetGPIO(fe, 3, 0);
2901 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002902 }
Steven Tothd2110172008-05-01 19:35:54 -03002903 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
2904 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2905 status += MXL_SetGPIO(fe, 4, 1);
2906 status += MXL_SetGPIO(fe, 3, 1);
2907 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002908 }
Steven Tothd2110172008-05-01 19:35:54 -03002909 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
2910 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2911 status += MXL_SetGPIO(fe, 4, 1);
2912 status += MXL_SetGPIO(fe, 3, 1);
2913 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002914 }
Steven Tothd2110172008-05-01 19:35:54 -03002915 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
2916 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2917 status += MXL_SetGPIO(fe, 4, 1);
2918 status += MXL_SetGPIO(fe, 3, 1);
2919 status += MXL_SetGPIO(fe, 1, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002920 }
Steven Tothd2110172008-05-01 19:35:54 -03002921 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
2922 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2923 status += MXL_SetGPIO(fe, 4, 1);
2924 status += MXL_SetGPIO(fe, 3, 1);
2925 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002926 }
Steven Tothd2110172008-05-01 19:35:54 -03002927 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
2928 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2929 status += MXL_SetGPIO(fe, 4, 1);
2930 status += MXL_SetGPIO(fe, 3, 1);
2931 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002932 }
Steven Tothd2110172008-05-01 19:35:54 -03002933 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
2934 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2935 status += MXL_SetGPIO(fe, 4, 1);
2936 status += MXL_SetGPIO(fe, 3, 1);
2937 status += MXL_SetGPIO(fe, 1, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002938 }
2939 }
2940
Steven Tothd2110172008-05-01 19:35:54 -03002941 if (state->TF_Type == MXL_TF_D) { /* Tracking Filter type D */
Steven Toth52c99bd2008-05-01 04:57:01 -03002942
Steven Tothd2110172008-05-01 19:35:54 -03002943 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002944
Steven Tothd2110172008-05-01 19:35:54 -03002945 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
2946 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2947 status += MXL_SetGPIO(fe, 4, 0);
2948 status += MXL_SetGPIO(fe, 1, 1);
2949 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002950 }
Steven Tothd2110172008-05-01 19:35:54 -03002951 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
2952 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2953 status += MXL_SetGPIO(fe, 4, 0);
2954 status += MXL_SetGPIO(fe, 1, 0);
2955 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002956 }
Steven Tothd2110172008-05-01 19:35:54 -03002957 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
2958 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2959 status += MXL_SetGPIO(fe, 4, 1);
2960 status += MXL_SetGPIO(fe, 1, 0);
2961 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002962 }
Steven Tothd2110172008-05-01 19:35:54 -03002963 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
2964 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2965 status += MXL_SetGPIO(fe, 4, 1);
2966 status += MXL_SetGPIO(fe, 1, 0);
2967 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002968 }
Steven Tothd2110172008-05-01 19:35:54 -03002969 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
2970 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2971 status += MXL_SetGPIO(fe, 4, 1);
2972 status += MXL_SetGPIO(fe, 1, 1);
2973 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002974 }
Steven Tothd2110172008-05-01 19:35:54 -03002975 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
2976 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2977 status += MXL_SetGPIO(fe, 4, 1);
2978 status += MXL_SetGPIO(fe, 1, 1);
2979 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002980 }
Steven Tothd2110172008-05-01 19:35:54 -03002981 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
2982 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2983 status += MXL_SetGPIO(fe, 4, 1);
2984 status += MXL_SetGPIO(fe, 1, 1);
2985 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002986 }
2987 }
2988
Steven Tothd2110172008-05-01 19:35:54 -03002989 if (state->TF_Type == MXL_TF_D_L) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002990
Steven Tothd2110172008-05-01 19:35:54 -03002991 /* Tracking Filter type D-L for Lumanate ONLY change 2.6.3 */
2992 status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002993
Steven Tothd2110172008-05-01 19:35:54 -03002994 /* if UHF and terrestrial => Turn off Tracking Filter */
2995 if (state->RF_IN >= 471000000 &&
2996 (state->RF_IN - 471000000)%6000000 != 0) {
2997 /* Turn off all the banks */
2998 status += MXL_SetGPIO(fe, 3, 1);
2999 status += MXL_SetGPIO(fe, 1, 1);
3000 status += MXL_SetGPIO(fe, 4, 1);
3001 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3002 status += MXL_ControlWrite(fe, AGC_IF, 10);
3003 } else {
3004 /* if VHF or cable => Turn on Tracking Filter */
3005 if (state->RF_IN >= 43000000 &&
3006 state->RF_IN < 140000000) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003007
Steven Tothd2110172008-05-01 19:35:54 -03003008 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3009 status += MXL_SetGPIO(fe, 4, 1);
3010 status += MXL_SetGPIO(fe, 1, 1);
3011 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003012 }
Steven Tothd2110172008-05-01 19:35:54 -03003013 if (state->RF_IN >= 140000000 &&
3014 state->RF_IN < 240000000) {
3015 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3016 status += MXL_SetGPIO(fe, 4, 1);
3017 status += MXL_SetGPIO(fe, 1, 0);
3018 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003019 }
Steven Tothd2110172008-05-01 19:35:54 -03003020 if (state->RF_IN >= 240000000 &&
3021 state->RF_IN < 340000000) {
3022 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3023 status += MXL_SetGPIO(fe, 4, 0);
3024 status += MXL_SetGPIO(fe, 1, 1);
3025 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003026 }
Steven Tothd2110172008-05-01 19:35:54 -03003027 if (state->RF_IN >= 340000000 &&
3028 state->RF_IN < 430000000) {
3029 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3030 status += MXL_SetGPIO(fe, 4, 0);
3031 status += MXL_SetGPIO(fe, 1, 0);
3032 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003033 }
Steven Tothd2110172008-05-01 19:35:54 -03003034 if (state->RF_IN >= 430000000 &&
3035 state->RF_IN < 470000000) {
3036 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3037 status += MXL_SetGPIO(fe, 4, 1);
3038 status += MXL_SetGPIO(fe, 1, 0);
3039 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003040 }
Steven Tothd2110172008-05-01 19:35:54 -03003041 if (state->RF_IN >= 470000000 &&
3042 state->RF_IN < 570000000) {
3043 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3044 status += MXL_SetGPIO(fe, 4, 0);
3045 status += MXL_SetGPIO(fe, 1, 0);
3046 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003047 }
Steven Tothd2110172008-05-01 19:35:54 -03003048 if (state->RF_IN >= 570000000 &&
3049 state->RF_IN < 620000000) {
3050 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3051 status += MXL_SetGPIO(fe, 4, 0);
3052 status += MXL_SetGPIO(fe, 1, 1);
3053 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003054 }
Steven Tothd2110172008-05-01 19:35:54 -03003055 if (state->RF_IN >= 620000000 &&
3056 state->RF_IN < 760000000) {
3057 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3058 status += MXL_SetGPIO(fe, 4, 0);
3059 status += MXL_SetGPIO(fe, 1, 1);
3060 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003061 }
Steven Tothd2110172008-05-01 19:35:54 -03003062 if (state->RF_IN >= 760000000 &&
3063 state->RF_IN <= 900000000) {
3064 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3065 status += MXL_SetGPIO(fe, 4, 1);
3066 status += MXL_SetGPIO(fe, 1, 1);
3067 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003068 }
3069 }
3070 }
3071
Steven Tothd2110172008-05-01 19:35:54 -03003072 if (state->TF_Type == MXL_TF_E) /* Tracking Filter type E */ {
Steven Toth52c99bd2008-05-01 04:57:01 -03003073
Steven Tothd2110172008-05-01 19:35:54 -03003074 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003075
Steven Tothd2110172008-05-01 19:35:54 -03003076 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
3077 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3078 status += MXL_SetGPIO(fe, 4, 0);
3079 status += MXL_SetGPIO(fe, 1, 1);
3080 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003081 }
Steven Tothd2110172008-05-01 19:35:54 -03003082 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3083 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3084 status += MXL_SetGPIO(fe, 4, 0);
3085 status += MXL_SetGPIO(fe, 1, 0);
3086 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003087 }
Steven Tothd2110172008-05-01 19:35:54 -03003088 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
3089 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3090 status += MXL_SetGPIO(fe, 4, 1);
3091 status += MXL_SetGPIO(fe, 1, 0);
3092 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003093 }
Steven Tothd2110172008-05-01 19:35:54 -03003094 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
3095 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3096 status += MXL_SetGPIO(fe, 4, 1);
3097 status += MXL_SetGPIO(fe, 1, 0);
3098 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003099 }
Steven Tothd2110172008-05-01 19:35:54 -03003100 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
3101 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3102 status += MXL_SetGPIO(fe, 4, 1);
3103 status += MXL_SetGPIO(fe, 1, 1);
3104 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003105 }
Steven Tothd2110172008-05-01 19:35:54 -03003106 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
3107 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3108 status += MXL_SetGPIO(fe, 4, 1);
3109 status += MXL_SetGPIO(fe, 1, 1);
3110 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003111 }
Steven Tothd2110172008-05-01 19:35:54 -03003112 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
3113 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3114 status += MXL_SetGPIO(fe, 4, 1);
3115 status += MXL_SetGPIO(fe, 1, 1);
3116 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003117 }
3118 }
3119
Steven Tothd2110172008-05-01 19:35:54 -03003120 if (state->TF_Type == MXL_TF_F) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003121
Steven Tothd2110172008-05-01 19:35:54 -03003122 /* Tracking Filter type F */
3123 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003124
Steven Tothd2110172008-05-01 19:35:54 -03003125 if (state->RF_IN >= 43000000 && state->RF_IN < 160000000) {
3126 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3127 status += MXL_SetGPIO(fe, 4, 0);
3128 status += MXL_SetGPIO(fe, 1, 1);
3129 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003130 }
Steven Tothd2110172008-05-01 19:35:54 -03003131 if (state->RF_IN >= 160000000 && state->RF_IN < 210000000) {
3132 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3133 status += MXL_SetGPIO(fe, 4, 0);
3134 status += MXL_SetGPIO(fe, 1, 0);
3135 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003136 }
Steven Tothd2110172008-05-01 19:35:54 -03003137 if (state->RF_IN >= 210000000 && state->RF_IN < 300000000) {
3138 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3139 status += MXL_SetGPIO(fe, 4, 1);
3140 status += MXL_SetGPIO(fe, 1, 0);
3141 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003142 }
Steven Tothd2110172008-05-01 19:35:54 -03003143 if (state->RF_IN >= 300000000 && state->RF_IN < 390000000) {
3144 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3145 status += MXL_SetGPIO(fe, 4, 1);
3146 status += MXL_SetGPIO(fe, 1, 0);
3147 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003148 }
Steven Tothd2110172008-05-01 19:35:54 -03003149 if (state->RF_IN >= 390000000 && state->RF_IN < 515000000) {
3150 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3151 status += MXL_SetGPIO(fe, 4, 1);
3152 status += MXL_SetGPIO(fe, 1, 1);
3153 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003154 }
Steven Tothd2110172008-05-01 19:35:54 -03003155 if (state->RF_IN >= 515000000 && state->RF_IN < 650000000) {
3156 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3157 status += MXL_SetGPIO(fe, 4, 1);
3158 status += MXL_SetGPIO(fe, 1, 1);
3159 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003160 }
Steven Tothd2110172008-05-01 19:35:54 -03003161 if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000) {
3162 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3163 status += MXL_SetGPIO(fe, 4, 1);
3164 status += MXL_SetGPIO(fe, 1, 1);
3165 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003166 }
3167 }
3168
Steven Tothd2110172008-05-01 19:35:54 -03003169 if (state->TF_Type == MXL_TF_E_2) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003170
Steven Tothd2110172008-05-01 19:35:54 -03003171 /* Tracking Filter type E_2 */
3172 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003173
Steven Tothd2110172008-05-01 19:35:54 -03003174 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
3175 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3176 status += MXL_SetGPIO(fe, 4, 0);
3177 status += MXL_SetGPIO(fe, 1, 1);
3178 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003179 }
Steven Tothd2110172008-05-01 19:35:54 -03003180 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3181 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3182 status += MXL_SetGPIO(fe, 4, 0);
3183 status += MXL_SetGPIO(fe, 1, 0);
3184 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003185 }
Steven Tothd2110172008-05-01 19:35:54 -03003186 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
3187 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3188 status += MXL_SetGPIO(fe, 4, 1);
3189 status += MXL_SetGPIO(fe, 1, 0);
3190 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003191 }
Steven Tothd2110172008-05-01 19:35:54 -03003192 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3193 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3194 status += MXL_SetGPIO(fe, 4, 1);
3195 status += MXL_SetGPIO(fe, 1, 0);
3196 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003197 }
Steven Tothd2110172008-05-01 19:35:54 -03003198 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
3199 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3200 status += MXL_SetGPIO(fe, 4, 1);
3201 status += MXL_SetGPIO(fe, 1, 1);
3202 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003203 }
Steven Tothd2110172008-05-01 19:35:54 -03003204 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
3205 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3206 status += MXL_SetGPIO(fe, 4, 1);
3207 status += MXL_SetGPIO(fe, 1, 1);
3208 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003209 }
Steven Tothd2110172008-05-01 19:35:54 -03003210 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
3211 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3212 status += MXL_SetGPIO(fe, 4, 1);
3213 status += MXL_SetGPIO(fe, 1, 1);
3214 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003215 }
3216 }
3217
Steven Tothd2110172008-05-01 19:35:54 -03003218 if (state->TF_Type == MXL_TF_G) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003219
Steven Tothd2110172008-05-01 19:35:54 -03003220 /* Tracking Filter type G add for v2.6.8 */
3221 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003222
Steven Tothd2110172008-05-01 19:35:54 -03003223 if (state->RF_IN >= 50000000 && state->RF_IN < 190000000) {
3224
3225 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3226 status += MXL_SetGPIO(fe, 4, 0);
3227 status += MXL_SetGPIO(fe, 1, 1);
3228 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003229 }
Steven Tothd2110172008-05-01 19:35:54 -03003230 if (state->RF_IN >= 190000000 && state->RF_IN < 280000000) {
3231 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3232 status += MXL_SetGPIO(fe, 4, 0);
3233 status += MXL_SetGPIO(fe, 1, 0);
3234 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003235 }
Steven Tothd2110172008-05-01 19:35:54 -03003236 if (state->RF_IN >= 280000000 && state->RF_IN < 350000000) {
3237 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3238 status += MXL_SetGPIO(fe, 4, 1);
3239 status += MXL_SetGPIO(fe, 1, 0);
3240 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003241 }
Steven Tothd2110172008-05-01 19:35:54 -03003242 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3243 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3244 status += MXL_SetGPIO(fe, 4, 1);
3245 status += MXL_SetGPIO(fe, 1, 0);
3246 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003247 }
Steven Tothd2110172008-05-01 19:35:54 -03003248 if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) {
3249 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3250 status += MXL_SetGPIO(fe, 4, 1);
3251 status += MXL_SetGPIO(fe, 1, 0);
3252 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003253 }
Steven Tothd2110172008-05-01 19:35:54 -03003254 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
3255 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3256 status += MXL_SetGPIO(fe, 4, 1);
3257 status += MXL_SetGPIO(fe, 1, 1);
3258 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003259 }
Steven Tothd2110172008-05-01 19:35:54 -03003260 if (state->RF_IN >= 640000000 && state->RF_IN < 820000000) {
3261 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3262 status += MXL_SetGPIO(fe, 4, 1);
3263 status += MXL_SetGPIO(fe, 1, 1);
3264 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003265 }
Steven Tothd2110172008-05-01 19:35:54 -03003266 if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000) {
3267 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3268 status += MXL_SetGPIO(fe, 4, 1);
3269 status += MXL_SetGPIO(fe, 1, 1);
3270 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003271 }
3272 }
3273
Steven Tothd2110172008-05-01 19:35:54 -03003274 if (state->TF_Type == MXL_TF_E_NA) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003275
Steven Tothd2110172008-05-01 19:35:54 -03003276 /* Tracking Filter type E-NA for Empia ONLY change for 2.6.8 */
3277 status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003278
Steven Tothd2110172008-05-01 19:35:54 -03003279 /* if UHF and terrestrial=> Turn off Tracking Filter */
3280 if (state->RF_IN >= 471000000 &&
3281 (state->RF_IN - 471000000)%6000000 != 0) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003282
Steven Tothd2110172008-05-01 19:35:54 -03003283 /* Turn off all the banks */
3284 status += MXL_SetGPIO(fe, 3, 1);
3285 status += MXL_SetGPIO(fe, 1, 1);
3286 status += MXL_SetGPIO(fe, 4, 1);
3287 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3288
3289 /* 2.6.12 Turn on RSSI */
3290 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
3291 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
3292 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
3293 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
3294
3295 /* RSSI reference point */
3296 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
3297 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
3298 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
3299
3300 /* following parameter is from analog OTA mode,
3301 * can be change to seek better performance */
3302 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
3303 } else {
3304 /* if VHF or Cable => Turn on Tracking Filter */
3305
3306 /* 2.6.12 Turn off RSSI */
3307 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
3308
3309 /* change back from above condition */
3310 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);
Steven Toth52c99bd2008-05-01 04:57:01 -03003311
3312
Steven Tothd2110172008-05-01 19:35:54 -03003313 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003314
Steven Tothd2110172008-05-01 19:35:54 -03003315 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3316 status += MXL_SetGPIO(fe, 4, 0);
3317 status += MXL_SetGPIO(fe, 1, 1);
3318 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003319 }
Steven Tothd2110172008-05-01 19:35:54 -03003320 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3321 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3322 status += MXL_SetGPIO(fe, 4, 0);
3323 status += MXL_SetGPIO(fe, 1, 0);
3324 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003325 }
Steven Tothd2110172008-05-01 19:35:54 -03003326 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
3327 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3328 status += MXL_SetGPIO(fe, 4, 1);
3329 status += MXL_SetGPIO(fe, 1, 0);
3330 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003331 }
Steven Tothd2110172008-05-01 19:35:54 -03003332 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3333 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3334 status += MXL_SetGPIO(fe, 4, 1);
3335 status += MXL_SetGPIO(fe, 1, 0);
3336 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003337 }
Steven Tothd2110172008-05-01 19:35:54 -03003338 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
3339 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3340 status += MXL_SetGPIO(fe, 4, 1);
3341 status += MXL_SetGPIO(fe, 1, 1);
3342 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003343 }
Steven Tothd2110172008-05-01 19:35:54 -03003344 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
3345 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3346 status += MXL_SetGPIO(fe, 4, 1);
3347 status += MXL_SetGPIO(fe, 1, 1);
3348 status += MXL_SetGPIO(fe, 3, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003349 }
Steven Tothd2110172008-05-01 19:35:54 -03003350 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
3351 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3352 status += MXL_SetGPIO(fe, 4, 1);
3353 status += MXL_SetGPIO(fe, 1, 1);
3354 status += MXL_SetGPIO(fe, 3, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003355 }
3356 }
3357 }
3358 return status ;
3359}
3360
Steven Tothc6c34b12008-05-03 14:14:54 -03003361static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val)
Steven Toth52c99bd2008-05-01 04:57:01 -03003362{
Steven Toth3935c252008-05-01 05:45:44 -03003363 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003364
3365 if (GPIO_Num == 1)
Steven Toth3935c252008-05-01 05:45:44 -03003366 status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1);
3367
3368 /* GPIO2 is not available */
3369
3370 if (GPIO_Num == 3) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003371 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003372 status += MXL_ControlWrite(fe, GPIO_3, 0);
3373 status += MXL_ControlWrite(fe, GPIO_3B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003374 }
3375 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003376 status += MXL_ControlWrite(fe, GPIO_3, 1);
3377 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003378 }
Steven Toth3935c252008-05-01 05:45:44 -03003379 if (GPIO_Val == 3) { /* tri-state */
3380 status += MXL_ControlWrite(fe, GPIO_3, 0);
3381 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003382 }
3383 }
Steven Toth3935c252008-05-01 05:45:44 -03003384 if (GPIO_Num == 4) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003385 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003386 status += MXL_ControlWrite(fe, GPIO_4, 0);
3387 status += MXL_ControlWrite(fe, GPIO_4B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003388 }
3389 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003390 status += MXL_ControlWrite(fe, GPIO_4, 1);
3391 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003392 }
Steven Toth3935c252008-05-01 05:45:44 -03003393 if (GPIO_Val == 3) { /* tri-state */
3394 status += MXL_ControlWrite(fe, GPIO_4, 0);
3395 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003396 }
3397 }
3398
Steven Toth3935c252008-05-01 05:45:44 -03003399 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003400}
3401
Steven Tothc6c34b12008-05-03 14:14:54 -03003402static u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003403{
Steven Toth3935c252008-05-01 05:45:44 -03003404 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003405
Steven Toth3935c252008-05-01 05:45:44 -03003406 /* Will write ALL Matching Control Name */
Steven Tothd2110172008-05-01 19:35:54 -03003407 /* Write Matching INIT Control */
3408 status += MXL_ControlWrite_Group(fe, ControlNum, value, 1);
3409 /* Write Matching CH Control */
3410 status += MXL_ControlWrite_Group(fe, ControlNum, value, 2);
Steven Toth3935c252008-05-01 05:45:44 -03003411#ifdef _MXL_INTERNAL
Steven Tothd2110172008-05-01 19:35:54 -03003412 /* Write Matching MXL Control */
3413 status += MXL_ControlWrite_Group(fe, ControlNum, value, 3);
Steven Toth3935c252008-05-01 05:45:44 -03003414#endif
3415 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003416}
3417
Steven Tothc6c34b12008-05-03 14:14:54 -03003418static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum,
3419 u32 value, u16 controlGroup)
Steven Toth52c99bd2008-05-01 04:57:01 -03003420{
Steven Toth85d220d2008-05-01 05:48:14 -03003421 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03003422 u16 i, j, k;
3423 u32 highLimit;
3424 u32 ctrlVal;
Steven Toth52c99bd2008-05-01 04:57:01 -03003425
Steven Toth3935c252008-05-01 05:45:44 -03003426 if (controlGroup == 1) /* Initial Control */ {
3427
3428 for (i = 0; i < state->Init_Ctrl_Num; i++) {
3429
3430 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3431
3432 highLimit = 1 << state->Init_Ctrl[i].size;
3433 if (value < highLimit) {
3434 for (j = 0; j < state->Init_Ctrl[i].size; j++) {
3435 state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3436 MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]),
3437 (u8)(state->Init_Ctrl[i].bit[j]),
Steven Tothd2110172008-05-01 19:35:54 -03003438 (u8)((value>>j) & 0x01));
Steven Toth52c99bd2008-05-01 04:57:01 -03003439 }
Steven Toth3935c252008-05-01 05:45:44 -03003440 ctrlVal = 0;
3441 for (k = 0; k < state->Init_Ctrl[i].size; k++)
3442 ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
Steven Tothd2110172008-05-01 19:35:54 -03003443 } else
Steven Toth3935c252008-05-01 05:45:44 -03003444 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003445 }
3446 }
3447 }
Steven Toth3935c252008-05-01 05:45:44 -03003448 if (controlGroup == 2) /* Chan change Control */ {
3449
3450 for (i = 0; i < state->CH_Ctrl_Num; i++) {
3451
Steven Tothd2110172008-05-01 19:35:54 -03003452 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003453
3454 highLimit = 1 << state->CH_Ctrl[i].size;
3455 if (value < highLimit) {
3456 for (j = 0; j < state->CH_Ctrl[i].size; j++) {
3457 state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3458 MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]),
3459 (u8)(state->CH_Ctrl[i].bit[j]),
Steven Tothd2110172008-05-01 19:35:54 -03003460 (u8)((value>>j) & 0x01));
Steven Toth52c99bd2008-05-01 04:57:01 -03003461 }
Steven Toth3935c252008-05-01 05:45:44 -03003462 ctrlVal = 0;
3463 for (k = 0; k < state->CH_Ctrl[i].size; k++)
3464 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
Steven Tothd2110172008-05-01 19:35:54 -03003465 } else
Steven Toth3935c252008-05-01 05:45:44 -03003466 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003467 }
3468 }
3469 }
3470#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003471 if (controlGroup == 3) /* Maxlinear Control */ {
3472
3473 for (i = 0; i < state->MXL_Ctrl_Num; i++) {
3474
Steven Tothd2110172008-05-01 19:35:54 -03003475 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003476
Steven Tothd2110172008-05-01 19:35:54 -03003477 highLimit = (1 << state->MXL_Ctrl[i].size);
Steven Toth3935c252008-05-01 05:45:44 -03003478 if (value < highLimit) {
3479 for (j = 0; j < state->MXL_Ctrl[i].size; j++) {
3480 state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3481 MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]),
3482 (u8)(state->MXL_Ctrl[i].bit[j]),
Steven Tothd2110172008-05-01 19:35:54 -03003483 (u8)((value>>j) & 0x01));
Steven Toth52c99bd2008-05-01 04:57:01 -03003484 }
Steven Toth3935c252008-05-01 05:45:44 -03003485 ctrlVal = 0;
Steven Tothd2110172008-05-01 19:35:54 -03003486 for (k = 0; k < state->MXL_Ctrl[i].size; k++)
Steven Toth5c310b12008-10-16 20:31:56 -03003487 ctrlVal += state->
3488 MXL_Ctrl[i].val[k] *
3489 (1 << k);
Steven Tothd2110172008-05-01 19:35:54 -03003490 } else
Steven Toth3935c252008-05-01 05:45:44 -03003491 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003492 }
3493 }
3494 }
3495#endif
Steven Toth3935c252008-05-01 05:45:44 -03003496 return 0 ; /* successful return */
Steven Toth52c99bd2008-05-01 04:57:01 -03003497}
3498
Steven Tothc6c34b12008-05-03 14:14:54 -03003499static u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003500{
Steven Toth85d220d2008-05-01 05:48:14 -03003501 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003502 int i ;
3503
Steven Toth3935c252008-05-01 05:45:44 -03003504 for (i = 0; i < 104; i++) {
Steven Tothd2110172008-05-01 19:35:54 -03003505 if (RegNum == state->TunerRegs[i].Reg_Num) {
Steven Toth3935c252008-05-01 05:45:44 -03003506 *RegVal = (u8)(state->TunerRegs[i].Reg_Val);
3507 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003508 }
3509 }
3510
Steven Toth3935c252008-05-01 05:45:44 -03003511 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003512}
3513
Steven Tothc6c34b12008-05-03 14:14:54 -03003514static u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003515{
Steven Toth85d220d2008-05-01 05:48:14 -03003516 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003517 u32 ctrlVal ;
3518 u16 i, k ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003519
Steven Toth3935c252008-05-01 05:45:44 -03003520 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
3521
3522 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3523
3524 ctrlVal = 0;
3525 for (k = 0; k < state->Init_Ctrl[i].size; k++)
Steven Tothd2110172008-05-01 19:35:54 -03003526 ctrlVal += state->Init_Ctrl[i].val[k] * (1<<k);
Steven Toth3935c252008-05-01 05:45:44 -03003527 *value = ctrlVal;
3528 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003529 }
3530 }
Steven Toth3935c252008-05-01 05:45:44 -03003531
3532 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
3533
3534 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
3535
3536 ctrlVal = 0;
3537 for (k = 0; k < state->CH_Ctrl[i].size; k++)
3538 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
3539 *value = ctrlVal;
3540 return 0;
3541
Steven Toth52c99bd2008-05-01 04:57:01 -03003542 }
3543 }
3544
3545#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003546 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
3547
3548 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
3549
3550 ctrlVal = 0;
3551 for (k = 0; k < state->MXL_Ctrl[i].size; k++)
3552 ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k);
3553 *value = ctrlVal;
3554 return 0;
3555
Steven Toth52c99bd2008-05-01 04:57:01 -03003556 }
3557 }
3558#endif
Steven Toth3935c252008-05-01 05:45:44 -03003559 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003560}
3561
Steven Tothc6c34b12008-05-03 14:14:54 -03003562static void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit,
3563 u8 bitVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003564{
Steven Toth85d220d2008-05-01 05:48:14 -03003565 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003566 int i ;
3567
Steven Totha8214d42008-05-01 05:02:58 -03003568 const u8 AND_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03003569 0xFE, 0xFD, 0xFB, 0xF7,
3570 0xEF, 0xDF, 0xBF, 0x7F } ;
3571
Steven Totha8214d42008-05-01 05:02:58 -03003572 const u8 OR_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03003573 0x01, 0x02, 0x04, 0x08,
3574 0x10, 0x20, 0x40, 0x80 } ;
3575
Steven Toth3935c252008-05-01 05:45:44 -03003576 for (i = 0; i < state->TunerRegs_Num; i++) {
3577 if (state->TunerRegs[i].Reg_Num == address) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003578 if (bitVal)
Steven Toth3935c252008-05-01 05:45:44 -03003579 state->TunerRegs[i].Reg_Val |= OR_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03003580 else
Steven Toth3935c252008-05-01 05:45:44 -03003581 state->TunerRegs[i].Reg_Val &= AND_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03003582 break ;
3583 }
3584 }
Steven Toth3935c252008-05-01 05:45:44 -03003585}
Steven Toth52c99bd2008-05-01 04:57:01 -03003586
Steven Tothc6c34b12008-05-03 14:14:54 -03003587static u32 MXL_Ceiling(u32 value, u32 resolution)
Steven Toth52c99bd2008-05-01 04:57:01 -03003588{
Steven Toth5c310b12008-10-16 20:31:56 -03003589 return value / resolution + (value % resolution > 0 ? 1 : 0);
Steven Toth3935c252008-05-01 05:45:44 -03003590}
Steven Toth52c99bd2008-05-01 04:57:01 -03003591
Steven Tothd2110172008-05-01 19:35:54 -03003592/* Retrieve the Initialzation Registers */
Steven Tothc6c34b12008-05-03 14:14:54 -03003593static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
Steven Tothd2110172008-05-01 19:35:54 -03003594 u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003595{
Steven Totha8214d42008-05-01 05:02:58 -03003596 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003597 int i ;
3598
Steven Toth3935c252008-05-01 05:45:44 -03003599 u8 RegAddr[] = {
3600 11, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73,
3601 76, 77, 91, 134, 135, 137, 147,
3602 156, 166, 167, 168, 25 };
Steven Toth52c99bd2008-05-01 04:57:01 -03003603
Julia Lawall80297122008-11-12 23:18:21 -03003604 *count = ARRAY_SIZE(RegAddr);
Steven Toth52c99bd2008-05-01 04:57:01 -03003605
Steven Toth3935c252008-05-01 05:45:44 -03003606 status += MXL_BlockInit(fe);
3607
3608 for (i = 0 ; i < *count; i++) {
3609 RegNum[i] = RegAddr[i];
3610 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003611 }
3612
Steven Toth3935c252008-05-01 05:45:44 -03003613 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003614}
3615
Steven Tothc6c34b12008-05-03 14:14:54 -03003616static u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal,
Steven Tothd2110172008-05-01 19:35:54 -03003617 int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003618{
Steven Totha8214d42008-05-01 05:02:58 -03003619 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003620 int i ;
3621
Steven Tothd2110172008-05-01 19:35:54 -03003622/* add 77, 166, 167, 168 register for 2.6.12 */
Steven Toth52c99bd2008-05-01 04:57:01 -03003623#ifdef _MXL_PRODUCTION
Steven Totha8214d42008-05-01 05:02:58 -03003624 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106,
3625 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003626#else
Steven Totha8214d42008-05-01 05:02:58 -03003627 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106,
3628 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
Steven Tothd2110172008-05-01 19:35:54 -03003629 /*
3630 u8 RegAddr[171];
3631 for (i = 0; i <= 170; i++)
3632 RegAddr[i] = i;
3633 */
Steven Toth52c99bd2008-05-01 04:57:01 -03003634#endif
3635
Julia Lawall80297122008-11-12 23:18:21 -03003636 *count = ARRAY_SIZE(RegAddr);
Steven Toth52c99bd2008-05-01 04:57:01 -03003637
Steven Toth3935c252008-05-01 05:45:44 -03003638 for (i = 0 ; i < *count; i++) {
3639 RegNum[i] = RegAddr[i];
3640 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003641 }
3642
Steven Toth3935c252008-05-01 05:45:44 -03003643 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003644}
3645
Steven Tothc6c34b12008-05-03 14:14:54 -03003646static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,
3647 u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03003648{
Steven Toth3935c252008-05-01 05:45:44 -03003649 u16 status = 0;
3650 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03003651
Steven Toth3935c252008-05-01 05:45:44 -03003652 u8 RegAddr[] = {43, 136};
Steven Toth52c99bd2008-05-01 04:57:01 -03003653
Julia Lawall80297122008-11-12 23:18:21 -03003654 *count = ARRAY_SIZE(RegAddr);
Steven Toth52c99bd2008-05-01 04:57:01 -03003655
Steven Toth3935c252008-05-01 05:45:44 -03003656 for (i = 0; i < *count; i++) {
3657 RegNum[i] = RegAddr[i];
3658 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03003659 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003660
Steven Toth3935c252008-05-01 05:45:44 -03003661 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003662}
3663
Steven Tothc6c34b12008-05-03 14:14:54 -03003664static u16 MXL_GetMasterControl(u8 *MasterReg, int state)
Steven Toth52c99bd2008-05-01 04:57:01 -03003665{
Steven Toth3935c252008-05-01 05:45:44 -03003666 if (state == 1) /* Load_Start */
3667 *MasterReg = 0xF3;
3668 if (state == 2) /* Power_Down */
3669 *MasterReg = 0x41;
3670 if (state == 3) /* Synth_Reset */
3671 *MasterReg = 0xB1;
3672 if (state == 4) /* Seq_Off */
3673 *MasterReg = 0xF1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003674
Steven Toth3935c252008-05-01 05:45:44 -03003675 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003676}
3677
3678#ifdef _MXL_PRODUCTION
Steven Tothc6c34b12008-05-03 14:14:54 -03003679static u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)
Steven Toth52c99bd2008-05-01 04:57:01 -03003680{
Steven Toth85d220d2008-05-01 05:48:14 -03003681 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003682 u16 status = 0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003683
Steven Totha8214d42008-05-01 05:02:58 -03003684 if (VCO_Range == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003685 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3686 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3687 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3688 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3689 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3690 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3691 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
Steven Tothd2110172008-05-01 19:35:54 -03003692 if (state->Mode == 0 && state->IF_Mode == 1) {
3693 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003694 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3695 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3696 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
Steven Tothd2110172008-05-01 19:35:54 -03003697 status += MXL_ControlWrite(fe,
3698 CHCAL_FRAC_MOD_RF, 180224);
Steven Totha8214d42008-05-01 05:02:58 -03003699 }
Steven Tothd2110172008-05-01 19:35:54 -03003700 if (state->Mode == 0 && state->IF_Mode == 0) {
3701 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003702 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3703 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3704 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
Steven Tothd2110172008-05-01 19:35:54 -03003705 status += MXL_ControlWrite(fe,
3706 CHCAL_FRAC_MOD_RF, 222822);
Steven Totha8214d42008-05-01 05:02:58 -03003707 }
Steven Toth3935c252008-05-01 05:45:44 -03003708 if (state->Mode == 1) /* Digital Mode */ {
3709 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3710 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3711 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
Steven Tothd2110172008-05-01 19:35:54 -03003712 status += MXL_ControlWrite(fe,
3713 CHCAL_FRAC_MOD_RF, 229376);
Steven Totha8214d42008-05-01 05:02:58 -03003714 }
3715 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003716
Steven Totha8214d42008-05-01 05:02:58 -03003717 if (VCO_Range == 2) {
Steven Toth3935c252008-05-01 05:45:44 -03003718 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3719 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3720 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3721 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3722 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3723 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3724 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
3725 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3726 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3727 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
Steven Tothd2110172008-05-01 19:35:54 -03003728 if (state->Mode == 0 && state->IF_Mode == 1) {
3729 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003730 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3731 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3732 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd2110172008-05-01 19:35:54 -03003733 status += MXL_ControlWrite(fe,
3734 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003735 }
Steven Tothd2110172008-05-01 19:35:54 -03003736 if (state->Mode == 0 && state->IF_Mode == 0) {
3737 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003738 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3739 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3740 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd2110172008-05-01 19:35:54 -03003741 status += MXL_ControlWrite(fe,
3742 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003743 }
Steven Toth3935c252008-05-01 05:45:44 -03003744 if (state->Mode == 1) /* Digital Mode */ {
3745 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
3746 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3747 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
Steven Tothd2110172008-05-01 19:35:54 -03003748 status += MXL_ControlWrite(fe,
3749 CHCAL_FRAC_MOD_RF, 16384);
Steven Totha8214d42008-05-01 05:02:58 -03003750 }
3751 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003752
Steven Totha8214d42008-05-01 05:02:58 -03003753 if (VCO_Range == 3) {
Steven Toth3935c252008-05-01 05:45:44 -03003754 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3755 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3756 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3757 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3758 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3759 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3760 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
3761 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3762 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3763 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd2110172008-05-01 19:35:54 -03003764 if (state->Mode == 0 && state->IF_Mode == 1) {
3765 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003766 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3767 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3768 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
Steven Tothd2110172008-05-01 19:35:54 -03003769 status += MXL_ControlWrite(fe,
3770 CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03003771 }
Steven Tothd2110172008-05-01 19:35:54 -03003772 if (state->Mode == 0 && state->IF_Mode == 0) {
3773 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003774 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3775 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3776 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
Steven Tothd2110172008-05-01 19:35:54 -03003777 status += MXL_ControlWrite(fe,
3778 CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03003779 }
Steven Toth3935c252008-05-01 05:45:44 -03003780 if (state->Mode == 1) /* Digital Mode */ {
3781 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3782 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
3783 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
Steven Tothd2110172008-05-01 19:35:54 -03003784 status += MXL_ControlWrite(fe,
3785 CHCAL_FRAC_MOD_RF, 245760);
Steven Totha8214d42008-05-01 05:02:58 -03003786 }
3787 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003788
Steven Totha8214d42008-05-01 05:02:58 -03003789 if (VCO_Range == 4) {
Steven Toth3935c252008-05-01 05:45:44 -03003790 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
3791 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
3792 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
3793 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
3794 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
3795 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
3796 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
3797 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3798 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3799 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd2110172008-05-01 19:35:54 -03003800 if (state->Mode == 0 && state->IF_Mode == 1) {
3801 /* Analog Low IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003802 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3803 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3804 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd2110172008-05-01 19:35:54 -03003805 status += MXL_ControlWrite(fe,
3806 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003807 }
Steven Tothd2110172008-05-01 19:35:54 -03003808 if (state->Mode == 0 && state->IF_Mode == 0) {
3809 /* Analog Zero IF Mode */
Steven Toth3935c252008-05-01 05:45:44 -03003810 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3811 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3812 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd2110172008-05-01 19:35:54 -03003813 status += MXL_ControlWrite(fe,
3814 CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03003815 }
Steven Toth3935c252008-05-01 05:45:44 -03003816 if (state->Mode == 1) /* Digital Mode */ {
3817 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
3818 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
3819 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
Steven Tothd2110172008-05-01 19:35:54 -03003820 status += MXL_ControlWrite(fe,
3821 CHCAL_FRAC_MOD_RF, 212992);
Steven Totha8214d42008-05-01 05:02:58 -03003822 }
3823 }
Steven Toth52c99bd2008-05-01 04:57:01 -03003824
Steven Totha8214d42008-05-01 05:02:58 -03003825 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003826}
3827
Steven Tothc6c34b12008-05-03 14:14:54 -03003828static u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)
Steven Toth52c99bd2008-05-01 04:57:01 -03003829{
Steven Toth85d220d2008-05-01 05:48:14 -03003830 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03003831 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003832
3833 if (Hystersis == 1)
Steven Toth3935c252008-05-01 05:45:44 -03003834 status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003835
Steven Totha8214d42008-05-01 05:02:58 -03003836 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003837}
3838#endif
Steven Toth48937292008-05-01 07:15:38 -03003839/* End: Reference driver code found in the Realtek driver that
3840 * is copyright MaxLinear */
Steven Toth52c99bd2008-05-01 04:57:01 -03003841
Steven Toth48937292008-05-01 07:15:38 -03003842/* ----------------------------------------------------------------
3843 * Begin: Everything after here is new code to adapt the
3844 * proprietary Realtek driver into a Linux API tuner.
Steven Toth6d897612008-09-03 17:12:12 -03003845 * Copyright (C) 2008 Steven Toth <stoth@linuxtv.org>
Steven Toth48937292008-05-01 07:15:38 -03003846 */
3847static int mxl5005s_reset(struct dvb_frontend *fe)
3848{
3849 struct mxl5005s_state *state = fe->tuner_priv;
3850 int ret = 0;
3851
3852 u8 buf[2] = { 0xff, 0x00 };
3853 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
3854 .buf = buf, .len = 2 };
3855
3856 dprintk(2, "%s()\n", __func__);
3857
3858 if (fe->ops.i2c_gate_ctrl)
3859 fe->ops.i2c_gate_ctrl(fe, 1);
3860
3861 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
3862 printk(KERN_WARNING "mxl5005s I2C reset failed\n");
3863 ret = -EREMOTEIO;
3864 }
3865
3866 if (fe->ops.i2c_gate_ctrl)
3867 fe->ops.i2c_gate_ctrl(fe, 0);
3868
3869 return ret;
3870}
3871
3872/* Write a single byte to a single reg, latch the value if required by
3873 * following the transaction with the latch byte.
3874 */
3875static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val, int latch)
3876{
3877 struct mxl5005s_state *state = fe->tuner_priv;
3878 u8 buf[3] = { reg, val, MXL5005S_LATCH_BYTE };
3879 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
3880 .buf = buf, .len = 3 };
3881
3882 if (latch == 0)
3883 msg.len = 2;
3884
Steven Tothd2110172008-05-01 19:35:54 -03003885 dprintk(2, "%s(0x%x, 0x%x, 0x%x)\n", __func__, reg, val, msg.addr);
Steven Toth48937292008-05-01 07:15:38 -03003886
3887 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
3888 printk(KERN_WARNING "mxl5005s I2C write failed\n");
3889 return -EREMOTEIO;
3890 }
3891 return 0;
3892}
3893
Steven Tothc6c34b12008-05-03 14:14:54 -03003894static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable,
3895 u8 *datatable, u8 len)
Steven Toth48937292008-05-01 07:15:38 -03003896{
3897 int ret = 0, i;
3898
3899 if (fe->ops.i2c_gate_ctrl)
3900 fe->ops.i2c_gate_ctrl(fe, 1);
3901
3902 for (i = 0 ; i < len-1; i++) {
3903 ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 0);
3904 if (ret < 0)
3905 break;
3906 }
3907
3908 ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 1);
3909
3910 if (fe->ops.i2c_gate_ctrl)
3911 fe->ops.i2c_gate_ctrl(fe, 0);
3912
3913 return ret;
3914}
Steven Toth7f5c3af2008-05-01 06:51:36 -03003915
Steven Tothc6c34b12008-05-03 14:14:54 -03003916static int mxl5005s_init(struct dvb_frontend *fe)
Steven Toth85d220d2008-05-01 05:48:14 -03003917{
Jose Alberto Regueroca341e42008-10-13 18:23:49 -03003918 struct mxl5005s_state *state = fe->tuner_priv;
3919
Steven Toth48937292008-05-01 07:15:38 -03003920 dprintk(1, "%s()\n", __func__);
Jose Alberto Regueroca341e42008-10-13 18:23:49 -03003921 state->current_mode = MXL_QAM;
Steven Toth48937292008-05-01 07:15:38 -03003922 return mxl5005s_reconfigure(fe, MXL_QAM, MXL5005S_BANDWIDTH_6MHZ);
3923}
3924
Steven Tothc6c34b12008-05-03 14:14:54 -03003925static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type,
3926 u32 bandwidth)
Steven Toth48937292008-05-01 07:15:38 -03003927{
3928 struct mxl5005s_state *state = fe->tuner_priv;
3929
3930 u8 AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
3931 u8 ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
3932 int TableLen;
3933
3934 dprintk(1, "%s(type=%d, bw=%d)\n", __func__, mod_type, bandwidth);
3935
3936 mxl5005s_reset(fe);
3937
3938 /* Tuner initialization stage 0 */
3939 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
3940 AddrTable[0] = MASTER_CONTROL_ADDR;
3941 ByteTable[0] |= state->config->AgcMasterByte;
3942
3943 mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);
3944
3945 mxl5005s_AssignTunerMode(fe, mod_type, bandwidth);
3946
3947 /* Tuner initialization stage 1 */
3948 MXL_GetInitRegister(fe, AddrTable, ByteTable, &TableLen);
3949
3950 mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
3951
3952 return 0;
3953}
3954
Steven Tothc6c34b12008-05-03 14:14:54 -03003955static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,
Steven Tothd2110172008-05-01 19:35:54 -03003956 u32 bandwidth)
Steven Toth48937292008-05-01 07:15:38 -03003957{
3958 struct mxl5005s_state *state = fe->tuner_priv;
3959 struct mxl5005s_config *c = state->config;
3960
3961 InitTunerControls(fe);
Steven Toth85d220d2008-05-01 05:48:14 -03003962
3963 /* Set MxL5005S parameters. */
Steven Toth85d220d2008-05-01 05:48:14 -03003964 MXL5005_TunerConfig(
3965 fe,
Steven Toth48937292008-05-01 07:15:38 -03003966 c->mod_mode,
3967 c->if_mode,
3968 bandwidth,
3969 c->if_freq,
3970 c->xtal_freq,
3971 c->agc_mode,
3972 c->top,
3973 c->output_load,
3974 c->clock_out,
3975 c->div_out,
3976 c->cap_select,
3977 c->rssi_enable,
3978 mod_type,
3979 c->tracking_filter);
Steven Toth85d220d2008-05-01 05:48:14 -03003980
Steven Toth48937292008-05-01 07:15:38 -03003981 return 0;
Steven Toth85d220d2008-05-01 05:48:14 -03003982}
3983
3984static int mxl5005s_set_params(struct dvb_frontend *fe,
3985 struct dvb_frontend_parameters *params)
3986{
Steven Toth48937292008-05-01 07:15:38 -03003987 struct mxl5005s_state *state = fe->tuner_priv;
3988 u32 req_mode, req_bw = 0;
3989 int ret;
Steven Toth85d220d2008-05-01 05:48:14 -03003990
Steven Toth48937292008-05-01 07:15:38 -03003991 dprintk(1, "%s()\n", __func__);
Steven Toth85d220d2008-05-01 05:48:14 -03003992
Steven Toth48937292008-05-01 07:15:38 -03003993 if (fe->ops.info.type == FE_ATSC) {
3994 switch (params->u.vsb.modulation) {
3995 case VSB_8:
3996 req_mode = MXL_ATSC; break;
3997 default:
3998 case QAM_64:
3999 case QAM_256:
4000 case QAM_AUTO:
4001 req_mode = MXL_QAM; break;
4002 }
Steven Tothd2110172008-05-01 19:35:54 -03004003 } else
4004 req_mode = MXL_DVBT;
Steven Toth85d220d2008-05-01 05:48:14 -03004005
Steven Toth48937292008-05-01 07:15:38 -03004006 /* Change tuner for new modulation type if reqd */
4007 if (req_mode != state->current_mode) {
4008 switch (req_mode) {
Andy Wallscea02132009-03-23 22:32:35 -03004009 case MXL_ATSC:
4010 case MXL_QAM:
Steven Toth48937292008-05-01 07:15:38 -03004011 req_bw = MXL5005S_BANDWIDTH_6MHZ;
4012 break;
Andy Wallscea02132009-03-23 22:32:35 -03004013 case MXL_DVBT:
Steven Toth48937292008-05-01 07:15:38 -03004014 default:
4015 /* Assume DVB-T */
4016 switch (params->u.ofdm.bandwidth) {
4017 case BANDWIDTH_6_MHZ:
4018 req_bw = MXL5005S_BANDWIDTH_6MHZ;
4019 break;
4020 case BANDWIDTH_7_MHZ:
4021 req_bw = MXL5005S_BANDWIDTH_7MHZ;
4022 break;
4023 case BANDWIDTH_AUTO:
4024 case BANDWIDTH_8_MHZ:
4025 req_bw = MXL5005S_BANDWIDTH_8MHZ;
4026 break;
4027 }
4028 }
4029
4030 state->current_mode = req_mode;
4031 ret = mxl5005s_reconfigure(fe, req_mode, req_bw);
4032
4033 } else
4034 ret = 0;
4035
4036 if (ret == 0) {
4037 dprintk(1, "%s() freq=%d\n", __func__, params->frequency);
4038 ret = mxl5005s_SetRfFreqHz(fe, params->frequency);
4039 }
4040
4041 return ret;
Steven Toth85d220d2008-05-01 05:48:14 -03004042}
4043
4044static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency)
4045{
4046 struct mxl5005s_state *state = fe->tuner_priv;
4047 dprintk(1, "%s()\n", __func__);
4048
4049 *frequency = state->RF_IN;
4050
4051 return 0;
4052}
4053
4054static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
4055{
4056 struct mxl5005s_state *state = fe->tuner_priv;
4057 dprintk(1, "%s()\n", __func__);
4058
4059 *bandwidth = state->Chan_Bandwidth;
4060
4061 return 0;
4062}
4063
Steven Toth85d220d2008-05-01 05:48:14 -03004064static int mxl5005s_release(struct dvb_frontend *fe)
4065{
4066 dprintk(1, "%s()\n", __func__);
4067 kfree(fe->tuner_priv);
4068 fe->tuner_priv = NULL;
4069 return 0;
4070}
4071
4072static const struct dvb_tuner_ops mxl5005s_tuner_ops = {
4073 .info = {
4074 .name = "MaxLinear MXL5005S",
4075 .frequency_min = 48000000,
4076 .frequency_max = 860000000,
4077 .frequency_step = 50000,
4078 },
4079
4080 .release = mxl5005s_release,
4081 .init = mxl5005s_init,
4082
4083 .set_params = mxl5005s_set_params,
4084 .get_frequency = mxl5005s_get_frequency,
4085 .get_bandwidth = mxl5005s_get_bandwidth,
Steven Toth85d220d2008-05-01 05:48:14 -03004086};
4087
4088struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe,
4089 struct i2c_adapter *i2c,
4090 struct mxl5005s_config *config)
4091{
4092 struct mxl5005s_state *state = NULL;
4093 dprintk(1, "%s()\n", __func__);
4094
4095 state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL);
4096 if (state == NULL)
4097 return NULL;
4098
4099 state->frontend = fe;
4100 state->config = config;
4101 state->i2c = i2c;
4102
Steven Tothd2110172008-05-01 19:35:54 -03004103 printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n",
4104 config->i2c_address);
Steven Toth85d220d2008-05-01 05:48:14 -03004105
Steven Tothd2110172008-05-01 19:35:54 -03004106 memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops,
4107 sizeof(struct dvb_tuner_ops));
Steven Toth85d220d2008-05-01 05:48:14 -03004108
4109 fe->tuner_priv = state;
4110 return fe;
4111}
4112EXPORT_SYMBOL(mxl5005s_attach);
4113
4114MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver");
Steven Toth85d220d2008-05-01 05:48:14 -03004115MODULE_AUTHOR("Steven Toth");
4116MODULE_LICENSE("GPL");