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 put character to console device, returns -1 if 20708d4f09SSam Ravnborg * unsuccessful. 21708d4f09SSam Ravnborg */ 22e62cac1fSDavid S. Miller static int prom_nbputchar(const char *buf) 23708d4f09SSam Ravnborg { 24708d4f09SSam Ravnborg unsigned long flags; 25708d4f09SSam Ravnborg int i = -1; 26708d4f09SSam Ravnborg 27708d4f09SSam Ravnborg spin_lock_irqsave(&prom_lock, flags); 28708d4f09SSam Ravnborg switch(prom_vers) { 29708d4f09SSam Ravnborg case PROM_V0: 30e62cac1fSDavid S. Miller i = (*(romvec->pv_nbputchar))(*buf); 31708d4f09SSam Ravnborg break; 32708d4f09SSam Ravnborg case PROM_V2: 33708d4f09SSam Ravnborg case PROM_V3: 34e62cac1fSDavid S. Miller if ((*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, 35e62cac1fSDavid S. Miller buf, 0x1) == 1) 36708d4f09SSam Ravnborg i = 0; 37708d4f09SSam Ravnborg break; 38708d4f09SSam Ravnborg default: 39708d4f09SSam Ravnborg break; 40708d4f09SSam Ravnborg }; 41708d4f09SSam Ravnborg restore_current(); 42708d4f09SSam Ravnborg spin_unlock_irqrestore(&prom_lock, flags); 43708d4f09SSam Ravnborg return i; /* Ugh, we could spin forever on unsupported proms ;( */ 44708d4f09SSam Ravnborg } 45708d4f09SSam Ravnborg 46595a251cSDavid S. Miller void prom_console_write_buf(const char *buf, int len) 47708d4f09SSam Ravnborg { 48595a251cSDavid S. Miller while (len) { 49595a251cSDavid S. Miller int n = prom_nbputchar(buf); 50595a251cSDavid S. Miller if (n) 51595a251cSDavid S. Miller continue; 52595a251cSDavid S. Miller len--; 53595a251cSDavid S. Miller buf++; 54e62cac1fSDavid S. Miller } 55708d4f09SSam Ravnborg } 56595a251cSDavid S. Miller 57