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