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