diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-11-01 09:16:26 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-11-21 04:47:48 -0500 |
commit | e879c862fb81b986095ae7a4676b2281c2f97957 (patch) | |
tree | bd7793e9e9924ff4b5826d14267125e8dc22afdd | |
parent | 5aafec15bdc54cf0722696c95091d7bd674bfcad (diff) |
ARM: restart: only perform setup for restart when soft-restarting
We only need to set the system up for a soft-restart if we're going to
be doing a soft-restart. Provide a new function (soft_restart()) which
does the setup and final call for this, and make platforms use it.
Eliminate the call to setup_restart() from the default handler.
This means that platforms arch_reset() function is no longer called with
the page tables prepared for a soft-restart, and caches will still be
enabled.
Acked-by: Nicolas Pitre <nico@linaro.org>
Acked-by: Will Deacon <will.deacon@arm.com>
Acked-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Acked-by: Kukjin Kim <kgene.kim@samsung.com>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Acked-by: Viresh Kumar <viresh.kumar@st.com>
Acked-by: Krzysztof Ha■asa <khc@pm.waw.pl>
Acked-by: Paul Mundt <lethal@linux-sh.org>
Acked-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Acked-by: Wan ZongShun <mcuos.com@gmail.com>
Acked-by: Eric Miao <eric.y.miao@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
21 files changed, 33 insertions, 23 deletions
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 984014b92647..fe7de7571bac 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
@@ -101,6 +101,7 @@ extern int __pure cpu_architecture(void); | |||
101 | extern void cpu_init(void); | 101 | extern void cpu_init(void); |
102 | 102 | ||
103 | void arm_machine_restart(char mode, const char *cmd); | 103 | void arm_machine_restart(char mode, const char *cmd); |
104 | void soft_restart(unsigned long); | ||
104 | extern void (*arm_pm_restart)(char str, const char *cmd); | 105 | extern void (*arm_pm_restart)(char str, const char *cmd); |
105 | 106 | ||
106 | #define UDBG_UNDEFINED (1 << 0) | 107 | #define UDBG_UNDEFINED (1 << 0) |
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 4181738452fc..1e8b3e2de7a3 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -92,7 +92,7 @@ static int __init hlt_setup(char *__unused) | |||
92 | __setup("nohlt", nohlt_setup); | 92 | __setup("nohlt", nohlt_setup); |
93 | __setup("hlt", hlt_setup); | 93 | __setup("hlt", hlt_setup); |
94 | 94 | ||
95 | void arm_machine_restart(char mode, const char *cmd) | 95 | void soft_restart(unsigned long addr) |
96 | { | 96 | { |
97 | /* Disable interrupts first */ | 97 | /* Disable interrupts first */ |
98 | local_irq_disable(); | 98 | local_irq_disable(); |
@@ -114,7 +114,16 @@ void arm_machine_restart(char mode, const char *cmd) | |||
114 | /* Push out any further dirty data, and ensure cache is empty */ | 114 | /* Push out any further dirty data, and ensure cache is empty */ |
115 | flush_cache_all(); | 115 | flush_cache_all(); |
116 | 116 | ||
117 | /* Now call the architecture specific reboot code. */ | 117 | cpu_reset(addr); |
118 | } | ||
119 | |||
120 | void arm_machine_restart(char mode, const char *cmd) | ||
121 | { | ||
122 | /* Disable interrupts first */ | ||
123 | local_irq_disable(); | ||
124 | local_fiq_disable(); | ||
125 | |||
126 | /* Call the architecture specific reboot code. */ | ||
118 | arch_reset(mode, cmd); | 127 | arch_reset(mode, cmd); |
119 | } | 128 | } |
120 | 129 | ||
diff --git a/arch/arm/mach-clps711x/include/mach/system.h b/arch/arm/mach-clps711x/include/mach/system.h index f916cd7a477d..6c119937d398 100644 --- a/arch/arm/mach-clps711x/include/mach/system.h +++ b/arch/arm/mach-clps711x/include/mach/system.h | |||
@@ -34,7 +34,7 @@ static inline void arch_idle(void) | |||
34 | 34 | ||
35 | static inline void arch_reset(char mode, const char *cmd) | 35 | static inline void arch_reset(char mode, const char *cmd) |
36 | { | 36 | { |
37 | cpu_reset(0); | 37 | soft_restart(0); |
38 | } | 38 | } |
39 | 39 | ||
40 | #endif | 40 | #endif |
diff --git a/arch/arm/mach-ebsa110/include/mach/system.h b/arch/arm/mach-ebsa110/include/mach/system.h index 9a26245bf1fc..0d5df72a03f6 100644 --- a/arch/arm/mach-ebsa110/include/mach/system.h +++ b/arch/arm/mach-ebsa110/include/mach/system.h | |||
@@ -34,6 +34,6 @@ static inline void arch_idle(void) | |||
34 | asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc"); | 34 | asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc"); |
35 | } | 35 | } |
36 | 36 | ||
37 | #define arch_reset(mode, cmd) cpu_reset(0x80000000) | 37 | #define arch_reset(mode, cmd) soft_restart(0x80000000) |
38 | 38 | ||
39 | #endif | 39 | #endif |
diff --git a/arch/arm/mach-footbridge/include/mach/system.h b/arch/arm/mach-footbridge/include/mach/system.h index 0b2931566209..249f895910fb 100644 --- a/arch/arm/mach-footbridge/include/mach/system.h +++ b/arch/arm/mach-footbridge/include/mach/system.h | |||
@@ -24,7 +24,7 @@ static inline void arch_reset(char mode, const char *cmd) | |||
24 | /* | 24 | /* |
25 | * Jump into the ROM | 25 | * Jump into the ROM |
26 | */ | 26 | */ |
27 | cpu_reset(0x41000000); | 27 | soft_restart(0x41000000); |
28 | } else { | 28 | } else { |
29 | if (machine_is_netwinder()) { | 29 | if (machine_is_netwinder()) { |
30 | /* open up the SuperIO chip | 30 | /* open up the SuperIO chip |
diff --git a/arch/arm/mach-iop32x/include/mach/system.h b/arch/arm/mach-iop32x/include/mach/system.h index a4b808fe0d81..4865a9bff85e 100644 --- a/arch/arm/mach-iop32x/include/mach/system.h +++ b/arch/arm/mach-iop32x/include/mach/system.h | |||
@@ -30,5 +30,5 @@ static inline void arch_reset(char mode, const char *cmd) | |||
30 | *IOP3XX_PCSR = 0x30; | 30 | *IOP3XX_PCSR = 0x30; |
31 | 31 | ||
32 | /* Jump into ROM at address 0 */ | 32 | /* Jump into ROM at address 0 */ |
33 | cpu_reset(0); | 33 | soft_restart(0); |
34 | } | 34 | } |
diff --git a/arch/arm/mach-iop33x/include/mach/system.h b/arch/arm/mach-iop33x/include/mach/system.h index f192a34be073..86d1b20dd692 100644 --- a/arch/arm/mach-iop33x/include/mach/system.h +++ b/arch/arm/mach-iop33x/include/mach/system.h | |||
@@ -19,5 +19,5 @@ static inline void arch_reset(char mode, const char *cmd) | |||
19 | *IOP3XX_PCSR = 0x30; | 19 | *IOP3XX_PCSR = 0x30; |
20 | 20 | ||
21 | /* Jump into ROM at address 0 */ | 21 | /* Jump into ROM at address 0 */ |
22 | cpu_reset(0); | 22 | soft_restart(0); |
23 | } | 23 | } |
diff --git a/arch/arm/mach-ixp4xx/include/mach/system.h b/arch/arm/mach-ixp4xx/include/mach/system.h index 54c0af7fa2d4..24337d9d275b 100644 --- a/arch/arm/mach-ixp4xx/include/mach/system.h +++ b/arch/arm/mach-ixp4xx/include/mach/system.h | |||
@@ -26,7 +26,7 @@ static inline void arch_reset(char mode, const char *cmd) | |||
26 | { | 26 | { |
27 | if ( 1 && mode == 's') { | 27 | if ( 1 && mode == 's') { |
28 | /* Jump into ROM at address 0 */ | 28 | /* Jump into ROM at address 0 */ |
29 | cpu_reset(0); | 29 | soft_restart(0); |
30 | } else { | 30 | } else { |
31 | /* Use on-chip reset capability */ | 31 | /* Use on-chip reset capability */ |
32 | 32 | ||
diff --git a/arch/arm/mach-ks8695/include/mach/system.h b/arch/arm/mach-ks8695/include/mach/system.h index fb1dda9be2d0..ceb19c90aa52 100644 --- a/arch/arm/mach-ks8695/include/mach/system.h +++ b/arch/arm/mach-ks8695/include/mach/system.h | |||
@@ -32,7 +32,7 @@ static void arch_reset(char mode, const char *cmd) | |||
32 | unsigned int reg; | 32 | unsigned int reg; |
33 | 33 | ||
34 | if (mode == 's') | 34 | if (mode == 's') |
35 | cpu_reset(0); | 35 | soft_restart(0); |
36 | 36 | ||
37 | /* disable timer0 */ | 37 | /* disable timer0 */ |
38 | reg = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); | 38 | reg = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); |
diff --git a/arch/arm/mach-mmp/include/mach/system.h b/arch/arm/mach-mmp/include/mach/system.h index 1a8a25edb1b4..cb0637933a85 100644 --- a/arch/arm/mach-mmp/include/mach/system.h +++ b/arch/arm/mach-mmp/include/mach/system.h | |||
@@ -19,8 +19,8 @@ static inline void arch_idle(void) | |||
19 | static inline void arch_reset(char mode, const char *cmd) | 19 | static inline void arch_reset(char mode, const char *cmd) |
20 | { | 20 | { |
21 | if (cpu_is_pxa168()) | 21 | if (cpu_is_pxa168()) |
22 | cpu_reset(0xffff0000); | 22 | soft_restart(0xffff0000); |
23 | else | 23 | else |
24 | cpu_reset(0); | 24 | soft_restart(0); |
25 | } | 25 | } |
26 | #endif /* __ASM_MACH_SYSTEM_H */ | 26 | #endif /* __ASM_MACH_SYSTEM_H */ |
diff --git a/arch/arm/mach-mxs/system.c b/arch/arm/mach-mxs/system.c index 20ec3bddf7cd..cab88364e7c1 100644 --- a/arch/arm/mach-mxs/system.c +++ b/arch/arm/mach-mxs/system.c | |||
@@ -53,7 +53,7 @@ void arch_reset(char mode, const char *cmd) | |||
53 | mdelay(50); | 53 | mdelay(50); |
54 | 54 | ||
55 | /* We'll take a jump through zero as a poor second */ | 55 | /* We'll take a jump through zero as a poor second */ |
56 | cpu_reset(0); | 56 | soft_restart(0); |
57 | } | 57 | } |
58 | 58 | ||
59 | static int __init mxs_arch_reset_init(void) | 59 | static int __init mxs_arch_reset_init(void) |
diff --git a/arch/arm/mach-pnx4008/include/mach/system.h b/arch/arm/mach-pnx4008/include/mach/system.h index 5dda2bb55f8d..5d6384a6128c 100644 --- a/arch/arm/mach-pnx4008/include/mach/system.h +++ b/arch/arm/mach-pnx4008/include/mach/system.h | |||
@@ -32,7 +32,7 @@ static void arch_idle(void) | |||
32 | 32 | ||
33 | static inline void arch_reset(char mode, const char *cmd) | 33 | static inline void arch_reset(char mode, const char *cmd) |
34 | { | 34 | { |
35 | cpu_reset(0); | 35 | soft_restart(0); |
36 | } | 36 | } |
37 | 37 | ||
38 | #endif | 38 | #endif |
diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index 01e9d643394a..b8bcda15da81 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c | |||
@@ -88,7 +88,7 @@ void arch_reset(char mode, const char *cmd) | |||
88 | switch (mode) { | 88 | switch (mode) { |
89 | case 's': | 89 | case 's': |
90 | /* Jump into ROM at address 0 */ | 90 | /* Jump into ROM at address 0 */ |
91 | cpu_reset(0); | 91 | soft_restart(0); |
92 | break; | 92 | break; |
93 | case 'g': | 93 | case 'g': |
94 | do_gpio_reset(); | 94 | do_gpio_reset(); |
diff --git a/arch/arm/mach-rpc/include/mach/system.h b/arch/arm/mach-rpc/include/mach/system.h index 45c7b935dc45..a354f4d092c8 100644 --- a/arch/arm/mach-rpc/include/mach/system.h +++ b/arch/arm/mach-rpc/include/mach/system.h | |||
@@ -23,5 +23,5 @@ static inline void arch_reset(char mode, const char *cmd) | |||
23 | /* | 23 | /* |
24 | * Jump into the ROM | 24 | * Jump into the ROM |
25 | */ | 25 | */ |
26 | cpu_reset(0); | 26 | soft_restart(0); |
27 | } | 27 | } |
diff --git a/arch/arm/mach-s3c2410/include/mach/system-reset.h b/arch/arm/mach-s3c2410/include/mach/system-reset.h index 6faadcee7729..913893d44650 100644 --- a/arch/arm/mach-s3c2410/include/mach/system-reset.h +++ b/arch/arm/mach-s3c2410/include/mach/system-reset.h | |||
@@ -19,7 +19,7 @@ static void | |||
19 | arch_reset(char mode, const char *cmd) | 19 | arch_reset(char mode, const char *cmd) |
20 | { | 20 | { |
21 | if (mode == 's') { | 21 | if (mode == 's') { |
22 | cpu_reset(0); | 22 | soft_restart(0); |
23 | } | 23 | } |
24 | 24 | ||
25 | if (s3c24xx_reset_hook) | 25 | if (s3c24xx_reset_hook) |
@@ -28,5 +28,5 @@ arch_reset(char mode, const char *cmd) | |||
28 | arch_wdt_reset(); | 28 | arch_wdt_reset(); |
29 | 29 | ||
30 | /* we'll take a jump through zero as a poor second */ | 30 | /* we'll take a jump through zero as a poor second */ |
31 | cpu_reset(0); | 31 | soft_restart(0); |
32 | } | 32 | } |
diff --git a/arch/arm/mach-s3c64xx/include/mach/system.h b/arch/arm/mach-s3c64xx/include/mach/system.h index 2e58cb7a7147..d8ca5786ba25 100644 --- a/arch/arm/mach-s3c64xx/include/mach/system.h +++ b/arch/arm/mach-s3c64xx/include/mach/system.h | |||
@@ -24,7 +24,7 @@ static void arch_reset(char mode, const char *cmd) | |||
24 | arch_wdt_reset(); | 24 | arch_wdt_reset(); |
25 | 25 | ||
26 | /* if all else fails, or mode was for soft, jump to 0 */ | 26 | /* if all else fails, or mode was for soft, jump to 0 */ |
27 | cpu_reset(0); | 27 | soft_restart(0); |
28 | } | 28 | } |
29 | 29 | ||
30 | #endif /* __ASM_ARCH_IRQ_H */ | 30 | #endif /* __ASM_ARCH_IRQ_H */ |
diff --git a/arch/arm/mach-sa1100/include/mach/system.h b/arch/arm/mach-sa1100/include/mach/system.h index ba9da9f7f183..345d35b7450c 100644 --- a/arch/arm/mach-sa1100/include/mach/system.h +++ b/arch/arm/mach-sa1100/include/mach/system.h | |||
@@ -14,7 +14,7 @@ static inline void arch_reset(char mode, const char *cmd) | |||
14 | { | 14 | { |
15 | if (mode == 's') { | 15 | if (mode == 's') { |
16 | /* Jump into ROM at address 0 */ | 16 | /* Jump into ROM at address 0 */ |
17 | cpu_reset(0); | 17 | soft_restart(0); |
18 | } else { | 18 | } else { |
19 | /* Use on-chip reset capability */ | 19 | /* Use on-chip reset capability */ |
20 | RSRR = RSRR_SWR; | 20 | RSRR = RSRR_SWR; |
diff --git a/arch/arm/mach-shmobile/include/mach/system.h b/arch/arm/mach-shmobile/include/mach/system.h index 76a687eeaa22..956ac18ddbf9 100644 --- a/arch/arm/mach-shmobile/include/mach/system.h +++ b/arch/arm/mach-shmobile/include/mach/system.h | |||
@@ -8,7 +8,7 @@ static inline void arch_idle(void) | |||
8 | 8 | ||
9 | static inline void arch_reset(char mode, const char *cmd) | 9 | static inline void arch_reset(char mode, const char *cmd) |
10 | { | 10 | { |
11 | cpu_reset(0); | 11 | soft_restart(0); |
12 | } | 12 | } |
13 | 13 | ||
14 | #endif | 14 | #endif |
diff --git a/arch/arm/mach-w90x900/include/mach/system.h b/arch/arm/mach-w90x900/include/mach/system.h index ce228bdc66dd..68875a1c16be 100644 --- a/arch/arm/mach-w90x900/include/mach/system.h +++ b/arch/arm/mach-w90x900/include/mach/system.h | |||
@@ -33,7 +33,7 @@ static void arch_reset(char mode, const char *cmd) | |||
33 | { | 33 | { |
34 | if (mode == 's') { | 34 | if (mode == 's') { |
35 | /* Jump into ROM at address 0 */ | 35 | /* Jump into ROM at address 0 */ |
36 | cpu_reset(0); | 36 | soft_restart(0); |
37 | } else { | 37 | } else { |
38 | __raw_writel(WTE | WTRE | WTCLK, WTCR); | 38 | __raw_writel(WTE | WTRE | WTCLK, WTCR); |
39 | } | 39 | } |
diff --git a/arch/arm/plat-mxc/system.c b/arch/arm/plat-mxc/system.c index 9dad8dcc2ea9..b1cfc6a49715 100644 --- a/arch/arm/plat-mxc/system.c +++ b/arch/arm/plat-mxc/system.c | |||
@@ -70,7 +70,7 @@ void arch_reset(char mode, const char *cmd) | |||
70 | mdelay(50); | 70 | mdelay(50); |
71 | 71 | ||
72 | /* we'll take a jump through zero as a poor second */ | 72 | /* we'll take a jump through zero as a poor second */ |
73 | cpu_reset(0); | 73 | soft_restart(0); |
74 | } | 74 | } |
75 | 75 | ||
76 | void mxc_arch_reset_init(void __iomem *base) | 76 | void mxc_arch_reset_init(void __iomem *base) |
diff --git a/arch/arm/plat-spear/include/plat/system.h b/arch/arm/plat-spear/include/plat/system.h index a235fa0ca777..1171f228d718 100644 --- a/arch/arm/plat-spear/include/plat/system.h +++ b/arch/arm/plat-spear/include/plat/system.h | |||
@@ -31,7 +31,7 @@ static inline void arch_reset(char mode, const char *cmd) | |||
31 | { | 31 | { |
32 | if (mode == 's') { | 32 | if (mode == 's') { |
33 | /* software reset, Jump into ROM at address 0 */ | 33 | /* software reset, Jump into ROM at address 0 */ |
34 | cpu_reset(0); | 34 | soft_restart(0); |
35 | } else { | 35 | } else { |
36 | /* hardware reset, Use on-chip reset capability */ | 36 | /* hardware reset, Use on-chip reset capability */ |
37 | sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); | 37 | sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); |