ARM: tegra: emc: add eack_disable functionality
[linux-2.6.git] / arch / arm / mach-tegra / tegra3_emc.c
index 0725980..83136e3 100644 (file)
@@ -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: