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