xref: /openbmc/linux/arch/mips/jazz/reset.c (revision d5cb9783536a41df9f9cba5b0a1d78047ed787f7)
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 }
70