console.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <linux/init.h>
  2. #include <linux/errno.h>
  3. #include <linux/console.h>
  4. #include <asm/sibyte/board.h>
  5. #include <asm/fw/cfe/cfe_api.h>
  6. #include <asm/fw/cfe/cfe_error.h>
  7. extern int cfe_cons_handle;
  8. static void cfe_console_write(struct console *cons, const char *str,
  9. unsigned int count)
  10. {
  11. int i, last, written;
  12. for (i=0, last=0; i<count; i++) {
  13. if (!str[i])
  14. /* XXXKW can/should this ever happen? */
  15. return;
  16. if (str[i] == '\n') {
  17. do {
  18. written = cfe_write(cfe_cons_handle, &str[last], i-last);
  19. if (written < 0)
  20. ;
  21. last += written;
  22. } while (last < i);
  23. while (cfe_write(cfe_cons_handle, "\r", 1) <= 0)
  24. ;
  25. }
  26. }
  27. if (last != count) {
  28. do {
  29. written = cfe_write(cfe_cons_handle, &str[last], count-last);
  30. if (written < 0)
  31. ;
  32. last += written;
  33. } while (last < count);
  34. }
  35. }
  36. static int cfe_console_setup(struct console *cons, char *str)
  37. {
  38. char consdev[32];
  39. /* XXXKW think about interaction with 'console=' cmdline arg */
  40. /* If none of the console options are configured, the build will break. */
  41. if (cfe_getenv("BOOT_CONSOLE", consdev, 32) >= 0) {
  42. #ifdef CONFIG_SERIAL_SB1250_DUART
  43. if (!strcmp(consdev, "uart0")) {
  44. setleds("u0cn");
  45. } else if (!strcmp(consdev, "uart1")) {
  46. setleds("u1cn");
  47. #endif
  48. #ifdef CONFIG_VGA_CONSOLE
  49. } else if (!strcmp(consdev, "pcconsole0")) {
  50. setleds("pccn");
  51. #endif
  52. } else
  53. return -ENODEV;
  54. }
  55. return 0;
  56. }
  57. static struct console sb1250_cfe_cons = {
  58. .name = "cfe",
  59. .write = cfe_console_write,
  60. .setup = cfe_console_setup,
  61. .flags = CON_PRINTBUFFER,
  62. .index = -1,
  63. };
  64. static int __init sb1250_cfe_console_init(void)
  65. {
  66. register_console(&sb1250_cfe_cons);
  67. return 0;
  68. }
  69. console_initcall(sb1250_cfe_console_init);