1#include <linux/module.h> 2#include <linux/smp.h> 3#include <linux/delay.h> 4 5#include <asm/io.h> 6#include "piix4.h" 7 8void (*pm_power_off)(void); 9EXPORT_SYMBOL(pm_power_off); 10 11void machine_shutdown(void) 12{ 13#ifdef CONFIG_SMP 14 smp_send_stop(); 15#endif 16} 17 18void machine_emergency_restart(void) 19{ 20 /* 21 * Visual Workstations restart after this 22 * register is poked on the PIIX4 23 */ 24 outb(PIIX4_RESET_VAL, PIIX4_RESET_PORT); 25} 26 27void machine_restart(char * __unused) 28{ 29 machine_shutdown(); 30 machine_emergency_restart(); 31} 32 33void machine_power_off(void) 34{ 35 unsigned short pm_status; 36 extern unsigned int pci_bus0; 37 38 while ((pm_status = inw(PMSTS_PORT)) & 0x100) 39 outw(pm_status, PMSTS_PORT); 40 41 outw(PM_SUSPEND_ENABLE, PMCNTRL_PORT); 42 43 mdelay(10); 44 45#define PCI_CONF1_ADDRESS(bus, devfn, reg) \ 46 (0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3)) 47 48 outl(PCI_CONF1_ADDRESS(pci_bus0, SPECIAL_DEV, SPECIAL_REG), 0xCF8); 49 outl(PIIX_SPECIAL_STOP, 0xCFC); 50} 51 52void machine_halt(void) 53{ 54} 55