Path: blob/master/drivers/media/common/tuners/mxl5005s.c
15112 views
/*1MaxLinear MXL5005S VSB/QAM/DVBT tuner driver23Copyright (C) 2008 MaxLinear4Copyright (C) 2006 Steven Toth <[email protected]>5Functions:6mxl5005s_reset()7mxl5005s_writereg()8mxl5005s_writeregs()9mxl5005s_init()10mxl5005s_reconfigure()11mxl5005s_AssignTunerMode()12mxl5005s_set_params()13mxl5005s_get_frequency()14mxl5005s_get_bandwidth()15mxl5005s_release()16mxl5005s_attach()1718Copyright (C) 2008 Realtek19Copyright (C) 2008 Jan Hoogenraad20Functions:21mxl5005s_SetRfFreqHz()2223This program is free software; you can redistribute it and/or modify24it under the terms of the GNU General Public License as published by25the Free Software Foundation; either version 2 of the License, or26(at your option) any later version.2728This program is distributed in the hope that it will be useful,29but WITHOUT ANY WARRANTY; without even the implied warranty of30MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the31GNU General Public License for more details.3233You should have received a copy of the GNU General Public License34along with this program; if not, write to the Free Software35Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.3637*/3839/*40History of this driver (Steven Toth):41I was given a public release of a linux driver that included42support for the MaxLinear MXL5005S silicon tuner. Analysis of43the tuner driver showed clearly three things.44451. The tuner driver didn't support the LinuxTV tuner API46so the code Realtek added had to be removed.47482. A significant amount of the driver is reference driver code49from MaxLinear, I felt it was important to identify and50preserve this.51523. New code has to be added to interface correctly with the53LinuxTV API, as a regular kernel module.5455Other than the reference driver enum's, I've clearly marked56sections of the code and retained the copyright of the57respective owners.58*/59#include <linux/kernel.h>60#include <linux/init.h>61#include <linux/module.h>62#include <linux/string.h>63#include <linux/slab.h>64#include <linux/delay.h>65#include "dvb_frontend.h"66#include "mxl5005s.h"6768static int debug;6970#define dprintk(level, arg...) do { \71if (level <= debug) \72printk(arg); \73} while (0)7475#define TUNER_REGS_NUM 10476#define INITCTRL_NUM 407778#ifdef _MXL_PRODUCTION79#define CHCTRL_NUM 3980#else81#define CHCTRL_NUM 3682#endif8384#define MXLCTRL_NUM 18985#define MASTER_CONTROL_ADDR 98687/* Enumeration of Master Control Register State */88enum master_control_state {89MC_LOAD_START = 1,90MC_POWER_DOWN,91MC_SYNTH_RESET,92MC_SEQ_OFF93};9495/* Enumeration of MXL5005 Tuner Modulation Type */96enum {97MXL_DEFAULT_MODULATION = 0,98MXL_DVBT,99MXL_ATSC,100MXL_QAM,101MXL_ANALOG_CABLE,102MXL_ANALOG_OTA103};104105/* MXL5005 Tuner Register Struct */106struct TunerReg {107u16 Reg_Num; /* Tuner Register Address */108u16 Reg_Val; /* Current sw programmed value waiting to be written */109};110111enum {112/* Initialization Control Names */113DN_IQTN_AMP_CUT = 1, /* 1 */114BB_MODE, /* 2 */115BB_BUF, /* 3 */116BB_BUF_OA, /* 4 */117BB_ALPF_BANDSELECT, /* 5 */118BB_IQSWAP, /* 6 */119BB_DLPF_BANDSEL, /* 7 */120RFSYN_CHP_GAIN, /* 8 */121RFSYN_EN_CHP_HIGAIN, /* 9 */122AGC_IF, /* 10 */123AGC_RF, /* 11 */124IF_DIVVAL, /* 12 */125IF_VCO_BIAS, /* 13 */126CHCAL_INT_MOD_IF, /* 14 */127CHCAL_FRAC_MOD_IF, /* 15 */128DRV_RES_SEL, /* 16 */129I_DRIVER, /* 17 */130EN_AAF, /* 18 */131EN_3P, /* 19 */132EN_AUX_3P, /* 20 */133SEL_AAF_BAND, /* 21 */134SEQ_ENCLK16_CLK_OUT, /* 22 */135SEQ_SEL4_16B, /* 23 */136XTAL_CAPSELECT, /* 24 */137IF_SEL_DBL, /* 25 */138RFSYN_R_DIV, /* 26 */139SEQ_EXTSYNTHCALIF, /* 27 */140SEQ_EXTDCCAL, /* 28 */141AGC_EN_RSSI, /* 29 */142RFA_ENCLKRFAGC, /* 30 */143RFA_RSSI_REFH, /* 31 */144RFA_RSSI_REF, /* 32 */145RFA_RSSI_REFL, /* 33 */146RFA_FLR, /* 34 */147RFA_CEIL, /* 35 */148SEQ_EXTIQFSMPULSE, /* 36 */149OVERRIDE_1, /* 37 */150BB_INITSTATE_DLPF_TUNE, /* 38 */151TG_R_DIV, /* 39 */152EN_CHP_LIN_B, /* 40 */153154/* Channel Change Control Names */155DN_POLY = 51, /* 51 */156DN_RFGAIN, /* 52 */157DN_CAP_RFLPF, /* 53 */158DN_EN_VHFUHFBAR, /* 54 */159DN_GAIN_ADJUST, /* 55 */160DN_IQTNBUF_AMP, /* 56 */161DN_IQTNGNBFBIAS_BST, /* 57 */162RFSYN_EN_OUTMUX, /* 58 */163RFSYN_SEL_VCO_OUT, /* 59 */164RFSYN_SEL_VCO_HI, /* 60 */165RFSYN_SEL_DIVM, /* 61 */166RFSYN_RF_DIV_BIAS, /* 62 */167DN_SEL_FREQ, /* 63 */168RFSYN_VCO_BIAS, /* 64 */169CHCAL_INT_MOD_RF, /* 65 */170CHCAL_FRAC_MOD_RF, /* 66 */171RFSYN_LPF_R, /* 67 */172CHCAL_EN_INT_RF, /* 68 */173TG_LO_DIVVAL, /* 69 */174TG_LO_SELVAL, /* 70 */175TG_DIV_VAL, /* 71 */176TG_VCO_BIAS, /* 72 */177SEQ_EXTPOWERUP, /* 73 */178OVERRIDE_2, /* 74 */179OVERRIDE_3, /* 75 */180OVERRIDE_4, /* 76 */181SEQ_FSM_PULSE, /* 77 */182GPIO_4B, /* 78 */183GPIO_3B, /* 79 */184GPIO_4, /* 80 */185GPIO_3, /* 81 */186GPIO_1B, /* 82 */187DAC_A_ENABLE, /* 83 */188DAC_B_ENABLE, /* 84 */189DAC_DIN_A, /* 85 */190DAC_DIN_B, /* 86 */191#ifdef _MXL_PRODUCTION192RFSYN_EN_DIV, /* 87 */193RFSYN_DIVM, /* 88 */194DN_BYPASS_AGC_I2C /* 89 */195#endif196};197198/*199* The following context is source code provided by MaxLinear.200* MaxLinear source code - Common_MXL.h (?)201*/202203/* Constants */204#define MXL5005S_REG_WRITING_TABLE_LEN_MAX 104205#define MXL5005S_LATCH_BYTE 0xfe206207/* Register address, MSB, and LSB */208#define MXL5005S_BB_IQSWAP_ADDR 59209#define MXL5005S_BB_IQSWAP_MSB 0210#define MXL5005S_BB_IQSWAP_LSB 0211212#define MXL5005S_BB_DLPF_BANDSEL_ADDR 53213#define MXL5005S_BB_DLPF_BANDSEL_MSB 4214#define MXL5005S_BB_DLPF_BANDSEL_LSB 3215216/* Standard modes */217enum {218MXL5005S_STANDARD_DVBT,219MXL5005S_STANDARD_ATSC,220};221#define MXL5005S_STANDARD_MODE_NUM 2222223/* Bandwidth modes */224enum {225MXL5005S_BANDWIDTH_6MHZ = 6000000,226MXL5005S_BANDWIDTH_7MHZ = 7000000,227MXL5005S_BANDWIDTH_8MHZ = 8000000,228};229#define MXL5005S_BANDWIDTH_MODE_NUM 3230231/* MXL5005 Tuner Control Struct */232struct TunerControl {233u16 Ctrl_Num; /* Control Number */234u16 size; /* Number of bits to represent Value */235u16 addr[25]; /* Array of Tuner Register Address for each bit pos */236u16 bit[25]; /* Array of bit pos in Reg Addr for each bit pos */237u16 val[25]; /* Binary representation of Value */238};239240/* MXL5005 Tuner Struct */241struct mxl5005s_state {242u8 Mode; /* 0: Analog Mode ; 1: Digital Mode */243u8 IF_Mode; /* for Analog Mode, 0: zero IF; 1: low IF */244u32 Chan_Bandwidth; /* filter channel bandwidth (6, 7, 8) */245u32 IF_OUT; /* Desired IF Out Frequency */246u16 IF_OUT_LOAD; /* IF Out Load Resistor (200/300 Ohms) */247u32 RF_IN; /* RF Input Frequency */248u32 Fxtal; /* XTAL Frequency */249u8 AGC_Mode; /* AGC Mode 0: Dual AGC; 1: Single AGC */250u16 TOP; /* Value: take over point */251u8 CLOCK_OUT; /* 0: turn off clk out; 1: turn on clock out */252u8 DIV_OUT; /* 4MHz or 16MHz */253u8 CAPSELECT; /* 0: disable On-Chip pulling cap; 1: enable */254u8 EN_RSSI; /* 0: disable RSSI; 1: enable RSSI */255256/* Modulation Type; */257/* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */258u8 Mod_Type;259260/* Tracking Filter Type */261/* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */262u8 TF_Type;263264/* Calculated Settings */265u32 RF_LO; /* Synth RF LO Frequency */266u32 IF_LO; /* Synth IF LO Frequency */267u32 TG_LO; /* Synth TG_LO Frequency */268269/* Pointers to ControlName Arrays */270u16 Init_Ctrl_Num; /* Number of INIT Control Names */271struct TunerControl272Init_Ctrl[INITCTRL_NUM]; /* INIT Control Names Array Pointer */273274u16 CH_Ctrl_Num; /* Number of CH Control Names */275struct TunerControl276CH_Ctrl[CHCTRL_NUM]; /* CH Control Name Array Pointer */277278u16 MXL_Ctrl_Num; /* Number of MXL Control Names */279struct TunerControl280MXL_Ctrl[MXLCTRL_NUM]; /* MXL Control Name Array Pointer */281282/* Pointer to Tuner Register Array */283u16 TunerRegs_Num; /* Number of Tuner Registers */284struct TunerReg285TunerRegs[TUNER_REGS_NUM]; /* Tuner Register Array Pointer */286287/* Linux driver framework specific */288struct mxl5005s_config *config;289struct dvb_frontend *frontend;290struct i2c_adapter *i2c;291292/* Cache values */293u32 current_mode;294295};296297static u16 MXL_GetMasterControl(u8 *MasterReg, int state);298static u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value);299static u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value);300static void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit,301u8 bitVal);302static u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum,303u8 *RegVal, int *count);304static u32 MXL_Ceiling(u32 value, u32 resolution);305static u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal);306static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum,307u32 value, u16 controlGroup);308static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val);309static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,310u8 *RegVal, int *count);311static u32 MXL_GetXtalInt(u32 Xtal_Freq);312static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq);313static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe);314static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe);315static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,316u8 *RegVal, int *count);317static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable,318u8 *datatable, u8 len);319static u16 MXL_IFSynthInit(struct dvb_frontend *fe);320static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,321u32 bandwidth);322static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type,323u32 bandwidth);324325/* ----------------------------------------------------------------326* Begin: Custom code salvaged from the Realtek driver.327* Copyright (C) 2008 Realtek328* Copyright (C) 2008 Jan Hoogenraad329* This code is placed under the terms of the GNU General Public License330*331* Released by Realtek under GPLv2.332* Thanks to Realtek for a lot of support we received !333*334* Revision: 080314 - original version335*/336337static int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz)338{339struct mxl5005s_state *state = fe->tuner_priv;340unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];341unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];342int TableLen;343344u32 IfDivval = 0;345unsigned char MasterControlByte;346347dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz);348349/* Set MxL5005S tuner RF frequency according to example code. */350351/* Tuner RF frequency setting stage 0 */352MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);353AddrTable[0] = MASTER_CONTROL_ADDR;354ByteTable[0] |= state->config->AgcMasterByte;355356mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);357358/* Tuner RF frequency setting stage 1 */359MXL_TuneRF(fe, RfFreqHz);360361MXL_ControlRead(fe, IF_DIVVAL, &IfDivval);362363MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0);364MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1);365MXL_ControlWrite(fe, IF_DIVVAL, 8);366MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen);367368MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);369AddrTable[TableLen] = MASTER_CONTROL_ADDR ;370ByteTable[TableLen] = MasterControlByte |371state->config->AgcMasterByte;372TableLen += 1;373374mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);375376/* Wait 30 ms. */377msleep(150);378379/* Tuner RF frequency setting stage 2 */380MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1);381MXL_ControlWrite(fe, IF_DIVVAL, IfDivval);382MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen);383384MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START);385AddrTable[TableLen] = MASTER_CONTROL_ADDR ;386ByteTable[TableLen] = MasterControlByte |387state->config->AgcMasterByte ;388TableLen += 1;389390mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);391392msleep(100);393394return 0;395}396/* End: Custom code taken from the Realtek driver */397398/* ----------------------------------------------------------------399* Begin: Reference driver code found in the Realtek driver.400* Copyright (C) 2008 MaxLinear401*/402static u16 MXL5005_RegisterInit(struct dvb_frontend *fe)403{404struct mxl5005s_state *state = fe->tuner_priv;405state->TunerRegs_Num = TUNER_REGS_NUM ;406407state->TunerRegs[0].Reg_Num = 9 ;408state->TunerRegs[0].Reg_Val = 0x40 ;409410state->TunerRegs[1].Reg_Num = 11 ;411state->TunerRegs[1].Reg_Val = 0x19 ;412413state->TunerRegs[2].Reg_Num = 12 ;414state->TunerRegs[2].Reg_Val = 0x60 ;415416state->TunerRegs[3].Reg_Num = 13 ;417state->TunerRegs[3].Reg_Val = 0x00 ;418419state->TunerRegs[4].Reg_Num = 14 ;420state->TunerRegs[4].Reg_Val = 0x00 ;421422state->TunerRegs[5].Reg_Num = 15 ;423state->TunerRegs[5].Reg_Val = 0xC0 ;424425state->TunerRegs[6].Reg_Num = 16 ;426state->TunerRegs[6].Reg_Val = 0x00 ;427428state->TunerRegs[7].Reg_Num = 17 ;429state->TunerRegs[7].Reg_Val = 0x00 ;430431state->TunerRegs[8].Reg_Num = 18 ;432state->TunerRegs[8].Reg_Val = 0x00 ;433434state->TunerRegs[9].Reg_Num = 19 ;435state->TunerRegs[9].Reg_Val = 0x34 ;436437state->TunerRegs[10].Reg_Num = 21 ;438state->TunerRegs[10].Reg_Val = 0x00 ;439440state->TunerRegs[11].Reg_Num = 22 ;441state->TunerRegs[11].Reg_Val = 0x6B ;442443state->TunerRegs[12].Reg_Num = 23 ;444state->TunerRegs[12].Reg_Val = 0x35 ;445446state->TunerRegs[13].Reg_Num = 24 ;447state->TunerRegs[13].Reg_Val = 0x70 ;448449state->TunerRegs[14].Reg_Num = 25 ;450state->TunerRegs[14].Reg_Val = 0x3E ;451452state->TunerRegs[15].Reg_Num = 26 ;453state->TunerRegs[15].Reg_Val = 0x82 ;454455state->TunerRegs[16].Reg_Num = 31 ;456state->TunerRegs[16].Reg_Val = 0x00 ;457458state->TunerRegs[17].Reg_Num = 32 ;459state->TunerRegs[17].Reg_Val = 0x40 ;460461state->TunerRegs[18].Reg_Num = 33 ;462state->TunerRegs[18].Reg_Val = 0x53 ;463464state->TunerRegs[19].Reg_Num = 34 ;465state->TunerRegs[19].Reg_Val = 0x81 ;466467state->TunerRegs[20].Reg_Num = 35 ;468state->TunerRegs[20].Reg_Val = 0xC9 ;469470state->TunerRegs[21].Reg_Num = 36 ;471state->TunerRegs[21].Reg_Val = 0x01 ;472473state->TunerRegs[22].Reg_Num = 37 ;474state->TunerRegs[22].Reg_Val = 0x00 ;475476state->TunerRegs[23].Reg_Num = 41 ;477state->TunerRegs[23].Reg_Val = 0x00 ;478479state->TunerRegs[24].Reg_Num = 42 ;480state->TunerRegs[24].Reg_Val = 0xF8 ;481482state->TunerRegs[25].Reg_Num = 43 ;483state->TunerRegs[25].Reg_Val = 0x43 ;484485state->TunerRegs[26].Reg_Num = 44 ;486state->TunerRegs[26].Reg_Val = 0x20 ;487488state->TunerRegs[27].Reg_Num = 45 ;489state->TunerRegs[27].Reg_Val = 0x80 ;490491state->TunerRegs[28].Reg_Num = 46 ;492state->TunerRegs[28].Reg_Val = 0x88 ;493494state->TunerRegs[29].Reg_Num = 47 ;495state->TunerRegs[29].Reg_Val = 0x86 ;496497state->TunerRegs[30].Reg_Num = 48 ;498state->TunerRegs[30].Reg_Val = 0x00 ;499500state->TunerRegs[31].Reg_Num = 49 ;501state->TunerRegs[31].Reg_Val = 0x00 ;502503state->TunerRegs[32].Reg_Num = 53 ;504state->TunerRegs[32].Reg_Val = 0x94 ;505506state->TunerRegs[33].Reg_Num = 54 ;507state->TunerRegs[33].Reg_Val = 0xFA ;508509state->TunerRegs[34].Reg_Num = 55 ;510state->TunerRegs[34].Reg_Val = 0x92 ;511512state->TunerRegs[35].Reg_Num = 56 ;513state->TunerRegs[35].Reg_Val = 0x80 ;514515state->TunerRegs[36].Reg_Num = 57 ;516state->TunerRegs[36].Reg_Val = 0x41 ;517518state->TunerRegs[37].Reg_Num = 58 ;519state->TunerRegs[37].Reg_Val = 0xDB ;520521state->TunerRegs[38].Reg_Num = 59 ;522state->TunerRegs[38].Reg_Val = 0x00 ;523524state->TunerRegs[39].Reg_Num = 60 ;525state->TunerRegs[39].Reg_Val = 0x00 ;526527state->TunerRegs[40].Reg_Num = 61 ;528state->TunerRegs[40].Reg_Val = 0x00 ;529530state->TunerRegs[41].Reg_Num = 62 ;531state->TunerRegs[41].Reg_Val = 0x00 ;532533state->TunerRegs[42].Reg_Num = 65 ;534state->TunerRegs[42].Reg_Val = 0xF8 ;535536state->TunerRegs[43].Reg_Num = 66 ;537state->TunerRegs[43].Reg_Val = 0xE4 ;538539state->TunerRegs[44].Reg_Num = 67 ;540state->TunerRegs[44].Reg_Val = 0x90 ;541542state->TunerRegs[45].Reg_Num = 68 ;543state->TunerRegs[45].Reg_Val = 0xC0 ;544545state->TunerRegs[46].Reg_Num = 69 ;546state->TunerRegs[46].Reg_Val = 0x01 ;547548state->TunerRegs[47].Reg_Num = 70 ;549state->TunerRegs[47].Reg_Val = 0x50 ;550551state->TunerRegs[48].Reg_Num = 71 ;552state->TunerRegs[48].Reg_Val = 0x06 ;553554state->TunerRegs[49].Reg_Num = 72 ;555state->TunerRegs[49].Reg_Val = 0x00 ;556557state->TunerRegs[50].Reg_Num = 73 ;558state->TunerRegs[50].Reg_Val = 0x20 ;559560state->TunerRegs[51].Reg_Num = 76 ;561state->TunerRegs[51].Reg_Val = 0xBB ;562563state->TunerRegs[52].Reg_Num = 77 ;564state->TunerRegs[52].Reg_Val = 0x13 ;565566state->TunerRegs[53].Reg_Num = 81 ;567state->TunerRegs[53].Reg_Val = 0x04 ;568569state->TunerRegs[54].Reg_Num = 82 ;570state->TunerRegs[54].Reg_Val = 0x75 ;571572state->TunerRegs[55].Reg_Num = 83 ;573state->TunerRegs[55].Reg_Val = 0x00 ;574575state->TunerRegs[56].Reg_Num = 84 ;576state->TunerRegs[56].Reg_Val = 0x00 ;577578state->TunerRegs[57].Reg_Num = 85 ;579state->TunerRegs[57].Reg_Val = 0x00 ;580581state->TunerRegs[58].Reg_Num = 91 ;582state->TunerRegs[58].Reg_Val = 0x70 ;583584state->TunerRegs[59].Reg_Num = 92 ;585state->TunerRegs[59].Reg_Val = 0x00 ;586587state->TunerRegs[60].Reg_Num = 93 ;588state->TunerRegs[60].Reg_Val = 0x00 ;589590state->TunerRegs[61].Reg_Num = 94 ;591state->TunerRegs[61].Reg_Val = 0x00 ;592593state->TunerRegs[62].Reg_Num = 95 ;594state->TunerRegs[62].Reg_Val = 0x0C ;595596state->TunerRegs[63].Reg_Num = 96 ;597state->TunerRegs[63].Reg_Val = 0x00 ;598599state->TunerRegs[64].Reg_Num = 97 ;600state->TunerRegs[64].Reg_Val = 0x00 ;601602state->TunerRegs[65].Reg_Num = 98 ;603state->TunerRegs[65].Reg_Val = 0xE2 ;604605state->TunerRegs[66].Reg_Num = 99 ;606state->TunerRegs[66].Reg_Val = 0x00 ;607608state->TunerRegs[67].Reg_Num = 100 ;609state->TunerRegs[67].Reg_Val = 0x00 ;610611state->TunerRegs[68].Reg_Num = 101 ;612state->TunerRegs[68].Reg_Val = 0x12 ;613614state->TunerRegs[69].Reg_Num = 102 ;615state->TunerRegs[69].Reg_Val = 0x80 ;616617state->TunerRegs[70].Reg_Num = 103 ;618state->TunerRegs[70].Reg_Val = 0x32 ;619620state->TunerRegs[71].Reg_Num = 104 ;621state->TunerRegs[71].Reg_Val = 0xB4 ;622623state->TunerRegs[72].Reg_Num = 105 ;624state->TunerRegs[72].Reg_Val = 0x60 ;625626state->TunerRegs[73].Reg_Num = 106 ;627state->TunerRegs[73].Reg_Val = 0x83 ;628629state->TunerRegs[74].Reg_Num = 107 ;630state->TunerRegs[74].Reg_Val = 0x84 ;631632state->TunerRegs[75].Reg_Num = 108 ;633state->TunerRegs[75].Reg_Val = 0x9C ;634635state->TunerRegs[76].Reg_Num = 109 ;636state->TunerRegs[76].Reg_Val = 0x02 ;637638state->TunerRegs[77].Reg_Num = 110 ;639state->TunerRegs[77].Reg_Val = 0x81 ;640641state->TunerRegs[78].Reg_Num = 111 ;642state->TunerRegs[78].Reg_Val = 0xC0 ;643644state->TunerRegs[79].Reg_Num = 112 ;645state->TunerRegs[79].Reg_Val = 0x10 ;646647state->TunerRegs[80].Reg_Num = 131 ;648state->TunerRegs[80].Reg_Val = 0x8A ;649650state->TunerRegs[81].Reg_Num = 132 ;651state->TunerRegs[81].Reg_Val = 0x10 ;652653state->TunerRegs[82].Reg_Num = 133 ;654state->TunerRegs[82].Reg_Val = 0x24 ;655656state->TunerRegs[83].Reg_Num = 134 ;657state->TunerRegs[83].Reg_Val = 0x00 ;658659state->TunerRegs[84].Reg_Num = 135 ;660state->TunerRegs[84].Reg_Val = 0x00 ;661662state->TunerRegs[85].Reg_Num = 136 ;663state->TunerRegs[85].Reg_Val = 0x7E ;664665state->TunerRegs[86].Reg_Num = 137 ;666state->TunerRegs[86].Reg_Val = 0x40 ;667668state->TunerRegs[87].Reg_Num = 138 ;669state->TunerRegs[87].Reg_Val = 0x38 ;670671state->TunerRegs[88].Reg_Num = 146 ;672state->TunerRegs[88].Reg_Val = 0xF6 ;673674state->TunerRegs[89].Reg_Num = 147 ;675state->TunerRegs[89].Reg_Val = 0x1A ;676677state->TunerRegs[90].Reg_Num = 148 ;678state->TunerRegs[90].Reg_Val = 0x62 ;679680state->TunerRegs[91].Reg_Num = 149 ;681state->TunerRegs[91].Reg_Val = 0x33 ;682683state->TunerRegs[92].Reg_Num = 150 ;684state->TunerRegs[92].Reg_Val = 0x80 ;685686state->TunerRegs[93].Reg_Num = 156 ;687state->TunerRegs[93].Reg_Val = 0x56 ;688689state->TunerRegs[94].Reg_Num = 157 ;690state->TunerRegs[94].Reg_Val = 0x17 ;691692state->TunerRegs[95].Reg_Num = 158 ;693state->TunerRegs[95].Reg_Val = 0xA9 ;694695state->TunerRegs[96].Reg_Num = 159 ;696state->TunerRegs[96].Reg_Val = 0x00 ;697698state->TunerRegs[97].Reg_Num = 160 ;699state->TunerRegs[97].Reg_Val = 0x00 ;700701state->TunerRegs[98].Reg_Num = 161 ;702state->TunerRegs[98].Reg_Val = 0x00 ;703704state->TunerRegs[99].Reg_Num = 162 ;705state->TunerRegs[99].Reg_Val = 0x40 ;706707state->TunerRegs[100].Reg_Num = 166 ;708state->TunerRegs[100].Reg_Val = 0xAE ;709710state->TunerRegs[101].Reg_Num = 167 ;711state->TunerRegs[101].Reg_Val = 0x1B ;712713state->TunerRegs[102].Reg_Num = 168 ;714state->TunerRegs[102].Reg_Val = 0xF2 ;715716state->TunerRegs[103].Reg_Num = 195 ;717state->TunerRegs[103].Reg_Val = 0x00 ;718719return 0 ;720}721722static u16 MXL5005_ControlInit(struct dvb_frontend *fe)723{724struct mxl5005s_state *state = fe->tuner_priv;725state->Init_Ctrl_Num = INITCTRL_NUM;726727state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;728state->Init_Ctrl[0].size = 1 ;729state->Init_Ctrl[0].addr[0] = 73;730state->Init_Ctrl[0].bit[0] = 7;731state->Init_Ctrl[0].val[0] = 0;732733state->Init_Ctrl[1].Ctrl_Num = BB_MODE ;734state->Init_Ctrl[1].size = 1 ;735state->Init_Ctrl[1].addr[0] = 53;736state->Init_Ctrl[1].bit[0] = 2;737state->Init_Ctrl[1].val[0] = 1;738739state->Init_Ctrl[2].Ctrl_Num = BB_BUF ;740state->Init_Ctrl[2].size = 2 ;741state->Init_Ctrl[2].addr[0] = 53;742state->Init_Ctrl[2].bit[0] = 1;743state->Init_Ctrl[2].val[0] = 0;744state->Init_Ctrl[2].addr[1] = 57;745state->Init_Ctrl[2].bit[1] = 0;746state->Init_Ctrl[2].val[1] = 1;747748state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;749state->Init_Ctrl[3].size = 1 ;750state->Init_Ctrl[3].addr[0] = 53;751state->Init_Ctrl[3].bit[0] = 0;752state->Init_Ctrl[3].val[0] = 0;753754state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;755state->Init_Ctrl[4].size = 3 ;756state->Init_Ctrl[4].addr[0] = 53;757state->Init_Ctrl[4].bit[0] = 5;758state->Init_Ctrl[4].val[0] = 0;759state->Init_Ctrl[4].addr[1] = 53;760state->Init_Ctrl[4].bit[1] = 6;761state->Init_Ctrl[4].val[1] = 0;762state->Init_Ctrl[4].addr[2] = 53;763state->Init_Ctrl[4].bit[2] = 7;764state->Init_Ctrl[4].val[2] = 1;765766state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;767state->Init_Ctrl[5].size = 1 ;768state->Init_Ctrl[5].addr[0] = 59;769state->Init_Ctrl[5].bit[0] = 0;770state->Init_Ctrl[5].val[0] = 0;771772state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ;773state->Init_Ctrl[6].size = 2 ;774state->Init_Ctrl[6].addr[0] = 53;775state->Init_Ctrl[6].bit[0] = 3;776state->Init_Ctrl[6].val[0] = 0;777state->Init_Ctrl[6].addr[1] = 53;778state->Init_Ctrl[6].bit[1] = 4;779state->Init_Ctrl[6].val[1] = 1;780781state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ;782state->Init_Ctrl[7].size = 4 ;783state->Init_Ctrl[7].addr[0] = 22;784state->Init_Ctrl[7].bit[0] = 4;785state->Init_Ctrl[7].val[0] = 0;786state->Init_Ctrl[7].addr[1] = 22;787state->Init_Ctrl[7].bit[1] = 5;788state->Init_Ctrl[7].val[1] = 1;789state->Init_Ctrl[7].addr[2] = 22;790state->Init_Ctrl[7].bit[2] = 6;791state->Init_Ctrl[7].val[2] = 1;792state->Init_Ctrl[7].addr[3] = 22;793state->Init_Ctrl[7].bit[3] = 7;794state->Init_Ctrl[7].val[3] = 0;795796state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ;797state->Init_Ctrl[8].size = 1 ;798state->Init_Ctrl[8].addr[0] = 22;799state->Init_Ctrl[8].bit[0] = 2;800state->Init_Ctrl[8].val[0] = 0;801802state->Init_Ctrl[9].Ctrl_Num = AGC_IF ;803state->Init_Ctrl[9].size = 4 ;804state->Init_Ctrl[9].addr[0] = 76;805state->Init_Ctrl[9].bit[0] = 0;806state->Init_Ctrl[9].val[0] = 1;807state->Init_Ctrl[9].addr[1] = 76;808state->Init_Ctrl[9].bit[1] = 1;809state->Init_Ctrl[9].val[1] = 1;810state->Init_Ctrl[9].addr[2] = 76;811state->Init_Ctrl[9].bit[2] = 2;812state->Init_Ctrl[9].val[2] = 0;813state->Init_Ctrl[9].addr[3] = 76;814state->Init_Ctrl[9].bit[3] = 3;815state->Init_Ctrl[9].val[3] = 1;816817state->Init_Ctrl[10].Ctrl_Num = AGC_RF ;818state->Init_Ctrl[10].size = 4 ;819state->Init_Ctrl[10].addr[0] = 76;820state->Init_Ctrl[10].bit[0] = 4;821state->Init_Ctrl[10].val[0] = 1;822state->Init_Ctrl[10].addr[1] = 76;823state->Init_Ctrl[10].bit[1] = 5;824state->Init_Ctrl[10].val[1] = 1;825state->Init_Ctrl[10].addr[2] = 76;826state->Init_Ctrl[10].bit[2] = 6;827state->Init_Ctrl[10].val[2] = 0;828state->Init_Ctrl[10].addr[3] = 76;829state->Init_Ctrl[10].bit[3] = 7;830state->Init_Ctrl[10].val[3] = 1;831832state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ;833state->Init_Ctrl[11].size = 5 ;834state->Init_Ctrl[11].addr[0] = 43;835state->Init_Ctrl[11].bit[0] = 3;836state->Init_Ctrl[11].val[0] = 0;837state->Init_Ctrl[11].addr[1] = 43;838state->Init_Ctrl[11].bit[1] = 4;839state->Init_Ctrl[11].val[1] = 0;840state->Init_Ctrl[11].addr[2] = 43;841state->Init_Ctrl[11].bit[2] = 5;842state->Init_Ctrl[11].val[2] = 0;843state->Init_Ctrl[11].addr[3] = 43;844state->Init_Ctrl[11].bit[3] = 6;845state->Init_Ctrl[11].val[3] = 1;846state->Init_Ctrl[11].addr[4] = 43;847state->Init_Ctrl[11].bit[4] = 7;848state->Init_Ctrl[11].val[4] = 0;849850state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ;851state->Init_Ctrl[12].size = 6 ;852state->Init_Ctrl[12].addr[0] = 44;853state->Init_Ctrl[12].bit[0] = 2;854state->Init_Ctrl[12].val[0] = 0;855state->Init_Ctrl[12].addr[1] = 44;856state->Init_Ctrl[12].bit[1] = 3;857state->Init_Ctrl[12].val[1] = 0;858state->Init_Ctrl[12].addr[2] = 44;859state->Init_Ctrl[12].bit[2] = 4;860state->Init_Ctrl[12].val[2] = 0;861state->Init_Ctrl[12].addr[3] = 44;862state->Init_Ctrl[12].bit[3] = 5;863state->Init_Ctrl[12].val[3] = 1;864state->Init_Ctrl[12].addr[4] = 44;865state->Init_Ctrl[12].bit[4] = 6;866state->Init_Ctrl[12].val[4] = 0;867state->Init_Ctrl[12].addr[5] = 44;868state->Init_Ctrl[12].bit[5] = 7;869state->Init_Ctrl[12].val[5] = 0;870871state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ;872state->Init_Ctrl[13].size = 7 ;873state->Init_Ctrl[13].addr[0] = 11;874state->Init_Ctrl[13].bit[0] = 0;875state->Init_Ctrl[13].val[0] = 1;876state->Init_Ctrl[13].addr[1] = 11;877state->Init_Ctrl[13].bit[1] = 1;878state->Init_Ctrl[13].val[1] = 0;879state->Init_Ctrl[13].addr[2] = 11;880state->Init_Ctrl[13].bit[2] = 2;881state->Init_Ctrl[13].val[2] = 0;882state->Init_Ctrl[13].addr[3] = 11;883state->Init_Ctrl[13].bit[3] = 3;884state->Init_Ctrl[13].val[3] = 1;885state->Init_Ctrl[13].addr[4] = 11;886state->Init_Ctrl[13].bit[4] = 4;887state->Init_Ctrl[13].val[4] = 1;888state->Init_Ctrl[13].addr[5] = 11;889state->Init_Ctrl[13].bit[5] = 5;890state->Init_Ctrl[13].val[5] = 0;891state->Init_Ctrl[13].addr[6] = 11;892state->Init_Ctrl[13].bit[6] = 6;893state->Init_Ctrl[13].val[6] = 0;894895state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ;896state->Init_Ctrl[14].size = 16 ;897state->Init_Ctrl[14].addr[0] = 13;898state->Init_Ctrl[14].bit[0] = 0;899state->Init_Ctrl[14].val[0] = 0;900state->Init_Ctrl[14].addr[1] = 13;901state->Init_Ctrl[14].bit[1] = 1;902state->Init_Ctrl[14].val[1] = 0;903state->Init_Ctrl[14].addr[2] = 13;904state->Init_Ctrl[14].bit[2] = 2;905state->Init_Ctrl[14].val[2] = 0;906state->Init_Ctrl[14].addr[3] = 13;907state->Init_Ctrl[14].bit[3] = 3;908state->Init_Ctrl[14].val[3] = 0;909state->Init_Ctrl[14].addr[4] = 13;910state->Init_Ctrl[14].bit[4] = 4;911state->Init_Ctrl[14].val[4] = 0;912state->Init_Ctrl[14].addr[5] = 13;913state->Init_Ctrl[14].bit[5] = 5;914state->Init_Ctrl[14].val[5] = 0;915state->Init_Ctrl[14].addr[6] = 13;916state->Init_Ctrl[14].bit[6] = 6;917state->Init_Ctrl[14].val[6] = 0;918state->Init_Ctrl[14].addr[7] = 13;919state->Init_Ctrl[14].bit[7] = 7;920state->Init_Ctrl[14].val[7] = 0;921state->Init_Ctrl[14].addr[8] = 12;922state->Init_Ctrl[14].bit[8] = 0;923state->Init_Ctrl[14].val[8] = 0;924state->Init_Ctrl[14].addr[9] = 12;925state->Init_Ctrl[14].bit[9] = 1;926state->Init_Ctrl[14].val[9] = 0;927state->Init_Ctrl[14].addr[10] = 12;928state->Init_Ctrl[14].bit[10] = 2;929state->Init_Ctrl[14].val[10] = 0;930state->Init_Ctrl[14].addr[11] = 12;931state->Init_Ctrl[14].bit[11] = 3;932state->Init_Ctrl[14].val[11] = 0;933state->Init_Ctrl[14].addr[12] = 12;934state->Init_Ctrl[14].bit[12] = 4;935state->Init_Ctrl[14].val[12] = 0;936state->Init_Ctrl[14].addr[13] = 12;937state->Init_Ctrl[14].bit[13] = 5;938state->Init_Ctrl[14].val[13] = 1;939state->Init_Ctrl[14].addr[14] = 12;940state->Init_Ctrl[14].bit[14] = 6;941state->Init_Ctrl[14].val[14] = 1;942state->Init_Ctrl[14].addr[15] = 12;943state->Init_Ctrl[14].bit[15] = 7;944state->Init_Ctrl[14].val[15] = 0;945946state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ;947state->Init_Ctrl[15].size = 3 ;948state->Init_Ctrl[15].addr[0] = 147;949state->Init_Ctrl[15].bit[0] = 2;950state->Init_Ctrl[15].val[0] = 0;951state->Init_Ctrl[15].addr[1] = 147;952state->Init_Ctrl[15].bit[1] = 3;953state->Init_Ctrl[15].val[1] = 1;954state->Init_Ctrl[15].addr[2] = 147;955state->Init_Ctrl[15].bit[2] = 4;956state->Init_Ctrl[15].val[2] = 1;957958state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ;959state->Init_Ctrl[16].size = 2 ;960state->Init_Ctrl[16].addr[0] = 147;961state->Init_Ctrl[16].bit[0] = 0;962state->Init_Ctrl[16].val[0] = 0;963state->Init_Ctrl[16].addr[1] = 147;964state->Init_Ctrl[16].bit[1] = 1;965state->Init_Ctrl[16].val[1] = 1;966967state->Init_Ctrl[17].Ctrl_Num = EN_AAF ;968state->Init_Ctrl[17].size = 1 ;969state->Init_Ctrl[17].addr[0] = 147;970state->Init_Ctrl[17].bit[0] = 7;971state->Init_Ctrl[17].val[0] = 0;972973state->Init_Ctrl[18].Ctrl_Num = EN_3P ;974state->Init_Ctrl[18].size = 1 ;975state->Init_Ctrl[18].addr[0] = 147;976state->Init_Ctrl[18].bit[0] = 6;977state->Init_Ctrl[18].val[0] = 0;978979state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ;980state->Init_Ctrl[19].size = 1 ;981state->Init_Ctrl[19].addr[0] = 156;982state->Init_Ctrl[19].bit[0] = 0;983state->Init_Ctrl[19].val[0] = 0;984985state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ;986state->Init_Ctrl[20].size = 1 ;987state->Init_Ctrl[20].addr[0] = 147;988state->Init_Ctrl[20].bit[0] = 5;989state->Init_Ctrl[20].val[0] = 0;990991state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ;992state->Init_Ctrl[21].size = 1 ;993state->Init_Ctrl[21].addr[0] = 137;994state->Init_Ctrl[21].bit[0] = 4;995state->Init_Ctrl[21].val[0] = 0;996997state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ;998state->Init_Ctrl[22].size = 1 ;999state->Init_Ctrl[22].addr[0] = 137;1000state->Init_Ctrl[22].bit[0] = 7;1001state->Init_Ctrl[22].val[0] = 0;10021003state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ;1004state->Init_Ctrl[23].size = 1 ;1005state->Init_Ctrl[23].addr[0] = 91;1006state->Init_Ctrl[23].bit[0] = 5;1007state->Init_Ctrl[23].val[0] = 1;10081009state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ;1010state->Init_Ctrl[24].size = 1 ;1011state->Init_Ctrl[24].addr[0] = 43;1012state->Init_Ctrl[24].bit[0] = 0;1013state->Init_Ctrl[24].val[0] = 1;10141015state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ;1016state->Init_Ctrl[25].size = 2 ;1017state->Init_Ctrl[25].addr[0] = 22;1018state->Init_Ctrl[25].bit[0] = 0;1019state->Init_Ctrl[25].val[0] = 1;1020state->Init_Ctrl[25].addr[1] = 22;1021state->Init_Ctrl[25].bit[1] = 1;1022state->Init_Ctrl[25].val[1] = 1;10231024state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ;1025state->Init_Ctrl[26].size = 1 ;1026state->Init_Ctrl[26].addr[0] = 134;1027state->Init_Ctrl[26].bit[0] = 2;1028state->Init_Ctrl[26].val[0] = 0;10291030state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ;1031state->Init_Ctrl[27].size = 1 ;1032state->Init_Ctrl[27].addr[0] = 137;1033state->Init_Ctrl[27].bit[0] = 3;1034state->Init_Ctrl[27].val[0] = 0;10351036state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ;1037state->Init_Ctrl[28].size = 1 ;1038state->Init_Ctrl[28].addr[0] = 77;1039state->Init_Ctrl[28].bit[0] = 7;1040state->Init_Ctrl[28].val[0] = 0;10411042state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ;1043state->Init_Ctrl[29].size = 1 ;1044state->Init_Ctrl[29].addr[0] = 166;1045state->Init_Ctrl[29].bit[0] = 7;1046state->Init_Ctrl[29].val[0] = 1;10471048state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ;1049state->Init_Ctrl[30].size = 3 ;1050state->Init_Ctrl[30].addr[0] = 166;1051state->Init_Ctrl[30].bit[0] = 0;1052state->Init_Ctrl[30].val[0] = 0;1053state->Init_Ctrl[30].addr[1] = 166;1054state->Init_Ctrl[30].bit[1] = 1;1055state->Init_Ctrl[30].val[1] = 1;1056state->Init_Ctrl[30].addr[2] = 166;1057state->Init_Ctrl[30].bit[2] = 2;1058state->Init_Ctrl[30].val[2] = 1;10591060state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ;1061state->Init_Ctrl[31].size = 3 ;1062state->Init_Ctrl[31].addr[0] = 166;1063state->Init_Ctrl[31].bit[0] = 3;1064state->Init_Ctrl[31].val[0] = 1;1065state->Init_Ctrl[31].addr[1] = 166;1066state->Init_Ctrl[31].bit[1] = 4;1067state->Init_Ctrl[31].val[1] = 0;1068state->Init_Ctrl[31].addr[2] = 166;1069state->Init_Ctrl[31].bit[2] = 5;1070state->Init_Ctrl[31].val[2] = 1;10711072state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ;1073state->Init_Ctrl[32].size = 3 ;1074state->Init_Ctrl[32].addr[0] = 167;1075state->Init_Ctrl[32].bit[0] = 0;1076state->Init_Ctrl[32].val[0] = 1;1077state->Init_Ctrl[32].addr[1] = 167;1078state->Init_Ctrl[32].bit[1] = 1;1079state->Init_Ctrl[32].val[1] = 1;1080state->Init_Ctrl[32].addr[2] = 167;1081state->Init_Ctrl[32].bit[2] = 2;1082state->Init_Ctrl[32].val[2] = 0;10831084state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ;1085state->Init_Ctrl[33].size = 4 ;1086state->Init_Ctrl[33].addr[0] = 168;1087state->Init_Ctrl[33].bit[0] = 0;1088state->Init_Ctrl[33].val[0] = 0;1089state->Init_Ctrl[33].addr[1] = 168;1090state->Init_Ctrl[33].bit[1] = 1;1091state->Init_Ctrl[33].val[1] = 1;1092state->Init_Ctrl[33].addr[2] = 168;1093state->Init_Ctrl[33].bit[2] = 2;1094state->Init_Ctrl[33].val[2] = 0;1095state->Init_Ctrl[33].addr[3] = 168;1096state->Init_Ctrl[33].bit[3] = 3;1097state->Init_Ctrl[33].val[3] = 0;10981099state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ;1100state->Init_Ctrl[34].size = 4 ;1101state->Init_Ctrl[34].addr[0] = 168;1102state->Init_Ctrl[34].bit[0] = 4;1103state->Init_Ctrl[34].val[0] = 1;1104state->Init_Ctrl[34].addr[1] = 168;1105state->Init_Ctrl[34].bit[1] = 5;1106state->Init_Ctrl[34].val[1] = 1;1107state->Init_Ctrl[34].addr[2] = 168;1108state->Init_Ctrl[34].bit[2] = 6;1109state->Init_Ctrl[34].val[2] = 1;1110state->Init_Ctrl[34].addr[3] = 168;1111state->Init_Ctrl[34].bit[3] = 7;1112state->Init_Ctrl[34].val[3] = 1;11131114state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ;1115state->Init_Ctrl[35].size = 1 ;1116state->Init_Ctrl[35].addr[0] = 135;1117state->Init_Ctrl[35].bit[0] = 0;1118state->Init_Ctrl[35].val[0] = 0;11191120state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ;1121state->Init_Ctrl[36].size = 1 ;1122state->Init_Ctrl[36].addr[0] = 56;1123state->Init_Ctrl[36].bit[0] = 3;1124state->Init_Ctrl[36].val[0] = 0;11251126state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ;1127state->Init_Ctrl[37].size = 7 ;1128state->Init_Ctrl[37].addr[0] = 59;1129state->Init_Ctrl[37].bit[0] = 1;1130state->Init_Ctrl[37].val[0] = 0;1131state->Init_Ctrl[37].addr[1] = 59;1132state->Init_Ctrl[37].bit[1] = 2;1133state->Init_Ctrl[37].val[1] = 0;1134state->Init_Ctrl[37].addr[2] = 59;1135state->Init_Ctrl[37].bit[2] = 3;1136state->Init_Ctrl[37].val[2] = 0;1137state->Init_Ctrl[37].addr[3] = 59;1138state->Init_Ctrl[37].bit[3] = 4;1139state->Init_Ctrl[37].val[3] = 0;1140state->Init_Ctrl[37].addr[4] = 59;1141state->Init_Ctrl[37].bit[4] = 5;1142state->Init_Ctrl[37].val[4] = 0;1143state->Init_Ctrl[37].addr[5] = 59;1144state->Init_Ctrl[37].bit[5] = 6;1145state->Init_Ctrl[37].val[5] = 0;1146state->Init_Ctrl[37].addr[6] = 59;1147state->Init_Ctrl[37].bit[6] = 7;1148state->Init_Ctrl[37].val[6] = 0;11491150state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ;1151state->Init_Ctrl[38].size = 6 ;1152state->Init_Ctrl[38].addr[0] = 32;1153state->Init_Ctrl[38].bit[0] = 2;1154state->Init_Ctrl[38].val[0] = 0;1155state->Init_Ctrl[38].addr[1] = 32;1156state->Init_Ctrl[38].bit[1] = 3;1157state->Init_Ctrl[38].val[1] = 0;1158state->Init_Ctrl[38].addr[2] = 32;1159state->Init_Ctrl[38].bit[2] = 4;1160state->Init_Ctrl[38].val[2] = 0;1161state->Init_Ctrl[38].addr[3] = 32;1162state->Init_Ctrl[38].bit[3] = 5;1163state->Init_Ctrl[38].val[3] = 0;1164state->Init_Ctrl[38].addr[4] = 32;1165state->Init_Ctrl[38].bit[4] = 6;1166state->Init_Ctrl[38].val[4] = 1;1167state->Init_Ctrl[38].addr[5] = 32;1168state->Init_Ctrl[38].bit[5] = 7;1169state->Init_Ctrl[38].val[5] = 0;11701171state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ;1172state->Init_Ctrl[39].size = 1 ;1173state->Init_Ctrl[39].addr[0] = 25;1174state->Init_Ctrl[39].bit[0] = 3;1175state->Init_Ctrl[39].val[0] = 1;117611771178state->CH_Ctrl_Num = CHCTRL_NUM ;11791180state->CH_Ctrl[0].Ctrl_Num = DN_POLY ;1181state->CH_Ctrl[0].size = 2 ;1182state->CH_Ctrl[0].addr[0] = 68;1183state->CH_Ctrl[0].bit[0] = 6;1184state->CH_Ctrl[0].val[0] = 1;1185state->CH_Ctrl[0].addr[1] = 68;1186state->CH_Ctrl[0].bit[1] = 7;1187state->CH_Ctrl[0].val[1] = 1;11881189state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ;1190state->CH_Ctrl[1].size = 2 ;1191state->CH_Ctrl[1].addr[0] = 70;1192state->CH_Ctrl[1].bit[0] = 6;1193state->CH_Ctrl[1].val[0] = 1;1194state->CH_Ctrl[1].addr[1] = 70;1195state->CH_Ctrl[1].bit[1] = 7;1196state->CH_Ctrl[1].val[1] = 0;11971198state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ;1199state->CH_Ctrl[2].size = 9 ;1200state->CH_Ctrl[2].addr[0] = 69;1201state->CH_Ctrl[2].bit[0] = 5;1202state->CH_Ctrl[2].val[0] = 0;1203state->CH_Ctrl[2].addr[1] = 69;1204state->CH_Ctrl[2].bit[1] = 6;1205state->CH_Ctrl[2].val[1] = 0;1206state->CH_Ctrl[2].addr[2] = 69;1207state->CH_Ctrl[2].bit[2] = 7;1208state->CH_Ctrl[2].val[2] = 0;1209state->CH_Ctrl[2].addr[3] = 68;1210state->CH_Ctrl[2].bit[3] = 0;1211state->CH_Ctrl[2].val[3] = 0;1212state->CH_Ctrl[2].addr[4] = 68;1213state->CH_Ctrl[2].bit[4] = 1;1214state->CH_Ctrl[2].val[4] = 0;1215state->CH_Ctrl[2].addr[5] = 68;1216state->CH_Ctrl[2].bit[5] = 2;1217state->CH_Ctrl[2].val[5] = 0;1218state->CH_Ctrl[2].addr[6] = 68;1219state->CH_Ctrl[2].bit[6] = 3;1220state->CH_Ctrl[2].val[6] = 0;1221state->CH_Ctrl[2].addr[7] = 68;1222state->CH_Ctrl[2].bit[7] = 4;1223state->CH_Ctrl[2].val[7] = 0;1224state->CH_Ctrl[2].addr[8] = 68;1225state->CH_Ctrl[2].bit[8] = 5;1226state->CH_Ctrl[2].val[8] = 0;12271228state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ;1229state->CH_Ctrl[3].size = 1 ;1230state->CH_Ctrl[3].addr[0] = 70;1231state->CH_Ctrl[3].bit[0] = 5;1232state->CH_Ctrl[3].val[0] = 0;12331234state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ;1235state->CH_Ctrl[4].size = 3 ;1236state->CH_Ctrl[4].addr[0] = 73;1237state->CH_Ctrl[4].bit[0] = 4;1238state->CH_Ctrl[4].val[0] = 0;1239state->CH_Ctrl[4].addr[1] = 73;1240state->CH_Ctrl[4].bit[1] = 5;1241state->CH_Ctrl[4].val[1] = 1;1242state->CH_Ctrl[4].addr[2] = 73;1243state->CH_Ctrl[4].bit[2] = 6;1244state->CH_Ctrl[4].val[2] = 0;12451246state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ;1247state->CH_Ctrl[5].size = 4 ;1248state->CH_Ctrl[5].addr[0] = 70;1249state->CH_Ctrl[5].bit[0] = 0;1250state->CH_Ctrl[5].val[0] = 0;1251state->CH_Ctrl[5].addr[1] = 70;1252state->CH_Ctrl[5].bit[1] = 1;1253state->CH_Ctrl[5].val[1] = 0;1254state->CH_Ctrl[5].addr[2] = 70;1255state->CH_Ctrl[5].bit[2] = 2;1256state->CH_Ctrl[5].val[2] = 0;1257state->CH_Ctrl[5].addr[3] = 70;1258state->CH_Ctrl[5].bit[3] = 3;1259state->CH_Ctrl[5].val[3] = 0;12601261state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ;1262state->CH_Ctrl[6].size = 1 ;1263state->CH_Ctrl[6].addr[0] = 70;1264state->CH_Ctrl[6].bit[0] = 4;1265state->CH_Ctrl[6].val[0] = 1;12661267state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ;1268state->CH_Ctrl[7].size = 1 ;1269state->CH_Ctrl[7].addr[0] = 111;1270state->CH_Ctrl[7].bit[0] = 4;1271state->CH_Ctrl[7].val[0] = 0;12721273state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ;1274state->CH_Ctrl[8].size = 1 ;1275state->CH_Ctrl[8].addr[0] = 111;1276state->CH_Ctrl[8].bit[0] = 7;1277state->CH_Ctrl[8].val[0] = 1;12781279state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ;1280state->CH_Ctrl[9].size = 1 ;1281state->CH_Ctrl[9].addr[0] = 111;1282state->CH_Ctrl[9].bit[0] = 6;1283state->CH_Ctrl[9].val[0] = 1;12841285state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ;1286state->CH_Ctrl[10].size = 1 ;1287state->CH_Ctrl[10].addr[0] = 111;1288state->CH_Ctrl[10].bit[0] = 5;1289state->CH_Ctrl[10].val[0] = 0;12901291state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ;1292state->CH_Ctrl[11].size = 2 ;1293state->CH_Ctrl[11].addr[0] = 110;1294state->CH_Ctrl[11].bit[0] = 0;1295state->CH_Ctrl[11].val[0] = 1;1296state->CH_Ctrl[11].addr[1] = 110;1297state->CH_Ctrl[11].bit[1] = 1;1298state->CH_Ctrl[11].val[1] = 0;12991300state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ;1301state->CH_Ctrl[12].size = 3 ;1302state->CH_Ctrl[12].addr[0] = 69;1303state->CH_Ctrl[12].bit[0] = 2;1304state->CH_Ctrl[12].val[0] = 0;1305state->CH_Ctrl[12].addr[1] = 69;1306state->CH_Ctrl[12].bit[1] = 3;1307state->CH_Ctrl[12].val[1] = 0;1308state->CH_Ctrl[12].addr[2] = 69;1309state->CH_Ctrl[12].bit[2] = 4;1310state->CH_Ctrl[12].val[2] = 0;13111312state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ;1313state->CH_Ctrl[13].size = 6 ;1314state->CH_Ctrl[13].addr[0] = 110;1315state->CH_Ctrl[13].bit[0] = 2;1316state->CH_Ctrl[13].val[0] = 0;1317state->CH_Ctrl[13].addr[1] = 110;1318state->CH_Ctrl[13].bit[1] = 3;1319state->CH_Ctrl[13].val[1] = 0;1320state->CH_Ctrl[13].addr[2] = 110;1321state->CH_Ctrl[13].bit[2] = 4;1322state->CH_Ctrl[13].val[2] = 0;1323state->CH_Ctrl[13].addr[3] = 110;1324state->CH_Ctrl[13].bit[3] = 5;1325state->CH_Ctrl[13].val[3] = 0;1326state->CH_Ctrl[13].addr[4] = 110;1327state->CH_Ctrl[13].bit[4] = 6;1328state->CH_Ctrl[13].val[4] = 0;1329state->CH_Ctrl[13].addr[5] = 110;1330state->CH_Ctrl[13].bit[5] = 7;1331state->CH_Ctrl[13].val[5] = 1;13321333state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ;1334state->CH_Ctrl[14].size = 7 ;1335state->CH_Ctrl[14].addr[0] = 14;1336state->CH_Ctrl[14].bit[0] = 0;1337state->CH_Ctrl[14].val[0] = 0;1338state->CH_Ctrl[14].addr[1] = 14;1339state->CH_Ctrl[14].bit[1] = 1;1340state->CH_Ctrl[14].val[1] = 0;1341state->CH_Ctrl[14].addr[2] = 14;1342state->CH_Ctrl[14].bit[2] = 2;1343state->CH_Ctrl[14].val[2] = 0;1344state->CH_Ctrl[14].addr[3] = 14;1345state->CH_Ctrl[14].bit[3] = 3;1346state->CH_Ctrl[14].val[3] = 0;1347state->CH_Ctrl[14].addr[4] = 14;1348state->CH_Ctrl[14].bit[4] = 4;1349state->CH_Ctrl[14].val[4] = 0;1350state->CH_Ctrl[14].addr[5] = 14;1351state->CH_Ctrl[14].bit[5] = 5;1352state->CH_Ctrl[14].val[5] = 0;1353state->CH_Ctrl[14].addr[6] = 14;1354state->CH_Ctrl[14].bit[6] = 6;1355state->CH_Ctrl[14].val[6] = 0;13561357state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ;1358state->CH_Ctrl[15].size = 18 ;1359state->CH_Ctrl[15].addr[0] = 17;1360state->CH_Ctrl[15].bit[0] = 6;1361state->CH_Ctrl[15].val[0] = 0;1362state->CH_Ctrl[15].addr[1] = 17;1363state->CH_Ctrl[15].bit[1] = 7;1364state->CH_Ctrl[15].val[1] = 0;1365state->CH_Ctrl[15].addr[2] = 16;1366state->CH_Ctrl[15].bit[2] = 0;1367state->CH_Ctrl[15].val[2] = 0;1368state->CH_Ctrl[15].addr[3] = 16;1369state->CH_Ctrl[15].bit[3] = 1;1370state->CH_Ctrl[15].val[3] = 0;1371state->CH_Ctrl[15].addr[4] = 16;1372state->CH_Ctrl[15].bit[4] = 2;1373state->CH_Ctrl[15].val[4] = 0;1374state->CH_Ctrl[15].addr[5] = 16;1375state->CH_Ctrl[15].bit[5] = 3;1376state->CH_Ctrl[15].val[5] = 0;1377state->CH_Ctrl[15].addr[6] = 16;1378state->CH_Ctrl[15].bit[6] = 4;1379state->CH_Ctrl[15].val[6] = 0;1380state->CH_Ctrl[15].addr[7] = 16;1381state->CH_Ctrl[15].bit[7] = 5;1382state->CH_Ctrl[15].val[7] = 0;1383state->CH_Ctrl[15].addr[8] = 16;1384state->CH_Ctrl[15].bit[8] = 6;1385state->CH_Ctrl[15].val[8] = 0;1386state->CH_Ctrl[15].addr[9] = 16;1387state->CH_Ctrl[15].bit[9] = 7;1388state->CH_Ctrl[15].val[9] = 0;1389state->CH_Ctrl[15].addr[10] = 15;1390state->CH_Ctrl[15].bit[10] = 0;1391state->CH_Ctrl[15].val[10] = 0;1392state->CH_Ctrl[15].addr[11] = 15;1393state->CH_Ctrl[15].bit[11] = 1;1394state->CH_Ctrl[15].val[11] = 0;1395state->CH_Ctrl[15].addr[12] = 15;1396state->CH_Ctrl[15].bit[12] = 2;1397state->CH_Ctrl[15].val[12] = 0;1398state->CH_Ctrl[15].addr[13] = 15;1399state->CH_Ctrl[15].bit[13] = 3;1400state->CH_Ctrl[15].val[13] = 0;1401state->CH_Ctrl[15].addr[14] = 15;1402state->CH_Ctrl[15].bit[14] = 4;1403state->CH_Ctrl[15].val[14] = 0;1404state->CH_Ctrl[15].addr[15] = 15;1405state->CH_Ctrl[15].bit[15] = 5;1406state->CH_Ctrl[15].val[15] = 0;1407state->CH_Ctrl[15].addr[16] = 15;1408state->CH_Ctrl[15].bit[16] = 6;1409state->CH_Ctrl[15].val[16] = 1;1410state->CH_Ctrl[15].addr[17] = 15;1411state->CH_Ctrl[15].bit[17] = 7;1412state->CH_Ctrl[15].val[17] = 1;14131414state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ;1415state->CH_Ctrl[16].size = 5 ;1416state->CH_Ctrl[16].addr[0] = 112;1417state->CH_Ctrl[16].bit[0] = 0;1418state->CH_Ctrl[16].val[0] = 0;1419state->CH_Ctrl[16].addr[1] = 112;1420state->CH_Ctrl[16].bit[1] = 1;1421state->CH_Ctrl[16].val[1] = 0;1422state->CH_Ctrl[16].addr[2] = 112;1423state->CH_Ctrl[16].bit[2] = 2;1424state->CH_Ctrl[16].val[2] = 0;1425state->CH_Ctrl[16].addr[3] = 112;1426state->CH_Ctrl[16].bit[3] = 3;1427state->CH_Ctrl[16].val[3] = 0;1428state->CH_Ctrl[16].addr[4] = 112;1429state->CH_Ctrl[16].bit[4] = 4;1430state->CH_Ctrl[16].val[4] = 1;14311432state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ;1433state->CH_Ctrl[17].size = 1 ;1434state->CH_Ctrl[17].addr[0] = 14;1435state->CH_Ctrl[17].bit[0] = 7;1436state->CH_Ctrl[17].val[0] = 0;14371438state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ;1439state->CH_Ctrl[18].size = 4 ;1440state->CH_Ctrl[18].addr[0] = 107;1441state->CH_Ctrl[18].bit[0] = 3;1442state->CH_Ctrl[18].val[0] = 0;1443state->CH_Ctrl[18].addr[1] = 107;1444state->CH_Ctrl[18].bit[1] = 4;1445state->CH_Ctrl[18].val[1] = 0;1446state->CH_Ctrl[18].addr[2] = 107;1447state->CH_Ctrl[18].bit[2] = 5;1448state->CH_Ctrl[18].val[2] = 0;1449state->CH_Ctrl[18].addr[3] = 107;1450state->CH_Ctrl[18].bit[3] = 6;1451state->CH_Ctrl[18].val[3] = 0;14521453state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ;1454state->CH_Ctrl[19].size = 3 ;1455state->CH_Ctrl[19].addr[0] = 107;1456state->CH_Ctrl[19].bit[0] = 7;1457state->CH_Ctrl[19].val[0] = 1;1458state->CH_Ctrl[19].addr[1] = 106;1459state->CH_Ctrl[19].bit[1] = 0;1460state->CH_Ctrl[19].val[1] = 1;1461state->CH_Ctrl[19].addr[2] = 106;1462state->CH_Ctrl[19].bit[2] = 1;1463state->CH_Ctrl[19].val[2] = 1;14641465state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ;1466state->CH_Ctrl[20].size = 11 ;1467state->CH_Ctrl[20].addr[0] = 109;1468state->CH_Ctrl[20].bit[0] = 2;1469state->CH_Ctrl[20].val[0] = 0;1470state->CH_Ctrl[20].addr[1] = 109;1471state->CH_Ctrl[20].bit[1] = 3;1472state->CH_Ctrl[20].val[1] = 0;1473state->CH_Ctrl[20].addr[2] = 109;1474state->CH_Ctrl[20].bit[2] = 4;1475state->CH_Ctrl[20].val[2] = 0;1476state->CH_Ctrl[20].addr[3] = 109;1477state->CH_Ctrl[20].bit[3] = 5;1478state->CH_Ctrl[20].val[3] = 0;1479state->CH_Ctrl[20].addr[4] = 109;1480state->CH_Ctrl[20].bit[4] = 6;1481state->CH_Ctrl[20].val[4] = 0;1482state->CH_Ctrl[20].addr[5] = 109;1483state->CH_Ctrl[20].bit[5] = 7;1484state->CH_Ctrl[20].val[5] = 0;1485state->CH_Ctrl[20].addr[6] = 108;1486state->CH_Ctrl[20].bit[6] = 0;1487state->CH_Ctrl[20].val[6] = 0;1488state->CH_Ctrl[20].addr[7] = 108;1489state->CH_Ctrl[20].bit[7] = 1;1490state->CH_Ctrl[20].val[7] = 0;1491state->CH_Ctrl[20].addr[8] = 108;1492state->CH_Ctrl[20].bit[8] = 2;1493state->CH_Ctrl[20].val[8] = 1;1494state->CH_Ctrl[20].addr[9] = 108;1495state->CH_Ctrl[20].bit[9] = 3;1496state->CH_Ctrl[20].val[9] = 1;1497state->CH_Ctrl[20].addr[10] = 108;1498state->CH_Ctrl[20].bit[10] = 4;1499state->CH_Ctrl[20].val[10] = 1;15001501state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ;1502state->CH_Ctrl[21].size = 6 ;1503state->CH_Ctrl[21].addr[0] = 106;1504state->CH_Ctrl[21].bit[0] = 2;1505state->CH_Ctrl[21].val[0] = 0;1506state->CH_Ctrl[21].addr[1] = 106;1507state->CH_Ctrl[21].bit[1] = 3;1508state->CH_Ctrl[21].val[1] = 0;1509state->CH_Ctrl[21].addr[2] = 106;1510state->CH_Ctrl[21].bit[2] = 4;1511state->CH_Ctrl[21].val[2] = 0;1512state->CH_Ctrl[21].addr[3] = 106;1513state->CH_Ctrl[21].bit[3] = 5;1514state->CH_Ctrl[21].val[3] = 0;1515state->CH_Ctrl[21].addr[4] = 106;1516state->CH_Ctrl[21].bit[4] = 6;1517state->CH_Ctrl[21].val[4] = 0;1518state->CH_Ctrl[21].addr[5] = 106;1519state->CH_Ctrl[21].bit[5] = 7;1520state->CH_Ctrl[21].val[5] = 1;15211522state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ;1523state->CH_Ctrl[22].size = 1 ;1524state->CH_Ctrl[22].addr[0] = 138;1525state->CH_Ctrl[22].bit[0] = 4;1526state->CH_Ctrl[22].val[0] = 1;15271528state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ;1529state->CH_Ctrl[23].size = 1 ;1530state->CH_Ctrl[23].addr[0] = 17;1531state->CH_Ctrl[23].bit[0] = 5;1532state->CH_Ctrl[23].val[0] = 0;15331534state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ;1535state->CH_Ctrl[24].size = 1 ;1536state->CH_Ctrl[24].addr[0] = 111;1537state->CH_Ctrl[24].bit[0] = 3;1538state->CH_Ctrl[24].val[0] = 0;15391540state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ;1541state->CH_Ctrl[25].size = 1 ;1542state->CH_Ctrl[25].addr[0] = 112;1543state->CH_Ctrl[25].bit[0] = 7;1544state->CH_Ctrl[25].val[0] = 0;15451546state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ;1547state->CH_Ctrl[26].size = 1 ;1548state->CH_Ctrl[26].addr[0] = 136;1549state->CH_Ctrl[26].bit[0] = 7;1550state->CH_Ctrl[26].val[0] = 0;15511552state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ;1553state->CH_Ctrl[27].size = 1 ;1554state->CH_Ctrl[27].addr[0] = 149;1555state->CH_Ctrl[27].bit[0] = 7;1556state->CH_Ctrl[27].val[0] = 0;15571558state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ;1559state->CH_Ctrl[28].size = 1 ;1560state->CH_Ctrl[28].addr[0] = 149;1561state->CH_Ctrl[28].bit[0] = 6;1562state->CH_Ctrl[28].val[0] = 0;15631564state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ;1565state->CH_Ctrl[29].size = 1 ;1566state->CH_Ctrl[29].addr[0] = 149;1567state->CH_Ctrl[29].bit[0] = 5;1568state->CH_Ctrl[29].val[0] = 1;15691570state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ;1571state->CH_Ctrl[30].size = 1 ;1572state->CH_Ctrl[30].addr[0] = 149;1573state->CH_Ctrl[30].bit[0] = 4;1574state->CH_Ctrl[30].val[0] = 1;15751576state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ;1577state->CH_Ctrl[31].size = 1 ;1578state->CH_Ctrl[31].addr[0] = 149;1579state->CH_Ctrl[31].bit[0] = 3;1580state->CH_Ctrl[31].val[0] = 0;15811582state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ;1583state->CH_Ctrl[32].size = 1 ;1584state->CH_Ctrl[32].addr[0] = 93;1585state->CH_Ctrl[32].bit[0] = 1;1586state->CH_Ctrl[32].val[0] = 0;15871588state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ;1589state->CH_Ctrl[33].size = 1 ;1590state->CH_Ctrl[33].addr[0] = 93;1591state->CH_Ctrl[33].bit[0] = 0;1592state->CH_Ctrl[33].val[0] = 0;15931594state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ;1595state->CH_Ctrl[34].size = 6 ;1596state->CH_Ctrl[34].addr[0] = 92;1597state->CH_Ctrl[34].bit[0] = 2;1598state->CH_Ctrl[34].val[0] = 0;1599state->CH_Ctrl[34].addr[1] = 92;1600state->CH_Ctrl[34].bit[1] = 3;1601state->CH_Ctrl[34].val[1] = 0;1602state->CH_Ctrl[34].addr[2] = 92;1603state->CH_Ctrl[34].bit[2] = 4;1604state->CH_Ctrl[34].val[2] = 0;1605state->CH_Ctrl[34].addr[3] = 92;1606state->CH_Ctrl[34].bit[3] = 5;1607state->CH_Ctrl[34].val[3] = 0;1608state->CH_Ctrl[34].addr[4] = 92;1609state->CH_Ctrl[34].bit[4] = 6;1610state->CH_Ctrl[34].val[4] = 0;1611state->CH_Ctrl[34].addr[5] = 92;1612state->CH_Ctrl[34].bit[5] = 7;1613state->CH_Ctrl[34].val[5] = 0;16141615state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ;1616state->CH_Ctrl[35].size = 6 ;1617state->CH_Ctrl[35].addr[0] = 93;1618state->CH_Ctrl[35].bit[0] = 2;1619state->CH_Ctrl[35].val[0] = 0;1620state->CH_Ctrl[35].addr[1] = 93;1621state->CH_Ctrl[35].bit[1] = 3;1622state->CH_Ctrl[35].val[1] = 0;1623state->CH_Ctrl[35].addr[2] = 93;1624state->CH_Ctrl[35].bit[2] = 4;1625state->CH_Ctrl[35].val[2] = 0;1626state->CH_Ctrl[35].addr[3] = 93;1627state->CH_Ctrl[35].bit[3] = 5;1628state->CH_Ctrl[35].val[3] = 0;1629state->CH_Ctrl[35].addr[4] = 93;1630state->CH_Ctrl[35].bit[4] = 6;1631state->CH_Ctrl[35].val[4] = 0;1632state->CH_Ctrl[35].addr[5] = 93;1633state->CH_Ctrl[35].bit[5] = 7;1634state->CH_Ctrl[35].val[5] = 0;16351636#ifdef _MXL_PRODUCTION1637state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ;1638state->CH_Ctrl[36].size = 1 ;1639state->CH_Ctrl[36].addr[0] = 109;1640state->CH_Ctrl[36].bit[0] = 1;1641state->CH_Ctrl[36].val[0] = 1;16421643state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ;1644state->CH_Ctrl[37].size = 2 ;1645state->CH_Ctrl[37].addr[0] = 112;1646state->CH_Ctrl[37].bit[0] = 5;1647state->CH_Ctrl[37].val[0] = 0;1648state->CH_Ctrl[37].addr[1] = 112;1649state->CH_Ctrl[37].bit[1] = 6;1650state->CH_Ctrl[37].val[1] = 0;16511652state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ;1653state->CH_Ctrl[38].size = 1 ;1654state->CH_Ctrl[38].addr[0] = 65;1655state->CH_Ctrl[38].bit[0] = 1;1656state->CH_Ctrl[38].val[0] = 0;1657#endif16581659return 0 ;1660}16611662static void InitTunerControls(struct dvb_frontend *fe)1663{1664MXL5005_RegisterInit(fe);1665MXL5005_ControlInit(fe);1666#ifdef _MXL_INTERNAL1667MXL5005_MXLControlInit(fe);1668#endif1669}16701671static u16 MXL5005_TunerConfig(struct dvb_frontend *fe,1672u8 Mode, /* 0: Analog Mode ; 1: Digital Mode */1673u8 IF_mode, /* for Analog Mode, 0: zero IF; 1: low IF */1674u32 Bandwidth, /* filter channel bandwidth (6, 7, 8) */1675u32 IF_out, /* Desired IF Out Frequency */1676u32 Fxtal, /* XTAL Frequency */1677u8 AGC_Mode, /* AGC Mode - Dual AGC: 0, Single AGC: 1 */1678u16 TOP, /* 0: Dual AGC; Value: take over point */1679u16 IF_OUT_LOAD, /* IF Out Load Resistor (200 / 300 Ohms) */1680u8 CLOCK_OUT, /* 0: turn off clk out; 1: turn on clock out */1681u8 DIV_OUT, /* 0: Div-1; 1: Div-4 */1682u8 CAPSELECT, /* 0: disable On-Chip pulling cap; 1: enable */1683u8 EN_RSSI, /* 0: disable RSSI; 1: enable RSSI */16841685/* Modulation Type; */1686/* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */1687u8 Mod_Type,16881689/* Tracking Filter */1690/* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */1691u8 TF_Type1692)1693{1694struct mxl5005s_state *state = fe->tuner_priv;1695u16 status = 0;16961697state->Mode = Mode;1698state->IF_Mode = IF_mode;1699state->Chan_Bandwidth = Bandwidth;1700state->IF_OUT = IF_out;1701state->Fxtal = Fxtal;1702state->AGC_Mode = AGC_Mode;1703state->TOP = TOP;1704state->IF_OUT_LOAD = IF_OUT_LOAD;1705state->CLOCK_OUT = CLOCK_OUT;1706state->DIV_OUT = DIV_OUT;1707state->CAPSELECT = CAPSELECT;1708state->EN_RSSI = EN_RSSI;1709state->Mod_Type = Mod_Type;1710state->TF_Type = TF_Type;17111712/* Initialize all the controls and registers */1713InitTunerControls(fe);17141715/* Synthesizer LO frequency calculation */1716MXL_SynthIFLO_Calc(fe);17171718return status;1719}17201721static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe)1722{1723struct mxl5005s_state *state = fe->tuner_priv;1724if (state->Mode == 1) /* Digital Mode */1725state->IF_LO = state->IF_OUT;1726else /* Analog Mode */ {1727if (state->IF_Mode == 0) /* Analog Zero IF mode */1728state->IF_LO = state->IF_OUT + 400000;1729else /* Analog Low IF mode */1730state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2;1731}1732}17331734static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe)1735{1736struct mxl5005s_state *state = fe->tuner_priv;17371738if (state->Mode == 1) /* Digital Mode */ {1739/* remove 20.48MHz setting for 2.6.10 */1740state->RF_LO = state->RF_IN;1741/* change for 2.6.6 */1742state->TG_LO = state->RF_IN - 750000;1743} else /* Analog Mode */ {1744if (state->IF_Mode == 0) /* Analog Zero IF mode */ {1745state->RF_LO = state->RF_IN - 400000;1746state->TG_LO = state->RF_IN - 1750000;1747} else /* Analog Low IF mode */ {1748state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2;1749state->TG_LO = state->RF_IN -1750state->Chan_Bandwidth + 500000;1751}1752}1753}17541755static u16 MXL_OverwriteICDefault(struct dvb_frontend *fe)1756{1757u16 status = 0;17581759status += MXL_ControlWrite(fe, OVERRIDE_1, 1);1760status += MXL_ControlWrite(fe, OVERRIDE_2, 1);1761status += MXL_ControlWrite(fe, OVERRIDE_3, 1);1762status += MXL_ControlWrite(fe, OVERRIDE_4, 1);17631764return status;1765}17661767static u16 MXL_BlockInit(struct dvb_frontend *fe)1768{1769struct mxl5005s_state *state = fe->tuner_priv;1770u16 status = 0;17711772status += MXL_OverwriteICDefault(fe);17731774/* Downconverter Control Dig Ana */1775status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0);17761777/* Filter Control Dig Ana */1778status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1);1779status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2);1780status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0);1781status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1);1782status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0);17831784/* Initialize Low-Pass Filter */1785if (state->Mode) { /* Digital Mode */1786switch (state->Chan_Bandwidth) {1787case 8000000:1788status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0);1789break;1790case 7000000:1791status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2);1792break;1793case 6000000:1794status += MXL_ControlWrite(fe,1795BB_DLPF_BANDSEL, 3);1796break;1797}1798} else { /* Analog Mode */1799switch (state->Chan_Bandwidth) {1800case 8000000: /* Low Zero */1801status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,1802(state->IF_Mode ? 0 : 3));1803break;1804case 7000000:1805status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,1806(state->IF_Mode ? 1 : 4));1807break;1808case 6000000:1809status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,1810(state->IF_Mode ? 2 : 5));1811break;1812}1813}18141815/* Charge Pump Control Dig Ana */1816status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8);1817status += MXL_ControlWrite(fe,1818RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1);1819status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0);18201821/* AGC TOP Control */1822if (state->AGC_Mode == 0) /* Dual AGC */ {1823status += MXL_ControlWrite(fe, AGC_IF, 15);1824status += MXL_ControlWrite(fe, AGC_RF, 15);1825} else /* Single AGC Mode Dig Ana */1826status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12);18271828if (state->TOP == 55) /* TOP == 5.5 */1829status += MXL_ControlWrite(fe, AGC_IF, 0x0);18301831if (state->TOP == 72) /* TOP == 7.2 */1832status += MXL_ControlWrite(fe, AGC_IF, 0x1);18331834if (state->TOP == 92) /* TOP == 9.2 */1835status += MXL_ControlWrite(fe, AGC_IF, 0x2);18361837if (state->TOP == 110) /* TOP == 11.0 */1838status += MXL_ControlWrite(fe, AGC_IF, 0x3);18391840if (state->TOP == 129) /* TOP == 12.9 */1841status += MXL_ControlWrite(fe, AGC_IF, 0x4);18421843if (state->TOP == 147) /* TOP == 14.7 */1844status += MXL_ControlWrite(fe, AGC_IF, 0x5);18451846if (state->TOP == 168) /* TOP == 16.8 */1847status += MXL_ControlWrite(fe, AGC_IF, 0x6);18481849if (state->TOP == 194) /* TOP == 19.4 */1850status += MXL_ControlWrite(fe, AGC_IF, 0x7);18511852if (state->TOP == 212) /* TOP == 21.2 */1853status += MXL_ControlWrite(fe, AGC_IF, 0x9);18541855if (state->TOP == 232) /* TOP == 23.2 */1856status += MXL_ControlWrite(fe, AGC_IF, 0xA);18571858if (state->TOP == 252) /* TOP == 25.2 */1859status += MXL_ControlWrite(fe, AGC_IF, 0xB);18601861if (state->TOP == 271) /* TOP == 27.1 */1862status += MXL_ControlWrite(fe, AGC_IF, 0xC);18631864if (state->TOP == 292) /* TOP == 29.2 */1865status += MXL_ControlWrite(fe, AGC_IF, 0xD);18661867if (state->TOP == 317) /* TOP == 31.7 */1868status += MXL_ControlWrite(fe, AGC_IF, 0xE);18691870if (state->TOP == 349) /* TOP == 34.9 */1871status += MXL_ControlWrite(fe, AGC_IF, 0xF);18721873/* IF Synthesizer Control */1874status += MXL_IFSynthInit(fe);18751876/* IF UpConverter Control */1877if (state->IF_OUT_LOAD == 200) {1878status += MXL_ControlWrite(fe, DRV_RES_SEL, 6);1879status += MXL_ControlWrite(fe, I_DRIVER, 2);1880}1881if (state->IF_OUT_LOAD == 300) {1882status += MXL_ControlWrite(fe, DRV_RES_SEL, 4);1883status += MXL_ControlWrite(fe, I_DRIVER, 1);1884}18851886/* Anti-Alias Filtering Control1887* initialise Anti-Aliasing Filter1888*/1889if (state->Mode) { /* Digital Mode */1890if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) {1891status += MXL_ControlWrite(fe, EN_AAF, 1);1892status += MXL_ControlWrite(fe, EN_3P, 1);1893status += MXL_ControlWrite(fe, EN_AUX_3P, 1);1894status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);1895}1896if ((state->IF_OUT == 36125000UL) ||1897(state->IF_OUT == 36150000UL)) {1898status += MXL_ControlWrite(fe, EN_AAF, 1);1899status += MXL_ControlWrite(fe, EN_3P, 1);1900status += MXL_ControlWrite(fe, EN_AUX_3P, 1);1901status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);1902}1903if (state->IF_OUT > 36150000UL) {1904status += MXL_ControlWrite(fe, EN_AAF, 0);1905status += MXL_ControlWrite(fe, EN_3P, 1);1906status += MXL_ControlWrite(fe, EN_AUX_3P, 1);1907status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);1908}1909} else { /* Analog Mode */1910if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL) {1911status += MXL_ControlWrite(fe, EN_AAF, 1);1912status += MXL_ControlWrite(fe, EN_3P, 1);1913status += MXL_ControlWrite(fe, EN_AUX_3P, 1);1914status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);1915}1916if (state->IF_OUT > 5000000UL) {1917status += MXL_ControlWrite(fe, EN_AAF, 0);1918status += MXL_ControlWrite(fe, EN_3P, 0);1919status += MXL_ControlWrite(fe, EN_AUX_3P, 0);1920status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);1921}1922}19231924/* Demod Clock Out */1925if (state->CLOCK_OUT)1926status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1);1927else1928status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0);19291930if (state->DIV_OUT == 1)1931status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1);1932if (state->DIV_OUT == 0)1933status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0);19341935/* Crystal Control */1936if (state->CAPSELECT)1937status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1);1938else1939status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0);19401941if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)1942status += MXL_ControlWrite(fe, IF_SEL_DBL, 1);1943if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)1944status += MXL_ControlWrite(fe, IF_SEL_DBL, 0);19451946if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)1947status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3);1948if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL)1949status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0);19501951/* Misc Controls */1952if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */1953status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0);1954else1955status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1);19561957/* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */19581959/* Set TG_R_DIV */1960status += MXL_ControlWrite(fe, TG_R_DIV,1961MXL_Ceiling(state->Fxtal, 1000000));19621963/* Apply Default value to BB_INITSTATE_DLPF_TUNE */19641965/* RSSI Control */1966if (state->EN_RSSI) {1967status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);1968status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);1969status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);1970status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);19711972/* RSSI reference point */1973status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);1974status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3);1975status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);19761977/* TOP point */1978status += MXL_ControlWrite(fe, RFA_FLR, 0);1979status += MXL_ControlWrite(fe, RFA_CEIL, 12);1980}19811982/* Modulation type bit settings1983* Override the control values preset1984*/1985if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */ {1986state->AGC_Mode = 1; /* Single AGC Mode */19871988/* Enable RSSI */1989status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);1990status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);1991status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);1992status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);19931994/* RSSI reference point */1995status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);1996status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);1997status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);19981999/* TOP point */2000status += MXL_ControlWrite(fe, RFA_FLR, 2);2001status += MXL_ControlWrite(fe, RFA_CEIL, 13);2002if (state->IF_OUT <= 6280000UL) /* Low IF */2003status += MXL_ControlWrite(fe, BB_IQSWAP, 0);2004else /* High IF */2005status += MXL_ControlWrite(fe, BB_IQSWAP, 1);20062007}2008if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */ {2009state->AGC_Mode = 1; /* Single AGC Mode */20102011/* Enable RSSI */2012status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);2013status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);2014status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);2015status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);20162017/* RSSI reference point */2018status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);2019status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4);2020status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);20212022/* TOP point */2023status += MXL_ControlWrite(fe, RFA_FLR, 2);2024status += MXL_ControlWrite(fe, RFA_CEIL, 13);2025status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1);2026/* Low Zero */2027status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);20282029if (state->IF_OUT <= 6280000UL) /* Low IF */2030status += MXL_ControlWrite(fe, BB_IQSWAP, 0);2031else /* High IF */2032status += MXL_ControlWrite(fe, BB_IQSWAP, 1);2033}2034if (state->Mod_Type == MXL_QAM) /* QAM Mode */ {2035state->Mode = MXL_DIGITAL_MODE;20362037/* state->AGC_Mode = 1; */ /* Single AGC Mode */20382039/* Disable RSSI */ /* change here for v2.6.5 */2040status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);2041status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);2042status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);2043status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);20442045/* RSSI reference point */2046status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);2047status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);2048status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);2049/* change here for v2.6.5 */2050status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);20512052if (state->IF_OUT <= 6280000UL) /* Low IF */2053status += MXL_ControlWrite(fe, BB_IQSWAP, 0);2054else /* High IF */2055status += MXL_ControlWrite(fe, BB_IQSWAP, 1);2056status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);20572058}2059if (state->Mod_Type == MXL_ANALOG_CABLE) {2060/* Analog Cable Mode */2061/* state->Mode = MXL_DIGITAL_MODE; */20622063state->AGC_Mode = 1; /* Single AGC Mode */20642065/* Disable RSSI */2066status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);2067status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);2068status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);2069status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);2070/* change for 2.6.3 */2071status += MXL_ControlWrite(fe, AGC_IF, 1);2072status += MXL_ControlWrite(fe, AGC_RF, 15);2073status += MXL_ControlWrite(fe, BB_IQSWAP, 1);2074}20752076if (state->Mod_Type == MXL_ANALOG_OTA) {2077/* Analog OTA Terrestrial mode add for 2.6.7 */2078/* state->Mode = MXL_ANALOG_MODE; */20792080/* Enable RSSI */2081status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);2082status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);2083status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);2084status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);20852086/* RSSI reference point */2087status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);2088status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);2089status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);2090status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);2091status += MXL_ControlWrite(fe, BB_IQSWAP, 1);2092}20932094/* RSSI disable */2095if (state->EN_RSSI == 0) {2096status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);2097status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);2098status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);2099status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);2100}21012102return status;2103}21042105static u16 MXL_IFSynthInit(struct dvb_frontend *fe)2106{2107struct mxl5005s_state *state = fe->tuner_priv;2108u16 status = 0 ;2109u32 Fref = 0 ;2110u32 Kdbl, intModVal ;2111u32 fracModVal ;2112Kdbl = 2 ;21132114if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)2115Kdbl = 2 ;2116if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)2117Kdbl = 1 ;21182119/* IF Synthesizer Control */2120if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF mode */ {2121if (state->IF_LO == 41000000UL) {2122status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2123status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);2124Fref = 328000000UL ;2125}2126if (state->IF_LO == 47000000UL) {2127status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2128status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2129Fref = 376000000UL ;2130}2131if (state->IF_LO == 54000000UL) {2132status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);2133status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);2134Fref = 324000000UL ;2135}2136if (state->IF_LO == 60000000UL) {2137status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);2138status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2139Fref = 360000000UL ;2140}2141if (state->IF_LO == 39250000UL) {2142status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2143status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);2144Fref = 314000000UL ;2145}2146if (state->IF_LO == 39650000UL) {2147status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2148status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);2149Fref = 317200000UL ;2150}2151if (state->IF_LO == 40150000UL) {2152status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2153status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);2154Fref = 321200000UL ;2155}2156if (state->IF_LO == 40650000UL) {2157status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2158status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);2159Fref = 325200000UL ;2160}2161}21622163if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0)) {2164if (state->IF_LO == 57000000UL) {2165status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);2166status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2167Fref = 342000000UL ;2168}2169if (state->IF_LO == 44000000UL) {2170status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2171status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2172Fref = 352000000UL ;2173}2174if (state->IF_LO == 43750000UL) {2175status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2176status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2177Fref = 350000000UL ;2178}2179if (state->IF_LO == 36650000UL) {2180status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);2181status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2182Fref = 366500000UL ;2183}2184if (state->IF_LO == 36150000UL) {2185status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);2186status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2187Fref = 361500000UL ;2188}2189if (state->IF_LO == 36000000UL) {2190status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);2191status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2192Fref = 360000000UL ;2193}2194if (state->IF_LO == 35250000UL) {2195status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);2196status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2197Fref = 352500000UL ;2198}2199if (state->IF_LO == 34750000UL) {2200status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);2201status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2202Fref = 347500000UL ;2203}2204if (state->IF_LO == 6280000UL) {2205status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);2206status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2207Fref = 376800000UL ;2208}2209if (state->IF_LO == 5000000UL) {2210status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);2211status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2212Fref = 360000000UL ;2213}2214if (state->IF_LO == 4500000UL) {2215status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);2216status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2217Fref = 360000000UL ;2218}2219if (state->IF_LO == 4570000UL) {2220status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);2221status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2222Fref = 365600000UL ;2223}2224if (state->IF_LO == 4000000UL) {2225status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05);2226status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2227Fref = 360000000UL ;2228}2229if (state->IF_LO == 57400000UL) {2230status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10);2231status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2232Fref = 344400000UL ;2233}2234if (state->IF_LO == 44400000UL) {2235status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2236status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2237Fref = 355200000UL ;2238}2239if (state->IF_LO == 44150000UL) {2240status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08);2241status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2242Fref = 353200000UL ;2243}2244if (state->IF_LO == 37050000UL) {2245status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);2246status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2247Fref = 370500000UL ;2248}2249if (state->IF_LO == 36550000UL) {2250status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);2251status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2252Fref = 365500000UL ;2253}2254if (state->IF_LO == 36125000UL) {2255status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04);2256status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2257Fref = 361250000UL ;2258}2259if (state->IF_LO == 6000000UL) {2260status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);2261status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2262Fref = 360000000UL ;2263}2264if (state->IF_LO == 5400000UL) {2265status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);2266status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);2267Fref = 324000000UL ;2268}2269if (state->IF_LO == 5380000UL) {2270status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07);2271status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C);2272Fref = 322800000UL ;2273}2274if (state->IF_LO == 5200000UL) {2275status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);2276status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2277Fref = 374400000UL ;2278}2279if (state->IF_LO == 4900000UL) {2280status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09);2281status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2282Fref = 352800000UL ;2283}2284if (state->IF_LO == 4400000UL) {2285status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06);2286status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2287Fref = 352000000UL ;2288}2289if (state->IF_LO == 4063000UL) /* add for 2.6.8 */ {2290status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05);2291status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08);2292Fref = 365670000UL ;2293}2294}2295/* CHCAL_INT_MOD_IF */2296/* CHCAL_FRAC_MOD_IF */2297intModVal = Fref / (state->Fxtal * Kdbl/2);2298status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal);22992300fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) *2301intModVal);23022303fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000);2304status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal);23052306return status ;2307}23082309static u32 MXL_GetXtalInt(u32 Xtal_Freq)2310{2311if ((Xtal_Freq % 1000000) == 0)2312return (Xtal_Freq / 10000);2313else2314return (((Xtal_Freq / 1000000) + 1)*100);2315}23162317static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)2318{2319struct mxl5005s_state *state = fe->tuner_priv;2320u16 status = 0;2321u32 divider_val, E3, E4, E5, E5A;2322u32 Fmax, Fmin, FmaxBin, FminBin;2323u32 Kdbl_RF = 2;2324u32 tg_divval;2325u32 tg_lo;2326u32 Xtal_Int;23272328u32 Fref_TG;2329u32 Fvco;23302331Xtal_Int = MXL_GetXtalInt(state->Fxtal);23322333state->RF_IN = RF_Freq;23342335MXL_SynthRFTGLO_Calc(fe);23362337if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)2338Kdbl_RF = 2;2339if (state->Fxtal > 22000000 && state->Fxtal <= 32000000)2340Kdbl_RF = 1;23412342/* Downconverter Controls2343* Look-Up Table Implementation for:2344* DN_POLY2345* DN_RFGAIN2346* DN_CAP_RFLPF2347* DN_EN_VHFUHFBAR2348* DN_GAIN_ADJUST2349* Change the boundary reference from RF_IN to RF_LO2350*/2351if (state->RF_LO < 40000000UL)2352return -1;23532354if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {2355status += MXL_ControlWrite(fe, DN_POLY, 2);2356status += MXL_ControlWrite(fe, DN_RFGAIN, 3);2357status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 423);2358status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);2359status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);2360}2361if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {2362status += MXL_ControlWrite(fe, DN_POLY, 3);2363status += MXL_ControlWrite(fe, DN_RFGAIN, 3);2364status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 222);2365status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);2366status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);2367}2368if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {2369status += MXL_ControlWrite(fe, DN_POLY, 3);2370status += MXL_ControlWrite(fe, DN_RFGAIN, 3);2371status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 147);2372status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);2373status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);2374}2375if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {2376status += MXL_ControlWrite(fe, DN_POLY, 3);2377status += MXL_ControlWrite(fe, DN_RFGAIN, 3);2378status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 9);2379status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);2380status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);2381}2382if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {2383status += MXL_ControlWrite(fe, DN_POLY, 3);2384status += MXL_ControlWrite(fe, DN_RFGAIN, 3);2385status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);2386status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);2387status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);2388}2389if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) {2390status += MXL_ControlWrite(fe, DN_POLY, 3);2391status += MXL_ControlWrite(fe, DN_RFGAIN, 1);2392status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);2393status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0);2394status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);2395}2396if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) {2397status += MXL_ControlWrite(fe, DN_POLY, 3);2398status += MXL_ControlWrite(fe, DN_RFGAIN, 2);2399status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0);2400status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0);2401status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3);2402}2403if (state->RF_LO > 900000000UL)2404return -1;24052406/* DN_IQTNBUF_AMP */2407/* DN_IQTNGNBFBIAS_BST */2408if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {2409status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2410status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2411}2412if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {2413status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2414status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2415}2416if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {2417status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2418status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2419}2420if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {2421status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2422status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2423}2424if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {2425status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2426status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2427}2428if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) {2429status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2430status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2431}2432if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) {2433status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2434status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2435}2436if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) {2437status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2438status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2439}2440if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) {2441status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2442status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2443}2444if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) {2445status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2446status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2447}2448if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) {2449status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2450status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2451}2452if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) {2453status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2454status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2455}2456if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) {2457status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2458status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2459}2460if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) {2461status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);2462status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);2463}2464if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) {2465status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);2466status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);2467}2468if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) {2469status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);2470status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);2471}24722473/*2474* Set RF Synth and LO Path Control2475*2476* Look-Up table implementation for:2477* RFSYN_EN_OUTMUX2478* RFSYN_SEL_VCO_OUT2479* RFSYN_SEL_VCO_HI2480* RFSYN_SEL_DIVM2481* RFSYN_RF_DIV_BIAS2482* DN_SEL_FREQ2483*2484* Set divider_val, Fmax, Fmix to use in Equations2485*/2486FminBin = 28000000UL ;2487FmaxBin = 42500000UL ;2488if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) {2489status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);2490status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);2491status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);2492status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);2493status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2494status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);2495divider_val = 64 ;2496Fmax = FmaxBin ;2497Fmin = FminBin ;2498}2499FminBin = 42500000UL ;2500FmaxBin = 56000000UL ;2501if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2502status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);2503status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);2504status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);2505status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);2506status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2507status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);2508divider_val = 64 ;2509Fmax = FmaxBin ;2510Fmin = FminBin ;2511}2512FminBin = 56000000UL ;2513FmaxBin = 85000000UL ;2514if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2515status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);2516status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);2517status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);2518status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);2519status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2520status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);2521divider_val = 32 ;2522Fmax = FmaxBin ;2523Fmin = FminBin ;2524}2525FminBin = 85000000UL ;2526FmaxBin = 112000000UL ;2527if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2528status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);2529status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);2530status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);2531status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);2532status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2533status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);2534divider_val = 32 ;2535Fmax = FmaxBin ;2536Fmin = FminBin ;2537}2538FminBin = 112000000UL ;2539FmaxBin = 170000000UL ;2540if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2541status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);2542status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);2543status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);2544status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);2545status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2546status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2);2547divider_val = 16 ;2548Fmax = FmaxBin ;2549Fmin = FminBin ;2550}2551FminBin = 170000000UL ;2552FmaxBin = 225000000UL ;2553if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2554status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);2555status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);2556status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);2557status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);2558status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2559status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2);2560divider_val = 16 ;2561Fmax = FmaxBin ;2562Fmin = FminBin ;2563}2564FminBin = 225000000UL ;2565FmaxBin = 300000000UL ;2566if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2567status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);2568status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);2569status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);2570status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);2571status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2572status += MXL_ControlWrite(fe, DN_SEL_FREQ, 4);2573divider_val = 8 ;2574Fmax = 340000000UL ;2575Fmin = FminBin ;2576}2577FminBin = 300000000UL ;2578FmaxBin = 340000000UL ;2579if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2580status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);2581status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);2582status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);2583status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);2584status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2585status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);2586divider_val = 8 ;2587Fmax = FmaxBin ;2588Fmin = 225000000UL ;2589}2590FminBin = 340000000UL ;2591FmaxBin = 450000000UL ;2592if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2593status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);2594status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);2595status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);2596status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);2597status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 2);2598status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);2599divider_val = 8 ;2600Fmax = FmaxBin ;2601Fmin = FminBin ;2602}2603FminBin = 450000000UL ;2604FmaxBin = 680000000UL ;2605if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2606status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);2607status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);2608status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);2609status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1);2610status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2611status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);2612divider_val = 4 ;2613Fmax = FmaxBin ;2614Fmin = FminBin ;2615}2616FminBin = 680000000UL ;2617FmaxBin = 900000000UL ;2618if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {2619status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);2620status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);2621status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);2622status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1);2623status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);2624status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);2625divider_val = 4 ;2626Fmax = FmaxBin ;2627Fmin = FminBin ;2628}26292630/* CHCAL_INT_MOD_RF2631* CHCAL_FRAC_MOD_RF2632* RFSYN_LPF_R2633* CHCAL_EN_INT_RF2634*/2635/* Equation E3 RFSYN_VCO_BIAS */2636E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ;2637status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3);26382639/* Equation E4 CHCAL_INT_MOD_RF */2640E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000);2641MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4);26422643/* Equation E5 CHCAL_FRAC_MOD_RF CHCAL_EN_INT_RF */2644E5 = ((2<<17)*(state->RF_LO/10000*divider_val -2645(E4*(2*state->Fxtal*Kdbl_RF)/10000))) /2646(2*state->Fxtal*Kdbl_RF/10000);26472648status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);26492650/* Equation E5A RFSYN_LPF_R */2651E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;2652status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A);26532654/* Euqation E5B CHCAL_EN_INIT_RF */2655status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));2656/*if (E5 == 0)2657* status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);2658*else2659* status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5);2660*/26612662/*2663* Set TG Synth2664*2665* Look-Up table implementation for:2666* TG_LO_DIVVAL2667* TG_LO_SELVAL2668*2669* Set divider_val, Fmax, Fmix to use in Equations2670*/2671if (state->TG_LO < 33000000UL)2672return -1;26732674FminBin = 33000000UL ;2675FmaxBin = 50000000UL ;2676if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) {2677status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x6);2678status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0);2679divider_val = 36 ;2680Fmax = FmaxBin ;2681Fmin = FminBin ;2682}2683FminBin = 50000000UL ;2684FmaxBin = 67000000UL ;2685if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {2686status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x1);2687status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0);2688divider_val = 24 ;2689Fmax = FmaxBin ;2690Fmin = FminBin ;2691}2692FminBin = 67000000UL ;2693FmaxBin = 100000000UL ;2694if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {2695status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0xC);2696status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);2697divider_val = 18 ;2698Fmax = FmaxBin ;2699Fmin = FminBin ;2700}2701FminBin = 100000000UL ;2702FmaxBin = 150000000UL ;2703if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {2704status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);2705status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);2706divider_val = 12 ;2707Fmax = FmaxBin ;2708Fmin = FminBin ;2709}2710FminBin = 150000000UL ;2711FmaxBin = 200000000UL ;2712if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {2713status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);2714status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2);2715divider_val = 8 ;2716Fmax = FmaxBin ;2717Fmin = FminBin ;2718}2719FminBin = 200000000UL ;2720FmaxBin = 300000000UL ;2721if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {2722status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);2723status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3);2724divider_val = 6 ;2725Fmax = FmaxBin ;2726Fmin = FminBin ;2727}2728FminBin = 300000000UL ;2729FmaxBin = 400000000UL ;2730if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {2731status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);2732status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3);2733divider_val = 4 ;2734Fmax = FmaxBin ;2735Fmin = FminBin ;2736}2737FminBin = 400000000UL ;2738FmaxBin = 600000000UL ;2739if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {2740status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8);2741status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7);2742divider_val = 3 ;2743Fmax = FmaxBin ;2744Fmin = FminBin ;2745}2746FminBin = 600000000UL ;2747FmaxBin = 900000000UL ;2748if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {2749status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0);2750status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7);2751divider_val = 2 ;2752Fmax = FmaxBin ;2753Fmin = FminBin ;2754}27552756/* TG_DIV_VAL */2757tg_divval = (state->TG_LO*divider_val/100000) *2758(MXL_Ceiling(state->Fxtal, 1000000) * 100) /2759(state->Fxtal/1000);27602761status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval);27622763if (state->TG_LO > 600000000UL)2764status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1);27652766Fmax = 1800000000UL ;2767Fmin = 1200000000UL ;27682769/* prevent overflow of 32 bit unsigned integer, use2770* following equation. Edit for v2.6.42771*/2772/* Fref_TF = Fref_TG * 1000 */2773Fref_TG = (state->Fxtal/1000) / MXL_Ceiling(state->Fxtal, 1000000);27742775/* Fvco = Fvco/10 */2776Fvco = (state->TG_LO/10000) * divider_val * Fref_TG;27772778tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8;27792780/* below equation is same as above but much harder to debug.2781* tg_lo = ( ((Fmax/10000 * Xtal_Int)/100) -2782* ((state->TG_LO/10000)*divider_val *2783* (state->Fxtal/10000)/100) )*32/((Fmax-Fmin)/10000 *2784* Xtal_Int/100) + 8;2785*/27862787status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo);27882789/* add for 2.6.5 Special setting for QAM */2790if (state->Mod_Type == MXL_QAM) {2791if (state->config->qam_gain != 0)2792status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN,2793state->config->qam_gain);2794else if (state->RF_IN < 680000000)2795status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);2796else2797status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);2798}27992800/* Off Chip Tracking Filter Control */2801if (state->TF_Type == MXL_TF_OFF) {2802/* Tracking Filter Off State; turn off all the banks */2803status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);2804status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);2805status += MXL_SetGPIO(fe, 3, 1); /* Bank1 Off */2806status += MXL_SetGPIO(fe, 1, 1); /* Bank2 Off */2807status += MXL_SetGPIO(fe, 4, 1); /* Bank3 Off */2808}28092810if (state->TF_Type == MXL_TF_C) /* Tracking Filter type C */ {2811status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);2812status += MXL_ControlWrite(fe, DAC_DIN_A, 0);28132814if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {2815status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);2816status += MXL_ControlWrite(fe, DAC_DIN_B, 0);2817status += MXL_SetGPIO(fe, 3, 0);2818status += MXL_SetGPIO(fe, 1, 1);2819status += MXL_SetGPIO(fe, 4, 1);2820}2821if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {2822status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);2823status += MXL_ControlWrite(fe, DAC_DIN_B, 0);2824status += MXL_SetGPIO(fe, 3, 1);2825status += MXL_SetGPIO(fe, 1, 0);2826status += MXL_SetGPIO(fe, 4, 1);2827}2828if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {2829status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);2830status += MXL_ControlWrite(fe, DAC_DIN_B, 0);2831status += MXL_SetGPIO(fe, 3, 1);2832status += MXL_SetGPIO(fe, 1, 0);2833status += MXL_SetGPIO(fe, 4, 0);2834}2835if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {2836status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);2837status += MXL_ControlWrite(fe, DAC_DIN_B, 0);2838status += MXL_SetGPIO(fe, 3, 1);2839status += MXL_SetGPIO(fe, 1, 1);2840status += MXL_SetGPIO(fe, 4, 0);2841}2842if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {2843status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2844status += MXL_ControlWrite(fe, DAC_DIN_B, 29);2845status += MXL_SetGPIO(fe, 3, 1);2846status += MXL_SetGPIO(fe, 1, 1);2847status += MXL_SetGPIO(fe, 4, 0);2848}2849if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {2850status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2851status += MXL_ControlWrite(fe, DAC_DIN_B, 0);2852status += MXL_SetGPIO(fe, 3, 1);2853status += MXL_SetGPIO(fe, 1, 1);2854status += MXL_SetGPIO(fe, 4, 0);2855}2856if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {2857status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2858status += MXL_ControlWrite(fe, DAC_DIN_B, 16);2859status += MXL_SetGPIO(fe, 3, 1);2860status += MXL_SetGPIO(fe, 1, 1);2861status += MXL_SetGPIO(fe, 4, 1);2862}2863if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {2864status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2865status += MXL_ControlWrite(fe, DAC_DIN_B, 7);2866status += MXL_SetGPIO(fe, 3, 1);2867status += MXL_SetGPIO(fe, 1, 1);2868status += MXL_SetGPIO(fe, 4, 1);2869}2870if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {2871status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2872status += MXL_ControlWrite(fe, DAC_DIN_B, 0);2873status += MXL_SetGPIO(fe, 3, 1);2874status += MXL_SetGPIO(fe, 1, 1);2875status += MXL_SetGPIO(fe, 4, 1);2876}2877}28782879if (state->TF_Type == MXL_TF_C_H) {28802881/* Tracking Filter type C-H for Hauppauge only */2882status += MXL_ControlWrite(fe, DAC_DIN_A, 0);28832884if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {2885status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);2886status += MXL_SetGPIO(fe, 4, 0);2887status += MXL_SetGPIO(fe, 3, 1);2888status += MXL_SetGPIO(fe, 1, 1);2889}2890if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {2891status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);2892status += MXL_SetGPIO(fe, 4, 1);2893status += MXL_SetGPIO(fe, 3, 0);2894status += MXL_SetGPIO(fe, 1, 1);2895}2896if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {2897status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);2898status += MXL_SetGPIO(fe, 4, 1);2899status += MXL_SetGPIO(fe, 3, 0);2900status += MXL_SetGPIO(fe, 1, 0);2901}2902if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {2903status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);2904status += MXL_SetGPIO(fe, 4, 1);2905status += MXL_SetGPIO(fe, 3, 1);2906status += MXL_SetGPIO(fe, 1, 0);2907}2908if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {2909status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2910status += MXL_SetGPIO(fe, 4, 1);2911status += MXL_SetGPIO(fe, 3, 1);2912status += MXL_SetGPIO(fe, 1, 0);2913}2914if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {2915status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2916status += MXL_SetGPIO(fe, 4, 1);2917status += MXL_SetGPIO(fe, 3, 1);2918status += MXL_SetGPIO(fe, 1, 0);2919}2920if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {2921status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2922status += MXL_SetGPIO(fe, 4, 1);2923status += MXL_SetGPIO(fe, 3, 1);2924status += MXL_SetGPIO(fe, 1, 1);2925}2926if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {2927status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2928status += MXL_SetGPIO(fe, 4, 1);2929status += MXL_SetGPIO(fe, 3, 1);2930status += MXL_SetGPIO(fe, 1, 1);2931}2932if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {2933status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);2934status += MXL_SetGPIO(fe, 4, 1);2935status += MXL_SetGPIO(fe, 3, 1);2936status += MXL_SetGPIO(fe, 1, 1);2937}2938}29392940if (state->TF_Type == MXL_TF_D) { /* Tracking Filter type D */29412942status += MXL_ControlWrite(fe, DAC_DIN_B, 0);29432944if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {2945status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);2946status += MXL_SetGPIO(fe, 4, 0);2947status += MXL_SetGPIO(fe, 1, 1);2948status += MXL_SetGPIO(fe, 3, 1);2949}2950if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {2951status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);2952status += MXL_SetGPIO(fe, 4, 0);2953status += MXL_SetGPIO(fe, 1, 0);2954status += MXL_SetGPIO(fe, 3, 1);2955}2956if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {2957status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);2958status += MXL_SetGPIO(fe, 4, 1);2959status += MXL_SetGPIO(fe, 1, 0);2960status += MXL_SetGPIO(fe, 3, 1);2961}2962if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {2963status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);2964status += MXL_SetGPIO(fe, 4, 1);2965status += MXL_SetGPIO(fe, 1, 0);2966status += MXL_SetGPIO(fe, 3, 0);2967}2968if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {2969status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);2970status += MXL_SetGPIO(fe, 4, 1);2971status += MXL_SetGPIO(fe, 1, 1);2972status += MXL_SetGPIO(fe, 3, 0);2973}2974if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {2975status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);2976status += MXL_SetGPIO(fe, 4, 1);2977status += MXL_SetGPIO(fe, 1, 1);2978status += MXL_SetGPIO(fe, 3, 0);2979}2980if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {2981status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);2982status += MXL_SetGPIO(fe, 4, 1);2983status += MXL_SetGPIO(fe, 1, 1);2984status += MXL_SetGPIO(fe, 3, 1);2985}2986}29872988if (state->TF_Type == MXL_TF_D_L) {29892990/* Tracking Filter type D-L for Lumanate ONLY change 2.6.3 */2991status += MXL_ControlWrite(fe, DAC_DIN_A, 0);29922993/* if UHF and terrestrial => Turn off Tracking Filter */2994if (state->RF_IN >= 471000000 &&2995(state->RF_IN - 471000000)%6000000 != 0) {2996/* Turn off all the banks */2997status += MXL_SetGPIO(fe, 3, 1);2998status += MXL_SetGPIO(fe, 1, 1);2999status += MXL_SetGPIO(fe, 4, 1);3000status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);3001status += MXL_ControlWrite(fe, AGC_IF, 10);3002} else {3003/* if VHF or cable => Turn on Tracking Filter */3004if (state->RF_IN >= 43000000 &&3005state->RF_IN < 140000000) {30063007status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);3008status += MXL_SetGPIO(fe, 4, 1);3009status += MXL_SetGPIO(fe, 1, 1);3010status += MXL_SetGPIO(fe, 3, 0);3011}3012if (state->RF_IN >= 140000000 &&3013state->RF_IN < 240000000) {3014status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);3015status += MXL_SetGPIO(fe, 4, 1);3016status += MXL_SetGPIO(fe, 1, 0);3017status += MXL_SetGPIO(fe, 3, 0);3018}3019if (state->RF_IN >= 240000000 &&3020state->RF_IN < 340000000) {3021status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);3022status += MXL_SetGPIO(fe, 4, 0);3023status += MXL_SetGPIO(fe, 1, 1);3024status += MXL_SetGPIO(fe, 3, 0);3025}3026if (state->RF_IN >= 340000000 &&3027state->RF_IN < 430000000) {3028status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);3029status += MXL_SetGPIO(fe, 4, 0);3030status += MXL_SetGPIO(fe, 1, 0);3031status += MXL_SetGPIO(fe, 3, 1);3032}3033if (state->RF_IN >= 430000000 &&3034state->RF_IN < 470000000) {3035status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);3036status += MXL_SetGPIO(fe, 4, 1);3037status += MXL_SetGPIO(fe, 1, 0);3038status += MXL_SetGPIO(fe, 3, 1);3039}3040if (state->RF_IN >= 470000000 &&3041state->RF_IN < 570000000) {3042status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);3043status += MXL_SetGPIO(fe, 4, 0);3044status += MXL_SetGPIO(fe, 1, 0);3045status += MXL_SetGPIO(fe, 3, 1);3046}3047if (state->RF_IN >= 570000000 &&3048state->RF_IN < 620000000) {3049status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);3050status += MXL_SetGPIO(fe, 4, 0);3051status += MXL_SetGPIO(fe, 1, 1);3052status += MXL_SetGPIO(fe, 3, 1);3053}3054if (state->RF_IN >= 620000000 &&3055state->RF_IN < 760000000) {3056status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);3057status += MXL_SetGPIO(fe, 4, 0);3058status += MXL_SetGPIO(fe, 1, 1);3059status += MXL_SetGPIO(fe, 3, 1);3060}3061if (state->RF_IN >= 760000000 &&3062state->RF_IN <= 900000000) {3063status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);3064status += MXL_SetGPIO(fe, 4, 1);3065status += MXL_SetGPIO(fe, 1, 1);3066status += MXL_SetGPIO(fe, 3, 1);3067}3068}3069}30703071if (state->TF_Type == MXL_TF_E) /* Tracking Filter type E */ {30723073status += MXL_ControlWrite(fe, DAC_DIN_B, 0);30743075if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {3076status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3077status += MXL_SetGPIO(fe, 4, 0);3078status += MXL_SetGPIO(fe, 1, 1);3079status += MXL_SetGPIO(fe, 3, 1);3080}3081if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {3082status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3083status += MXL_SetGPIO(fe, 4, 0);3084status += MXL_SetGPIO(fe, 1, 0);3085status += MXL_SetGPIO(fe, 3, 1);3086}3087if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {3088status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3089status += MXL_SetGPIO(fe, 4, 1);3090status += MXL_SetGPIO(fe, 1, 0);3091status += MXL_SetGPIO(fe, 3, 1);3092}3093if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {3094status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3095status += MXL_SetGPIO(fe, 4, 1);3096status += MXL_SetGPIO(fe, 1, 0);3097status += MXL_SetGPIO(fe, 3, 0);3098}3099if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {3100status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3101status += MXL_SetGPIO(fe, 4, 1);3102status += MXL_SetGPIO(fe, 1, 1);3103status += MXL_SetGPIO(fe, 3, 0);3104}3105if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {3106status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3107status += MXL_SetGPIO(fe, 4, 1);3108status += MXL_SetGPIO(fe, 1, 1);3109status += MXL_SetGPIO(fe, 3, 0);3110}3111if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {3112status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3113status += MXL_SetGPIO(fe, 4, 1);3114status += MXL_SetGPIO(fe, 1, 1);3115status += MXL_SetGPIO(fe, 3, 1);3116}3117}31183119if (state->TF_Type == MXL_TF_F) {31203121/* Tracking Filter type F */3122status += MXL_ControlWrite(fe, DAC_DIN_B, 0);31233124if (state->RF_IN >= 43000000 && state->RF_IN < 160000000) {3125status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3126status += MXL_SetGPIO(fe, 4, 0);3127status += MXL_SetGPIO(fe, 1, 1);3128status += MXL_SetGPIO(fe, 3, 1);3129}3130if (state->RF_IN >= 160000000 && state->RF_IN < 210000000) {3131status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3132status += MXL_SetGPIO(fe, 4, 0);3133status += MXL_SetGPIO(fe, 1, 0);3134status += MXL_SetGPIO(fe, 3, 1);3135}3136if (state->RF_IN >= 210000000 && state->RF_IN < 300000000) {3137status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3138status += MXL_SetGPIO(fe, 4, 1);3139status += MXL_SetGPIO(fe, 1, 0);3140status += MXL_SetGPIO(fe, 3, 1);3141}3142if (state->RF_IN >= 300000000 && state->RF_IN < 390000000) {3143status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3144status += MXL_SetGPIO(fe, 4, 1);3145status += MXL_SetGPIO(fe, 1, 0);3146status += MXL_SetGPIO(fe, 3, 0);3147}3148if (state->RF_IN >= 390000000 && state->RF_IN < 515000000) {3149status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3150status += MXL_SetGPIO(fe, 4, 1);3151status += MXL_SetGPIO(fe, 1, 1);3152status += MXL_SetGPIO(fe, 3, 0);3153}3154if (state->RF_IN >= 515000000 && state->RF_IN < 650000000) {3155status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3156status += MXL_SetGPIO(fe, 4, 1);3157status += MXL_SetGPIO(fe, 1, 1);3158status += MXL_SetGPIO(fe, 3, 0);3159}3160if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000) {3161status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3162status += MXL_SetGPIO(fe, 4, 1);3163status += MXL_SetGPIO(fe, 1, 1);3164status += MXL_SetGPIO(fe, 3, 1);3165}3166}31673168if (state->TF_Type == MXL_TF_E_2) {31693170/* Tracking Filter type E_2 */3171status += MXL_ControlWrite(fe, DAC_DIN_B, 0);31723173if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {3174status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3175status += MXL_SetGPIO(fe, 4, 0);3176status += MXL_SetGPIO(fe, 1, 1);3177status += MXL_SetGPIO(fe, 3, 1);3178}3179if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {3180status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3181status += MXL_SetGPIO(fe, 4, 0);3182status += MXL_SetGPIO(fe, 1, 0);3183status += MXL_SetGPIO(fe, 3, 1);3184}3185if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {3186status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3187status += MXL_SetGPIO(fe, 4, 1);3188status += MXL_SetGPIO(fe, 1, 0);3189status += MXL_SetGPIO(fe, 3, 1);3190}3191if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {3192status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3193status += MXL_SetGPIO(fe, 4, 1);3194status += MXL_SetGPIO(fe, 1, 0);3195status += MXL_SetGPIO(fe, 3, 0);3196}3197if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {3198status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3199status += MXL_SetGPIO(fe, 4, 1);3200status += MXL_SetGPIO(fe, 1, 1);3201status += MXL_SetGPIO(fe, 3, 0);3202}3203if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {3204status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3205status += MXL_SetGPIO(fe, 4, 1);3206status += MXL_SetGPIO(fe, 1, 1);3207status += MXL_SetGPIO(fe, 3, 0);3208}3209if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {3210status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3211status += MXL_SetGPIO(fe, 4, 1);3212status += MXL_SetGPIO(fe, 1, 1);3213status += MXL_SetGPIO(fe, 3, 1);3214}3215}32163217if (state->TF_Type == MXL_TF_G) {32183219/* Tracking Filter type G add for v2.6.8 */3220status += MXL_ControlWrite(fe, DAC_DIN_B, 0);32213222if (state->RF_IN >= 50000000 && state->RF_IN < 190000000) {32233224status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3225status += MXL_SetGPIO(fe, 4, 0);3226status += MXL_SetGPIO(fe, 1, 1);3227status += MXL_SetGPIO(fe, 3, 1);3228}3229if (state->RF_IN >= 190000000 && state->RF_IN < 280000000) {3230status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3231status += MXL_SetGPIO(fe, 4, 0);3232status += MXL_SetGPIO(fe, 1, 0);3233status += MXL_SetGPIO(fe, 3, 1);3234}3235if (state->RF_IN >= 280000000 && state->RF_IN < 350000000) {3236status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3237status += MXL_SetGPIO(fe, 4, 1);3238status += MXL_SetGPIO(fe, 1, 0);3239status += MXL_SetGPIO(fe, 3, 1);3240}3241if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {3242status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3243status += MXL_SetGPIO(fe, 4, 1);3244status += MXL_SetGPIO(fe, 1, 0);3245status += MXL_SetGPIO(fe, 3, 0);3246}3247if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) {3248status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3249status += MXL_SetGPIO(fe, 4, 1);3250status += MXL_SetGPIO(fe, 1, 0);3251status += MXL_SetGPIO(fe, 3, 1);3252}3253if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {3254status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3255status += MXL_SetGPIO(fe, 4, 1);3256status += MXL_SetGPIO(fe, 1, 1);3257status += MXL_SetGPIO(fe, 3, 0);3258}3259if (state->RF_IN >= 640000000 && state->RF_IN < 820000000) {3260status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3261status += MXL_SetGPIO(fe, 4, 1);3262status += MXL_SetGPIO(fe, 1, 1);3263status += MXL_SetGPIO(fe, 3, 0);3264}3265if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000) {3266status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3267status += MXL_SetGPIO(fe, 4, 1);3268status += MXL_SetGPIO(fe, 1, 1);3269status += MXL_SetGPIO(fe, 3, 1);3270}3271}32723273if (state->TF_Type == MXL_TF_E_NA) {32743275/* Tracking Filter type E-NA for Empia ONLY change for 2.6.8 */3276status += MXL_ControlWrite(fe, DAC_DIN_B, 0);32773278/* if UHF and terrestrial=> Turn off Tracking Filter */3279if (state->RF_IN >= 471000000 &&3280(state->RF_IN - 471000000)%6000000 != 0) {32813282/* Turn off all the banks */3283status += MXL_SetGPIO(fe, 3, 1);3284status += MXL_SetGPIO(fe, 1, 1);3285status += MXL_SetGPIO(fe, 4, 1);3286status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);32873288/* 2.6.12 Turn on RSSI */3289status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);3290status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);3291status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);3292status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);32933294/* RSSI reference point */3295status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);3296status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);3297status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);32983299/* following parameter is from analog OTA mode,3300* can be change to seek better performance */3301status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);3302} else {3303/* if VHF or Cable => Turn on Tracking Filter */33043305/* 2.6.12 Turn off RSSI */3306status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);33073308/* change back from above condition */3309status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);331033113312if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {33133314status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3315status += MXL_SetGPIO(fe, 4, 0);3316status += MXL_SetGPIO(fe, 1, 1);3317status += MXL_SetGPIO(fe, 3, 1);3318}3319if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {3320status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3321status += MXL_SetGPIO(fe, 4, 0);3322status += MXL_SetGPIO(fe, 1, 0);3323status += MXL_SetGPIO(fe, 3, 1);3324}3325if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {3326status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3327status += MXL_SetGPIO(fe, 4, 1);3328status += MXL_SetGPIO(fe, 1, 0);3329status += MXL_SetGPIO(fe, 3, 1);3330}3331if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {3332status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3333status += MXL_SetGPIO(fe, 4, 1);3334status += MXL_SetGPIO(fe, 1, 0);3335status += MXL_SetGPIO(fe, 3, 0);3336}3337if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {3338status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);3339status += MXL_SetGPIO(fe, 4, 1);3340status += MXL_SetGPIO(fe, 1, 1);3341status += MXL_SetGPIO(fe, 3, 0);3342}3343if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {3344status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3345status += MXL_SetGPIO(fe, 4, 1);3346status += MXL_SetGPIO(fe, 1, 1);3347status += MXL_SetGPIO(fe, 3, 0);3348}3349if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {3350status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);3351status += MXL_SetGPIO(fe, 4, 1);3352status += MXL_SetGPIO(fe, 1, 1);3353status += MXL_SetGPIO(fe, 3, 1);3354}3355}3356}3357return status ;3358}33593360static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val)3361{3362u16 status = 0;33633364if (GPIO_Num == 1)3365status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1);33663367/* GPIO2 is not available */33683369if (GPIO_Num == 3) {3370if (GPIO_Val == 1) {3371status += MXL_ControlWrite(fe, GPIO_3, 0);3372status += MXL_ControlWrite(fe, GPIO_3B, 0);3373}3374if (GPIO_Val == 0) {3375status += MXL_ControlWrite(fe, GPIO_3, 1);3376status += MXL_ControlWrite(fe, GPIO_3B, 1);3377}3378if (GPIO_Val == 3) { /* tri-state */3379status += MXL_ControlWrite(fe, GPIO_3, 0);3380status += MXL_ControlWrite(fe, GPIO_3B, 1);3381}3382}3383if (GPIO_Num == 4) {3384if (GPIO_Val == 1) {3385status += MXL_ControlWrite(fe, GPIO_4, 0);3386status += MXL_ControlWrite(fe, GPIO_4B, 0);3387}3388if (GPIO_Val == 0) {3389status += MXL_ControlWrite(fe, GPIO_4, 1);3390status += MXL_ControlWrite(fe, GPIO_4B, 1);3391}3392if (GPIO_Val == 3) { /* tri-state */3393status += MXL_ControlWrite(fe, GPIO_4, 0);3394status += MXL_ControlWrite(fe, GPIO_4B, 1);3395}3396}33973398return status;3399}34003401static u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value)3402{3403u16 status = 0;34043405/* Will write ALL Matching Control Name */3406/* Write Matching INIT Control */3407status += MXL_ControlWrite_Group(fe, ControlNum, value, 1);3408/* Write Matching CH Control */3409status += MXL_ControlWrite_Group(fe, ControlNum, value, 2);3410#ifdef _MXL_INTERNAL3411/* Write Matching MXL Control */3412status += MXL_ControlWrite_Group(fe, ControlNum, value, 3);3413#endif3414return status;3415}34163417static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum,3418u32 value, u16 controlGroup)3419{3420struct mxl5005s_state *state = fe->tuner_priv;3421u16 i, j, k;3422u32 highLimit;3423u32 ctrlVal;34243425if (controlGroup == 1) /* Initial Control */ {34263427for (i = 0; i < state->Init_Ctrl_Num; i++) {34283429if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {34303431highLimit = 1 << state->Init_Ctrl[i].size;3432if (value < highLimit) {3433for (j = 0; j < state->Init_Ctrl[i].size; j++) {3434state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);3435MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]),3436(u8)(state->Init_Ctrl[i].bit[j]),3437(u8)((value>>j) & 0x01));3438}3439ctrlVal = 0;3440for (k = 0; k < state->Init_Ctrl[i].size; k++)3441ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);3442} else3443return -1;3444}3445}3446}3447if (controlGroup == 2) /* Chan change Control */ {34483449for (i = 0; i < state->CH_Ctrl_Num; i++) {34503451if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {34523453highLimit = 1 << state->CH_Ctrl[i].size;3454if (value < highLimit) {3455for (j = 0; j < state->CH_Ctrl[i].size; j++) {3456state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);3457MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]),3458(u8)(state->CH_Ctrl[i].bit[j]),3459(u8)((value>>j) & 0x01));3460}3461ctrlVal = 0;3462for (k = 0; k < state->CH_Ctrl[i].size; k++)3463ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);3464} else3465return -1;3466}3467}3468}3469#ifdef _MXL_INTERNAL3470if (controlGroup == 3) /* Maxlinear Control */ {34713472for (i = 0; i < state->MXL_Ctrl_Num; i++) {34733474if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {34753476highLimit = (1 << state->MXL_Ctrl[i].size);3477if (value < highLimit) {3478for (j = 0; j < state->MXL_Ctrl[i].size; j++) {3479state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);3480MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]),3481(u8)(state->MXL_Ctrl[i].bit[j]),3482(u8)((value>>j) & 0x01));3483}3484ctrlVal = 0;3485for (k = 0; k < state->MXL_Ctrl[i].size; k++)3486ctrlVal += state->3487MXL_Ctrl[i].val[k] *3488(1 << k);3489} else3490return -1;3491}3492}3493}3494#endif3495return 0 ; /* successful return */3496}34973498static u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal)3499{3500struct mxl5005s_state *state = fe->tuner_priv;3501int i ;35023503for (i = 0; i < 104; i++) {3504if (RegNum == state->TunerRegs[i].Reg_Num) {3505*RegVal = (u8)(state->TunerRegs[i].Reg_Val);3506return 0;3507}3508}35093510return 1;3511}35123513static u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value)3514{3515struct mxl5005s_state *state = fe->tuner_priv;3516u32 ctrlVal ;3517u16 i, k ;35183519for (i = 0; i < state->Init_Ctrl_Num ; i++) {35203521if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {35223523ctrlVal = 0;3524for (k = 0; k < state->Init_Ctrl[i].size; k++)3525ctrlVal += state->Init_Ctrl[i].val[k] * (1<<k);3526*value = ctrlVal;3527return 0;3528}3529}35303531for (i = 0; i < state->CH_Ctrl_Num ; i++) {35323533if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {35343535ctrlVal = 0;3536for (k = 0; k < state->CH_Ctrl[i].size; k++)3537ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);3538*value = ctrlVal;3539return 0;35403541}3542}35433544#ifdef _MXL_INTERNAL3545for (i = 0; i < state->MXL_Ctrl_Num ; i++) {35463547if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {35483549ctrlVal = 0;3550for (k = 0; k < state->MXL_Ctrl[i].size; k++)3551ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k);3552*value = ctrlVal;3553return 0;35543555}3556}3557#endif3558return 1;3559}35603561static void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit,3562u8 bitVal)3563{3564struct mxl5005s_state *state = fe->tuner_priv;3565int i ;35663567const u8 AND_MAP[8] = {35680xFE, 0xFD, 0xFB, 0xF7,35690xEF, 0xDF, 0xBF, 0x7F } ;35703571const u8 OR_MAP[8] = {35720x01, 0x02, 0x04, 0x08,35730x10, 0x20, 0x40, 0x80 } ;35743575for (i = 0; i < state->TunerRegs_Num; i++) {3576if (state->TunerRegs[i].Reg_Num == address) {3577if (bitVal)3578state->TunerRegs[i].Reg_Val |= OR_MAP[bit];3579else3580state->TunerRegs[i].Reg_Val &= AND_MAP[bit];3581break ;3582}3583}3584}35853586static u32 MXL_Ceiling(u32 value, u32 resolution)3587{3588return value / resolution + (value % resolution > 0 ? 1 : 0);3589}35903591/* Retrieve the Initialzation Registers */3592static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,3593u8 *RegVal, int *count)3594{3595u16 status = 0;3596int i ;35973598u8 RegAddr[] = {359911, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73,360076, 77, 91, 134, 135, 137, 147,3601156, 166, 167, 168, 25 };36023603*count = ARRAY_SIZE(RegAddr);36043605status += MXL_BlockInit(fe);36063607for (i = 0 ; i < *count; i++) {3608RegNum[i] = RegAddr[i];3609status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);3610}36113612return status;3613}36143615static u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal,3616int *count)3617{3618u16 status = 0;3619int i ;36203621/* add 77, 166, 167, 168 register for 2.6.12 */3622#ifdef _MXL_PRODUCTION3623u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106,3624107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;3625#else3626u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106,3627107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;3628/*3629u8 RegAddr[171];3630for (i = 0; i <= 170; i++)3631RegAddr[i] = i;3632*/3633#endif36343635*count = ARRAY_SIZE(RegAddr);36363637for (i = 0 ; i < *count; i++) {3638RegNum[i] = RegAddr[i];3639status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);3640}36413642return status;3643}36443645static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,3646u8 *RegVal, int *count)3647{3648u16 status = 0;3649int i;36503651u8 RegAddr[] = {43, 136};36523653*count = ARRAY_SIZE(RegAddr);36543655for (i = 0; i < *count; i++) {3656RegNum[i] = RegAddr[i];3657status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);3658}36593660return status;3661}36623663static u16 MXL_GetMasterControl(u8 *MasterReg, int state)3664{3665if (state == 1) /* Load_Start */3666*MasterReg = 0xF3;3667if (state == 2) /* Power_Down */3668*MasterReg = 0x41;3669if (state == 3) /* Synth_Reset */3670*MasterReg = 0xB1;3671if (state == 4) /* Seq_Off */3672*MasterReg = 0xF1;36733674return 0;3675}36763677#ifdef _MXL_PRODUCTION3678static u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)3679{3680struct mxl5005s_state *state = fe->tuner_priv;3681u16 status = 0 ;36823683if (VCO_Range == 1) {3684status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);3685status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);3686status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);3687status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);3688status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);3689status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);3690status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);3691if (state->Mode == 0 && state->IF_Mode == 1) {3692/* Analog Low IF Mode */3693status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);3694status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);3695status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);3696status += MXL_ControlWrite(fe,3697CHCAL_FRAC_MOD_RF, 180224);3698}3699if (state->Mode == 0 && state->IF_Mode == 0) {3700/* Analog Zero IF Mode */3701status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);3702status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);3703status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);3704status += MXL_ControlWrite(fe,3705CHCAL_FRAC_MOD_RF, 222822);3706}3707if (state->Mode == 1) /* Digital Mode */ {3708status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);3709status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);3710status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);3711status += MXL_ControlWrite(fe,3712CHCAL_FRAC_MOD_RF, 229376);3713}3714}37153716if (VCO_Range == 2) {3717status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);3718status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);3719status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);3720status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);3721status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);3722status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);3723status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);3724status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);3725status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);3726status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);3727if (state->Mode == 0 && state->IF_Mode == 1) {3728/* Analog Low IF Mode */3729status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);3730status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);3731status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);3732status += MXL_ControlWrite(fe,3733CHCAL_FRAC_MOD_RF, 206438);3734}3735if (state->Mode == 0 && state->IF_Mode == 0) {3736/* Analog Zero IF Mode */3737status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);3738status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);3739status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);3740status += MXL_ControlWrite(fe,3741CHCAL_FRAC_MOD_RF, 206438);3742}3743if (state->Mode == 1) /* Digital Mode */ {3744status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);3745status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);3746status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);3747status += MXL_ControlWrite(fe,3748CHCAL_FRAC_MOD_RF, 16384);3749}3750}37513752if (VCO_Range == 3) {3753status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);3754status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);3755status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);3756status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);3757status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);3758status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);3759status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);3760status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);3761status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);3762status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);3763if (state->Mode == 0 && state->IF_Mode == 1) {3764/* Analog Low IF Mode */3765status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);3766status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);3767status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);3768status += MXL_ControlWrite(fe,3769CHCAL_FRAC_MOD_RF, 173670);3770}3771if (state->Mode == 0 && state->IF_Mode == 0) {3772/* Analog Zero IF Mode */3773status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);3774status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);3775status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);3776status += MXL_ControlWrite(fe,3777CHCAL_FRAC_MOD_RF, 173670);3778}3779if (state->Mode == 1) /* Digital Mode */ {3780status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);3781status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);3782status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);3783status += MXL_ControlWrite(fe,3784CHCAL_FRAC_MOD_RF, 245760);3785}3786}37873788if (VCO_Range == 4) {3789status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);3790status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);3791status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);3792status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);3793status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);3794status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);3795status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);3796status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);3797status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);3798status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);3799if (state->Mode == 0 && state->IF_Mode == 1) {3800/* Analog Low IF Mode */3801status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);3802status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);3803status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);3804status += MXL_ControlWrite(fe,3805CHCAL_FRAC_MOD_RF, 206438);3806}3807if (state->Mode == 0 && state->IF_Mode == 0) {3808/* Analog Zero IF Mode */3809status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);3810status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);3811status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);3812status += MXL_ControlWrite(fe,3813CHCAL_FRAC_MOD_RF, 206438);3814}3815if (state->Mode == 1) /* Digital Mode */ {3816status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);3817status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);3818status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);3819status += MXL_ControlWrite(fe,3820CHCAL_FRAC_MOD_RF, 212992);3821}3822}38233824return status;3825}38263827static u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)3828{3829struct mxl5005s_state *state = fe->tuner_priv;3830u16 status = 0;38313832if (Hystersis == 1)3833status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);38343835return status;3836}3837#endif3838/* End: Reference driver code found in the Realtek driver that3839* is copyright MaxLinear */38403841/* ----------------------------------------------------------------3842* Begin: Everything after here is new code to adapt the3843* proprietary Realtek driver into a Linux API tuner.3844* Copyright (C) 2008 Steven Toth <[email protected]>3845*/3846static int mxl5005s_reset(struct dvb_frontend *fe)3847{3848struct mxl5005s_state *state = fe->tuner_priv;3849int ret = 0;38503851u8 buf[2] = { 0xff, 0x00 };3852struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,3853.buf = buf, .len = 2 };38543855dprintk(2, "%s()\n", __func__);38563857if (fe->ops.i2c_gate_ctrl)3858fe->ops.i2c_gate_ctrl(fe, 1);38593860if (i2c_transfer(state->i2c, &msg, 1) != 1) {3861printk(KERN_WARNING "mxl5005s I2C reset failed\n");3862ret = -EREMOTEIO;3863}38643865if (fe->ops.i2c_gate_ctrl)3866fe->ops.i2c_gate_ctrl(fe, 0);38673868return ret;3869}38703871/* Write a single byte to a single reg, latch the value if required by3872* following the transaction with the latch byte.3873*/3874static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val, int latch)3875{3876struct mxl5005s_state *state = fe->tuner_priv;3877u8 buf[3] = { reg, val, MXL5005S_LATCH_BYTE };3878struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,3879.buf = buf, .len = 3 };38803881if (latch == 0)3882msg.len = 2;38833884dprintk(2, "%s(0x%x, 0x%x, 0x%x)\n", __func__, reg, val, msg.addr);38853886if (i2c_transfer(state->i2c, &msg, 1) != 1) {3887printk(KERN_WARNING "mxl5005s I2C write failed\n");3888return -EREMOTEIO;3889}3890return 0;3891}38923893static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable,3894u8 *datatable, u8 len)3895{3896int ret = 0, i;38973898if (fe->ops.i2c_gate_ctrl)3899fe->ops.i2c_gate_ctrl(fe, 1);39003901for (i = 0 ; i < len-1; i++) {3902ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 0);3903if (ret < 0)3904break;3905}39063907ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 1);39083909if (fe->ops.i2c_gate_ctrl)3910fe->ops.i2c_gate_ctrl(fe, 0);39113912return ret;3913}39143915static int mxl5005s_init(struct dvb_frontend *fe)3916{3917struct mxl5005s_state *state = fe->tuner_priv;39183919dprintk(1, "%s()\n", __func__);3920state->current_mode = MXL_QAM;3921return mxl5005s_reconfigure(fe, MXL_QAM, MXL5005S_BANDWIDTH_6MHZ);3922}39233924static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type,3925u32 bandwidth)3926{3927struct mxl5005s_state *state = fe->tuner_priv;39283929u8 AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];3930u8 ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];3931int TableLen;39323933dprintk(1, "%s(type=%d, bw=%d)\n", __func__, mod_type, bandwidth);39343935mxl5005s_reset(fe);39363937/* Tuner initialization stage 0 */3938MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);3939AddrTable[0] = MASTER_CONTROL_ADDR;3940ByteTable[0] |= state->config->AgcMasterByte;39413942mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);39433944mxl5005s_AssignTunerMode(fe, mod_type, bandwidth);39453946/* Tuner initialization stage 1 */3947MXL_GetInitRegister(fe, AddrTable, ByteTable, &TableLen);39483949mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);39503951return 0;3952}39533954static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type,3955u32 bandwidth)3956{3957struct mxl5005s_state *state = fe->tuner_priv;3958struct mxl5005s_config *c = state->config;39593960InitTunerControls(fe);39613962/* Set MxL5005S parameters. */3963MXL5005_TunerConfig(3964fe,3965c->mod_mode,3966c->if_mode,3967bandwidth,3968c->if_freq,3969c->xtal_freq,3970c->agc_mode,3971c->top,3972c->output_load,3973c->clock_out,3974c->div_out,3975c->cap_select,3976c->rssi_enable,3977mod_type,3978c->tracking_filter);39793980return 0;3981}39823983static int mxl5005s_set_params(struct dvb_frontend *fe,3984struct dvb_frontend_parameters *params)3985{3986struct mxl5005s_state *state = fe->tuner_priv;3987u32 req_mode, req_bw = 0;3988int ret;39893990dprintk(1, "%s()\n", __func__);39913992if (fe->ops.info.type == FE_ATSC) {3993switch (params->u.vsb.modulation) {3994case VSB_8:3995req_mode = MXL_ATSC; break;3996default:3997case QAM_64:3998case QAM_256:3999case QAM_AUTO:4000req_mode = MXL_QAM; break;4001}4002} else4003req_mode = MXL_DVBT;40044005/* Change tuner for new modulation type if reqd */4006if (req_mode != state->current_mode) {4007switch (req_mode) {4008case MXL_ATSC:4009case MXL_QAM:4010req_bw = MXL5005S_BANDWIDTH_6MHZ;4011break;4012case MXL_DVBT:4013default:4014/* Assume DVB-T */4015switch (params->u.ofdm.bandwidth) {4016case BANDWIDTH_6_MHZ:4017req_bw = MXL5005S_BANDWIDTH_6MHZ;4018break;4019case BANDWIDTH_7_MHZ:4020req_bw = MXL5005S_BANDWIDTH_7MHZ;4021break;4022case BANDWIDTH_AUTO:4023case BANDWIDTH_8_MHZ:4024req_bw = MXL5005S_BANDWIDTH_8MHZ;4025break;4026default:4027return -EINVAL;4028}4029}40304031state->current_mode = req_mode;4032ret = mxl5005s_reconfigure(fe, req_mode, req_bw);40334034} else4035ret = 0;40364037if (ret == 0) {4038dprintk(1, "%s() freq=%d\n", __func__, params->frequency);4039ret = mxl5005s_SetRfFreqHz(fe, params->frequency);4040}40414042return ret;4043}40444045static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency)4046{4047struct mxl5005s_state *state = fe->tuner_priv;4048dprintk(1, "%s()\n", __func__);40494050*frequency = state->RF_IN;40514052return 0;4053}40544055static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)4056{4057struct mxl5005s_state *state = fe->tuner_priv;4058dprintk(1, "%s()\n", __func__);40594060*bandwidth = state->Chan_Bandwidth;40614062return 0;4063}40644065static int mxl5005s_release(struct dvb_frontend *fe)4066{4067dprintk(1, "%s()\n", __func__);4068kfree(fe->tuner_priv);4069fe->tuner_priv = NULL;4070return 0;4071}40724073static const struct dvb_tuner_ops mxl5005s_tuner_ops = {4074.info = {4075.name = "MaxLinear MXL5005S",4076.frequency_min = 48000000,4077.frequency_max = 860000000,4078.frequency_step = 50000,4079},40804081.release = mxl5005s_release,4082.init = mxl5005s_init,40834084.set_params = mxl5005s_set_params,4085.get_frequency = mxl5005s_get_frequency,4086.get_bandwidth = mxl5005s_get_bandwidth,4087};40884089struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe,4090struct i2c_adapter *i2c,4091struct mxl5005s_config *config)4092{4093struct mxl5005s_state *state = NULL;4094dprintk(1, "%s()\n", __func__);40954096state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL);4097if (state == NULL)4098return NULL;40994100state->frontend = fe;4101state->config = config;4102state->i2c = i2c;41034104printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n",4105config->i2c_address);41064107memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops,4108sizeof(struct dvb_tuner_ops));41094110fe->tuner_priv = state;4111return fe;4112}4113EXPORT_SYMBOL(mxl5005s_attach);41144115MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver");4116MODULE_AUTHOR("Steven Toth");4117MODULE_LICENSE("GPL");411841194120