Merge branch 'samsung/exynos5' into next/soc2
[linux-2.6.git] / arch / arm / mach-tegra / common.c
index 0fafb60..68815ce 100644 (file)
 #include <asm/hardware/gic.h>
 
 #include <mach/iomap.h>
-#include <mach/system.h>
+#include <mach/powergate.h>
 
 #include "board.h"
 #include "clock.h"
 #include "fuse.h"
+#include "pmc.h"
 
-void (*arch_reset)(char mode, const char *cmd) = tegra_assert_system_reset;
+/*
+ * Storage for debug-macro.S's state.
+ *
+ * This must be in .data not .bss so that it gets initialized each time the
+ * kernel is loaded. The data is declared here rather than debug-macro.S so
+ * that multiple inclusions of debug-macro.S point at the same data.
+ */
+#define TEGRA_DEBUG_UART_OFFSET (TEGRA_DEBUG_UART_BASE & 0xFFFF)
+u32 tegra_uart_config[3] = {
+       /* Debug UART initialization required */
+       1,
+       /* Debug UART physical address */
+       (u32)(IO_APB_PHYS + TEGRA_DEBUG_UART_OFFSET),
+       /* Debug UART virtual address */
+       (u32)(IO_APB_VIRT + TEGRA_DEBUG_UART_OFFSET),
+};
 
+#ifdef CONFIG_OF
 static const struct of_device_id tegra_dt_irq_match[] __initconst = {
        { .compatible = "arm,cortex-a9-gic", .data = gic_of_init },
        { }
@@ -45,15 +62,15 @@ void __init tegra_dt_init_irq(void)
        tegra_init_irq();
        of_irq_init(tegra_dt_irq_match);
 }
+#endif
 
 void tegra_assert_system_reset(char mode, const char *cmd)
 {
-       void __iomem *reset = IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x04);
+       void __iomem *reset = IO_ADDRESS(TEGRA_PMC_BASE + 0);
        u32 reg;
 
-       /* use *_related to avoid spinlock since caches are off */
        reg = readl_relaxed(reset);
-       reg |= 0x04;
+       reg |= 0x10;
        writel_relaxed(reg, reset);
 }
 
@@ -76,15 +93,20 @@ static __initdata struct tegra_clk_init_table tegra20_clk_init_table[] = {
 };
 #endif
 
-static void __init tegra_init_cache(void)
+static void __init tegra_init_cache(u32 tag_latency, u32 data_latency)
 {
 #ifdef CONFIG_CACHE_L2X0
        void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000;
+       u32 aux_ctrl, cache_type;
+
+       writel_relaxed(tag_latency, p + L2X0_TAG_LATENCY_CTRL);
+       writel_relaxed(data_latency, p + L2X0_DATA_LATENCY_CTRL);
 
-       writel_relaxed(0x331, p + L2X0_TAG_LATENCY_CTRL);
-       writel_relaxed(0x441, p + L2X0_DATA_LATENCY_CTRL);
+       cache_type = readl(p + L2X0_CACHE_TYPE);
+       aux_ctrl = (cache_type & 0x700) << (17-8);
+       aux_ctrl |= 0x6C000001;
 
-       l2x0_init(p, 0x6C080001, 0x8200c3fe);
+       l2x0_init(p, aux_ctrl, 0x8200c3fe);
 #endif
 
 }
@@ -92,9 +114,23 @@ static void __init tegra_init_cache(void)
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
 void __init tegra20_init_early(void)
 {
+       disable_hlt();  /* idle WFI usage needs to be confirmed */
+
        tegra_init_fuse();
        tegra2_init_clocks();
        tegra_clk_init_from_table(tegra20_clk_init_table);
-       tegra_init_cache();
+       tegra_init_cache(0x331, 0x441);
+       tegra_pmc_init();
+       tegra_powergate_init();
+}
+#endif
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+void __init tegra30_init_early(void)
+{
+       tegra_init_fuse();
+       tegra30_init_clocks();
+       tegra_init_cache(0x441, 0x551);
+       tegra_pmc_init();
+       tegra_powergate_init();
 }
 #endif