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