| #include <linux/module.h> |
| #include <linux/smp.h> |
| #include <linux/delay.h> |
| #include <linux/platform.h> |
| |
| #include <asm/io.h> |
| #include "piix4.h" |
| |
| void (*pm_power_off)(void); |
| EXPORT_SYMBOL(pm_power_off); |
| |
| void machine_shutdown(void) |
| { |
| #ifdef CONFIG_SMP |
| smp_send_stop(); |
| #endif |
| } |
| |
| void machine_emergency_restart(void) |
| { |
| /* |
| * Visual Workstations restart after this |
| * register is poked on the PIIX4 |
| */ |
| outb(PIIX4_RESET_VAL, PIIX4_RESET_PORT); |
| } |
| |
| void machine_restart(char * __unused) |
| { |
| machine_shutdown(); |
| machine_emergency_restart(); |
| } |
| |
| void machine_power_off(void) |
| { |
| unsigned short pm_status; |
| extern unsigned int pci_bus0; |
| |
| while ((pm_status = inw(PMSTS_PORT)) & 0x100) |
| outw(pm_status, PMSTS_PORT); |
| |
| outw(PM_SUSPEND_ENABLE, PMCNTRL_PORT); |
| |
| mdelay(10); |
| |
| #define PCI_CONF1_ADDRESS(bus, devfn, reg) \ |
| (0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3)) |
| |
| outl(PCI_CONF1_ADDRESS(pci_bus0, SPECIAL_DEV, SPECIAL_REG), 0xCF8); |
| outl(PIIX_SPECIAL_STOP, 0xCFC); |
| } |
| |
| void machine_halt(void) |
| { |
| } |
| |