blob: dd889fe86bd1da2a4d60d3537a82b4ea6867c42a [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Reset a Jazz machine.
3 *
4 * We don't trust the firmware so we do it the classic way by poking and
5 * stabbing at the keyboard controller ...
6 */
7#include <linux/jiffies.h>
8#include <asm/jazz.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07009
10#define KBD_STAT_IBF 0x02 /* Keyboard input buffer full */
11
12static void jazz_write_output(unsigned char val)
13{
14 int status;
15
16 do {
17 status = jazz_kh->command;
18 } while (status & KBD_STAT_IBF);
19 jazz_kh->data = val;
20}
21
22static void jazz_write_command(unsigned char val)
23{
24 int status;
25
26 do {
27 status = jazz_kh->command;
28 } while (status & KBD_STAT_IBF);
29 jazz_kh->command = val;
30}
31
32static unsigned char jazz_read_status(void)
33{
34 return jazz_kh->command;
35}
36
37static inline void kb_wait(void)
38{
39 unsigned long start = jiffies;
40 unsigned long timeout = start + HZ/2;
41
42 do {
43 if (! (jazz_read_status() & 0x02))
44 return;
45 } while (time_before_eq(jiffies, timeout));
46}
47
48void jazz_machine_restart(char *command)
49{
50 while(1) {
51 kb_wait();
Ralf Baechle49a89ef2007-10-11 23:46:15 +010052 jazz_write_command(0xd1);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053 kb_wait();
Ralf Baechle49a89ef2007-10-11 23:46:15 +010054 jazz_write_output(0x00);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 }
56}