console_32.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. int
  20. prom_nbgetchar(void)
  21. {
  22. static char inc;
  23. int i = -1;
  24. unsigned long flags;
  25. spin_lock_irqsave(&prom_lock, flags);
  26. switch(prom_vers) {
  27. case PROM_V0:
  28. i = (*(romvec->pv_nbgetchar))();
  29. break;
  30. case PROM_V2:
  31. case PROM_V3:
  32. if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) {
  33. i = inc;
  34. } else {
  35. i = -1;
  36. }
  37. break;
  38. default:
  39. i = -1;
  40. break;
  41. };
  42. restore_current();
  43. spin_unlock_irqrestore(&prom_lock, flags);
  44. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  45. }
  46. /* Non blocking put character to console device, returns -1 if
  47. * unsuccessful.
  48. */
  49. int
  50. prom_nbputchar(char c)
  51. {
  52. static char outc;
  53. unsigned long flags;
  54. int i = -1;
  55. spin_lock_irqsave(&prom_lock, flags);
  56. switch(prom_vers) {
  57. case PROM_V0:
  58. i = (*(romvec->pv_nbputchar))(c);
  59. break;
  60. case PROM_V2:
  61. case PROM_V3:
  62. outc = c;
  63. if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1)
  64. i = 0;
  65. else
  66. i = -1;
  67. break;
  68. default:
  69. i = -1;
  70. break;
  71. };
  72. restore_current();
  73. spin_unlock_irqrestore(&prom_lock, flags);
  74. return i; /* Ugh, we could spin forever on unsupported proms ;( */
  75. }
  76. /* Blocking version of get character routine above. */
  77. char
  78. prom_getchar(void)
  79. {
  80. int character;
  81. while((character = prom_nbgetchar()) == -1) ;
  82. return (char) character;
  83. }
  84. /* Blocking version of put character routine above. */
  85. void
  86. prom_putchar(char c)
  87. {
  88. while(prom_nbputchar(c) == -1) ;
  89. return;
  90. }