Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #include <linux/init.h> |
2 | #include <linux/errno.h> | |
3 | #include <linux/console.h> | |
4 | ||
5 | #include <asm/sibyte/board.h> | |
6 | ||
df78b5c8 AJ |
7 | #include <asm/fw/cfe/cfe_api.h> |
8 | #include <asm/fw/cfe/cfe_error.h> | |
1da177e4 LT |
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 | ||
21a151d8 | 17 | for (i=0, last=0; i<count; i++) { |
1da177e4 LT |
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 | } | |
42a3b4f2 | 40 | |
1da177e4 LT |
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) { | |
477f949e | 49 | #ifdef CONFIG_SERIAL_SB1250_DUART |
1da177e4 LT |
50 | if (!strcmp(consdev, "uart0")) { |
51 | setleds("u0cn"); | |
52 | } else if (!strcmp(consdev, "uart1")) { | |
53 | setleds("u1cn"); | |
54 | #endif | |
55 | #ifdef CONFIG_VGA_CONSOLE | |
56 | } else if (!strcmp(consdev, "pcconsole0")) { | |
57 | setleds("pccn"); | |
58 | #endif | |
59 | } else | |
60 | return -ENODEV; | |
61 | } | |
62 | return 0; | |
63 | } | |
64 | ||
65 | static struct console sb1250_cfe_cons = { | |
66 | .name = "cfe", | |
67 | .write = cfe_console_write, | |
68 | .setup = cfe_console_setup, | |
69 | .flags = CON_PRINTBUFFER, | |
70 | .index = -1, | |
71 | }; | |
72 | ||
73 | static int __init sb1250_cfe_console_init(void) | |
74 | { | |
75 | register_console(&sb1250_cfe_cons); | |
76 | return 0; | |
77 | } | |
78 | ||
79 | console_initcall(sb1250_cfe_console_init); |