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