1/*
2    MaxLinear MXL5005S VSB/QAM/DVBT tuner driver
3
4    Copyright (C) 2008 MaxLinear
5    Copyright (C) 2006 Steven Toth <stoth@linuxtv.org>
6      Functions:
7	mxl5005s_reset()
8	mxl5005s_writereg()
9	mxl5005s_writeregs()
10	mxl5005s_init()
11	mxl5005s_reconfigure()
12	mxl5005s_AssignTunerMode()
13	mxl5005s_set_params()
14	mxl5005s_get_frequency()
15	mxl5005s_get_bandwidth()
16	mxl5005s_release()
17	mxl5005s_attach()
18
19    Copyright (C) 2008 Realtek
20    Copyright (C) 2008 Jan Hoogenraad
21      Functions:
22	mxl5005s_SetRfFreqHz()
23
24    This program is free software; you can redistribute it and/or modify
25    it under the terms of the GNU General Public License as published by
26    the Free Software Foundation; either version 2 of the License, or
27    (at your option) any later version.
28
29    This program is distributed in the hope that it will be useful,
30    but WITHOUT ANY WARRANTY; without even the implied warranty of
31    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
32    GNU General Public License for more details.
33
34    You should have received a copy of the GNU General Public License
35    along with this program; if not, write to the Free Software
36    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
37
38*/
39
40/*
41    History of this driver (Steven Toth):
42      I was given a public release of a linux driver that included
43      support for the MaxLinear MXL5005S silicon tuner. Analysis of
44      the tuner driver showed clearly three things.
45
46      1. The tuner driver didn't support the LinuxTV tuner API
47	 so the code Realtek added had to be removed.
48
49      2. A significant amount of the driver is reference driver code
50	 from MaxLinear, I felt it was important to identify and
51	 preserve this.
52
53      3. New code has to be added to interface correctly with the
54	 LinuxTV API, as a regular kernel module.
55
56      Other than the reference driver enum's, I've clearly marked
57      sections of the code and retained the copyright of the
58      respective owners.
59*/
60#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 <media/dvb_frontend.h>
67#include "mxl5005s.h"
68
69static int debug;
70
71#define dprintk(level, arg...) do {    \
72	if (level <= debug)            \
73		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
88/* Enumeration of Master Control Register State */
89enum master_control_state {
90	MC_LOAD_START = 1,
91	MC_POWER_DOWN,
92	MC_SYNTH_RESET,
93	MC_SEQ_OFF
94};
95
96/* Enumeration of MXL5005 Tuner Modulation Type */
97enum {
98	MXL_DEFAULT_MODULATION = 0,
99	MXL_DVBT,
100	MXL_ATSC,
101	MXL_QAM,
102	MXL_ANALOG_CABLE,
103	MXL_ANALOG_OTA
104};
105
106/* MXL5005 Tuner Register Struct */
107struct TunerReg {
108	u16 Reg_Num;	/* Tuner Register Address */
109	u16 Reg_Val;	/* Current sw programmed value waiting to be written */
110};
111
112enum {
113	/* Initialization Control Names */
114	DN_IQTN_AMP_CUT = 1,       /* 1 */
115	BB_MODE,                   /* 2 */
116	BB_BUF,                    /* 3 */
117	BB_BUF_OA,                 /* 4 */
118	BB_ALPF_BANDSELECT,        /* 5 */
119	BB_IQSWAP,                 /* 6 */
120	BB_DLPF_BANDSEL,           /* 7 */
121	RFSYN_CHP_GAIN,            /* 8 */
122	RFSYN_EN_CHP_HIGAIN,       /* 9 */
123	AGC_IF,                    /* 10 */
124	AGC_RF,                    /* 11 */
125	IF_DIVVAL,                 /* 12 */
126	IF_VCO_BIAS,               /* 13 */
127	CHCAL_INT_MOD_IF,          /* 14 */
128	CHCAL_FRAC_MOD_IF,         /* 15 */
129	DRV_RES_SEL,               /* 16 */
130	I_DRIVER,                  /* 17 */
131	EN_AAF,                    /* 18 */
132	EN_3P,                     /* 19 */
133	EN_AUX_3P,                 /* 20 */
134	SEL_AAF_BAND,              /* 21 */
135	SEQ_ENCLK16_CLK_OUT,       /* 22 */
136	SEQ_SEL4_16B,              /* 23 */
137	XTAL_CAPSELECT,            /* 24 */
138	IF_SEL_DBL,                /* 25 */
139	RFSYN_R_DIV,               /* 26 */
140	SEQ_EXTSYNTHCALIF,         /* 27 */
141	SEQ_EXTDCCAL,              /* 28 */
142	AGC_EN_RSSI,               /* 29 */
143	RFA_ENCLKRFAGC,            /* 30 */
144	RFA_RSSI_REFH,             /* 31 */
145	RFA_RSSI_REF,              /* 32 */
146	RFA_RSSI_REFL,             /* 33 */
147	RFA_FLR,                   /* 34 */
148	RFA_CEIL,                  /* 35 */
149	SEQ_EXTIQFSMPULSE,         /* 36 */
150	OVERRIDE_1,                /* 37 */
151	BB_INITSTATE_DLPF_TUNE,    /* 38 */
152	TG_R_DIV,                  /* 39 */
153	EN_CHP_LIN_B,              /* 40 */
154
155	/* Channel Change Control Names */
156	DN_POLY = 51,              /* 51 */
157	DN_RFGAIN,                 /* 52 */
158	DN_CAP_RFLPF,              /* 53 */
159	DN_EN_VHFUHFBAR,           /* 54 */
160	DN_GAIN_ADJUST,            /* 55 */
161	DN_IQTNBUF_AMP,            /* 56 */
162	DN_IQTNGNBFBIAS_BST,       /* 57 */
163	RFSYN_EN_OUTMUX,           /* 58 */
164	RFSYN_SEL_VCO_OUT,         /* 59 */
165	RFSYN_SEL_VCO_HI,          /* 60 */
166	RFSYN_SEL_DIVM,            /* 61 */
167	RFSYN_RF_DIV_BIAS,         /* 62 */
168	DN_SEL_FREQ,               /* 63 */
169	RFSYN_VCO_BIAS,            /* 64 */
170	CHCAL_INT_MOD_RF,          /* 65 */
171	CHCAL_FRAC_MOD_RF,         /* 66 */
172	RFSYN_LPF_R,               /* 67 */
173	CHCAL_EN_INT_RF,           /* 68 */
174	TG_LO_DIVVAL,              /* 69 */
175	TG_LO_SELVAL,              /* 70 */
176	TG_DIV_VAL,                /* 71 */
177	TG_VCO_BIAS,               /* 72 */
178	SEQ_EXTPOWERUP,            /* 73 */
179	OVERRIDE_2,                /* 74 */
180	OVERRIDE_3,                /* 75 */
181	OVERRIDE_4,                /* 76 */
182	SEQ_FSM_PULSE,             /* 77 */
183	GPIO_4B,                   /* 78 */
184	GPIO_3B,                   /* 79 */
185	GPIO_4,                    /* 80 */
186	GPIO_3,                    /* 81 */
187	GPIO_1B,                   /* 82 */
188	DAC_A_ENABLE,              /* 83 */
189	DAC_B_ENABLE,              /* 84 */
190	DAC_DIN_A,                 /* 85 */
191	DAC_DIN_B,                 /* 86 */
192#ifdef _MXL_PRODUCTION
193	RFSYN_EN_DIV,              /* 87 */
194	RFSYN_DIVM,                /* 88 */
195	DN_BYPASS_AGC_I2C          /* 89 */
196#endif
197};
198
199/*
200 * The following context is source code provided by MaxLinear.
201 * MaxLinear source code - Common_MXL.h (?)
202 */
203
204/* Constants */
205#define MXL5005S_REG_WRITING_TABLE_LEN_MAX	104
206#define MXL5005S_LATCH_BYTE			0xfe
207
208/* Register address, MSB, and LSB */
209#define MXL5005S_BB_IQSWAP_ADDR			59
210#define MXL5005S_BB_IQSWAP_MSB			0
211#define MXL5005S_BB_IQSWAP_LSB			0
212
213#define MXL5005S_BB_DLPF_BANDSEL_ADDR		53
214#define MXL5005S_BB_DLPF_BANDSEL_MSB		4
215#define MXL5005S_BB_DLPF_BANDSEL_LSB		3
216
217/* Standard modes */
218enum {
219	MXL5005S_STANDARD_DVBT,
220	MXL5005S_STANDARD_ATSC,
221};
222#define MXL5005S_STANDARD_MODE_NUM		2
223
224/* Bandwidth modes */
225enum {
226	MXL5005S_BANDWIDTH_6MHZ = 6000000,
227	MXL5005S_BANDWIDTH_7MHZ = 7000000,
228	MXL5005S_BANDWIDTH_8MHZ = 8000000,
229};
230#define MXL5005S_BANDWIDTH_MODE_NUM		3
231
232/* MXL5005 Tuner Control Struct */
233struct TunerControl {
234	u16 Ctrl_Num;	/* Control Number */
235	u16 size;	/* Number of bits to represent Value */
236	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 */
238	u16 val[25];	/* Binary representation of Value */
239};
240
241/* MXL5005 Tuner Struct */
242struct mxl5005s_state {
243	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 */
252	u8	CLOCK_OUT;	/* 0: turn off clk out; 1: turn on clock out */
253	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 */
256
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;
264
265	/* 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 */
269
270	/* Pointers to ControlName Arrays */
271	u16	Init_Ctrl_Num;		/* Number of INIT Control Names */
272	struct TunerControl
273		Init_Ctrl[INITCTRL_NUM]; /* INIT Control Names Array Pointer */
274
275	u16	CH_Ctrl_Num;		/* Number of CH Control Names */
276	struct TunerControl
277		CH_Ctrl[CHCTRL_NUM];	/* CH Control Name Array Pointer */
278
279	u16	MXL_Ctrl_Num;		/* Number of MXL Control Names */
280	struct TunerControl
281		MXL_Ctrl[MXLCTRL_NUM];	/* MXL Control Name Array Pointer */
282
283	/* Pointer to Tuner Register Array */
284	u16	TunerRegs_Num;		/* Number of Tuner Registers */
285	struct TunerReg
286		TunerRegs[TUNER_REGS_NUM]; /* Tuner Register Array Pointer */
287
288	/* Linux driver framework specific */
289	struct mxl5005s_config *config;
290	struct dvb_frontend *frontend;
291	struct i2c_adapter *i2c;
292
293	/* Cache values */
294	u32 current_mode;
295
296};
297
298static 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,
304	u8 *RegVal, int *count);
305static u32 MXL_Ceiling(u32 value, u32 resolution);
306static u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal);
307static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum,
308	u32 value, u16 controlGroup);
309static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val);
310static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
311	u8 *RegVal, int *count);
312static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq);
313static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe);
314static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe);
315static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,
316	u8 *RegVal, int *count);
317static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable,
318	u8 *datatable, u8 len);
319static u16 MXL_IFSynthInit(struct dvb_frontend *fe);
320static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,
321	u32 bandwidth);
322static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type,
323	u32 bandwidth);
324
325/* ----------------------------------------------------------------
326 * Begin: Custom code salvaged from the Realtek driver.
327 * Copyright (C) 2008 Realtek
328 * Copyright (C) 2008 Jan Hoogenraad
329 * This code is placed under the terms of the GNU General Public License
330 *
331 * Released by Realtek under GPLv2.
332 * Thanks to Realtek for a lot of support we received !
333 *
334 *  Revision: 080314 - original version
335 */
336
337static int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz)
338{
339	struct mxl5005s_state *state = fe->tuner_priv;
340	unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
341	unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
342	int TableLen;
343
344	u32 IfDivval = 0;
345	unsigned char MasterControlByte;
346
347	dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz);
348
349	/* Set MxL5005S tuner RF frequency according to example code. */
350
351	/* Tuner RF frequency setting stage 0 */
352	MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
353	AddrTable[0] = MASTER_CONTROL_ADDR;
354	ByteTable[0] |= state->config->AgcMasterByte;
355
356	mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);
357
358	/* Tuner RF frequency setting stage 1 */
359	MXL_TuneRF(fe, RfFreqHz);
360
361	MXL_ControlRead(fe, IF_DIVVAL, &IfDivval);
362
363	MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0);
364	MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1);
365	MXL_ControlWrite(fe, IF_DIVVAL, 8);
366	MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen);
367
368	MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);
369	AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
370	ByteTable[TableLen] = MasterControlByte |
371		state->config->AgcMasterByte;
372	TableLen += 1;
373
374	mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
375
376	/* Wait 30 ms. */
377	msleep(150);
378
379	/* Tuner RF frequency setting stage 2 */
380	MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1);
381	MXL_ControlWrite(fe, IF_DIVVAL, IfDivval);
382	MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen);
383
384	MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);
385	AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
386	ByteTable[TableLen] = MasterControlByte |
387		state->config->AgcMasterByte ;
388	TableLen += 1;
389
390	mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
391
392	msleep(100);
393
394	return 0;
395}
396/* End: Custom code taken from the Realtek driver */
397
398/* ----------------------------------------------------------------
399 * Begin: Reference driver code found in the Realtek driver.
400 * Copyright (C) 2008 MaxLinear
401 */
402static u16 MXL5005_RegisterInit(struct dvb_frontend *fe)
403{
404	struct mxl5005s_state *state = fe->tuner_priv;
405	state->TunerRegs_Num = TUNER_REGS_NUM ;
406
407	state->TunerRegs[0].Reg_Num = 9 ;
408	state->TunerRegs[0].Reg_Val = 0x40 ;
409
410	state->TunerRegs[1].Reg_Num = 11 ;
411	state->TunerRegs[1].Reg_Val = 0x19 ;
412
413	state->TunerRegs[2].Reg_Num = 12 ;
414	state->TunerRegs[2].Reg_Val = 0x60 ;
415
416	state->TunerRegs[3].Reg_Num = 13 ;
417	state->TunerRegs[3].Reg_Val = 0x00 ;
418
419	state->TunerRegs[4].Reg_Num = 14 ;
420	state->TunerRegs[4].Reg_Val = 0x00 ;
421
422	state->TunerRegs[5].Reg_Num = 15 ;
423	state->TunerRegs[5].Reg_Val = 0xC0 ;
424
425	state->TunerRegs[6].Reg_Num = 16 ;
426	state->TunerRegs[6].Reg_Val = 0x00 ;
427
428	state->TunerRegs[7].Reg_Num = 17 ;
429	state->TunerRegs[7].Reg_Val = 0x00 ;
430
431	state->TunerRegs[8].Reg_Num = 18 ;
432	state->TunerRegs[8].Reg_Val = 0x00 ;
433
434	state->TunerRegs[9].Reg_Num = 19 ;
435	state->TunerRegs[9].Reg_Val = 0x34 ;
436
437	state->TunerRegs[10].Reg_Num = 21 ;
438	state->TunerRegs[10].Reg_Val = 0x00 ;
439
440	state->TunerRegs[11].Reg_Num = 22 ;
441	state->TunerRegs[11].Reg_Val = 0x6B ;
442
443	state->TunerRegs[12].Reg_Num = 23 ;
444	state->TunerRegs[12].Reg_Val = 0x35 ;
445
446	state->TunerRegs[13].Reg_Num = 24 ;
447	state->TunerRegs[13].Reg_Val = 0x70 ;
448
449	state->TunerRegs[14].Reg_Num = 25 ;
450	state->TunerRegs[14].Reg_Val = 0x3E ;
451
452	state->TunerRegs[15].Reg_Num = 26 ;
453	state->TunerRegs[15].Reg_Val = 0x82 ;
454
455	state->TunerRegs[16].Reg_Num = 31 ;
456	state->TunerRegs[16].Reg_Val = 0x00 ;
457
458	state->TunerRegs[17].Reg_Num = 32 ;
459	state->TunerRegs[17].Reg_Val = 0x40 ;
460
461	state->TunerRegs[18].Reg_Num = 33 ;
462	state->TunerRegs[18].Reg_Val = 0x53 ;
463
464	state->TunerRegs[19].Reg_Num = 34 ;
465	state->TunerRegs[19].Reg_Val = 0x81 ;
466
467	state->TunerRegs[20].Reg_Num = 35 ;
468	state->TunerRegs[20].Reg_Val = 0xC9 ;
469
470	state->TunerRegs[21].Reg_Num = 36 ;
471	state->TunerRegs[21].Reg_Val = 0x01 ;
472
473	state->TunerRegs[22].Reg_Num = 37 ;
474	state->TunerRegs[22].Reg_Val = 0x00 ;
475
476	state->TunerRegs[23].Reg_Num = 41 ;
477	state->TunerRegs[23].Reg_Val = 0x00 ;
478
479	state->TunerRegs[24].Reg_Num = 42 ;
480	state->TunerRegs[24].Reg_Val = 0xF8 ;
481
482	state->TunerRegs[25].Reg_Num = 43 ;
483	state->TunerRegs[25].Reg_Val = 0x43 ;
484
485	state->TunerRegs[26].Reg_Num = 44 ;
486	state->TunerRegs[26].Reg_Val = 0x20 ;
487
488	state->TunerRegs[27].Reg_Num = 45 ;
489	state->TunerRegs[27].Reg_Val = 0x80 ;
490
491	state->TunerRegs[28].Reg_Num = 46 ;
492	state->TunerRegs[28].Reg_Val = 0x88 ;
493
494	state->TunerRegs[29].Reg_Num = 47 ;
495	state->TunerRegs[29].Reg_Val = 0x86 ;
496
497	state->TunerRegs[30].Reg_Num = 48 ;
498	state->TunerRegs[30].Reg_Val = 0x00 ;
499
500	state->TunerRegs[31].Reg_Num = 49 ;
501	state->TunerRegs[31].Reg_Val = 0x00 ;
502
503	state->TunerRegs[32].Reg_Num = 53 ;
504	state->TunerRegs[32].Reg_Val = 0x94 ;
505
506	state->TunerRegs[33].Reg_Num = 54 ;
507	state->TunerRegs[33].Reg_Val = 0xFA ;
508
509	state->TunerRegs[34].Reg_Num = 55 ;
510	state->TunerRegs[34].Reg_Val = 0x92 ;
511
512	state->TunerRegs[35].Reg_Num = 56 ;
513	state->TunerRegs[35].Reg_Val = 0x80 ;
514
515	state->TunerRegs[36].Reg_Num = 57 ;
516	state->TunerRegs[36].Reg_Val = 0x41 ;
517
518	state->TunerRegs[37].Reg_Num = 58 ;
519	state->TunerRegs[37].Reg_Val = 0xDB ;
520
521	state->TunerRegs[38].Reg_Num = 59 ;
522	state->TunerRegs[38].Reg_Val = 0x00 ;
523
524	state->TunerRegs[39].Reg_Num = 60 ;
525	state->TunerRegs[39].Reg_Val = 0x00 ;
526
527	state->TunerRegs[40].Reg_Num = 61 ;
528	state->TunerRegs[40].Reg_Val = 0x00 ;
529
530	state->TunerRegs[41].Reg_Num = 62 ;
531	state->TunerRegs[41].Reg_Val = 0x00 ;
532
533	state->TunerRegs[42].Reg_Num = 65 ;
534	state->TunerRegs[42].Reg_Val = 0xF8 ;
535
536	state->TunerRegs[43].Reg_Num = 66 ;
537	state->TunerRegs[43].Reg_Val = 0xE4 ;
538
539	state->TunerRegs[44].Reg_Num = 67 ;
540	state->TunerRegs[44].Reg_Val = 0x90 ;
541
542	state->TunerRegs[45].Reg_Num = 68 ;
543	state->TunerRegs[45].Reg_Val = 0xC0 ;
544
545	state->TunerRegs[46].Reg_Num = 69 ;
546	state->TunerRegs[46].Reg_Val = 0x01 ;
547
548	state->TunerRegs[47].Reg_Num = 70 ;
549	state->TunerRegs[47].Reg_Val = 0x50 ;
550
551	state->TunerRegs[48].Reg_Num = 71 ;
552	state->TunerRegs[48].Reg_Val = 0x06 ;
553
554	state->TunerRegs[49].Reg_Num = 72 ;
555	state->TunerRegs[49].Reg_Val = 0x00 ;
556
557	state->TunerRegs[50].Reg_Num = 73 ;
558	state->TunerRegs[50].Reg_Val = 0x20 ;
559
560	state->TunerRegs[51].Reg_Num = 76 ;
561	state->TunerRegs[51].Reg_Val = 0xBB ;
562
563	state->TunerRegs[52].Reg_Num = 77 ;
564	state->TunerRegs[52].Reg_Val = 0x13 ;
565
566	state->TunerRegs[53].Reg_Num = 81 ;
567	state->TunerRegs[53].Reg_Val = 0x04 ;
568
569	state->TunerRegs[54].Reg_Num = 82 ;
570	state->TunerRegs[54].Reg_Val = 0x75 ;
571
572	state->TunerRegs[55].Reg_Num = 83 ;
573	state->TunerRegs[55].Reg_Val = 0x00 ;
574
575	state->TunerRegs[56].Reg_Num = 84 ;
576	state->TunerRegs[56].Reg_Val = 0x00 ;
577
578	state->TunerRegs[57].Reg_Num = 85 ;
579	state->TunerRegs[57].Reg_Val = 0x00 ;
580
581	state->TunerRegs[58].Reg_Num = 91 ;
582	state->TunerRegs[58].Reg_Val = 0x70 ;
583
584	state->TunerRegs[59].Reg_Num = 92 ;
585	state->TunerRegs[59].Reg_Val = 0x00 ;
586
587	state->TunerRegs[60].Reg_Num = 93 ;
588	state->TunerRegs[60].Reg_Val = 0x00 ;
589
590	state->TunerRegs[61].Reg_Num = 94 ;
591	state->TunerRegs[61].Reg_Val = 0x00 ;
592
593	state->TunerRegs[62].Reg_Num = 95 ;
594	state->TunerRegs[62].Reg_Val = 0x0C ;
595
596	state->TunerRegs[63].Reg_Num = 96 ;
597	state->TunerRegs[63].Reg_Val = 0x00 ;
598
599	state->TunerRegs[64].Reg_Num = 97 ;
600	state->TunerRegs[64].Reg_Val = 0x00 ;
601
602	state->TunerRegs[65].Reg_Num = 98 ;
603	state->TunerRegs[65].Reg_Val = 0xE2 ;
604
605	state->TunerRegs[66].Reg_Num = 99 ;
606	state->TunerRegs[66].Reg_Val = 0x00 ;
607
608	state->TunerRegs[67].Reg_Num = 100 ;
609	state->TunerRegs[67].Reg_Val = 0x00 ;
610
611	state->TunerRegs[68].Reg_Num = 101 ;
612	state->TunerRegs[68].Reg_Val = 0x12 ;
613
614	state->TunerRegs[69].Reg_Num = 102 ;
615	state->TunerRegs[69].Reg_Val = 0x80 ;
616
617	state->TunerRegs[70].Reg_Num = 103 ;
618	state->TunerRegs[70].Reg_Val = 0x32 ;
619
620	state->TunerRegs[71].Reg_Num = 104 ;
621	state->TunerRegs[71].Reg_Val = 0xB4 ;
622
623	state->TunerRegs[72].Reg_Num = 105 ;
624	state->TunerRegs[72].Reg_Val = 0x60 ;
625
626	state->TunerRegs[73].Reg_Num = 106 ;
627	state->TunerRegs[73].Reg_Val = 0x83 ;
628
629	state->TunerRegs[74].Reg_Num = 107 ;
630	state->TunerRegs[74].Reg_Val = 0x84 ;
631
632	state->TunerRegs[75].Reg_Num = 108 ;
633	state->TunerRegs[75].Reg_Val = 0x9C ;
634
635	state->TunerRegs[76].Reg_Num = 109 ;
636	state->TunerRegs[76].Reg_Val = 0x02 ;
637
638	state->TunerRegs[77].Reg_Num = 110 ;
639	state->TunerRegs[77].Reg_Val = 0x81 ;
640
641	state->TunerRegs[78].Reg_Num = 111 ;
642	state->TunerRegs[78].Reg_Val = 0xC0 ;
643
644	state->TunerRegs[79].Reg_Num = 112 ;
645	state->TunerRegs[79].Reg_Val = 0x10 ;
646
647	state->TunerRegs[80].Reg_Num = 131 ;
648	state->TunerRegs[80].Reg_Val = 0x8A ;
649
650	state->TunerRegs[81].Reg_Num = 132 ;
651	state->TunerRegs[81].Reg_Val = 0x10 ;
652
653	state->TunerRegs[82].Reg_Num = 133 ;
654	state->TunerRegs[82].Reg_Val = 0x24 ;
655
656	state->TunerRegs[83].Reg_Num = 134 ;
657	state->TunerRegs[83].Reg_Val = 0x00 ;
658
659	state->TunerRegs[84].Reg_Num = 135 ;
660	state->TunerRegs[84].Reg_Val = 0x00 ;
661
662	state->TunerRegs[85].Reg_Num = 136 ;
663	state->TunerRegs[85].Reg_Val = 0x7E ;
664
665	state->TunerRegs[86].Reg_Num = 137 ;
666	state->TunerRegs[86].Reg_Val = 0x40 ;
667
668	state->TunerRegs[87].Reg_Num = 138 ;
669	state->TunerRegs[87].Reg_Val = 0x38 ;
670
671	state->TunerRegs[88].Reg_Num = 146 ;
672	state->TunerRegs[88].Reg_Val = 0xF6 ;
673
674	state->TunerRegs[89].Reg_Num = 147 ;
675	state->TunerRegs[89].Reg_Val = 0x1A ;
676
677	state->TunerRegs[90].Reg_Num = 148 ;
678	state->TunerRegs[90].Reg_Val = 0x62 ;
679
680	state->TunerRegs[91].Reg_Num = 149 ;
681	state->TunerRegs[91].Reg_Val = 0x33 ;
682
683	state->TunerRegs[92].Reg_Num = 150 ;
684	state->TunerRegs[92].Reg_Val = 0x80 ;
685
686	state->TunerRegs[93].Reg_Num = 156 ;
687	state->TunerRegs[93].Reg_Val = 0x56 ;
688
689	state->TunerRegs[94].Reg_Num = 157 ;
690	state->TunerRegs[94].Reg_Val = 0x17 ;
691
692	state->TunerRegs[95].Reg_Num = 158 ;
693	state->TunerRegs[95].Reg_Val = 0xA9 ;
694
695	state->TunerRegs[96].Reg_Num = 159 ;
696	state->TunerRegs[96].Reg_Val = 0x00 ;
697
698	state->TunerRegs[97].Reg_Num = 160 ;
699	state->TunerRegs[97].Reg_Val = 0x00 ;
700
701	state->TunerRegs[98].Reg_Num = 161 ;
702	state->TunerRegs[98].Reg_Val = 0x00 ;
703
704	state->TunerRegs[99].Reg_Num = 162 ;
705	state->TunerRegs[99].Reg_Val = 0x40 ;
706
707	state->TunerRegs[100].Reg_Num = 166 ;
708	state->TunerRegs[100].Reg_Val = 0xAE ;
709
710	state->TunerRegs[101].Reg_Num = 167 ;
711	state->TunerRegs[101].Reg_Val = 0x1B ;
712
713	state->TunerRegs[102].Reg_Num = 168 ;
714	state->TunerRegs[102].Reg_Val = 0xF2 ;
715
716	state->TunerRegs[103].Reg_Num = 195 ;
717	state->TunerRegs[103].Reg_Val = 0x00 ;
718
719	return 0 ;
720}
721
722static u16 MXL5005_ControlInit(struct dvb_frontend *fe)
723{
724	struct mxl5005s_state *state = fe->tuner_priv;
725	state->Init_Ctrl_Num = INITCTRL_NUM;
726
727	state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;
728	state->Init_Ctrl[0].size = 1 ;
729	state->Init_Ctrl[0].addr[0] = 73;
730	state->Init_Ctrl[0].bit[0] = 7;
731	state->Init_Ctrl[0].val[0] = 0;
732
733	state->Init_Ctrl[1].Ctrl_Num = BB_MODE ;
734	state->Init_Ctrl[1].size = 1 ;
735	state->Init_Ctrl[1].addr[0] = 53;
736	state->Init_Ctrl[1].bit[0] = 2;
737	state->Init_Ctrl[1].val[0] = 1;
738
739	state->Init_Ctrl[2].Ctrl_Num = BB_BUF ;
740	state->Init_Ctrl[2].size = 2 ;
741	state->Init_Ctrl[2].addr[0] = 53;
742	state->Init_Ctrl[2].bit[0] = 1;
743	state->Init_Ctrl[2].val[0] = 0;
744	state->Init_Ctrl[2].addr[1] = 57;
745	state->Init_Ctrl[2].bit[1] = 0;
746	state->Init_Ctrl[2].val[1] = 1;
747
748	state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;
749	state->Init_Ctrl[3].size = 1 ;
750	state->Init_Ctrl[3].addr[0] = 53;
751	state->Init_Ctrl[3].bit[0] = 0;
752	state->Init_Ctrl[3].val[0] = 0;
753
754	state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;
755	state->Init_Ctrl[4].size = 3 ;
756	state->Init_Ctrl[4].addr[0] = 53;
757	state->Init_Ctrl[4].bit[0] = 5;
758	state->Init_Ctrl[4].val[0] = 0;
759	state->Init_Ctrl[4].addr[1] = 53;
760	state->Init_Ctrl[4].bit[1] = 6;
761	state->Init_Ctrl[4].val[1] = 0;
762	state->Init_Ctrl[4].addr[2] = 53;
763	state->Init_Ctrl[4].bit[2] = 7;
764	state->Init_Ctrl[4].val[2] = 1;
765
766	state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;
767	state->Init_Ctrl[5].size = 1 ;
768	state->Init_Ctrl[5].addr[0] = 59;
769	state->Init_Ctrl[5].bit[0] = 0;
770	state->Init_Ctrl[5].val[0] = 0;
771
772	state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ;
773	state->Init_Ctrl[6].size = 2 ;
774	state->Init_Ctrl[6].addr[0] = 53;
775	state->Init_Ctrl[6].bit[0] = 3;
776	state->Init_Ctrl[6].val[0] = 0;
777	state->Init_Ctrl[6].addr[1] = 53;
778	state->Init_Ctrl[6].bit[1] = 4;
779	state->Init_Ctrl[6].val[1] = 1;
780
781	state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ;
782	state->Init_Ctrl[7].size = 4 ;
783	state->Init_Ctrl[7].addr[0] = 22;
784	state->Init_Ctrl[7].bit[0] = 4;
785	state->Init_Ctrl[7].val[0] = 0;
786	state->Init_Ctrl[7].addr[1] = 22;
787	state->Init_Ctrl[7].bit[1] = 5;
788	state->Init_Ctrl[7].val[1] = 1;
789	state->Init_Ctrl[7].addr[2] = 22;
790	state->Init_Ctrl[7].bit[2] = 6;
791	state->Init_Ctrl[7].val[2] = 1;
792	state->Init_Ctrl[7].addr[3] = 22;
793	state->Init_Ctrl[7].bit[3] = 7;
794	state->Init_Ctrl[7].val[3] = 0;
795
796	state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ;
797	state->Init_Ctrl[8].size = 1 ;
798	state->Init_Ctrl[8].addr[0] = 22;
799	state->Init_Ctrl[8].bit[0] = 2;
800	state->Init_Ctrl[8].val[0] = 0;
801
802	state->Init_Ctrl[9].Ctrl_Num = AGC_IF ;
803	state->Init_Ctrl[9].size = 4 ;
804	state->Init_Ctrl[9].addr[0] = 76;
805	state->Init_Ctrl[9].bit[0] = 0;
806	state->Init_Ctrl[9].val[0] = 1;
807	state->Init_Ctrl[9].addr[1] = 76;
808	state->Init_Ctrl[9].bit[1] = 1;
809	state->Init_Ctrl[9].val[1] = 1;
810	state->Init_Ctrl[9].addr[2] = 76;
811	state->Init_Ctrl[9].bit[2] = 2;
812	state->Init_Ctrl[9].val[2] = 0;
813	state->Init_Ctrl[9].addr[3] = 76;
814	state->Init_Ctrl[9].bit[3] = 3;
815	state->Init_Ctrl[9].val[3] = 1;
816
817	state->Init_Ctrl[10].Ctrl_Num = AGC_RF ;
818	state->Init_Ctrl[10].size = 4 ;
819	state->Init_Ctrl[10].addr[0] = 76;
820	state->Init_Ctrl[10].bit[0] = 4;
821	state->Init_Ctrl[10].val[0] = 1;
822	state->Init_Ctrl[10].addr[1] = 76;
823	state->Init_Ctrl[10].bit[1] = 5;
824	state->Init_Ctrl[10].val[1] = 1;
825	state->Init_Ctrl[10].addr[2] = 76;
826	state->Init_Ctrl[10].bit[2] = 6;
827	state->Init_Ctrl[10].val[2] = 0;
828	state->Init_Ctrl[10].addr[3] = 76;
829	state->Init_Ctrl[10].bit[3] = 7;
830	state->Init_Ctrl[10].val[3] = 1;
831
832	state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ;
833	state->Init_Ctrl[11].size = 5 ;
834	state->Init_Ctrl[11].addr[0] = 43;
835	state->Init_Ctrl[11].bit[0] = 3;
836	state->Init_Ctrl[11].val[0] = 0;
837	state->Init_Ctrl[11].addr[1] = 43;
838	state->Init_Ctrl[11].bit[1] = 4;
839	state->Init_Ctrl[11].val[1] = 0;
840	state->Init_Ctrl[11].addr[2] = 43;
841	state->Init_Ctrl[11].bit[2] = 5;
842	state->Init_Ctrl[11].val[2] = 0;
843	state->Init_Ctrl[11].addr[3] = 43;
844	state->Init_Ctrl[11].bit[3] = 6;
845	state->Init_Ctrl[11].val[3] = 1;
846	state->Init_Ctrl[11].addr[4] = 43;
847	state->Init_Ctrl[11].bit[4] = 7;
848	state->Init_Ctrl[11].val[4] = 0;
849
850	state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ;
851	state->Init_Ctrl[12].size = 6 ;
852	state->Init_Ctrl[12].addr[0] = 44;
853	state->Init_Ctrl[12].bit[0] = 2;
854	state->Init_Ctrl[12].val[0] = 0;
855	state->Init_Ctrl[12].addr[1] = 44;
856	state->Init_Ctrl[12].bit[1] = 3;
857	state->Init_Ctrl[12].val[1] = 0;
858	state->Init_Ctrl[12].addr[2] = 44;
859	state->Init_Ctrl[12].bit[2] = 4;
860	state->Init_Ctrl[12].val[2] = 0;
861	state->Init_Ctrl[12].addr[3] = 44;
862	state->Init_Ctrl[12].bit[3] = 5;
863	state->Init_Ctrl[12].val[3] = 1;
864	state->Init_Ctrl[12].addr[4] = 44;
865	state->Init_Ctrl[12].bit[4] = 6;
866	state->Init_Ctrl[12].val[4] = 0;
867	state->Init_Ctrl[12].addr[5] = 44;
868	state->Init_Ctrl[12].bit[5] = 7;
869	state->Init_Ctrl[12].val[5] = 0;
870
871	state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ;
872	state->Init_Ctrl[13].size = 7 ;
873	state->Init_Ctrl[13].addr[0] = 11;
874	state->Init_Ctrl[13].bit[0] = 0;
875	state->Init_Ctrl[13].val[0] = 1;
876	state->Init_Ctrl[13].addr[1] = 11;
877	state->Init_Ctrl[13].bit[1] = 1;
878	state->Init_Ctrl[13].val[1] = 0;
879	state->Init_Ctrl[13].addr[2] = 11;
880	state->Init_Ctrl[13].bit[2] = 2;
881	state->Init_Ctrl[13].val[2] = 0;
882	state->Init_Ctrl[13].addr[3] = 11;
883	state->Init_Ctrl[13].bit[3] = 3;
884	state->Init_Ctrl[13].val[3] = 1;
885	state->Init_Ctrl[13].addr[4] = 11;
886	state->Init_Ctrl[13].bit[4] = 4;
887	state->Init_Ctrl[13].val[4] = 1;
888	state->Init_Ctrl[13].addr[5] = 11;
889	state->Init_Ctrl[13].bit[5] = 5;
890	state->Init_Ctrl[13].val[5] = 0;
891	state->Init_Ctrl[13].addr[6] = 11;
892	state->Init_Ctrl[13].bit[6] = 6;
893	state->Init_Ctrl[13].val[6] = 0;
894
895	state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ;
896	state->Init_Ctrl[14].size = 16 ;
897	state->Init_Ctrl[14].addr[0] = 13;
898	state->Init_Ctrl[14].bit[0] = 0;
899	state->Init_Ctrl[14].val[0] = 0;
900	state->Init_Ctrl[14].addr[1] = 13;
901	state->Init_Ctrl[14].bit[1] = 1;
902	state->Init_Ctrl[14].val[1] = 0;
903	state->Init_Ctrl[14].addr[2] = 13;
904	state->Init_Ctrl[14].bit[2] = 2;
905	state->Init_Ctrl[14].val[2] = 0;
906	state->Init_Ctrl[14].addr[3] = 13;
907	state->Init_Ctrl[14].bit[3] = 3;
908	state->Init_Ctrl[14].val[3] = 0;
909	state->Init_Ctrl[14].addr[4] = 13;
910	state->Init_Ctrl[14].bit[4] = 4;
911	state->Init_Ctrl[14].val[4] = 0;
912	state->Init_Ctrl[14].addr[5] = 13;
913	state->Init_Ctrl[14].bit[5] = 5;
914	state->Init_Ctrl[14].val[5] = 0;
915	state->Init_Ctrl[14].addr[6] = 13;
916	state->Init_Ctrl[14].bit[6] = 6;
917	state->Init_Ctrl[14].val[6] = 0;
918	state->Init_Ctrl[14].addr[7] = 13;
919	state->Init_Ctrl[14].bit[7] = 7;
920	state->Init_Ctrl[14].val[7] = 0;
921	state->Init_Ctrl[14].addr[8] = 12;
922	state->Init_Ctrl[14].bit[8] = 0;
923	state->Init_Ctrl[14].val[8] = 0;
924	state->Init_Ctrl[14].addr[9] = 12;
925	state->Init_Ctrl[14].bit[9] = 1;
926	state->Init_Ctrl[14].val[9] = 0;
927	state->Init_Ctrl[14].addr[10] = 12;
928	state->Init_Ctrl[14].bit[10] = 2;
929	state->Init_Ctrl[14].val[10] = 0;
930	state->Init_Ctrl[14].addr[11] = 12;
931	state->Init_Ctrl[14].bit[11] = 3;
932	state->Init_Ctrl[14].val[11] = 0;
933	state->Init_Ctrl[14].addr[12] = 12;
934	state->Init_Ctrl[14].bit[12] = 4;
935	state->Init_Ctrl[14].val[12] = 0;
936	state->Init_Ctrl[14].addr[13] = 12;
937	state->Init_Ctrl[14].bit[13] = 5;
938	state->Init_Ctrl[14].val[13] = 1;
939	state->Init_Ctrl[14].addr[14] = 12;
940	state->Init_Ctrl[14].bit[14] = 6;
941	state->Init_Ctrl[14].val[14] = 1;
942	state->Init_Ctrl[14].addr[15] = 12;
943	state->Init_Ctrl[14].bit[15] = 7;
944	state->Init_Ctrl[14].val[15] = 0;
945
946	state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ;
947	state->Init_Ctrl[15].size = 3 ;
948	state->Init_Ctrl[15].addr[0] = 147;
949	state->Init_Ctrl[15].bit[0] = 2;
950	state->Init_Ctrl[15].val[0] = 0;
951	state->Init_Ctrl[15].addr[1] = 147;
952	state->Init_Ctrl[15].bit[1] = 3;
953	state->Init_Ctrl[15].val[1] = 1;
954	state->Init_Ctrl[15].addr[2] = 147;
955	state->Init_Ctrl[15].bit[2] = 4;
956	state->Init_Ctrl[15].val[2] = 1;
957
958	state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ;
959	state->Init_Ctrl[16].size = 2 ;
960	state->Init_Ctrl[16].addr[0] = 147;
961	state->Init_Ctrl[16].bit[0] = 0;
962	state->Init_Ctrl[16].val[0] = 0;
963	state->Init_Ctrl[16].addr[1] = 147;
964	state->Init_Ctrl[16].bit[1] = 1;
965	state->Init_Ctrl[16].val[1] = 1;
966
967	state->Init_Ctrl[17].Ctrl_Num = EN_AAF ;
968	state->Init_Ctrl[17].size = 1 ;
969	state->Init_Ctrl[17].addr[0] = 147;
970	state->Init_Ctrl[17].bit[0] = 7;
971	state->Init_Ctrl[17].val[0] = 0;
972
973	state->Init_Ctrl[18].Ctrl_Num = EN_3P ;
974	state->Init_Ctrl[18].size = 1 ;
975	state->Init_Ctrl[18].addr[0] = 147;
976	state->Init_Ctrl[18].bit[0] = 6;
977	state->Init_Ctrl[18].val[0] = 0;
978
979	state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ;
980	state->Init_Ctrl[19].size = 1 ;
981	state->Init_Ctrl[19].addr[0] = 156;
982	state->Init_Ctrl[19].bit[0] = 0;
983	state->Init_Ctrl[19].val[0] = 0;
984
985	state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ;
986	state->Init_Ctrl[20].size = 1 ;
987	state->Init_Ctrl[20].addr[0] = 147;
988	state->Init_Ctrl[20].bit[0] = 5;
989	state->Init_Ctrl[20].val[0] = 0;
990
991	state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ;
992	state->Init_Ctrl[21].size = 1 ;
993	state->Init_Ctrl[21].addr[0] = 137;
994	state->Init_Ctrl[21].bit[0] = 4;
995	state->Init_Ctrl[21].val[0] = 0;
996
997	state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ;
998	state->Init_Ctrl[22].size = 1 ;
999	state->Init_Ctrl[22].addr[0] = 137;
1000	state->Init_Ctrl[22].bit[0] = 7;
1001	state->Init_Ctrl[22].val[0] = 0;
1002
1003	state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ;
1004	state->Init_Ctrl[23].size = 1 ;
1005	state->Init_Ctrl[23].addr[0] = 91;
1006	state->Init_Ctrl[23].bit[0] = 5;
1007	state->Init_Ctrl[23].val[0] = 1;
1008
1009	state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ;
1010	state->Init_Ctrl[24].size = 1 ;
1011	state->Init_Ctrl[24].addr[0] = 43;
1012	state->Init_Ctrl[24].bit[0] = 0;
1013	state->Init_Ctrl[24].val[0] = 1;
1014
1015	state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ;
1016	state->Init_Ctrl[25].size = 2 ;
1017	state->Init_Ctrl[25].addr[0] = 22;
1018	state->Init_Ctrl[25].bit[0] = 0;
1019	state->Init_Ctrl[25].val[0] = 1;
1020	state->Init_Ctrl[25].addr[1] = 22;
1021	state->Init_Ctrl[25].bit[1] = 1;
1022	state->Init_Ctrl[25].val[1] = 1;
1023
1024	state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ;
1025	state->Init_Ctrl[26].size = 1 ;
1026	state->Init_Ctrl[26].addr[0] = 134;
1027	state->Init_Ctrl[26].bit[0] = 2;
1028	state->Init_Ctrl[26].val[0] = 0;
1029
1030	state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ;
1031	state->Init_Ctrl[27].size = 1 ;
1032	state->Init_Ctrl[27].addr[0] = 137;
1033	state->Init_Ctrl[27].bit[0] = 3;
1034	state->Init_Ctrl[27].val[0] = 0;
1035
1036	state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ;
1037	state->Init_Ctrl[28].size = 1 ;
1038	state->Init_Ctrl[28].addr[0] = 77;
1039	state->Init_Ctrl[28].bit[0] = 7;
1040	state->Init_Ctrl[28].val[0] = 0;
1041
1042	state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ;
1043	state->Init_Ctrl[29].size = 1 ;
1044	state->Init_Ctrl[29].addr[0] = 166;
1045	state->Init_Ctrl[29].bit[0] = 7;
1046	state->Init_Ctrl[29].val[0] = 1;
1047
1048	state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ;
1049	state->Init_Ctrl[30].size = 3 ;
1050	state->Init_Ctrl[30].addr[0] = 166;
1051	state->Init_Ctrl[30].bit[0] = 0;
1052	state->Init_Ctrl[30].val[0] = 0;
1053	state->Init_Ctrl[30].addr[1] = 166;
1054	state->Init_Ctrl[30].bit[1] = 1;
1055	state->Init_Ctrl[30].val[1] = 1;
1056	state->Init_Ctrl[30].addr[2] = 166;
1057	state->Init_Ctrl[30].bit[2] = 2;
1058	state->Init_Ctrl[30].val[2] = 1;
1059
1060	state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ;
1061	state->Init_Ctrl[31].size = 3 ;
1062	state->Init_Ctrl[31].addr[0] = 166;
1063	state->Init_Ctrl[31].bit[0] = 3;
1064	state->Init_Ctrl[31].val[0] = 1;
1065	state->Init_Ctrl[31].addr[1] = 166;
1066	state->Init_Ctrl[31].bit[1] = 4;
1067	state->Init_Ctrl[31].val[1] = 0;
1068	state->Init_Ctrl[31].addr[2] = 166;
1069	state->Init_Ctrl[31].bit[2] = 5;
1070	state->Init_Ctrl[31].val[2] = 1;
1071
1072	state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ;
1073	state->Init_Ctrl[32].size = 3 ;
1074	state->Init_Ctrl[32].addr[0] = 167;
1075	state->Init_Ctrl[32].bit[0] = 0;
1076	state->Init_Ctrl[32].val[0] = 1;
1077	state->Init_Ctrl[32].addr[1] = 167;
1078	state->Init_Ctrl[32].bit[1] = 1;
1079	state->Init_Ctrl[32].val[1] = 1;
1080	state->Init_Ctrl[32].addr[2] = 167;
1081	state->Init_Ctrl[32].bit[2] = 2;
1082	state->Init_Ctrl[32].val[2] = 0;
1083
1084	state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ;
1085	state->Init_Ctrl[33].size = 4 ;
1086	state->Init_Ctrl[33].addr[0] = 168;
1087	state->Init_Ctrl[33].bit[0] = 0;
1088	state->Init_Ctrl[33].val[0] = 0;
1089	state->Init_Ctrl[33].addr[1] = 168;
1090	state->Init_Ctrl[33].bit[1] = 1;
1091	state->Init_Ctrl[33].val[1] = 1;
1092	state->Init_Ctrl[33].addr[2] = 168;
1093	state->Init_Ctrl[33].bit[2] = 2;
1094	state->Init_Ctrl[33].val[2] = 0;
1095	state->Init_Ctrl[33].addr[3] = 168;
1096	state->Init_Ctrl[33].bit[3] = 3;
1097	state->Init_Ctrl[33].val[3] = 0;
1098
1099	state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ;
1100	state->Init_Ctrl[34].size = 4 ;
1101	state->Init_Ctrl[34].addr[0] = 168;
1102	state->Init_Ctrl[34].bit[0] = 4;
1103	state->Init_Ctrl[34].val[0] = 1;
1104	state->Init_Ctrl[34].addr[1] = 168;
1105	state->Init_Ctrl[34].bit[1] = 5;
1106	state->Init_Ctrl[34].val[1] = 1;
1107	state->Init_Ctrl[34].addr[2] = 168;
1108	state->Init_Ctrl[34].bit[2] = 6;
1109	state->Init_Ctrl[34].val[2] = 1;
1110	state->Init_Ctrl[34].addr[3] = 168;
1111	state->Init_Ctrl[34].bit[3] = 7;
1112	state->Init_Ctrl[34].val[3] = 1;
1113
1114	state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ;
1115	state->Init_Ctrl[35].size = 1 ;
1116	state->Init_Ctrl[35].addr[0] = 135;
1117	state->Init_Ctrl[35].bit[0] = 0;
1118	state->Init_Ctrl[35].val[0] = 0;
1119
1120	state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ;
1121	state->Init_Ctrl[36].size = 1 ;
1122	state->Init_Ctrl[36].addr[0] = 56;
1123	state->Init_Ctrl[36].bit[0] = 3;
1124	state->Init_Ctrl[36].val[0] = 0;
1125
1126	state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ;
1127	state->Init_Ctrl[37].size = 7 ;
1128	state->Init_Ctrl[37].addr[0] = 59;
1129	state->Init_Ctrl[37].bit[0] = 1;
1130	state->Init_Ctrl[37].val[0] = 0;
1131	state->Init_Ctrl[37].addr[1] = 59;
1132	state->Init_Ctrl[37].bit[1] = 2;
1133	state->Init_Ctrl[37].val[1] = 0;
1134	state->Init_Ctrl[37].addr[2] = 59;
1135	state->Init_Ctrl[37].bit[2] = 3;
1136	state->Init_Ctrl[37].val[2] = 0;
1137	state->Init_Ctrl[37].addr[3] = 59;
1138	state->Init_Ctrl[37].bit[3] = 4;
1139	state->Init_Ctrl[37].val[3] = 0;
1140	state->Init_Ctrl[37].addr[4] = 59;
1141	state->Init_Ctrl[37].bit[4] = 5;
1142	state->Init_Ctrl[37].val[4] = 0;
1143	state->Init_Ctrl[37].addr[5] = 59;
1144	state->Init_Ctrl[37].bit[5] = 6;
1145	state->Init_Ctrl[37].val[5] = 0;
1146	state->Init_Ctrl[37].addr[6] = 59;
1147	state->Init_Ctrl[37].bit[6] = 7;
1148	state->Init_Ctrl[37].val[6] = 0;
1149
1150	state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ;
1151	state->Init_Ctrl[38].size = 6 ;
1152	state->Init_Ctrl[38].addr[0] = 32;
1153	state->Init_Ctrl[38].bit[0] = 2;
1154	state->Init_Ctrl[38].val[0] = 0;
1155	state->Init_Ctrl[38].addr[1] = 32;
1156	state->Init_Ctrl[38].bit[1] = 3;
1157	state->Init_Ctrl[38].val[1] = 0;
1158	state->Init_Ctrl[38].addr[2] = 32;
1159	state->Init_Ctrl[38].bit[2] = 4;
1160	state->Init_Ctrl[38].val[2] = 0;
1161	state->Init_Ctrl[38].addr[3] = 32;
1162	state->Init_Ctrl[38].bit[3] = 5;
1163	state->Init_Ctrl[38].val[3] = 0;
1164	state->Init_Ctrl[38].addr[4] = 32;
1165	state->Init_Ctrl[38].bit[4] = 6;
1166	state->Init_Ctrl[38].val[4] = 1;
1167	state->Init_Ctrl[38].addr[5] = 32;
1168	state->Init_Ctrl[38].bit[5] = 7;
1169	state->Init_Ctrl[38].val[5] = 0;
1170
1171	state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ;
1172	state->Init_Ctrl[39].size = 1 ;
1173	state->Init_Ctrl[39].addr[0] = 25;
1174	state->Init_Ctrl[39].bit[0] = 3;
1175	state->Init_Ctrl[39].val[0] = 1;
1176
1177
1178	state->CH_Ctrl_Num = CHCTRL_NUM ;
1179
1180	state->CH_Ctrl[0].Ctrl_Num = DN_POLY ;
1181	state->CH_Ctrl[0].size = 2 ;
1182	state->CH_Ctrl[0].addr[0] = 68;
1183	state->CH_Ctrl[0].bit[0] = 6;
1184	state->CH_Ctrl[0].val[0] = 1;
1185	state->CH_Ctrl[0].addr[1] = 68;
1186	state->CH_Ctrl[0].bit[1] = 7;
1187	state->CH_Ctrl[0].val[1] = 1;
1188
1189	state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ;
1190	state->CH_Ctrl[1].size = 2 ;
1191	state->CH_Ctrl[1].addr[0] = 70;
1192	state->CH_Ctrl[1].bit[0] = 6;
1193	state->CH_Ctrl[1].val[0] = 1;
1194	state->CH_Ctrl[1].addr[1] = 70;
1195	state->CH_Ctrl[1].bit[1] = 7;
1196	state->CH_Ctrl[1].val[1] = 0;
1197
1198	state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ;
1199	state->CH_Ctrl[2].size = 9 ;
1200	state->CH_Ctrl[2].addr[0] = 69;
1201	state->CH_Ctrl[2].bit[0] = 5;
1202	state->CH_Ctrl[2].val[0] = 0;
1203	state->CH_Ctrl[2].addr[1] = 69;
1204	state->CH_Ctrl[2].bit[1] = 6;
1205	state->CH_Ctrl[2].val[1] = 0;
1206	state->CH_Ctrl[2].addr[2] = 69;
1207	state->CH_Ctrl[2].bit[2] = 7;
1208	state->CH_Ctrl[2].val[2] = 0;
1209	state->CH_Ctrl[2].addr[3] = 68;
1210	state->CH_Ctrl[2].bit[3] = 0;
1211	state->CH_Ctrl[2].val[3] = 0;
1212	state->CH_Ctrl[2].addr[4] = 68;
1213	state->CH_Ctrl[2].bit[4] = 1;
1214	state->CH_Ctrl[2].val[4] = 0;
1215	state->CH_Ctrl[2].addr[5] = 68;
1216	state->CH_Ctrl[2].bit[5] = 2;
1217	state->CH_Ctrl[2].val[5] = 0;
1218	state->CH_Ctrl[2].addr[6] = 68;
1219	state->CH_Ctrl[2].bit[6] = 3;
1220	state->CH_Ctrl[2].val[6] = 0;
1221	state->CH_Ctrl[2].addr[7] = 68;
1222	state->CH_Ctrl[2].bit[7] = 4;
1223	state->CH_Ctrl[2].val[7] = 0;
1224	state->CH_Ctrl[2].addr[8] = 68;
1225	state->CH_Ctrl[2].bit[8] = 5;
1226	state->CH_Ctrl[2].val[8] = 0;
1227
1228	state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ;
1229	state->CH_Ctrl[3].size = 1 ;
1230	state->CH_Ctrl[3].addr[0] = 70;
1231	state->CH_Ctrl[3].bit[0] = 5;
1232	state->CH_Ctrl[3].val[0] = 0;
1233
1234	state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ;
1235	state->CH_Ctrl[4].size = 3 ;
1236	state->CH_Ctrl[4].addr[0] = 73;
1237	state->CH_Ctrl[4].bit[0] = 4;
1238	state->CH_Ctrl[4].val[0] = 0;
1239	state->CH_Ctrl[4].addr[1] = 73;
1240	state->CH_Ctrl[4].bit[1] = 5;
1241	state->CH_Ctrl[4].val[1] = 1;
1242	state->CH_Ctrl[4].addr[2] = 73;
1243	state->CH_Ctrl[4].bit[2] = 6;
1244	state->CH_Ctrl[4].val[2] = 0;
1245
1246	state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ;
1247	state->CH_Ctrl[5].size = 4 ;
1248	state->CH_Ctrl[5].addr[0] = 70;
1249	state->CH_Ctrl[5].bit[0] = 0;
1250	state->CH_Ctrl[5].val[0] = 0;
1251	state->CH_Ctrl[5].addr[1] = 70;
1252	state->CH_Ctrl[5].bit[1] = 1;
1253	state->CH_Ctrl[5].val[1] = 0;
1254	state->CH_Ctrl[5].addr[2] = 70;
1255	state->CH_Ctrl[5].bit[2] = 2;
1256	state->CH_Ctrl[5].val[2] = 0;
1257	state->CH_Ctrl[5].addr[3] = 70;
1258	state->CH_Ctrl[5].bit[3] = 3;
1259	state->CH_Ctrl[5].val[3] = 0;
1260
1261	state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ;
1262	state->CH_Ctrl[6].size = 1 ;
1263	state->CH_Ctrl[6].addr[0] = 70;
1264	state->CH_Ctrl[6].bit[0] = 4;
1265	state->CH_Ctrl[6].val[0] = 1;
1266
1267	state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ;
1268	state->CH_Ctrl[7].size = 1 ;
1269	state->CH_Ctrl[7].addr[0] = 111;
1270	state->CH_Ctrl[7].bit[0] = 4;
1271	state->CH_Ctrl[7].val[0] = 0;
1272
1273	state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ;
1274	state->CH_Ctrl[8].size = 1 ;
1275	state->CH_Ctrl[8].addr[0] = 111;
1276	state->CH_Ctrl[8].bit[0] = 7;
1277	state->CH_Ctrl[8].val[0] = 1;
1278
1279	state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ;
1280	state->CH_Ctrl[9].size = 1 ;
1281	state->CH_Ctrl[9].addr[0] = 111;
1282	state->CH_Ctrl[9].bit[0] = 6;
1283	state->CH_Ctrl[9].val[0] = 1;
1284
1285	state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ;
1286	state->CH_Ctrl[10].size = 1 ;
1287	state->CH_Ctrl[10].addr[0] = 111;
1288	state->CH_Ctrl[10].bit[0] = 5;
1289	state->CH_Ctrl[10].val[0] = 0;
1290
1291	state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ;
1292	state->CH_Ctrl[11].size = 2 ;
1293	state->CH_Ctrl[11].addr[0] = 110;
1294	state->CH_Ctrl[11].bit[0] = 0;
1295	state->CH_Ctrl[11].val[0] = 1;
1296	state->CH_Ctrl[11].addr[1] = 110;
1297	state->CH_Ctrl[11].bit[1] = 1;
1298	state->CH_Ctrl[11].val[1] = 0;
1299
1300	state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ;
1301	state->CH_Ctrl[12].size = 3 ;
1302	state->CH_Ctrl[12].addr[0] = 69;
1303	state->CH_Ctrl[12].bit[0] = 2;
1304	state->CH_Ctrl[12].val[0] = 0;
1305	state->CH_Ctrl[12].addr[1] = 69;
1306	state->CH_Ctrl[12].bit[1] = 3;
1307	state->CH_Ctrl[12].val[1] = 0;
1308	state->CH_Ctrl[12].addr[2] = 69;
1309	state->CH_Ctrl[12].bit[2] = 4;
1310	state->CH_Ctrl[12].val[2] = 0;
1311
1312	state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ;
1313	state->CH_Ctrl[13].size = 6 ;
1314	state->CH_Ctrl[13].addr[0] = 110;
1315	state->CH_Ctrl[13].bit[0] = 2;
1316	state->CH_Ctrl[13].val[0] = 0;
1317	state->CH_Ctrl[13].addr[1] = 110;
1318	state->CH_Ctrl[13].bit[1] = 3;
1319	state->CH_Ctrl[13].val[1] = 0;
1320	state->CH_Ctrl[13].addr[2] = 110;
1321	state->CH_Ctrl[13].bit[2] = 4;
1322	state->CH_Ctrl[13].val[2] = 0;
1323	state->CH_Ctrl[13].addr[3] = 110;
1324	state->CH_Ctrl[13].bit[3] = 5;
1325	state->CH_Ctrl[13].val[3] = 0;
1326	state->CH_Ctrl[13].addr[4] = 110;
1327	state->CH_Ctrl[13].bit[4] = 6;
1328	state->CH_Ctrl[13].val[4] = 0;
1329	state->CH_Ctrl[13].addr[5] = 110;
1330	state->CH_Ctrl[13].bit[5] = 7;
1331	state->CH_Ctrl[13].val[5] = 1;
1332
1333	state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ;
1334	state->CH_Ctrl[14].size = 7 ;
1335	state->CH_Ctrl[14].addr[0] = 14;
1336	state->CH_Ctrl[14].bit[0] = 0;
1337	state->CH_Ctrl[14].val[0] = 0;
1338	state->CH_Ctrl[14].addr[1] = 14;
1339	state->CH_Ctrl[14].bit[1] = 1;
1340	state->CH_Ctrl[14].val[1] = 0;
1341	state->CH_Ctrl[14].addr[2] = 14;
1342	state->CH_Ctrl[14].bit[2] = 2;
1343	state->CH_Ctrl[14].val[2] = 0;
1344	state->CH_Ctrl[14].addr[3] = 14;
1345	state->CH_Ctrl[14].bit[3] = 3;
1346	state->CH_Ctrl[14].val[3] = 0;
1347	state->CH_Ctrl[14].addr[4] = 14;
1348	state->CH_Ctrl[14].bit[4] = 4;
1349	state->CH_Ctrl[14].val[4] = 0;
1350	state->CH_Ctrl[14].addr[5] = 14;
1351	state->CH_Ctrl[14].bit[5] = 5;
1352	state->CH_Ctrl[14].val[5] = 0;
1353	state->CH_Ctrl[14].addr[6] = 14;
1354	state->CH_Ctrl[14].bit[6] = 6;
1355	state->CH_Ctrl[14].val[6] = 0;
1356
1357	state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ;
1358	state->CH_Ctrl[15].size = 18 ;
1359	state->CH_Ctrl[15].addr[0] = 17;
1360	state->CH_Ctrl[15].bit[0] = 6;
1361	state->CH_Ctrl[15].val[0] = 0;
1362	state->CH_Ctrl[15].addr[1] = 17;
1363	state->CH_Ctrl[15].bit[1] = 7;
1364	state->CH_Ctrl[15].val[1] = 0;
1365	state->CH_Ctrl[15].addr[2] = 16;
1366	state->CH_Ctrl[15].bit[2] = 0;
1367	state->CH_Ctrl[15].val[2] = 0;
1368	state->CH_Ctrl[15].addr[3] = 16;
1369	state->CH_Ctrl[15].bit[3] = 1;
1370	state->CH_Ctrl[15].val[3] = 0;
1371	state->CH_Ctrl[15].addr[4] = 16;
1372	state->CH_Ctrl[15].bit[4] = 2;
1373	state->CH_Ctrl[15].val[4] = 0;
1374	state->CH_Ctrl[15].addr[5] = 16;
1375	state->CH_Ctrl[15].bit[5] = 3;
1376	state->CH_Ctrl[15].val[5] = 0;
1377	state->CH_Ctrl[15].addr[6] = 16;
1378	state->CH_Ctrl[15].bit[6] = 4;
1379	state->CH_Ctrl[15].val[6] = 0;
1380	state->CH_Ctrl[15].addr[7] = 16;
1381	state->CH_Ctrl[15].bit[7] = 5;
1382	state->CH_Ctrl[15].val[7] = 0;
1383	state->CH_Ctrl[15].addr[8] = 16;
1384	state->CH_Ctrl[15].bit[8] = 6;
1385	state->CH_Ctrl[15].val[8] = 0;
1386	state->CH_Ctrl[15].addr[9] = 16;
1387	state->CH_Ctrl[15].bit[9] = 7;
1388	state->CH_Ctrl[15].val[9] = 0;
1389	state->CH_Ctrl[15].addr[10] = 15;
1390	state->CH_Ctrl[15].bit[10] = 0;
1391	state->CH_Ctrl[15].val[10] = 0;
1392	state->CH_Ctrl[15].addr[11] = 15;
1393	state->CH_Ctrl[15].bit[11] = 1;
1394	state->CH_Ctrl[15].val[11] = 0;
1395	state->CH_Ctrl[15].addr[12] = 15;
1396	state->CH_Ctrl[15].bit[12] = 2;
1397	state->CH_Ctrl[15].val[12] = 0;
1398	state->CH_Ctrl[15].addr[13] = 15;
1399	state->CH_Ctrl[15].bit[13] = 3;
1400	state->CH_Ctrl[15].val[13] = 0;
1401	state->CH_Ctrl[15].addr[14] = 15;
1402	state->CH_Ctrl[15].bit[14] = 4;
1403	state->CH_Ctrl[15].val[14] = 0;
1404	state->CH_Ctrl[15].addr[15] = 15;
1405	state->CH_Ctrl[15].bit[15] = 5;
1406	state->CH_Ctrl[15].val[15] = 0;
1407	state->CH_Ctrl[15].addr[16] = 15;
1408	state->CH_Ctrl[15].bit[16] = 6;
1409	state->CH_Ctrl[15].val[16] = 1;
1410	state->CH_Ctrl[15].addr[17] = 15;
1411	state->CH_Ctrl[15].bit[17] = 7;
1412	state->CH_Ctrl[15].val[17] = 1;
1413
1414	state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ;
1415	state->CH_Ctrl[16].size = 5 ;
1416	state->CH_Ctrl[16].addr[0] = 112;
1417	state->CH_Ctrl[16].bit[0] = 0;
1418	state->CH_Ctrl[16].val[0] = 0;
1419	state->CH_Ctrl[16].addr[1] = 112;
1420	state->CH_Ctrl[16].bit[1] = 1;
1421	state->CH_Ctrl[16].val[1] = 0;
1422	state->CH_Ctrl[16].addr[2] = 112;
1423	state->CH_Ctrl[16].bit[2] = 2;
1424	state->CH_Ctrl[16].val[2] = 0;
1425	state->CH_Ctrl[16].addr[3] = 112;
1426	state->CH_Ctrl[16].bit[3] = 3;
1427	state->CH_Ctrl[16].val[3] = 0;
1428	state->CH_Ctrl[16].addr[4] = 112;
1429	state->CH_Ctrl[16].bit[4] = 4;
1430	state->CH_Ctrl[16].val[4] = 1;
1431
1432	state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ;
1433	state->CH_Ctrl[17].size = 1 ;
1434	state->CH_Ctrl[17].addr[0] = 14;
1435	state->CH_Ctrl[17].bit[0] = 7;
1436	state->CH_Ctrl[17].val[0] = 0;
1437
1438	state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ;
1439	state->CH_Ctrl[18].size = 4 ;
1440	state->CH_Ctrl[18].addr[0] = 107;
1441	state->CH_Ctrl[18].bit[0] = 3;
1442	state->CH_Ctrl[18].val[0] = 0;
1443	state->CH_Ctrl[18].addr[1] = 107;
1444	state->CH_Ctrl[18].bit[1] = 4;
1445	state->CH_Ctrl[18].val[1] = 0;
1446	state->CH_Ctrl[18].addr[2] = 107;
1447	state->CH_Ctrl[18].bit[2] = 5;
1448	state->CH_Ctrl[18].val[2] = 0;
1449	state->CH_Ctrl[18].addr[3] = 107;
1450	state->CH_Ctrl[18].bit[3] = 6;
1451	state->CH_Ctrl[18].val[3] = 0;
1452
1453	state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ;
1454	state->CH_Ctrl[19].size = 3 ;
1455	state->CH_Ctrl[19].addr[0] = 107;
1456	state->CH_Ctrl[19].bit[0] = 7;
1457	state->CH_Ctrl[19].val[0] = 1;
1458	state->CH_Ctrl[19].addr[1] = 106;
1459	state->CH_Ctrl[19].bit[1] = 0;
1460	state->CH_Ctrl[19].val[1] = 1;
1461	state->CH_Ctrl[19].addr[2] = 106;
1462	state->CH_Ctrl[19].bit[2] = 1;
1463	state->CH_Ctrl[19].val[2] = 1;
1464
1465	state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ;
1466	state->CH_Ctrl[20].size = 11 ;
1467	state->CH_Ctrl[20].addr[0] = 109;
1468	state->CH_Ctrl[20].bit[0] = 2;
1469	state->CH_Ctrl[20].val[0] = 0;
1470	state->CH_Ctrl[20].addr[1] = 109;
1471	state->CH_Ctrl[20].bit[1] = 3;
1472	state->CH_Ctrl[20].val[1] = 0;
1473	state->CH_Ctrl[20].addr[2] = 109;
1474	state->CH_Ctrl[20].bit[2] = 4;
1475	state->CH_Ctrl[20].val[2] = 0;
1476	state->CH_Ctrl[20].addr[3] = 109;
1477	state->CH_Ctrl[20].bit[3] = 5;
1478	state->CH_Ctrl[20].val[3] = 0;
1479	state->CH_Ctrl[20].addr[4] = 109;
1480	state->CH_Ctrl[20].bit[4] = 6;
1481	state->CH_Ctrl[20].val[4] = 0;
1482	state->CH_Ctrl[20].addr[5] = 109;
1483	state->CH_Ctrl[20].bit[5] = 7;
1484	state->CH_Ctrl[20].val[5] = 0;
1485	state->CH_Ctrl[20].addr[6] = 108;
1486	state->CH_Ctrl[20].bit[6] = 0;
1487	state->CH_Ctrl[20].val[6] = 0;
1488	state->CH_Ctrl[20].addr[7] = 108;
1489	state->CH_Ctrl[20].bit[7] = 1;
1490	state->CH_Ctrl[20].val[7] = 0;
1491	state->CH_Ctrl[20].addr[8] = 108;
1492	state->CH_Ctrl[20].bit[8] = 2;
1493	state->CH_Ctrl[20].val[8] = 1;
1494	state->CH_Ctrl[20].addr[9] = 108;
1495	state->CH_Ctrl[20].bit[9] = 3;
1496	state->CH_Ctrl[20].val[9] = 1;
1497	state->CH_Ctrl[20].addr[10] = 108;
1498	state->CH_Ctrl[20].bit[10] = 4;
1499	state->CH_Ctrl[20].val[10] = 1;
1500
1501	state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ;
1502	state->CH_Ctrl[21].size = 6 ;
1503	state->CH_Ctrl[21].addr[0] = 106;
1504	state->CH_Ctrl[21].bit[0] = 2;
1505	state->CH_Ctrl[21].val[0] = 0;
1506	state->CH_Ctrl[21].addr[1] = 106;
1507	state->CH_Ctrl[21].bit[1] = 3;
1508	state->CH_Ctrl[21].val[1] = 0;
1509	state->CH_Ctrl[21].addr[2] = 106;
1510	state->CH_Ctrl[21].bit[2] = 4;
1511	state->CH_Ctrl[21].val[2] = 0;
1512	state->CH_Ctrl[21].addr[3] = 106;
1513	state->CH_Ctrl[21].bit[3] = 5;
1514	state->CH_Ctrl[21].val[3] = 0;
1515	state->CH_Ctrl[21].addr[4] = 106;
1516	state->CH_Ctrl[21].bit[4] = 6;
1517	state->CH_Ctrl[21].val[4] = 0;
1518	state->CH_Ctrl[21].addr[5] = 106;
1519	state->CH_Ctrl[21].bit[5] = 7;
1520	state->CH_Ctrl[21].val[5] = 1;
1521
1522	state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ;
1523	state->CH_Ctrl[22].size = 1 ;
1524	state->CH_Ctrl[22].addr[0] = 138;
1525	state->CH_Ctrl[22].bit[0] = 4;
1526	state->CH_Ctrl[22].val[0] = 1;
1527
1528	state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ;
1529	state->CH_Ctrl[23].size = 1 ;
1530	state->CH_Ctrl[23].addr[0] = 17;
1531	state->CH_Ctrl[23].bit[0] = 5;
1532	state->CH_Ctrl[23].val[0] = 0;
1533
1534	state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ;
1535	state->CH_Ctrl[24].size = 1 ;
1536	state->CH_Ctrl[24].addr[0] = 111;
1537	state->CH_Ctrl[24].bit[0] = 3;
1538	state->CH_Ctrl[24].val[0] = 0;
1539
1540	state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ;
1541	state->CH_Ctrl[25].size = 1 ;
1542	state->CH_Ctrl[25].addr[0] = 112;
1543	state->CH_Ctrl[25].bit[0] = 7;
1544	state->CH_Ctrl[25].val[0] = 0;
1545
1546	state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ;
1547	state->CH_Ctrl[26].size = 1 ;
1548	state->CH_Ctrl[26].addr[0] = 136;
1549	state->CH_Ctrl[26].bit[0] = 7;
1550	state->CH_Ctrl[26].val[0] = 0;
1551
1552	state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ;
1553	state->CH_Ctrl[27].size = 1 ;
1554	state->CH_Ctrl[27].addr[0] = 149;
1555	state->CH_Ctrl[27].bit[0] = 7;
1556	state->CH_Ctrl[27].val[0] = 0;
1557
1558	state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ;
1559	state->CH_Ctrl[28].size = 1 ;
1560	state->CH_Ctrl[28].addr[0] = 149;
1561	state->CH_Ctrl[28].bit[0] = 6;
1562	state->CH_Ctrl[28].val[0] = 0;
1563
1564	state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ;
1565	state->CH_Ctrl[29].size = 1 ;
1566	state->CH_Ctrl[29].addr[0] = 149;
1567	state->CH_Ctrl[29].bit[0] = 5;
1568	state->CH_Ctrl[29].val[0] = 1;
1569
1570	state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ;
1571	state->CH_Ctrl[30].size = 1 ;
1572	state->CH_Ctrl[30].addr[0] = 149;
1573	state->CH_Ctrl[30].bit[0] = 4;
1574	state->CH_Ctrl[30].val[0] = 1;
1575
1576	state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ;
1577	state->CH_Ctrl[31].size = 1 ;
1578	state->CH_Ctrl[31].addr[0] = 149;
1579	state->CH_Ctrl[31].bit[0] = 3;
1580	state->CH_Ctrl[31].val[0] = 0;
1581
1582	state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ;
1583	state->CH_Ctrl[32].size = 1 ;
1584	state->CH_Ctrl[32].addr[0] = 93;
1585	state->CH_Ctrl[32].bit[0] = 1;
1586	state->CH_Ctrl[32].val[0] = 0;
1587
1588	state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ;
1589	state->CH_Ctrl[33].size = 1 ;
1590	state->CH_Ctrl[33].addr[0] = 93;
1591	state->CH_Ctrl[33].bit[0] = 0;
1592	state->CH_Ctrl[33].val[0] = 0;
1593
1594	state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ;
1595	state->CH_Ctrl[34].size = 6 ;
1596	state->CH_Ctrl[34].addr[0] = 92;
1597	state->CH_Ctrl[34].bit[0] = 2;
1598	state->CH_Ctrl[34].val[0] = 0;
1599	state->CH_Ctrl[34].addr[1] = 92;
1600	state->CH_Ctrl[34].bit[1] = 3;
1601	state->CH_Ctrl[34].val[1] = 0;
1602	state->CH_Ctrl[34].addr[2] = 92;
1603	state->CH_Ctrl[34].bit[2] = 4;
1604	state->CH_Ctrl[34].val[2] = 0;
1605	state->CH_Ctrl[34].addr[3] = 92;
1606	state->CH_Ctrl[34].bit[3] = 5;
1607	state->CH_Ctrl[34].val[3] = 0;
1608	state->CH_Ctrl[34].addr[4] = 92;
1609	state->CH_Ctrl[34].bit[4] = 6;
1610	state->CH_Ctrl[34].val[4] = 0;
1611	state->CH_Ctrl[34].addr[5] = 92;
1612	state->CH_Ctrl[34].bit[5] = 7;
1613	state->CH_Ctrl[34].val[5] = 0;
1614
1615	state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ;
1616	state->CH_Ctrl[35].size = 6 ;
1617	state->CH_Ctrl[35].addr[0] = 93;
1618	state->CH_Ctrl[35].bit[0] = 2;
1619	state->CH_Ctrl[35].val[0] = 0;
1620	state->CH_Ctrl[35].addr[1] = 93;
1621	state->CH_Ctrl[35].bit[1] = 3;
1622	state->CH_Ctrl[35].val[1] = 0;
1623	state->CH_Ctrl[35].addr[2] = 93;
1624	state->CH_Ctrl[35].bit[2] = 4;
1625	state->CH_Ctrl[35].val[2] = 0;
1626	state->CH_Ctrl[35].addr[3] = 93;
1627	state->CH_Ctrl[35].bit[3] = 5;
1628	state->CH_Ctrl[35].val[3] = 0;
1629	state->CH_Ctrl[35].addr[4] = 93;
1630	state->CH_Ctrl[35].bit[4] = 6;
1631	state->CH_Ctrl[35].val[4] = 0;
1632	state->CH_Ctrl[35].addr[5] = 93;
1633	state->CH_Ctrl[35].bit[5] = 7;
1634	state->CH_Ctrl[35].val[5] = 0;
1635
1636#ifdef _MXL_PRODUCTION
1637	state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ;
1638	state->CH_Ctrl[36].size = 1 ;
1639	state->CH_Ctrl[36].addr[0] = 109;
1640	state->CH_Ctrl[36].bit[0] = 1;
1641	state->CH_Ctrl[36].val[0] = 1;
1642
1643	state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ;
1644	state->CH_Ctrl[37].size = 2 ;
1645	state->CH_Ctrl[37].addr[0] = 112;
1646	state->CH_Ctrl[37].bit[0] = 5;
1647	state->CH_Ctrl[37].val[0] = 0;
1648	state->CH_Ctrl[37].addr[1] = 112;
1649	state->CH_Ctrl[37].bit[1] = 6;
1650	state->CH_Ctrl[37].val[1] = 0;
1651
1652	state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ;
1653	state->CH_Ctrl[38].size = 1 ;
1654	state->CH_Ctrl[38].addr[0] = 65;
1655	state->CH_Ctrl[38].bit[0] = 1;
1656	state->CH_Ctrl[38].val[0] = 0;
1657#endif
1658
1659	return 0 ;
1660}
1661
1662static void InitTunerControls(struct dvb_frontend *fe)
1663{
1664	MXL5005_RegisterInit(fe);
1665	MXL5005_ControlInit(fe);
1666#ifdef _MXL_INTERNAL
1667	MXL5005_MXLControlInit(fe);
1668#endif
1669}
1670
1671static u16 MXL5005_TunerConfig(struct dvb_frontend *fe,
1672	u8	Mode,		/* 0: Analog Mode ; 1: Digital Mode */
1673	u8	IF_mode,	/* for Analog Mode, 0: zero IF; 1: low IF */
1674	u32	Bandwidth,	/* filter  channel bandwidth (6, 7, 8) */
1675	u32	IF_out,		/* Desired IF Out Frequency */
1676	u32	Fxtal,		/* XTAL Frequency */
1677	u8	AGC_Mode,	/* AGC Mode - Dual AGC: 0, Single AGC: 1 */
1678	u16	TOP,		/* 0: Dual AGC; Value: take over point */
1679	u16	IF_OUT_LOAD,	/* IF Out Load Resistor (200 / 300 Ohms) */
1680	u8	CLOCK_OUT,	/* 0: turn off clk out; 1: turn on clock out */
1681	u8	DIV_OUT,	/* 0: Div-1; 1: Div-4 */
1682	u8	CAPSELECT,	/* 0: disable On-Chip pulling cap; 1: enable */
1683	u8	EN_RSSI,	/* 0: disable RSSI; 1: enable RSSI */
1684
1685	/* Modulation Type; */
1686	/* 0 - Default;	1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
1687	u8	Mod_Type,
1688
1689	/* Tracking Filter */
1690	/* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
1691	u8	TF_Type
1692	)
1693{
1694	struct mxl5005s_state *state = fe->tuner_priv;
1695
1696	state->Mode = Mode;
1697	state->IF_Mode = IF_mode;
1698	state->Chan_Bandwidth = Bandwidth;
1699	state->IF_OUT = IF_out;
1700	state->Fxtal = Fxtal;
1701	state->AGC_Mode = AGC_Mode;
1702	state->TOP = TOP;
1703	state->IF_OUT_LOAD = IF_OUT_LOAD;
1704	state->CLOCK_OUT = CLOCK_OUT;
1705	state->DIV_OUT = DIV_OUT;
1706	state->CAPSELECT = CAPSELECT;
1707	state->EN_RSSI = EN_RSSI;
1708	state->Mod_Type = Mod_Type;
1709	state->TF_Type = TF_Type;
1710
1711	/* Initialize all the controls and registers */
1712	InitTunerControls(fe);
1713
1714	/* Synthesizer LO frequency calculation */
1715	MXL_SynthIFLO_Calc(fe);
1716
1717	return 0;
1718}
1719
1720static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe)
1721{
1722	struct mxl5005s_state *state = fe->tuner_priv;
1723	if (state->Mode == 1) /* Digital Mode */
1724		state->IF_LO = state->IF_OUT;
1725	else /* Analog Mode */ {
1726		if (state->IF_Mode == 0) /* Analog Zero IF mode */
1727			state->IF_LO = state->IF_OUT + 400000;
1728		else /* Analog Low IF mode */
1729			state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2;
1730	}
1731}
1732
1733static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe)
1734{
1735	struct mxl5005s_state *state = fe->tuner_priv;
1736
1737	if (state->Mode == 1) /* Digital Mode */ {
1738			/* remove 20.48MHz setting for 2.6.10 */
1739			state->RF_LO = state->RF_IN;
1740			/* change for 2.6.6 */
1741			state->TG_LO = state->RF_IN - 750000;
1742	} else /* Analog Mode */ {
1743		if (state->IF_Mode == 0) /* Analog Zero IF mode */ {
1744			state->RF_LO = state->RF_IN - 400000;
1745			state->TG_LO = state->RF_IN - 1750000;
1746		} else /* Analog Low IF mode */ {
1747			state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2;
1748			state->TG_LO = state->RF_IN -
1749				state->Chan_Bandwidth + 500000;
1750		}
1751	}
1752}
1753
1754static u16 MXL_OverwriteICDefault(struct dvb_frontend *fe)
1755{
1756	u16 status = 0;
1757
1758	status += MXL_ControlWrite(fe, OVERRIDE_1, 1);
1759	status += MXL_ControlWrite(fe, OVERRIDE_2, 1);
1760	status += MXL_ControlWrite(fe, OVERRIDE_3, 1);
1761	status += MXL_ControlWrite(fe, OVERRIDE_4, 1);
1762
1763	return status;
1764}
1765
1766static u16 MXL_BlockInit(struct dvb_frontend *fe)
1767{
1768	struct mxl5005s_state *state = fe->tuner_priv;
1769	u16 status = 0;
1770
1771	status += MXL_OverwriteICDefault(fe);
1772
1773	/* Downconverter Control Dig Ana */
1774	status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0);
1775
1776	/* Filter Control  Dig  Ana */
1777	status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1);
1778	status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2);
1779	status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0);
1780	status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1);
1781	status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0);
1782
1783	/* Initialize Low-Pass Filter */
1784	if (state->Mode) { /* Digital Mode */
1785		switch (state->Chan_Bandwidth) {
1786		case 8000000:
1787			status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0);
1788			break;
1789		case 7000000:
1790			status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2);
1791			break;
1792		case 6000000:
1793			status += MXL_ControlWrite(fe,
1794					BB_DLPF_BANDSEL, 3);
1795			break;
1796		}
1797	} else { /* Analog Mode */
1798		switch (state->Chan_Bandwidth) {
1799		case 8000000:	/* Low Zero */
1800			status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1801					(state->IF_Mode ? 0 : 3));
1802			break;
1803		case 7000000:
1804			status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1805					(state->IF_Mode ? 1 : 4));
1806			break;
1807		case 6000000:
1808			status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
1809					(state->IF_Mode ? 2 : 5));
1810			break;
1811		}
1812	}
1813
1814	/* Charge Pump Control Dig  Ana */
1815	status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8);
1816	status += MXL_ControlWrite(fe,
1817		RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1);
1818	status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0);
1819
1820	/* AGC TOP Control */
1821	if (state->AGC_Mode == 0) /* Dual AGC */ {
1822		status += MXL_ControlWrite(fe, AGC_IF, 15);
1823		status += MXL_ControlWrite(fe, AGC_RF, 15);
1824	} else /*  Single AGC Mode Dig  Ana */
1825		status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12);
1826
1827	if (state->TOP == 55) /* TOP == 5.5 */
1828		status += MXL_ControlWrite(fe, AGC_IF, 0x0);
1829
1830	if (state->TOP == 72) /* TOP == 7.2 */
1831		status += MXL_ControlWrite(fe, AGC_IF, 0x1);
1832
1833	if (state->TOP == 92) /* TOP == 9.2 */
1834		status += MXL_ControlWrite(fe, AGC_IF, 0x2);
1835
1836	if (state->TOP == 110) /* TOP == 11.0 */
1837		status += MXL_ControlWrite(fe, AGC_IF, 0x3);
1838
1839	if (state->TOP == 129) /* TOP == 12.9 */
1840		status += MXL_ControlWrite(fe, AGC_IF, 0x4);
1841
1842	if (state->TOP == 147) /* TOP == 14.7 */
1843		status += MXL_ControlWrite(fe, AGC_IF, 0x5);
1844
1845	if (state->TOP == 168) /* TOP == 16.8 */
1846		status += MXL_ControlWrite(fe, AGC_IF, 0x6);
1847
1848	if (state->TOP == 194) /* TOP == 19.4 */
1849		status += MXL_ControlWrite(fe, AGC_IF, 0x7);
1850
1851	if (state->TOP == 212) /* TOP == 21.2 */
1852		status += MXL_ControlWrite(fe, AGC_IF, 0x9);
1853
1854	if (state->TOP == 232) /* TOP == 23.2 */
1855		status += MXL_ControlWrite(fe, AGC_IF, 0xA);
1856
1857	if (state->TOP == 252) /* TOP == 25.2 */
1858		status += MXL_ControlWrite(fe, AGC_IF, 0xB);
1859
1860	if (state->TOP == 271) /* TOP == 27.1 */
1861		status += MXL_ControlWrite(fe, AGC_IF, 0xC);
1862
1863	if (state->TOP == 292) /* TOP == 29.2 */
1864		status += MXL_ControlWrite(fe, AGC_IF, 0xD);
1865
1866	if (state->TOP == 317) /* TOP == 31.7 */
1867		status += MXL_ControlWrite(fe, AGC_IF, 0xE);
1868
1869	if (state->TOP == 349) /* TOP == 34.9 */
1870		status += MXL_ControlWrite(fe, AGC_IF, 0xF);
1871
1872	/* IF Synthesizer Control */
1873	status += MXL_IFSynthInit(fe);
1874
1875	/* IF UpConverter Control */
1876	if (state->IF_OUT_LOAD == 200) {
1877		status += MXL_ControlWrite(fe, DRV_RES_SEL, 6);
1878		status += MXL_ControlWrite(fe, I_DRIVER, 2);
1879	}
1880	if (state->IF_OUT_LOAD == 300) {
1881		status += MXL_ControlWrite(fe, DRV_RES_SEL, 4);
1882		status += MXL_ControlWrite(fe, I_DRIVER, 1);
1883	}
1884
1885	/* Anti-Alias Filtering Control
1886	 * initialise Anti-Aliasing Filter
1887	 */
1888	if (state->Mode) { /* Digital Mode */
1889		if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) {
1890			status += MXL_ControlWrite(fe, EN_AAF, 1);
1891			status += MXL_ControlWrite(fe, EN_3P, 1);
1892			status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1893			status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
1894		}
1895		if ((state->IF_OUT == 36125000UL) ||
1896			(state->IF_OUT == 36150000UL)) {
1897			status += MXL_ControlWrite(fe, EN_AAF, 1);
1898			status += MXL_ControlWrite(fe, EN_3P, 1);
1899			status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1900			status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
1901		}
1902		if (state->IF_OUT > 36150000UL) {
1903			status += MXL_ControlWrite(fe, EN_AAF, 0);
1904			status += MXL_ControlWrite(fe, EN_3P, 1);
1905			status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1906			status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
1907		}
1908	} else { /* Analog Mode */
1909		if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL) {
1910			status += MXL_ControlWrite(fe, EN_AAF, 1);
1911			status += MXL_ControlWrite(fe, EN_3P, 1);
1912			status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
1913			status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
1914		}
1915		if (state->IF_OUT > 5000000UL) {
1916			status += MXL_ControlWrite(fe, EN_AAF, 0);
1917			status += MXL_ControlWrite(fe, EN_3P, 0);
1918			status += MXL_ControlWrite(fe, EN_AUX_3P, 0);
1919			status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
1920		}
1921	}
1922
1923	/* Demod Clock Out */
1924	if (state->CLOCK_OUT)
1925		status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1);
1926	else
1927		status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0);
1928
1929	if (state->DIV_OUT == 1)
1930		status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1);
1931	if (state->DIV_OUT == 0)
1932		status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0);
1933
1934	/* Crystal Control */
1935	if (state->CAPSELECT)
1936		status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1);
1937	else
1938		status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0);
1939
1940	if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
1941		status += MXL_ControlWrite(fe, IF_SEL_DBL, 1);
1942	if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
1943		status += MXL_ControlWrite(fe, IF_SEL_DBL, 0);
1944
1945	if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
1946		status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3);
1947	if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL)
1948		status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0);
1949
1950	/* Misc Controls */
1951	if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */
1952		status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0);
1953	else
1954		status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1);
1955
1956	/* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */
1957
1958	/* Set TG_R_DIV */
1959	status += MXL_ControlWrite(fe, TG_R_DIV,
1960		MXL_Ceiling(state->Fxtal, 1000000));
1961
1962	/* Apply Default value to BB_INITSTATE_DLPF_TUNE */
1963
1964	/* RSSI Control */
1965	if (state->EN_RSSI) {
1966		status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
1967		status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
1968		status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
1969		status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
1970
1971		/* RSSI reference point */
1972		status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
1973		status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3);
1974		status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
1975
1976		/* TOP point */
1977		status += MXL_ControlWrite(fe, RFA_FLR, 0);
1978		status += MXL_ControlWrite(fe, RFA_CEIL, 12);
1979	}
1980
1981	/* Modulation type bit settings
1982	 * Override the control values preset
1983	 */
1984	if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */ {
1985		state->AGC_Mode = 1; /* Single AGC Mode */
1986
1987		/* Enable RSSI */
1988		status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
1989		status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
1990		status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
1991		status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
1992
1993		/* RSSI reference point */
1994		status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
1995		status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
1996		status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
1997
1998		/* TOP point */
1999		status += MXL_ControlWrite(fe, RFA_FLR, 2);
2000		status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2001		if (state->IF_OUT <= 6280000UL)	/* Low IF */
2002			status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2003		else /* High IF */
2004			status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
2005
2006	}
2007	if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */ {
2008		state->AGC_Mode = 1;	/* Single AGC Mode */
2009
2010		/* Enable RSSI */
2011		status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2012		status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2013		status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2014		status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2015
2016		/* RSSI reference point */
2017		status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2018		status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4);
2019		status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2020
2021		/* TOP point */
2022		status += MXL_ControlWrite(fe, RFA_FLR, 2);
2023		status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2024		status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1);
2025		/* Low Zero */
2026		status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);
2027
2028		if (state->IF_OUT <= 6280000UL)	/* Low IF */
2029			status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2030		else /* High IF */
2031			status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
2032	}
2033	if (state->Mod_Type == MXL_QAM) /* QAM Mode */ {
2034		state->Mode = MXL_DIGITAL_MODE;
2035
2036		/* state->AGC_Mode = 1; */ /* Single AGC Mode */
2037
2038		/* Disable RSSI */	/* change here for v2.6.5 */
2039		status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2040		status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2041		status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2042		status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2043
2044		/* RSSI reference point */
2045		status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2046		status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2047		status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2048		/* change here for v2.6.5 */
2049		status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2050
2051		if (state->IF_OUT <= 6280000UL)	/* Low IF */
2052			status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2053		else /* High IF */
2054			status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
2055		status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
2056
2057	}
2058	if (state->Mod_Type == MXL_ANALOG_CABLE) {
2059		/* Analog Cable Mode */
2060		/* state->Mode = MXL_DIGITAL_MODE; */
2061
2062		state->AGC_Mode = 1; /* Single AGC Mode */
2063
2064		/* Disable RSSI */
2065		status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2066		status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2067		status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2068		status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2069		/* change for 2.6.3 */
2070		status += MXL_ControlWrite(fe, AGC_IF, 1);
2071		status += MXL_ControlWrite(fe, AGC_RF, 15);
2072		status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
2073	}
2074
2075	if (state->Mod_Type == MXL_ANALOG_OTA) {
2076		/* Analog OTA Terrestrial mode add for 2.6.7 */
2077		/* state->Mode = MXL_ANALOG_MODE; */
2078
2079		/* Enable RSSI */
2080		status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2081		status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2082		status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2083		status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2084
2085		/* RSSI reference point */
2086		status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2087		status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2088		status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2089		status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2090		status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
2091	}
2092
2093	/* RSSI disable */
2094	if (state->EN_RSSI == 0) {
2095		status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2096		status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2097		status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2098		status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2099	}
2100
2101	return status;
2102}
2103
2104static u16 MXL_IFSynthInit(struct dvb_frontend *fe)
2105{
2106	struct mxl5005s_state *state = fe->tuner_priv;
2107	u16 status = 0 ;
2108	u32	Fref = 0 ;
2109	u32	Kdbl, intModVal ;
2110	u32	fracModVal ;
2111	Kdbl = 2 ;
2112
2113	if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
2114		Kdbl = 2 ;
2115	if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
2116		Kdbl = 1 ;
2117
2118	/* IF Synthesizer Control */
2119	if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF mode */ {
2120		if (state->IF_LO == 41000000UL) {
2121			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2122			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
2123			Fref = 328000000UL ;
2124		}
2125		if (state->IF_LO == 47000000UL) {
2126			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2127			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2128			Fref = 376000000UL ;
2129		}
2130		if (state->IF_LO == 54000000UL) {
2131			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x10);
2132			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
2133			Fref = 324000000UL ;
2134		}
2135		if (state->IF_LO == 60000000UL) {
2136			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x10);
2137			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2138			Fref = 360000000UL ;
2139		}
2140		if (state->IF_LO == 39250000UL) {
2141			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2142			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
2143			Fref = 314000000UL ;
2144		}
2145		if (state->IF_LO == 39650000UL) {
2146			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2147			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
2148			Fref = 317200000UL ;
2149		}
2150		if (state->IF_LO == 40150000UL) {
2151			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2152			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
2153			Fref = 321200000UL ;
2154		}
2155		if (state->IF_LO == 40650000UL) {
2156			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2157			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
2158			Fref = 325200000UL ;
2159		}
2160	}
2161
2162	if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0)) {
2163		if (state->IF_LO == 57000000UL) {
2164			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x10);
2165			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2166			Fref = 342000000UL ;
2167		}
2168		if (state->IF_LO == 44000000UL) {
2169			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2170			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2171			Fref = 352000000UL ;
2172		}
2173		if (state->IF_LO == 43750000UL) {
2174			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2175			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2176			Fref = 350000000UL ;
2177		}
2178		if (state->IF_LO == 36650000UL) {
2179			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x04);
2180			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2181			Fref = 366500000UL ;
2182		}
2183		if (state->IF_LO == 36150000UL) {
2184			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x04);
2185			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2186			Fref = 361500000UL ;
2187		}
2188		if (state->IF_LO == 36000000UL) {
2189			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x04);
2190			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2191			Fref = 360000000UL ;
2192		}
2193		if (state->IF_LO == 35250000UL) {
2194			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x04);
2195			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2196			Fref = 352500000UL ;
2197		}
2198		if (state->IF_LO == 34750000UL) {
2199			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x04);
2200			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2201			Fref = 347500000UL ;
2202		}
2203		if (state->IF_LO == 6280000UL) {
2204			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x07);
2205			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2206			Fref = 376800000UL ;
2207		}
2208		if (state->IF_LO == 5000000UL) {
2209			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x09);
2210			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2211			Fref = 360000000UL ;
2212		}
2213		if (state->IF_LO == 4500000UL) {
2214			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x06);
2215			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2216			Fref = 360000000UL ;
2217		}
2218		if (state->IF_LO == 4570000UL) {
2219			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x06);
2220			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2221			Fref = 365600000UL ;
2222		}
2223		if (state->IF_LO == 4000000UL) {
2224			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x05);
2225			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2226			Fref = 360000000UL ;
2227		}
2228		if (state->IF_LO == 57400000UL) {
2229			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x10);
2230			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2231			Fref = 344400000UL ;
2232		}
2233		if (state->IF_LO == 44400000UL) {
2234			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2235			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2236			Fref = 355200000UL ;
2237		}
2238		if (state->IF_LO == 44150000UL) {
2239			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x08);
2240			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2241			Fref = 353200000UL ;
2242		}
2243		if (state->IF_LO == 37050000UL) {
2244			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x04);
2245			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2246			Fref = 370500000UL ;
2247		}
2248		if (state->IF_LO == 36550000UL) {
2249			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x04);
2250			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2251			Fref = 365500000UL ;
2252		}
2253		if (state->IF_LO == 36125000UL) {
2254			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x04);
2255			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2256			Fref = 361250000UL ;
2257		}
2258		if (state->IF_LO == 6000000UL) {
2259			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x07);
2260			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2261			Fref = 360000000UL ;
2262		}
2263		if (state->IF_LO == 5400000UL) {
2264			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x07);
2265			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
2266			Fref = 324000000UL ;
2267		}
2268		if (state->IF_LO == 5380000UL) {
2269			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x07);
2270			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);
2271			Fref = 322800000UL ;
2272		}
2273		if (state->IF_LO == 5200000UL) {
2274			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x09);
2275			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2276			Fref = 374400000UL ;
2277		}
2278		if (state->IF_LO == 4900000UL) {
2279			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x09);
2280			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2281			Fref = 352800000UL ;
2282		}
2283		if (state->IF_LO == 4400000UL) {
2284			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x06);
2285			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2286			Fref = 352000000UL ;
2287		}
2288		if (state->IF_LO == 4063000UL)  /* add for 2.6.8 */ {
2289			status += MXL_ControlWrite(fe, IF_DIVVAL,   0x05);
2290			status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);
2291			Fref = 365670000UL ;
2292		}
2293	}
2294	/* CHCAL_INT_MOD_IF */
2295	/* CHCAL_FRAC_MOD_IF */
2296	intModVal = Fref / (state->Fxtal * Kdbl/2);
2297	status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal);
2298
2299	fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) *
2300		intModVal);
2301
2302	fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000);
2303	status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal);
2304
2305	return status ;
2306}
2307
2308static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)
2309{
2310	struct mxl5005s_state *state = fe->tuner_priv;
2311	u16 status = 0;
2312	u32 divider_val, E3, E4, E5, E5A;
2313	u32 Fmax, Fmin, FmaxBin, FminBin;
2314	u32 Kdbl_RF = 2;
2315	u32 tg_divval;
2316	u32 tg_lo;
2317
2318	u32 Fref_TG;
2319	u32 Fvco;
2320
2321	state->RF_IN = RF_Freq;
2322
2323	MXL_SynthRFTGLO_Calc(fe);
2324
2325	if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2326		Kdbl_RF = 2;
2327	if (state->Fxtal > 22000000 && state->Fxtal <= 32000000)
2328		Kdbl_RF = 1;
2329
2330	/* Downconverter Controls
2331	 * Look-Up Table Implementation for:
2332	 *	DN_POLY
2333	 *	DN_RFGAIN
2334	 *	DN_CAP_RFLPF
2335	 *	DN_EN_VHFUHFBAR
2336	 *	DN_GAIN_ADJUST
2337	 *  Change the boundary reference from RF_IN to RF_LO
2338	 */
2339	if (state->RF_LO < 40000000UL)
2340		return -1;
2341
2342	if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
2343		status += MXL_ControlWrite(fe, DN_POLY,              2);
2344		status += MXL_ControlWrite(fe, DN_RFGAIN,            3);
2345		status += MXL_ControlWrite(fe, DN_CAP_RFLPF,         423);
2346		status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR,      1);
2347		status += MXL_ControlWrite(fe, DN_GAIN_ADJUST,       1);
2348	}
2349	if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
2350		status += MXL_ControlWrite(fe, DN_POLY,              3);
2351		status += MXL_ControlWrite(fe, DN_RFGAIN,            3);
2352		status += MXL_ControlWrite(fe, DN_CAP_RFLPF,         222);
2353		status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR,      1);
2354		status += MXL_ControlWrite(fe, DN_GAIN_ADJUST,       1);
2355	}
2356	if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
2357		status += MXL_ControlWrite(fe, DN_POLY,              3);
2358		status += MXL_ControlWrite(fe, DN_RFGAIN,            3);
2359		status += MXL_ControlWrite(fe, DN_CAP_RFLPF,         147);
2360		status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR,      1);
2361		status += MXL_ControlWrite(fe, DN_GAIN_ADJUST,       2);
2362	}
2363	if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
2364		status += MXL_ControlWrite(fe, DN_POLY,              3);
2365		status += MXL_ControlWrite(fe, DN_RFGAIN,            3);
2366		status += MXL_ControlWrite(fe, DN_CAP_RFLPF,         9);
2367		status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR,      1);
2368		status += MXL_ControlWrite(fe, DN_GAIN_ADJUST,       2);
2369	}
2370	if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
2371		status += MXL_ControlWrite(fe, DN_POLY,              3);
2372		status += MXL_ControlWrite(fe, DN_RFGAIN,            3);
2373		status += MXL_ControlWrite(fe, DN_CAP_RFLPF,         0);
2374		status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR,      1);
2375		status += MXL_ControlWrite(fe, DN_GAIN_ADJUST,       3);
2376	}
2377	if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) {
2378		status += MXL_ControlWrite(fe, DN_POLY,              3);
2379		status += MXL_ControlWrite(fe, DN_RFGAIN,            1);
2380		status += MXL_ControlWrite(fe, DN_CAP_RFLPF,         0);
2381		status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR,      0);
2382		status += MXL_ControlWrite(fe, DN_GAIN_ADJUST,       3);
2383	}
2384	if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) {
2385		status += MXL_ControlWrite(fe, DN_POLY,              3);
2386		status += MXL_ControlWrite(fe, DN_RFGAIN,            2);
2387		status += MXL_ControlWrite(fe, DN_CAP_RFLPF,         0);
2388		status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR,      0);
2389		status += MXL_ControlWrite(fe, DN_GAIN_ADJUST,       3);
2390	}
2391	if (state->RF_LO > 900000000UL)
2392		return -1;
2393
2394	/*	DN_IQTNBUF_AMP */
2395	/*	DN_IQTNGNBFBIAS_BST */
2396	if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
2397		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2398		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2399	}
2400	if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
2401		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2402		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2403	}
2404	if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
2405		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2406		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2407	}
2408	if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
2409		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2410		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2411	}
2412	if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
2413		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2414		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2415	}
2416	if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) {
2417		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2418		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2419	}
2420	if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) {
2421		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2422		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2423	}
2424	if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) {
2425		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2426		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2427	}
2428	if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) {
2429		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2430		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2431	}
2432	if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) {
2433		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2434		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2435	}
2436	if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) {
2437		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2438		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2439	}
2440	if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) {
2441		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2442		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2443	}
2444	if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) {
2445		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2446		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2447	}
2448	if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) {
2449		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       1);
2450		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  0);
2451	}
2452	if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) {
2453		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       10);
2454		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  1);
2455	}
2456	if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) {
2457		status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP,       10);
2458		status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST,  1);
2459	}
2460
2461	/*
2462	 * Set RF Synth and LO Path Control
2463	 *
2464	 * Look-Up table implementation for:
2465	 *	RFSYN_EN_OUTMUX
2466	 *	RFSYN_SEL_VCO_OUT
2467	 *	RFSYN_SEL_VCO_HI
2468	 *  RFSYN_SEL_DIVM
2469	 *	RFSYN_RF_DIV_BIAS
2470	 *	DN_SEL_FREQ
2471	 *
2472	 * Set divider_val, Fmax, Fmix to use in Equations
2473	 */
2474	FminBin = 28000000UL ;
2475	FmaxBin = 42500000UL ;
2476	if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) {
2477		status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX,     1);
2478		status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT,   0);
2479		status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI,    0);
2480		status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM,      0);
2481		status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS,   1);
2482		status += MXL_ControlWrite(fe, DN_SEL_FREQ,         1);
2483		divider_val = 64 ;
2484		Fmax = FmaxBin ;
2485		Fmin = FminBin ;
2486	}
2487	FminBin = 42500000UL ;
2488	FmaxBin = 56000000UL ;
2489	if (state->RF_LO > FminBin && 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,    1);
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);
2496		divider_val = 64 ;
2497		Fmax = FmaxBin ;
2498		Fmin = FminBin ;
2499	}
2500	FminBin = 56000000UL ;
2501	FmaxBin = 85000000UL ;
2502	if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2503		status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX,     0);
2504		status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT,   1);
2505		status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI,    0);
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);
2509		divider_val = 32 ;
2510		Fmax = FmaxBin ;
2511		Fmin = FminBin ;
2512	}
2513	FminBin = 85000000UL ;
2514	FmaxBin = 112000000UL ;
2515	if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2516		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,    1);
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);
2522		divider_val = 32 ;
2523		Fmax = FmaxBin ;
2524		Fmin = FminBin ;
2525	}
2526	FminBin = 112000000UL ;
2527	FmaxBin = 170000000UL ;
2528	if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2529		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,    0);
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,         2);
2535		divider_val = 16 ;
2536		Fmax = FmaxBin ;
2537		Fmin = FminBin ;
2538	}
2539	FminBin = 170000000UL ;
2540	FmaxBin = 225000000UL ;
2541	if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2542		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,    1);
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);
2548		divider_val = 16 ;
2549		Fmax = FmaxBin ;
2550		Fmin = FminBin ;
2551	}
2552	FminBin = 225000000UL ;
2553	FmaxBin = 300000000UL ;
2554	if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2555		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,    0);
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,         4);
2561		divider_val = 8 ;
2562		Fmax = 340000000UL ;
2563		Fmin = FminBin ;
2564	}
2565	FminBin = 300000000UL ;
2566	FmaxBin = 340000000UL ;
2567	if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2568		status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX,     1);
2569		status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT,   0);
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,         0);
2574		divider_val = 8 ;
2575		Fmax = FmaxBin ;
2576		Fmin = 225000000UL ;
2577	}
2578	FminBin = 340000000UL ;
2579	FmaxBin = 450000000UL ;
2580	if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2581		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,    1);
2584		status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM,      0);
2585		status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS,   2);
2586		status += MXL_ControlWrite(fe, DN_SEL_FREQ,         0);
2587		divider_val = 8 ;
2588		Fmax = FmaxBin ;
2589		Fmin = FminBin ;
2590	}
2591	FminBin = 450000000UL ;
2592	FmaxBin = 680000000UL ;
2593	if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2594		status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX,     0);
2595		status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT,   1);
2596		status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI,    0);
2597		status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM,      1);
2598		status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS,   1);
2599		status += MXL_ControlWrite(fe, DN_SEL_FREQ,         0);
2600		divider_val = 4 ;
2601		Fmax = FmaxBin ;
2602		Fmin = FminBin ;
2603	}
2604	FminBin = 680000000UL ;
2605	FmaxBin = 900000000UL ;
2606	if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2607		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,    1);
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);
2613		divider_val = 4 ;
2614		Fmax = FmaxBin ;
2615		Fmin = FminBin ;
2616	}
2617
2618	/*	CHCAL_INT_MOD_RF
2619	 *	CHCAL_FRAC_MOD_RF
2620	 *	RFSYN_LPF_R
2621	 *	CHCAL_EN_INT_RF
2622	 */
2623	/* Equation E3 RFSYN_VCO_BIAS */
2624	E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ;
2625	status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3);
2626
2627	/* Equation E4 CHCAL_INT_MOD_RF */
2628	E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000);
2629	MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4);
2630
2631	/* Equation E5 CHCAL_FRAC_MOD_RF CHCAL_EN_INT_RF */
2632	E5 = ((2<<17)*(state->RF_LO/10000*divider_val -
2633		(E4*(2*state->Fxtal*Kdbl_RF)/10000))) /
2634		(2*state->Fxtal*Kdbl_RF/10000);
2635
2636	status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);
2637
2638	/* Equation E5A RFSYN_LPF_R */
2639	E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;
2640	status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A);
2641
2642	/* Euqation E5B CHCAL_EN_INIT_RF */
2643	status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));
2644	/*if (E5 == 0)
2645	 *	status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);
2646	 *else
2647	 *	status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);
2648	 */
2649
2650	/*
2651	 * Set TG Synth
2652	 *
2653	 * Look-Up table implementation for:
2654	 *	TG_LO_DIVVAL
2655	 *	TG_LO_SELVAL
2656	 *
2657	 * Set divider_val, Fmax, Fmix to use in Equations
2658	 */
2659	if (state->TG_LO < 33000000UL)
2660		return -1;
2661
2662	FminBin = 33000000UL ;
2663	FmaxBin = 50000000UL ;
2664	if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) {
2665		status += MXL_ControlWrite(fe, TG_LO_DIVVAL,	0x6);
2666		status += MXL_ControlWrite(fe, TG_LO_SELVAL,	0x0);
2667		divider_val = 36 ;
2668		Fmax = FmaxBin ;
2669		Fmin = FminBin ;
2670	}
2671	FminBin = 50000000UL ;
2672	FmaxBin = 67000000UL ;
2673	if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2674		status += MXL_ControlWrite(fe, TG_LO_DIVVAL,	0x1);
2675		status += MXL_ControlWrite(fe, TG_LO_SELVAL,	0x0);
2676		divider_val = 24 ;
2677		Fmax = FmaxBin ;
2678		Fmin = FminBin ;
2679	}
2680	FminBin = 67000000UL ;
2681	FmaxBin = 100000000UL ;
2682	if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2683		status += MXL_ControlWrite(fe, TG_LO_DIVVAL,	0xC);
2684		status += MXL_ControlWrite(fe, TG_LO_SELVAL,	0x2);
2685		divider_val = 18 ;
2686		Fmax = FmaxBin ;
2687		Fmin = FminBin ;
2688	}
2689	FminBin = 100000000UL ;
2690	FmaxBin = 150000000UL ;
2691	if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2692		status += MXL_ControlWrite(fe, TG_LO_DIVVAL,	0x8);
2693		status += MXL_ControlWrite(fe, TG_LO_SELVAL,	0x2);
2694		divider_val = 12 ;
2695		Fmax = FmaxBin ;
2696		Fmin = FminBin ;
2697	}
2698	FminBin = 150000000UL ;
2699	FmaxBin = 200000000UL ;
2700	if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2701		status += MXL_ControlWrite(fe, TG_LO_DIVVAL,	0x0);
2702		status += MXL_ControlWrite(fe, TG_LO_SELVAL,	0x2);
2703		divider_val = 8 ;
2704		Fmax = FmaxBin ;
2705		Fmin = FminBin ;
2706	}
2707	FminBin = 200000000UL ;
2708	FmaxBin = 300000000UL ;
2709	if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2710		status += MXL_ControlWrite(fe, TG_LO_DIVVAL,	0x8);
2711		status += MXL_ControlWrite(fe, TG_LO_SELVAL,	0x3);
2712		divider_val = 6 ;
2713		Fmax = FmaxBin ;
2714		Fmin = FminBin ;
2715	}
2716	FminBin = 300000000UL ;
2717	FmaxBin = 400000000UL ;
2718	if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2719		status += MXL_ControlWrite(fe, TG_LO_DIVVAL,	0x0);
2720		status += MXL_ControlWrite(fe, TG_LO_SELVAL,	0x3);
2721		divider_val = 4 ;
2722		Fmax = FmaxBin ;
2723		Fmin = FminBin ;
2724	}
2725	FminBin = 400000000UL ;
2726	FmaxBin = 600000000UL ;
2727	if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2728		status += MXL_ControlWrite(fe, TG_LO_DIVVAL,	0x8);
2729		status += MXL_ControlWrite(fe, TG_LO_SELVAL,	0x7);
2730		divider_val = 3 ;
2731		Fmax = FmaxBin ;
2732		Fmin = FminBin ;
2733	}
2734	FminBin = 600000000UL ;
2735	FmaxBin = 900000000UL ;
2736	if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
2737		status += MXL_ControlWrite(fe, TG_LO_DIVVAL,	0x0);
2738		status += MXL_ControlWrite(fe, TG_LO_SELVAL,	0x7);
2739		divider_val = 2 ;
2740	}
2741
2742	/* TG_DIV_VAL */
2743	tg_divval = (state->TG_LO*divider_val/100000) *
2744		(MXL_Ceiling(state->Fxtal, 1000000) * 100) /
2745		(state->Fxtal/1000);
2746
2747	status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval);
2748
2749	if (state->TG_LO > 600000000UL)
2750		status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1);
2751
2752	Fmax = 1800000000UL ;
2753	Fmin = 1200000000UL ;
2754
2755	/* prevent overflow of 32 bit unsigned integer, use
2756	 * following equation. Edit for v2.6.4
2757	 */
2758	/* Fref_TF = Fref_TG * 1000 */
2759	Fref_TG = (state->Fxtal/1000) / MXL_Ceiling(state->Fxtal, 1000000);
2760
2761	/* Fvco = Fvco/10 */
2762	Fvco = (state->TG_LO/10000) * divider_val * Fref_TG;
2763
2764	tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8;
2765
2766	/* below equation is same as above but much harder to debug.
2767	 *
2768	 * static u32 MXL_GetXtalInt(u32 Xtal_Freq)
2769	 * {
2770	 *	if ((Xtal_Freq % 1000000) == 0)
2771	 *		return (Xtal_Freq / 10000);
2772	 *	else
2773	 *		return (((Xtal_Freq / 1000000) + 1)*100);
2774	 * }
2775	 *
2776	 * u32 Xtal_Int = MXL_GetXtalInt(state->Fxtal);
2777	 * tg_lo = ( ((Fmax/10000 * Xtal_Int)/100) -
2778	 * ((state->TG_LO/10000)*divider_val *
2779	 * (state->Fxtal/10000)/100) )*32/((Fmax-Fmin)/10000 *
2780	 * Xtal_Int/100) + 8;
2781	 */
2782
2783	status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo);
2784
2785	/* add for 2.6.5 Special setting for QAM */
2786	if (state->Mod_Type == MXL_QAM) {
2787		if (state->config->qam_gain != 0)
2788			status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN,
2789						   state->config->qam_gain);
2790		else if (state->RF_IN < 680000000)
2791			status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2792		else
2793			status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
2794	}
2795
2796	/* Off Chip Tracking Filter Control */
2797	if (state->TF_Type == MXL_TF_OFF) {
2798		/* Tracking Filter Off State; turn off all the banks */
2799		status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2800		status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2801		status += MXL_SetGPIO(fe, 3, 1); /* Bank1 Off */
2802		status += MXL_SetGPIO(fe, 1, 1); /* Bank2 Off */
2803		status += MXL_SetGPIO(fe, 4, 1); /* Bank3 Off */
2804	}
2805
2806	if (state->TF_Type == MXL_TF_C) /* Tracking Filter type C */ {
2807		status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2808		status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
2809
2810		if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
2811			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2812			status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2813			status += MXL_SetGPIO(fe, 3, 0);
2814			status += MXL_SetGPIO(fe, 1, 1);
2815			status += MXL_SetGPIO(fe, 4, 1);
2816		}
2817		if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
2818			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2819			status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2820			status += MXL_SetGPIO(fe, 3, 1);
2821			status += MXL_SetGPIO(fe, 1, 0);
2822			status += MXL_SetGPIO(fe, 4, 1);
2823		}
2824		if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
2825			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2826			status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2827			status += MXL_SetGPIO(fe, 3, 1);
2828			status += MXL_SetGPIO(fe, 1, 0);
2829			status += MXL_SetGPIO(fe, 4, 0);
2830		}
2831		if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
2832			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2833			status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2834			status += MXL_SetGPIO(fe, 3, 1);
2835			status += MXL_SetGPIO(fe, 1, 1);
2836			status += MXL_SetGPIO(fe, 4, 0);
2837		}
2838		if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
2839			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2840			status += MXL_ControlWrite(fe, DAC_DIN_B, 29);
2841			status += MXL_SetGPIO(fe, 3, 1);
2842			status += MXL_SetGPIO(fe, 1, 1);
2843			status += MXL_SetGPIO(fe, 4, 0);
2844		}
2845		if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
2846			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2847			status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2848			status += MXL_SetGPIO(fe, 3, 1);
2849			status += MXL_SetGPIO(fe, 1, 1);
2850			status += MXL_SetGPIO(fe, 4, 0);
2851		}
2852		if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
2853			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2854			status += MXL_ControlWrite(fe, DAC_DIN_B, 16);
2855			status += MXL_SetGPIO(fe, 3, 1);
2856			status += MXL_SetGPIO(fe, 1, 1);
2857			status += MXL_SetGPIO(fe, 4, 1);
2858		}
2859		if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
2860			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2861			status += MXL_ControlWrite(fe, DAC_DIN_B, 7);
2862			status += MXL_SetGPIO(fe, 3, 1);
2863			status += MXL_SetGPIO(fe, 1, 1);
2864			status += MXL_SetGPIO(fe, 4, 1);
2865		}
2866		if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
2867			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2868			status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2869			status += MXL_SetGPIO(fe, 3, 1);
2870			status += MXL_SetGPIO(fe, 1, 1);
2871			status += MXL_SetGPIO(fe, 4, 1);
2872		}
2873	}
2874
2875	if (state->TF_Type == MXL_TF_C_H) {
2876
2877		/* Tracking Filter type C-H for Hauppauge only */
2878		status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
2879
2880		if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
2881			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2882			status += MXL_SetGPIO(fe, 4, 0);
2883			status += MXL_SetGPIO(fe, 3, 1);
2884			status += MXL_SetGPIO(fe, 1, 1);
2885		}
2886		if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
2887			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2888			status += MXL_SetGPIO(fe, 4, 1);
2889			status += MXL_SetGPIO(fe, 3, 0);
2890			status += MXL_SetGPIO(fe, 1, 1);
2891		}
2892		if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
2893			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2894			status += MXL_SetGPIO(fe, 4, 1);
2895			status += MXL_SetGPIO(fe, 3, 0);
2896			status += MXL_SetGPIO(fe, 1, 0);
2897		}
2898		if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
2899			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2900			status += MXL_SetGPIO(fe, 4, 1);
2901			status += MXL_SetGPIO(fe, 3, 1);
2902			status += MXL_SetGPIO(fe, 1, 0);
2903		}
2904		if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
2905			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2906			status += MXL_SetGPIO(fe, 4, 1);
2907			status += MXL_SetGPIO(fe, 3, 1);
2908			status += MXL_SetGPIO(fe, 1, 0);
2909		}
2910		if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
2911			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2912			status += MXL_SetGPIO(fe, 4, 1);
2913			status += MXL_SetGPIO(fe, 3, 1);
2914			status += MXL_SetGPIO(fe, 1, 0);
2915		}
2916		if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
2917			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2918			status += MXL_SetGPIO(fe, 4, 1);
2919			status += MXL_SetGPIO(fe, 3, 1);
2920			status += MXL_SetGPIO(fe, 1, 1);
2921		}
2922		if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
2923			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2924			status += MXL_SetGPIO(fe, 4, 1);
2925			status += MXL_SetGPIO(fe, 3, 1);
2926			status += MXL_SetGPIO(fe, 1, 1);
2927		}
2928		if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
2929			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
2930			status += MXL_SetGPIO(fe, 4, 1);
2931			status += MXL_SetGPIO(fe, 3, 1);
2932			status += MXL_SetGPIO(fe, 1, 1);
2933		}
2934	}
2935
2936	if (state->TF_Type == MXL_TF_D) { /* Tracking Filter type D */
2937
2938		status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
2939
2940		if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
2941			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2942			status += MXL_SetGPIO(fe, 4, 0);
2943			status += MXL_SetGPIO(fe, 1, 1);
2944			status += MXL_SetGPIO(fe, 3, 1);
2945		}
2946		if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
2947			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2948			status += MXL_SetGPIO(fe, 4, 0);
2949			status += MXL_SetGPIO(fe, 1, 0);
2950			status += MXL_SetGPIO(fe, 3, 1);
2951		}
2952		if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
2953			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2954			status += MXL_SetGPIO(fe, 4, 1);
2955			status += MXL_SetGPIO(fe, 1, 0);
2956			status += MXL_SetGPIO(fe, 3, 1);
2957		}
2958		if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
2959			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2960			status += MXL_SetGPIO(fe, 4, 1);
2961			status += MXL_SetGPIO(fe, 1, 0);
2962			status += MXL_SetGPIO(fe, 3, 0);
2963		}
2964		if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
2965			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
2966			status += MXL_SetGPIO(fe, 4, 1);
2967			status += MXL_SetGPIO(fe, 1, 1);
2968			status += MXL_SetGPIO(fe, 3, 0);
2969		}
2970		if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
2971			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2972			status += MXL_SetGPIO(fe, 4, 1);
2973			status += MXL_SetGPIO(fe, 1, 1);
2974			status += MXL_SetGPIO(fe, 3, 0);
2975		}
2976		if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
2977			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
2978			status += MXL_SetGPIO(fe, 4, 1);
2979			status += MXL_SetGPIO(fe, 1, 1);
2980			status += MXL_SetGPIO(fe, 3, 1);
2981		}
2982	}
2983
2984	if (state->TF_Type == MXL_TF_D_L) {
2985
2986		/* Tracking Filter type D-L for Lumanate ONLY change 2.6.3 */
2987		status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
2988
2989		/* if UHF and terrestrial => Turn off Tracking Filter */
2990		if (state->RF_IN >= 471000000 &&
2991			(state->RF_IN - 471000000)%6000000 != 0) {
2992			/* Turn off all the banks */
2993			status += MXL_SetGPIO(fe, 3, 1);
2994			status += MXL_SetGPIO(fe, 1, 1);
2995			status += MXL_SetGPIO(fe, 4, 1);
2996			status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
2997			status += MXL_ControlWrite(fe, AGC_IF, 10);
2998		} else {
2999			/* if VHF or cable => Turn on Tracking Filter */
3000			if (state->RF_IN >= 43000000 &&
3001				state->RF_IN < 140000000) {
3002
3003				status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3004				status += MXL_SetGPIO(fe, 4, 1);
3005				status += MXL_SetGPIO(fe, 1, 1);
3006				status += MXL_SetGPIO(fe, 3, 0);
3007			}
3008			if (state->RF_IN >= 140000000 &&
3009				state->RF_IN < 240000000) {
3010				status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3011				status += MXL_SetGPIO(fe, 4, 1);
3012				status += MXL_SetGPIO(fe, 1, 0);
3013				status += MXL_SetGPIO(fe, 3, 0);
3014			}
3015			if (state->RF_IN >= 240000000 &&
3016				state->RF_IN < 340000000) {
3017				status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3018				status += MXL_SetGPIO(fe, 4, 0);
3019				status += MXL_SetGPIO(fe, 1, 1);
3020				status += MXL_SetGPIO(fe, 3, 0);
3021			}
3022			if (state->RF_IN >= 340000000 &&
3023				state->RF_IN < 430000000) {
3024				status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3025				status += MXL_SetGPIO(fe, 4, 0);
3026				status += MXL_SetGPIO(fe, 1, 0);
3027				status += MXL_SetGPIO(fe, 3, 1);
3028			}
3029			if (state->RF_IN >= 430000000 &&
3030				state->RF_IN < 470000000) {
3031				status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3032				status += MXL_SetGPIO(fe, 4, 1);
3033				status += MXL_SetGPIO(fe, 1, 0);
3034				status += MXL_SetGPIO(fe, 3, 1);
3035			}
3036			if (state->RF_IN >= 470000000 &&
3037				state->RF_IN < 570000000) {
3038				status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3039				status += MXL_SetGPIO(fe, 4, 0);
3040				status += MXL_SetGPIO(fe, 1, 0);
3041				status += MXL_SetGPIO(fe, 3, 1);
3042			}
3043			if (state->RF_IN >= 570000000 &&
3044				state->RF_IN < 620000000) {
3045				status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
3046				status += MXL_SetGPIO(fe, 4, 0);
3047				status += MXL_SetGPIO(fe, 1, 1);
3048				status += MXL_SetGPIO(fe, 3, 1);
3049			}
3050			if (state->RF_IN >= 620000000 &&
3051				state->RF_IN < 760000000) {
3052				status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3053				status += MXL_SetGPIO(fe, 4, 0);
3054				status += MXL_SetGPIO(fe, 1, 1);
3055				status += MXL_SetGPIO(fe, 3, 1);
3056			}
3057			if (state->RF_IN >= 760000000 &&
3058				state->RF_IN <= 900000000) {
3059				status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
3060				status += MXL_SetGPIO(fe, 4, 1);
3061				status += MXL_SetGPIO(fe, 1, 1);
3062				status += MXL_SetGPIO(fe, 3, 1);
3063			}
3064		}
3065	}
3066
3067	if (state->TF_Type == MXL_TF_E) /* Tracking Filter type E */ {
3068
3069		status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
3070
3071		if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
3072			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3073			status += MXL_SetGPIO(fe, 4, 0);
3074			status += MXL_SetGPIO(fe, 1, 1);
3075			status += MXL_SetGPIO(fe, 3, 1);
3076		}
3077		if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3078			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3079			status += MXL_SetGPIO(fe, 4, 0);
3080			status += MXL_SetGPIO(fe, 1, 0);
3081			status += MXL_SetGPIO(fe, 3, 1);
3082		}
3083		if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
3084			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3085			status += MXL_SetGPIO(fe, 4, 1);
3086			status += MXL_SetGPIO(fe, 1, 0);
3087			status += MXL_SetGPIO(fe, 3, 1);
3088		}
3089		if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
3090			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3091			status += MXL_SetGPIO(fe, 4, 1);
3092			status += MXL_SetGPIO(fe, 1, 0);
3093			status += MXL_SetGPIO(fe, 3, 0);
3094		}
3095		if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
3096			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3097			status += MXL_SetGPIO(fe, 4, 1);
3098			status += MXL_SetGPIO(fe, 1, 1);
3099			status += MXL_SetGPIO(fe, 3, 0);
3100		}
3101		if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
3102			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3103			status += MXL_SetGPIO(fe, 4, 1);
3104			status += MXL_SetGPIO(fe, 1, 1);
3105			status += MXL_SetGPIO(fe, 3, 0);
3106		}
3107		if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
3108			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3109			status += MXL_SetGPIO(fe, 4, 1);
3110			status += MXL_SetGPIO(fe, 1, 1);
3111			status += MXL_SetGPIO(fe, 3, 1);
3112		}
3113	}
3114
3115	if (state->TF_Type == MXL_TF_F) {
3116
3117		/* Tracking Filter type F */
3118		status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
3119
3120		if (state->RF_IN >= 43000000 && state->RF_IN < 160000000) {
3121			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3122			status += MXL_SetGPIO(fe, 4, 0);
3123			status += MXL_SetGPIO(fe, 1, 1);
3124			status += MXL_SetGPIO(fe, 3, 1);
3125		}
3126		if (state->RF_IN >= 160000000 && state->RF_IN < 210000000) {
3127			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3128			status += MXL_SetGPIO(fe, 4, 0);
3129			status += MXL_SetGPIO(fe, 1, 0);
3130			status += MXL_SetGPIO(fe, 3, 1);
3131		}
3132		if (state->RF_IN >= 210000000 && state->RF_IN < 300000000) {
3133			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3134			status += MXL_SetGPIO(fe, 4, 1);
3135			status += MXL_SetGPIO(fe, 1, 0);
3136			status += MXL_SetGPIO(fe, 3, 1);
3137		}
3138		if (state->RF_IN >= 300000000 && state->RF_IN < 390000000) {
3139			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3140			status += MXL_SetGPIO(fe, 4, 1);
3141			status += MXL_SetGPIO(fe, 1, 0);
3142			status += MXL_SetGPIO(fe, 3, 0);
3143		}
3144		if (state->RF_IN >= 390000000 && state->RF_IN < 515000000) {
3145			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3146			status += MXL_SetGPIO(fe, 4, 1);
3147			status += MXL_SetGPIO(fe, 1, 1);
3148			status += MXL_SetGPIO(fe, 3, 0);
3149		}
3150		if (state->RF_IN >= 515000000 && state->RF_IN < 650000000) {
3151			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3152			status += MXL_SetGPIO(fe, 4, 1);
3153			status += MXL_SetGPIO(fe, 1, 1);
3154			status += MXL_SetGPIO(fe, 3, 0);
3155		}
3156		if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000) {
3157			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3158			status += MXL_SetGPIO(fe, 4, 1);
3159			status += MXL_SetGPIO(fe, 1, 1);
3160			status += MXL_SetGPIO(fe, 3, 1);
3161		}
3162	}
3163
3164	if (state->TF_Type == MXL_TF_E_2) {
3165
3166		/* Tracking Filter type E_2 */
3167		status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
3168
3169		if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
3170			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3171			status += MXL_SetGPIO(fe, 4, 0);
3172			status += MXL_SetGPIO(fe, 1, 1);
3173			status += MXL_SetGPIO(fe, 3, 1);
3174		}
3175		if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3176			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3177			status += MXL_SetGPIO(fe, 4, 0);
3178			status += MXL_SetGPIO(fe, 1, 0);
3179			status += MXL_SetGPIO(fe, 3, 1);
3180		}
3181		if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
3182			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3183			status += MXL_SetGPIO(fe, 4, 1);
3184			status += MXL_SetGPIO(fe, 1, 0);
3185			status += MXL_SetGPIO(fe, 3, 1);
3186		}
3187		if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3188			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3189			status += MXL_SetGPIO(fe, 4, 1);
3190			status += MXL_SetGPIO(fe, 1, 0);
3191			status += MXL_SetGPIO(fe, 3, 0);
3192		}
3193		if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
3194			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3195			status += MXL_SetGPIO(fe, 4, 1);
3196			status += MXL_SetGPIO(fe, 1, 1);
3197			status += MXL_SetGPIO(fe, 3, 0);
3198		}
3199		if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
3200			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3201			status += MXL_SetGPIO(fe, 4, 1);
3202			status += MXL_SetGPIO(fe, 1, 1);
3203			status += MXL_SetGPIO(fe, 3, 0);
3204		}
3205		if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
3206			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3207			status += MXL_SetGPIO(fe, 4, 1);
3208			status += MXL_SetGPIO(fe, 1, 1);
3209			status += MXL_SetGPIO(fe, 3, 1);
3210		}
3211	}
3212
3213	if (state->TF_Type == MXL_TF_G) {
3214
3215		/* Tracking Filter type G add for v2.6.8 */
3216		status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
3217
3218		if (state->RF_IN >= 50000000 && state->RF_IN < 190000000) {
3219
3220			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3221			status += MXL_SetGPIO(fe, 4, 0);
3222			status += MXL_SetGPIO(fe, 1, 1);
3223			status += MXL_SetGPIO(fe, 3, 1);
3224		}
3225		if (state->RF_IN >= 190000000 && state->RF_IN < 280000000) {
3226			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3227			status += MXL_SetGPIO(fe, 4, 0);
3228			status += MXL_SetGPIO(fe, 1, 0);
3229			status += MXL_SetGPIO(fe, 3, 1);
3230		}
3231		if (state->RF_IN >= 280000000 && state->RF_IN < 350000000) {
3232			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3233			status += MXL_SetGPIO(fe, 4, 1);
3234			status += MXL_SetGPIO(fe, 1, 0);
3235			status += MXL_SetGPIO(fe, 3, 1);
3236		}
3237		if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3238			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3239			status += MXL_SetGPIO(fe, 4, 1);
3240			status += MXL_SetGPIO(fe, 1, 0);
3241			status += MXL_SetGPIO(fe, 3, 0);
3242		}
3243		if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) {
3244			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3245			status += MXL_SetGPIO(fe, 4, 1);
3246			status += MXL_SetGPIO(fe, 1, 0);
3247			status += MXL_SetGPIO(fe, 3, 1);
3248		}
3249		if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
3250			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3251			status += MXL_SetGPIO(fe, 4, 1);
3252			status += MXL_SetGPIO(fe, 1, 1);
3253			status += MXL_SetGPIO(fe, 3, 0);
3254		}
3255		if (state->RF_IN >= 640000000 && state->RF_IN < 820000000) {
3256			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3257			status += MXL_SetGPIO(fe, 4, 1);
3258			status += MXL_SetGPIO(fe, 1, 1);
3259			status += MXL_SetGPIO(fe, 3, 0);
3260		}
3261		if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000) {
3262			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3263			status += MXL_SetGPIO(fe, 4, 1);
3264			status += MXL_SetGPIO(fe, 1, 1);
3265			status += MXL_SetGPIO(fe, 3, 1);
3266		}
3267	}
3268
3269	if (state->TF_Type == MXL_TF_E_NA) {
3270
3271		/* Tracking Filter type E-NA for Empia ONLY change for 2.6.8 */
3272		status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
3273
3274		/* if UHF and terrestrial=> Turn off Tracking Filter */
3275		if (state->RF_IN >= 471000000 &&
3276			(state->RF_IN - 471000000)%6000000 != 0) {
3277
3278			/* Turn off all the banks */
3279			status += MXL_SetGPIO(fe, 3, 1);
3280			status += MXL_SetGPIO(fe, 1, 1);
3281			status += MXL_SetGPIO(fe, 4, 1);
3282			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3283
3284			/* 2.6.12 Turn on RSSI */
3285			status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
3286			status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
3287			status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
3288			status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
3289
3290			/* RSSI reference point */
3291			status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
3292			status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
3293			status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
3294
3295			/* following parameter is from analog OTA mode,
3296			 * can be change to seek better performance */
3297			status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
3298		} else {
3299		/* if VHF or Cable =>  Turn on Tracking Filter */
3300
3301		/* 2.6.12 Turn off RSSI */
3302		status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
3303
3304		/* change back from above condition */
3305		status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);
3306
3307
3308		if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
3309
3310			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3311			status += MXL_SetGPIO(fe, 4, 0);
3312			status += MXL_SetGPIO(fe, 1, 1);
3313			status += MXL_SetGPIO(fe, 3, 1);
3314		}
3315		if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
3316			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3317			status += MXL_SetGPIO(fe, 4, 0);
3318			status += MXL_SetGPIO(fe, 1, 0);
3319			status += MXL_SetGPIO(fe, 3, 1);
3320		}
3321		if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
3322			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3323			status += MXL_SetGPIO(fe, 4, 1);
3324			status += MXL_SetGPIO(fe, 1, 0);
3325			status += MXL_SetGPIO(fe, 3, 1);
3326		}
3327		if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
3328			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3329			status += MXL_SetGPIO(fe, 4, 1);
3330			status += MXL_SetGPIO(fe, 1, 0);
3331			status += MXL_SetGPIO(fe, 3, 0);
3332		}
3333		if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
3334			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
3335			status += MXL_SetGPIO(fe, 4, 1);
3336			status += MXL_SetGPIO(fe, 1, 1);
3337			status += MXL_SetGPIO(fe, 3, 0);
3338		}
3339		if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
3340			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3341			status += MXL_SetGPIO(fe, 4, 1);
3342			status += MXL_SetGPIO(fe, 1, 1);
3343			status += MXL_SetGPIO(fe, 3, 0);
3344		}
3345		if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
3346			status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
3347			status += MXL_SetGPIO(fe, 4, 1);
3348			status += MXL_SetGPIO(fe, 1, 1);
3349			status += MXL_SetGPIO(fe, 3, 1);
3350		}
3351		}
3352	}
3353	return status ;
3354}
3355
3356static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val)
3357{
3358	u16 status = 0;
3359
3360	if (GPIO_Num == 1)
3361		status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1);
3362
3363	/* GPIO2 is not available */
3364
3365	if (GPIO_Num == 3) {
3366		if (GPIO_Val == 1) {
3367			status += MXL_ControlWrite(fe, GPIO_3, 0);
3368			status += MXL_ControlWrite(fe, GPIO_3B, 0);
3369		}
3370		if (GPIO_Val == 0) {
3371			status += MXL_ControlWrite(fe, GPIO_3, 1);
3372			status += MXL_ControlWrite(fe, GPIO_3B, 1);
3373		}
3374		if (GPIO_Val == 3) { /* tri-state */
3375			status += MXL_ControlWrite(fe, GPIO_3, 0);
3376			status += MXL_ControlWrite(fe, GPIO_3B, 1);
3377		}
3378	}
3379	if (GPIO_Num == 4) {
3380		if (GPIO_Val == 1) {
3381			status += MXL_ControlWrite(fe, GPIO_4, 0);
3382			status += MXL_ControlWrite(fe, GPIO_4B, 0);
3383		}
3384		if (GPIO_Val == 0) {
3385			status += MXL_ControlWrite(fe, GPIO_4, 1);
3386			status += MXL_ControlWrite(fe, GPIO_4B, 1);
3387		}
3388		if (GPIO_Val == 3) { /* tri-state */
3389			status += MXL_ControlWrite(fe, GPIO_4, 0);
3390			status += MXL_ControlWrite(fe, GPIO_4B, 1);
3391		}
3392	}
3393
3394	return status;
3395}
3396
3397static u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value)
3398{
3399	u16 status = 0;
3400
3401	/* Will write ALL Matching Control Name */
3402	/* Write Matching INIT Control */
3403	status += MXL_ControlWrite_Group(fe, ControlNum, value, 1);
3404	/* Write Matching CH Control */
3405	status += MXL_ControlWrite_Group(fe, ControlNum, value, 2);
3406#ifdef _MXL_INTERNAL
3407	/* Write Matching MXL Control */
3408	status += MXL_ControlWrite_Group(fe, ControlNum, value, 3);
3409#endif
3410	return status;
3411}
3412
3413static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum,
3414	u32 value, u16 controlGroup)
3415{
3416	struct mxl5005s_state *state = fe->tuner_priv;
3417	u16 i, j, k;
3418	u32 highLimit;
3419	u32 ctrlVal;
3420
3421	if (controlGroup == 1) /* Initial Control */ {
3422
3423		for (i = 0; i < state->Init_Ctrl_Num; i++) {
3424
3425			if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3426
3427				highLimit = 1 << state->Init_Ctrl[i].size;
3428				if (value < highLimit) {
3429					for (j = 0; j < state->Init_Ctrl[i].size; j++) {
3430						state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3431						MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]),
3432							(u8)(state->Init_Ctrl[i].bit[j]),
3433							(u8)((value>>j) & 0x01));
3434					}
3435					ctrlVal = 0;
3436					for (k = 0; k < state->Init_Ctrl[i].size; k++)
3437						ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
3438				} else
3439					return -1;
3440			}
3441		}
3442	}
3443	if (controlGroup == 2) /* Chan change Control */ {
3444
3445		for (i = 0; i < state->CH_Ctrl_Num; i++) {
3446
3447			if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
3448
3449				highLimit = 1 << state->CH_Ctrl[i].size;
3450				if (value < highLimit) {
3451					for (j = 0; j < state->CH_Ctrl[i].size; j++) {
3452						state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3453						MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]),
3454							(u8)(state->CH_Ctrl[i].bit[j]),
3455							(u8)((value>>j) & 0x01));
3456					}
3457					ctrlVal = 0;
3458					for (k = 0; k < state->CH_Ctrl[i].size; k++)
3459						ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
3460				} else
3461					return -1;
3462			}
3463		}
3464	}
3465#ifdef _MXL_INTERNAL
3466	if (controlGroup == 3) /* Maxlinear Control */ {
3467
3468		for (i = 0; i < state->MXL_Ctrl_Num; i++) {
3469
3470			if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
3471
3472				highLimit = (1 << state->MXL_Ctrl[i].size);
3473				if (value < highLimit) {
3474					for (j = 0; j < state->MXL_Ctrl[i].size; j++) {
3475						state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3476						MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]),
3477							(u8)(state->MXL_Ctrl[i].bit[j]),
3478							(u8)((value>>j) & 0x01));
3479					}
3480					ctrlVal = 0;
3481					for (k = 0; k < state->MXL_Ctrl[i].size; k++)
3482						ctrlVal += state->
3483							MXL_Ctrl[i].val[k] *
3484							(1 << k);
3485				} else
3486					return -1;
3487			}
3488		}
3489	}
3490#endif
3491	return 0 ; /* successful return */
3492}
3493
3494static u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal)
3495{
3496	struct mxl5005s_state *state = fe->tuner_priv;
3497	int i ;
3498
3499	for (i = 0; i < 104; i++) {
3500		if (RegNum == state->TunerRegs[i].Reg_Num) {
3501			*RegVal = (u8)(state->TunerRegs[i].Reg_Val);
3502			return 0;
3503		}
3504	}
3505
3506	return 1;
3507}
3508
3509static u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value)
3510{
3511	struct mxl5005s_state *state = fe->tuner_priv;
3512	u32 ctrlVal ;
3513	u16 i, k ;
3514
3515	for (i = 0; i < state->Init_Ctrl_Num ; i++) {
3516
3517		if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3518
3519			ctrlVal = 0;
3520			for (k = 0; k < state->Init_Ctrl[i].size; k++)
3521				ctrlVal += state->Init_Ctrl[i].val[k] * (1<<k);
3522			*value = ctrlVal;
3523			return 0;
3524		}
3525	}
3526
3527	for (i = 0; i < state->CH_Ctrl_Num ; i++) {
3528
3529		if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
3530
3531			ctrlVal = 0;
3532			for (k = 0; k < state->CH_Ctrl[i].size; k++)
3533				ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
3534			*value = ctrlVal;
3535			return 0;
3536
3537		}
3538	}
3539
3540#ifdef _MXL_INTERNAL
3541	for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
3542
3543		if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
3544
3545			ctrlVal = 0;
3546			for (k = 0; k < state->MXL_Ctrl[i].size; k++)
3547				ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k);
3548			*value = ctrlVal;
3549			return 0;
3550
3551		}
3552	}
3553#endif
3554	return 1;
3555}
3556
3557static void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit,
3558	u8 bitVal)
3559{
3560	struct mxl5005s_state *state = fe->tuner_priv;
3561	int i ;
3562
3563	const u8 AND_MAP[8] = {
3564		0xFE, 0xFD, 0xFB, 0xF7,
3565		0xEF, 0xDF, 0xBF, 0x7F } ;
3566
3567	const u8 OR_MAP[8] = {
3568		0x01, 0x02, 0x04, 0x08,
3569		0x10, 0x20, 0x40, 0x80 } ;
3570
3571	for (i = 0; i < state->TunerRegs_Num; i++) {
3572		if (state->TunerRegs[i].Reg_Num == address) {
3573			if (bitVal)
3574				state->TunerRegs[i].Reg_Val |= OR_MAP[bit];
3575			else
3576				state->TunerRegs[i].Reg_Val &= AND_MAP[bit];
3577			break ;
3578		}
3579	}
3580}
3581
3582static u32 MXL_Ceiling(u32 value, u32 resolution)
3583{
3584	return value / resolution + (value % resolution > 0 ? 1 : 0);
3585}
3586
3587/* Retrieve the Initialization Registers */
3588static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
3589	u8 *RegVal, int *count)
3590{
3591	u16 status = 0;
3592	int i ;
3593
3594	static const u8 RegAddr[] = {
3595		11, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73,
3596		76, 77, 91, 134, 135, 137, 147,
3597		156, 166, 167, 168, 25
3598	};
3599
3600	*count = ARRAY_SIZE(RegAddr);
3601
3602	status += MXL_BlockInit(fe);
3603
3604	for (i = 0 ; i < *count; i++) {
3605		RegNum[i] = RegAddr[i];
3606		status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
3607	}
3608
3609	return status;
3610}
3611
3612static u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal,
3613	int *count)
3614{
3615	u16 status = 0;
3616	int i ;
3617
3618/* add 77, 166, 167, 168 register for 2.6.12 */
3619#ifdef _MXL_PRODUCTION
3620	static const u8 RegAddr[] = {
3621		14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106,
3622		107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168
3623	};
3624#else
3625	static const u8 RegAddr[] = {
3626		14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106,
3627		107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168
3628	};
3629	/*
3630	u8 RegAddr[171];
3631	for (i = 0; i <= 170; i++)
3632		RegAddr[i] = i;
3633	*/
3634#endif
3635
3636	*count = ARRAY_SIZE(RegAddr);
3637
3638	for (i = 0 ; i < *count; i++) {
3639		RegNum[i] = RegAddr[i];
3640		status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
3641	}
3642
3643	return status;
3644}
3645
3646static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,
3647	u8 *RegVal, int *count)
3648{
3649	u16 status = 0;
3650	int i;
3651
3652	u8 RegAddr[] = {43, 136};
3653
3654	*count = ARRAY_SIZE(RegAddr);
3655
3656	for (i = 0; i < *count; i++) {
3657		RegNum[i] = RegAddr[i];
3658		status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
3659	}
3660
3661	return status;
3662}
3663
3664static u16 MXL_GetMasterControl(u8 *MasterReg, int state)
3665{
3666	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;
3674
3675	return 0;
3676}
3677
3678#ifdef _MXL_PRODUCTION
3679static u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)
3680{
3681	struct mxl5005s_state *state = fe->tuner_priv;
3682	u16 status = 0 ;
3683
3684	if (VCO_Range == 1) {
3685		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);
3692		if (state->Mode == 0 && state->IF_Mode == 1) {
3693			/* Analog Low IF Mode */
3694			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);
3697			status += MXL_ControlWrite(fe,
3698				CHCAL_FRAC_MOD_RF, 180224);
3699		}
3700		if (state->Mode == 0 && state->IF_Mode == 0) {
3701			/* Analog Zero IF Mode */
3702			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);
3705			status += MXL_ControlWrite(fe,
3706				CHCAL_FRAC_MOD_RF, 222822);
3707		}
3708		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);
3712			status += MXL_ControlWrite(fe,
3713				CHCAL_FRAC_MOD_RF, 229376);
3714		}
3715	}
3716
3717	if (VCO_Range == 2) {
3718		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);
3728		if (state->Mode == 0 && state->IF_Mode == 1) {
3729			/* Analog Low IF Mode */
3730			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);
3733			status += MXL_ControlWrite(fe,
3734				CHCAL_FRAC_MOD_RF, 206438);
3735		}
3736		if (state->Mode == 0 && state->IF_Mode == 0) {
3737			/* Analog Zero IF Mode */
3738			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);
3741			status += MXL_ControlWrite(fe,
3742				CHCAL_FRAC_MOD_RF, 206438);
3743		}
3744		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);
3748			status += MXL_ControlWrite(fe,
3749				CHCAL_FRAC_MOD_RF, 16384);
3750		}
3751	}
3752
3753	if (VCO_Range == 3) {
3754		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);
3764		if (state->Mode == 0 && state->IF_Mode == 1) {
3765			/* Analog Low IF Mode */
3766			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);
3769			status += MXL_ControlWrite(fe,
3770				CHCAL_FRAC_MOD_RF, 173670);
3771		}
3772		if (state->Mode == 0 && state->IF_Mode == 0) {
3773			/* Analog Zero IF Mode */
3774			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);
3777			status += MXL_ControlWrite(fe,
3778				CHCAL_FRAC_MOD_RF, 173670);
3779		}
3780		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);
3784			status += MXL_ControlWrite(fe,
3785				CHCAL_FRAC_MOD_RF, 245760);
3786		}
3787	}
3788
3789	if (VCO_Range == 4) {
3790		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);
3800		if (state->Mode == 0 && state->IF_Mode == 1) {
3801			/* Analog Low IF Mode */
3802			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);
3805			status += MXL_ControlWrite(fe,
3806				CHCAL_FRAC_MOD_RF, 206438);
3807		}
3808		if (state->Mode == 0 && state->IF_Mode == 0) {
3809			/* Analog Zero IF Mode */
3810			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);
3813			status += MXL_ControlWrite(fe,
3814				CHCAL_FRAC_MOD_RF, 206438);
3815		}
3816		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);
3820			status += MXL_ControlWrite(fe,
3821				CHCAL_FRAC_MOD_RF, 212992);
3822		}
3823	}
3824
3825	return status;
3826}
3827
3828static u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)
3829{
3830	struct mxl5005s_state *state = fe->tuner_priv;
3831	u16 status = 0;
3832
3833	if (Hystersis == 1)
3834		status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);
3835
3836	return status;
3837}
3838#endif
3839/* End: Reference driver code found in the Realtek driver that
3840 * is copyright MaxLinear */
3841
3842/* ----------------------------------------------------------------
3843 * Begin: Everything after here is new code to adapt the
3844 * proprietary Realtek driver into a Linux API tuner.
3845 * Copyright (C) 2008 Steven Toth <stoth@linuxtv.org>
3846 */
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
3885	dprintk(2, "%s(0x%x, 0x%x, 0x%x)\n", __func__, reg, val, msg.addr);
3886
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
3894static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable,
3895	u8 *datatable, u8 len)
3896{
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}
3915
3916static int mxl5005s_init(struct dvb_frontend *fe)
3917{
3918	struct mxl5005s_state *state = fe->tuner_priv;
3919
3920	dprintk(1, "%s()\n", __func__);
3921	state->current_mode = MXL_QAM;
3922	return mxl5005s_reconfigure(fe, MXL_QAM, MXL5005S_BANDWIDTH_6MHZ);
3923}
3924
3925static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type,
3926	u32 bandwidth)
3927{
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
3955static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,
3956	u32 bandwidth)
3957{
3958	struct mxl5005s_state *state = fe->tuner_priv;
3959	struct mxl5005s_config *c = state->config;
3960
3961	InitTunerControls(fe);
3962
3963	/* Set MxL5005S parameters. */
3964	MXL5005_TunerConfig(
3965		fe,
3966		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);
3980
3981	return 0;
3982}
3983
3984static int mxl5005s_set_params(struct dvb_frontend *fe)
3985{
3986	struct mxl5005s_state *state = fe->tuner_priv;
3987	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
3988	u32 delsys = c->delivery_system;
3989	u32 bw = c->bandwidth_hz;
3990	u32 req_mode, req_bw = 0;
3991	int ret;
3992
3993	dprintk(1, "%s()\n", __func__);
3994
3995	switch (delsys) {
3996	case SYS_ATSC:
3997		req_mode = MXL_ATSC;
3998		req_bw  = MXL5005S_BANDWIDTH_6MHZ;
3999		break;
4000	case SYS_DVBC_ANNEX_B:
4001		req_mode = MXL_QAM;
4002		req_bw  = MXL5005S_BANDWIDTH_6MHZ;
4003		break;
4004	default:	/* Assume DVB-T */
4005		req_mode = MXL_DVBT;
4006		switch (bw) {
4007		case 6000000:
4008			req_bw = MXL5005S_BANDWIDTH_6MHZ;
4009			break;
4010		case 7000000:
4011			req_bw = MXL5005S_BANDWIDTH_7MHZ;
4012			break;
4013		case 8000000:
4014		case 0:
4015			req_bw = MXL5005S_BANDWIDTH_8MHZ;
4016			break;
4017		default:
4018			return -EINVAL;
4019		}
4020	}
4021
4022	/* Change tuner for new modulation type if reqd */
4023	if (req_mode != state->current_mode ||
4024	    req_bw != state->Chan_Bandwidth) {
4025		state->current_mode = req_mode;
4026		ret = mxl5005s_reconfigure(fe, req_mode, req_bw);
4027
4028	} else
4029		ret = 0;
4030
4031	if (ret == 0) {
4032		dprintk(1, "%s() freq=%d\n", __func__, c->frequency);
4033		ret = mxl5005s_SetRfFreqHz(fe, c->frequency);
4034	}
4035
4036	return ret;
4037}
4038
4039static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency)
4040{
4041	struct mxl5005s_state *state = fe->tuner_priv;
4042	dprintk(1, "%s()\n", __func__);
4043
4044	*frequency = state->RF_IN;
4045
4046	return 0;
4047}
4048
4049static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
4050{
4051	struct mxl5005s_state *state = fe->tuner_priv;
4052	dprintk(1, "%s()\n", __func__);
4053
4054	*bandwidth = state->Chan_Bandwidth;
4055
4056	return 0;
4057}
4058
4059static int mxl5005s_get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
4060{
4061	struct mxl5005s_state *state = fe->tuner_priv;
4062	dprintk(1, "%s()\n", __func__);
4063
4064	*frequency = state->IF_OUT;
4065
4066	return 0;
4067}
4068
4069static void mxl5005s_release(struct dvb_frontend *fe)
4070{
4071	dprintk(1, "%s()\n", __func__);
4072	kfree(fe->tuner_priv);
4073	fe->tuner_priv = NULL;
4074}
4075
4076static const struct dvb_tuner_ops mxl5005s_tuner_ops = {
4077	.info = {
4078		.name              = "MaxLinear MXL5005S",
4079		.frequency_min_hz  =  48 * MHz,
4080		.frequency_max_hz  = 860 * MHz,
4081		.frequency_step_hz =  50 * kHz,
4082	},
4083
4084	.release       = mxl5005s_release,
4085	.init          = mxl5005s_init,
4086
4087	.set_params    = mxl5005s_set_params,
4088	.get_frequency = mxl5005s_get_frequency,
4089	.get_bandwidth = mxl5005s_get_bandwidth,
4090	.get_if_frequency = mxl5005s_get_if_frequency,
4091};
4092
4093struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe,
4094				     struct i2c_adapter *i2c,
4095				     struct mxl5005s_config *config)
4096{
4097	struct mxl5005s_state *state = NULL;
4098	dprintk(1, "%s()\n", __func__);
4099
4100	state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL);
4101	if (state == NULL)
4102		return NULL;
4103
4104	state->frontend = fe;
4105	state->config = config;
4106	state->i2c = i2c;
4107
4108	printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n",
4109		config->i2c_address);
4110
4111	memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops,
4112		sizeof(struct dvb_tuner_ops));
4113
4114	fe->tuner_priv = state;
4115	return fe;
4116}
4117EXPORT_SYMBOL_GPL(mxl5005s_attach);
4118
4119MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver");
4120MODULE_AUTHOR("Steven Toth");
4121MODULE_LICENSE("GPL");
4122