1 /* 2 * console.c: Routines that deal with sending and receiving IO 3 * to/from the current console device using the PROM. 4 * 5 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 6 * Copyright (C) 1998 Pete Zaitcev <zaitcev@yahoo.com> 7 */ 8 9 #include <linux/types.h> 10 #include <linux/kernel.h> 11 #include <linux/sched.h> 12 #include <asm/openprom.h> 13 #include <asm/oplib.h> 14 #include <linux/string.h> 15 16 extern void restore_current(void); 17 18 /* Non blocking put character to console device, returns -1 if 19 * unsuccessful. 20 */ 21 static int prom_nbputchar(const char *buf) 22 { 23 unsigned long flags; 24 int i = -1; 25 26 spin_lock_irqsave(&prom_lock, flags); 27 switch(prom_vers) { 28 case PROM_V0: 29 if ((*(romvec->pv_nbputchar))(*buf)) 30 i = 1; 31 break; 32 case PROM_V2: 33 case PROM_V3: 34 if ((*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, 35 buf, 0x1) == 1) 36 i = 1; 37 break; 38 default: 39 break; 40 } 41 restore_current(); 42 spin_unlock_irqrestore(&prom_lock, flags); 43 return i; /* Ugh, we could spin forever on unsupported proms ;( */ 44 } 45 46 void prom_console_write_buf(const char *buf, int len) 47 { 48 while (len) { 49 int n = prom_nbputchar(buf); 50 if (n < 0) 51 continue; 52 len--; 53 buf++; 54 } 55 } 56 57