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  */
prom_nbputchar(const char * buf)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 
prom_console_write_buf(const char * buf,int len)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