xref: /openbmc/linux/arch/sparc/prom/console_32.c (revision 595a251c)
1708d4f09SSam Ravnborg /*
2708d4f09SSam Ravnborg  * console.c: Routines that deal with sending and receiving IO
3708d4f09SSam Ravnborg  *            to/from the current console device using the PROM.
4708d4f09SSam Ravnborg  *
5708d4f09SSam Ravnborg  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
6708d4f09SSam Ravnborg  * Copyright (C) 1998 Pete Zaitcev <zaitcev@yahoo.com>
7708d4f09SSam Ravnborg  */
8708d4f09SSam Ravnborg 
9708d4f09SSam Ravnborg #include <linux/types.h>
10708d4f09SSam Ravnborg #include <linux/kernel.h>
11708d4f09SSam Ravnborg #include <linux/sched.h>
12708d4f09SSam Ravnborg #include <asm/openprom.h>
13708d4f09SSam Ravnborg #include <asm/oplib.h>
14708d4f09SSam Ravnborg #include <asm/system.h>
15708d4f09SSam Ravnborg #include <linux/string.h>
16708d4f09SSam Ravnborg 
17708d4f09SSam Ravnborg extern void restore_current(void);
18708d4f09SSam Ravnborg 
19708d4f09SSam Ravnborg /* Non blocking put character to console device, returns -1 if
20708d4f09SSam Ravnborg  * unsuccessful.
21708d4f09SSam Ravnborg  */
22e62cac1fSDavid S. Miller static int prom_nbputchar(const char *buf)
23708d4f09SSam Ravnborg {
24708d4f09SSam Ravnborg 	unsigned long flags;
25708d4f09SSam Ravnborg 	int i = -1;
26708d4f09SSam Ravnborg 
27708d4f09SSam Ravnborg 	spin_lock_irqsave(&prom_lock, flags);
28708d4f09SSam Ravnborg 	switch(prom_vers) {
29708d4f09SSam Ravnborg 	case PROM_V0:
30e62cac1fSDavid S. Miller 		i = (*(romvec->pv_nbputchar))(*buf);
31708d4f09SSam Ravnborg 		break;
32708d4f09SSam Ravnborg 	case PROM_V2:
33708d4f09SSam Ravnborg 	case PROM_V3:
34e62cac1fSDavid S. Miller 		if ((*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout,
35e62cac1fSDavid S. Miller 							  buf, 0x1) == 1)
36708d4f09SSam Ravnborg 			i = 0;
37708d4f09SSam Ravnborg 		break;
38708d4f09SSam Ravnborg 	default:
39708d4f09SSam Ravnborg 		break;
40708d4f09SSam Ravnborg 	};
41708d4f09SSam Ravnborg 	restore_current();
42708d4f09SSam Ravnborg 	spin_unlock_irqrestore(&prom_lock, flags);
43708d4f09SSam Ravnborg 	return i; /* Ugh, we could spin forever on unsupported proms ;( */
44708d4f09SSam Ravnborg }
45708d4f09SSam Ravnborg 
46595a251cSDavid S. Miller void prom_console_write_buf(const char *buf, int len)
47708d4f09SSam Ravnborg {
48595a251cSDavid S. Miller 	while (len) {
49595a251cSDavid S. Miller 		int n = prom_nbputchar(buf);
50595a251cSDavid S. Miller 		if (n)
51595a251cSDavid S. Miller 			continue;
52595a251cSDavid S. Miller 		len--;
53595a251cSDavid S. Miller 		buf++;
54e62cac1fSDavid S. Miller 	}
55708d4f09SSam Ravnborg }
56595a251cSDavid S. Miller 
57