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 |
