1126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/*
2126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * drxd_hard.c: DVB-T Demodulator Micronas DRX3975D-A2,DRX397xD-B1
3126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler *
4126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * Copyright (C) 2003-2007 Micronas
5126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler *
6126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * This program is free software; you can redistribute it and/or
7126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * modify it under the terms of the GNU General Public License
8126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * version 2 only, as published by the Free Software Foundation.
9126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler *
10126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler *
11126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * This program is distributed in the hope that it will be useful,
12126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * but WITHOUT ANY WARRANTY; without even the implied warranty of
13126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * GNU General Public License for more details.
15126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler *
16126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler *
17126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * You should have received a copy of the GNU General Public License
18126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * along with this program; if not, write to the Free Software
19126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * 02110-1301, USA
21126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
22126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler */
23126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
24126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include <linux/kernel.h>
25126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include <linux/module.h>
26126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include <linux/moduleparam.h>
27126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include <linux/init.h>
28126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include <linux/delay.h>
29126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include <linux/firmware.h>
30126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include <linux/i2c.h>
31126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include <asm/div64.h>
32126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
33126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include "dvb_frontend.h"
34126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include "drxd.h"
35126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include "drxd_firm.h"
36126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
378f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller#define DRX_FW_FILENAME_A2 "drxd-a2-1.1.fw"
388f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller#define DRX_FW_FILENAME_B1 "drxd-b1-1.1.fw"
398f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller
40126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define CHUNK_SIZE 48
41126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
42126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_RMW           0x10
43126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_BROADCAST     0x20
44126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_CLEARCRC      0x80
45126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_SINGLE_MASTER 0xC0
46126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_MODEFLAGS     0xC0
47126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_FLAGS         0xF0
48126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
49126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#ifndef SIZEOF_ARRAY
50126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define SIZEOF_ARRAY(array) (sizeof((array))/sizeof((array)[0]))
51126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
52126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
53126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DEFAULT_LOCK_TIMEOUT    1100
54126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
55126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_CHANNEL_AUTO 0
56126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_CHANNEL_HIGH 1
57126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_CHANNEL_LOW  2
58126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
59126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_LOCK_MPEG  1
60126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_LOCK_FEC   2
61126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_LOCK_DEMOD 4
62126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
63126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
64126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
65126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerenum CSCDState {
66126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	CSCD_INIT = 0,
67126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	CSCD_SET,
68126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	CSCD_SAVED
69126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
70126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
71126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerenum CDrxdState {
72126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	DRXD_UNINITIALIZED = 0,
73126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	DRXD_STOPPED,
74126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	DRXD_STARTED
75126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
76126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
77126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerenum AGC_CTRL_MODE {
78126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	AGC_CTRL_AUTO = 0,
79126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	AGC_CTRL_USER,
80126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	AGC_CTRL_OFF
81126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
82126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
83126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerenum OperationMode {
84126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	OM_Default,
85126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	OM_DVBT_Diversity_Front,
86126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	OM_DVBT_Diversity_End
87126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
88126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
89126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstruct SCfgAgc {
90126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	enum AGC_CTRL_MODE ctrlMode;
916cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 outputLevel;	/* range [0, ... , 1023], 1/n of fullscale range */
926cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 settleLevel;	/* range [0, ... , 1023], 1/n of fullscale range */
936cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 minOutputLevel;	/* range [0, ... , 1023], 1/n of fullscale range */
946cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 maxOutputLevel;	/* range [0, ... , 1023], 1/n of fullscale range */
956cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 speed;		/* range [0, ... , 1023], 1/n of fullscale range */
96126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
97126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 R1;
98126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 R2;
99126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 R3;
100126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
101126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
102126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstruct SNoiseCal {
103126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int cpOpt;
1043caaa20121495145cd8fef274d6eea5d90ee7182Santosh Nayak	short cpNexpOfs;
1053caaa20121495145cd8fef274d6eea5d90ee7182Santosh Nayak	short tdCal2k;
1063caaa20121495145cd8fef274d6eea5d90ee7182Santosh Nayak	short tdCal8k;
107126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
108126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
109126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerenum app_env {
110126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	APPENV_STATIC = 0,
111126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	APPENV_PORTABLE = 1,
1126cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	APPENV_MOBILE = 2
113126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
114126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
115126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerenum EIFFilter {
116126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	IFFILTER_SAW = 0,
117126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	IFFILTER_DISCRETE = 1
118126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
119126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
120126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstruct drxd_state {
121126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct dvb_frontend frontend;
122126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct dvb_frontend_ops ops;
1239f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab	struct dtv_frontend_properties props;
124126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
125126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	const struct firmware *fw;
126126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct device *dev;
127126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
128126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct i2c_adapter *i2c;
129126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	void *priv;
130126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_config config;
131126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
132126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int i2c_access;
133126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int init_done;
134834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	struct mutex mutex;
135126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1366cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 chip_adr;
137126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 hi_cfg_timing_div;
138126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 hi_cfg_bridge_delay;
139126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 hi_cfg_wakeup_key;
140126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 hi_cfg_ctrl;
141126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
142126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 intermediate_freq;
143126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 osc_clock_freq;
144126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
145126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	enum CSCDState cscd_state;
146126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	enum CDrxdState drxd_state;
147126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
148126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 sys_clock_freq;
149126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	s16 osc_clock_deviation;
150126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 expected_sys_clock_freq;
151126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
152126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 insert_rs_byte;
153126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 enable_parallel;
154126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
155126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int operation_mode;
156126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
157126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct SCfgAgc if_agc_cfg;
158126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct SCfgAgc rf_agc_cfg;
159126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
160126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct SNoiseCal noise_cal;
161126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
162126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 fe_fs_add_incr;
163126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 org_fe_fs_add_incr;
164126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 current_fe_if_incr;
165126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
166126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 m_FeAgRegAgPwd;
167126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 m_FeAgRegAgAgcSio;
168126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
169126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 m_EcOcRegOcModeLop;
170126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 m_EcOcRegSncSncLvl;
171126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitAtomicRead;
172126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_HiI2cPatch;
173126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
174126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_ResetCEFR;
175126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitFE_1;
176126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitFE_2;
177126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitCP;
178126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitCE;
179126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitEQ;
180126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitSC;
181126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitEC;
182126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_ResetECRAM;
183126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitDiversityFront;
184126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_InitDiversityEnd;
185126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_DisableDiversity;
186126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_StartDiversityFront;
187126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_StartDiversityEnd;
188126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
189126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_DiversityDelay8MHZ;
190126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *m_DiversityDelay6MHZ;
191126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
192126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *microcode;
193126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 microcode_length;
194126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
195126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int type_A;
196126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int PGA;
197126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int diversity;
198126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int tuner_mirrors;
199126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
200126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	enum app_env app_env_default;
201126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	enum app_env app_env_diversity;
202126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
203126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
204126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
205126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
206126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/* I2C **********************************************************************/
207126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
208126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2096cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int i2c_write(struct i2c_adapter *adap, u8 adr, u8 * data, int len)
210126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2119999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = data, .len = len };
212126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
213126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (i2c_transfer(adap, &msg, 1) != 1)
214126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
215126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
216126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
217126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
218126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int i2c_read(struct i2c_adapter *adap,
2199999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		    u8 adr, u8 *msg, int len, u8 *answ, int alen)
220126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2219999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	struct i2c_msg msgs[2] = {
2229999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		{
2239999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			.addr = adr, .flags = 0,
2249999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			.buf = msg, .len = len
2259999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		}, {
2269999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			.addr = adr, .flags = I2C_M_RD,
2279999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			.buf = answ, .len = alen
2289999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		}
2296cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	};
230126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (i2c_transfer(adap, msgs, 2) != 2)
231126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
232126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
233126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
234126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
235b01fbc10e3c789763b2c953984bc4b80f59bcdf3Mauro Carvalho Chehabstatic inline u32 MulDiv32(u32 a, u32 b, u32 c)
236126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
237126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u64 tmp64;
238126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2399999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	tmp64 = (u64)a * (u64)b;
240126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do_div(tmp64, c);
241126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
242126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return (u32) tmp64;
243126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
244126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2459999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehabstatic int Read16(struct drxd_state *state, u32 reg, u16 *data, u8 flags)
246126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2476cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 adr = state->config.demod_address;
2486cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 mm1[4] = { reg & 0xff, (reg >> 16) & 0xff,
2496cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		flags | ((reg >> 24) & 0xff), (reg >> 8) & 0xff
2506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	};
251126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 mm2[2];
2526cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (i2c_read(state->i2c, adr, mm1, 4, mm2, 2) < 0)
253126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
254126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (data)
2556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*data = mm2[0] | (mm2[1] << 8);
2566cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	return mm2[0] | (mm2[1] << 8);
257126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
258126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2599999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehabstatic int Read32(struct drxd_state *state, u32 reg, u32 *data, u8 flags)
260126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2616cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 adr = state->config.demod_address;
2626cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 mm1[4] = { reg & 0xff, (reg >> 16) & 0xff,
2636cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		flags | ((reg >> 24) & 0xff), (reg >> 8) & 0xff
2646cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	};
265126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 mm2[4];
266126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2676cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (i2c_read(state->i2c, adr, mm1, 4, mm2, 4) < 0)
268126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
269126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (data)
2706cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*data =
2716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    mm2[0] | (mm2[1] << 8) | (mm2[2] << 16) | (mm2[3] << 24);
272126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
273126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
274126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
275126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int Write16(struct drxd_state *state, u32 reg, u16 data, u8 flags)
276126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 adr = state->config.demod_address;
2786cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 mm[6] = { reg & 0xff, (reg >> 16) & 0xff,
2796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		flags | ((reg >> 24) & 0xff), (reg >> 8) & 0xff,
2806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		data & 0xff, (data >> 8) & 0xff
2816cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	};
282126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2836cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (i2c_write(state->i2c, adr, mm, 6) < 0)
284126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
285126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
286126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
287126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
288126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int Write32(struct drxd_state *state, u32 reg, u32 data, u8 flags)
289126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2906cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 adr = state->config.demod_address;
2916cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 mm[8] = { reg & 0xff, (reg >> 16) & 0xff,
2926cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		flags | ((reg >> 24) & 0xff), (reg >> 8) & 0xff,
2936cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		data & 0xff, (data >> 8) & 0xff,
2946cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		(data >> 16) & 0xff, (data >> 24) & 0xff
2956cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	};
296126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2976cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (i2c_write(state->i2c, adr, mm, 8) < 0)
298126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
299126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
300126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
301126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
302126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int write_chunk(struct drxd_state *state,
3039999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		       u32 reg, u8 *data, u32 len, u8 flags)
304126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
3056cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 adr = state->config.demod_address;
3066cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 mm[CHUNK_SIZE + 4] = { reg & 0xff, (reg >> 16) & 0xff,
3076cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		flags | ((reg >> 24) & 0xff), (reg >> 8) & 0xff
3086cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	};
309126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int i;
310126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
3116cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	for (i = 0; i < len; i++)
3126cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		mm[4 + i] = data[i];
3136cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (i2c_write(state->i2c, adr, mm, 4 + len) < 0) {
3149999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		printk(KERN_ERR "error in write_chunk\n");
315126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
316126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
317126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
318126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
319126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
320126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int WriteBlock(struct drxd_state *state,
3219999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		      u32 Address, u16 BlockSize, u8 *pBlock, u8 Flags)
322126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
3236cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	while (BlockSize > 0) {
324126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 Chunk = BlockSize > CHUNK_SIZE ? CHUNK_SIZE : BlockSize;
325126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
3266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (write_chunk(state, Address, pBlock, Chunk, Flags) < 0)
327126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			return -1;
328126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pBlock += Chunk;
329126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Address += (Chunk >> 1);
330126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		BlockSize -= Chunk;
331126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
332126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
333126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
334126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
3356cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int WriteTable(struct drxd_state *state, u8 * pTable)
336126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
337126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
338126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
3396cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (pTable == NULL)
340126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return 0;
341126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
3426cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	while (!status) {
343126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 Length;
3446cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		u32 Address = pTable[0] | (pTable[1] << 8) |
3456cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    (pTable[2] << 16) | (pTable[3] << 24);
346126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
3476cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (Address == 0xFFFFFFFF)
348126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
349126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pTable += sizeof(u32);
350126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
3516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		Length = pTable[0] | (pTable[1] << 8);
352126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pTable += sizeof(u16);
353126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (!Length)
354126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
3556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = WriteBlock(state, Address, Length * 2, pTable, 0);
3566cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		pTable += (Length * 2);
357126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
358126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
359126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
360126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
361126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
362126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
363126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
364126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
365126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int ResetCEFR(struct drxd_state *state)
366126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
367126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_ResetCEFR);
368126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
369126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
370126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitCP(struct drxd_state *state)
371126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
372126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitCP);
373126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
374126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
375126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitCE(struct drxd_state *state)
376126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
377126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
378126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	enum app_env AppEnv = state->app_env_default;
379126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
380126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
38158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = WriteTable(state, state->m_InitCE);
38258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
38358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
384126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
385126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->operation_mode == OM_DVBT_Diversity_Front ||
3866cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    state->operation_mode == OM_DVBT_Diversity_End) {
387126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AppEnv = state->app_env_diversity;
388126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
3896cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (AppEnv == APPENV_STATIC) {
39058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, CE_REG_TAPSET__A, 0x0000, 0);
39158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
39258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
3936cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} else if (AppEnv == APPENV_PORTABLE) {
39458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, CE_REG_TAPSET__A, 0x0001, 0);
39558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
39658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
3976cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} else if (AppEnv == APPENV_MOBILE && state->type_A) {
39858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, CE_REG_TAPSET__A, 0x0002, 0);
39958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
40058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
4016cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} else if (AppEnv == APPENV_MOBILE && !state->type_A) {
40258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, CE_REG_TAPSET__A, 0x0006, 0);
40358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
40458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
405126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
406126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
407126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* start ce */
40858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, B_CE_REG_COMM_EXEC__A, 0x0001, 0);
40958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
41058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
4116cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
412126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
413126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
414126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
415126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int StopOC(struct drxd_state *state)
416126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
417126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
4186cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 ocSyncLvl = 0;
4196cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 ocModeLop = state->m_EcOcRegOcModeLop;
4206cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 dtoIncLop = 0;
4216cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 dtoIncHip = 0;
422126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
423126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
424126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Store output configuration */
42558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Read16(state, EC_OC_REG_SNC_ISC_LVL__A, &ocSyncLvl, 0);
42658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
4279999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			break;
42858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		/* CHK_ERROR(Read16(EC_OC_REG_OC_MODE_LOP__A, &ocModeLop)); */
429126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->m_EcOcRegSncSncLvl = ocSyncLvl;
430126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* m_EcOcRegOcModeLop = ocModeLop; */
431126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
432126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Flush FIFO (byte-boundary) at fixed rate */
43358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Read16(state, EC_OC_REG_RCN_MAP_LOP__A, &dtoIncLop, 0);
43458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
43558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
43658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Read16(state, EC_OC_REG_RCN_MAP_HIP__A, &dtoIncHip, 0);
43758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
43858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
43958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_DTO_INC_LOP__A, dtoIncLop, 0);
44058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
44158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
44258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_DTO_INC_HIP__A, dtoIncHip, 0);
44358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
44458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
445126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ocModeLop &= ~(EC_OC_REG_OC_MODE_LOP_DTO_CTR_SRC__M);
4466cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		ocModeLop |= EC_OC_REG_OC_MODE_LOP_DTO_CTR_SRC_STATIC;
44758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_OC_MODE_LOP__A, ocModeLop, 0);
44858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
44958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
45058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_COMM_EXEC__A, EC_OC_REG_COMM_EXEC_CTL_HOLD, 0);
45158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
45258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
453126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
454126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		msleep(1);
455126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Output pins to '0' */
45658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_OCR_MPG_UOS__A, EC_OC_REG_OCR_MPG_UOS__M, 0);
45758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
45858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
459126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
460126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Force the OC out of sync */
461126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ocSyncLvl &= ~(EC_OC_REG_SNC_ISC_LVL_OSC__M);
46258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_SNC_ISC_LVL__A, ocSyncLvl, 0);
46358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
46458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
465126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ocModeLop &= ~(EC_OC_REG_OC_MODE_LOP_PAR_ENA__M);
4666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		ocModeLop |= EC_OC_REG_OC_MODE_LOP_PAR_ENA_ENABLE;
4676cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		ocModeLop |= 0x2;	/* Magically-out-of-sync */
46858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_OC_MODE_LOP__A, ocModeLop, 0);
46958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
47058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
47158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_COMM_INT_STA__A, 0x0, 0);
47258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
47358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
47458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_COMM_EXEC__A, EC_OC_REG_COMM_EXEC_CTL_ACTIVE, 0);
47558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
47658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
4776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
478126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
479126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
480126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
481126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
482126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int StartOC(struct drxd_state *state)
483126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
4846cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status = 0;
485126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
486126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
487126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Stop OC */
48858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_COMM_EXEC__A, EC_OC_REG_COMM_EXEC_CTL_HOLD, 0);
48958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
49058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
491126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
492126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Restore output configuration */
49358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_SNC_ISC_LVL__A, state->m_EcOcRegSncSncLvl, 0);
49458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
49558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
49658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_OC_MODE_LOP__A, state->m_EcOcRegOcModeLop, 0);
49758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
49858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
499126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
500126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Output pins active again */
50158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_OCR_MPG_UOS__A, EC_OC_REG_OCR_MPG_UOS_INIT, 0);
50258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
50358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
504126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
505126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Start OC */
50658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_COMM_EXEC__A, EC_OC_REG_COMM_EXEC_CTL_ACTIVE, 0);
50758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
50858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
5096cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
510126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
511126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
512126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
513126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitEQ(struct drxd_state *state)
514126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
515126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitEQ);
516126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
517126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
518126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitEC(struct drxd_state *state)
519126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
520126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitEC);
521126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
522126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
523126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitSC(struct drxd_state *state)
524126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
525126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitSC);
526126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
527126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
528126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitAtomicRead(struct drxd_state *state)
529126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
530126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitAtomicRead);
531126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
532126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
533126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int CorrectSysClockDeviation(struct drxd_state *state);
534126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
5356cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int DRX_GetLockStatus(struct drxd_state *state, u32 * pLockStatus)
536126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
537126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 ScRaRamLock = 0;
5386cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	const u16 mpeg_lock_mask = (SC_RA_RAM_LOCK_MPEG__M |
5396cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_LOCK_FEC__M |
5406cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_LOCK_DEMOD__M);
5416cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	const u16 fec_lock_mask = (SC_RA_RAM_LOCK_FEC__M |
5426cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				   SC_RA_RAM_LOCK_DEMOD__M);
5436cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	const u16 demod_lock_mask = SC_RA_RAM_LOCK_DEMOD__M;
544126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
545126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
546126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
5476cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	*pLockStatus = 0;
548126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
5496cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	status = Read16(state, SC_RA_RAM_LOCK__A, &ScRaRamLock, 0x0000);
5506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (status < 0) {
5519999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		printk(KERN_ERR "Can't read SC_RA_RAM_LOCK__A status = %08x\n", status);
552126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return status;
553126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
554126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
5556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (state->drxd_state != DRXD_STARTED)
556126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return 0;
557126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
5586cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if ((ScRaRamLock & mpeg_lock_mask) == mpeg_lock_mask) {
5596cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*pLockStatus |= DRX_LOCK_MPEG;
560126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CorrectSysClockDeviation(state);
561126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
562126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
5636cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if ((ScRaRamLock & fec_lock_mask) == fec_lock_mask)
5646cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*pLockStatus |= DRX_LOCK_FEC;
565126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
5666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if ((ScRaRamLock & demod_lock_mask) == demod_lock_mask)
5676cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*pLockStatus |= DRX_LOCK_DEMOD;
568126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
569126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
570126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
571126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
572126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
573126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetCfgIfAgc(struct drxd_state *state, struct SCfgAgc *cfg)
574126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
575126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
576126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
5776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (cfg->outputLevel > DRXD_FE_CTRL_MAX)
5786cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		return -1;
579126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
5806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (cfg->ctrlMode == AGC_CTRL_USER) {
581126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
582126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 FeAgRegPm1AgcWri;
583126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 FeAgRegAgModeLop;
584126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
58558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, FE_AG_REG_AG_MODE_LOP__A, &FeAgRegAgModeLop, 0);
58658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
58758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
5886cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			FeAgRegAgModeLop &= (~FE_AG_REG_AG_MODE_LOP_MODE_4__M);
5896cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			FeAgRegAgModeLop |= FE_AG_REG_AG_MODE_LOP_MODE_4_STATIC;
59058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_AG_MODE_LOP__A, FeAgRegAgModeLop, 0);
59158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
59258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
5936cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
5946cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			FeAgRegPm1AgcWri = (u16) (cfg->outputLevel &
5956cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller						  FE_AG_REG_PM1_AGC_WRI__M);
59658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_PM1_AGC_WRI__A, FeAgRegPm1AgcWri, 0);
59758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
59858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
5999999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		} while (0);
6006cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} else if (cfg->ctrlMode == AGC_CTRL_AUTO) {
6016cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (((cfg->maxOutputLevel) < (cfg->minOutputLevel)) ||
6026cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    ((cfg->maxOutputLevel) > DRXD_FE_CTRL_MAX) ||
6036cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    ((cfg->speed) > DRXD_FE_CTRL_MAX) ||
6046cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    ((cfg->settleLevel) > DRXD_FE_CTRL_MAX)
6056cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    )
6069999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			return -1;
607126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
608126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 FeAgRegAgModeLop;
609126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 FeAgRegEgcSetLvl;
610126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 slope, offset;
611126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
612126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* == Mode == */
613126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
61458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, FE_AG_REG_AG_MODE_LOP__A, &FeAgRegAgModeLop, 0);
61558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
61658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
6176cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			FeAgRegAgModeLop &= (~FE_AG_REG_AG_MODE_LOP_MODE_4__M);
618126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FeAgRegAgModeLop |=
6196cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    FE_AG_REG_AG_MODE_LOP_MODE_4_DYNAMIC;
62058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_AG_MODE_LOP__A, FeAgRegAgModeLop, 0);
62158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
62258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
623126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
624126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* == Settle level == */
625126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
6266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			FeAgRegEgcSetLvl = (u16) ((cfg->settleLevel >> 1) &
6276cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller						  FE_AG_REG_EGC_SET_LVL__M);
62858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_EGC_SET_LVL__A, FeAgRegEgcSetLvl, 0);
62958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
63058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
631126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
632126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* == Min/Max == */
633126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
6346cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			slope = (u16) ((cfg->maxOutputLevel -
6356cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					cfg->minOutputLevel) / 2);
6366cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			offset = (u16) ((cfg->maxOutputLevel +
6376cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					 cfg->minOutputLevel) / 2 - 511);
638126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
63958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_GC1_AGC_RIC__A, slope, 0);
64058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
64158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
64258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_GC1_AGC_OFF__A, offset, 0);
64358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
64458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
645126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
646126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* == Speed == */
647126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
648126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				const u16 maxRur = 8;
6496cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				const u16 slowIncrDecLUT[] = { 3, 4, 4, 5, 6 };
6506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				const u16 fastIncrDecLUT[] = { 14, 15, 15, 16,
6516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					17, 18, 18, 19,
6526cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					20, 21, 22, 23,
6536cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					24, 26, 27, 28,
6546cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					29, 31
6556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				};
6566cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
6576cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				u16 fineSteps = (DRXD_FE_CTRL_MAX + 1) /
6586cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    (maxRur + 1);
6596cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				u16 fineSpeed = (u16) (cfg->speed -
6606cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller						       ((cfg->speed /
6616cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller							 fineSteps) *
662126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							fineSteps));
6636cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				u16 invRurCount = (u16) (cfg->speed /
6646cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller							 fineSteps);
665126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 rurCount;
6666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				if (invRurCount > maxRur) {
6676cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					rurCount = 0;
668126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					fineSpeed += fineSteps;
669126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				} else {
6706cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					rurCount = maxRur - invRurCount;
671126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				}
672126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
673126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				/*
6746cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				   fastInc = default *
6756cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				   (2^(fineSpeed/fineSteps))
6766cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				   => range[default...2*default>
6776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				   slowInc = default *
6786cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				   (2^(fineSpeed/fineSteps))
6796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				 */
680126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				{
681126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					u16 fastIncrDec =
6826cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					    fastIncrDecLUT[fineSpeed /
6836cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller							   ((fineSteps /
6846cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller							     (14 + 1)) + 1)];
6856cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					u16 slowIncrDec =
6866cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					    slowIncrDecLUT[fineSpeed /
6876cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller							   (fineSteps /
6886cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller							    (3 + 1))];
689126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
69058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					status = Write16(state, FE_AG_REG_EGC_RUR_CNT__A, rurCount, 0);
69158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					if (status < 0)
69258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab						break;
69358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					status = Write16(state, FE_AG_REG_EGC_FAS_INC__A, fastIncrDec, 0);
69458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					if (status < 0)
69558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab						break;
69658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					status = Write16(state, FE_AG_REG_EGC_FAS_DEC__A, fastIncrDec, 0);
69758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					if (status < 0)
69858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab						break;
69958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					status = Write16(state, FE_AG_REG_EGC_SLO_INC__A, slowIncrDec, 0);
70058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					if (status < 0)
70158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab						break;
70258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					status = Write16(state, FE_AG_REG_EGC_SLO_DEC__A, slowIncrDec, 0);
70358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					if (status < 0)
70458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab						break;
705126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				}
706126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
7076cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} while (0);
708126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
709126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} else {
710126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* No OFF mode for IF control */
7119999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		return -1;
712126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
713126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
714126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
715126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
716126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetCfgRfAgc(struct drxd_state *state, struct SCfgAgc *cfg)
717126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
718126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
719126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
7206cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (cfg->outputLevel > DRXD_FE_CTRL_MAX)
721126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
722126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
7236cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (cfg->ctrlMode == AGC_CTRL_USER) {
724126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
7256cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			u16 AgModeLop = 0;
7266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			u16 level = (cfg->outputLevel);
727126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
7286cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if (level == DRXD_FE_CTRL_MAX)
729126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				level++;
730126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
73158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_PM2_AGC_WRI__A, level, 0x0000);
73258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
73358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
734126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
735126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/*==== Mode ====*/
736126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
737126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Powerdown PD2, WRI source */
7386cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			state->m_FeAgRegAgPwd &= ~(FE_AG_REG_AG_PWD_PWD_PD2__M);
739126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->m_FeAgRegAgPwd |=
7406cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    FE_AG_REG_AG_PWD_PWD_PD2_DISABLE;
74158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_AG_PWD__A, state->m_FeAgRegAgPwd, 0x0000);
74258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
74358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
744126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
74558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, FE_AG_REG_AG_MODE_LOP__A, &AgModeLop, 0x0000);
74658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
74758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
7486cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop &= (~(FE_AG_REG_AG_MODE_LOP_MODE_5__M |
7496cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					FE_AG_REG_AG_MODE_LOP_MODE_E__M));
7506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop |= (FE_AG_REG_AG_MODE_LOP_MODE_5_STATIC |
7516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				      FE_AG_REG_AG_MODE_LOP_MODE_E_STATIC);
75258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_AG_MODE_LOP__A, AgModeLop, 0x0000);
75358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
75458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
755126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
756126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* enable AGC2 pin */
757126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
758126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 FeAgRegAgAgcSio = 0;
75958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Read16(state, FE_AG_REG_AG_AGC_SIO__A, &FeAgRegAgAgcSio, 0x0000);
76058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
76158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
762126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio &=
7636cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    ~(FE_AG_REG_AG_AGC_SIO_AGC_SIO_2__M);
764126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio |=
7656cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    FE_AG_REG_AG_AGC_SIO_AGC_SIO_2_OUTPUT;
76658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, FE_AG_REG_AG_AGC_SIO__A, FeAgRegAgAgcSio, 0x0000);
76758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
76858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
769126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
770126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
7716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} while (0);
7726cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} else if (cfg->ctrlMode == AGC_CTRL_AUTO) {
7736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		u16 AgModeLop = 0;
774126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
775126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
776126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 level;
777126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Automatic control */
778126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Powerup PD2, AGC2 as output, TGC source */
779126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(state->m_FeAgRegAgPwd) &=
7806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    ~(FE_AG_REG_AG_PWD_PWD_PD2__M);
781126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(state->m_FeAgRegAgPwd) |=
7826cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    FE_AG_REG_AG_PWD_PWD_PD2_DISABLE;
78358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_AG_PWD__A, (state->m_FeAgRegAgPwd), 0x0000);
78458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
78558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
7866cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
78758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, FE_AG_REG_AG_MODE_LOP__A, &AgModeLop, 0x0000);
78858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
78958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
7906cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop &= (~(FE_AG_REG_AG_MODE_LOP_MODE_5__M |
7916cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					FE_AG_REG_AG_MODE_LOP_MODE_E__M));
7926cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop |= (FE_AG_REG_AG_MODE_LOP_MODE_5_STATIC |
7936cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				      FE_AG_REG_AG_MODE_LOP_MODE_E_DYNAMIC);
79458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_AG_MODE_LOP__A, AgModeLop, 0x0000);
79558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
79658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
797126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Settle level */
7986cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			level = (((cfg->settleLevel) >> 4) &
7996cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				 FE_AG_REG_TGC_SET_LVL__M);
80058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_TGC_SET_LVL__A, level, 0x0000);
80158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
80258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
803126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
804126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Min/max: don't care */
805126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
806126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Speed: TODO */
807126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
808126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* enable AGC2 pin */
809126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
810126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 FeAgRegAgAgcSio = 0;
81158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Read16(state, FE_AG_REG_AG_AGC_SIO__A, &FeAgRegAgAgcSio, 0x0000);
81258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
81358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
814126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio &=
8156cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    ~(FE_AG_REG_AG_AGC_SIO_AGC_SIO_2__M);
816126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio |=
8176cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    FE_AG_REG_AG_AGC_SIO_AGC_SIO_2_OUTPUT;
81858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, FE_AG_REG_AG_AGC_SIO__A, FeAgRegAgAgcSio, 0x0000);
81958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
82058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
821126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
822126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
8236cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} while (0);
824126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} else {
8256cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		u16 AgModeLop = 0;
826126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
827126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
828126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* No RF AGC control */
829126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Powerdown PD2, AGC2 as output, WRI source */
830126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(state->m_FeAgRegAgPwd) &=
8316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    ~(FE_AG_REG_AG_PWD_PWD_PD2__M);
832126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(state->m_FeAgRegAgPwd) |=
8336cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    FE_AG_REG_AG_PWD_PWD_PD2_ENABLE;
83458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_AG_PWD__A, (state->m_FeAgRegAgPwd), 0x0000);
83558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
83658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
837126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
83858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, FE_AG_REG_AG_MODE_LOP__A, &AgModeLop, 0x0000);
83958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
84058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
8416cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop &= (~(FE_AG_REG_AG_MODE_LOP_MODE_5__M |
8426cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					FE_AG_REG_AG_MODE_LOP_MODE_E__M));
8436cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop |= (FE_AG_REG_AG_MODE_LOP_MODE_5_STATIC |
8446cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				      FE_AG_REG_AG_MODE_LOP_MODE_E_STATIC);
84558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, FE_AG_REG_AG_MODE_LOP__A, AgModeLop, 0x0000);
84658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
84758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
848126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
849126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* set FeAgRegAgAgcSio AGC2 (RF) as input */
850126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
851126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 FeAgRegAgAgcSio = 0;
85258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Read16(state, FE_AG_REG_AG_AGC_SIO__A, &FeAgRegAgAgcSio, 0x0000);
85358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
85458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
855126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio &=
8566cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    ~(FE_AG_REG_AG_AGC_SIO_AGC_SIO_2__M);
857126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio |=
8586cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    FE_AG_REG_AG_AGC_SIO_AGC_SIO_2_INPUT;
85958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, FE_AG_REG_AG_AGC_SIO__A, FeAgRegAgAgcSio, 0x0000);
86058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
86158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
862126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
8636cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} while (0);
864126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
865126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
866126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
867126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
8686cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int ReadIFAgc(struct drxd_state *state, u32 * pValue)
869126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
870126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
871126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
872126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*pValue = 0;
8736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (state->if_agc_cfg.ctrlMode != AGC_CTRL_OFF) {
874126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 Value;
8756cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = Read16(state, FE_AG_REG_GC1_AGC_DAT__A, &Value, 0);
876126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Value &= FE_AG_REG_GC1_AGC_DAT__M;
8776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (status >= 0) {
878126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/*           3.3V
8796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			   |
8806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			   R1
8816cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			   |
882126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   Vin - R3 - * -- Vout
8836cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			   |
8846cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			   R2
8856cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			   |
8866cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			   GND
8876cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			 */
888126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 R1 = state->if_agc_cfg.R1;
889126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 R2 = state->if_agc_cfg.R2;
890126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 R3 = state->if_agc_cfg.R3;
891126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
892f8a26f052a5f62c7555d09680c1fe8cbfcac590fEdward Sheldrake			u32 Vmax, Rpar, Vmin, Vout;
893f8a26f052a5f62c7555d09680c1fe8cbfcac590fEdward Sheldrake
894f8a26f052a5f62c7555d09680c1fe8cbfcac590fEdward Sheldrake			if (R2 == 0 && (R1 == 0 || R3 == 0))
895f8a26f052a5f62c7555d09680c1fe8cbfcac590fEdward Sheldrake				return 0;
896f8a26f052a5f62c7555d09680c1fe8cbfcac590fEdward Sheldrake
897f8a26f052a5f62c7555d09680c1fe8cbfcac590fEdward Sheldrake			Vmax = (3300 * R2) / (R1 + R2);
898f8a26f052a5f62c7555d09680c1fe8cbfcac590fEdward Sheldrake			Rpar = (R2 * R3) / (R3 + R2);
899f8a26f052a5f62c7555d09680c1fe8cbfcac590fEdward Sheldrake			Vmin = (3300 * Rpar) / (R1 + Rpar);
900f8a26f052a5f62c7555d09680c1fe8cbfcac590fEdward Sheldrake			Vout = Vmin + ((Vmax - Vmin) * Value) / 1024;
901126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
902126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			*pValue = Vout;
903126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
904126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
905126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
906126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
907126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
9088f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmuellerstatic int load_firmware(struct drxd_state *state, const char *fw_name)
9098f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller{
9108f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller	const struct firmware *fw;
9118f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller
9128f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller	if (request_firmware(&fw, fw_name, state->dev) < 0) {
9138f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller		printk(KERN_ERR "drxd: firmware load failure [%s]\n", fw_name);
9148f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller		return -EIO;
9158f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller	}
9168f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller
91753090aada474fe10052602ca3f46701591b666a5Thomas Meyer	state->microcode = kmemdup(fw->data, fw->size, GFP_KERNEL);
9188f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller	if (state->microcode == NULL) {
9198afe9119e25809b044d9b5afbe2fb2853a5bd10cJesper Juhl		release_firmware(fw);
9208afe9119e25809b044d9b5afbe2fb2853a5bd10cJesper Juhl		printk(KERN_ERR "drxd: firmware load failure: no memory\n");
9218f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller		return -ENOMEM;
9228f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller	}
9238f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller
9248f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller	state->microcode_length = fw->size;
9258afe9119e25809b044d9b5afbe2fb2853a5bd10cJesper Juhl	release_firmware(fw);
9268f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller	return 0;
9278f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller}
9288f19f27e3e0e055aed877a07198cfbaf9d784105Devin Heitmueller
929126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int DownloadMicrocode(struct drxd_state *state,
9309999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			     const u8 *pMCImage, u32 Length)
931126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
932126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *pSrc;
933126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 Address;
934126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 nBlocks;
935126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 BlockSize;
9366cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 offset = 0;
9376cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int i, status = 0;
938126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
9396cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	pSrc = (u8 *) pMCImage;
94023aefb7e0e5e8b3766545af51b88fc3eb07532baHans Verkuil	/* We're not using Flags */
94123aefb7e0e5e8b3766545af51b88fc3eb07532baHans Verkuil	/* Flags = (pSrc[0] << 8) | pSrc[1]; */
9426cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	pSrc += sizeof(u16);
9436cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	offset += sizeof(u16);
944126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	nBlocks = (pSrc[0] << 8) | pSrc[1];
9456cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	pSrc += sizeof(u16);
9466cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	offset += sizeof(u16);
947126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
9486cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	for (i = 0; i < nBlocks; i++) {
9496cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		Address = (pSrc[0] << 24) | (pSrc[1] << 16) |
9506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    (pSrc[2] << 8) | pSrc[3];
9516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		pSrc += sizeof(u32);
9526cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		offset += sizeof(u32);
953126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
9546cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		BlockSize = ((pSrc[0] << 8) | pSrc[1]) * sizeof(u16);
9556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		pSrc += sizeof(u16);
9566cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		offset += sizeof(u16);
957126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
95823aefb7e0e5e8b3766545af51b88fc3eb07532baHans Verkuil		/* We're not using Flags */
95923aefb7e0e5e8b3766545af51b88fc3eb07532baHans Verkuil		/* u16 Flags = (pSrc[0] << 8) | pSrc[1]; */
9606cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		pSrc += sizeof(u16);
9616cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		offset += sizeof(u16);
962126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
96323aefb7e0e5e8b3766545af51b88fc3eb07532baHans Verkuil		/* We're not using BlockCRC */
96423aefb7e0e5e8b3766545af51b88fc3eb07532baHans Verkuil		/* u16 BlockCRC = (pSrc[0] << 8) | pSrc[1]; */
9656cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		pSrc += sizeof(u16);
9666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		offset += sizeof(u16);
967126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
9686cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = WriteBlock(state, Address, BlockSize,
9696cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    pSrc, DRX_I2C_CLEARCRC);
9706cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (status < 0)
971126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
972126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pSrc += BlockSize;
973126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		offset += BlockSize;
974126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
975126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
976126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
977126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
978126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
9796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int HI_Command(struct drxd_state *state, u16 cmd, u16 * pResult)
980126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
981126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 nrRetries = 0;
982126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 waitCmd;
983126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
984126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
9859999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	status = Write16(state, HI_RA_RAM_SRV_CMD__A, cmd, 0);
9869999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	if (status < 0)
987126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return status;
988126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
989126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
9906cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		nrRetries += 1;
9916cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (nrRetries > DRXD_MAX_RETRIES) {
9926cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			status = -1;
993126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
994126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		};
9956cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = Read16(state, HI_RA_RAM_SRV_CMD__A, &waitCmd, 0);
9966cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (waitCmd != 0);
997126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
9986cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (status >= 0)
9996cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = Read16(state, HI_RA_RAM_SRV_RES__A, pResult, 0);
1000126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1001126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1002126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1003126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int HI_CfgCommand(struct drxd_state *state)
1004126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
10056cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status = 0;
1006126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1007834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_lock(&state->mutex);
10086cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	Write16(state, HI_RA_RAM_SRV_CFG_KEY__A, HI_RA_RAM_SRV_RST_KEY_ACT, 0);
1009126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_RA_RAM_SRV_CFG_DIV__A, state->hi_cfg_timing_div, 0);
10106cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	Write16(state, HI_RA_RAM_SRV_CFG_BDL__A, state->hi_cfg_bridge_delay, 0);
1011126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_RA_RAM_SRV_CFG_WUP__A, state->hi_cfg_wakeup_key, 0);
1012126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_RA_RAM_SRV_CFG_ACT__A, state->hi_cfg_ctrl, 0);
1013126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
10146cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	Write16(state, HI_RA_RAM_SRV_CFG_KEY__A, HI_RA_RAM_SRV_RST_KEY_ACT, 0);
1015126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
10166cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if ((state->hi_cfg_ctrl & HI_RA_RAM_SRV_CFG_ACT_PWD_EXE) ==
1017126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    HI_RA_RAM_SRV_CFG_ACT_PWD_EXE)
10186cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = Write16(state, HI_RA_RAM_SRV_CMD__A,
10196cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				 HI_RA_RAM_SRV_CMD_CONFIG, 0);
1020126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
10216cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = HI_Command(state, HI_RA_RAM_SRV_CMD_CONFIG, 0);
1022834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_unlock(&state->mutex);
1023126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1024126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1025126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1026126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitHI(struct drxd_state *state)
1027126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1028126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->hi_cfg_wakeup_key = (state->chip_adr);
1029126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* port/bridge/power down ctrl */
1030126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->hi_cfg_ctrl = HI_RA_RAM_SRV_CFG_ACT_SLV0_ON;
10316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	return HI_CfgCommand(state);
1032126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1033126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1034126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int HI_ResetCommand(struct drxd_state *state)
1035126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1036126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1037126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1038834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_lock(&state->mutex);
10396cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	status = Write16(state, HI_RA_RAM_SRV_RST_KEY__A,
10406cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			 HI_RA_RAM_SRV_RST_KEY_ACT, 0);
10416cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (status == 0)
10426cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = HI_Command(state, HI_RA_RAM_SRV_CMD_RESET, 0);
1043834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_unlock(&state->mutex);
1044126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	msleep(1);
1045126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1046126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1047126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
10486cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int DRX_ConfigureI2CBridge(struct drxd_state *state, int bEnableBridge)
1049126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1050126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->hi_cfg_ctrl &= (~HI_RA_RAM_SRV_CFG_ACT_BRD__M);
10516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (bEnableBridge)
1052126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->hi_cfg_ctrl |= HI_RA_RAM_SRV_CFG_ACT_BRD_ON;
1053126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
1054126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->hi_cfg_ctrl |= HI_RA_RAM_SRV_CFG_ACT_BRD_OFF;
1055126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1056126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return HI_CfgCommand(state);
1057126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1058126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1059126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define HI_TR_WRITE      0x9
1060126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define HI_TR_READ       0xA
1061126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define HI_TR_READ_WRITE 0xB
1062126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define HI_TR_BROADCAST  0x4
1063126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1064126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#if 0
1065126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int AtomicReadBlock(struct drxd_state *state,
10669999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			   u32 Addr, u16 DataSize, u8 *pData, u8 Flags)
1067126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1068126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
10696cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int i = 0;
1070126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1071126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Parameter check */
10726cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if ((!pData) || ((DataSize & 1) != 0))
1073126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
1074126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1075834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_lock(&state->mutex);
1076126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1077126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1078126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Instruct HI to read n bytes */
1079126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* TODO use proper names forthese egisters */
108058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, HI_RA_RAM_SRV_CFG_KEY__A, (HI_TR_FUNC_ADDR & 0xFFFF), 0);
108158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
108258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
108358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, HI_RA_RAM_SRV_CFG_DIV__A, (u16) (Addr >> 16), 0);
108458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
108558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
108658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, HI_RA_RAM_SRV_CFG_BDL__A, (u16) (Addr & 0xFFFF), 0);
108758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
108858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
108958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, HI_RA_RAM_SRV_CFG_WUP__A, (u16) ((DataSize / 2) - 1), 0);
109058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
109158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
109258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, HI_RA_RAM_SRV_CFG_ACT__A, HI_TR_READ, 0);
109358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
109458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
109558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab
109658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = HI_Command(state, HI_RA_RAM_SRV_CMD_EXECUTE, 0);
109758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
109858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
10996cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
11006cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
11016cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
11026cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (status >= 0) {
11036cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		for (i = 0; i < (DataSize / 2); i += 1) {
1104126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 word;
1105126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1106126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = Read16(state, (HI_RA_RAM_USR_BEGIN__A + i),
1107126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					&word, 0);
11086cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if (status < 0)
1109126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				break;
11106cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			pData[2 * i] = (u8) (word & 0xFF);
11116cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			pData[(2 * i) + 1] = (u8) (word >> 8);
1112126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1113126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1114834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_unlock(&state->mutex);
1115126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1116126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1117126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1118126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int AtomicReadReg32(struct drxd_state *state,
11199999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			   u32 Addr, u32 *pData, u8 Flags)
1120126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
11216cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u8 buf[sizeof(u32)];
1122126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1123126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1124126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (!pData)
1125126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
11266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	status = AtomicReadBlock(state, Addr, sizeof(u32), buf, Flags);
11276cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	*pData = (((u32) buf[0]) << 0) +
11286cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	    (((u32) buf[1]) << 8) +
11296cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	    (((u32) buf[2]) << 16) + (((u32) buf[3]) << 24);
1130126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1131126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1132126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
1133126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1134126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int StopAllProcessors(struct drxd_state *state)
1135126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1136126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return Write16(state, HI_COMM_EXEC__A,
1137126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		       SC_COMM_EXEC_CTL_STOP, DRX_I2C_BROADCAST);
1138126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1139126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1140126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int EnableAndResetMB(struct drxd_state *state)
1141126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1142126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (state->type_A) {
1143126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* disable? monitor bus observe @ EC_OC */
1144126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Write16(state, EC_OC_REG_OC_MON_SIO__A, 0x0000, 0x0000);
1145126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1146126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1147126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* do inverse broadcast, followed by explicit write to HI */
1148126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_COMM_MB__A, 0x0000, DRX_I2C_BROADCAST);
1149126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_COMM_MB__A, 0x0000, 0x0000);
1150126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
1151126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1152126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1153126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitCC(struct drxd_state *state)
1154126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1155126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (state->osc_clock_freq == 0 ||
1156126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->osc_clock_freq > 20000 ||
11576cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	    (state->osc_clock_freq % 4000) != 0) {
11589999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		printk(KERN_ERR "invalid osc frequency %d\n", state->osc_clock_freq);
1159126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
1160126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1161126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1162126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, CC_REG_OSC_MODE__A, CC_REG_OSC_MODE_M20, 0);
1163126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, CC_REG_PLL_MODE__A, CC_REG_PLL_MODE_BYPASS_PLL |
1164126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CC_REG_PLL_MODE_PUMP_CUR_12, 0);
11656cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	Write16(state, CC_REG_REF_DIVIDE__A, state->osc_clock_freq / 4000, 0);
1166126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, CC_REG_PWD_MODE__A, CC_REG_PWD_MODE_DOWN_PLL, 0);
1167126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, CC_REG_UPDATE__A, CC_REG_UPDATE_KEY, 0);
1168126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1169126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
1170126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1171126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1172126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int ResetECOD(struct drxd_state *state)
1173126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1174126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
1175126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
11766cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (state->type_A)
1177126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = Write16(state, EC_OD_REG_SYNC__A, 0x0664, 0);
1178126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
1179126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = Write16(state, B_EC_OD_REG_SYNC__A, 0x0664, 0);
1180126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
11816cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (!(status < 0))
1182126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = WriteTable(state, state->m_ResetECRAM);
11836cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (!(status < 0))
1184126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = Write16(state, EC_OD_REG_COMM_EXEC__A, 0x0001, 0);
1185126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1186126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1187126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1188126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/* Configure PGA switch */
1189126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1190126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetCfgPga(struct drxd_state *state, int pgaSwitch)
1191126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1192126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1193126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 AgModeLop = 0;
1194126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 AgModeHip = 0;
1195126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
11966cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (pgaSwitch) {
1197126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* PGA on */
1198126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* fine gain */
119958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, B_FE_AG_REG_AG_MODE_LOP__A, &AgModeLop, 0x0000);
120058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
120158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
12026cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop &= (~(B_FE_AG_REG_AG_MODE_LOP_MODE_C__M));
12036cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop |= B_FE_AG_REG_AG_MODE_LOP_MODE_C_DYNAMIC;
120458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_FE_AG_REG_AG_MODE_LOP__A, AgModeLop, 0x0000);
120558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
120658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1207126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1208126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* coarse gain */
120958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, B_FE_AG_REG_AG_MODE_HIP__A, &AgModeHip, 0x0000);
121058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
121158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
12126cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeHip &= (~(B_FE_AG_REG_AG_MODE_HIP_MODE_J__M));
12136cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeHip |= B_FE_AG_REG_AG_MODE_HIP_MODE_J_DYNAMIC;
121458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_FE_AG_REG_AG_MODE_HIP__A, AgModeHip, 0x0000);
121558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
121658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1217126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1218126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* enable fine and coarse gain, enable AAF,
1219126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   no ext resistor */
122058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_FE_AG_REG_AG_PGA_MODE__A, B_FE_AG_REG_AG_PGA_MODE_PFY_PCY_AFY_REN, 0x0000);
122158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
122258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1223126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
1224126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* PGA off, bypass */
1225126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1226126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* fine gain */
122758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, B_FE_AG_REG_AG_MODE_LOP__A, &AgModeLop, 0x0000);
122858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
122958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
12306cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop &= (~(B_FE_AG_REG_AG_MODE_LOP_MODE_C__M));
12316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeLop |= B_FE_AG_REG_AG_MODE_LOP_MODE_C_STATIC;
123258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_FE_AG_REG_AG_MODE_LOP__A, AgModeLop, 0x0000);
123358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
123458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1235126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1236126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* coarse gain */
123758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, B_FE_AG_REG_AG_MODE_HIP__A, &AgModeHip, 0x0000);
123858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
123958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
12406cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeHip &= (~(B_FE_AG_REG_AG_MODE_HIP_MODE_J__M));
12416cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			AgModeHip |= B_FE_AG_REG_AG_MODE_HIP_MODE_J_STATIC;
124258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_FE_AG_REG_AG_MODE_HIP__A, AgModeHip, 0x0000);
124358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
124458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1245126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1246126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* disable fine and coarse gain, enable AAF,
1247126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   no ext resistor */
124858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_FE_AG_REG_AG_PGA_MODE__A, B_FE_AG_REG_AG_PGA_MODE_PFN_PCN_AFY_REN, 0x0000);
124958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
125058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1251126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
12529999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	} while (0);
1253126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1254126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1255126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1256126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitFE(struct drxd_state *state)
1257126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
12586cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status;
1259126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
12606cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	do {
126158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = WriteTable(state, state->m_InitFE_1);
126258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
126358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
1264126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
12656cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (state->type_A) {
12666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			status = Write16(state, FE_AG_REG_AG_PGA_MODE__A,
12676cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					 FE_AG_REG_AG_PGA_MODE_PFN_PCN_AFY_REN,
12686cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					 0);
12696cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} else {
12706cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if (state->PGA)
12716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				status = SetCfgPga(state, 0);
12726cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			else
12736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				status =
12746cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    Write16(state, B_FE_AG_REG_AG_PGA_MODE__A,
12756cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					    B_FE_AG_REG_AG_PGA_MODE_PFN_PCN_AFY_REN,
12766cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					    0);
12776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		}
1278126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
12796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (status < 0)
12806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			break;
128158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, FE_AG_REG_AG_AGC_SIO__A, state->m_FeAgRegAgAgcSio, 0x0000);
128258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
128358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
128458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, FE_AG_REG_AG_PWD__A, state->m_FeAgRegAgPwd, 0x0000);
128558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
128658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
1287126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
128858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = WriteTable(state, state->m_InitFE_2);
128958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
129058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
1291126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
12926cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1293126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
12946cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	return status;
1295126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1296126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1297126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitFT(struct drxd_state *state)
1298126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1299126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/*
13006cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	   norm OFFSET,  MB says =2 voor 8K en =3 voor 2K waarschijnlijk
13016cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	   SC stuff
13026cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	 */
13036cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	return Write16(state, FT_REG_COMM_EXEC__A, 0x0001, 0x0000);
1304126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1305126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1306126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SC_WaitForReady(struct drxd_state *state)
1307126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1308126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 curCmd;
1309126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int i;
1310126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
13116cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	for (i = 0; i < DRXD_MAX_RETRIES; i += 1) {
13126cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		int status = Read16(state, SC_RA_RAM_CMD__A, &curCmd, 0);
13136cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (status == 0 || curCmd == 0)
1314126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			return status;
1315126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1316126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return -1;
1317126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1318126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1319126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SC_SendCommand(struct drxd_state *state, u16 cmd)
1320126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
13216cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status = 0;
1322126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 errCode;
1323126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
13246cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	Write16(state, SC_RA_RAM_CMD__A, cmd, 0);
1325126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	SC_WaitForReady(state);
1326126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
13276cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	Read16(state, SC_RA_RAM_CMD_ADDR__A, &errCode, 0);
1328126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
13296cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (errCode == 0xFFFF) {
13309999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		printk(KERN_ERR "Command Error\n");
13316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = -1;
1332126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1333126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1334126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1335126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1336126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1337126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SC_ProcStartCommand(struct drxd_state *state,
13386cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			       u16 subCmd, u16 param0, u16 param1)
1339126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
13406cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status = 0;
1341126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 scExec;
1342126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1343834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_lock(&state->mutex);
1344126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1345126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Read16(state, SC_COMM_EXEC__A, &scExec, 0);
1346126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (scExec != 1) {
13476cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			status = -1;
1348126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1349126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1350126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		SC_WaitForReady(state);
13516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		Write16(state, SC_RA_RAM_CMD_ADDR__A, subCmd, 0);
13526cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		Write16(state, SC_RA_RAM_PARAM1__A, param1, 0);
13536cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		Write16(state, SC_RA_RAM_PARAM0__A, param0, 0);
1354126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1355126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		SC_SendCommand(state, SC_RA_RAM_CMD_PROC_START);
13566cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1357834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_unlock(&state->mutex);
1358126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1359126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1360126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1361126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SC_SetPrefParamCommand(struct drxd_state *state,
13626cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				  u16 subCmd, u16 param0, u16 param1)
1363126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1364126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1365126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1366834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_lock(&state->mutex);
1367126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
136858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SC_WaitForReady(state);
136958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
137058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
137158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, SC_RA_RAM_CMD_ADDR__A, subCmd, 0);
137258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
137358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
137458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, SC_RA_RAM_PARAM1__A, param1, 0);
137558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
137658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
137758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, SC_RA_RAM_PARAM0__A, param0, 0);
137858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
137958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
13806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
138158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SC_SendCommand(state, SC_RA_RAM_CMD_SET_PREF_PARAM);
138258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
138358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
13846cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1385834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_unlock(&state->mutex);
1386126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1387126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1388126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1389126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#if 0
13906cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int SC_GetOpParamCommand(struct drxd_state *state, u16 * result)
1391126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
13926cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status = 0;
1393126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1394834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_lock(&state->mutex);
1395126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
139658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SC_WaitForReady(state);
139758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
139858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
139958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SC_SendCommand(state, SC_RA_RAM_CMD_GET_OP_PARAM);
140058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
140158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
140258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Read16(state, SC_RA_RAM_PARAM0__A, result, 0);
140358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
140458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
14056cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1406834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_unlock(&state->mutex);
1407126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1408126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1409126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
1410126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1411126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int ConfigureMPEGOutput(struct drxd_state *state, int bEnableOutput)
1412126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1413126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1414126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1415126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1416126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 EcOcRegIprInvMpg = 0;
1417126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 EcOcRegOcModeLop = 0;
1418126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 EcOcRegOcModeHip = 0;
14196cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		u16 EcOcRegOcMpgSio = 0;
1420126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
142158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		/*CHK_ERROR(Read16(state, EC_OC_REG_OC_MODE_LOP__A, &EcOcRegOcModeLop, 0)); */
1422126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
14236cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (state->operation_mode == OM_DVBT_Diversity_Front) {
14246cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if (bEnableOutput) {
1425126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip |=
14266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    B_EC_OC_REG_OC_MODE_HIP_MPG_BUS_SRC_MONITOR;
14276cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			} else
1428126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcMpgSio |= EC_OC_REG_OC_MPG_SIO__M;
1429126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			EcOcRegOcModeLop |=
14306cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    EC_OC_REG_OC_MODE_LOP_PAR_ENA_DISABLE;
14316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} else {
1432126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			EcOcRegOcModeLop = state->m_EcOcRegOcModeLop;
1433126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1434126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (bEnableOutput)
14356cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				EcOcRegOcMpgSio &= (~(EC_OC_REG_OC_MPG_SIO__M));
1436126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			else
1437126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcMpgSio |= EC_OC_REG_OC_MPG_SIO__M;
1438126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1439126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Don't Insert RS Byte */
14406cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if (state->insert_rs_byte) {
1441126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeLop &=
14426cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    (~(EC_OC_REG_OC_MODE_LOP_PAR_ENA__M));
1443126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip &=
14446cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    (~EC_OC_REG_OC_MODE_HIP_MPG_PAR_VAL__M);
1445126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip |=
1446126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    EC_OC_REG_OC_MODE_HIP_MPG_PAR_VAL_ENABLE;
1447126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			} else {
1448126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeLop |=
14496cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    EC_OC_REG_OC_MODE_LOP_PAR_ENA_DISABLE;
1450126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip &=
1451126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    (~EC_OC_REG_OC_MODE_HIP_MPG_PAR_VAL__M);
1452126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip |=
1453126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    EC_OC_REG_OC_MODE_HIP_MPG_PAR_VAL_DISABLE;
1454126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1455126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1456126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Mode = Parallel */
14576cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if (state->enable_parallel)
1458126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeLop &=
1459126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    (~(EC_OC_REG_OC_MODE_LOP_MPG_TRM_MDE__M));
1460126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			else
1461126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeLop |=
1462126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    EC_OC_REG_OC_MODE_LOP_MPG_TRM_MDE_SERIAL;
1463126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1464126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Data */
1465126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegIprInvMpg |= 0x00FF; */
1466126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x00FF));
1467126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1468126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Error ( we don't use the pin ) */
1469126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/*  EcOcRegIprInvMpg |= 0x0100; */
1470126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x0100));
1471126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1472126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Start ( we don't use the pin ) */
1473126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegIprInvMpg |= 0x0200; */
1474126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x0200));
1475126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1476126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Valid ( we don't use the pin ) */
1477126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegIprInvMpg |= 0x0400; */
1478126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x0400));
1479126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1480126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Clock */
1481126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegIprInvMpg |= 0x0800; */
1482126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x0800));
1483126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1484126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegOcModeLop =0x05; */
148558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_IPR_INV_MPG__A, EcOcRegIprInvMpg, 0);
148658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
148758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
148858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_OC_MODE_LOP__A, EcOcRegOcModeLop, 0);
148958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
149058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
149158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_OC_MODE_HIP__A, EcOcRegOcModeHip, 0x0000);
149258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
149358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
149458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, EC_OC_REG_OC_MPG_SIO__A, EcOcRegOcMpgSio, 0);
149558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
149658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
14976cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1498126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1499126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1500126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1501126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetDeviceTypeId(struct drxd_state *state)
1502126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
15036cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status = 0;
15046cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 deviceId = 0;
15056cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
15066cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	do {
150758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Read16(state, CC_REG_JTAGID_L__A, &deviceId, 0);
150858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
150958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
15106cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		/* TODO: why twice? */
151158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Read16(state, CC_REG_JTAGID_L__A, &deviceId, 0);
151258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
151358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
15149999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		printk(KERN_INFO "drxd: deviceId = %04x\n", deviceId);
15156cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
15166cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->type_A = 0;
15176cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->PGA = 0;
15186cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->diversity = 0;
15196cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (deviceId == 0) {	/* on A2 only 3975 available */
15206cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			state->type_A = 1;
15219999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			printk(KERN_INFO "DRX3975D-A2\n");
15226cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} else {
15236cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			deviceId >>= 12;
15249999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab			printk(KERN_INFO "DRX397%dD-B1\n", deviceId);
15256cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			switch (deviceId) {
15266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			case 4:
15276cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				state->diversity = 1;
15286cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			case 3:
15296cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			case 7:
15306cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				state->PGA = 1;
15316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				break;
15326cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			case 6:
15336cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				state->diversity = 1;
15346cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			case 5:
15356cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			case 8:
15366cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				break;
15376cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			default:
15386cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				status = -1;
15396cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				break;
15406cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			}
15416cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		}
15426cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
15436cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
15446cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (status < 0)
15456cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		return status;
15466cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
15476cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	/* Init Table selection */
15486cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->m_InitAtomicRead = DRXD_InitAtomicRead;
15496cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->m_InitSC = DRXD_InitSC;
15506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->m_ResetECRAM = DRXD_ResetECRAM;
15516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (state->type_A) {
15526cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_ResetCEFR = DRXD_ResetCEFR;
15536cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitFE_1 = DRXD_InitFEA2_1;
15546cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitFE_2 = DRXD_InitFEA2_2;
15556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitCP = DRXD_InitCPA2;
15566cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitCE = DRXD_InitCEA2;
15576cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitEQ = DRXD_InitEQA2;
15586cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitEC = DRXD_InitECA2;
15596cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (load_firmware(state, DRX_FW_FILENAME_A2))
15606cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			return -EIO;
15616cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} else {
15626cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_ResetCEFR = NULL;
15636cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitFE_1 = DRXD_InitFEB1_1;
15646cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitFE_2 = DRXD_InitFEB1_2;
15656cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitCP = DRXD_InitCPB1;
15666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitCE = DRXD_InitCEB1;
15676cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitEQ = DRXD_InitEQB1;
15686cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitEC = DRXD_InitECB1;
15696cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (load_firmware(state, DRX_FW_FILENAME_B1))
15706cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			return -EIO;
15716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	}
15726cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (state->diversity) {
15736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitDiversityFront = DRXD_InitDiversityFront;
15746cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitDiversityEnd = DRXD_InitDiversityEnd;
15756cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_DisableDiversity = DRXD_DisableDiversity;
15766cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_StartDiversityFront = DRXD_StartDiversityFront;
15776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_StartDiversityEnd = DRXD_StartDiversityEnd;
15786cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_DiversityDelay8MHZ = DRXD_DiversityDelay8MHZ;
15796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_DiversityDelay6MHZ = DRXD_DiversityDelay6MHZ;
15806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} else {
15816cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitDiversityFront = NULL;
15826cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_InitDiversityEnd = NULL;
15836cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_DisableDiversity = NULL;
15846cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_StartDiversityFront = NULL;
15856cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_StartDiversityEnd = NULL;
15866cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_DiversityDelay8MHZ = NULL;
15876cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_DiversityDelay6MHZ = NULL;
15886cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	}
15896cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
15906cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	return status;
1591126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1592126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1593126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int CorrectSysClockDeviation(struct drxd_state *state)
1594126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1595126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
15966cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	s32 incr = 0;
15976cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	s32 nomincr = 0;
15986cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 bandwidth = 0;
15996cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 sysClockInHz = 0;
16006cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 sysClockFreq = 0;	/* in kHz */
1601126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	s16 oscClockDeviation;
1602126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	s16 Diff;
1603126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1604126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1605126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Retrieve bandwidth and incr, sanity check */
1606126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1607126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* These accesses should be AtomicReadReg32, but that
1608126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   causes trouble (at least for diversity */
16099999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		status = Read32(state, LC_RA_RAM_IFINCR_NOM_L__A, ((u32 *) &nomincr), 0);
161058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
161158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
16129999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		status = Read32(state, FE_IF_REG_INCR0__A, (u32 *) &incr, 0);
161358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
161458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
16156cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
16166cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (state->type_A) {
16176cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if ((nomincr - incr < -500) || (nomincr - incr > 500))
1618126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				break;
1619126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
16206cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if ((nomincr - incr < -2000) || (nomincr - incr > 2000))
1621126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				break;
1622126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1623126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
16249f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		switch (state->props.bandwidth_hz) {
16259f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		case 8000000:
1626126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_8MHZ_IN_HZ;
1627126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
16289f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		case 7000000:
1629126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_7MHZ_IN_HZ;
1630126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
16319f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		case 6000000:
1632126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_6MHZ_IN_HZ;
1633126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
16346cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		default:
1635126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			return -1;
1636126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1637126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1638126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1639126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Compute new sysclock value
1640126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   sysClockFreq = (((incr + 2^23)*bandwidth)/2^21)/1000 */
16416cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		incr += (1 << 23);
16426cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		sysClockInHz = MulDiv32(incr, bandwidth, 1 << 21);
16436cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		sysClockFreq = (u32) (sysClockInHz / 1000);
1644126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* rounding */
16459999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		if ((sysClockInHz % 1000) > 500)
1646126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			sysClockFreq++;
1647126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1648126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Compute clock deviation in ppm */
16496cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		oscClockDeviation = (u16) ((((s32) (sysClockFreq) -
16506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					     (s32)
16516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					     (state->expected_sys_clock_freq)) *
16526cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					    1000000L) /
16536cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					   (s32)
16546cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					   (state->expected_sys_clock_freq));
1655126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1656126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Diff = oscClockDeviation - state->osc_clock_deviation;
16579999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab		/*printk(KERN_INFO "sysclockdiff=%d\n", Diff); */
16586cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (Diff >= -200 && Diff <= 200) {
1659126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->sys_clock_freq = (u16) sysClockFreq;
16606cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if (oscClockDeviation != state->osc_clock_deviation) {
1661126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				if (state->config.osc_deviation) {
16626cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					state->config.osc_deviation(state->priv,
16636cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller								    oscClockDeviation,
16646cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller								    1);
16656cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					state->osc_clock_deviation =
16666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					    oscClockDeviation;
1667126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				}
1668126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1669126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* switch OFF SRMM scan in SC */
167058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, SC_RA_RAM_SAMPLE_RATE_COUNT__A, DRXD_OSCDEV_DONT_SCAN, 0);
167158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
167258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1673126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* overrule FE_IF internal value for
1674126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   proper re-locking */
167558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, SC_RA_RAM_IF_SAVE__AX, state->current_fe_if_incr, 0);
167658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
167758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1678126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->cscd_state = CSCD_SAVED;
1679126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
16806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1681126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
16829999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	return status;
1683126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1684126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1685126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int DRX_Stop(struct drxd_state *state)
1686126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1687126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1688126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
16896cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (state->drxd_state != DRXD_STARTED)
1690126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return 0;
1691126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1692126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
16936cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (state->cscd_state != CSCD_SAVED) {
1694126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 lock;
169558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = DRX_GetLockStatus(state, &lock);
169658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
169758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1698126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1699126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
170058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = StopOC(state);
170158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
170258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
1703126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1704126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->drxd_state = DRXD_STOPPED;
1705126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
170658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = ConfigureMPEGOutput(state, 0);
170758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
170858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
1709126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
17106cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (state->type_A) {
1711126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Stop relevant processors off the device */
171258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, EC_OD_REG_COMM_EXEC__A, 0x0000, 0x0000);
171358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
171458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1715126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
171658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, SC_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
171758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
171858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
171958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, LC_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
172058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
172158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1722126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
1723126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Stop all processors except HI & CC & FE */
172458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_SC_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
172558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
172658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
172758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_LC_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
172858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
172958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
173058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_FT_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
173158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
173258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
173358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_CP_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
173458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
173558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
173658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_CE_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
173758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
173858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
173958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_EQ_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
174058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
174158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
174258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, EC_OD_REG_COMM_EXEC__A, 0x0000, 0);
174358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
174458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1745126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1746126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
17476cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1748126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1749126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1750126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1751126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerint SetOperationMode(struct drxd_state *state, int oMode)
1752126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1753126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1754126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1755126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1756126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->drxd_state != DRXD_STOPPED) {
1757126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = -1;
1758126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1759126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1760126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1761126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (oMode == state->operation_mode) {
1762126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = 0;
1763126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1764126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1765126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1766126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (oMode != OM_Default && !state->diversity) {
1767126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = -1;
1768126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1769126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1770126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
17716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		switch (oMode) {
1772126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case OM_DVBT_Diversity_Front:
17736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			status = WriteTable(state, state->m_InitDiversityFront);
1774126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1775126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case OM_DVBT_Diversity_End:
17766cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			status = WriteTable(state, state->m_InitDiversityEnd);
1777126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1778126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case OM_Default:
1779126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* We need to check how to
1780126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   get DRXD out of diversity */
1781126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
1782126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = WriteTable(state, state->m_DisableDiversity);
1783126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1784126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
17856cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1786126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1787126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (!status)
1788126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->operation_mode = oMode;
1789126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1790126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1791126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1792126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int StartDiversity(struct drxd_state *state)
1793126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
17946cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status = 0;
1795126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 rcControl;
1796126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1797126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1798126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->operation_mode == OM_DVBT_Diversity_Front) {
179958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = WriteTable(state, state->m_StartDiversityFront);
180058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
180158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
18026cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		} else if (state->operation_mode == OM_DVBT_Diversity_End) {
180358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = WriteTable(state, state->m_StartDiversityEnd);
180458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
180558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
18069f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab			if (state->props.bandwidth_hz == 8000000) {
180758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = WriteTable(state, state->m_DiversityDelay8MHZ);
180858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
180958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
1810126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			} else {
181158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = WriteTable(state, state->m_DiversityDelay6MHZ);
181258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
181358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
1814126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1815126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
181658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, B_EQ_REG_RC_SEL_CAR__A, &rcControl, 0);
181758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
181858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1819126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			rcControl &= ~(B_EQ_REG_RC_SEL_CAR_FFTMODE__M);
1820126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			rcControl |= B_EQ_REG_RC_SEL_CAR_DIV_ON |
18216cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    /*  combining enabled */
18226cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    B_EQ_REG_RC_SEL_CAR_MEAS_A_CC |
18236cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    B_EQ_REG_RC_SEL_CAR_PASS_A_CC |
18246cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    B_EQ_REG_RC_SEL_CAR_LOCAL_A_CC;
182558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_EQ_REG_RC_SEL_CAR__A, rcControl, 0);
182658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
182758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1828126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
18296cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1830126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1831126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1832126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1833126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetFrequencyShift(struct drxd_state *state,
1834126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			     u32 offsetFreq, int channelMirrored)
1835126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1836126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int negativeShift = (state->tuner_mirrors == channelMirrored);
1837126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1838126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Handle all mirroring
1839126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 *
1840126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 * Note: ADC mirroring (aliasing) is implictly handled by limiting
1841126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 * feFsRegAddInc to 28 bits below
1842126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 * (if the result before masking is more than 28 bits, this means
1843126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 *  that the ADC is mirroring.
1844126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 * The masking is in fact the aliasing of the ADC)
1845126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 *
1846126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 */
1847126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1848126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Compute register value, unsigned computation */
18496cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->fe_fs_add_incr = MulDiv32(state->intermediate_freq +
1850126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 offsetFreq,
18516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					 1 << 28, state->sys_clock_freq);
1852126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Remove integer part */
1853126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->fe_fs_add_incr &= 0x0FFFFFFFL;
18549999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	if (negativeShift)
18556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->fe_fs_add_incr = ((1 << 28) - state->fe_fs_add_incr);
1856126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1857126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Save the frequency shift without tunerOffset compensation
1858126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	   for CtrlGetChannel. */
18596cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->org_fe_fs_add_incr = MulDiv32(state->intermediate_freq,
18606cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					     1 << 28, state->sys_clock_freq);
1861126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Remove integer part */
1862126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->org_fe_fs_add_incr &= 0x0FFFFFFFL;
1863126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (negativeShift)
18646cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->org_fe_fs_add_incr = ((1L << 28) -
1865126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					     state->org_fe_fs_add_incr);
1866126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1867126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return Write32(state, FE_FS_REG_ADD_INC_LOP__A,
1868126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		       state->fe_fs_add_incr, 0);
1869126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1870126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
18716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int SetCfgNoiseCalibration(struct drxd_state *state,
18726cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				  struct SNoiseCal *noiseCal)
1873126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1874126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 beOptEna;
18756cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status = 0;
1876126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1877126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
187858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Read16(state, SC_RA_RAM_BE_OPT_ENA__A, &beOptEna, 0);
187958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
188058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
18816cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (noiseCal->cpOpt) {
1882126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			beOptEna |= (1 << SC_RA_RAM_BE_OPT_ENA_CP_OPT);
1883126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
1884126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			beOptEna &= ~(1 << SC_RA_RAM_BE_OPT_ENA_CP_OPT);
188558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, CP_REG_AC_NEXP_OFFS__A, noiseCal->cpNexpOfs, 0);
188658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
188758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1888126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
188958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, SC_RA_RAM_BE_OPT_ENA__A, beOptEna, 0);
189058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
189158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
1892126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
18936cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (!state->type_A) {
189458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_SC_RA_RAM_CO_TD_CAL_2K__A, noiseCal->tdCal2k, 0);
189558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
189658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
189758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, B_SC_RA_RAM_CO_TD_CAL_8K__A, noiseCal->tdCal8k, 0);
189858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
189958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1900126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
19016cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
1902126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1903126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1904126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1905126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1906126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int DRX_Start(struct drxd_state *state, s32 off)
1907126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
19089f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab	struct dtv_frontend_properties *p = &state->props;
1909126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1910126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
19116cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 transmissionParams = 0;
19126cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 operationMode = 0;
19136cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qpskTdTpsPwr = 0;
19146cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qam16TdTpsPwr = 0;
19156cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qam64TdTpsPwr = 0;
19166cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 feIfIncr = 0;
19176cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 bandwidth = 0;
1918126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int mirrorFreqSpect;
1919126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
19206cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qpskSnCeGain = 0;
19216cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qam16SnCeGain = 0;
19226cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qam64SnCeGain = 0;
19236cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qpskIsGainMan = 0;
19246cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qam16IsGainMan = 0;
19256cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qam64IsGainMan = 0;
19266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qpskIsGainExp = 0;
19276cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qam16IsGainExp = 0;
19286cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 qam64IsGainExp = 0;
19296cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u16 bandwidthParam = 0;
19306cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
19316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (off < 0)
19326cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		off = (off - 500) / 1000;
1933126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
19346cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		off = (off + 500) / 1000;
1935126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1936126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1937126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->drxd_state != DRXD_STOPPED)
1938126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			return -1;
193958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = ResetECOD(state);
194058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
194158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
1942126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->type_A) {
194358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = InitSC(state);
194458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
194558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1946126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
194758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = InitFT(state);
194858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
194958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
195058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = InitCP(state);
195158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
195258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
195358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = InitCE(state);
195458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
195558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
195658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = InitEQ(state);
195758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
195858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
195958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = InitSC(state);
196058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
196158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
1962126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1963126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1964126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Restore current IF & RF AGC settings */
1965126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
196658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SetCfgIfAgc(state, &state->if_agc_cfg);
196758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
196858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
196958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SetCfgRfAgc(state, &state->rf_agc_cfg);
197058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
197158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
1972126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
19739f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		mirrorFreqSpect = (state->props.inversion == INVERSION_ON);
1974126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1975126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch (p->transmission_mode) {
19766cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		default:	/* Not set, detect it automatically */
1977126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_MODE__M;
1978126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* fall through , try first guess DRX_FFTMODE_8K */
19796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		case TRANSMISSION_MODE_8K:
1980126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_MODE_8K;
1981126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
198258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_TR_MODE__A, EC_SB_REG_TR_MODE_8K, 0x0000);
198358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
198458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
19856cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskSnCeGain = 99;
1986126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16SnCeGain = 83;
1987126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64SnCeGain = 67;
1988126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1989126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
19906cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		case TRANSMISSION_MODE_2K:
1991126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_MODE_2K;
1992126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
199358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_TR_MODE__A, EC_SB_REG_TR_MODE_2K, 0x0000);
199458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
199558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
19966cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskSnCeGain = 97;
1997126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16SnCeGain = 71;
1998126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64SnCeGain = 65;
1999126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2000126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2001126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2002126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
20036cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		switch (p->guard_interval) {
2004126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case GUARD_INTERVAL_1_4:
2005126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_4;
2006126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2007126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case GUARD_INTERVAL_1_8:
2008126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_8;
2009126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2010126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case GUARD_INTERVAL_1_16:
2011126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_16;
2012126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2013126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case GUARD_INTERVAL_1_32:
2014126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_32;
2015126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
20166cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		default:	/* Not set, detect it automatically */
2017126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_GUARD__M;
2018126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* try first guess 1/4 */
2019126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_4;
2020126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2021126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2022126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
20239f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		switch (p->hierarchy) {
2024126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case HIERARCHY_1:
2025126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_HIER_A1;
2026126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
202758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_OT_ALPHA__A, 0x0001, 0x0000);
202858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
202958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
203058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_ALPHA__A, 0x0001, 0x0000);
203158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
203258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2033126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
20346cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskTdTpsPwr = EQ_TD_TPS_PWR_UNKNOWN;
2035126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16TdTpsPwr = EQ_TD_TPS_PWR_QAM16_ALPHA1;
2036126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64TdTpsPwr = EQ_TD_TPS_PWR_QAM64_ALPHA1;
2037126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
20386cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskIsGainMan =
20396cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_MAN__PRE;
2040126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainMan =
20416cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_16QAM_MAN__PRE;
2042126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainMan =
20436cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_64QAM_MAN__PRE;
2044126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
20456cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskIsGainExp =
20466cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_EXP__PRE;
2047126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainExp =
20486cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_16QAM_EXP__PRE;
2049126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainExp =
20506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_64QAM_EXP__PRE;
2051126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2052126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2053126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2054126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case HIERARCHY_2:
2055126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_HIER_A2;
2056126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
205758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_OT_ALPHA__A, 0x0002, 0x0000);
205858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
205958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
206058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_ALPHA__A, 0x0002, 0x0000);
206158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
206258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2063126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
20646cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskTdTpsPwr = EQ_TD_TPS_PWR_UNKNOWN;
2065126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16TdTpsPwr = EQ_TD_TPS_PWR_QAM16_ALPHA2;
2066126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64TdTpsPwr = EQ_TD_TPS_PWR_QAM64_ALPHA2;
2067126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2068126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskIsGainMan =
20696cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_MAN__PRE;
2070126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainMan =
20716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_16QAM_A2_MAN__PRE;
2072126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainMan =
20736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_64QAM_A2_MAN__PRE;
2074126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
20756cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskIsGainExp =
20766cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_EXP__PRE;
2077126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainExp =
20786cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_16QAM_A2_EXP__PRE;
2079126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainExp =
20806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_64QAM_A2_EXP__PRE;
2081126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2082126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2083126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case HIERARCHY_4:
2084126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_HIER_A4;
2085126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
208658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_OT_ALPHA__A, 0x0003, 0x0000);
208758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
208858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
208958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_ALPHA__A, 0x0003, 0x0000);
209058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
209158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2092126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
20936cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskTdTpsPwr = EQ_TD_TPS_PWR_UNKNOWN;
2094126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16TdTpsPwr = EQ_TD_TPS_PWR_QAM16_ALPHA4;
2095126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64TdTpsPwr = EQ_TD_TPS_PWR_QAM64_ALPHA4;
2096126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
20976cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskIsGainMan =
20986cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_MAN__PRE;
2099126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainMan =
21006cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_16QAM_A4_MAN__PRE;
2101126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainMan =
21026cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_64QAM_A4_MAN__PRE;
2103126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
21046cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskIsGainExp =
21056cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_EXP__PRE;
2106126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainExp =
21076cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_16QAM_A4_EXP__PRE;
2108126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainExp =
21096cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_64QAM_A4_EXP__PRE;
2110126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2111126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2112126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case HIERARCHY_AUTO:
2113126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
2114126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Not set, detect it automatically, start with none */
2115126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_HIER__M;
2116126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_HIER_NO;
2117126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
211858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_OT_ALPHA__A, 0x0000, 0x0000);
211958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
212058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
212158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_ALPHA__A, 0x0000, 0x0000);
212258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
212358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2124126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
21256cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskTdTpsPwr = EQ_TD_TPS_PWR_QPSK;
2126126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16TdTpsPwr = EQ_TD_TPS_PWR_QAM16_ALPHAN;
2127126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64TdTpsPwr = EQ_TD_TPS_PWR_QAM64_ALPHAN;
2128126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
21296cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskIsGainMan =
21306cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_QPSK_MAN__PRE;
2131126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainMan =
21326cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_16QAM_MAN__PRE;
2133126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainMan =
21346cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_64QAM_MAN__PRE;
2135126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
21366cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				qpskIsGainExp =
21376cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_QPSK_EXP__PRE;
2138126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainExp =
21396cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_16QAM_EXP__PRE;
2140126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainExp =
21416cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    SC_RA_RAM_EQ_IS_GAIN_64QAM_EXP__PRE;
2142126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2143126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2144126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
214558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = status;
214658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
214758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2148126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
21499f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		switch (p->modulation) {
2150126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
2151126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_CONST__M;
2152126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* fall through , try first guess
2153126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   DRX_CONSTELLATION_QAM64 */
2154126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case QAM_64:
2155126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_CONST_QAM64;
2156126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
215758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_OT_CONST__A, 0x0002, 0x0000);
215858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
215958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
216058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_CONST__A, EC_SB_REG_CONST_64QAM, 0x0000);
216158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
216258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
216358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_SCALE_MSB__A, 0x0020, 0x0000);
216458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
216558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
216658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_SCALE_BIT2__A, 0x0008, 0x0000);
216758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
216858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
216958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_SCALE_LSB__A, 0x0002, 0x0000);
217058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
217158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
217258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab
217358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_TD_TPS_PWR_OFS__A, qam64TdTpsPwr, 0x0000);
217458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
217558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
217658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_SN_CEGAIN__A, qam64SnCeGain, 0x0000);
217758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
217858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
217958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_IS_GAIN_MAN__A, qam64IsGainMan, 0x0000);
218058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
218158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
218258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_IS_GAIN_EXP__A, qam64IsGainExp, 0x0000);
218358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
218458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2185126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2186126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
21876cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		case QPSK:
2188126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_CONST_QPSK;
2189126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
219058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_OT_CONST__A, 0x0000, 0x0000);
219158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
219258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
219358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_CONST__A, EC_SB_REG_CONST_QPSK, 0x0000);
219458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
219558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
219658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_SCALE_MSB__A, 0x0010, 0x0000);
219758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
219858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
219958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_SCALE_BIT2__A, 0x0000, 0x0000);
220058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
220158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
220258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_SCALE_LSB__A, 0x0000, 0x0000);
220358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
220458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
220558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab
220658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_TD_TPS_PWR_OFS__A, qpskTdTpsPwr, 0x0000);
220758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
220858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
220958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_SN_CEGAIN__A, qpskSnCeGain, 0x0000);
221058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
221158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
221258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_IS_GAIN_MAN__A, qpskIsGainMan, 0x0000);
221358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
221458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
221558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_IS_GAIN_EXP__A, qpskIsGainExp, 0x0000);
221658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
221758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2218126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2219126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2220126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2221126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case QAM_16:
2222126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_CONST_QAM16;
2223126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
222458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_OT_CONST__A, 0x0001, 0x0000);
222558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
222658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
222758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_CONST__A, EC_SB_REG_CONST_16QAM, 0x0000);
222858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
222958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
223058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_SCALE_MSB__A, 0x0010, 0x0000);
223158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
223258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
223358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_SCALE_BIT2__A, 0x0004, 0x0000);
223458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
223558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
223658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_SB_REG_SCALE_LSB__A, 0x0000, 0x0000);
223758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
223858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
223958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab
224058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_TD_TPS_PWR_OFS__A, qam16TdTpsPwr, 0x0000);
224158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
224258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
224358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_SN_CEGAIN__A, qam16SnCeGain, 0x0000);
224458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
224558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
224658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_IS_GAIN_MAN__A, qam16IsGainMan, 0x0000);
224758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
224858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
224958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EQ_REG_IS_GAIN_EXP__A, qam16IsGainExp, 0x0000);
225058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
225158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2252126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2253126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2254126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2255126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
225658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = status;
225758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
225858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2259126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2260126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch (DRX_CHANNEL_HIGH) {
2261126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
2262126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case DRX_CHANNEL_AUTO:
2263126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case DRX_CHANNEL_LOW:
2264126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_PRIO_LO;
226558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, EC_SB_REG_PRIOR__A, EC_SB_REG_PRIOR_LO, 0x0000);
226658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
226758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2268126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2269126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case DRX_CHANNEL_HIGH:
2270126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_PRIO_HI;
227158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, EC_SB_REG_PRIOR__A, EC_SB_REG_PRIOR_HI, 0x0000);
227258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
227358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2274126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2275126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2276126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2277126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
22786cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		switch (p->code_rate_HP) {
2279126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case FEC_1_2:
2280126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_1_2;
2281126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
228258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C1_2, 0x0000);
228358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
228458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2285126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2286126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2287126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
2288126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_RATE__M;
22896cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		case FEC_2_3:
2290126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_2_3;
2291126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
229258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C2_3, 0x0000);
229358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
229458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2295126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2296126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
22976cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		case FEC_3_4:
2298126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_3_4;
2299126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
230058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C3_4, 0x0000);
230158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
230258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2303126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2304126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
23056cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		case FEC_5_6:
2306126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_5_6;
2307126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
230858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C5_6, 0x0000);
230958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
231058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2311126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2312126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
23136cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		case FEC_7_8:
2314126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_7_8;
2315126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
231658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C7_8, 0x0000);
231758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				if (status < 0)
231858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab					break;
2319126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2320126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2321126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
232258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = status;
232358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
232458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2325126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2326126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* First determine real bandwidth (Hz) */
2327126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Also set delay for impulse noise cruncher (only A2) */
2328126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Also set parameters for EC_OC fix, note
2329126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   EC_OC_REG_TMD_HIL_MAR is changed
2330126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   by SC for fix for some 8K,1/8 guard but is restored by
2331126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   InitEC and ResetEC
2332126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   functions */
23339f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		switch (p->bandwidth_hz) {
23349f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		case 0:
23359f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab			p->bandwidth_hz = 8000000;
23369f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab			/* fall through */
23379f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		case 8000000:
2338126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* (64/7)*(8/8)*1000000 */
2339126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_8MHZ_IN_HZ;
2340126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2341126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidthParam = 0;
2342126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = Write16(state,
23436cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					 FE_AG_REG_IND_DEL__A, 50, 0x0000);
2344126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
23459f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		case 7000000:
2346126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* (64/7)*(7/8)*1000000 */
2347126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_7MHZ_IN_HZ;
23486cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			bandwidthParam = 0x4807;	/*binary:0100 1000 0000 0111 */
2349126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = Write16(state,
23506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					 FE_AG_REG_IND_DEL__A, 59, 0x0000);
2351126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
23529f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab		case 6000000:
2353126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* (64/7)*(6/8)*1000000 */
2354126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_6MHZ_IN_HZ;
23556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			bandwidthParam = 0x0F07;	/*binary: 0000 1111 0000 0111 */
2356126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = Write16(state,
23576cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					 FE_AG_REG_IND_DEL__A, 71, 0x0000);
2358126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
235963952e8c4ae7f3272cd37321a71428f3637f650fAndreas Oberritter		default:
236063952e8c4ae7f3272cd37321a71428f3637f650fAndreas Oberritter			status = -EINVAL;
2361126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
236258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
236358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2364126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
236558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, SC_RA_RAM_BAND__A, bandwidthParam, 0x0000);
236658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
236758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2368126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2369126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
2370126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 sc_config;
237158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Read16(state, SC_RA_RAM_CONFIG__A, &sc_config, 0);
237258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
237358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2374126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2375126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* enable SLAVE mode in 2k 1/32 to
2376126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   prevent timing change glitches */
23776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if ((p->transmission_mode == TRANSMISSION_MODE_2K) &&
23786cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    (p->guard_interval == GUARD_INTERVAL_1_32)) {
2379126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				/* enable slave */
2380126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				sc_config |= SC_RA_RAM_CONFIG_SLAVE__M;
2381126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			} else {
2382126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				/* disable slave */
2383126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				sc_config &= ~SC_RA_RAM_CONFIG_SLAVE__M;
2384126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
238558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, SC_RA_RAM_CONFIG__A, sc_config, 0);
238658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
238758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2388126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2389126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
239058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SetCfgNoiseCalibration(state, &state->noise_cal);
239158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
239258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2393126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
23946cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (state->cscd_state == CSCD_INIT) {
2395126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* switch on SRMM scan in SC */
239658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, SC_RA_RAM_SAMPLE_RATE_COUNT__A, DRXD_OSCDEV_DO_SCAN, 0x0000);
239758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
239858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
239958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab/*            CHK_ERROR(Write16(SC_RA_RAM_SAMPLE_RATE_STEP__A, DRXD_OSCDEV_STEP, 0x0000));*/
2400126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->cscd_state = CSCD_SET;
2401126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2402126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2403126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Now compute FE_IF_REG_INCR */
2404126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/*((( SysFreq/BandWidth)/2)/2) -1) * 2^23) =>
24056cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		   ((SysFreq / BandWidth) * (2^21) ) - (2^23) */
24066cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		feIfIncr = MulDiv32(state->sys_clock_freq * 1000,
24076cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				    (1ULL << 21), bandwidth) - (1 << 23);
240858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, FE_IF_REG_INCR0__A, (u16) (feIfIncr & FE_IF_REG_INCR0__M), 0x0000);
240958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
241058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
241158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, FE_IF_REG_INCR1__A, (u16) ((feIfIncr >> FE_IF_REG_INCR0__W) & FE_IF_REG_INCR1__M), 0x0000);
241258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
241358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2414126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Bandwidth setting done */
2415126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2416126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Mirror & frequency offset */
2417126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		SetFrequencyShift(state, off, mirrorFreqSpect);
2418126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2419126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Start SC, write channel settings to SC */
2420126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2421126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Enable SC after setting all other parameters */
242258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, SC_COMM_STATE__A, 0, 0x0000);
242358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
242458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
242558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, SC_COMM_EXEC__A, 1, 0x0000);
242658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
242758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2428126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2429126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Write SC parameter registers, operation mode */
2430126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#if 1
24316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		operationMode = (SC_RA_RAM_OP_AUTO_MODE__M |
24326cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				 SC_RA_RAM_OP_AUTO_GUARD__M |
24336cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				 SC_RA_RAM_OP_AUTO_CONST__M |
24346cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				 SC_RA_RAM_OP_AUTO_HIER__M |
24356cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				 SC_RA_RAM_OP_AUTO_RATE__M);
2436126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
243758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SC_SetPrefParamCommand(state, 0x0000, transmissionParams, operationMode);
243858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
243958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2440126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2441126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Start correct processes to get in lock */
244258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SC_ProcStartCommand(state, SC_RA_RAM_PROC_LOCKTRACK, SC_RA_RAM_SW_EVENT_RUN_NMASK__M, SC_RA_RAM_LOCKTRACK_MIN);
244358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
244458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2445126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
244658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = StartOC(state);
244758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
244858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2449126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
24506cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (state->operation_mode != OM_Default) {
245158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = StartDiversity(state);
245258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
245358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2454126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2455126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2456126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->drxd_state = DRXD_STARTED;
24576cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	} while (0);
2458126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2459126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
2460126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2461126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2462126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int CDRXD(struct drxd_state *state, u32 IntermediateFrequency)
2463126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2464126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcOutputLevel = 0xffffffff;
24656cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulRfAgcSettleLevel = 528;	/* Optimum value for MT2060 */
24666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulRfAgcMinLevel = 0;	/* Currently unused */
24676cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulRfAgcMaxLevel = DRXD_FE_CTRL_MAX;	/* Currently unused */
24686cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulRfAgcSpeed = 0;	/* Currently unused */
24696cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulRfAgcMode = 0;	/*2;   Off */
24706cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulRfAgcR1 = 820;
2471126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcR2 = 2200;
24726cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulRfAgcR3 = 150;
24736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulIfAgcMode = 0;	/* Auto */
2474126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcOutputLevel = 0xffffffff;
2475126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcSettleLevel = 0xffffffff;
2476126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcMinLevel = 0xffffffff;
2477126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcMaxLevel = 0xffffffff;
2478126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcSpeed = 0xffffffff;
24796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulIfAgcR1 = 820;
2480126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcR2 = 2200;
24816cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulIfAgcR3 = 150;
2482126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulClock = state->config.clock;
2483126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulSerialMode = 0;
24846cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulEcOcRegOcModeLop = 4;	/* Dynamic DTO source */
2485126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulHiI2cDelay = HI_I2C_DELAY;
2486126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulHiI2cBridgeDelay = HI_I2C_BRIDGE_DELAY;
2487126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulHiI2cPatch = 0;
24886cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	u32 ulEnvironment = APPENV_PORTABLE;
2489126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulEnvironmentDiversity = APPENV_MOBILE;
2490126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIFFilter = IFFILTER_SAW;
2491126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
24926cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->if_agc_cfg.ctrlMode = AGC_CTRL_AUTO;
2493126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.outputLevel = 0;
2494126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.settleLevel = 140;
2495126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.minOutputLevel = 0;
2496126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.maxOutputLevel = 1023;
2497126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.speed = 904;
2498126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
24996cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (ulIfAgcMode == 1 && ulIfAgcOutputLevel <= DRXD_FE_CTRL_MAX) {
25006cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->if_agc_cfg.ctrlMode = AGC_CTRL_USER;
25016cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->if_agc_cfg.outputLevel = (u16) (ulIfAgcOutputLevel);
2502126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2503126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
25046cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (ulIfAgcMode == 0 &&
2505126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulIfAgcSettleLevel <= DRXD_FE_CTRL_MAX &&
2506126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulIfAgcMinLevel <= DRXD_FE_CTRL_MAX &&
2507126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulIfAgcMaxLevel <= DRXD_FE_CTRL_MAX &&
25086cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	    ulIfAgcSpeed <= DRXD_FE_CTRL_MAX) {
25096cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->if_agc_cfg.ctrlMode = AGC_CTRL_AUTO;
25106cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->if_agc_cfg.settleLevel = (u16) (ulIfAgcSettleLevel);
25116cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->if_agc_cfg.minOutputLevel = (u16) (ulIfAgcMinLevel);
25126cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->if_agc_cfg.maxOutputLevel = (u16) (ulIfAgcMaxLevel);
25136cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->if_agc_cfg.speed = (u16) (ulIfAgcSpeed);
2514126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2515126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
25166cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->if_agc_cfg.R1 = (u16) (ulIfAgcR1);
25176cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->if_agc_cfg.R2 = (u16) (ulIfAgcR2);
25186cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->if_agc_cfg.R3 = (u16) (ulIfAgcR3);
2519126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
25206cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->rf_agc_cfg.R1 = (u16) (ulRfAgcR1);
25216cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->rf_agc_cfg.R2 = (u16) (ulRfAgcR2);
25226cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->rf_agc_cfg.R3 = (u16) (ulRfAgcR3);
2523126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
25246cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->rf_agc_cfg.ctrlMode = AGC_CTRL_AUTO;
2525126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* rest of the RFAgcCfg structure currently unused */
25266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (ulRfAgcMode == 1 && ulRfAgcOutputLevel <= DRXD_FE_CTRL_MAX) {
25276cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->rf_agc_cfg.ctrlMode = AGC_CTRL_USER;
25286cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->rf_agc_cfg.outputLevel = (u16) (ulRfAgcOutputLevel);
2529126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2530126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
25316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (ulRfAgcMode == 0 &&
2532126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulRfAgcSettleLevel <= DRXD_FE_CTRL_MAX &&
2533126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulRfAgcMinLevel <= DRXD_FE_CTRL_MAX &&
2534126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulRfAgcMaxLevel <= DRXD_FE_CTRL_MAX &&
25356cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	    ulRfAgcSpeed <= DRXD_FE_CTRL_MAX) {
25366cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->rf_agc_cfg.ctrlMode = AGC_CTRL_AUTO;
25376cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->rf_agc_cfg.settleLevel = (u16) (ulRfAgcSettleLevel);
25386cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->rf_agc_cfg.minOutputLevel = (u16) (ulRfAgcMinLevel);
25396cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->rf_agc_cfg.maxOutputLevel = (u16) (ulRfAgcMaxLevel);
25406cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->rf_agc_cfg.speed = (u16) (ulRfAgcSpeed);
2541126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2542126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
25439999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	if (ulRfAgcMode == 2)
25446cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->rf_agc_cfg.ctrlMode = AGC_CTRL_OFF;
2545126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2546126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (ulEnvironment <= 2)
25476cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->app_env_default = (enum app_env)
25486cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    (ulEnvironment);
2549126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (ulEnvironmentDiversity <= 2)
2550126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->app_env_diversity = (enum app_env)
25516cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    (ulEnvironmentDiversity);
2552126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
25536cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (ulIFFilter == IFFILTER_DISCRETE) {
2554126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* discrete filter */
25556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->noise_cal.cpOpt = 0;
25566cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->noise_cal.cpNexpOfs = 40;
25576cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->noise_cal.tdCal2k = -40;
25586cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->noise_cal.tdCal8k = -24;
2559126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} else {
2560126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* SAW filter */
25616cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->noise_cal.cpOpt = 1;
25626cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->noise_cal.cpNexpOfs = 0;
25636cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->noise_cal.tdCal2k = -21;
25646cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->noise_cal.tdCal8k = -24;
2565126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
25666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->m_EcOcRegOcModeLop = (u16) (ulEcOcRegOcModeLop);
25676cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller
25686cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->chip_adr = (state->config.demod_address << 1) | 1;
25696cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	switch (ulHiI2cPatch) {
25706cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	case 1:
25716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_HiI2cPatch = DRXD_HiI2cPatch_1;
25726cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		break;
25736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	case 3:
25746cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->m_HiI2cPatch = DRXD_HiI2cPatch_3;
25756cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		break;
2576126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	default:
2577126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->m_HiI2cPatch = NULL;
2578126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2579126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2580126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* modify tuner and clock attributes */
25816cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->intermediate_freq = (u16) (IntermediateFrequency / 1000);
2582126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* expected system clock frequency in kHz */
2583126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->expected_sys_clock_freq = 48000;
2584126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* real system clock frequency in kHz */
2585126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->sys_clock_freq = 48000;
25866cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->osc_clock_freq = (u16) ulClock;
2587126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->osc_clock_deviation = 0;
2588126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->cscd_state = CSCD_INIT;
2589126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->drxd_state = DRXD_UNINITIALIZED;
2590126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
25916cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->PGA = 0;
25926cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->type_A = 0;
25936cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->tuner_mirrors = 0;
2594126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2595126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* modify MPEG output attributes */
2596ba96796544f3bfc53a3269f0cf65651e349f8033Devin Heitmueller	state->insert_rs_byte = state->config.insert_rs_byte;
2597126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->enable_parallel = (ulSerialMode != 1);
2598126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2599126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Timing div, 250ns/Psys */
2600126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */
2601126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
26026cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->hi_cfg_timing_div = (u16) ((state->sys_clock_freq / 1000) *
26036cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					  ulHiI2cDelay) / 1000;
2604126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Bridge delay, uses oscilator clock */
2605126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */
26066cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->hi_cfg_bridge_delay = (u16) ((state->osc_clock_freq / 1000) *
26076cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller					    ulHiI2cBridgeDelay) / 1000;
2608126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2609126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->m_FeAgRegAgPwd = DRXD_DEF_AG_PWD_CONSUMER;
2610126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* state->m_FeAgRegAgPwd = DRXD_DEF_AG_PWD_PRO; */
2611126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->m_FeAgRegAgAgcSio = DRXD_DEF_AG_AGC_SIO;
2612126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2613126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2614126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
26156cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerint DRXD_init(struct drxd_state *state, const u8 * fw, u32 fw_size)
2616126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
26176cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int status = 0;
2618126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 driverVersion;
2619126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2620126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (state->init_done)
2621126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return 0;
2622126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2623126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	CDRXD(state, state->config.IF ? state->config.IF : 36000000);
2624126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2625126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
2626126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->operation_mode = OM_Default;
2627126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
262858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SetDeviceTypeId(state);
262958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
263058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2631126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2632126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Apply I2c address patch to B1 */
26336cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		if (!state->type_A && state->m_HiI2cPatch != NULL)
263458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = WriteTable(state, state->m_HiI2cPatch);
263558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
263658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2637126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2638126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->type_A) {
2639126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* HI firmware patch for UIO readout,
2640126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   avoid clearing of result register */
264158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = Write16(state, 0x43012D, 0x047f, 0);
264258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
264358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2644126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2645126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
264658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = HI_ResetCommand(state);
264758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
264858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2649126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
265058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = StopAllProcessors(state);
265158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
265258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
265358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitCC(state);
265458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
265558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2656126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2657126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->osc_clock_deviation = 0;
2658126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2659126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->config.osc_deviation)
2660126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->osc_clock_deviation =
26616cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    state->config.osc_deviation(state->priv, 0, 0);
2662126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
2663126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Handle clock deviation */
2664126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			s32 devB;
26656cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			s32 devA = (s32) (state->osc_clock_deviation) *
26666cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    (s32) (state->expected_sys_clock_freq);
2667126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* deviation in kHz */
26686cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			s32 deviation = (devA / (1000000L));
2669126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* rounding, signed */
26706cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if (devA > 0)
26716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				devB = (2);
2672126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			else
26736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				devB = (-2);
26746cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			if ((devB * (devA % 1000000L) > 1000000L)) {
2675126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				/* add +1 or -1 */
26766cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				deviation += (devB / 2);
2677126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2678126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
26796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			state->sys_clock_freq =
26806cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			    (u16) ((state->expected_sys_clock_freq) +
26816cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				   deviation);
2682126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
268358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitHI(state);
268458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
268558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
268658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitAtomicRead(state);
268758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
268858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2689126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
269058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = EnableAndResetMB(state);
269158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
269258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2693126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->type_A)
269458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = ResetCEFR(state);
269558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
269658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2697126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2698126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (fw) {
269958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = DownloadMicrocode(state, fw, fw_size);
270058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
270158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2702126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
270358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			status = DownloadMicrocode(state, state->microcode, state->microcode_length);
270458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			if (status < 0)
270558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab				break;
2706126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2707126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2708126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->PGA) {
2709126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->m_FeAgRegAgPwd = DRXD_DEF_AG_PWD_PRO;
27106cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller			SetCfgPga(state, 0);	/* PGA = 0 dB */
2711126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
2712126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->m_FeAgRegAgPwd = DRXD_DEF_AG_PWD_CONSUMER;
2713126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2714126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2715126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->m_FeAgRegAgAgcSio = DRXD_DEF_AG_AGC_SIO;
2716126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
271758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitFE(state);
271858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
271958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
272058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitFT(state);
272158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
272258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
272358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitCP(state);
272458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
272558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
272658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitCE(state);
272758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
272858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
272958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitEQ(state);
273058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
273158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
273258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitEC(state);
273358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
273458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
273558d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = InitSC(state);
273658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
273758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2738126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
273958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SetCfgIfAgc(state, &state->if_agc_cfg);
274058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
274158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
274258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = SetCfgRfAgc(state, &state->rf_agc_cfg);
274358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
274458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2745126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2746126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->cscd_state = CSCD_INIT;
274758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, SC_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
274858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
274958d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
275058d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write16(state, LC_COMM_EXEC__A, SC_COMM_EXEC_CTL_STOP, 0);
275158d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
275258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2753126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
27546cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		driverVersion = (((VERSION_MAJOR / 10) << 4) +
27556cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				 (VERSION_MAJOR % 10)) << 24;
27566cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		driverVersion += (((VERSION_MINOR / 10) << 4) +
27576cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				  (VERSION_MINOR % 10)) << 16;
27586cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		driverVersion += ((VERSION_PATCH / 1000) << 12) +
27596cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    ((VERSION_PATCH / 100) << 8) +
27606cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		    ((VERSION_PATCH / 10) << 4) + (VERSION_PATCH % 10);
2761126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
276258d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = Write32(state, SC_RA_RAM_DRIVER_VERSION__AX, driverVersion, 0);
276358d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
276458d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2765126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
276658d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		status = StopOC(state);
276758d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab		if (status < 0)
276858d5eaec9f877a9bcfa9b6dca0ea51850975c49fMauro Carvalho Chehab			break;
2769126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2770126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->drxd_state = DRXD_STOPPED;
27716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		state->init_done = 1;
27726cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		status = 0;
2773126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while (0);
2774126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
2775126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2776126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
27776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerint DRXD_status(struct drxd_state *state, u32 * pLockStatus)
2778126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2779126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	DRX_GetLockStatus(state, pLockStatus);
2780126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
27816cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	/*if (*pLockStatus&DRX_LOCK_MPEG) */
27826cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (*pLockStatus & DRX_LOCK_FEC) {
2783126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ConfigureMPEGOutput(state, 1);
2784126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Get status again, in case we have MPEG lock now */
27856cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		/*DRX_GetLockStatus(state, pLockStatus); */
2786126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2787126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2788126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2789126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2790126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2791126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
2792126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
2793126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
2794126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
27956cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int drxd_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
2796126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2797126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state = fe->demodulator_priv;
2798126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 value;
2799126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int res;
2800126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28016cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	res = ReadIFAgc(state, &value);
28026cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (res < 0)
28036cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*strength = 0;
2804126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
28056cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*strength = 0xffff - (value << 4);
2806126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2807126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2808126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28096cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int drxd_read_status(struct dvb_frontend *fe, fe_status_t * status)
2810126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2811126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state = fe->demodulator_priv;
2812126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 lock;
2813126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2814126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	DRXD_status(state, &lock);
28156cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	*status = 0;
2816126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* No MPEG lock in V255 firmware, bug ? */
2817126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#if 1
28186cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (lock & DRX_LOCK_MPEG)
28196cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*status |= FE_HAS_LOCK;
2820126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#else
28216cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (lock & DRX_LOCK_FEC)
28226cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*status |= FE_HAS_LOCK;
2823126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
28246cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (lock & DRX_LOCK_FEC)
28256cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*status |= FE_HAS_VITERBI | FE_HAS_SYNC;
28266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (lock & DRX_LOCK_DEMOD)
28276cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		*status |= FE_HAS_CARRIER | FE_HAS_SIGNAL;
2828126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2829126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2830126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2831126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2832126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_init(struct dvb_frontend *fe)
2833126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
28346cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	struct drxd_state *state = fe->demodulator_priv;
28356cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	int err = 0;
2836126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2837126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/*	if (request_firmware(&state->fw, "drxd.fw", state->dev)<0) */
28386cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	return DRXD_init(state, 0, 0);
2839126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28406cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	err = DRXD_init(state, state->fw->data, state->fw->size);
2841126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	release_firmware(state->fw);
2842126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return err;
2843126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2844126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2845126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerint drxd_config_i2c(struct dvb_frontend *fe, int onoff)
2846126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
28476cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	struct drxd_state *state = fe->demodulator_priv;
2848126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28496b142b3c81e6e532dfad7256fcc7e75fded49245Devin Heitmueller	if (state->config.disable_i2c_gate_ctrl == 1)
28506b142b3c81e6e532dfad7256fcc7e75fded49245Devin Heitmueller		return 0;
28516b142b3c81e6e532dfad7256fcc7e75fded49245Devin Heitmueller
2852126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return DRX_ConfigureI2CBridge(state, onoff);
2853126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
28549999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho ChehabEXPORT_SYMBOL(drxd_config_i2c);
2855126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2856126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_get_tune_settings(struct dvb_frontend *fe,
28576cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller				  struct dvb_frontend_tune_settings *sets)
2858126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
28596cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	sets->min_delay_ms = 10000;
28606cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	sets->max_drift = 0;
28616cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	sets->step_size = 0;
2862126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2863126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2864126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28656cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int drxd_read_ber(struct dvb_frontend *fe, u32 * ber)
2866126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2867126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*ber = 0;
2868126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2869126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2870126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28716cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int drxd_read_snr(struct dvb_frontend *fe, u16 * snr)
2872126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
28736cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	*snr = 0;
2874126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2875126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2876126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28776cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int drxd_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks)
2878126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
28796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	*ucblocks = 0;
2880126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2881126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2882126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28836cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int drxd_sleep(struct dvb_frontend *fe)
2884126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
28856cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	struct drxd_state *state = fe->demodulator_priv;
2886126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2887126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	ConfigureMPEGOutput(state, 0);
2888126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2889126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2890126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28916cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmuellerstatic int drxd_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
2892126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2893126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return drxd_config_i2c(fe, enable);
2894126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2895126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
28969f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehabstatic int drxd_set_frontend(struct dvb_frontend *fe)
2897126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
28989f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
28996cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	struct drxd_state *state = fe->demodulator_priv;
29006cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	s32 off = 0;
2901126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
29029f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab	state->props = *p;
2903126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	DRX_Stop(state);
2904126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2905126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (fe->ops.tuner_ops.set_params) {
290614d24d148c7521b2b88b396652e36f55d061e195Mauro Carvalho Chehab		fe->ops.tuner_ops.set_params(fe);
2907126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (fe->ops.i2c_gate_ctrl)
2908126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			fe->ops.i2c_gate_ctrl(fe, 0);
2909126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2910126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2911126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	msleep(200);
2912126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2913126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return DRX_Start(state, off);
2914126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2915126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2916126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic void drxd_release(struct dvb_frontend *fe)
2917126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2918126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state = fe->demodulator_priv;
2919126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2920126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	kfree(state);
2921126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2922126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2923126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic struct dvb_frontend_ops drxd_ops = {
29249f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab	.delsys = { SYS_DVBT},
2925126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.info = {
29266cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 .name = "Micronas DRXD DVB-T",
29276cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 .frequency_min = 47125000,
29286cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 .frequency_max = 855250000,
29296cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 .frequency_stepsize = 166667,
29306cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 .frequency_tolerance = 0,
29316cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
29326cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
29336cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 FE_CAN_FEC_AUTO |
29346cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 FE_CAN_QAM_16 | FE_CAN_QAM_64 |
29356cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 FE_CAN_QAM_AUTO |
29366cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 FE_CAN_TRANSMISSION_MODE_AUTO |
29376cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 FE_CAN_GUARD_INTERVAL_AUTO |
29386cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller		 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_MUTE_TS},
2939126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2940126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.release = drxd_release,
2941126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.init = drxd_init,
2942126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.sleep = drxd_sleep,
2943126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.i2c_gate_ctrl = drxd_i2c_gate_ctrl,
2944126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
29459f97c288c0656346c984594a6ffc5af8546f47beMauro Carvalho Chehab	.set_frontend = drxd_set_frontend,
2946126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.get_tune_settings = drxd_get_tune_settings,
2947126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2948126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_status = drxd_read_status,
2949126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_ber = drxd_read_ber,
2950126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_signal_strength = drxd_read_signal_strength,
2951126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_snr = drxd_read_snr,
2952126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_ucblocks = drxd_read_ucblocks,
2953126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
2954126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2955126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstruct dvb_frontend *drxd_attach(const struct drxd_config *config,
2956126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 void *priv, struct i2c_adapter *i2c,
2957126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 struct device *dev)
2958126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2959126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state = NULL;
2960126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
29616cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state = kmalloc(sizeof(struct drxd_state), GFP_KERNEL);
2962126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (!state)
2963126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return NULL;
2964126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	memset(state, 0, sizeof(*state));
2965126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2966126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	memcpy(&state->ops, &drxd_ops, sizeof(struct dvb_frontend_ops));
29676cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->dev = dev;
29686cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->config = *config;
29696cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->i2c = i2c;
29706cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->priv = priv;
2971126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2972834751d4365822f769d8af2fd37dc674997a313cMauro Carvalho Chehab	mutex_init(&state->mutex);
2973126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
29746cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	if (Read16(state, 0, 0, 0) < 0)
2975126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		goto error;
2976126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2977126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	memcpy(&state->frontend.ops, &drxd_ops,
2978126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	       sizeof(struct dvb_frontend_ops));
29796cacdd46e23826c0591238f5f11b1bfa6490797dDevin Heitmueller	state->frontend.demodulator_priv = state;
2980126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	ConfigureMPEGOutput(state, 0);
2981126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return &state->frontend;
2982126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2983126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlererror:
29849999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho Chehab	printk(KERN_ERR "drxd: not found\n");
2985126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	kfree(state);
2986126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return NULL;
2987126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
29889999daf446b9fa43b5301af423b6798a600e36bcMauro Carvalho ChehabEXPORT_SYMBOL(drxd_attach);
2989126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2990126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph MetzlerMODULE_DESCRIPTION("DRXD driver");
2991126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph MetzlerMODULE_AUTHOR("Micronas");
2992126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph MetzlerMODULE_LICENSE("GPL");
2993