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