| /* |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file "COPYING" in the main directory of this archive |
| * for more details. |
| * |
| * Copyright (C) 2001, 06 by Ralf Baechle (ralf@linux-mips.org) |
| * Copyright (C) 2001 MIPS Technologies, Inc. |
| */ |
| #include <linux/kernel.h> |
| #include <linux/export.h> |
| #include <linux/pm.h> |
| #include <linux/types.h> |
| #include <linux/reboot.h> |
| #include <linux/delay.h> |
| |
| #include <asm/reboot.h> |
| |
| /* |
| * Urgs ... Too many MIPS machines to handle this in a generic way. |
| * So handle all using function pointers to machine specific |
| * functions. |
| */ |
| void (*_machine_restart)(char *command); |
| void (*_machine_halt)(void); |
| void (*pm_power_off)(void); |
| |
| EXPORT_SYMBOL(pm_power_off); |
| |
| void machine_restart(char *command) |
| { |
| if (_machine_restart) |
| _machine_restart(command); |
| |
| #ifdef CONFIG_SMP |
| preempt_disable(); |
| smp_send_stop(); |
| #endif |
| do_kernel_restart(command); |
| mdelay(1000); |
| pr_emerg("Reboot failed -- System halted\n"); |
| local_irq_disable(); |
| while (1); |
| } |
| |
| void machine_halt(void) |
| { |
| if (_machine_halt) |
| _machine_halt(); |
| |
| #ifdef CONFIG_SMP |
| preempt_disable(); |
| smp_send_stop(); |
| #endif |
| local_irq_disable(); |
| while (1); |
| } |
| |
| void machine_power_off(void) |
| { |
| if (pm_power_off) |
| pm_power_off(); |
| |
| #ifdef CONFIG_SMP |
| preempt_disable(); |
| smp_send_stop(); |
| #endif |
| local_irq_disable(); |
| while (1); |
| } |