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