diff options
-rw-r--r-- | arch/arm/kernel/process.c | 61 | ||||
-rw-r--r-- | arch/arm/mach-pxa/corgi.c | 25 | ||||
-rw-r--r-- | arch/arm/mach-pxa/poodle.c | 17 | ||||
-rw-r--r-- | arch/arm/mach-pxa/spitz.c | 25 | ||||
-rw-r--r-- | arch/arm/mach-pxa/tosa.c | 25 | ||||
-rw-r--r-- | include/asm-arm/arch-pxa/system.h | 1 | ||||
-rw-r--r-- | include/asm-arm/system.h | 3 |
7 files changed, 131 insertions, 26 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 7df6e1aaa323..17c38dbf2f3c 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/cpu.h> | 29 | #include <linux/cpu.h> |
30 | #include <linux/elfcore.h> | 30 | #include <linux/elfcore.h> |
31 | #include <linux/pm.h> | ||
31 | 32 | ||
32 | #include <asm/leds.h> | 33 | #include <asm/leds.h> |
33 | #include <asm/processor.h> | 34 | #include <asm/processor.h> |
@@ -71,8 +72,36 @@ static int __init hlt_setup(char *__unused) | |||
71 | __setup("nohlt", nohlt_setup); | 72 | __setup("nohlt", nohlt_setup); |
72 | __setup("hlt", hlt_setup); | 73 | __setup("hlt", hlt_setup); |
73 | 74 | ||
75 | void arm_machine_restart(char mode) | ||
76 | { | ||
77 | /* | ||
78 | * Clean and disable cache, and turn off interrupts | ||
79 | */ | ||
80 | cpu_proc_fin(); | ||
81 | |||
82 | /* | ||
83 | * Tell the mm system that we are going to reboot - | ||
84 | * we may need it to insert some 1:1 mappings so that | ||
85 | * soft boot works. | ||
86 | */ | ||
87 | setup_mm_for_reboot(mode); | ||
88 | |||
89 | /* | ||
90 | * Now call the architecture specific reboot code. | ||
91 | */ | ||
92 | arch_reset(mode); | ||
93 | |||
94 | /* | ||
95 | * Whoops - the architecture was unable to reboot. | ||
96 | * Tell the user! | ||
97 | */ | ||
98 | mdelay(1000); | ||
99 | printk("Reboot failed -- System halted\n"); | ||
100 | while (1); | ||
101 | } | ||
102 | |||
74 | /* | 103 | /* |
75 | * The following aren't currently used. | 104 | * Function pointers to optional machine specific functions |
76 | */ | 105 | */ |
77 | void (*pm_idle)(void); | 106 | void (*pm_idle)(void); |
78 | EXPORT_SYMBOL(pm_idle); | 107 | EXPORT_SYMBOL(pm_idle); |
@@ -80,6 +109,10 @@ EXPORT_SYMBOL(pm_idle); | |||
80 | void (*pm_power_off)(void); | 109 | void (*pm_power_off)(void); |
81 | EXPORT_SYMBOL(pm_power_off); | 110 | EXPORT_SYMBOL(pm_power_off); |
82 | 111 | ||
112 | void (*arm_pm_restart)(char str) = arm_machine_restart; | ||
113 | EXPORT_SYMBOL_GPL(arm_pm_restart); | ||
114 | |||
115 | |||
83 | /* | 116 | /* |
84 | * This is our default idle handler. We need to disable | 117 | * This is our default idle handler. We need to disable |
85 | * interrupts here to ensure we don't miss a wakeup call. | 118 | * interrupts here to ensure we don't miss a wakeup call. |
@@ -151,33 +184,9 @@ void machine_power_off(void) | |||
151 | pm_power_off(); | 184 | pm_power_off(); |
152 | } | 185 | } |
153 | 186 | ||
154 | |||
155 | void machine_restart(char * __unused) | 187 | void machine_restart(char * __unused) |
156 | { | 188 | { |
157 | /* | 189 | arm_pm_restart(reboot_mode); |
158 | * Clean and disable cache, and turn off interrupts | ||
159 | */ | ||
160 | cpu_proc_fin(); | ||
161 | |||
162 | /* | ||
163 | * Tell the mm system that we are going to reboot - | ||
164 | * we may need it to insert some 1:1 mappings so that | ||
165 | * soft boot works. | ||
166 | */ | ||
167 | setup_mm_for_reboot(reboot_mode); | ||
168 | |||
169 | /* | ||
170 | * Now call the architecture specific reboot code. | ||
171 | */ | ||
172 | arch_reset(reboot_mode); | ||
173 | |||
174 | /* | ||
175 | * Whoops - the architecture was unable to reboot. | ||
176 | * Tell the user! | ||
177 | */ | ||
178 | mdelay(1000); | ||
179 | printk("Reboot failed -- System halted\n"); | ||
180 | while (1); | ||
181 | } | 190 | } |
182 | 191 | ||
183 | void __show_regs(struct pt_regs *regs) | 192 | void __show_regs(struct pt_regs *regs) |
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c index d6d726036361..bf6648a83901 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/mmc/host.h> | 21 | #include <linux/mmc/host.h> |
22 | #include <linux/pm.h> | ||
22 | 23 | ||
23 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
24 | #include <asm/memory.h> | 25 | #include <asm/memory.h> |
@@ -26,6 +27,7 @@ | |||
26 | #include <asm/hardware.h> | 27 | #include <asm/hardware.h> |
27 | #include <asm/irq.h> | 28 | #include <asm/irq.h> |
28 | #include <asm/io.h> | 29 | #include <asm/io.h> |
30 | #include <asm/system.h> | ||
29 | 31 | ||
30 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
31 | #include <asm/mach/map.h> | 33 | #include <asm/mach/map.h> |
@@ -310,8 +312,31 @@ static struct platform_device *devices[] __initdata = { | |||
310 | &corgiled_device, | 312 | &corgiled_device, |
311 | }; | 313 | }; |
312 | 314 | ||
315 | static void corgi_poweroff(void) | ||
316 | { | ||
317 | RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; | ||
318 | |||
319 | if (!machine_is_corgi()) | ||
320 | /* Green LED off tells the bootloader to halt */ | ||
321 | reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN); | ||
322 | arm_machine_restart('h'); | ||
323 | } | ||
324 | |||
325 | static void corgi_restart(char mode) | ||
326 | { | ||
327 | RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; | ||
328 | |||
329 | if (!machine_is_corgi()) | ||
330 | /* Green LED on tells the bootloader to reboot */ | ||
331 | set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN); | ||
332 | arm_machine_restart('h'); | ||
333 | } | ||
334 | |||
313 | static void __init corgi_init(void) | 335 | static void __init corgi_init(void) |
314 | { | 336 | { |
337 | pm_power_off = corgi_poweroff; | ||
338 | arm_pm_restart = corgi_restart; | ||
339 | |||
315 | /* setup sleep mode values */ | 340 | /* setup sleep mode values */ |
316 | PWER = 0x00000002; | 341 | PWER = 0x00000002; |
317 | PFER = 0x00000000; | 342 | PFER = 0x00000000; |
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index a042473deedd..1d516d317e89 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c | |||
@@ -18,11 +18,13 @@ | |||
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | #include <linux/fb.h> | 20 | #include <linux/fb.h> |
21 | #include <linux/pm.h> | ||
21 | 22 | ||
22 | #include <asm/hardware.h> | 23 | #include <asm/hardware.h> |
23 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
24 | #include <asm/irq.h> | 25 | #include <asm/irq.h> |
25 | #include <asm/setup.h> | 26 | #include <asm/setup.h> |
27 | #include <asm/system.h> | ||
26 | 28 | ||
27 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
28 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
@@ -247,10 +249,25 @@ static struct platform_device *devices[] __initdata = { | |||
247 | &poodle_scoop_device, | 249 | &poodle_scoop_device, |
248 | }; | 250 | }; |
249 | 251 | ||
252 | static void poodle_poweroff(void) | ||
253 | { | ||
254 | RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; | ||
255 | arm_machine_restart('h'); | ||
256 | } | ||
257 | |||
258 | static void poodle_restart(char mode) | ||
259 | { | ||
260 | RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; | ||
261 | arm_machine_restart('h'); | ||
262 | } | ||
263 | |||
250 | static void __init poodle_init(void) | 264 | static void __init poodle_init(void) |
251 | { | 265 | { |
252 | int ret = 0; | 266 | int ret = 0; |
253 | 267 | ||
268 | pm_power_off = poodle_poweroff; | ||
269 | arm_pm_restart = poodle_restart; | ||
270 | |||
254 | /* setup sleep mode values */ | 271 | /* setup sleep mode values */ |
255 | PWER = 0x00000002; | 272 | PWER = 0x00000002; |
256 | PFER = 0x00000000; | 273 | PFER = 0x00000000; |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 44bcb8097c7a..eb9937f6f5cd 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/fs.h> | 20 | #include <linux/fs.h> |
21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
22 | #include <linux/mmc/host.h> | 22 | #include <linux/mmc/host.h> |
23 | #include <linux/pm.h> | ||
23 | 24 | ||
24 | #include <asm/setup.h> | 25 | #include <asm/setup.h> |
25 | #include <asm/memory.h> | 26 | #include <asm/memory.h> |
@@ -27,6 +28,7 @@ | |||
27 | #include <asm/hardware.h> | 28 | #include <asm/hardware.h> |
28 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
29 | #include <asm/io.h> | 30 | #include <asm/io.h> |
31 | #include <asm/system.h> | ||
30 | 32 | ||
31 | #include <asm/mach/arch.h> | 33 | #include <asm/mach/arch.h> |
32 | #include <asm/mach/map.h> | 34 | #include <asm/mach/map.h> |
@@ -432,8 +434,31 @@ static struct platform_device *devices[] __initdata = { | |||
432 | &spitzled_device, | 434 | &spitzled_device, |
433 | }; | 435 | }; |
434 | 436 | ||
437 | static void spitz_poweroff(void) | ||
438 | { | ||
439 | RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; | ||
440 | |||
441 | pxa_gpio_mode(SPITZ_GPIO_ON_RESET | GPIO_OUT); | ||
442 | GPSR(SPITZ_GPIO_ON_RESET) = GPIO_bit(SPITZ_GPIO_ON_RESET); | ||
443 | |||
444 | mdelay(1000); | ||
445 | arm_machine_restart('h'); | ||
446 | } | ||
447 | |||
448 | static void spitz_restart(char mode) | ||
449 | { | ||
450 | /* Bootloader magic for a reboot */ | ||
451 | if((MSC0 & 0xffff0000) == 0x7ff00000) | ||
452 | MSC0 = (MSC0 & 0xffff) | 0x7ee00000; | ||
453 | |||
454 | spitz_poweroff(); | ||
455 | } | ||
456 | |||
435 | static void __init common_init(void) | 457 | static void __init common_init(void) |
436 | { | 458 | { |
459 | pm_power_off = spitz_poweroff; | ||
460 | arm_pm_restart = spitz_restart; | ||
461 | |||
437 | PMCR = 0x00; | 462 | PMCR = 0x00; |
438 | 463 | ||
439 | /* setup sleep mode values */ | 464 | /* setup sleep mode values */ |
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index 76c0e7f0a219..afa223b9e7a2 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
@@ -19,12 +19,14 @@ | |||
19 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/mmc/host.h> | 21 | #include <linux/mmc/host.h> |
22 | #include <linux/pm.h> | ||
22 | 23 | ||
23 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
24 | #include <asm/memory.h> | 25 | #include <asm/memory.h> |
25 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
26 | #include <asm/hardware.h> | 27 | #include <asm/hardware.h> |
27 | #include <asm/irq.h> | 28 | #include <asm/irq.h> |
29 | #include <asm/system.h> | ||
28 | #include <asm/arch/irda.h> | 30 | #include <asm/arch/irda.h> |
29 | #include <asm/arch/mmc.h> | 31 | #include <asm/arch/mmc.h> |
30 | #include <asm/arch/udc.h> | 32 | #include <asm/arch/udc.h> |
@@ -266,8 +268,31 @@ static struct platform_device *devices[] __initdata = { | |||
266 | &tosaled_device, | 268 | &tosaled_device, |
267 | }; | 269 | }; |
268 | 270 | ||
271 | static void tosa_poweroff(void) | ||
272 | { | ||
273 | RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; | ||
274 | |||
275 | pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_OUT); | ||
276 | GPSR(TOSA_GPIO_ON_RESET) = GPIO_bit(TOSA_GPIO_ON_RESET); | ||
277 | |||
278 | mdelay(1000); | ||
279 | arm_machine_restart('h'); | ||
280 | } | ||
281 | |||
282 | static void tosa_restart(char mode) | ||
283 | { | ||
284 | /* Bootloader magic for a reboot */ | ||
285 | if((MSC0 & 0xffff0000) == 0x7ff00000) | ||
286 | MSC0 = (MSC0 & 0xffff) | 0x7ee00000; | ||
287 | |||
288 | tosa_poweroff(); | ||
289 | } | ||
290 | |||
269 | static void __init tosa_init(void) | 291 | static void __init tosa_init(void) |
270 | { | 292 | { |
293 | pm_power_off = tosa_poweroff; | ||
294 | arm_pm_restart = tosa_restart; | ||
295 | |||
271 | pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_IN); | 296 | pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_IN); |
272 | pxa_gpio_mode(TOSA_GPIO_TC6393_INT | GPIO_IN); | 297 | pxa_gpio_mode(TOSA_GPIO_TC6393_INT | GPIO_IN); |
273 | pxa_gpio_mode(TOSA_GPIO_USB_IN | GPIO_IN); | 298 | pxa_gpio_mode(TOSA_GPIO_USB_IN | GPIO_IN); |
diff --git a/include/asm-arm/arch-pxa/system.h b/include/asm-arm/arch-pxa/system.h index 840a46bfbc54..1d56a3ef89fd 100644 --- a/include/asm-arm/arch-pxa/system.h +++ b/include/asm-arm/arch-pxa/system.h | |||
@@ -10,6 +10,7 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <asm/proc-fns.h> | ||
13 | #include "hardware.h" | 14 | #include "hardware.h" |
14 | #include "pxa-regs.h" | 15 | #include "pxa-regs.h" |
15 | 16 | ||
diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h index 7c9568d30307..e6b762b31488 100644 --- a/include/asm-arm/system.h +++ b/include/asm-arm/system.h | |||
@@ -108,6 +108,9 @@ extern void __show_regs(struct pt_regs *); | |||
108 | extern int cpu_architecture(void); | 108 | extern int cpu_architecture(void); |
109 | extern void cpu_init(void); | 109 | extern void cpu_init(void); |
110 | 110 | ||
111 | void arm_machine_restart(char mode); | ||
112 | extern void (*arm_pm_restart)(char str); | ||
113 | |||
111 | /* | 114 | /* |
112 | * Intel's XScale3 core supports some v6 features (supersections, L2) | 115 | * Intel's XScale3 core supports some v6 features (supersections, L2) |
113 | * but advertises itself as v5 as it does not support the v6 ISA. For | 116 | * but advertises itself as v5 as it does not support the v6 ISA. For |