xref: /openbmc/linux/arch/sparc/prom/console_64.c (revision e62cac1f)
15de18cdeSSam Ravnborg /* console.c: Routines that deal with sending and receiving IO
25de18cdeSSam Ravnborg  *            to/from the current console device using the PROM.
35de18cdeSSam Ravnborg  *
45de18cdeSSam Ravnborg  * Copyright (C) 1995 David S. Miller (davem@davemloft.net)
55de18cdeSSam Ravnborg  * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
65de18cdeSSam Ravnborg  */
75de18cdeSSam Ravnborg 
85de18cdeSSam Ravnborg #include <linux/types.h>
95de18cdeSSam Ravnborg #include <linux/kernel.h>
105de18cdeSSam Ravnborg #include <linux/sched.h>
115de18cdeSSam Ravnborg #include <asm/openprom.h>
125de18cdeSSam Ravnborg #include <asm/oplib.h>
135de18cdeSSam Ravnborg #include <asm/system.h>
145de18cdeSSam Ravnborg #include <linux/string.h>
155de18cdeSSam Ravnborg 
165de18cdeSSam Ravnborg extern int prom_stdin, prom_stdout;
175de18cdeSSam Ravnborg 
185de18cdeSSam Ravnborg /* Non blocking get character from console input device, returns -1
195de18cdeSSam Ravnborg  * if no input was taken.  This can be used for polling.
205de18cdeSSam Ravnborg  */
21e62cac1fSDavid S. Miller static int prom_nbgetchar(char *buf)
225de18cdeSSam Ravnborg {
2325edd694SDavid S. Miller 	unsigned long args[7];
245de18cdeSSam Ravnborg 
2525edd694SDavid S. Miller 	args[0] = (unsigned long) "read";
2625edd694SDavid S. Miller 	args[1] = 3;
2725edd694SDavid S. Miller 	args[2] = 1;
2825edd694SDavid S. Miller 	args[3] = (unsigned int) prom_stdin;
29e62cac1fSDavid S. Miller 	args[4] = (unsigned long) buf;
3025edd694SDavid S. Miller 	args[5] = 1;
3125edd694SDavid S. Miller 	args[6] = (unsigned long) -1;
3225edd694SDavid S. Miller 
3325edd694SDavid S. Miller 	p1275_cmd_direct(args);
3425edd694SDavid S. Miller 
3525edd694SDavid S. Miller 	if (args[6] == 1)
36e62cac1fSDavid S. Miller 		return 0;
375de18cdeSSam Ravnborg 	return -1;
385de18cdeSSam Ravnborg }
395de18cdeSSam Ravnborg 
405de18cdeSSam Ravnborg /* Non blocking put character to console device, returns -1 if
415de18cdeSSam Ravnborg  * unsuccessful.
425de18cdeSSam Ravnborg  */
43e62cac1fSDavid S. Miller static int prom_nbputchar(const char *buf)
445de18cdeSSam Ravnborg {
4525edd694SDavid S. Miller 	unsigned long args[7];
4625edd694SDavid S. Miller 
4725edd694SDavid S. Miller 	args[0] = (unsigned long) "write";
4825edd694SDavid S. Miller 	args[1] = 3;
4925edd694SDavid S. Miller 	args[2] = 1;
5025edd694SDavid S. Miller 	args[3] = (unsigned int) prom_stdout;
51e62cac1fSDavid S. Miller 	args[4] = (unsigned long) buf;
5225edd694SDavid S. Miller 	args[5] = 1;
5325edd694SDavid S. Miller 	args[6] = (unsigned long) -1;
5425edd694SDavid S. Miller 
5525edd694SDavid S. Miller 	p1275_cmd_direct(args);
5625edd694SDavid S. Miller 
5725edd694SDavid S. Miller 	if (args[6] == 1)
585de18cdeSSam Ravnborg 		return 0;
595de18cdeSSam Ravnborg 	else
605de18cdeSSam Ravnborg 		return -1;
615de18cdeSSam Ravnborg }
625de18cdeSSam Ravnborg 
635de18cdeSSam Ravnborg /* Blocking version of get character routine above. */
64e62cac1fSDavid S. Miller void prom_getchar(char *buf)
655de18cdeSSam Ravnborg {
66e62cac1fSDavid S. Miller 	while (1) {
67e62cac1fSDavid S. Miller 		int err = prom_nbgetchar(buf);
68e62cac1fSDavid S. Miller 		if (!err)
69e62cac1fSDavid S. Miller 			break;
70e62cac1fSDavid S. Miller 	}
715de18cdeSSam Ravnborg }
725de18cdeSSam Ravnborg 
735de18cdeSSam Ravnborg /* Blocking version of put character routine above. */
74e62cac1fSDavid S. Miller void prom_putchar(const char *buf)
755de18cdeSSam Ravnborg {
76e62cac1fSDavid S. Miller 	while (1) {
77e62cac1fSDavid S. Miller 		int err = prom_nbputchar(buf);
78e62cac1fSDavid S. Miller 		if (!err)
79e62cac1fSDavid S. Miller 			break;
80e62cac1fSDavid S. Miller 	}
815de18cdeSSam Ravnborg }
82