aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/prom/console_32.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-11-30 17:33:29 -0500
committerDavid S. Miller <davem@davemloft.net>2010-11-30 17:33:29 -0500
commite62cac1fd035b4cde707285008499dbe71955a86 (patch)
tree214447e9efd4dc49f5bb707c7c1c0073a3df9803 /arch/sparc/prom/console_32.c
parent91921fef7c658b12de53376b312d071d757f7770 (diff)
sparc: Pass buffer pointer all the way down to prom_{get,put}char().
This gets us closer to being able to eliminate the use of dynamic and stack based buffers, so that we can adhere to the "no buffer addresses above 4GB" rule for PROM calls. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/prom/console_32.c')
-rw-r--r--arch/sparc/prom/console_32.c50
1 files changed, 25 insertions, 25 deletions
diff --git a/arch/sparc/prom/console_32.c b/arch/sparc/prom/console_32.c
index 2ce5acb45f2d..69c16bbf1f48 100644
--- a/arch/sparc/prom/console_32.c
+++ b/arch/sparc/prom/console_32.c
@@ -19,27 +19,27 @@ extern void restore_current(void);
19/* Non blocking get character from console input device, returns -1 19/* Non blocking get character from console input device, returns -1
20 * if no input was taken. This can be used for polling. 20 * if no input was taken. This can be used for polling.
21 */ 21 */
22static int prom_nbgetchar(void) 22static int prom_nbgetchar(char *buf)
23{ 23{
24 static char inc;
25 int i = -1;
26 unsigned long flags; 24 unsigned long flags;
25 int i = -1;
27 26
28 spin_lock_irqsave(&prom_lock, flags); 27 spin_lock_irqsave(&prom_lock, flags);
29 switch(prom_vers) { 28 switch(prom_vers) {
30 case PROM_V0: 29 case PROM_V0:
31 i = (*(romvec->pv_nbgetchar))(); 30 i = (*(romvec->pv_nbgetchar))();
31 if (i != -1) {
32 *buf = i;
33 i = 0;
34 }
32 break; 35 break;
33 case PROM_V2: 36 case PROM_V2:
34 case PROM_V3: 37 case PROM_V3:
35 if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) { 38 if ((*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin,
36 i = inc; 39 buf, 0x1) == 1)
37 } else { 40 i = 0;
38 i = -1;
39 }
40 break; 41 break;
41 default: 42 default:
42 i = -1;
43 break; 43 break;
44 }; 44 };
45 restore_current(); 45 restore_current();
@@ -50,27 +50,23 @@ static int prom_nbgetchar(void)
50/* Non blocking put character to console device, returns -1 if 50/* Non blocking put character to console device, returns -1 if
51 * unsuccessful. 51 * unsuccessful.
52 */ 52 */
53static int prom_nbputchar(char c) 53static int prom_nbputchar(const char *buf)
54{ 54{
55 static char outc;
56 unsigned long flags; 55 unsigned long flags;
57 int i = -1; 56 int i = -1;
58 57
59 spin_lock_irqsave(&prom_lock, flags); 58 spin_lock_irqsave(&prom_lock, flags);
60 switch(prom_vers) { 59 switch(prom_vers) {
61 case PROM_V0: 60 case PROM_V0:
62 i = (*(romvec->pv_nbputchar))(c); 61 i = (*(romvec->pv_nbputchar))(*buf);
63 break; 62 break;
64 case PROM_V2: 63 case PROM_V2:
65 case PROM_V3: 64 case PROM_V3:
66 outc = c; 65 if ((*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout,
67 if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1) 66 buf, 0x1) == 1)
68 i = 0; 67 i = 0;
69 else
70 i = -1;
71 break; 68 break;
72 default: 69 default:
73 i = -1;
74 break; 70 break;
75 }; 71 };
76 restore_current(); 72 restore_current();
@@ -79,17 +75,21 @@ static int prom_nbputchar(char c)
79} 75}
80 76
81/* Blocking version of get character routine above. */ 77/* Blocking version of get character routine above. */
82char 78void prom_getchar(char *buf)
83prom_getchar(void)
84{ 79{
85 int character; 80 while (1) {
86 while((character = prom_nbgetchar()) == -1) ; 81 int err = prom_nbgetchar(buf);
87 return (char) character; 82 if (!err)
83 break;
84 }
88} 85}
89 86
90/* Blocking version of put character routine above. */ 87/* Blocking version of put character routine above. */
91void 88void prom_putchar(const char *buf)
92prom_putchar(char c)
93{ 89{
94 while(prom_nbputchar(c) == -1) ; 90 while (1) {
91 int err = prom_nbputchar(buf);
92 if (!err)
93 break;
94 }
95} 95}