diff options
Diffstat (limited to 'arch/arm/mach-tegra/common.c')
-rw-r--r-- | arch/arm/mach-tegra/common.c | 55 |
1 files changed, 42 insertions, 13 deletions
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 20f396d740fa..a2eb90169aed 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * arch/arm/mach-tegra/board-harmony.c | 2 | * arch/arm/mach-tegra/common.c |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Google, Inc. | 4 | * Copyright (C) 2010 Google, Inc. |
5 | * | 5 | * |
@@ -21,8 +21,10 @@ | |||
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/of_irq.h> | ||
24 | 25 | ||
25 | #include <asm/hardware/cache-l2x0.h> | 26 | #include <asm/hardware/cache-l2x0.h> |
27 | #include <asm/hardware/gic.h> | ||
26 | 28 | ||
27 | #include <mach/iomap.h> | 29 | #include <mach/iomap.h> |
28 | #include <mach/system.h> | 30 | #include <mach/system.h> |
@@ -31,18 +33,31 @@ | |||
31 | #include "clock.h" | 33 | #include "clock.h" |
32 | #include "fuse.h" | 34 | #include "fuse.h" |
33 | 35 | ||
36 | #ifdef CONFIG_OF | ||
37 | static const struct of_device_id tegra_dt_irq_match[] __initconst = { | ||
38 | { .compatible = "arm,cortex-a9-gic", .data = gic_of_init }, | ||
39 | { } | ||
40 | }; | ||
41 | |||
42 | void __init tegra_dt_init_irq(void) | ||
43 | { | ||
44 | tegra_init_irq(); | ||
45 | of_irq_init(tegra_dt_irq_match); | ||
46 | } | ||
47 | #endif | ||
48 | |||
34 | void tegra_assert_system_reset(char mode, const char *cmd) | 49 | void tegra_assert_system_reset(char mode, const char *cmd) |
35 | { | 50 | { |
36 | void __iomem *reset = IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x04); | 51 | void __iomem *reset = IO_ADDRESS(TEGRA_PMC_BASE + 0); |
37 | u32 reg; | 52 | u32 reg; |
38 | 53 | ||
39 | /* use *_related to avoid spinlock since caches are off */ | ||
40 | reg = readl_relaxed(reset); | 54 | reg = readl_relaxed(reset); |
41 | reg |= 0x04; | 55 | reg |= 0x10; |
42 | writel_relaxed(reg, reset); | 56 | writel_relaxed(reg, reset); |
43 | } | 57 | } |
44 | 58 | ||
45 | static __initdata struct tegra_clk_init_table common_clk_init_table[] = { | 59 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC |
60 | static __initdata struct tegra_clk_init_table tegra20_clk_init_table[] = { | ||
46 | /* name parent rate enabled */ | 61 | /* name parent rate enabled */ |
47 | { "clk_m", NULL, 0, true }, | 62 | { "clk_m", NULL, 0, true }, |
48 | { "pll_p", "clk_m", 216000000, true }, | 63 | { "pll_p", "clk_m", 216000000, true }, |
@@ -58,24 +73,38 @@ static __initdata struct tegra_clk_init_table common_clk_init_table[] = { | |||
58 | { "cpu", NULL, 0, true }, | 73 | { "cpu", NULL, 0, true }, |
59 | { NULL, NULL, 0, 0}, | 74 | { NULL, NULL, 0, 0}, |
60 | }; | 75 | }; |
76 | #endif | ||
61 | 77 | ||
62 | static void __init tegra_init_cache(void) | 78 | static void __init tegra_init_cache(u32 tag_latency, u32 data_latency) |
63 | { | 79 | { |
64 | #ifdef CONFIG_CACHE_L2X0 | 80 | #ifdef CONFIG_CACHE_L2X0 |
65 | void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; | 81 | void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; |
82 | u32 aux_ctrl, cache_type; | ||
83 | |||
84 | writel_relaxed(tag_latency, p + L2X0_TAG_LATENCY_CTRL); | ||
85 | writel_relaxed(data_latency, p + L2X0_DATA_LATENCY_CTRL); | ||
66 | 86 | ||
67 | writel_relaxed(0x331, p + L2X0_TAG_LATENCY_CTRL); | 87 | cache_type = readl(p + L2X0_CACHE_TYPE); |
68 | writel_relaxed(0x441, p + L2X0_DATA_LATENCY_CTRL); | 88 | aux_ctrl = (cache_type & 0x700) << (17-8); |
89 | aux_ctrl |= 0x6C000001; | ||
69 | 90 | ||
70 | l2x0_init(p, 0x6C080001, 0x8200c3fe); | 91 | l2x0_init(p, aux_ctrl, 0x8200c3fe); |
71 | #endif | 92 | #endif |
72 | 93 | ||
73 | } | 94 | } |
74 | 95 | ||
75 | void __init tegra_init_early(void) | 96 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC |
97 | void __init tegra20_init_early(void) | ||
76 | { | 98 | { |
77 | tegra_init_fuse(); | 99 | tegra_init_fuse(); |
78 | tegra_init_clock(); | 100 | tegra2_init_clocks(); |
79 | tegra_clk_init_from_table(common_clk_init_table); | 101 | tegra_clk_init_from_table(tegra20_clk_init_table); |
80 | tegra_init_cache(); | 102 | tegra_init_cache(0x331, 0x441); |
103 | } | ||
104 | #endif | ||
105 | #ifdef CONFIG_ARCH_TEGRA_3x_SOC | ||
106 | void __init tegra30_init_early(void) | ||
107 | { | ||
108 | tegra_init_cache(0x441, 0x551); | ||
81 | } | 109 | } |
110 | #endif | ||