Merge branch 'upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik...
[linux-2.6] / arch / mips / jazz / reset.c
1 /*
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>
9 #include <asm/io.h>
10 #include <asm/system.h>
11 #include <asm/reboot.h>
12 #include <asm/delay.h>
13
14 #define KBD_STAT_IBF            0x02    /* Keyboard input buffer full */
15
16 static void jazz_write_output(unsigned char val)
17 {
18         int status;
19
20         do {
21                 status = jazz_kh->command;
22         } while (status & KBD_STAT_IBF);
23         jazz_kh->data = val;
24 }
25
26 static void jazz_write_command(unsigned char val)
27 {
28         int status;
29
30         do {
31                 status = jazz_kh->command;
32         } while (status & KBD_STAT_IBF);
33         jazz_kh->command = val;
34 }
35
36 static unsigned char jazz_read_status(void)
37 {
38         return jazz_kh->command;
39 }
40
41 static inline void kb_wait(void)
42 {
43         unsigned long start = jiffies;
44         unsigned long timeout = start + HZ/2;
45
46         do {
47                 if (! (jazz_read_status() & 0x02))
48                         return;
49         } while (time_before_eq(jiffies, timeout));
50 }
51
52 void jazz_machine_restart(char *command)
53 {
54         while(1) {
55                 kb_wait();
56                 jazz_write_command (0xd1);
57                 kb_wait();
58                 jazz_write_output (0x00);
59         }
60 }
61
62 void jazz_machine_halt(void)
63 {
64 }
65
66 void jazz_machine_power_off(void)
67 {
68         /* Jazz machines don't have a software power switch */
69 }