diff options
author | Rob Herring <rob.herring@calxeda.com> | 2011-06-07 11:02:55 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2011-10-31 09:14:00 -0400 |
commit | 220e6cf7b793d702596506a8c4bf1f4fd4040df1 (patch) | |
tree | ba9f94611ca71799e67a66555c5124a0be975920 /arch/arm/mach-highbank | |
parent | 253d7addbcb06acc90eb722f122d32a6ccbf67a7 (diff) |
ARM: add Highbank core platform support
This adds basic support for the Calxeda Highbank platform.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Reviewed-by: Jamie Iles <jamie@jamieiles.com>
Reviewed-by: Shawn Guo <shawn.guo@linaro.org>
Diffstat (limited to 'arch/arm/mach-highbank')
-rw-r--r-- | arch/arm/mach-highbank/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-highbank/Makefile.boot | 1 | ||||
-rw-r--r-- | arch/arm/mach-highbank/clock.c | 62 | ||||
-rw-r--r-- | arch/arm/mach-highbank/core.h | 9 | ||||
-rw-r--r-- | arch/arm/mach-highbank/highbank.c | 145 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/debug-macro.S | 19 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/entry-macro.S | 7 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/gpio.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/io.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/irqs.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/memory.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/system.h | 26 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/timex.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/uncompress.h | 9 | ||||
-rw-r--r-- | arch/arm/mach-highbank/include/mach/vmalloc.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-highbank/lluart.c | 34 | ||||
-rw-r--r-- | arch/arm/mach-highbank/sysregs.h | 52 | ||||
-rw-r--r-- | arch/arm/mach-highbank/system.c | 33 |
18 files changed, 421 insertions, 0 deletions
diff --git a/arch/arm/mach-highbank/Makefile b/arch/arm/mach-highbank/Makefile new file mode 100644 index 000000000000..da7f81a69530 --- /dev/null +++ b/arch/arm/mach-highbank/Makefile | |||
@@ -0,0 +1,2 @@ | |||
1 | obj-y := clock.o highbank.o system.o | ||
2 | obj-$(CONFIG_DEBUG_HIGHBANK_UART) += lluart.o | ||
diff --git a/arch/arm/mach-highbank/Makefile.boot b/arch/arm/mach-highbank/Makefile.boot new file mode 100644 index 000000000000..dae9661a7689 --- /dev/null +++ b/arch/arm/mach-highbank/Makefile.boot | |||
@@ -0,0 +1 @@ | |||
zreladdr-y := 0x00008000 | |||
diff --git a/arch/arm/mach-highbank/clock.c b/arch/arm/mach-highbank/clock.c new file mode 100644 index 000000000000..c25a2ae4fde1 --- /dev/null +++ b/arch/arm/mach-highbank/clock.c | |||
@@ -0,0 +1,62 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Calxeda, Inc. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/clk.h> | ||
20 | #include <linux/clkdev.h> | ||
21 | |||
22 | struct clk { | ||
23 | unsigned long rate; | ||
24 | }; | ||
25 | |||
26 | int clk_enable(struct clk *clk) | ||
27 | { | ||
28 | return 0; | ||
29 | } | ||
30 | |||
31 | void clk_disable(struct clk *clk) | ||
32 | {} | ||
33 | |||
34 | unsigned long clk_get_rate(struct clk *clk) | ||
35 | { | ||
36 | return clk->rate; | ||
37 | } | ||
38 | |||
39 | long clk_round_rate(struct clk *clk, unsigned long rate) | ||
40 | { | ||
41 | return clk->rate; | ||
42 | } | ||
43 | |||
44 | int clk_set_rate(struct clk *clk, unsigned long rate) | ||
45 | { | ||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | static struct clk eclk = { .rate = 200000000 }; | ||
50 | static struct clk pclk = { .rate = 150000000 }; | ||
51 | |||
52 | static struct clk_lookup lookups[] = { | ||
53 | { .clk = &pclk, .con_id = "apb_pclk", }, | ||
54 | { .clk = &pclk, .dev_id = "sp804", }, | ||
55 | { .clk = &eclk, .dev_id = "ffe0e000.sdhci", }, | ||
56 | { .clk = &pclk, .dev_id = "fff36000.serial", }, | ||
57 | }; | ||
58 | |||
59 | void __init highbank_clocks_init(void) | ||
60 | { | ||
61 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | ||
62 | } | ||
diff --git a/arch/arm/mach-highbank/core.h b/arch/arm/mach-highbank/core.h new file mode 100644 index 000000000000..7e33fc94cd1e --- /dev/null +++ b/arch/arm/mach-highbank/core.h | |||
@@ -0,0 +1,9 @@ | |||
1 | extern void highbank_set_cpu_jump(int cpu, void *jump_addr); | ||
2 | extern void highbank_clocks_init(void); | ||
3 | extern void __iomem *scu_base_addr; | ||
4 | #ifdef CONFIG_DEBUG_HIGHBANK_UART | ||
5 | extern void highbank_lluart_map_io(void); | ||
6 | #else | ||
7 | static inline void highbank_lluart_map_io(void) {} | ||
8 | #endif | ||
9 | |||
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c new file mode 100644 index 000000000000..b82dcf08e747 --- /dev/null +++ b/arch/arm/mach-highbank/highbank.c | |||
@@ -0,0 +1,145 @@ | |||
1 | /* | ||
2 | * Copyright 2010-2011 Calxeda, Inc. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | #include <linux/clk.h> | ||
17 | #include <linux/clkdev.h> | ||
18 | #include <linux/io.h> | ||
19 | #include <linux/irq.h> | ||
20 | #include <linux/irqdomain.h> | ||
21 | #include <linux/of.h> | ||
22 | #include <linux/of_irq.h> | ||
23 | #include <linux/of_platform.h> | ||
24 | #include <linux/of_address.h> | ||
25 | |||
26 | #include <asm/cacheflush.h> | ||
27 | #include <asm/unified.h> | ||
28 | #include <asm/smp_scu.h> | ||
29 | #include <asm/hardware/arm_timer.h> | ||
30 | #include <asm/hardware/timer-sp.h> | ||
31 | #include <asm/hardware/gic.h> | ||
32 | #include <asm/hardware/cache-l2x0.h> | ||
33 | #include <asm/mach/arch.h> | ||
34 | #include <asm/mach/map.h> | ||
35 | #include <asm/mach/time.h> | ||
36 | #include <mach/irqs.h> | ||
37 | |||
38 | #include "core.h" | ||
39 | #include "sysregs.h" | ||
40 | |||
41 | void __iomem *sregs_base; | ||
42 | |||
43 | #define HB_SCU_VIRT_BASE 0xfee00000 | ||
44 | void __iomem *scu_base_addr = ((void __iomem *)(HB_SCU_VIRT_BASE)); | ||
45 | |||
46 | static struct map_desc scu_io_desc __initdata = { | ||
47 | .virtual = HB_SCU_VIRT_BASE, | ||
48 | .pfn = 0, /* run-time */ | ||
49 | .length = SZ_4K, | ||
50 | .type = MT_DEVICE, | ||
51 | }; | ||
52 | |||
53 | static void __init highbank_scu_map_io(void) | ||
54 | { | ||
55 | unsigned long base; | ||
56 | |||
57 | /* Get SCU base */ | ||
58 | asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (base)); | ||
59 | |||
60 | scu_io_desc.pfn = __phys_to_pfn(base); | ||
61 | iotable_init(&scu_io_desc, 1); | ||
62 | } | ||
63 | |||
64 | static void __init highbank_map_io(void) | ||
65 | { | ||
66 | highbank_scu_map_io(); | ||
67 | highbank_lluart_map_io(); | ||
68 | } | ||
69 | |||
70 | #define HB_JUMP_TABLE_PHYS(cpu) (0x40 + (0x10 * (cpu))) | ||
71 | #define HB_JUMP_TABLE_VIRT(cpu) phys_to_virt(HB_JUMP_TABLE_PHYS(cpu)) | ||
72 | |||
73 | void highbank_set_cpu_jump(int cpu, void *jump_addr) | ||
74 | { | ||
75 | writel(BSYM(virt_to_phys(jump_addr)), HB_JUMP_TABLE_VIRT(cpu)); | ||
76 | __cpuc_flush_dcache_area(HB_JUMP_TABLE_VIRT(cpu), 16); | ||
77 | outer_clean_range(HB_JUMP_TABLE_PHYS(cpu), | ||
78 | HB_JUMP_TABLE_PHYS(cpu) + 15); | ||
79 | } | ||
80 | |||
81 | const static struct of_device_id irq_match[] = { | ||
82 | { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, | ||
83 | {} | ||
84 | }; | ||
85 | |||
86 | static void __init highbank_init_irq(void) | ||
87 | { | ||
88 | of_irq_init(irq_match); | ||
89 | l2x0_of_init(0, ~0UL); | ||
90 | } | ||
91 | |||
92 | static void __init highbank_timer_init(void) | ||
93 | { | ||
94 | int irq; | ||
95 | struct device_node *np; | ||
96 | void __iomem *timer_base; | ||
97 | |||
98 | /* Map system registers */ | ||
99 | np = of_find_compatible_node(NULL, NULL, "calxeda,hb-sregs"); | ||
100 | sregs_base = of_iomap(np, 0); | ||
101 | WARN_ON(!sregs_base); | ||
102 | |||
103 | np = of_find_compatible_node(NULL, NULL, "arm,sp804"); | ||
104 | timer_base = of_iomap(np, 0); | ||
105 | WARN_ON(!timer_base); | ||
106 | irq = irq_of_parse_and_map(np, 0); | ||
107 | |||
108 | highbank_clocks_init(); | ||
109 | |||
110 | sp804_clocksource_init(timer_base + 0x20, "timer1"); | ||
111 | sp804_clockevents_init(timer_base, irq, "timer0"); | ||
112 | } | ||
113 | |||
114 | static struct sys_timer highbank_timer = { | ||
115 | .init = highbank_timer_init, | ||
116 | }; | ||
117 | |||
118 | static void highbank_power_off(void) | ||
119 | { | ||
120 | hignbank_set_pwr_shutdown(); | ||
121 | scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); | ||
122 | |||
123 | while (1) | ||
124 | cpu_do_idle(); | ||
125 | } | ||
126 | |||
127 | static void __init highbank_init(void) | ||
128 | { | ||
129 | pm_power_off = highbank_power_off; | ||
130 | |||
131 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | ||
132 | } | ||
133 | |||
134 | static const char *highbank_match[] __initconst = { | ||
135 | "calxeda,highbank", | ||
136 | NULL, | ||
137 | }; | ||
138 | |||
139 | DT_MACHINE_START(HIGHBANK, "Highbank") | ||
140 | .map_io = highbank_map_io, | ||
141 | .init_irq = highbank_init_irq, | ||
142 | .timer = &highbank_timer, | ||
143 | .init_machine = highbank_init, | ||
144 | .dt_compat = highbank_match, | ||
145 | MACHINE_END | ||
diff --git a/arch/arm/mach-highbank/include/mach/debug-macro.S b/arch/arm/mach-highbank/include/mach/debug-macro.S new file mode 100644 index 000000000000..cb57fe5bcd04 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/debug-macro.S | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * Debugging macro include header | ||
3 | * | ||
4 | * Copyright (C) 1994-1999 Russell King | ||
5 | * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | .macro addruart,rp,rv,tmp | ||
13 | movw \rv, #0x6000 | ||
14 | movt \rv, #0xfee3 | ||
15 | movw \rp, #0x6000 | ||
16 | movt \rp, #0xfff3 | ||
17 | .endm | ||
18 | |||
19 | #include <asm/hardware/debug-pl01x.S> | ||
diff --git a/arch/arm/mach-highbank/include/mach/entry-macro.S b/arch/arm/mach-highbank/include/mach/entry-macro.S new file mode 100644 index 000000000000..73c11297509e --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/entry-macro.S | |||
@@ -0,0 +1,7 @@ | |||
1 | #include <asm/hardware/entry-macro-gic.S> | ||
2 | |||
3 | .macro disable_fiq | ||
4 | .endm | ||
5 | |||
6 | .macro arch_ret_to_user, tmp1, tmp2 | ||
7 | .endm | ||
diff --git a/arch/arm/mach-highbank/include/mach/gpio.h b/arch/arm/mach-highbank/include/mach/gpio.h new file mode 100644 index 000000000000..40a8c178f10d --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/gpio.h | |||
@@ -0,0 +1 @@ | |||
/* empty */ | |||
diff --git a/arch/arm/mach-highbank/include/mach/io.h b/arch/arm/mach-highbank/include/mach/io.h new file mode 100644 index 000000000000..70cfa3ba7697 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/io.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __MACH_IO_H | ||
2 | #define __MACH_IO_H | ||
3 | |||
4 | #define __io(a) ({ (void)(a); __typesafe_io(0); }) | ||
5 | #define __mem_pci(a) (a) | ||
6 | |||
7 | #endif | ||
diff --git a/arch/arm/mach-highbank/include/mach/irqs.h b/arch/arm/mach-highbank/include/mach/irqs.h new file mode 100644 index 000000000000..9746aab14e9a --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/irqs.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __MACH_IRQS_H | ||
2 | #define __MACH_IRQS_H | ||
3 | |||
4 | #define NR_IRQS 192 | ||
5 | |||
6 | #endif | ||
diff --git a/arch/arm/mach-highbank/include/mach/memory.h b/arch/arm/mach-highbank/include/mach/memory.h new file mode 100644 index 000000000000..40a8c178f10d --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/memory.h | |||
@@ -0,0 +1 @@ | |||
/* empty */ | |||
diff --git a/arch/arm/mach-highbank/include/mach/system.h b/arch/arm/mach-highbank/include/mach/system.h new file mode 100644 index 000000000000..7e8192296cae --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/system.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * Copyright 2010-2011 Calxeda, Inc. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | #ifndef __MACH_SYSTEM_H | ||
17 | #define __MACH_SYSTEM_H | ||
18 | |||
19 | static inline void arch_idle(void) | ||
20 | { | ||
21 | cpu_do_idle(); | ||
22 | } | ||
23 | |||
24 | extern void arch_reset(char mode, const char *cmd); | ||
25 | |||
26 | #endif | ||
diff --git a/arch/arm/mach-highbank/include/mach/timex.h b/arch/arm/mach-highbank/include/mach/timex.h new file mode 100644 index 000000000000..88dac7a55a97 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/timex.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __MACH_TIMEX_H | ||
2 | #define __MACH_TIMEX_H | ||
3 | |||
4 | #define CLOCK_TICK_RATE 1000000 | ||
5 | |||
6 | #endif | ||
diff --git a/arch/arm/mach-highbank/include/mach/uncompress.h b/arch/arm/mach-highbank/include/mach/uncompress.h new file mode 100644 index 000000000000..bbe20e696325 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/uncompress.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef __MACH_UNCOMPRESS_H | ||
2 | #define __MACH_UNCOMPRESS_H | ||
3 | |||
4 | #define putc(c) | ||
5 | #define flush() | ||
6 | #define arch_decomp_setup() | ||
7 | #define arch_decomp_wdog() | ||
8 | |||
9 | #endif | ||
diff --git a/arch/arm/mach-highbank/include/mach/vmalloc.h b/arch/arm/mach-highbank/include/mach/vmalloc.h new file mode 100644 index 000000000000..1969e954277a --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/vmalloc.h | |||
@@ -0,0 +1 @@ | |||
#define VMALLOC_END 0xFEE00000UL | |||
diff --git a/arch/arm/mach-highbank/lluart.c b/arch/arm/mach-highbank/lluart.c new file mode 100644 index 000000000000..371575019f33 --- /dev/null +++ b/arch/arm/mach-highbank/lluart.c | |||
@@ -0,0 +1,34 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Calxeda, Inc. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | #include <linux/init.h> | ||
17 | #include <asm/page.h> | ||
18 | #include <asm/sizes.h> | ||
19 | #include <asm/mach/map.h> | ||
20 | |||
21 | #define HB_DEBUG_LL_PHYS_BASE 0xfff36000 | ||
22 | #define HB_DEBUG_LL_VIRT_BASE 0xfee36000 | ||
23 | |||
24 | static struct map_desc lluart_io_desc __initdata = { | ||
25 | .virtual = HB_DEBUG_LL_VIRT_BASE, | ||
26 | .pfn = __phys_to_pfn(HB_DEBUG_LL_PHYS_BASE), | ||
27 | .length = SZ_4K, | ||
28 | .type = MT_DEVICE, | ||
29 | }; | ||
30 | |||
31 | void __init highbank_lluart_map_io(void) | ||
32 | { | ||
33 | iotable_init(&lluart_io_desc, 1); | ||
34 | } | ||
diff --git a/arch/arm/mach-highbank/sysregs.h b/arch/arm/mach-highbank/sysregs.h new file mode 100644 index 000000000000..0e913389f445 --- /dev/null +++ b/arch/arm/mach-highbank/sysregs.h | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Calxeda, Inc. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | #ifndef _MACH_HIGHBANK__SYSREGS_H_ | ||
17 | #define _MACH_HIGHBANK__SYSREGS_H_ | ||
18 | |||
19 | #include <linux/io.h> | ||
20 | |||
21 | extern void __iomem *sregs_base; | ||
22 | |||
23 | #define HB_SREG_A9_PWR_REQ 0xf00 | ||
24 | #define HB_SREG_A9_BOOT_STAT 0xf04 | ||
25 | #define HB_SREG_A9_BOOT_DATA 0xf08 | ||
26 | |||
27 | #define HB_PWR_SUSPEND 0 | ||
28 | #define HB_PWR_SOFT_RESET 1 | ||
29 | #define HB_PWR_HARD_RESET 2 | ||
30 | #define HB_PWR_SHUTDOWN 3 | ||
31 | |||
32 | static inline void hignbank_set_pwr_suspend(void) | ||
33 | { | ||
34 | writel(HB_PWR_SUSPEND, sregs_base + HB_SREG_A9_PWR_REQ); | ||
35 | } | ||
36 | |||
37 | static inline void hignbank_set_pwr_shutdown(void) | ||
38 | { | ||
39 | writel(HB_PWR_SHUTDOWN, sregs_base + HB_SREG_A9_PWR_REQ); | ||
40 | } | ||
41 | |||
42 | static inline void hignbank_set_pwr_soft_reset(void) | ||
43 | { | ||
44 | writel(HB_PWR_SOFT_RESET, sregs_base + HB_SREG_A9_PWR_REQ); | ||
45 | } | ||
46 | |||
47 | static inline void hignbank_set_pwr_hard_reset(void) | ||
48 | { | ||
49 | writel(HB_PWR_HARD_RESET, sregs_base + HB_SREG_A9_PWR_REQ); | ||
50 | } | ||
51 | |||
52 | #endif | ||
diff --git a/arch/arm/mach-highbank/system.c b/arch/arm/mach-highbank/system.c new file mode 100644 index 000000000000..53f0c4c5ef1c --- /dev/null +++ b/arch/arm/mach-highbank/system.c | |||
@@ -0,0 +1,33 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Calxeda, Inc. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | #include <linux/io.h> | ||
17 | #include <asm/smp_scu.h> | ||
18 | #include <asm/proc-fns.h> | ||
19 | |||
20 | #include "core.h" | ||
21 | #include "sysregs.h" | ||
22 | |||
23 | void arch_reset(char mode, const char *cmd) | ||
24 | { | ||
25 | if (mode == 'h') | ||
26 | hignbank_set_pwr_hard_reset(); | ||
27 | else | ||
28 | hignbank_set_pwr_soft_reset(); | ||
29 | |||
30 | scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); | ||
31 | cpu_do_idle(); | ||
32 | } | ||
33 | |||