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