Merge branches 'release', 'cpuidle-2.6.25' and 'idle' into release
[sfrench/cifs-2.6.git] / include / asm-x86 / mach-default / mach_reboot.h
1 /*
2  *  arch/i386/mach-generic/mach_reboot.h
3  *
4  *  Machine specific reboot functions for generic.
5  *  Split out from reboot.c by Osamu Tomita <tomita@cinet.co.jp>
6  */
7 #ifndef _MACH_REBOOT_H
8 #define _MACH_REBOOT_H
9
10 static inline void kb_wait(void)
11 {
12         int i;
13
14         for (i = 0; i < 0x10000; i++)
15                 if ((inb_p(0x64) & 0x02) == 0)
16                         break;
17 }
18
19 static inline void mach_reboot(void)
20 {
21         int i;
22
23         /* old method, works on most machines */
24         for (i = 0; i < 10; i++) {
25                 kb_wait();
26                 udelay(50);
27                 outb(0xfe, 0x64);       /* pulse reset low */
28                 udelay(50);
29         }
30
31         /* New method: sets the "System flag" which, when set, indicates
32          * successful completion of the keyboard controller self-test (Basic
33          * Assurance Test, BAT).  This is needed for some machines with no
34          * keyboard plugged in.  This read-modify-write sequence sets only the
35          * system flag
36          */
37         for (i = 0; i < 10; i++) {
38                 int cmd;
39
40                 outb(0x20, 0x64);       /* read Controller Command Byte */
41                 udelay(50);
42                 kb_wait();
43                 udelay(50);
44                 cmd = inb(0x60);
45                 udelay(50);
46                 kb_wait();
47                 udelay(50);
48                 outb(0x60, 0x64);       /* write Controller Command Byte */
49                 udelay(50);
50                 kb_wait();
51                 udelay(50);
52                 outb(cmd | 0x14, 0x60); /* set "System flag" and "Keyboard Disabled" */
53                 udelay(50);
54                 kb_wait();
55                 udelay(50);
56                 outb(0xfe, 0x64);       /* pulse reset low */
57                 udelay(50);
58         }
59 }
60
61 #endif /* !_MACH_REBOOT_H */