summaryrefslogtreecommitdiff
path: root/arch/arm/mm/cache-l2x0.c
diff options
context:
space:
mode:
authorGary King <gking@nvidia.com>2009-12-07 16:18:05 -0800
committerGary King <gking@nvidia.com>2009-12-07 16:18:05 -0800
commitbb11d46b72a4a2b53f890faa970a380cf0084bf2 (patch)
tree2d9d2955e069fed69febbe567a835fcc48ec6ec6 /arch/arm/mm/cache-l2x0.c
parente1b5e49debba7174e7b9c48195de8abfd54911dd (diff)
parent74ece4056571443eef30d4dff62180944b5a39d8 (diff)
Merge commit 'arm/2.6.28-arm' into android-tegra-2.6.29
Conflicts: MAINTAINERS arch/arm/Kconfig arch/arm/Makefile arch/arm/boot/compressed/head.S arch/arm/common/Makefile arch/arm/configs/realview-smp_defconfig arch/arm/configs/realview_defconfig arch/arm/configs/versatile_defconfig arch/arm/include/asm/elf.h arch/arm/include/asm/uaccess.h arch/arm/kernel/module.c arch/arm/kernel/signal.c arch/arm/mach-realview/Kconfig arch/arm/mach-realview/Makefile arch/arm/mach-realview/core.c arch/arm/mach-realview/core.h arch/arm/mach-realview/include/mach/board-pba8.h arch/arm/mach-realview/include/mach/debug-macro.S arch/arm/mach-realview/include/mach/hardware.h arch/arm/mach-realview/include/mach/irqs.h arch/arm/mach-realview/include/mach/memory.h arch/arm/mach-realview/include/mach/uncompress.h arch/arm/mach-realview/localtimer.c arch/arm/mach-realview/platsmp.c arch/arm/mach-realview/realview_eb.c arch/arm/mach-realview/realview_pb1176.c arch/arm/mach-realview/realview_pb11mp.c arch/arm/mach-realview/realview_pba8.c arch/arm/mm/Kconfig arch/arm/mm/copypage-v6.c arch/arm/mm/dma-mapping.c arch/arm/mm/proc-v7.S arch/arm/oprofile/op_model_mpcore.c arch/arm/tools/mach-types arch/arm/vfp/vfpmodule.c drivers/mtd/maps/integrator-flash.c drivers/net/smsc911x.c drivers/net/smsc911x.h
Diffstat (limited to 'arch/arm/mm/cache-l2x0.c')
-rw-r--r--arch/arm/mm/cache-l2x0.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c
index b480f1d3591f..b97081b9cefd 100644
--- a/arch/arm/mm/cache-l2x0.c
+++ b/arch/arm/mm/cache-l2x0.c
@@ -27,6 +27,7 @@
static void __iomem *l2x0_base;
static DEFINE_SPINLOCK(l2x0_lock);
+bool l2x0_disabled;
static inline void sync_writel(unsigned long val, unsigned long reg,
unsigned long complete_mask)
@@ -34,7 +35,11 @@ static inline void sync_writel(unsigned long val, unsigned long reg,
unsigned long flags;
spin_lock_irqsave(&l2x0_lock, flags);
+#ifdef CONFIG_ARM_ERRATA_484863
+ asm volatile("swp %0, %0, [%1]\n" : "+r" (val) : "r" (l2x0_base + reg));
+#else
writel(val, l2x0_base + reg);
+#endif
/* wait for the operation to complete */
while (readl(l2x0_base + reg) & complete_mask)
;
@@ -97,20 +102,25 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)
{
__u32 aux;
- l2x0_base = base;
+ if (l2x0_disabled) {
+ printk(KERN_INFO "L2X0 cache controller disabled\n");
+ return;
+ }
- /* disable L2X0 */
- writel(0, l2x0_base + L2X0_CTRL);
+ l2x0_base = base;
- aux = readl(l2x0_base + L2X0_AUX_CTRL);
- aux &= aux_mask;
- aux |= aux_val;
- writel(aux, l2x0_base + L2X0_AUX_CTRL);
+ if (!(readl(l2x0_base + L2X0_CTRL) & 1)) {
+ /* L2X0 cache controller disabled */
+ aux = readl(l2x0_base + L2X0_AUX_CTRL);
+ aux &= aux_mask;
+ aux |= aux_val;
+ writel(aux, l2x0_base + L2X0_AUX_CTRL);
- l2x0_inv_all();
+ l2x0_inv_all();
- /* enable L2X0 */
- writel(1, l2x0_base + L2X0_CTRL);
+ /* enable L2X0 */
+ writel(1, l2x0_base + L2X0_CTRL);
+ }
outer_cache.inv_range = l2x0_inv_range;
outer_cache.clean_range = l2x0_clean_range;
@@ -118,3 +128,10 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)
printk(KERN_INFO "L2X0 cache controller enabled\n");
}
+
+static int __init l2x0_disable(char *unused)
+{
+ l2x0_disabled = 1;
+ return 0;
+}
+early_param("nol2x0", l2x0_disable);