diff options
author | Sang-Hun Lee <sanlee@nvidia.com> | 2013-11-27 18:10:48 -0500 |
---|---|---|
committer | Mitch Luban <mluban@nvidia.com> | 2013-12-01 11:33:13 -0800 |
commit | 4dc750d5ff35b5381207adbb8bf4b88918f33813 (patch) | |
tree | c6dada00e35b46c30e35428c740d5654905117e4 | |
parent | a1de1dd6bad24f4b237a76c94044882d2764595b (diff) |
Revert "arm: tegra: update emc dvfs sequence to v12413"
- Change 3906be deprecated 0x16 support
- Not all EMC tables are 0x18. Revert this change
until we have all tables in 0x18 version
This reverts commit 3906be6667d8f7770d344edca2b22de38d29677b.
Change-Id: I8229ce543c7795057055df032603bc1d44751041
Signed-off-by: Sang-Hun Lee <sanlee@nvidia.com>
Reviewed-on: http://git-master/r/336436
GVS: Gerrit_Virtual_Submit
Reviewed-by: Mitch Luban <mluban@nvidia.com>
-rw-r--r-- | arch/arm/mach-tegra/tegra12_emc.c | 185 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra12_emc.h | 2 | ||||
-rw-r--r-- | include/linux/platform_data/tegra_emc.h | 4 |
3 files changed, 46 insertions, 145 deletions
diff --git a/arch/arm/mach-tegra/tegra12_emc.c b/arch/arm/mach-tegra/tegra12_emc.c index 8b9f3e60b73a..e6819d1d0032 100644 --- a/arch/arm/mach-tegra/tegra12_emc.c +++ b/arch/arm/mach-tegra/tegra12_emc.c @@ -43,7 +43,6 @@ #include "tegra12_emc.h" #include "tegra_emc_dt_parse.h" - #ifdef CONFIG_TEGRA_EMC_SCALING_ENABLE static bool emc_enable = true; #else @@ -92,7 +91,7 @@ static struct emc_iso_usage tegra12_emc_iso_usage[] = { #define MHZ 1000000 #define TEGRA_EMC_ISO_USE_FREQ_MAX_NUM 13 #define PLL_C_DIRECT_FLOOR 333500000 -#define EMC_STATUS_UPDATE_TIMEOUT 1000 +#define EMC_STATUS_UPDATE_TIMEOUT 100 #define TEGRA_EMC_TABLE_MAX_SIZE 16 #define TEGRA_EMC_MODE_REG_17 0x00110000 @@ -140,6 +139,7 @@ enum { DEFINE_REG(TEGRA_EMC_BASE, EMC_EINPUT_DURATION), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_PUTERM_EXTRA), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_PUTERM_WIDTH), \ + DEFINE_REG(TEGRA_EMC_BASE, EMC_BGBIAS_CTL0), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_PUTERM_ADJ), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_CDB_CNTL_1), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_CDB_CNTL_2), \ @@ -258,6 +258,9 @@ enum { DEFINE_REG(TEGRA_EMC_BASE, EMC_ZCAL_WAIT_CNT), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_MRS_WAIT_CNT), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_MRS_WAIT_CNT2), \ + DEFINE_REG(TEGRA_EMC_BASE, EMC_AUTO_CAL_CONFIG2), \ + DEFINE_REG(TEGRA_EMC_BASE, EMC_AUTO_CAL_CONFIG3), \ + DEFINE_REG(TEGRA_EMC_BASE, EMC_AUTO_CAL_CONFIG), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_CTT), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_CTT_DURATION), \ DEFINE_REG(TEGRA_EMC_BASE, EMC_CFG_PIPE), \ @@ -333,13 +336,6 @@ enum { }; #undef DEFINE_REG -#define BGBIAS_VAL(val, reg, bit) \ - (((val)>>EMC_##reg##_##bit##_SHIFT) & 0x1) - -#define BGBIAS_SET_NUM(val, n, reg, bit) \ - (((val) & ~(0x1<<EMC_##reg##_##bit##_SHIFT)) | \ - (((n)&0x1) << (EMC_##reg##_##bit##_SHIFT))) - struct emc_sel { struct clk *input; u32 value; @@ -495,69 +491,47 @@ static inline void auto_cal_disable(void) } } -static inline void wait_auto_cal_disable(void) -{ - int err; - - err = wait_for_update(EMC_AUTO_CAL_STATUS, - EMC_AUTO_CAL_STATUS_ACTIVE, false); - if (err) { - pr_err("%s: wait disable auto-cal error: %d", __func__, err); - BUG(); - } -} -static inline unsigned int bgbias_preset(const struct tegra12_emc_table *next_timing, - const struct tegra12_emc_table *last_timing) -{ - static unsigned int ret; - static unsigned int data, reg_val; - ret = 0; - data = last_timing->emc_bgbias_ctl0; - reg_val = emc_readl(EMC_BGBIAS_CTL0); - - if ((BGBIAS_VAL(next_timing->emc_bgbias_ctl0, BGBIAS_CTL0, - BIAS0_DSC_E_PWRD_IBIAS_RX) == 0) && - (BGBIAS_VAL(reg_val, BGBIAS_CTL0, - BIAS0_DSC_E_PWRD_IBIAS_RX) == 1)) { - data = BGBIAS_SET_NUM(data, 0, BGBIAS_CTL0, - BIAS0_DSC_E_PWRD_IBIAS_RX); - ret = 1; - } - - if ((BGBIAS_VAL(reg_val, BGBIAS_CTL0, - BIAS0_DSC_E_PWRD) == 1) || - (BGBIAS_VAL(reg_val, BGBIAS_CTL0, - BIAS0_DSC_E_PWRD_IBIAS_VTTGEN) == 1)) - ret = 1; - - if (ret == 1) - emc_writel(data, EMC_BGBIAS_CTL0); - return ret; - -} - static inline bool dqs_preset(const struct tegra12_emc_table *next_timing, const struct tegra12_emc_table *last_timing) { bool ret = false; - static unsigned int data; - data = emc_readl(EMC_XM2DQSPADCTRL2); + int data; + data = last_timing->burst_regs[EMC_BGBIAS_CTL0_INDEX]; +#define BGBIAS_SET(reg, bit, program_condition) \ + do { \ + if (((next_timing->burst_regs[EMC_##reg##_INDEX] & \ + (0x1<<EMC_##reg##_##bit##_SHIFT)) == \ + (program_condition << EMC_##reg##_##bit##_SHIFT)) && \ + (((data & (0x1<<EMC_##reg##_##bit##_SHIFT))) != \ + (program_condition << EMC_##reg##_##bit##_SHIFT))) { \ + data = (data & \ + ~(0x1<<EMC_##reg##_##bit##_SHIFT)) | \ + (program_condition << \ + EMC_##reg##_##bit##_SHIFT); \ + ret = 1; \ + } \ + } while (0) + BGBIAS_SET(BGBIAS_CTL0, BIAS0_DSC_E_PWRD_IBIAS_RX, 0); + BGBIAS_SET(BGBIAS_CTL0, BIAS0_DSC_E_PWRD_IBIAS_VTTGEN, 0); + BGBIAS_SET(BGBIAS_CTL0, BIAS0_DSC_E_PWRD, 0); + if (ret == 1) + emc_writel(data, EMC_BGBIAS_CTL0); #define DQS_SET(reg, bit) \ do { \ + data = emc_readl(EMC_XM2DQSPADCTRL2); \ if ((next_timing->burst_regs[EMC_##reg##_INDEX] & \ EMC_##reg##_##bit##_ENABLE) && \ (!(data & \ EMC_##reg##_##bit##_ENABLE))) { \ - data = (data \ - | EMC_##reg##_##bit##_ENABLE); \ + emc_writel(data \ + | EMC_##reg##_##bit##_ENABLE, EMC_##reg); \ + pr_debug("dqs preset: presetting rx_ft_rec\n"); \ ret = true; \ } \ } while (0) DQS_SET(XM2DQSPADCTRL2, VREF); DQS_SET(XM2DQSPADCTRL2, RX_FT_REC); - if (ret == 1) - emc_writel(data, EMC_XM2DQSPADCTRL2); return ret; } @@ -663,11 +637,10 @@ static noinline void emc_set_clock(const struct tegra12_emc_table *next_timing, #ifndef EMULATE_CLOCK_SWITCH int i, dll_change, pre_wait, ctt_term_changed; bool cfg_pow_features_enabled, zcal_long; - u32 bgbias_ctl, auto_cal_status, auto_cal_config; + u32 assert_var; u32 emc_cfg_reg = emc_readl(EMC_CFG); u32 sel_dpd_ctrl = emc_readl(EMC_SEL_DPD_CTRL); u32 emc_cfg_2_reg = emc_readl(EMC_CFG_2); - auto_cal_status = emc_readl(EMC_AUTO_CAL_STATUS); cfg_pow_features_enabled = (emc_cfg_reg & EMC_CFG_PWR_MASK); dll_change = get_dll_change(next_timing, last_timing); zcal_long = (next_timing->burst_regs[EMC_ZCAL_INTERVAL_INDEX] != 0) && @@ -692,48 +665,28 @@ static noinline void emc_set_clock(const struct tegra12_emc_table *next_timing, } /* 2.5 check dq/dqs vref delay */ - if (bgbias_preset(next_timing, last_timing)) { - if (pre_wait < 5) - pre_wait = 5; - } if (dqs_preset(next_timing, last_timing)) { if (pre_wait < 30) pre_wait = 30; /* 3us+ for dqs vref settled */ } - if (pre_wait) { - emc_timing_update(); - udelay(pre_wait); - } - /* 2.5.1 Disable auto_cal for clock change*/ - emc_writel(0, EMC_AUTO_CAL_INTERVAL); - auto_cal_config = emc_readl(EMC_AUTO_CAL_CONFIG); - auto_cal_status = emc_readl(EMC_AUTO_CAL_STATUS); - - if (((next_timing->emc_auto_cal_config & 1) << - EMC_AUTO_CAL_CONFIG_AUTO_CAL_START_SHIFT) && - !((auto_cal_status >> EMC_AUTO_CAL_STATUS_SHIFT) & 1) && - !ctt_term_changed) { - auto_cal_config = ((auto_cal_config & - ~(1 << EMC_AUTO_CAL_CONFIG_AUTO_CAL_START_SHIFT)) - | (1 << EMC_AUTO_CAL_CONFIG_AUTO_CAL_START_SHIFT)); - emc_writel(auto_cal_config, EMC_AUTO_CAL_CONFIG); - } - /* 2.6 Program CTT_TERM Control if it changed since last time*/ - /* Bug-1258083, software hack for updating */ - /* EMC_CCT_TERM_CTRL/term-slope */ - /* offset values instantly */ - ctt_term_changed = (last_timing->emc_ctt_term_ctrl != - next_timing->emc_ctt_term_ctrl); + /* PLACE HOLDER FOR NOW , CODE TO BE ADDED + Bug-1258083, software hack for updating EMC_CCT_TERM_CTRL + /term-slope,offset values instantly*/ + ctt_term_changed = (last_timing->emc_ctt_term_ctrl + != next_timing->emc_ctt_term_ctrl); if (last_timing->emc_ctt_term_ctrl != - next_timing->emc_ctt_term_ctrl) { - auto_cal_disable(); - emc_writel(next_timing->emc_ctt_term_ctrl, EMC_CTT_TERM_CTRL); + next_timing->emc_ctt_term_ctrl) { + auto_cal_disable(); + emc_writel(next_timing->emc_ctt_term_ctrl, + EMC_CTT_TERM_CTRL); } - if (ctt_term_changed) - emc_timing_update(); + if (pre_wait || ctt_term_changed) { + emc_timing_update(); + udelay(pre_wait); + } /* 3. disable auto-cal if vref mode is switching - removed */ /* 4. program burst shadow registers */ @@ -745,26 +698,6 @@ static noinline void emc_set_clock(const struct tegra12_emc_table *next_timing, emc_cfg_reg = next_timing->emc_cfg; emc_cfg_reg = disable_power_features(emc_cfg_reg); ccfifo_writel(emc_cfg_reg, EMC_CFG); - - /*step 4.1 , program auto_cal_config - registers for proper offset propagation - bug 1372978 */ - if (last_timing->emc_auto_cal_config2 - != next_timing->emc_auto_cal_config2) - ccfifo_writel(next_timing->emc_auto_cal_config2, - EMC_AUTO_CAL_CONFIG2); - if (last_timing->emc_auto_cal_config3 != - next_timing->emc_auto_cal_config3) - ccfifo_writel(next_timing->emc_auto_cal_config3, - EMC_AUTO_CAL_CONFIG3); - if (last_timing->emc_auto_cal_config != - next_timing->emc_auto_cal_config) { - auto_cal_config = - next_timing->emc_auto_cal_config; - auto_cal_config = auto_cal_config & - ~(1 << EMC_AUTO_CAL_CONFIG_AUTO_CAL_START_SHIFT); - ccfifo_writel(auto_cal_config, EMC_AUTO_CAL_CONFIG); - } wmb(); barrier(); @@ -819,9 +752,6 @@ static noinline void emc_set_clock(const struct tegra12_emc_table *next_timing, ccfifo_writel(emc_cfg_2_reg, EMC_CFG_2); } - /* 11.2 disable auto_cal for clock change */ - wait_auto_cal_disable(); - /* 11.5 program burst_up_down registers if emc rate is going down */ if (next_timing->rate < last_timing->rate) { for (i = 0; i < next_timing->burst_up_down_regs_num; i++) @@ -856,31 +786,8 @@ static noinline void emc_set_clock(const struct tegra12_emc_table *next_timing, /* 17. set zcal wait count */ emc_writel(next_timing->emc_zcal_cnt_long, EMC_ZCAL_WAIT_CNT); - /* 17.1 turning of bgbias if lpddr3 dram and freq is low */ - auto_cal_config = emc_readl(EMC_AUTO_CAL_STATUS); - if ((dram_type == DRAM_TYPE_LPDDR2) && - (BGBIAS_VAL(next_timing->emc_bgbias_ctl0, - BGBIAS_CTL0, BIAS0_DSC_E_PWRD_IBIAS_RX) == 1)) { - - /* 17.1.3 Full power down bgbias */ - bgbias_ctl = next_timing->emc_bgbias_ctl0; - bgbias_ctl = BGBIAS_SET_NUM(bgbias_ctl, 1, - BGBIAS_CTL0, BIAS0_DSC_E_PWRD_IBIAS_VTTGEN); - bgbias_ctl = BGBIAS_SET_NUM(bgbias_ctl, 1, - BGBIAS_CTL0, BIAS0_DSC_E_PWRD); - emc_writel(bgbias_ctl, EMC_BGBIAS_CTL0); - } else { - if (dram_type == DRAM_TYPE_DDR3) - if (emc_readl(EMC_BGBIAS_CTL0) != - next_timing->emc_bgbias_ctl0) - emc_writel(next_timing->emc_bgbias_ctl0, - EMC_BGBIAS_CTL0); - emc_writel(next_timing->emc_acal_interval, - EMC_AUTO_CAL_INTERVAL); - } - /* 18. update restored timing */ - udelay(2); + udelay(4); /* 18.1. program sel_dpd at end so if any enabling needs to happen.*/ /* It happens at last,as dpd should off during clock change. */ /* bug 1342517 */ @@ -1306,7 +1213,7 @@ static int init_emc_table(const struct tegra12_emc_table *table, int table_size) tegra_emc_table_size = min(table_size, TEGRA_EMC_TABLE_MAX_SIZE); switch (table[0].rev) { - case 0x18: + case 0x16: start_timing.burst_regs_num = table[0].burst_regs_num; break; default: diff --git a/arch/arm/mach-tegra/tegra12_emc.h b/arch/arm/mach-tegra/tegra12_emc.h index e18ee56703e5..bb2d4ac64568 100644 --- a/arch/arm/mach-tegra/tegra12_emc.h +++ b/arch/arm/mach-tegra/tegra12_emc.h @@ -203,11 +203,9 @@ enum { #define EMC_TPD 0x15c #define EMC_AUTO_CAL_CONFIG 0x2a4 -#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_START_SHIFT 31 #define EMC_AUTO_CAL_INTERVAL 0x2a8 #define EMC_AUTO_CAL_STATUS 0x2ac #define EMC_AUTO_CAL_STATUS_ACTIVE (0x1 << 31) -#define EMC_AUTO_CAL_STATUS_SHIFT 31 #define EMC_REQ_CTRL 0x2b0 #define EMC_STATUS 0x2b4 #define EMC_STATUS_TIMING_UPDATE_STALLED (0x1 << 23) diff --git a/include/linux/platform_data/tegra_emc.h b/include/linux/platform_data/tegra_emc.h index fcb64cfbf606..b69e4ae127e8 100644 --- a/include/linux/platform_data/tegra_emc.h +++ b/include/linux/platform_data/tegra_emc.h @@ -178,10 +178,6 @@ struct tegra12_emc_table { u32 emc_cfg_2; u32 emc_sel_dpd_ctrl; u32 emc_cfg_dig_dll; - u32 emc_bgbias_ctl0; - u32 emc_auto_cal_config2; - u32 emc_auto_cal_config3; - u32 emc_auto_cal_config; u32 emc_mode_reset; u32 emc_mode_1; u32 emc_mode_2; |