drxd_hard.c revision 126f1e61887085aa2c2cfa7644aee8295a94e1f7
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 <linux/version.h>
32126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include <asm/div64.h>
33126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
34126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include "dvb_frontend.h"
35126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include "drxd.h"
36126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#include "drxd_firm.h"
37126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
38126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define CHK_ERROR(s) if( (status = s)<0 ) break
39126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define CHUNK_SIZE 48
40126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
41126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_RMW           0x10
42126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_BROADCAST     0x20
43126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_CLEARCRC      0x80
44126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_SINGLE_MASTER 0xC0
45126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_MODEFLAGS     0xC0
46126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_I2C_FLAGS         0xF0
47126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
48126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#ifndef SIZEOF_ARRAY
49126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define SIZEOF_ARRAY(array) (sizeof((array))/sizeof((array)[0]))
50126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
51126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
52126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DEFAULT_LOCK_TIMEOUT    1100
53126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
54126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_CHANNEL_AUTO 0
55126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_CHANNEL_HIGH 1
56126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_CHANNEL_LOW  2
57126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
58126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_LOCK_MPEG  1
59126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_LOCK_FEC   2
60126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define DRX_LOCK_DEMOD 4
61126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
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;
91126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 outputLevel;   /* range [0, ... , 1023], 1/n of fullscale range */
92126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 settleLevel;   /* range [0, ... , 1023], 1/n of fullscale range */
93126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 minOutputLevel;/* range [0, ... , 1023], 1/n of fullscale range */
94126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 maxOutputLevel;/* range [0, ... , 1023], 1/n of fullscale range */
95126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	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;
104126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 cpNexpOfs;
105126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 tdCal2k;
106126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 tdCal8k;
107126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
108126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
109126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerenum app_env {
110126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	APPENV_STATIC = 0,
111126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	APPENV_PORTABLE = 1,
112126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	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;
123126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct dvb_frontend_parameters param;
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;
134126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct semaphore mutex;
135126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
136126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	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/****************************************************************************/
207126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/* I2C **********************************************************************/
208126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
209126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
210126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
211126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
212126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct i2c_msg msg = { .addr=adr, .flags=0, .buf=data, .len=len };
213126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
214126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (i2c_transfer(adap, &msg, 1) != 1)
215126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
216126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
217126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
218126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
219126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int i2c_read(struct i2c_adapter *adap,
220126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    u8 adr, u8 *msg, int len, u8 *answ, int alen)
221126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
222126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct i2c_msg msgs[2] = { { .addr=adr, .flags=0,
223126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				     .buf=msg, .len=len },
224126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   { .addr=adr, .flags=I2C_M_RD,
225126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				     .buf=answ, .len=alen } };
226126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (i2c_transfer(adap, msgs, 2) != 2)
227126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
228126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
229126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
230126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
231126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerinline u32 MulDiv32(u32 a, u32 b, u32 c)
232126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
233126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u64 tmp64;
234126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
235126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	tmp64=(u64)a*(u64)b;
236126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do_div(tmp64, c);
237126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
238126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return (u32) tmp64;
239126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
240126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
241126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int Read16(struct drxd_state *state, u32 reg, u16 *data, u8 flags)
242126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
243126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 adr=state->config.demod_address;
244126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 mm1[4]={reg&0xff, (reg>>16)&0xff,
245126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   flags|((reg>>24)&0xff), (reg>>8)&0xff};
246126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 mm2[2];
247126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (i2c_read(state->i2c, adr, mm1, 4, mm2, 2)<0)
248126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
249126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (data)
250126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*data=mm2[0]|(mm2[1]<<8);
251126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return mm2[0]|(mm2[1]<<8);
252126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
253126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
254126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int Read32(struct drxd_state *state, u32 reg, u32 *data, u8 flags)
255126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
256126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 adr=state->config.demod_address;
257126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 mm1[4]={reg&0xff, (reg>>16)&0xff,
258126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   flags|((reg>>24)&0xff), (reg>>8)&0xff};
259126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 mm2[4];
260126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
261126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (i2c_read(state->i2c, adr, mm1, 4, mm2, 4)<0)
262126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
263126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (data)
264126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*data=mm2[0]|(mm2[1]<<8)|(mm2[2]<<16)|(mm2[3]<<24);
265126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
266126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
267126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
268126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int Write16(struct drxd_state *state, u32 reg, u16 data, u8 flags)
269126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
270126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 adr=state->config.demod_address;
271126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 mm[6]={ reg&0xff, (reg>>16)&0xff,
272126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   flags|((reg>>24)&0xff), (reg>>8)&0xff,
273126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   data&0xff, (data>>8)&0xff };
274126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
275126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (i2c_write(state->i2c, adr, mm, 6)<0)
276126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
277126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
278126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
279126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
280126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int Write32(struct drxd_state *state, u32 reg, u32 data, u8 flags)
281126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
282126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 adr=state->config.demod_address;
283126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 mm[8]={ reg&0xff, (reg>>16)&0xff,
284126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   flags|((reg>>24)&0xff), (reg>>8)&0xff,
285126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   data&0xff, (data>>8)&0xff,
286126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   (data>>16)&0xff, (data>>24)&0xff };
287126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
288126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (i2c_write(state->i2c, adr, mm, 8)<0)
289126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
290126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
291126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
292126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
293126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int write_chunk(struct drxd_state *state,
294126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		       u32 reg, u8 *data, u32 len, u8 flags)
295126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
296126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 adr=state->config.demod_address;
297126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 mm[CHUNK_SIZE+4]={ reg&0xff, (reg>>16)&0xff,
298126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			      flags|((reg>>24)&0xff), (reg>>8)&0xff };
299126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int i;
300126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
301126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	for (i=0; i<len; i++)
302126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		mm[4+i]=data[i];
303126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (i2c_write(state->i2c, adr, mm, 4+len)<0) {
304126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		printk("error in write_chunk\n");
305126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
306126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
307126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
308126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
309126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
310126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int WriteBlock(struct drxd_state *state,
311126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		      u32 Address, u16 BlockSize, u8 *pBlock, u8 Flags)
312126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
313126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	while(BlockSize >  0) {
314126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 Chunk = BlockSize > CHUNK_SIZE ? CHUNK_SIZE : BlockSize;
315126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
316126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (write_chunk(state, Address, pBlock, Chunk, Flags)<0)
317126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			return -1;
318126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pBlock += Chunk;
319126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Address += (Chunk >> 1);
320126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		BlockSize -= Chunk;
321126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
322126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
323126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
324126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
325126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int WriteTable(struct drxd_state *state, u8 *pTable)
326126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
327126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
328126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
329126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( pTable == NULL )
330126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return 0;
331126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
332126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	while(!status) {
333126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 Length;
334126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u32 Address = pTable[0]|(pTable[1]<<8)|
335126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(pTable[2]<<16)|(pTable[3]<<24);
336126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
337126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (Address==0xFFFFFFFF)
338126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
339126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pTable += sizeof(u32);
340126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
341126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Length = pTable[0]|(pTable[1]<<8);
342126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pTable += sizeof(u16);
343126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (!Length)
344126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
345126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = WriteBlock(state, Address, Length*2, pTable, 0);
346126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pTable += (Length*2);
347126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
348126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
349126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
350126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
351126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
352126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
353126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
354126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
355126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
356126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int ResetCEFR(struct drxd_state *state)
357126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
358126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_ResetCEFR);
359126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
360126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
361126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitCP(struct drxd_state *state)
362126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
363126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitCP);
364126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
365126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
366126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitCE(struct drxd_state *state)
367126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
368126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
369126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	enum app_env AppEnv = state->app_env_default;
370126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
371126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
372126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(WriteTable(state, state->m_InitCE));
373126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
374126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->operation_mode == OM_DVBT_Diversity_Front ||
375126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    state->operation_mode == OM_DVBT_Diversity_End ) {
376126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AppEnv = state->app_env_diversity;
377126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
378126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if ( AppEnv == APPENV_STATIC ) {
379126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,CE_REG_TAPSET__A, 0x0000,0));
380126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else if( AppEnv == APPENV_PORTABLE ) {
381126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,CE_REG_TAPSET__A, 0x0001,0));
382126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else if( AppEnv == APPENV_MOBILE &&  state->type_A ) {
383126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,CE_REG_TAPSET__A, 0x0002,0));
384126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else if( AppEnv == APPENV_MOBILE && !state->type_A ) {
385126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,CE_REG_TAPSET__A, 0x0006,0));
386126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
387126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
388126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* start ce */
389126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state,B_CE_REG_COMM_EXEC__A,0x0001,0));
390126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
391126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
392126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
393126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
394126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int StopOC(struct drxd_state *state)
395126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
396126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
397126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16            ocSyncLvl  = 0;
398126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16            ocModeLop  = state->m_EcOcRegOcModeLop;
399126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16            dtoIncLop  = 0;
400126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16            dtoIncHip  = 0;
401126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
402126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
403126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Store output configuration */
404126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Read16(state, EC_OC_REG_SNC_ISC_LVL__A,
405126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 &ocSyncLvl, 0));;
406126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* CHK_ERROR(Read16(EC_OC_REG_OC_MODE_LOP__A,
407126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   &ocModeLop)); */
408126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->m_EcOcRegSncSncLvl = ocSyncLvl;
409126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* m_EcOcRegOcModeLop = ocModeLop; */
410126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
411126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Flush FIFO (byte-boundary) at fixed rate */
412126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Read16(state, EC_OC_REG_RCN_MAP_LOP__A,
413126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 &dtoIncLop,0 ));
414126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Read16(state, EC_OC_REG_RCN_MAP_HIP__A,
415126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 &dtoIncHip,0 ));
416126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_DTO_INC_LOP__A,
417126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  dtoIncLop,0 ));
418126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_DTO_INC_HIP__A,
419126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  dtoIncHip,0 ));
420126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ocModeLop &= ~(EC_OC_REG_OC_MODE_LOP_DTO_CTR_SRC__M);
421126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ocModeLop |=   EC_OC_REG_OC_MODE_LOP_DTO_CTR_SRC_STATIC;
422126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_OC_MODE_LOP__A,
423126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  ocModeLop,0 ));
424126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_COMM_EXEC__A,
425126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  EC_OC_REG_COMM_EXEC_CTL_HOLD,0 ));
426126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
427126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		msleep(1);
428126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Output pins to '0' */
429126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_OCR_MPG_UOS__A,
430126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  EC_OC_REG_OCR_MPG_UOS__M,0 ));
431126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
432126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Force the OC out of sync */
433126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ocSyncLvl &= ~(EC_OC_REG_SNC_ISC_LVL_OSC__M);
434126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_SNC_ISC_LVL__A,
435126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  ocSyncLvl,0 ));
436126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ocModeLop &= ~(EC_OC_REG_OC_MODE_LOP_PAR_ENA__M);
437126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ocModeLop |=   EC_OC_REG_OC_MODE_LOP_PAR_ENA_ENABLE;
438126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ocModeLop |=   0x2; /* Magically-out-of-sync */
439126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_OC_MODE_LOP__A,
440126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  ocModeLop,0 ));
441126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_COMM_INT_STA__A, 0x0,0  ));
442126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_COMM_EXEC__A,
443126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  EC_OC_REG_COMM_EXEC_CTL_ACTIVE,0 ));
444126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
445126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
446126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
447126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
448126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
449126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int StartOC(struct drxd_state *state)
450126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
451126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status=0;
452126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
453126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
454126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Stop OC */
455126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_COMM_EXEC__A,
456126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  EC_OC_REG_COMM_EXEC_CTL_HOLD,0 ));
457126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
458126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Restore output configuration */
459126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_SNC_ISC_LVL__A,
460126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  state->m_EcOcRegSncSncLvl,0 ));
461126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_OC_MODE_LOP__A,
462126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  state->m_EcOcRegOcModeLop,0 ));
463126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
464126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Output pins active again */
465126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_OCR_MPG_UOS__A,
466126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  EC_OC_REG_OCR_MPG_UOS_INIT,0 ));
467126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
468126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Start OC */
469126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, EC_OC_REG_COMM_EXEC__A,
470126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  EC_OC_REG_COMM_EXEC_CTL_ACTIVE,0 ));
471126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
472126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
473126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
474126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
475126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitEQ(struct drxd_state *state)
476126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
477126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitEQ);
478126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
479126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
480126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitEC(struct drxd_state *state)
481126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
482126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitEC);
483126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
484126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
485126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitSC(struct drxd_state *state)
486126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
487126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitSC);
488126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
489126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
490126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitAtomicRead(struct drxd_state *state)
491126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
492126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return WriteTable(state, state->m_InitAtomicRead);
493126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
494126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
495126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int CorrectSysClockDeviation(struct drxd_state *state);
496126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
497126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int DRX_GetLockStatus(struct drxd_state *state, u32 *pLockStatus)
498126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
499126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 ScRaRamLock = 0;
500126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	const u16 mpeg_lock_mask  = ( SC_RA_RAM_LOCK_MPEG__M |
501126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      SC_RA_RAM_LOCK_FEC__M  |
502126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      SC_RA_RAM_LOCK_DEMOD__M );
503126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	const u16 fec_lock_mask   = ( SC_RA_RAM_LOCK_FEC__M  |
504126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      SC_RA_RAM_LOCK_DEMOD__M );
505126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	const u16 demod_lock_mask =   SC_RA_RAM_LOCK_DEMOD__M ;
506126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
507126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
508126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
509126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*pLockStatus=0;
510126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
511126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	status = Read16(state, SC_RA_RAM_LOCK__A, &ScRaRamLock, 0x0000 );
512126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if(status<0)  {
513126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		printk("Can't read SC_RA_RAM_LOCK__A status = %08x\n",
514126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		       status);
515126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return status;
516126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
517126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
518126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( state->drxd_state != DRXD_STARTED )
519126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return 0;
520126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
521126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if ( (ScRaRamLock & mpeg_lock_mask) == mpeg_lock_mask ) {
522126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*pLockStatus|=DRX_LOCK_MPEG;
523126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CorrectSysClockDeviation(state);
524126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
525126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
526126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if ( (ScRaRamLock & fec_lock_mask) == fec_lock_mask )
527126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*pLockStatus|=DRX_LOCK_FEC;
528126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
529126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if ( (ScRaRamLock & demod_lock_mask) == demod_lock_mask )
530126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*pLockStatus|=DRX_LOCK_DEMOD;
531126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
532126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
533126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
534126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
535126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
536126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetCfgIfAgc(struct drxd_state *state, struct SCfgAgc *cfg)
537126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
538126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
539126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
540126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( cfg->outputLevel > DRXD_FE_CTRL_MAX )
541126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    return -1;
542126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
543126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( cfg->ctrlMode == AGC_CTRL_USER ) {
544126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
545126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 FeAgRegPm1AgcWri;
546126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 FeAgRegAgModeLop;
547126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
548126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state,FE_AG_REG_AG_MODE_LOP__A,
549126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 &FeAgRegAgModeLop,0));
550126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FeAgRegAgModeLop &=
551126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				(~FE_AG_REG_AG_MODE_LOP_MODE_4__M);
552126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FeAgRegAgModeLop |=
553126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FE_AG_REG_AG_MODE_LOP_MODE_4_STATIC;
554126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,FE_AG_REG_AG_MODE_LOP__A,
555126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  FeAgRegAgModeLop,0));
556126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
557126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FeAgRegPm1AgcWri = (u16)(cfg->outputLevel &
558126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						 FE_AG_REG_PM1_AGC_WRI__M);
559126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,FE_AG_REG_PM1_AGC_WRI__A,
560126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  FeAgRegPm1AgcWri,0));
561126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
562126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		while(0);
563126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} else if( cfg->ctrlMode == AGC_CTRL_AUTO ) {
564126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if ( ( (cfg->maxOutputLevel) < (cfg->minOutputLevel) ) ||
565126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		     ( (cfg->maxOutputLevel) > DRXD_FE_CTRL_MAX ) ||
566126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		     ( (cfg->speed) > DRXD_FE_CTRL_MAX ) ||
567126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		     ( (cfg->settleLevel) > DRXD_FE_CTRL_MAX )
568126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			)
569126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			return (-1);
570126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
571126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 FeAgRegAgModeLop;
572126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 FeAgRegEgcSetLvl;
573126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 slope, offset;
574126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
575126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* == Mode == */
576126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
577126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state,FE_AG_REG_AG_MODE_LOP__A,
578126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 &FeAgRegAgModeLop,0));
579126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FeAgRegAgModeLop &=
580126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				(~FE_AG_REG_AG_MODE_LOP_MODE_4__M);
581126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FeAgRegAgModeLop |=
582126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FE_AG_REG_AG_MODE_LOP_MODE_4_DYNAMIC;
583126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,FE_AG_REG_AG_MODE_LOP__A,
584126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  FeAgRegAgModeLop,0));
585126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
586126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* == Settle level == */
587126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
588126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FeAgRegEgcSetLvl = (u16)(( cfg->settleLevel >> 1 ) &
589126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						 FE_AG_REG_EGC_SET_LVL__M );
590126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,FE_AG_REG_EGC_SET_LVL__A,
591126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  FeAgRegEgcSetLvl,0));
592126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
593126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* == Min/Max == */
594126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
595126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			slope = (u16)(( cfg->maxOutputLevel -
596126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					cfg->minOutputLevel )/2);
597126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			offset = (u16)(( cfg->maxOutputLevel +
598126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 cfg->minOutputLevel )/2 - 511);
599126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
600126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,FE_AG_REG_GC1_AGC_RIC__A,
601126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  slope,0));
602126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,FE_AG_REG_GC1_AGC_OFF__A,
603126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  offset,0));
604126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
605126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* == Speed == */
606126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
607126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				const u16 maxRur = 8;
608126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				const u16 slowIncrDecLUT[]={ 3, 4, 4, 5, 6 };
609126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				const u16 fastIncrDecLUT[]={ 14, 15, 15, 16,
610126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							     17, 18, 18, 19,
611126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							     20, 21, 22, 23,
612126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							     24, 26, 27, 28,
613126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							     29, 31};
614126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
615126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 fineSteps  = (DRXD_FE_CTRL_MAX+1)/
616126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					(maxRur+1);
617126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 fineSpeed  = (u16)(cfg->speed -
618126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						       ((cfg->speed/
619126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							 fineSteps)*
620126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							fineSteps));
621126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 invRurCount= (u16)(cfg->speed /
622126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						       fineSteps);
623126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 rurCount;
624126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				if ( invRurCount > maxRur )
625126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				{
626126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					rurCount   = 0;
627126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					fineSpeed += fineSteps;
628126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				} else {
629126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					rurCount   = maxRur - invRurCount;
630126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				}
631126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
632126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				/*
633126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  fastInc = default *
634126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  (2^(fineSpeed/fineSteps))
635126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  => range[default...2*default>
636126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  slowInc = default *
637126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  (2^(fineSpeed/fineSteps))
638126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				*/
639126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				{
640126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					u16 fastIncrDec =
641126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						fastIncrDecLUT[fineSpeed/
642126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							       ((fineSteps/
643126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler								 (14+1))+1) ];
644126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					u16 slowIncrDec = slowIncrDecLUT[
645126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						fineSpeed/(fineSteps/(3+1)) ];
646126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
647126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					CHK_ERROR(Write16(state,
648126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  FE_AG_REG_EGC_RUR_CNT__A,
649126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							  rurCount, 0));
650126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					CHK_ERROR(Write16(state,
651126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  FE_AG_REG_EGC_FAS_INC__A,
652126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							  fastIncrDec, 0));
653126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					CHK_ERROR(Write16(state,
654126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  FE_AG_REG_EGC_FAS_DEC__A,
655126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							  fastIncrDec, 0));
656126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					CHK_ERROR(Write16(state,
657126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  FE_AG_REG_EGC_SLO_INC__A,
658126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							  slowIncrDec, 0));
659126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					CHK_ERROR(Write16(state,
660126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  FE_AG_REG_EGC_SLO_DEC__A,
661126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							  slowIncrDec, 0));
662126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				}
663126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
664126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} while(0);
665126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
666126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} else {
667126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* No OFF mode for IF control */
668126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return (-1);
669126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
670126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
671126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
672126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
673126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
674126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetCfgRfAgc(struct drxd_state *state, struct SCfgAgc *cfg)
675126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
676126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
677126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
678126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( cfg->outputLevel > DRXD_FE_CTRL_MAX )
679126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
680126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
681126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( cfg->ctrlMode == AGC_CTRL_USER ) {
682126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
683126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 AgModeLop=0;
684126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 level = ( cfg->outputLevel );
685126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
686126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (level == DRXD_FE_CTRL_MAX )
687126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				level++;
688126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
689126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state,FE_AG_REG_PM2_AGC_WRI__A,
690126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   level, 0x0000 ));
691126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
692126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/*==== Mode ====*/
693126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
694126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Powerdown PD2, WRI source */
695126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->m_FeAgRegAgPwd &=
696126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				~(FE_AG_REG_AG_PWD_PWD_PD2__M);
697126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->m_FeAgRegAgPwd |=
698126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FE_AG_REG_AG_PWD_PWD_PD2_DISABLE;
699126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state,FE_AG_REG_AG_PWD__A,
700126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   state->m_FeAgRegAgPwd,0x0000 ));
701126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
702126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Read16(state,FE_AG_REG_AG_MODE_LOP__A,
703126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  &AgModeLop,0x0000 ));
704126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop &= (~( FE_AG_REG_AG_MODE_LOP_MODE_5__M |
705126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 FE_AG_REG_AG_MODE_LOP_MODE_E__M));
706126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop |= ( FE_AG_REG_AG_MODE_LOP_MODE_5_STATIC |
707126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				       FE_AG_REG_AG_MODE_LOP_MODE_E_STATIC );
708126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state,FE_AG_REG_AG_MODE_LOP__A,
709126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   AgModeLop,0x0000 ));
710126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
711126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
712126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* enable AGC2 pin */
713126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
714126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 FeAgRegAgAgcSio = 0;
715126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Read16(state,
716126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  FE_AG_REG_AG_AGC_SIO__A,
717126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  &FeAgRegAgAgcSio, 0x0000 ));
718126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio &=
719126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					~(FE_AG_REG_AG_AGC_SIO_AGC_SIO_2__M);
720126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio |=
721126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					FE_AG_REG_AG_AGC_SIO_AGC_SIO_2_OUTPUT;
722126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
723126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   FE_AG_REG_AG_AGC_SIO__A,
724126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   FeAgRegAgAgcSio, 0x0000 ));
725126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
726126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
727126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} while(0);
728126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} else if( cfg->ctrlMode == AGC_CTRL_AUTO ) {
729126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 AgModeLop=0;
730126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
731126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
732126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 level;
733126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Automatic control */
734126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Powerup PD2, AGC2 as output, TGC source */
735126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(state->m_FeAgRegAgPwd) &=
736126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				~(FE_AG_REG_AG_PWD_PWD_PD2__M);
737126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(state->m_FeAgRegAgPwd) |=
738126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FE_AG_REG_AG_PWD_PWD_PD2_DISABLE;
739126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,FE_AG_REG_AG_PWD__A,
740126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  (state->m_FeAgRegAgPwd),0x0000 ));
741126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
742126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state,FE_AG_REG_AG_MODE_LOP__A,
743126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 &AgModeLop,0x0000 ));
744126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop &= (~( FE_AG_REG_AG_MODE_LOP_MODE_5__M |
745126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 FE_AG_REG_AG_MODE_LOP_MODE_E__M));
746126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop |= ( FE_AG_REG_AG_MODE_LOP_MODE_5_STATIC |
747126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				       FE_AG_REG_AG_MODE_LOP_MODE_E_DYNAMIC );
748126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
749126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  FE_AG_REG_AG_MODE_LOP__A,
750126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  AgModeLop, 0x0000 ));
751126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Settle level */
752126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			level = ( (( cfg->settleLevel )>>4) &
753126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  FE_AG_REG_TGC_SET_LVL__M );
754126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
755126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  FE_AG_REG_TGC_SET_LVL__A,
756126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  level,0x0000 ));
757126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
758126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Min/max: don't care */
759126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
760126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Speed: TODO */
761126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
762126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* enable AGC2 pin */
763126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
764126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 FeAgRegAgAgcSio = 0;
765126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Read16(state,
766126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  FE_AG_REG_AG_AGC_SIO__A,
767126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  &FeAgRegAgAgcSio, 0x0000 ));
768126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio &=
769126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					~(FE_AG_REG_AG_AGC_SIO_AGC_SIO_2__M);
770126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio |=
771126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					FE_AG_REG_AG_AGC_SIO_AGC_SIO_2_OUTPUT;
772126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
773126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   FE_AG_REG_AG_AGC_SIO__A,
774126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   FeAgRegAgAgcSio, 0x0000 ));
775126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
776126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
777126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} while(0);
778126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} else {
779126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 AgModeLop=0;
780126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
781126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		do {
782126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* No RF AGC control */
783126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Powerdown PD2, AGC2 as output, WRI source */
784126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(state->m_FeAgRegAgPwd) &=
785126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				~(FE_AG_REG_AG_PWD_PWD_PD2__M);
786126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(state->m_FeAgRegAgPwd) |=
787126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FE_AG_REG_AG_PWD_PWD_PD2_ENABLE;
788126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
789126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  FE_AG_REG_AG_PWD__A,
790126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  (state->m_FeAgRegAgPwd),0x0000 ));
791126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
792126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state,
793126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 FE_AG_REG_AG_MODE_LOP__A,
794126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 &AgModeLop,0x0000 ));
795126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop &= (~( FE_AG_REG_AG_MODE_LOP_MODE_5__M |
796126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 FE_AG_REG_AG_MODE_LOP_MODE_E__M));
797126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop |= ( FE_AG_REG_AG_MODE_LOP_MODE_5_STATIC |
798126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				       FE_AG_REG_AG_MODE_LOP_MODE_E_STATIC );
799126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
800126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  FE_AG_REG_AG_MODE_LOP__A,
801126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  AgModeLop,0x0000 ));
802126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
803126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* set FeAgRegAgAgcSio AGC2 (RF) as input */
804126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
805126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				u16 FeAgRegAgAgcSio = 0;
806126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Read16(state,
807126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  FE_AG_REG_AG_AGC_SIO__A,
808126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  &FeAgRegAgAgcSio, 0x0000 ));
809126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio &=
810126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					~(FE_AG_REG_AG_AGC_SIO_AGC_SIO_2__M);
811126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				FeAgRegAgAgcSio |=
812126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					FE_AG_REG_AG_AGC_SIO_AGC_SIO_2_INPUT;
813126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
814126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   FE_AG_REG_AG_AGC_SIO__A,
815126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   FeAgRegAgAgcSio, 0x0000 ));
816126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
817126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} while(0);
818126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
819126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
820126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
821126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
822126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int ReadIFAgc(struct drxd_state *state, u32 *pValue)
823126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
824126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
825126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
826126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*pValue = 0;
827126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( state->if_agc_cfg.ctrlMode != AGC_CTRL_OFF ) {
828126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 Value;
829126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = Read16(state, FE_AG_REG_GC1_AGC_DAT__A,&Value,0);
830126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Value &= FE_AG_REG_GC1_AGC_DAT__M;
831126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if(status>=0) {
832126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/*           3.3V
833126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      |
834126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      R1
835126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      |
836126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   Vin - R3 - * -- Vout
837126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      |
838126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      R2
839126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      |
840126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				     GND
841126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			*/
842126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 R1 = state->if_agc_cfg.R1;
843126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 R2 = state->if_agc_cfg.R2;
844126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 R3 = state->if_agc_cfg.R3;
845126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
846126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 Vmax = (3300 * R2) / ( R1 + R2 );
847126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 Rpar = ( R2 * R3 ) / ( R3 + R2 );
848126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 Vmin = (3300 * Rpar ) / ( R1 + Rpar );
849126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 Vout = Vmin + (( Vmax - Vmin ) * Value) / 1024;
850126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
851126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			*pValue = Vout;
852126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
853126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
854126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
855126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
856126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
857126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int DownloadMicrocode(struct drxd_state *state,
858126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			     const u8 *pMCImage, u32 Length)
859126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
860126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 *pSrc;
861126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 Flags;
862126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 Address;
863126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 nBlocks;
864126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 BlockSize;
865126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 BlockCRC;
866126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 offset=0;
867126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int i, status=0;
868126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
869126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	pSrc=(u8 *) pMCImage;
870126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Flags = (pSrc[0] << 8) | pSrc[1];
871126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	pSrc += sizeof(u16); offset += sizeof(u16);
872126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	nBlocks = (pSrc[0] << 8) | pSrc[1];
873126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	pSrc += sizeof(u16); offset += sizeof(u16);
874126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
875126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	for(i=0; i<nBlocks; i++ ) {
876126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Address=(pSrc[0] << 24) | (pSrc[1] << 16) |
877126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(pSrc[2] << 8) | pSrc[3];
878126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pSrc += sizeof(u32); offset += sizeof(u32);
879126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
880126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		BlockSize = ( (pSrc[0] << 8) | pSrc[1] ) * sizeof(u16);
881126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pSrc += sizeof(u16); offset += sizeof(u16);
882126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
883126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Flags = (pSrc[0] << 8) | pSrc[1];
884126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pSrc += sizeof(u16); offset += sizeof(u16);
885126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
886126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		BlockCRC = (pSrc[0] << 8) | pSrc[1];
887126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pSrc += sizeof(u16); offset += sizeof(u16);
888126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
889126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = WriteBlock(state,Address,BlockSize,
890126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    pSrc,DRX_I2C_CLEARCRC);
891126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (status<0)
892126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
893126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		pSrc += BlockSize;
894126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		offset += BlockSize;
895126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
896126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
897126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
898126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
899126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
900126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int HI_Command(struct drxd_state *state, u16 cmd, u16 *pResult)
901126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
902126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 nrRetries = 0;
903126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 waitCmd;
904126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
905126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
906126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if ((status=Write16(state, HI_RA_RAM_SRV_CMD__A, cmd, 0))<0)
907126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return status;
908126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
909126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
910126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		nrRetries+=1;
911126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (nrRetries>DRXD_MAX_RETRIES) {
912126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status=-1;
913126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
914126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		};
915126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status=Read16(state, HI_RA_RAM_SRV_CMD__A, &waitCmd, 0);
916126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while (waitCmd!=0);
917126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
918126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (status>=0)
919126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status=Read16(state, HI_RA_RAM_SRV_RES__A, pResult, 0);
920126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
921126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
922126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
923126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int HI_CfgCommand(struct drxd_state *state)
924126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
925126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status=0;
926126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
927126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	down(&state->mutex);
928126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_RA_RAM_SRV_CFG_KEY__A,
929126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		HI_RA_RAM_SRV_RST_KEY_ACT, 0);
930126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_RA_RAM_SRV_CFG_DIV__A, state->hi_cfg_timing_div, 0);
931126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_RA_RAM_SRV_CFG_BDL__A,
932126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->hi_cfg_bridge_delay, 0);
933126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_RA_RAM_SRV_CFG_WUP__A, state->hi_cfg_wakeup_key, 0);
934126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_RA_RAM_SRV_CFG_ACT__A, state->hi_cfg_ctrl, 0);
935126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
936126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_RA_RAM_SRV_CFG_KEY__A,
937126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		HI_RA_RAM_SRV_RST_KEY_ACT, 0);
938126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
939126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if ((state->hi_cfg_ctrl & HI_RA_RAM_SRV_CFG_ACT_PWD_EXE)==
940126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    HI_RA_RAM_SRV_CFG_ACT_PWD_EXE)
941126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status=Write16(state, HI_RA_RAM_SRV_CMD__A,
942126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			       HI_RA_RAM_SRV_CMD_CONFIG, 0);
943126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
944126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status=HI_Command(state, HI_RA_RAM_SRV_CMD_CONFIG, 0);
945126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	up(&state->mutex);
946126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
947126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
948126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
949126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitHI(struct drxd_state *state)
950126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
951126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->hi_cfg_wakeup_key = (state->chip_adr);
952126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* port/bridge/power down ctrl */
953126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->hi_cfg_ctrl = HI_RA_RAM_SRV_CFG_ACT_SLV0_ON;
954126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return  HI_CfgCommand(state);
955126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
956126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
957126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int HI_ResetCommand(struct drxd_state *state)
958126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
959126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
960126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
961126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	down(&state->mutex);
962126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	status=Write16(state, HI_RA_RAM_SRV_RST_KEY__A,
963126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		       HI_RA_RAM_SRV_RST_KEY_ACT, 0);
964126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (status==0)
965126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status=HI_Command(state, HI_RA_RAM_SRV_CMD_RESET, 0);
966126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	up(&state->mutex);
967126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	msleep(1);
968126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
969126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
970126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
971126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int DRX_ConfigureI2CBridge(struct drxd_state *state,
972126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  int bEnableBridge)
973126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
974126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->hi_cfg_ctrl &= (~HI_RA_RAM_SRV_CFG_ACT_BRD__M);
975126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if ( bEnableBridge )
976126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->hi_cfg_ctrl |= HI_RA_RAM_SRV_CFG_ACT_BRD_ON;
977126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
978126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->hi_cfg_ctrl |= HI_RA_RAM_SRV_CFG_ACT_BRD_OFF;
979126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
980126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return HI_CfgCommand(state);
981126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
982126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
983126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define HI_TR_WRITE      0x9
984126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define HI_TR_READ       0xA
985126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define HI_TR_READ_WRITE 0xB
986126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#define HI_TR_BROADCAST  0x4
987126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
988126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#if 0
989126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int AtomicReadBlock(struct drxd_state *state,
990126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   u32 Addr, u16 DataSize, u8 *pData, u8 Flags)
991126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
992126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
993126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int   i=0;
994126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
995126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Parameter check */
996126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if ( (!pData) || ( (DataSize & 1)!=0 ) )
997126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
998126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
999126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	down(&state->mutex);
1000126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1001126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1002126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Instruct HI to read n bytes */
1003126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* TODO use proper names forthese egisters */
1004126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,HI_RA_RAM_SRV_CFG_KEY__A,
1005126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   (HI_TR_FUNC_ADDR & 0xFFFF), 0));
1006126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,HI_RA_RAM_SRV_CFG_DIV__A,
1007126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   (u16)(Addr >> 16), 0));
1008126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,HI_RA_RAM_SRV_CFG_BDL__A,
1009126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   (u16)(Addr & 0xFFFF), 0));
1010126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,HI_RA_RAM_SRV_CFG_WUP__A,
1011126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   (u16)((DataSize/2) - 1), 0));
1012126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,HI_RA_RAM_SRV_CFG_ACT__A,
1013126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   HI_TR_READ, 0));
1014126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1015126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( HI_Command(state, HI_RA_RAM_SRV_CMD_EXECUTE,0));
1016126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1017126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1018126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1019126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (status>=0) {
1020126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		for (i = 0; i < (DataSize/2); i += 1) {
1021126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 word;
1022126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1023126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = Read16(state, (HI_RA_RAM_USR_BEGIN__A + i),
1024126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					&word, 0);
1025126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if( status<0)
1026126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				break;
1027126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			pData[2*i]       = (u8) (word & 0xFF);
1028126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			pData[(2*i) + 1] = (u8) (word >> 8 );
1029126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1030126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1031126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	up(&state->mutex);
1032126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1033126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1034126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1035126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int AtomicReadReg32(struct drxd_state *state,
1036126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   u32 Addr, u32 *pData, u8 Flags)
1037126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1038126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u8 buf[sizeof (u32)];
1039126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1040126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1041126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (!pData)
1042126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
1043126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	status=AtomicReadBlock(state, Addr, sizeof (u32), buf, Flags);
1044126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*pData = (((u32) buf[0]) <<  0) +
1045126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		(((u32) buf[1]) <<  8) +
1046126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		(((u32) buf[2]) << 16) +
1047126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		(((u32) buf[3]) << 24);
1048126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1049126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1050126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
1051126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1052126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int StopAllProcessors(struct drxd_state *state)
1053126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1054126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return Write16(state, HI_COMM_EXEC__A,
1055126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		       SC_COMM_EXEC_CTL_STOP, DRX_I2C_BROADCAST);
1056126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1057126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1058126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int EnableAndResetMB(struct drxd_state *state)
1059126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1060126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (state->type_A) {
1061126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* disable? monitor bus observe @ EC_OC */
1062126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Write16(state, EC_OC_REG_OC_MON_SIO__A, 0x0000, 0x0000);
1063126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1064126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1065126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* do inverse broadcast, followed by explicit write to HI */
1066126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_COMM_MB__A, 0x0000, DRX_I2C_BROADCAST);
1067126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, HI_COMM_MB__A, 0x0000, 0x0000);
1068126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
1069126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1070126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1071126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitCC(struct drxd_state *state)
1072126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1073126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (state->osc_clock_freq == 0 ||
1074126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->osc_clock_freq > 20000 ||
1075126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    (state->osc_clock_freq % 4000 ) != 0 ) {
1076126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		printk("invalid osc frequency %d\n", state->osc_clock_freq);
1077126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
1078126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1079126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1080126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, CC_REG_OSC_MODE__A, CC_REG_OSC_MODE_M20, 0);
1081126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, CC_REG_PLL_MODE__A, CC_REG_PLL_MODE_BYPASS_PLL |
1082126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CC_REG_PLL_MODE_PUMP_CUR_12, 0);
1083126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, CC_REG_REF_DIVIDE__A, state->osc_clock_freq/4000, 0);
1084126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, CC_REG_PWD_MODE__A, CC_REG_PWD_MODE_DOWN_PLL, 0);
1085126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, CC_REG_UPDATE__A, CC_REG_UPDATE_KEY, 0);
1086126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1087126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
1088126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1089126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1090126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int ResetECOD(struct drxd_state *state)
1091126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1092126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status = 0;
1093126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1094126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if(state->type_A )
1095126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = Write16(state, EC_OD_REG_SYNC__A, 0x0664, 0);
1096126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
1097126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = Write16(state, B_EC_OD_REG_SYNC__A, 0x0664, 0);
1098126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1099126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (!(status<0))
1100126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = WriteTable(state, state->m_ResetECRAM);
1101126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (!(status<0))
1102126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = Write16(state, EC_OD_REG_COMM_EXEC__A, 0x0001, 0);
1103126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1104126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1105126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1106126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1107126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/* Configure PGA switch */
1108126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1109126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetCfgPga(struct drxd_state *state, int pgaSwitch)
1110126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1111126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1112126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 AgModeLop = 0;
1113126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 AgModeHip = 0;
1114126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1115126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if ( pgaSwitch  ) {
1116126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* PGA on */
1117126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* fine gain */
1118126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state, B_FE_AG_REG_AG_MODE_LOP__A,
1119126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 &AgModeLop, 0x0000));
1120126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop&=(~(B_FE_AG_REG_AG_MODE_LOP_MODE_C__M));
1121126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop|= B_FE_AG_REG_AG_MODE_LOP_MODE_C_DYNAMIC;
1122126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state, B_FE_AG_REG_AG_MODE_LOP__A,
1123126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  AgModeLop, 0x0000));
1124126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1125126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* coarse gain */
1126126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state, B_FE_AG_REG_AG_MODE_HIP__A,
1127126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 &AgModeHip, 0x0000));
1128126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeHip&=(~(B_FE_AG_REG_AG_MODE_HIP_MODE_J__M));
1129126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeHip|= B_FE_AG_REG_AG_MODE_HIP_MODE_J_DYNAMIC ;
1130126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state, B_FE_AG_REG_AG_MODE_HIP__A,
1131126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  AgModeHip, 0x0000));
1132126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1133126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* enable fine and coarse gain, enable AAF,
1134126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   no ext resistor */
1135126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state, B_FE_AG_REG_AG_PGA_MODE__A,
1136126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      B_FE_AG_REG_AG_PGA_MODE_PFY_PCY_AFY_REN,
1137126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  0x0000));
1138126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
1139126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* PGA off, bypass */
1140126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1141126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* fine gain */
1142126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state, B_FE_AG_REG_AG_MODE_LOP__A,
1143126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 &AgModeLop, 0x0000));
1144126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop&=(~(B_FE_AG_REG_AG_MODE_LOP_MODE_C__M));
1145126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeLop|= B_FE_AG_REG_AG_MODE_LOP_MODE_C_STATIC ;
1146126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state, B_FE_AG_REG_AG_MODE_LOP__A,
1147126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  AgModeLop, 0x0000));
1148126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1149126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* coarse gain */
1150126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state, B_FE_AG_REG_AG_MODE_HIP__A,
1151126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 &AgModeHip, 0x0000));
1152126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeHip&=(~(B_FE_AG_REG_AG_MODE_HIP_MODE_J__M));
1153126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			AgModeHip|= B_FE_AG_REG_AG_MODE_HIP_MODE_J_STATIC ;
1154126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state, B_FE_AG_REG_AG_MODE_HIP__A,
1155126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  AgModeHip, 0x0000));
1156126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1157126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* disable fine and coarse gain, enable AAF,
1158126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   no ext resistor */
1159126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state, B_FE_AG_REG_AG_PGA_MODE__A,
1160126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				      B_FE_AG_REG_AG_PGA_MODE_PFN_PCN_AFY_REN,
1161126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  0x0000));
1162126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1163126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1164126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	while(0);
1165126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1166126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1167126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1168126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitFE(struct drxd_state *state)
1169126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1170126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler   int status;
1171126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1172126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    do
1173126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    {
1174126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	CHK_ERROR( WriteTable(state, state->m_InitFE_1));
1175126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1176126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( state->type_A ) {
1177126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status = Write16(state,  FE_AG_REG_AG_PGA_MODE__A,
1178126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 FE_AG_REG_AG_PGA_MODE_PFN_PCN_AFY_REN, 0);
1179126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} else {
1180126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->PGA)
1181126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = SetCfgPga(state, 0);
1182126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		else
1183126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status =
1184126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			 Write16(state, B_FE_AG_REG_AG_PGA_MODE__A,
1185126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 B_FE_AG_REG_AG_PGA_MODE_PFN_PCN_AFY_REN, 0);
1186126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1187126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1188126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (status<0) break;
1189126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	CHK_ERROR( Write16( state, FE_AG_REG_AG_AGC_SIO__A,
1190126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    state->m_FeAgRegAgAgcSio, 0x0000));
1191126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	CHK_ERROR( Write16( state, FE_AG_REG_AG_PWD__A,state->m_FeAgRegAgPwd,
1192126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    0x0000));
1193126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1194126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	CHK_ERROR( WriteTable(state, state->m_InitFE_2));
1195126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1196126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1197126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    } while(0);
1198126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1199126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    return status;
1200126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1201126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1202126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int InitFT(struct drxd_state *state)
1203126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1204126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/*
1205126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	  norm OFFSET,  MB says =2 voor 8K en =3 voor 2K waarschijnlijk
1206126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	  SC stuff
1207126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*/
1208126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return Write16(state, FT_REG_COMM_EXEC__A, 0x0001, 0x0000 );
1209126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1210126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1211126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SC_WaitForReady(struct drxd_state *state)
1212126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1213126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 curCmd;
1214126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int i;
1215126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1216126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	for(i = 0; i < DRXD_MAX_RETRIES; i += 1 )
1217126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	{
1218126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		int status = Read16(state, SC_RA_RAM_CMD__A,&curCmd,0);
1219126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (status==0 || curCmd == 0 )
1220126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			return status;
1221126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1222126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return -1;
1223126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1224126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1225126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SC_SendCommand(struct drxd_state *state, u16 cmd)
1226126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1227126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status=0;
1228126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 errCode;
1229126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1230126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Write16(state, SC_RA_RAM_CMD__A,cmd,0);
1231126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	SC_WaitForReady(state);
1232126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1233126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	Read16(state, SC_RA_RAM_CMD_ADDR__A,&errCode,0);
1234126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1235126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( errCode == 0xFFFF )
1236126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	{
1237126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   printk("Command Error\n");
1238126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   status = -1;
1239126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1240126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1241126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1242126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1243126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1244126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SC_ProcStartCommand(struct drxd_state *state,
1245126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			       u16 subCmd,u16 param0,u16 param1)
1246126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1247126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status=0;
1248126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 scExec;
1249126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1250126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	down(&state->mutex);
1251126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1252126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Read16(state, SC_COMM_EXEC__A, &scExec, 0);
1253126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (scExec != 1) {
1254126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status=-1;
1255126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1256126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1257126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		SC_WaitForReady(state);
1258126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Write16(state, SC_RA_RAM_CMD_ADDR__A,subCmd,0);
1259126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Write16(state, SC_RA_RAM_PARAM1__A,param1,0);
1260126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Write16(state, SC_RA_RAM_PARAM0__A,param0,0);
1261126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1262126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		SC_SendCommand(state, SC_RA_RAM_CMD_PROC_START);
1263126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1264126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	up(&state->mutex);
1265126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1266126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1267126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1268126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1269126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SC_SetPrefParamCommand(struct drxd_state *state,
1270126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  u16 subCmd,u16 param0,u16 param1)
1271126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1272126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1273126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1274126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	down(&state->mutex);
1275126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1276126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( SC_WaitForReady(state) );
1277126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,SC_RA_RAM_CMD_ADDR__A,subCmd,0) );
1278126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,SC_RA_RAM_PARAM1__A,param1,0) );
1279126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,SC_RA_RAM_PARAM0__A,param0,0) );
1280126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1281126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( SC_SendCommand(state,
1282126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  SC_RA_RAM_CMD_SET_PREF_PARAM) );
1283126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1284126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	up(&state->mutex);
1285126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1286126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1287126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1288126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#if 0
1289126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SC_GetOpParamCommand(struct drxd_state *state, u16 *result)
1290126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1291126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status=0;
1292126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1293126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	down(&state->mutex);
1294126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1295126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( SC_WaitForReady(state) );
1296126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( SC_SendCommand(state,
1297126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  SC_RA_RAM_CMD_GET_OP_PARAM) );
1298126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Read16(state, SC_RA_RAM_PARAM0__A,result, 0 ) );
1299126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1300126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	up(&state->mutex);
1301126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1302126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1303126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
1304126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1305126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int ConfigureMPEGOutput(struct drxd_state *state, int bEnableOutput)
1306126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1307126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1308126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1309126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1310126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 EcOcRegIprInvMpg = 0;
1311126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 EcOcRegOcModeLop = 0;
1312126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 EcOcRegOcModeHip = 0;
1313126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		u16 EcOcRegOcMpgSio  = 0;
1314126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1315126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/*CHK_ERROR(Read16(state, EC_OC_REG_OC_MODE_LOP__A,
1316126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		  &EcOcRegOcModeLop, 0));*/
1317126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1318126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if( state->operation_mode == OM_DVBT_Diversity_Front )
1319126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
1320126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if ( bEnableOutput )
1321126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
1322126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip |=
1323126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  B_EC_OC_REG_OC_MODE_HIP_MPG_BUS_SRC_MONITOR;
1324126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1325126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			else
1326126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcMpgSio |= EC_OC_REG_OC_MPG_SIO__M;
1327126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			EcOcRegOcModeLop |=
1328126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EC_OC_REG_OC_MODE_LOP_PAR_ENA_DISABLE;
1329126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1330126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		else
1331126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
1332126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			EcOcRegOcModeLop = state->m_EcOcRegOcModeLop;
1333126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1334126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (bEnableOutput)
1335126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcMpgSio &=
1336126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					(~(EC_OC_REG_OC_MPG_SIO__M));
1337126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			else
1338126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcMpgSio |= EC_OC_REG_OC_MPG_SIO__M;
1339126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1340126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Don't Insert RS Byte */
1341126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if( state->insert_rs_byte  )
1342126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
1343126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeLop &=
1344126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					(~(EC_OC_REG_OC_MODE_LOP_PAR_ENA__M));
1345126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip &=
1346126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				     (~EC_OC_REG_OC_MODE_HIP_MPG_PAR_VAL__M);
1347126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip |=
1348126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    EC_OC_REG_OC_MODE_HIP_MPG_PAR_VAL_ENABLE;
1349126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			} else {
1350126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeLop |=
1351126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					EC_OC_REG_OC_MODE_LOP_PAR_ENA_DISABLE;
1352126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip &=
1353126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    (~EC_OC_REG_OC_MODE_HIP_MPG_PAR_VAL__M);
1354126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeHip |=
1355126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    EC_OC_REG_OC_MODE_HIP_MPG_PAR_VAL_DISABLE;
1356126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1357126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1358126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Mode = Parallel */
1359126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if( state->enable_parallel )
1360126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeLop &=
1361126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    (~(EC_OC_REG_OC_MODE_LOP_MPG_TRM_MDE__M));
1362126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			else
1363126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				EcOcRegOcModeLop |=
1364126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				    EC_OC_REG_OC_MODE_LOP_MPG_TRM_MDE_SERIAL;
1365126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1366126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Data */
1367126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegIprInvMpg |= 0x00FF; */
1368126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x00FF));
1369126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1370126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Error ( we don't use the pin ) */
1371126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/*  EcOcRegIprInvMpg |= 0x0100; */
1372126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x0100));
1373126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1374126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Start ( we don't use the pin ) */
1375126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegIprInvMpg |= 0x0200; */
1376126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x0200));
1377126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1378126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Valid ( we don't use the pin ) */
1379126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegIprInvMpg |= 0x0400; */
1380126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x0400));
1381126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1382126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Invert Clock */
1383126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegIprInvMpg |= 0x0800; */
1384126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		EcOcRegIprInvMpg &= (~(0x0800));
1385126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1386126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* EcOcRegOcModeLop =0x05; */
1387126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state, EC_OC_REG_IPR_INV_MPG__A,
1388126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   EcOcRegIprInvMpg, 0));
1389126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state, EC_OC_REG_OC_MODE_LOP__A,
1390126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   EcOcRegOcModeLop, 0) );
1391126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state, EC_OC_REG_OC_MODE_HIP__A,
1392126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   EcOcRegOcModeHip, 0x0000  ) );
1393126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state, EC_OC_REG_OC_MPG_SIO__A,
1394126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   EcOcRegOcMpgSio, 0) );
1395126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1396126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1397126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1398126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1399126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetDeviceTypeId(struct drxd_state *state)
1400126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1401126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    int status = 0;
1402126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    u16 deviceId = 0 ;
1403126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1404126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    do {
1405126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    CHK_ERROR(Read16(state, CC_REG_JTAGID_L__A, &deviceId, 0));
1406126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    /* TODO: why twice? */
1407126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    CHK_ERROR(Read16(state, CC_REG_JTAGID_L__A, &deviceId, 0));
1408126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    printk( "drxd: deviceId = %04x\n",deviceId);
1409126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1410126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->type_A = 0;
1411126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->PGA = 0;
1412126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->diversity = 0;
1413126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    if (deviceId == 0) { /* on A2 only 3975 available */
1414126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    state->type_A = 1;
1415126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    printk("DRX3975D-A2\n");
1416126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    } else {
1417126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    deviceId >>= 12;
1418126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    printk("DRX397%dD-B1\n",deviceId);
1419126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    switch(deviceId) {
1420126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    case 4:
1421126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    state->diversity = 1;
1422126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    case 3:
1423126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    case 7:
1424126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    state->PGA = 1;
1425126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    break;
1426126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    case 6:
1427126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    state->diversity = 1;
1428126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    case 5:
1429126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    case 8:
1430126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    break;
1431126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    default:
1432126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    status = -1;
1433126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    break;
1434126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		    }
1435126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    }
1436126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    } while(0);
1437126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1438126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    if (status<0)
1439126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    return status;
1440126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1441126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    /* Init Table selection */
1442126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    state->m_InitAtomicRead = DRXD_InitAtomicRead;
1443126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    state->m_InitSC   = DRXD_InitSC;
1444126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    state->m_ResetECRAM = DRXD_ResetECRAM;
1445126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    if (state->type_A) {
1446126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_ResetCEFR = DRXD_ResetCEFR;
1447126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitFE_1 = DRXD_InitFEA2_1;
1448126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitFE_2 = DRXD_InitFEA2_2;
1449126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitCP   = DRXD_InitCPA2;
1450126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitCE   = DRXD_InitCEA2;
1451126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitEQ   = DRXD_InitEQA2;
1452126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitEC   = DRXD_InitECA2;
1453126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->microcode = DRXD_A2_microcode;
1454126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->microcode_length = DRXD_A2_microcode_length;
1455126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    } else {
1456126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_ResetCEFR = NULL;
1457126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitFE_1 = DRXD_InitFEB1_1;
1458126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitFE_2 = DRXD_InitFEB1_2;
1459126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitCP   = DRXD_InitCPB1;
1460126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitCE   = DRXD_InitCEB1;
1461126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitEQ   = DRXD_InitEQB1;
1462126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitEC   = DRXD_InitECB1;
1463126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->microcode = DRXD_B1_microcode;
1464126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->microcode_length = DRXD_B1_microcode_length;
1465126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    }
1466126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    if (state->diversity) {
1467126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitDiversityFront = DRXD_InitDiversityFront;
1468126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitDiversityEnd = DRXD_InitDiversityEnd;
1469126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_DisableDiversity = DRXD_DisableDiversity;
1470126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_StartDiversityFront = DRXD_StartDiversityFront;
1471126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_StartDiversityEnd = DRXD_StartDiversityEnd;
1472126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_DiversityDelay8MHZ = DRXD_DiversityDelay8MHZ;
1473126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_DiversityDelay6MHZ = DRXD_DiversityDelay6MHZ;
1474126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    } else {
1475126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitDiversityFront = NULL;
1476126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_InitDiversityEnd = NULL;
1477126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_DisableDiversity = NULL;
1478126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_StartDiversityFront = NULL;
1479126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_StartDiversityEnd = NULL;
1480126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_DiversityDelay8MHZ = NULL;
1481126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->m_DiversityDelay6MHZ = NULL;
1482126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    }
1483126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1484126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler    return status;
1485126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1486126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1487126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int CorrectSysClockDeviation(struct drxd_state *state)
1488126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1489126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1490126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	s32  incr = 0;
1491126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	s32  nomincr = 0;
1492126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 bandwidth=0;
1493126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 sysClockInHz=0;
1494126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 sysClockFreq=0; /* in kHz */
1495126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	s16 oscClockDeviation;
1496126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	s16 Diff;
1497126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1498126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1499126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Retrieve bandwidth and incr, sanity check */
1500126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1501126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* These accesses should be AtomicReadReg32, but that
1502126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   causes trouble (at least for diversity */
1503126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Read32(state, LC_RA_RAM_IFINCR_NOM_L__A,
1504126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  ((u32 *)&nomincr),0 ));
1505126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Read32(state, FE_IF_REG_INCR0__A,
1506126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  (u32 *) &incr,0 ));
1507126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1508126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if( state->type_A ) {
1509126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if( (nomincr - incr < -500) ||
1510126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    (nomincr - incr > 500 ) )
1511126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				break;
1512126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
1513126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if( (nomincr - incr < -2000 ) ||
1514126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    (nomincr - incr > 2000 ) )
1515126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				break;
1516126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1517126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1518126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch( state->param.u.ofdm.bandwidth )
1519126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
1520126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case BANDWIDTH_8_MHZ    :
1521126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_8MHZ_IN_HZ;
1522126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1523126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case BANDWIDTH_7_MHZ    :
1524126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_7MHZ_IN_HZ;
1525126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1526126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case BANDWIDTH_6_MHZ    :
1527126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_6MHZ_IN_HZ;
1528126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1529126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default                    :
1530126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			return -1;
1531126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1532126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1533126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1534126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Compute new sysclock value
1535126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   sysClockFreq = (((incr + 2^23)*bandwidth)/2^21)/1000 */
1536126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		incr += (1<<23);
1537126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		sysClockInHz = MulDiv32(incr,bandwidth,1<<21);
1538126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		sysClockFreq= (u32)(sysClockInHz/1000);
1539126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* rounding */
1540126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if ( ( sysClockInHz%1000 ) > 500 )
1541126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
1542126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			sysClockFreq++;
1543126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1544126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1545126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Compute clock deviation in ppm */
1546126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		oscClockDeviation = (u16) (
1547126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(((s32)(sysClockFreq) -
1548126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			  (s32)(state->expected_sys_clock_freq))*
1549126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			 1000000L)/(s32)(state->expected_sys_clock_freq) );
1550126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1551126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		Diff = oscClockDeviation - state->osc_clock_deviation;
1552126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/*printk("sysclockdiff=%d\n", Diff);*/
1553126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if( Diff >= -200 && Diff <= 200 ) {
1554126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->sys_clock_freq = (u16) sysClockFreq;
1555126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if( oscClockDeviation !=
1556126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    state->osc_clock_deviation ) {
1557126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				if (state->config.osc_deviation) {
1558126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					state->config.osc_deviation(
1559126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						state->priv,
1560126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						oscClockDeviation, 1);
1561126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					state->osc_clock_deviation=
1562126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						oscClockDeviation;
1563126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				}
1564126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1565126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* switch OFF SRMM scan in SC */
1566126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16( state,
1567126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					    SC_RA_RAM_SAMPLE_RATE_COUNT__A,
1568126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					    DRXD_OSCDEV_DONT_SCAN,0));
1569126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* overrule FE_IF internal value for
1570126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   proper re-locking */
1571126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16( state, SC_RA_RAM_IF_SAVE__AX,
1572126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					    state->current_fe_if_incr, 0));
1573126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->cscd_state = CSCD_SAVED;
1574126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1575126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1576126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1577126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return (status);
1578126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1579126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1580126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int DRX_Stop(struct drxd_state *state)
1581126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1582126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1583126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1584126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( state->drxd_state != DRXD_STARTED )
1585126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return 0;
1586126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1587126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1588126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->cscd_state != CSCD_SAVED ) {
1589126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u32 lock;
1590126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( DRX_GetLockStatus(state, &lock));
1591126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1592126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1593126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(StopOC(state));
1594126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1595126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->drxd_state = DRXD_STOPPED;
1596126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1597126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( ConfigureMPEGOutput(state, 0) );
1598126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1599126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if(state->type_A ) {
1600126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Stop relevant processors off the device */
1601126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state, EC_OD_REG_COMM_EXEC__A,
1602126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   0x0000, 0x0000));
1603126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1604126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state, SC_COMM_EXEC__A,
1605126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   SC_COMM_EXEC_CTL_STOP, 0 ));
1606126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state, LC_COMM_EXEC__A,
1607126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   SC_COMM_EXEC_CTL_STOP, 0 ));
1608126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
1609126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Stop all processors except HI & CC & FE */
1610126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
1611126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  B_SC_COMM_EXEC__A,
1612126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  SC_COMM_EXEC_CTL_STOP, 0 ));
1613126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
1614126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  B_LC_COMM_EXEC__A,
1615126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  SC_COMM_EXEC_CTL_STOP, 0 ));
1616126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
1617126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  B_FT_COMM_EXEC__A,
1618126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  SC_COMM_EXEC_CTL_STOP, 0 ));
1619126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
1620126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  B_CP_COMM_EXEC__A,
1621126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  SC_COMM_EXEC_CTL_STOP, 0 ));
1622126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
1623126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  B_CE_COMM_EXEC__A,
1624126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  SC_COMM_EXEC_CTL_STOP, 0 ));
1625126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
1626126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  B_EQ_COMM_EXEC__A,
1627126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  SC_COMM_EXEC_CTL_STOP, 0 ));
1628126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
1629126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  EC_OD_REG_COMM_EXEC__A,
1630126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  0x0000, 0 ));
1631126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1632126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1633126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1634126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1635126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1636126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1637126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1638126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerint SetOperationMode(struct drxd_state *state, int oMode)
1639126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1640126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1641126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1642126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1643126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->drxd_state != DRXD_STOPPED) {
1644126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = -1;
1645126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1646126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1647126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1648126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (oMode == state->operation_mode) {
1649126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = 0;
1650126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1651126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1652126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1653126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (oMode != OM_Default && !state->diversity) {
1654126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = -1;
1655126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1656126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1657126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1658126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch(oMode)
1659126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
1660126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case OM_DVBT_Diversity_Front:
1661126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = WriteTable(state,
1662126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					    state->m_InitDiversityFront);
1663126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1664126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case OM_DVBT_Diversity_End:
1665126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = WriteTable(state,
1666126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					    state->m_InitDiversityEnd);
1667126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1668126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case OM_Default:
1669126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* We need to check how to
1670126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   get DRXD out of diversity */
1671126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
1672126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = WriteTable(state, state->m_DisableDiversity);
1673126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1674126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1675126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1676126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1677126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (!status)
1678126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->operation_mode = oMode;
1679126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1680126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1681126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1682126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1683126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1684126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int StartDiversity(struct drxd_state *state)
1685126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1686126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status=0;
1687126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 rcControl;
1688126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1689126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1690126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->operation_mode == OM_DVBT_Diversity_Front) {
1691126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(WriteTable(state,
1692126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					     state->m_StartDiversityFront));
1693126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else if( state->operation_mode == OM_DVBT_Diversity_End ) {
1694126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(WriteTable(state,
1695126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					     state->m_StartDiversityEnd));
1696126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if( state->param.u.ofdm.bandwidth ==
1697126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    BANDWIDTH_8_MHZ ) {
1698126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(
1699126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					WriteTable(state,
1700126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   state->
1701126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   m_DiversityDelay8MHZ));
1702126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			} else {
1703126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(
1704126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					WriteTable(state,
1705126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   state->
1706126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   m_DiversityDelay6MHZ));
1707126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1708126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1709126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state,
1710126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 B_EQ_REG_RC_SEL_CAR__A,
1711126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 &rcControl,0));
1712126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			rcControl &= ~(B_EQ_REG_RC_SEL_CAR_FFTMODE__M);
1713126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			rcControl |= B_EQ_REG_RC_SEL_CAR_DIV_ON |
1714126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				/*  combining enabled */
1715126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				B_EQ_REG_RC_SEL_CAR_MEAS_A_CC |
1716126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				B_EQ_REG_RC_SEL_CAR_PASS_A_CC |
1717126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				B_EQ_REG_RC_SEL_CAR_LOCAL_A_CC;
1718126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state,
1719126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  B_EQ_REG_RC_SEL_CAR__A,
1720126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  rcControl,0));
1721126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1722126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1723126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1724126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1725126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1726126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1727126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetFrequencyShift(struct drxd_state *state,
1728126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			     u32 offsetFreq, int channelMirrored)
1729126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1730126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int negativeShift = (state->tuner_mirrors == channelMirrored);
1731126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1732126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Handle all mirroring
1733126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 *
1734126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 * Note: ADC mirroring (aliasing) is implictly handled by limiting
1735126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 * feFsRegAddInc to 28 bits below
1736126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 * (if the result before masking is more than 28 bits, this means
1737126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 *  that the ADC is mirroring.
1738126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 * The masking is in fact the aliasing of the ADC)
1739126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 *
1740126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	 */
1741126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1742126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Compute register value, unsigned computation */
1743126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->fe_fs_add_incr = MulDiv32( state->intermediate_freq +
1744126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 offsetFreq,
1745126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 1<<28, state->sys_clock_freq);
1746126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Remove integer part */
1747126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->fe_fs_add_incr &= 0x0FFFFFFFL;
1748126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (negativeShift)
1749126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	{
1750126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->fe_fs_add_incr = ((1<<28) - state->fe_fs_add_incr);
1751126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
1752126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1753126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Save the frequency shift without tunerOffset compensation
1754126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	   for CtrlGetChannel. */
1755126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->org_fe_fs_add_incr = MulDiv32( state->intermediate_freq,
1756126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					    1<<28, state->sys_clock_freq);
1757126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Remove integer part */
1758126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->org_fe_fs_add_incr &= 0x0FFFFFFFL;
1759126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (negativeShift)
1760126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->org_fe_fs_add_incr = ((1L<<28) -
1761126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					     state->org_fe_fs_add_incr);
1762126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1763126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return Write32(state, FE_FS_REG_ADD_INC_LOP__A,
1764126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		       state->fe_fs_add_incr, 0);
1765126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1766126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1767126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int SetCfgNoiseCalibration (struct drxd_state *state,
1768126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   struct SNoiseCal* noiseCal )
1769126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1770126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16 beOptEna;
1771126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status=0;
1772126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1773126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1774126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Read16(state, SC_RA_RAM_BE_OPT_ENA__A,
1775126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 &beOptEna, 0));
1776126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (noiseCal->cpOpt)
1777126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
1778126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			beOptEna |= (1 << SC_RA_RAM_BE_OPT_ENA_CP_OPT);
1779126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
1780126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			beOptEna &= ~(1 << SC_RA_RAM_BE_OPT_ENA_CP_OPT);
1781126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state, CP_REG_AC_NEXP_OFFS__A,
1782126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					  noiseCal->cpNexpOfs, 0));
1783126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1784126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, SC_RA_RAM_BE_OPT_ENA__A,
1785126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  beOptEna, 0));
1786126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1787126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if( !state->type_A )
1788126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
1789126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16( state,
1790126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   B_SC_RA_RAM_CO_TD_CAL_2K__A,
1791126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   noiseCal->tdCal2k,0));
1792126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16( state,
1793126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   B_SC_RA_RAM_CO_TD_CAL_8K__A,
1794126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   noiseCal->tdCal8k,0));
1795126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1796126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
1797126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1798126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
1799126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
1800126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1801126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int DRX_Start(struct drxd_state *state, s32 off)
1802126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
1803126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct dvb_ofdm_parameters *p = &state->param.u.ofdm;
1804126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status;
1805126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1806126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  transmissionParams = 0;
1807126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  operationMode = 0;
1808126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qpskTdTpsPwr = 0;
1809126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qam16TdTpsPwr = 0;
1810126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qam64TdTpsPwr = 0;
1811126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32   feIfIncr = 0;
1812126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32   bandwidth = 0;
1813126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int mirrorFreqSpect;
1814126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1815126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qpskSnCeGain  = 0;
1816126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qam16SnCeGain = 0;
1817126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qam64SnCeGain = 0;
1818126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qpskIsGainMan  = 0;
1819126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qam16IsGainMan = 0;
1820126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qam64IsGainMan = 0;
1821126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qpskIsGainExp  = 0;
1822126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qam16IsGainExp = 0;
1823126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  qam64IsGainExp = 0;
1824126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u16  bandwidthParam = 0;
1825126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1826126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (off<0)
1827126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		off=(off-500)/1000;
1828126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
1829126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		off=(off+500)/1000;
1830126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1831126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
1832126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->drxd_state != DRXD_STOPPED)
1833126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			return -1;
1834126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( ResetECOD(state) );
1835126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->type_A) {
1836126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( InitSC(state) );
1837126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
1838126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( InitFT(state) );
1839126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( InitCP(state) );
1840126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( InitCE(state) );
1841126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( InitEQ(state) );
1842126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( InitSC(state) );
1843126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1844126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1845126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Restore current IF & RF AGC settings */
1846126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1847126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(SetCfgIfAgc(state, &state->if_agc_cfg ));
1848126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(SetCfgRfAgc(state, &state->rf_agc_cfg ));
1849126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1850126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		mirrorFreqSpect=( state->param.inversion==INVERSION_ON);
1851126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1852126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch (p->transmission_mode) {
1853126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:  /* Not set, detect it automatically */
1854126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_MODE__M;
1855126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* fall through , try first guess DRX_FFTMODE_8K */
1856126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case TRANSMISSION_MODE_8K :
1857126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_MODE_8K;
1858126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
1859126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
1860126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_SB_REG_TR_MODE__A,
1861126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_SB_REG_TR_MODE_8K,
1862126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0000 ));
1863126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskSnCeGain  = 99;
1864126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16SnCeGain = 83;
1865126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64SnCeGain = 67;
1866126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1867126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1868126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case TRANSMISSION_MODE_2K :
1869126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_MODE_2K;
1870126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
1871126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
1872126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_SB_REG_TR_MODE__A,
1873126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_SB_REG_TR_MODE_2K,
1874126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0000 ));
1875126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskSnCeGain  = 97;
1876126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16SnCeGain = 71;
1877126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64SnCeGain = 65;
1878126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1879126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1880126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1881126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1882126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch( p->guard_interval )
1883126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
1884126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case GUARD_INTERVAL_1_4:
1885126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_4;
1886126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1887126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case GUARD_INTERVAL_1_8:
1888126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_8;
1889126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1890126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case GUARD_INTERVAL_1_16:
1891126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_16;
1892126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1893126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case GUARD_INTERVAL_1_32:
1894126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_32;
1895126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1896126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:  /* Not set, detect it automatically */
1897126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_GUARD__M;
1898126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* try first guess 1/4 */
1899126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_GUARD_4;
1900126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1901126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
1902126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1903126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch( p->hierarchy_information )
1904126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
1905126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case HIERARCHY_1:
1906126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_HIER_A1;
1907126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
1908126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state, EQ_REG_OT_ALPHA__A,
1909126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0001, 0x0000 ) );
1910126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state, EC_SB_REG_ALPHA__A,
1911126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0001, 0x0000 ) );
1912126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1913126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskTdTpsPwr  = EQ_TD_TPS_PWR_UNKNOWN;
1914126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16TdTpsPwr = EQ_TD_TPS_PWR_QAM16_ALPHA1;
1915126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64TdTpsPwr = EQ_TD_TPS_PWR_QAM64_ALPHA1;
1916126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1917126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskIsGainMan  =
1918126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_MAN__PRE;
1919126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainMan =
1920126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_16QAM_MAN__PRE;
1921126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainMan =
1922126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_64QAM_MAN__PRE;
1923126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1924126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskIsGainExp  =
1925126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_EXP__PRE;
1926126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainExp =
1927126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_16QAM_EXP__PRE;
1928126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainExp =
1929126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_64QAM_EXP__PRE;
1930126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1931126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1932126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1933126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case HIERARCHY_2:
1934126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_HIER_A2;
1935126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
1936126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,  EQ_REG_OT_ALPHA__A,
1937126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0002, 0x0000 ) );
1938126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,  EC_SB_REG_ALPHA__A,
1939126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0002, 0x0000 ) );
1940126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1941126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskTdTpsPwr  = EQ_TD_TPS_PWR_UNKNOWN;
1942126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16TdTpsPwr = EQ_TD_TPS_PWR_QAM16_ALPHA2;
1943126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64TdTpsPwr = EQ_TD_TPS_PWR_QAM64_ALPHA2;
1944126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1945126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskIsGainMan =
1946126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_MAN__PRE;
1947126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainMan =
1948126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_16QAM_A2_MAN__PRE;
1949126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainMan =
1950126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_64QAM_A2_MAN__PRE;
1951126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1952126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskIsGainExp  =
1953126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_EXP__PRE;
1954126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainExp =
1955126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_16QAM_A2_EXP__PRE;
1956126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainExp =
1957126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_64QAM_A2_EXP__PRE;
1958126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1959126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1960126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case HIERARCHY_4:
1961126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_HIER_A4;
1962126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
1963126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,  EQ_REG_OT_ALPHA__A,
1964126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0003, 0x0000 ));
1965126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,  EC_SB_REG_ALPHA__A,
1966126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0003, 0x0000 ) );
1967126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1968126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskTdTpsPwr  = EQ_TD_TPS_PWR_UNKNOWN;
1969126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16TdTpsPwr = EQ_TD_TPS_PWR_QAM16_ALPHA4;
1970126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64TdTpsPwr = EQ_TD_TPS_PWR_QAM64_ALPHA4;
1971126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1972126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskIsGainMan  =
1973126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_MAN__PRE;
1974126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainMan =
1975126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_16QAM_A4_MAN__PRE;
1976126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainMan =
1977126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_64QAM_A4_MAN__PRE;
1978126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1979126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskIsGainExp  =
1980126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_UNKNOWN_EXP__PRE;
1981126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainExp =
1982126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_16QAM_A4_EXP__PRE;
1983126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainExp =
1984126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_64QAM_A4_EXP__PRE;
1985126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
1986126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
1987126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case HIERARCHY_AUTO:
1988126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
1989126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Not set, detect it automatically, start with none */
1990126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_HIER__M;
1991126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_HIER_NO;
1992126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
1993126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state, EQ_REG_OT_ALPHA__A,
1994126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0000, 0x0000 ) );
1995126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state, EC_SB_REG_ALPHA__A,
1996126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0000, 0x0000 ) );
1997126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
1998126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskTdTpsPwr  = EQ_TD_TPS_PWR_QPSK;
1999126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16TdTpsPwr = EQ_TD_TPS_PWR_QAM16_ALPHAN;
2000126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64TdTpsPwr = EQ_TD_TPS_PWR_QAM64_ALPHAN;
2001126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2002126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskIsGainMan  =
2003126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_QPSK_MAN__PRE;
2004126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainMan =
2005126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_16QAM_MAN__PRE;
2006126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainMan =
2007126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_64QAM_MAN__PRE;
2008126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2009126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qpskIsGainExp  =
2010126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_QPSK_EXP__PRE;
2011126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam16IsGainExp =
2012126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_16QAM_EXP__PRE;
2013126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				qam64IsGainExp =
2014126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					SC_RA_RAM_EQ_IS_GAIN_64QAM_EXP__PRE;
2015126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2016126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2017126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2018126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( status );
2019126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2020126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch( p->constellation ) {
2021126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
2022126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_CONST__M;
2023126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* fall through , try first guess
2024126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   DRX_CONSTELLATION_QAM64 */
2025126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case QAM_64:
2026126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_CONST_QAM64;
2027126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
2028126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state, EQ_REG_OT_CONST__A,
2029126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0002, 0x0000 ) );
2030126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state, EC_SB_REG_CONST__A,
2031126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_CONST_64QAM,
2032126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0000) );
2033126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2034126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_SCALE_MSB__A,
2035126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0020, 0x0000 ) );
2036126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2037126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_SCALE_BIT2__A,
2038126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0008, 0x0000 ) );
2039126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2040126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_SCALE_LSB__A,
2041126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0002, 0x0000 ) );
2042126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2043126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2044126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EQ_REG_TD_TPS_PWR_OFS__A,
2045126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  qam64TdTpsPwr, 0x0000 ) );
2046126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,EQ_REG_SN_CEGAIN__A,
2047126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   qam64SnCeGain, 0x0000 ));
2048126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,EQ_REG_IS_GAIN_MAN__A,
2049126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   qam64IsGainMan, 0x0000 ));
2050126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,EQ_REG_IS_GAIN_EXP__A,
2051126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   qam64IsGainExp, 0x0000 ));
2052126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2053126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2054126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case QPSK   :
2055126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_CONST_QPSK;
2056126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
2057126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state, EQ_REG_OT_CONST__A,
2058126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0000, 0x0000 ) );
2059126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state, EC_SB_REG_CONST__A,
2060126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_CONST_QPSK,
2061126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0000) );
2062126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2063126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_SCALE_MSB__A,
2064126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0010, 0x0000 ) );
2065126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2066126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_SCALE_BIT2__A,
2067126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0000, 0x0000 ) );
2068126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2069126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_SCALE_LSB__A,
2070126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0000, 0x0000 ) );
2071126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2072126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2073126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EQ_REG_TD_TPS_PWR_OFS__A,
2074126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  qpskTdTpsPwr, 0x0000 ) );
2075126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state, EQ_REG_SN_CEGAIN__A,
2076126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   qpskSnCeGain, 0x0000 ));
2077126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
2078126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EQ_REG_IS_GAIN_MAN__A,
2079126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   qpskIsGainMan, 0x0000 ));
2080126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
2081126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EQ_REG_IS_GAIN_EXP__A,
2082126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   qpskIsGainExp, 0x0000 ));
2083126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2084126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2085126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2086126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case QAM_16:
2087126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_CONST_QAM16;
2088126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
2089126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state, EQ_REG_OT_CONST__A,
2090126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0001, 0x0000 ) );
2091126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state, EC_SB_REG_CONST__A,
2092126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_CONST_16QAM,
2093126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0000) );
2094126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2095126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_SCALE_MSB__A,
2096126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0010, 0x0000 ) );
2097126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2098126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_SCALE_BIT2__A,
2099126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0004, 0x0000 ) );
2100126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2101126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EC_SB_REG_SCALE_LSB__A,
2102126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  0x0000, 0x0000 ) );
2103126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2104126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR(Write16(state,
2105126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  EQ_REG_TD_TPS_PWR_OFS__A,
2106126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  qam16TdTpsPwr, 0x0000 ) );
2107126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state, EQ_REG_SN_CEGAIN__A,
2108126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   qam16SnCeGain, 0x0000 ));
2109126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
2110126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EQ_REG_IS_GAIN_MAN__A,
2111126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   qam16IsGainMan, 0x0000 ));
2112126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
2113126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EQ_REG_IS_GAIN_EXP__A,
2114126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   qam16IsGainExp, 0x0000 ));
2115126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2116126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2117126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2118126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2119126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( status );
2120126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2121126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch (DRX_CHANNEL_HIGH) {
2122126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
2123126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case DRX_CHANNEL_AUTO:
2124126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case DRX_CHANNEL_LOW:
2125126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_PRIO_LO;
2126126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state,  EC_SB_REG_PRIOR__A,
2127126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   EC_SB_REG_PRIOR_LO, 0x0000 ));
2128126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2129126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case DRX_CHANNEL_HIGH:
2130126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_PRIO_HI;
2131126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state,  EC_SB_REG_PRIOR__A,
2132126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   EC_SB_REG_PRIOR_HI, 0x0000 ));
2133126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2134126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2135126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2136126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2137126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch( p->code_rate_HP )
2138126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
2139126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case FEC_1_2:
2140126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_1_2;
2141126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
2142126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
2143126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_VD_REG_SET_CODERATE__A,
2144126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_VD_REG_SET_CODERATE_C1_2,
2145126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0000 ) );
2146126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2147126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2148126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		default:
2149126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			operationMode |= SC_RA_RAM_OP_AUTO_RATE__M;
2150126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case FEC_2_3  :
2151126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_2_3;
2152126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
2153126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
2154126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_VD_REG_SET_CODERATE__A,
2155126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_VD_REG_SET_CODERATE_C2_3,
2156126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0000 ) );
2157126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2158126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2159126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case FEC_3_4  :
2160126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_3_4;
2161126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
2162126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state,
2163126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   EC_VD_REG_SET_CODERATE__A,
2164126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   EC_VD_REG_SET_CODERATE_C3_4,
2165126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   0x0000 ) );
2166126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2167126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2168126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case FEC_5_6  :
2169126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_5_6;
2170126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
2171126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
2172126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_VD_REG_SET_CODERATE__A,
2173126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_VD_REG_SET_CODERATE_C5_6,
2174126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0000 ) );
2175126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2176126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2177126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case FEC_7_8  :
2178126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_7_8;
2179126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if (state->type_A) {
2180126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				CHK_ERROR( Write16(state,
2181126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_VD_REG_SET_CODERATE__A,
2182126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   EC_VD_REG_SET_CODERATE_C7_8,
2183126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						   0x0000 ) );
2184126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2185126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2186126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2187126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( status );
2188126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2189126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* First determine real bandwidth (Hz) */
2190126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Also set delay for impulse noise cruncher (only A2) */
2191126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Also set parameters for EC_OC fix, note
2192126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   EC_OC_REG_TMD_HIL_MAR is changed
2193126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   by SC for fix for some 8K,1/8 guard but is restored by
2194126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   InitEC and ResetEC
2195126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		   functions */
2196126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		switch( p->bandwidth )
2197126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
2198126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case BANDWIDTH_AUTO:
2199126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case BANDWIDTH_8_MHZ:
2200126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* (64/7)*(8/8)*1000000 */
2201126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_8MHZ_IN_HZ;
2202126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2203126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidthParam = 0;
2204126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = Write16(state,
2205126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 FE_AG_REG_IND_DEL__A , 50 , 0x0000 );
2206126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2207126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case BANDWIDTH_7_MHZ:
2208126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* (64/7)*(7/8)*1000000 */
2209126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_7MHZ_IN_HZ;
2210126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidthParam =0x4807; /*binary:0100 1000 0000 0111 */
2211126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = Write16(state,
2212126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 FE_AG_REG_IND_DEL__A , 59 , 0x0000 );
2213126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2214126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		case BANDWIDTH_6_MHZ:
2215126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* (64/7)*(6/8)*1000000 */
2216126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidth = DRXD_BANDWIDTH_6MHZ_IN_HZ;
2217126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			bandwidthParam =0x0F07; /*binary: 0000 1111 0000 0111*/
2218126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			status = Write16(state,
2219126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 FE_AG_REG_IND_DEL__A , 71 , 0x0000 );
2220126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			break;
2221126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2222126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( status );
2223126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2224126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,
2225126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   SC_RA_RAM_BAND__A, bandwidthParam, 0x0000));
2226126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2227126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
2228126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			u16 sc_config;
2229126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Read16(state,
2230126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 SC_RA_RAM_CONFIG__A, &sc_config, 0));
2231126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2232126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* enable SLAVE mode in 2k 1/32 to
2233126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   prevent timing change glitches */
2234126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if ( (p->transmission_mode==TRANSMISSION_MODE_2K) &&
2235126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			     (p->guard_interval==GUARD_INTERVAL_1_32) ) {
2236126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				/* enable slave */
2237126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				sc_config |= SC_RA_RAM_CONFIG_SLAVE__M;
2238126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			} else {
2239126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				/* disable slave */
2240126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				sc_config &= ~SC_RA_RAM_CONFIG_SLAVE__M;
2241126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2242126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state,
2243126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   SC_RA_RAM_CONFIG__A, sc_config,0 ));
2244126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2245126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2246126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( SetCfgNoiseCalibration(state, &state->noise_cal));
2247126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2248126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->cscd_state == CSCD_INIT )
2249126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
2250126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* switch on SRMM scan in SC */
2251126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR( Write16(state,
2252126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   SC_RA_RAM_SAMPLE_RATE_COUNT__A,
2253126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   DRXD_OSCDEV_DO_SCAN, 0x0000 ));
2254126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/*            CHK_ERROR( Write16( SC_RA_RAM_SAMPLE_RATE_STEP__A,
2255126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	      DRXD_OSCDEV_STEP  , 0x0000 ));*/
2256126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->cscd_state = CSCD_SET;
2257126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2258126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2259126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2260126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Now compute FE_IF_REG_INCR */
2261126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/*((( SysFreq/BandWidth)/2)/2) -1) * 2^23) =>
2262126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		  ((SysFreq / BandWidth) * (2^21) ) - (2^23)*/
2263126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		feIfIncr = MulDiv32(state->sys_clock_freq*1000,
2264126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			    ( 1ULL<< 21 ), bandwidth) - (1<<23) ;
2265126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,
2266126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   FE_IF_REG_INCR0__A,
2267126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   (u16)(feIfIncr & FE_IF_REG_INCR0__M ),
2268126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   0x0000) );
2269126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,
2270126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   FE_IF_REG_INCR1__A,
2271126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				   (u16)((feIfIncr >> FE_IF_REG_INCR0__W) &
2272126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 FE_IF_REG_INCR1__M ), 0x0000) );
2273126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Bandwidth setting done */
2274126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2275126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Mirror & frequency offset */
2276126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		SetFrequencyShift(state, off, mirrorFreqSpect);
2277126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2278126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Start SC, write channel settings to SC */
2279126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2280126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Enable SC after setting all other parameters */
2281126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,  SC_COMM_STATE__A, 0, 0x0000));
2282126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( Write16(state,  SC_COMM_EXEC__A, 1, 0x0000));
2283126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2284126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Write SC parameter registers, operation mode */
2285126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#if 1
2286126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		operationMode =( SC_RA_RAM_OP_AUTO_MODE__M  |
2287126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  SC_RA_RAM_OP_AUTO_GUARD__M |
2288126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  SC_RA_RAM_OP_AUTO_CONST__M |
2289126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  SC_RA_RAM_OP_AUTO_HIER__M  |
2290126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  SC_RA_RAM_OP_AUTO_RATE__M  );
2291126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
2292126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( SC_SetPrefParamCommand(state, 0x0000,
2293126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  transmissionParams,
2294126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						  operationMode) );
2295126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2296126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Start correct processes to get in lock */
2297126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( SC_ProcStartCommand(state, SC_RA_RAM_PROC_LOCKTRACK,
2298126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					       SC_RA_RAM_SW_EVENT_RUN_NMASK__M,
2299126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					       SC_RA_RAM_LOCKTRACK_MIN) );
2300126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2301126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( StartOC(state) );
2302126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2303126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if( state->operation_mode != OM_Default ) {
2304126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(StartDiversity(state));
2305126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2306126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2307126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->drxd_state = DRXD_STARTED;
2308126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while(0);
2309126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2310126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
2311126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2312126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2313126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int CDRXD(struct drxd_state *state, u32 IntermediateFrequency)
2314126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2315126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcOutputLevel = 0xffffffff;
2316126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcSettleLevel = 528;           /* Optimum value for MT2060 */
2317126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcMinLevel = 0;                    /* Currently unused */
2318126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcMaxLevel = DRXD_FE_CTRL_MAX; /* Currently unused */
2319126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcSpeed = 0;                       /* Currently unused */
2320126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcMode = 0;/*2;   Off */
2321126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcR1 =  820;
2322126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcR2 = 2200;
2323126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulRfAgcR3 =  150;
2324126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcMode = 0;  /* Auto */
2325126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcOutputLevel = 0xffffffff;
2326126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcSettleLevel = 0xffffffff;
2327126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcMinLevel = 0xffffffff;
2328126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcMaxLevel = 0xffffffff;
2329126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcSpeed = 0xffffffff;
2330126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcR1 =  820;
2331126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcR2 = 2200;
2332126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIfAgcR3 =  150;
2333126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulClock = state->config.clock;
2334126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulSerialMode = 0;
2335126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulEcOcRegOcModeLop = 4; /* Dynamic DTO source */
2336126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulHiI2cDelay = HI_I2C_DELAY;
2337126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulHiI2cBridgeDelay = HI_I2C_BRIDGE_DELAY;
2338126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulHiI2cPatch = 0;
2339126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulEnvironment          = APPENV_PORTABLE;
2340126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulEnvironmentDiversity = APPENV_MOBILE;
2341126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 ulIFFilter = IFFILTER_SAW;
2342126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2343126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.ctrlMode  = AGC_CTRL_AUTO;
2344126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.outputLevel = 0;
2345126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.settleLevel = 140;
2346126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.minOutputLevel = 0;
2347126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.maxOutputLevel = 1023;
2348126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.speed = 904;
2349126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2350126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( ulIfAgcMode == 1 && ulIfAgcOutputLevel <= DRXD_FE_CTRL_MAX )
2351126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	{
2352126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->if_agc_cfg.ctrlMode  = AGC_CTRL_USER;
2353126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->if_agc_cfg.outputLevel = (u16)(ulIfAgcOutputLevel);
2354126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2355126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2356126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( ulIfAgcMode == 0 &&
2357126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulIfAgcSettleLevel <= DRXD_FE_CTRL_MAX &&
2358126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulIfAgcMinLevel <= DRXD_FE_CTRL_MAX &&
2359126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulIfAgcMaxLevel <= DRXD_FE_CTRL_MAX &&
2360126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulIfAgcSpeed <= DRXD_FE_CTRL_MAX
2361126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		)
2362126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	{
2363126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->if_agc_cfg.ctrlMode  = AGC_CTRL_AUTO;
2364126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->if_agc_cfg.settleLevel = (u16)(ulIfAgcSettleLevel);
2365126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->if_agc_cfg.minOutputLevel = (u16)(ulIfAgcMinLevel);
2366126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->if_agc_cfg.maxOutputLevel = (u16)(ulIfAgcMaxLevel);
2367126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->if_agc_cfg.speed = (u16)(ulIfAgcSpeed);
2368126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2369126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2370126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.R1 = (u16)(ulIfAgcR1);
2371126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.R2 = (u16)(ulIfAgcR2);
2372126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->if_agc_cfg.R3 = (u16)(ulIfAgcR3);
2373126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2374126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->rf_agc_cfg.R1 = (u16)(ulRfAgcR1);
2375126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->rf_agc_cfg.R2 = (u16)(ulRfAgcR2);
2376126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->rf_agc_cfg.R3 = (u16)(ulRfAgcR3);
2377126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2378126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->rf_agc_cfg.ctrlMode  = AGC_CTRL_AUTO;
2379126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* rest of the RFAgcCfg structure currently unused */
2380126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (ulRfAgcMode==1 && ulRfAgcOutputLevel<=DRXD_FE_CTRL_MAX) {
2381126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->rf_agc_cfg.ctrlMode  = AGC_CTRL_USER;
2382126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->rf_agc_cfg.outputLevel = (u16)(ulRfAgcOutputLevel);
2383126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2384126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2385126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( ulRfAgcMode == 0 &&
2386126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulRfAgcSettleLevel <= DRXD_FE_CTRL_MAX &&
2387126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulRfAgcMinLevel <= DRXD_FE_CTRL_MAX &&
2388126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulRfAgcMaxLevel <= DRXD_FE_CTRL_MAX &&
2389126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    ulRfAgcSpeed <= DRXD_FE_CTRL_MAX
2390126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		)
2391126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	{
2392126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->rf_agc_cfg.ctrlMode  = AGC_CTRL_AUTO;
2393126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->rf_agc_cfg.settleLevel = (u16)(ulRfAgcSettleLevel);
2394126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->rf_agc_cfg.minOutputLevel = (u16)(ulRfAgcMinLevel);
2395126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->rf_agc_cfg.maxOutputLevel = (u16)(ulRfAgcMaxLevel);
2396126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->rf_agc_cfg.speed = (u16)(ulRfAgcSpeed);
2397126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2398126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2399126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( ulRfAgcMode == 2 )
2400126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	{
2401126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->rf_agc_cfg.ctrlMode  = AGC_CTRL_OFF;
2402126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2403126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2404126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (ulEnvironment <= 2)
2405126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->app_env_default   = (enum app_env)
2406126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(ulEnvironment);
2407126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (ulEnvironmentDiversity <= 2)
2408126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->app_env_diversity = (enum app_env)
2409126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(ulEnvironmentDiversity);
2410126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2411126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if( ulIFFilter == IFFILTER_DISCRETE )
2412126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	{
2413126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* discrete filter */
2414126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->noise_cal.cpOpt     = 0;
2415126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->noise_cal.cpNexpOfs =  40;
2416126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->noise_cal.tdCal2k   = -40;
2417126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->noise_cal.tdCal8k   = -24;
2418126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} else {
2419126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* SAW filter */
2420126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->noise_cal.cpOpt     = 1;
2421126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->noise_cal.cpNexpOfs =   0;
2422126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->noise_cal.tdCal2k   = -21;
2423126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->noise_cal.tdCal8k   = -24;
2424126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2425126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->m_EcOcRegOcModeLop = (u16)(ulEcOcRegOcModeLop);
2426126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2427126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->chip_adr = (state->config.demod_address<<1)|1;
2428126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	switch( ulHiI2cPatch )
2429126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	{
2430126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	case 1 : state->m_HiI2cPatch = DRXD_HiI2cPatch_1; break;
2431126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	case 3 : state->m_HiI2cPatch = DRXD_HiI2cPatch_3; break;
2432126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	default:
2433126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->m_HiI2cPatch = NULL;
2434126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2435126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2436126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* modify tuner and clock attributes */
2437126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->intermediate_freq = (u16)(IntermediateFrequency/1000);
2438126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* expected system clock frequency in kHz */
2439126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->expected_sys_clock_freq = 48000;
2440126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* real system clock frequency in kHz */
2441126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->sys_clock_freq = 48000;
2442126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->osc_clock_freq     = (u16) ulClock;
2443126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->osc_clock_deviation = 0;
2444126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->cscd_state = CSCD_INIT;
2445126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->drxd_state = DRXD_UNINITIALIZED;
2446126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2447126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->PGA=0;
2448126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->type_A=0;
2449126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->tuner_mirrors=0;
2450126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2451126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* modify MPEG output attributes */
2452126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->insert_rs_byte = 0;
2453126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->enable_parallel = (ulSerialMode != 1);
2454126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2455126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Timing div, 250ns/Psys */
2456126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Timing div, = ( delay (nano seconds) * sysclk (kHz) )/ 1000 */
2457126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2458126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->hi_cfg_timing_div = (u16)((state->sys_clock_freq/1000)*
2459126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					 ulHiI2cDelay)/1000 ;
2460126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Bridge delay, uses oscilator clock */
2461126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* Delay = ( delay (nano seconds) * oscclk (kHz) )/ 1000 */
2462126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->hi_cfg_bridge_delay = (u16)((state->osc_clock_freq/1000) *
2463126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					   ulHiI2cBridgeDelay)/1000 ;
2464126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2465126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->m_FeAgRegAgPwd = DRXD_DEF_AG_PWD_CONSUMER;
2466126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* state->m_FeAgRegAgPwd = DRXD_DEF_AG_PWD_PRO; */
2467126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->m_FeAgRegAgAgcSio = DRXD_DEF_AG_AGC_SIO;
2468126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2469126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2470126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2471126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerint DRXD_init(struct drxd_state *state, const u8 *fw, u32 fw_size)
2472126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2473126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int status=0;
2474126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 driverVersion;
2475126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2476126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (state->init_done)
2477126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return 0;
2478126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2479126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	CDRXD(state, state->config.IF ? state->config.IF : 36000000);
2480126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2481126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	do {
2482126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->operation_mode = OM_Default;
2483126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2484126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( SetDeviceTypeId(state) );
2485126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2486126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Apply I2c address patch to B1 */
2487126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if( !state->type_A && state->m_HiI2cPatch != NULL )
2488126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(WriteTable(state, state->m_HiI2cPatch));
2489126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2490126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->type_A) {
2491126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* HI firmware patch for UIO readout,
2492126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			   avoid clearing of result register */
2493126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(Write16(state, 0x43012D, 0x047f, 0));
2494126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2495126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2496126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( HI_ResetCommand(state));
2497126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2498126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(StopAllProcessors(state));
2499126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitCC(state));
2500126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2501126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->osc_clock_deviation = 0;
2502126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2503126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->config.osc_deviation)
2504126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->osc_clock_deviation =
2505126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				state->config.osc_deviation(state->priv,
2506126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler							    0, 0);
2507126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		{
2508126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* Handle clock deviation */
2509126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			s32 devB;
2510126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			s32 devA = (s32)(state->osc_clock_deviation) *
2511126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				(s32)(state->expected_sys_clock_freq);
2512126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* deviation in kHz */
2513126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			s32 deviation = ( devA /(1000000L));
2514126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			/* rounding, signed */
2515126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if ( devA > 0 )
2516126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				devB=(2);
2517126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			else
2518126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				devB=(-2);
2519126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			if ( (devB*(devA%1000000L)>1000000L ) )
2520126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			{
2521126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				/* add +1 or -1 */
2522126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				deviation += (devB/2);
2523126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			}
2524126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2525126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->sys_clock_freq=(u16)((state->
2526126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						     expected_sys_clock_freq)+
2527126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						    deviation);
2528126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2529126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitHI(state));
2530126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitAtomicRead(state));
2531126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2532126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(EnableAndResetMB(state));
2533126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->type_A)
2534126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(ResetCEFR(state));
2535126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2536126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (fw) {
2537126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(DownloadMicrocode(state, fw, fw_size));
2538126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
2539126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			CHK_ERROR(DownloadMicrocode(state, state->microcode,
2540126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler						    state->microcode_length));
2541126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2542126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2543126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (state->PGA) {
2544126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->m_FeAgRegAgPwd = DRXD_DEF_AG_PWD_PRO;
2545126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			SetCfgPga(state, 0);  /* PGA = 0 dB */
2546126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		} else {
2547126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			state->m_FeAgRegAgPwd = DRXD_DEF_AG_PWD_CONSUMER;
2548126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		}
2549126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2550126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->m_FeAgRegAgAgcSio = DRXD_DEF_AG_AGC_SIO;
2551126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2552126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitFE(state));
2553126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitFT(state));
2554126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitCP(state));
2555126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitCE(state));
2556126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitEQ(state));
2557126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitEC(state));
2558126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(InitSC(state));
2559126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2560126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(SetCfgIfAgc(state, &state->if_agc_cfg));
2561126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(SetCfgRfAgc(state, &state->rf_agc_cfg));
2562126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2563126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->cscd_state = CSCD_INIT;
2564126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, SC_COMM_EXEC__A,
2565126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  SC_COMM_EXEC_CTL_STOP, 0));
2566126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write16(state, LC_COMM_EXEC__A,
2567126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  SC_COMM_EXEC_CTL_STOP, 0 ));
2568126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2569126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2570126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		driverVersion  = (((VERSION_MAJOR/10)  << 4) +
2571126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  (VERSION_MAJOR%10)) << 24;
2572126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		driverVersion += (((VERSION_MINOR/10)  << 4) +
2573126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  (VERSION_MINOR%10)) << 16;
2574126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		driverVersion +=  ((VERSION_PATCH/1000)<<12) +
2575126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			((VERSION_PATCH/100)<<8) +
2576126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			((VERSION_PATCH/10  )<< 4) +
2577126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			(VERSION_PATCH%10 );
2578126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2579126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR(Write32(state, SC_RA_RAM_DRIVER_VERSION__AX,
2580126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  driverVersion,0 ));
2581126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2582126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		CHK_ERROR( StopOC(state) );
2583126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2584126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->drxd_state = DRXD_STOPPED;
2585126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		state->init_done=1;
2586126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		status=0;
2587126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	} while (0);
2588126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return status;
2589126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2590126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2591126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerint DRXD_status(struct drxd_state *state, u32 *pLockStatus)
2592126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2593126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	DRX_GetLockStatus(state, pLockStatus);
2594126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2595126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/*if (*pLockStatus&DRX_LOCK_MPEG)*/
2596126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (*pLockStatus&DRX_LOCK_FEC) {
2597126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		ConfigureMPEGOutput(state, 1);
2598126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/* Get status again, in case we have MPEG lock now */
2599126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		/*DRX_GetLockStatus(state, pLockStatus);*/
2600126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2601126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2602126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2603126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2604126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2605126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
2606126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
2607126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/****************************************************************************/
2608126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2609126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_read_signal_strength(struct dvb_frontend *fe,
2610126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler					u16 *strength)
2611126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2612126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state = fe->demodulator_priv;
2613126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 value;
2614126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int res;
2615126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2616126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	res=ReadIFAgc(state, &value);
2617126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (res<0)
2618126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*strength=0;
2619126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	else
2620126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*strength=0xffff-(value<<4);
2621126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2622126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2623126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2624126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2625126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_read_status(struct dvb_frontend *fe, fe_status_t *status)
2626126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2627126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state = fe->demodulator_priv;
2628126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	u32 lock;
2629126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2630126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	DRXD_status(state, &lock);
2631126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*status=0;
2632126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* No MPEG lock in V255 firmware, bug ? */
2633126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#if 1
2634126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (lock&DRX_LOCK_MPEG)
2635126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*status|=FE_HAS_LOCK;
2636126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#else
2637126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (lock&DRX_LOCK_FEC)
2638126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*status|=FE_HAS_LOCK;
2639126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
2640126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (lock&DRX_LOCK_FEC)
2641126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*status|=FE_HAS_VITERBI|FE_HAS_SYNC;
2642126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (lock&DRX_LOCK_DEMOD)
2643126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		*status|=FE_HAS_CARRIER|FE_HAS_SIGNAL;
2644126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2645126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2646126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2647126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2648126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_init(struct dvb_frontend *fe)
2649126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2650126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state=fe->demodulator_priv;
2651126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	int err=0;
2652126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2653126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler/*	if (request_firmware(&state->fw, "drxd.fw", state->dev)<0) */
2654126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return DRXD_init(state, 0, 0);
2655126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2656126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	err=DRXD_init(state, state->fw->data, state->fw->size);
2657126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	release_firmware(state->fw);
2658126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return err;
2659126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2660126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2661126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerint drxd_config_i2c(struct dvb_frontend *fe, int onoff)
2662126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2663126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state=fe->demodulator_priv;
2664126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2665126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return DRX_ConfigureI2CBridge(state, onoff);
2666126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2667126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2668126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_get_tune_settings(struct dvb_frontend *fe,
2669126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				     struct dvb_frontend_tune_settings *sets)
2670126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2671126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	sets->min_delay_ms=10000;
2672126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	sets->max_drift=0;
2673126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	sets->step_size=0;
2674126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2675126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2676126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2677126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_read_ber(struct dvb_frontend *fe, u32 *ber)
2678126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2679126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*ber = 0;
2680126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2681126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2682126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2683126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_read_snr(struct dvb_frontend *fe, u16 *snr)
2684126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2685126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*snr=0;
2686126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2687126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2688126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2689126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
2690126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2691126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	*ucblocks=0;
2692126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2693126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2694126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2695126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_sleep(struct dvb_frontend* fe)
2696126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2697126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state=fe->demodulator_priv;
2698126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2699126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	ConfigureMPEGOutput(state, 0);
2700126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2701126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2702126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2703126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_get_frontend(struct dvb_frontend *fe,
2704126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				struct dvb_frontend_parameters *param)
2705126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2706126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return 0;
2707126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2708126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2709126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
2710126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2711126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return drxd_config_i2c(fe, enable);
2712126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2713126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2714126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic int drxd_set_frontend(struct dvb_frontend *fe,
2715126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				struct dvb_frontend_parameters *param)
2716126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2717126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state=fe->demodulator_priv;
2718126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	s32 off=0;
2719126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2720126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->param=*param;
2721126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	DRX_Stop(state);
2722126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2723126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (fe->ops.tuner_ops.set_params) {
2724126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		fe->ops.tuner_ops.set_params(fe, param);
2725126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		if (fe->ops.i2c_gate_ctrl)
2726126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			fe->ops.i2c_gate_ctrl(fe, 0);
2727126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2728126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2729126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	/* FIXME: move PLL drivers */
2730126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (state->config.pll_set &&
2731126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	    state->config.pll_set(state->priv, param,
2732126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  state->config.pll_address,
2733126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  state->config.demoda_address,
2734126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				  &off)<0) {
2735126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		printk("Error in pll_set\n");
2736126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return -1;
2737126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	}
2738126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2739126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	msleep(200);
2740126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2741126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return DRX_Start(state, off);
2742126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2743126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2744126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2745126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic void drxd_release(struct dvb_frontend *fe)
2746126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2747126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state = fe->demodulator_priv;
2748126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2749126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	kfree(state);
2750126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2751126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2752126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstatic struct dvb_frontend_ops drxd_ops = {
2753126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2754126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.info = {
2755126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		.name			= "Micronas DRXD DVB-T",
2756126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		.type			= FE_OFDM,
2757126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		.frequency_min		= 47125000,
2758126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		.frequency_max		= 855250000,
2759126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		.frequency_stepsize	= 166667,
2760126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		.frequency_tolerance	= 0,
2761126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
2762126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
2763126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FE_CAN_FEC_AUTO |
2764126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FE_CAN_QAM_16 | FE_CAN_QAM_64 |
2765126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FE_CAN_QAM_AUTO |
2766126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FE_CAN_TRANSMISSION_MODE_AUTO |
2767126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FE_CAN_GUARD_INTERVAL_AUTO |
2768126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER |
2769126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler			FE_CAN_MUTE_TS
2770126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	},
2771126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2772126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.release = drxd_release,
2773126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.init = drxd_init,
2774126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.sleep = drxd_sleep,
2775126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.i2c_gate_ctrl = drxd_i2c_gate_ctrl,
2776126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2777126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.set_frontend = drxd_set_frontend,
2778126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.get_frontend = drxd_get_frontend,
2779126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.get_tune_settings = drxd_get_tune_settings,
2780126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2781126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_status = drxd_read_status,
2782126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_ber = drxd_read_ber,
2783126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_signal_strength = drxd_read_signal_strength,
2784126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_snr = drxd_read_snr,
2785126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	.read_ucblocks = drxd_read_ucblocks,
2786126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler};
2787126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2788126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlerstruct dvb_frontend *drxd_attach(const struct drxd_config *config,
2789126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 void *priv, struct i2c_adapter *i2c,
2790126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler				 struct device *dev)
2791126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler{
2792126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	struct drxd_state *state = NULL;
2793126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2794126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state=kmalloc(sizeof(struct drxd_state), GFP_KERNEL);
2795126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (!state)
2796126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		return NULL;
2797126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	memset(state, 0, sizeof(*state));
2798126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2799126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	memcpy(&state->ops, &drxd_ops, sizeof(struct dvb_frontend_ops));
2800126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->dev=dev;
2801126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->config=*config;
2802126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->i2c=i2c;
2803126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->priv=priv;
2804126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2805126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	sema_init(&state->mutex, 1);
2806126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2807126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	if (Read16(state, 0, 0, 0)<0)
2808126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler		goto error;
2809126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2810126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
2811126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->frontend.ops=&state->ops;
2812126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#else
2813126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	memcpy(&state->frontend.ops, &drxd_ops,
2814126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	       sizeof(struct dvb_frontend_ops));
2815126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler#endif
2816126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	state->frontend.demodulator_priv=state;
2817126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	ConfigureMPEGOutput(state, 0);
2818126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return &state->frontend;
2819126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2820126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzlererror:
2821126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	printk("drxd: not found\n");
2822126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	kfree(state);
2823126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler	return NULL;
2824126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler}
2825126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2826126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph MetzlerMODULE_DESCRIPTION("DRXD driver");
2827126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph MetzlerMODULE_AUTHOR("Micronas");
2828126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph MetzlerMODULE_LICENSE("GPL");
2829126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph Metzler
2830126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph MetzlerEXPORT_SYMBOL(drxd_attach);
2831126f1e61887085aa2c2cfa7644aee8295a94e1f7Ralph MetzlerEXPORT_SYMBOL(drxd_config_i2c);
2832