|  | /* | 
|  | * Reset a Jazz machine. | 
|  | * | 
|  | * We don't trust the firmware so we do it the classic way by poking and | 
|  | * stabbing at the keyboard controller ... | 
|  | */ | 
|  | #include <linux/jiffies.h> | 
|  | #include <asm/jazz.h> | 
|  |  | 
|  | #define KBD_STAT_IBF		0x02	/* Keyboard input buffer full */ | 
|  |  | 
|  | static void jazz_write_output(unsigned char val) | 
|  | { | 
|  | int status; | 
|  |  | 
|  | do { | 
|  | status = jazz_kh->command; | 
|  | } while (status & KBD_STAT_IBF); | 
|  | jazz_kh->data = val; | 
|  | } | 
|  |  | 
|  | static void jazz_write_command(unsigned char val) | 
|  | { | 
|  | int status; | 
|  |  | 
|  | do { | 
|  | status = jazz_kh->command; | 
|  | } while (status & KBD_STAT_IBF); | 
|  | jazz_kh->command = val; | 
|  | } | 
|  |  | 
|  | static unsigned char jazz_read_status(void) | 
|  | { | 
|  | return jazz_kh->command; | 
|  | } | 
|  |  | 
|  | static inline void kb_wait(void) | 
|  | { | 
|  | unsigned long start = jiffies; | 
|  | unsigned long timeout = start + HZ/2; | 
|  |  | 
|  | do { | 
|  | if (! (jazz_read_status() & 0x02)) | 
|  | return; | 
|  | } while (time_before_eq(jiffies, timeout)); | 
|  | } | 
|  |  | 
|  | void jazz_machine_restart(char *command) | 
|  | { | 
|  | while(1) { | 
|  | kb_wait(); | 
|  | jazz_write_command(0xd1); | 
|  | kb_wait(); | 
|  | jazz_write_output(0x00); | 
|  | } | 
|  | } |