diff options
author | Alex Frid <afrid@nvidia.com> | 2011-11-14 19:25:18 -0800 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2012-03-22 23:49:05 -0700 |
commit | 8d55a1329ee17f58b6c1cdaf09d3ce673d244ace (patch) | |
tree | cff5fb6fc2db3412ee81b19d8d28edde2cbc07b0 /arch | |
parent | 714dc758b622ba71d3825dfaa12e38afba6d5681 (diff) |
ARM: tegra: clock: Update EMC clock change procedure
Set MC arbiter limits before EMC clock change on Tegra3.
Bug 896654
Signed-off-by: Alex Frid <afrid@nvidia.com>
(cherry picked from commit 16f545012457a04ba38f4f8bf80646b18a74cb2f)
(cherry picked from commit bd29cb18f1d26cc3a0fdc8933a08158d623fed58)
Change-Id: I080f21030007909bece5272ccdb93f8a85d4b13b
Reviewed-on: http://git-master/r/66515
Tested-by: Aleksandr Frid <afrid@nvidia.com>
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
Rebase-Id: R0561570b37cdff800f0a7f71558eef16eb82cc59
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-tegra/tegra3_emc.c | 19 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra3_emc.h | 5 |
2 files changed, 24 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/tegra3_emc.c b/arch/arm/mach-tegra/tegra3_emc.c index e820801f96da..42f3151f0f68 100644 --- a/arch/arm/mach-tegra/tegra3_emc.c +++ b/arch/arm/mach-tegra/tegra3_emc.c @@ -288,6 +288,20 @@ static inline void auto_cal_disable(void) } } +static inline void set_mc_arbiter_limits(void) +{ + u32 reg = mc_readl(MC_EMEM_ARB_OUTSTANDING_REQ); + u32 max_val = 0x50 << EMC_MRS_WAIT_CNT_SHORT_WAIT_SHIFT; + + if (!(reg & MC_EMEM_ARB_OUTSTANDING_REQ_HOLDOFF_OVERRIDE) || + ((reg & MC_EMEM_ARB_OUTSTANDING_REQ_MAX_MASK) > max_val)) { + reg = MC_EMEM_ARB_OUTSTANDING_REQ_LIMIT_ENABLE | + MC_EMEM_ARB_OUTSTANDING_REQ_HOLDOFF_OVERRIDE | max_val; + mc_writel(reg, MC_EMEM_ARB_OUTSTANDING_REQ); + mc_writel(0x1, MC_TIMING_CONTROL); + } +} + static inline bool dqs_preset(const struct tegra_emc_table *next_timing, const struct tegra_emc_table *last_timing) { @@ -465,6 +479,11 @@ static noinline void emc_set_clock(const struct tegra_emc_table *next_timing, emc_writel(emc_cfg_reg, EMC_CFG); pre_wait = 5; /* 5us+ for self-refresh entry/exit */ } + + /* 2.25 update MC arbiter settings */ + set_mc_arbiter_limits(); + + /* 2.5 check dq/dqs vref delay */ if (dqs_preset(next_timing, last_timing)) { if (pre_wait < 3) pre_wait = 3; /* 3us+ for dqs vref settled */ diff --git a/arch/arm/mach-tegra/tegra3_emc.h b/arch/arm/mach-tegra/tegra3_emc.h index ccf7dcae5329..ef22873e614b 100644 --- a/arch/arm/mach-tegra/tegra3_emc.h +++ b/arch/arm/mach-tegra/tegra3_emc.h @@ -247,6 +247,11 @@ enum { #define MC_EMEM_ADR_CFG 0x54 #define MC_EMEM_ARB_CFG 0x90 #define MC_EMEM_ARB_OUTSTANDING_REQ 0x94 +#define MC_EMEM_ARB_OUTSTANDING_REQ_MAX_SHIFT 0 +#define MC_EMEM_ARB_OUTSTANDING_REQ_MAX_MASK \ + (0x1FF << MC_EMEM_ARB_OUTSTANDING_REQ_MAX_SHIFT) +#define MC_EMEM_ARB_OUTSTANDING_REQ_HOLDOFF_OVERRIDE (0x1 << 30) +#define MC_EMEM_ARB_OUTSTANDING_REQ_LIMIT_ENABLE (0x1 << 31) #define MC_EMEM_ARB_TIMING_RCD 0x98 #define MC_EMEM_ARB_TIMING_RP 0x9c #define MC_EMEM_ARB_TIMING_RC 0xa0 |