blob: 6adee6a97dec4f462776a59c2259842a4cfc7c71 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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
10static 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
19static inline void mach_reboot(void)
20{
21 int i;
Truxton Fulton8b937892007-07-21 17:10:38 +020022
23 /* old method, works on most machines */
Andi Kleena6f5deb2005-11-05 17:25:54 +010024 for (i = 0; i < 10; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -070025 kb_wait();
26 udelay(50);
Truxton Fulton8b937892007-07-21 17:10:38 +020027 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);
Truxton Fulton59f4e7d2005-09-09 13:02:18 -070048 outb(0x60, 0x64); /* write Controller Command Byte */
49 udelay(50);
50 kb_wait();
51 udelay(50);
Truxton Fulton05dfa352007-11-17 16:27:01 +010052 outb(cmd | 0x14, 0x60); /* set "System flag" and "Keyboard Disabled" */
Truxton Fulton59f4e7d2005-09-09 13:02:18 -070053 udelay(50);
54 kb_wait();
55 udelay(50);
56 outb(0xfe, 0x64); /* pulse reset low */
Linus Torvalds1da177e2005-04-16 15:20:36 -070057 udelay(50);
58 }
59}
60
61#endif /* !_MACH_REBOOT_H */