xref: /openbmc/linux/arch/sparc/prom/console_32.c (revision 708d4f09)
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 get character from console input device, returns -1
20708d4f09SSam Ravnborg  * if no input was taken.  This can be used for polling.
21708d4f09SSam Ravnborg  */
22708d4f09SSam Ravnborg int
23708d4f09SSam Ravnborg prom_nbgetchar(void)
24708d4f09SSam Ravnborg {
25708d4f09SSam Ravnborg 	static char inc;
26708d4f09SSam Ravnborg 	int i = -1;
27708d4f09SSam Ravnborg 	unsigned long flags;
28708d4f09SSam Ravnborg 
29708d4f09SSam Ravnborg 	spin_lock_irqsave(&prom_lock, flags);
30708d4f09SSam Ravnborg 	switch(prom_vers) {
31708d4f09SSam Ravnborg 	case PROM_V0:
32708d4f09SSam Ravnborg 		i = (*(romvec->pv_nbgetchar))();
33708d4f09SSam Ravnborg 		break;
34708d4f09SSam Ravnborg 	case PROM_V2:
35708d4f09SSam Ravnborg 	case PROM_V3:
36708d4f09SSam Ravnborg 		if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) {
37708d4f09SSam Ravnborg 			i = inc;
38708d4f09SSam Ravnborg 		} else {
39708d4f09SSam Ravnborg 			i = -1;
40708d4f09SSam Ravnborg 		}
41708d4f09SSam Ravnborg 		break;
42708d4f09SSam Ravnborg 	default:
43708d4f09SSam Ravnborg 		i = -1;
44708d4f09SSam Ravnborg 		break;
45708d4f09SSam Ravnborg 	};
46708d4f09SSam Ravnborg 	restore_current();
47708d4f09SSam Ravnborg 	spin_unlock_irqrestore(&prom_lock, flags);
48708d4f09SSam Ravnborg 	return i; /* Ugh, we could spin forever on unsupported proms ;( */
49708d4f09SSam Ravnborg }
50708d4f09SSam Ravnborg 
51708d4f09SSam Ravnborg /* Non blocking put character to console device, returns -1 if
52708d4f09SSam Ravnborg  * unsuccessful.
53708d4f09SSam Ravnborg  */
54708d4f09SSam Ravnborg int
55708d4f09SSam Ravnborg prom_nbputchar(char c)
56708d4f09SSam Ravnborg {
57708d4f09SSam Ravnborg 	static char outc;
58708d4f09SSam Ravnborg 	unsigned long flags;
59708d4f09SSam Ravnborg 	int i = -1;
60708d4f09SSam Ravnborg 
61708d4f09SSam Ravnborg 	spin_lock_irqsave(&prom_lock, flags);
62708d4f09SSam Ravnborg 	switch(prom_vers) {
63708d4f09SSam Ravnborg 	case PROM_V0:
64708d4f09SSam Ravnborg 		i = (*(romvec->pv_nbputchar))(c);
65708d4f09SSam Ravnborg 		break;
66708d4f09SSam Ravnborg 	case PROM_V2:
67708d4f09SSam Ravnborg 	case PROM_V3:
68708d4f09SSam Ravnborg 		outc = c;
69708d4f09SSam Ravnborg 		if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1)
70708d4f09SSam Ravnborg 			i = 0;
71708d4f09SSam Ravnborg 		else
72708d4f09SSam Ravnborg 			i = -1;
73708d4f09SSam Ravnborg 		break;
74708d4f09SSam Ravnborg 	default:
75708d4f09SSam Ravnborg 		i = -1;
76708d4f09SSam Ravnborg 		break;
77708d4f09SSam Ravnborg 	};
78708d4f09SSam Ravnborg 	restore_current();
79708d4f09SSam Ravnborg 	spin_unlock_irqrestore(&prom_lock, flags);
80708d4f09SSam Ravnborg 	return i; /* Ugh, we could spin forever on unsupported proms ;( */
81708d4f09SSam Ravnborg }
82708d4f09SSam Ravnborg 
83708d4f09SSam Ravnborg /* Blocking version of get character routine above. */
84708d4f09SSam Ravnborg char
85708d4f09SSam Ravnborg prom_getchar(void)
86708d4f09SSam Ravnborg {
87708d4f09SSam Ravnborg 	int character;
88708d4f09SSam Ravnborg 	while((character = prom_nbgetchar()) == -1) ;
89708d4f09SSam Ravnborg 	return (char) character;
90708d4f09SSam Ravnborg }
91708d4f09SSam Ravnborg 
92708d4f09SSam Ravnborg /* Blocking version of put character routine above. */
93708d4f09SSam Ravnborg void
94708d4f09SSam Ravnborg prom_putchar(char c)
95708d4f09SSam Ravnborg {
96708d4f09SSam Ravnborg 	while(prom_nbputchar(c) == -1) ;
97708d4f09SSam Ravnborg 	return;
98708d4f09SSam Ravnborg }
99