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