console_32.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * console.c: Routines that deal with sending and receiving IO
  3. * to/from the current console device using the PROM.
  4. *
  5. * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  6. * Copyright (C) 1998 Pete Zaitcev <zaitcev@yahoo.com>
  7. */
  8. #include <linux/types.h>
  9. #include <linux/kernel.h>
  10. #include <linux/sched.h>
  11. #include <asm/openprom.h>
  12. #include <asm/oplib.h>
  13. #include <asm/system.h>
  14. #include <linux/string.h>
  15. extern void restore_current(void);
  16. /* Non blocking get character from console input device, returns -1
  17. * if no input was taken. This can be used for polling.
  18. */
  19. static int prom_nbgetchar(void)
  20. {
  21. static char inc;
  22. int i = -1;
  23. unsigned long flags;
  24. spin_lock_irqsave(&prom_lock, flags);
  25. switch(prom_vers) {
  26. case PROM_V0:
  27. i = (*(romvec->pv_nbgetchar))();
  28. break;
  29. case PROM_V2:
  30. case PROM_V3:
  31. if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) {
  32. i = inc;
  33. } else {
  34. i = -1;
  35. }
  36. break;
  37. default:
  38. i = -1;
  39. break;
  40. };
  41. restore_current();
  42. spin_unlock_irqrestore(&prom_lock, flags);
  43. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  44. }
  45. /* Non blocking put character to console device, returns -1 if
  46. * unsuccessful.
  47. */
  48. static int prom_nbputchar(char c)
  49. {
  50. static char outc;
  51. unsigned long flags;
  52. int i = -1;
  53. spin_lock_irqsave(&prom_lock, flags);
  54. switch(prom_vers) {
  55. case PROM_V0:
  56. i = (*(romvec->pv_nbputchar))(c);
  57. break;
  58. case PROM_V2:
  59. case PROM_V3:
  60. outc = c;
  61. if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1)
  62. i = 0;
  63. else
  64. i = -1;
  65. break;
  66. default:
  67. i = -1;
  68. break;
  69. };
  70. restore_current();
  71. spin_unlock_irqrestore(&prom_lock, flags);
  72. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  73. }
  74. /* Blocking version of get character routine above. */
  75. char
  76. prom_getchar(void)
  77. {
  78. int character;
  79. while((character = prom_nbgetchar()) == -1) ;
  80. return (char) character;
  81. }
  82. /* Blocking version of put character routine above. */
  83. void
  84. prom_putchar(char c)
  85. {
  86. while(prom_nbputchar(c) == -1) ;
  87. }