0001
0002 #include <linux/init.h>
0003 #include <linux/errno.h>
0004 #include <linux/console.h>
0005
0006 #include <asm/sibyte/board.h>
0007
0008 #include <asm/fw/cfe/cfe_api.h>
0009 #include <asm/fw/cfe/cfe_error.h>
0010
0011 extern int cfe_cons_handle;
0012
0013 static void cfe_console_write(struct console *cons, const char *str,
0014 unsigned int count)
0015 {
0016 int i, last, written;
0017
0018 for (i=0, last=0; i<count; i++) {
0019 if (!str[i])
0020
0021 return;
0022 if (str[i] == '\n') {
0023 do {
0024 written = cfe_write(cfe_cons_handle, &str[last], i-last);
0025 if (written < 0)
0026 ;
0027 last += written;
0028 } while (last < i);
0029 while (cfe_write(cfe_cons_handle, "\r", 1) <= 0)
0030 ;
0031 }
0032 }
0033 if (last != count) {
0034 do {
0035 written = cfe_write(cfe_cons_handle, &str[last], count-last);
0036 if (written < 0)
0037 ;
0038 last += written;
0039 } while (last < count);
0040 }
0041
0042 }
0043
0044 static int cfe_console_setup(struct console *cons, char *str)
0045 {
0046 char consdev[32];
0047
0048
0049 if (cfe_getenv("BOOT_CONSOLE", consdev, 32) >= 0) {
0050 #ifdef CONFIG_SERIAL_SB1250_DUART
0051 if (!strcmp(consdev, "uart0")) {
0052 setleds("u0cn");
0053 } else if (!strcmp(consdev, "uart1")) {
0054 setleds("u1cn");
0055 } else
0056 #endif
0057 #ifdef CONFIG_VGA_CONSOLE
0058 if (!strcmp(consdev, "pcconsole0")) {
0059 setleds("pccn");
0060 } else
0061 #endif
0062 return -ENODEV;
0063 }
0064 return 0;
0065 }
0066
0067 static struct console sb1250_cfe_cons = {
0068 .name = "cfe",
0069 .write = cfe_console_write,
0070 .setup = cfe_console_setup,
0071 .flags = CON_PRINTBUFFER,
0072 .index = -1,
0073 };
0074
0075 static int __init sb1250_cfe_console_init(void)
0076 {
0077 register_console(&sb1250_cfe_cons);
0078 return 0;
0079 }
0080
0081 console_initcall(sb1250_cfe_console_init);