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