diff options
author | Ray Poudrier <rapoudrier@nvidia.com> | 2012-03-01 16:35:11 -0800 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-05-17 06:41:07 -0700 |
commit | 104787a9aa88aa6a9ae8eca2ffac34acf59cf0f7 (patch) | |
tree | 4bbc4f248ca77dec8dafbd924490a944b92d17f1 /arch | |
parent | 128ff031bda2b00e02f408cf9b9f52b3a3444db9 (diff) |
ARM: tegra: emc: add eack_disable functionality
Bug 946110
Signed-off-by: Ray Poudrier <rapoudrier@nvidia.com>
Change-Id: I0d4c716c4ab7a60011018d6c13be4265cc9f7290
Reviewed-on: http://git-master/r/87061
(cherry picked from commit a7dad880dcea36fcb8223cf0b34cc1091d725a9f)
Reviewed-on: http://git-master/r/102360
Reviewed-by: Raymond Poudrier <rapoudrier@nvidia.com>
Tested-by: Raymond Poudrier <rapoudrier@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-tegra/tegra3_emc.c | 49 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra3_emc.h | 1 |
2 files changed, 50 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/tegra3_emc.c b/arch/arm/mach-tegra/tegra3_emc.c index 0725980bfa40..83136e3c08d1 100644 --- a/arch/arm/mach-tegra/tegra3_emc.c +++ b/arch/arm/mach-tegra/tegra3_emc.c @@ -350,6 +350,12 @@ static inline void disable_early_ack(u32 mc_override) override_val |= mc_override & MC_EMEM_ARB_OVERRIDE_EACK_MASK; } +static inline void enable_early_ack(u32 mc_override) +{ + mc_writel((mc_override | MC_EMEM_ARB_OVERRIDE_EACK_MASK), + MC_EMEM_ARB_OVERRIDE); +} + static inline bool dqs_preset(const struct tegra_emc_table *next_timing, const struct tegra_emc_table *last_timing) { @@ -1163,6 +1169,24 @@ int tegra_emc_set_over_temp_state(unsigned long state) return 0; } +int tegra_emc_set_eack_state(unsigned long state) +{ + unsigned long flags; + u32 mc_override; + + spin_lock_irqsave(&emc_access_lock, flags); + + mc_override = mc_readl(MC_EMEM_ARB_OVERRIDE); + + if (state) + enable_early_ack(mc_override); + else + disable_early_ack(mc_override); + + spin_unlock_irqrestore(&emc_access_lock, flags); + return 0; +} + #ifdef CONFIG_DEBUG_FS static struct dentry *emc_debugfs_root; @@ -1222,6 +1246,27 @@ static int over_temp_state_set(void *data, u64 val) DEFINE_SIMPLE_ATTRIBUTE(over_temp_state_fops, over_temp_state_get, over_temp_state_set, "%llu\n"); +static int eack_state_get(void *data, u64 *val) +{ + unsigned long flags; + u32 mc_override; + + spin_lock_irqsave(&emc_access_lock, flags); + mc_override = mc_readl(MC_EMEM_ARB_OVERRIDE); + spin_unlock_irqrestore(&emc_access_lock, flags); + + *val = (mc_override & MC_EMEM_ARB_OVERRIDE_EACK_MASK); + return 0; +} + +static int eack_state_set(void *data, u64 val) +{ + tegra_emc_set_eack_state(val); + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(eack_state_fops, eack_state_get, + eack_state_set, "%llu\n"); + static int __init tegra_emc_debug_init(void) { if (!tegra_emc_table) @@ -1243,6 +1288,10 @@ static int __init tegra_emc_debug_init(void) emc_debugfs_root, NULL, &over_temp_state_fops)) goto err_out; + if (!debugfs_create_file( + "eack_state", S_IRUGO | S_IWUGO, emc_debugfs_root, NULL, &eack_state_fops)) + goto err_out; + return 0; err_out: diff --git a/arch/arm/mach-tegra/tegra3_emc.h b/arch/arm/mach-tegra/tegra3_emc.h index cfde92c1355a..03bde19c4a7b 100644 --- a/arch/arm/mach-tegra/tegra3_emc.h +++ b/arch/arm/mach-tegra/tegra3_emc.h @@ -59,6 +59,7 @@ void tegra_emc_dram_type_init(struct clk *c); int tegra_emc_get_dram_type(void); int tegra_emc_get_dram_temperature(void); int tegra_emc_set_over_temp_state(unsigned long state); +int tegra_emc_set_eack_state(unsigned long state); #ifdef CONFIG_PM_SLEEP void tegra_mc_timing_restore(void); |