mirror of
https://github.com/torvalds/linux.git
synced 2024-11-04 11:04:38 +00:00
8b93789808
Commit 59f4e7d572
fixed machine rebooting
on Truxton's machine (when no keyboard was present). But it broke it on
Lee's machine.
The patch reinstates the old (pre-59f4e7d572980a521b7bdba74ab71b21f5995538)
code and if that doesn't work out, try the new,
post-59f4e7d572980a521b7bdba74ab71b21f5995538 code instead.
Cc: Lee Garrett <lee-in-berlin@web.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
62 lines
1.3 KiB
C
62 lines
1.3 KiB
C
/*
|
|
* arch/i386/mach-generic/mach_reboot.h
|
|
*
|
|
* Machine specific reboot functions for generic.
|
|
* Split out from reboot.c by Osamu Tomita <tomita@cinet.co.jp>
|
|
*/
|
|
#ifndef _MACH_REBOOT_H
|
|
#define _MACH_REBOOT_H
|
|
|
|
static inline void kb_wait(void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < 0x10000; i++)
|
|
if ((inb_p(0x64) & 0x02) == 0)
|
|
break;
|
|
}
|
|
|
|
static inline void mach_reboot(void)
|
|
{
|
|
int i;
|
|
|
|
/* old method, works on most machines */
|
|
for (i = 0; i < 10; i++) {
|
|
kb_wait();
|
|
udelay(50);
|
|
outb(0xfe, 0x64); /* pulse reset low */
|
|
udelay(50);
|
|
}
|
|
|
|
/* New method: sets the "System flag" which, when set, indicates
|
|
* successful completion of the keyboard controller self-test (Basic
|
|
* Assurance Test, BAT). This is needed for some machines with no
|
|
* keyboard plugged in. This read-modify-write sequence sets only the
|
|
* system flag
|
|
*/
|
|
for (i = 0; i < 10; i++) {
|
|
int cmd;
|
|
|
|
outb(0x20, 0x64); /* read Controller Command Byte */
|
|
udelay(50);
|
|
kb_wait();
|
|
udelay(50);
|
|
cmd = inb(0x60);
|
|
udelay(50);
|
|
kb_wait();
|
|
udelay(50);
|
|
outb(0x60, 0x64); /* write Controller Command Byte */
|
|
udelay(50);
|
|
kb_wait();
|
|
udelay(50);
|
|
outb(cmd | 0x04, 0x60); /* set "System flag" */
|
|
udelay(50);
|
|
kb_wait();
|
|
udelay(50);
|
|
outb(0xfe, 0x64); /* pulse reset low */
|
|
udelay(50);
|
|
}
|
|
}
|
|
|
|
#endif /* !_MACH_REBOOT_H */
|