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