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