summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2011-11-14 19:25:18 -0800
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:50:19 -0800
commit3d47a7fe68514a183aebb9f3349a67a31e3ed8de (patch)
treedd53d17edebdd07351ef2af9ae1319df0be3a8d1 /arch
parent377729f700adec50b8d200601d30bd87aae83c5c (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.c19
-rw-r--r--arch/arm/mach-tegra/tegra3_emc.h5
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