From 8d55a1329ee17f58b6c1cdaf09d3ce673d244ace Mon Sep 17 00:00:00 2001 From: Alex Frid Date: Mon, 14 Nov 2011 19:25:18 -0800 Subject: 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 (cherry picked from commit 16f545012457a04ba38f4f8bf80646b18a74cb2f) (cherry picked from commit bd29cb18f1d26cc3a0fdc8933a08158d623fed58) Change-Id: I080f21030007909bece5272ccdb93f8a85d4b13b Reviewed-on: http://git-master/r/66515 Tested-by: Aleksandr Frid Reviewed-by: Krishna Reddy Rebase-Id: R0561570b37cdff800f0a7f71558eef16eb82cc59 --- arch/arm/mach-tegra/tegra3_emc.c | 19 +++++++++++++++++++ arch/arm/mach-tegra/tegra3_emc.h | 5 +++++ 2 files changed, 24 insertions(+) (limited to 'arch/arm/mach-tegra') 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 -- cgit v1.2.3