aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/prom
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc/prom')
-rw-r--r--arch/sparc/prom/console_32.c50
-rw-r--r--arch/sparc/prom/console_64.c34
-rw-r--r--arch/sparc/prom/printf.c15
3 files changed, 50 insertions, 49 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}
diff --git a/arch/sparc/prom/console_64.c b/arch/sparc/prom/console_64.c
index 33a8b275d6af..a9a575433ce9 100644
--- a/arch/sparc/prom/console_64.c
+++ b/arch/sparc/prom/console_64.c
@@ -18,41 +18,37 @@ extern int prom_stdin, prom_stdout;
18/* Non blocking get character from console input device, returns -1 18/* Non blocking get character from console input device, returns -1
19 * if no input was taken. This can be used for polling. 19 * if no input was taken. This can be used for polling.
20 */ 20 */
21static int prom_nbgetchar(void) 21static int prom_nbgetchar(char *buf)
22{ 22{
23 unsigned long args[7]; 23 unsigned long args[7];
24 char inc;
25 24
26 args[0] = (unsigned long) "read"; 25 args[0] = (unsigned long) "read";
27 args[1] = 3; 26 args[1] = 3;
28 args[2] = 1; 27 args[2] = 1;
29 args[3] = (unsigned int) prom_stdin; 28 args[3] = (unsigned int) prom_stdin;
30 args[4] = (unsigned long) &inc; 29 args[4] = (unsigned long) buf;
31 args[5] = 1; 30 args[5] = 1;
32 args[6] = (unsigned long) -1; 31 args[6] = (unsigned long) -1;
33 32
34 p1275_cmd_direct(args); 33 p1275_cmd_direct(args);
35 34
36 if (args[6] == 1) 35 if (args[6] == 1)
37 return inc; 36 return 0;
38 return -1; 37 return -1;
39} 38}
40 39
41/* Non blocking put character to console device, returns -1 if 40/* Non blocking put character to console device, returns -1 if
42 * unsuccessful. 41 * unsuccessful.
43 */ 42 */
44static int prom_nbputchar(char c) 43static int prom_nbputchar(const char *buf)
45{ 44{
46 unsigned long args[7]; 45 unsigned long args[7];
47 char outc;
48
49 outc = c;
50 46
51 args[0] = (unsigned long) "write"; 47 args[0] = (unsigned long) "write";
52 args[1] = 3; 48 args[1] = 3;
53 args[2] = 1; 49 args[2] = 1;
54 args[3] = (unsigned int) prom_stdout; 50 args[3] = (unsigned int) prom_stdout;
55 args[4] = (unsigned long) &outc; 51 args[4] = (unsigned long) buf;
56 args[5] = 1; 52 args[5] = 1;
57 args[6] = (unsigned long) -1; 53 args[6] = (unsigned long) -1;
58 54
@@ -65,17 +61,21 @@ static int prom_nbputchar(char c)
65} 61}
66 62
67/* Blocking version of get character routine above. */ 63/* Blocking version of get character routine above. */
68char 64void prom_getchar(char *buf)
69prom_getchar(void)
70{ 65{
71 int character; 66 while (1) {
72 while((character = prom_nbgetchar()) == -1) ; 67 int err = prom_nbgetchar(buf);
73 return (char) character; 68 if (!err)
69 break;
70 }
74} 71}
75 72
76/* Blocking version of put character routine above. */ 73/* Blocking version of put character routine above. */
77void 74void prom_putchar(const char *buf)
78prom_putchar(char c)
79{ 75{
80 prom_nbputchar(c); 76 while (1) {
77 int err = prom_nbputchar(buf);
78 if (!err)
79 break;
80 }
81} 81}
diff --git a/arch/sparc/prom/printf.c b/arch/sparc/prom/printf.c
index ca869266b9f3..24031971f806 100644
--- a/arch/sparc/prom/printf.c
+++ b/arch/sparc/prom/printf.c
@@ -23,13 +23,14 @@ static char ppbuf[1024];
23 23
24void notrace prom_write(const char *buf, unsigned int n) 24void notrace prom_write(const char *buf, unsigned int n)
25{ 25{
26 char ch; 26 while (n-- != 0) {
27 27 char ch = *buf;
28 while (n != 0) { 28 if (ch == '\n') {
29 --n; 29 char tmp = '\r';
30 if ((ch = *buf++) == '\n') 30 prom_putchar(&tmp);
31 prom_putchar('\r'); 31 }
32 prom_putchar(ch); 32 prom_putchar(buf);
33 buf++;
33 } 34 }
34} 35}
35 36