diff options
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-mvebu/common.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-mvebu/system-controller.c | 15 |
2 files changed, 15 insertions, 1 deletions
diff --git a/arch/arm/mach-mvebu/common.h b/arch/arm/mach-mvebu/common.h index 2b88eb00de89..b67fb7a10d8b 100644 --- a/arch/arm/mach-mvebu/common.h +++ b/arch/arm/mach-mvebu/common.h | |||
@@ -20,6 +20,7 @@ | |||
20 | void mvebu_restart(enum reboot_mode mode, const char *cmd); | 20 | void mvebu_restart(enum reboot_mode mode, const char *cmd); |
21 | int mvebu_cpu_reset_deassert(int cpu); | 21 | int mvebu_cpu_reset_deassert(int cpu); |
22 | void mvebu_pmsu_set_cpu_boot_addr(int hw_cpu, void *boot_addr); | 22 | void mvebu_pmsu_set_cpu_boot_addr(int hw_cpu, void *boot_addr); |
23 | void mvebu_system_controller_set_cpu_boot_addr(void *boot_addr); | ||
23 | 24 | ||
24 | void armada_xp_cpu_die(unsigned int cpu); | 25 | void armada_xp_cpu_die(unsigned int cpu); |
25 | 26 | ||
diff --git a/arch/arm/mach-mvebu/system-controller.c b/arch/arm/mach-mvebu/system-controller.c index 614ba6832ff3..0c5524ac75b7 100644 --- a/arch/arm/mach-mvebu/system-controller.c +++ b/arch/arm/mach-mvebu/system-controller.c | |||
@@ -37,6 +37,8 @@ struct mvebu_system_controller { | |||
37 | 37 | ||
38 | u32 rstoutn_mask_reset_out_en; | 38 | u32 rstoutn_mask_reset_out_en; |
39 | u32 system_soft_reset; | 39 | u32 system_soft_reset; |
40 | |||
41 | u32 resume_boot_addr; | ||
40 | }; | 42 | }; |
41 | static struct mvebu_system_controller *mvebu_sc; | 43 | static struct mvebu_system_controller *mvebu_sc; |
42 | 44 | ||
@@ -52,6 +54,7 @@ static const struct mvebu_system_controller armada_375_system_controller = { | |||
52 | .system_soft_reset_offset = 0x58, | 54 | .system_soft_reset_offset = 0x58, |
53 | .rstoutn_mask_reset_out_en = 0x1, | 55 | .rstoutn_mask_reset_out_en = 0x1, |
54 | .system_soft_reset = 0x1, | 56 | .system_soft_reset = 0x1, |
57 | .resume_boot_addr = 0xd4, | ||
55 | }; | 58 | }; |
56 | 59 | ||
57 | static const struct mvebu_system_controller orion_system_controller = { | 60 | static const struct mvebu_system_controller orion_system_controller = { |
@@ -98,6 +101,16 @@ void mvebu_restart(enum reboot_mode mode, const char *cmd) | |||
98 | ; | 101 | ; |
99 | } | 102 | } |
100 | 103 | ||
104 | #ifdef CONFIG_SMP | ||
105 | void mvebu_system_controller_set_cpu_boot_addr(void *boot_addr) | ||
106 | { | ||
107 | BUG_ON(system_controller_base == NULL); | ||
108 | BUG_ON(mvebu_sc->resume_boot_addr == 0); | ||
109 | writel(virt_to_phys(boot_addr), system_controller_base + | ||
110 | mvebu_sc->resume_boot_addr); | ||
111 | } | ||
112 | #endif | ||
113 | |||
101 | static int __init mvebu_system_controller_init(void) | 114 | static int __init mvebu_system_controller_init(void) |
102 | { | 115 | { |
103 | const struct of_device_id *match; | 116 | const struct of_device_id *match; |
@@ -114,4 +127,4 @@ static int __init mvebu_system_controller_init(void) | |||
114 | return 0; | 127 | return 0; |
115 | } | 128 | } |
116 | 129 | ||
117 | arch_initcall(mvebu_system_controller_init); | 130 | early_initcall(mvebu_system_controller_init); |