diff options
| author | David S. Miller <davem@davemloft.net> | 2008-09-01 22:31:16 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-09-02 03:31:11 -0400 |
| commit | cdb3592a20b41377a28a0737dc9af95e53024470 (patch) | |
| tree | 378d6001731b78e9c8bcb15d642dc34a18e887f7 | |
| parent | e822358ac24550d889895d5866797ae8c9b188c2 (diff) | |
sparc64: Move reboot handling into seperate file and kill power reg programming.
We should always use prom_power_off().
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | arch/sparc/include/asm/reboot.h | 6 | ||||
| -rw-r--r-- | arch/sparc64/kernel/Makefile | 2 | ||||
| -rw-r--r-- | arch/sparc64/kernel/power.c | 37 | ||||
| -rw-r--r-- | arch/sparc64/kernel/process.c | 33 | ||||
| -rw-r--r-- | arch/sparc64/kernel/reboot.c | 56 |
5 files changed, 57 insertions, 77 deletions
diff --git a/arch/sparc/include/asm/reboot.h b/arch/sparc/include/asm/reboot.h deleted file mode 100644 index 3f3f43f5be5e..000000000000 --- a/arch/sparc/include/asm/reboot.h +++ /dev/null | |||
| @@ -1,6 +0,0 @@ | |||
| 1 | #ifndef _SPARC64_REBOOT_H | ||
| 2 | #define _SPARC64_REBOOT_H | ||
| 3 | |||
| 4 | extern void machine_alt_power_off(void); | ||
| 5 | |||
| 6 | #endif /* _SPARC64_REBOOT_H */ | ||
diff --git a/arch/sparc64/kernel/Makefile b/arch/sparc64/kernel/Makefile index 928aa7c8058e..fb02807167eb 100644 --- a/arch/sparc64/kernel/Makefile +++ b/arch/sparc64/kernel/Makefile | |||
| @@ -7,7 +7,7 @@ EXTRA_CFLAGS := -Werror | |||
| 7 | 7 | ||
| 8 | extra-y := head.o init_task.o vmlinux.lds | 8 | extra-y := head.o init_task.o vmlinux.lds |
| 9 | 9 | ||
| 10 | obj-y := process.o setup.o cpu.o idprom.o \ | 10 | obj-y := process.o setup.o cpu.o idprom.o reboot.o \ |
| 11 | traps.o auxio.o una_asm.o sysfs.o iommu.o \ | 11 | traps.o auxio.o una_asm.o sysfs.o iommu.o \ |
| 12 | irq.o ptrace.o time.o sys_sparc.o signal.o \ | 12 | irq.o ptrace.o time.o sys_sparc.o signal.o \ |
| 13 | unaligned.o central.o starfire.o \ | 13 | unaligned.o central.o starfire.o \ |
diff --git a/arch/sparc64/kernel/power.c b/arch/sparc64/kernel/power.c index 7559ad395a33..076cad7f9757 100644 --- a/arch/sparc64/kernel/power.c +++ b/arch/sparc64/kernel/power.c | |||
| @@ -7,21 +7,11 @@ | |||
| 7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
| 8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
| 9 | #include <linux/interrupt.h> | 9 | #include <linux/interrupt.h> |
| 10 | #include <linux/pm.h> | ||
| 11 | #include <linux/reboot.h> | 10 | #include <linux/reboot.h> |
| 12 | #include <linux/of_device.h> | 11 | #include <linux/of_device.h> |
| 13 | 12 | ||
| 14 | #include <asm/auxio.h> | ||
| 15 | #include <asm/prom.h> | 13 | #include <asm/prom.h> |
| 16 | #include <asm/io.h> | 14 | #include <asm/io.h> |
| 17 | #include <asm/sstate.h> | ||
| 18 | #include <asm/reboot.h> | ||
| 19 | |||
| 20 | /* | ||
| 21 | * sysctl - toggle power-off restriction for serial console | ||
| 22 | * systems in machine_power_off() | ||
| 23 | */ | ||
| 24 | int scons_pwroff = 1; | ||
| 25 | 15 | ||
| 26 | static void __iomem *power_reg; | 16 | static void __iomem *power_reg; |
| 27 | 17 | ||
| @@ -33,31 +23,6 @@ static irqreturn_t power_handler(int irq, void *dev_id) | |||
| 33 | return IRQ_HANDLED; | 23 | return IRQ_HANDLED; |
| 34 | } | 24 | } |
| 35 | 25 | ||
| 36 | static void (*poweroff_method)(void) = machine_alt_power_off; | ||
| 37 | |||
| 38 | void machine_power_off(void) | ||
| 39 | { | ||
| 40 | sstate_poweroff(); | ||
| 41 | if (strcmp(of_console_device->type, "serial") || scons_pwroff) { | ||
| 42 | if (power_reg) { | ||
| 43 | /* Both register bits seem to have the | ||
| 44 | * same effect, so until I figure out | ||
| 45 | * what the difference is... | ||
| 46 | */ | ||
| 47 | writel(AUXIO_PCIO_CPWR_OFF | AUXIO_PCIO_SPWR_OFF, power_reg); | ||
| 48 | } else { | ||
| 49 | if (poweroff_method != NULL) { | ||
| 50 | poweroff_method(); | ||
| 51 | /* not reached */ | ||
| 52 | } | ||
| 53 | } | ||
| 54 | } | ||
| 55 | machine_halt(); | ||
| 56 | } | ||
| 57 | |||
| 58 | void (*pm_power_off)(void) = machine_power_off; | ||
| 59 | EXPORT_SYMBOL(pm_power_off); | ||
| 60 | |||
| 61 | static int __init has_button_interrupt(unsigned int irq, struct device_node *dp) | 26 | static int __init has_button_interrupt(unsigned int irq, struct device_node *dp) |
| 62 | { | 27 | { |
| 63 | if (irq == 0xffffffff) | 28 | if (irq == 0xffffffff) |
| @@ -78,8 +43,6 @@ static int __devinit power_probe(struct of_device *op, const struct of_device_id | |||
| 78 | printk(KERN_INFO "%s: Control reg at %lx\n", | 43 | printk(KERN_INFO "%s: Control reg at %lx\n", |
| 79 | op->node->name, res->start); | 44 | op->node->name, res->start); |
| 80 | 45 | ||
| 81 | poweroff_method = machine_halt; /* able to use the standard halt */ | ||
| 82 | |||
| 83 | if (has_button_interrupt(irq, op->node)) { | 46 | if (has_button_interrupt(irq, op->node)) { |
| 84 | if (request_irq(irq, | 47 | if (request_irq(irq, |
| 85 | power_handler, 0, "power", NULL) < 0) | 48 | power_handler, 0, "power", NULL) < 0) |
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index 15f4178592e7..11bb6c4612de 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/ptrace.h> | 22 | #include <linux/ptrace.h> |
| 23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
| 24 | #include <linux/user.h> | 24 | #include <linux/user.h> |
| 25 | #include <linux/reboot.h> | ||
| 26 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
| 27 | #include <linux/compat.h> | 26 | #include <linux/compat.h> |
| 28 | #include <linux/tick.h> | 27 | #include <linux/tick.h> |
| @@ -31,7 +30,6 @@ | |||
| 31 | #include <linux/elfcore.h> | 30 | #include <linux/elfcore.h> |
| 32 | #include <linux/sysrq.h> | 31 | #include <linux/sysrq.h> |
| 33 | 32 | ||
| 34 | #include <asm/oplib.h> | ||
| 35 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
| 36 | #include <asm/system.h> | 34 | #include <asm/system.h> |
| 37 | #include <asm/page.h> | 35 | #include <asm/page.h> |
| @@ -46,8 +44,6 @@ | |||
| 46 | #include <asm/mmu_context.h> | 44 | #include <asm/mmu_context.h> |
| 47 | #include <asm/unistd.h> | 45 | #include <asm/unistd.h> |
| 48 | #include <asm/hypervisor.h> | 46 | #include <asm/hypervisor.h> |
| 49 | #include <asm/sstate.h> | ||
| 50 | #include <asm/reboot.h> | ||
| 51 | #include <asm/syscalls.h> | 47 | #include <asm/syscalls.h> |
| 52 | #include <asm/irq_regs.h> | 48 | #include <asm/irq_regs.h> |
| 53 | #include <asm/smp.h> | 49 | #include <asm/smp.h> |
| @@ -115,35 +111,6 @@ void cpu_idle(void) | |||
| 115 | } | 111 | } |
| 116 | } | 112 | } |
| 117 | 113 | ||
| 118 | void machine_halt(void) | ||
| 119 | { | ||
| 120 | sstate_halt(); | ||
| 121 | prom_halt(); | ||
| 122 | panic("Halt failed!"); | ||
| 123 | } | ||
| 124 | |||
| 125 | void machine_alt_power_off(void) | ||
| 126 | { | ||
| 127 | sstate_poweroff(); | ||
| 128 | prom_halt_power_off(); | ||
| 129 | panic("Power-off failed!"); | ||
| 130 | } | ||
| 131 | |||
| 132 | void machine_restart(char * cmd) | ||
| 133 | { | ||
| 134 | char *p; | ||
| 135 | |||
| 136 | sstate_reboot(); | ||
| 137 | p = strchr (reboot_command, '\n'); | ||
| 138 | if (p) *p = 0; | ||
| 139 | if (cmd) | ||
| 140 | prom_reboot(cmd); | ||
| 141 | if (*reboot_command) | ||
| 142 | prom_reboot(reboot_command); | ||
| 143 | prom_reboot(""); | ||
| 144 | panic("Reboot failed!"); | ||
| 145 | } | ||
| 146 | |||
| 147 | #ifdef CONFIG_COMPAT | 114 | #ifdef CONFIG_COMPAT |
| 148 | static void show_regwindow32(struct pt_regs *regs) | 115 | static void show_regwindow32(struct pt_regs *regs) |
| 149 | { | 116 | { |
diff --git a/arch/sparc64/kernel/reboot.c b/arch/sparc64/kernel/reboot.c new file mode 100644 index 000000000000..04dd34cbb872 --- /dev/null +++ b/arch/sparc64/kernel/reboot.c | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | /* reboot.c: reboot/shutdown/halt/poweroff handling | ||
| 2 | * | ||
| 3 | * Copyright (C) 2008 David S. Miller <davem@davemloft.net> | ||
| 4 | */ | ||
| 5 | #include <linux/kernel.h> | ||
| 6 | #include <linux/reboot.h> | ||
| 7 | #include <linux/module.h> | ||
| 8 | #include <linux/pm.h> | ||
| 9 | |||
| 10 | #include <asm/sstate.h> | ||
| 11 | #include <asm/oplib.h> | ||
| 12 | #include <asm/prom.h> | ||
| 13 | |||
| 14 | /* sysctl - toggle power-off restriction for serial console | ||
| 15 | * systems in machine_power_off() | ||
| 16 | */ | ||
| 17 | int scons_pwroff = 1; | ||
| 18 | |||
| 19 | /* This isn't actually used, it exists merely to satisfy the | ||
| 20 | * reference in kernel/sys.c | ||
| 21 | */ | ||
| 22 | void (*pm_power_off)(void) = machine_power_off; | ||
| 23 | EXPORT_SYMBOL(pm_power_off); | ||
| 24 | |||
| 25 | void machine_power_off(void) | ||
| 26 | { | ||
| 27 | sstate_poweroff(); | ||
| 28 | if (strcmp(of_console_device->type, "serial") || scons_pwroff) | ||
| 29 | prom_halt_power_off(); | ||
| 30 | |||
| 31 | prom_halt(); | ||
| 32 | } | ||
| 33 | |||
| 34 | void machine_halt(void) | ||
| 35 | { | ||
| 36 | sstate_halt(); | ||
| 37 | prom_halt(); | ||
| 38 | panic("Halt failed!"); | ||
| 39 | } | ||
| 40 | |||
| 41 | void machine_restart(char *cmd) | ||
| 42 | { | ||
| 43 | char *p; | ||
| 44 | |||
| 45 | sstate_reboot(); | ||
| 46 | p = strchr(reboot_command, '\n'); | ||
| 47 | if (p) | ||
| 48 | *p = 0; | ||
| 49 | if (cmd) | ||
| 50 | prom_reboot(cmd); | ||
| 51 | if (*reboot_command) | ||
| 52 | prom_reboot(reboot_command); | ||
| 53 | prom_reboot(""); | ||
| 54 | panic("Reboot failed!"); | ||
| 55 | } | ||
| 56 | |||
