diff options
Diffstat (limited to 'arch/mips/dec')
-rw-r--r-- | arch/mips/dec/prom/console.c | 32 | ||||
-rw-r--r-- | arch/mips/dec/prom/init.c | 5 | ||||
-rw-r--r-- | arch/mips/dec/reset.c | 10 |
3 files changed, 35 insertions, 12 deletions
diff --git a/arch/mips/dec/prom/console.c b/arch/mips/dec/prom/console.c index 65419bf32441..078e1a12421d 100644 --- a/arch/mips/dec/prom/console.c +++ b/arch/mips/dec/prom/console.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * DECstation PROM-based early console support. | 4 | * DECstation PROM-based early console support. |
5 | * | 5 | * |
6 | * Copyright (C) 2004 Maciej W. Rozycki | 6 | * Copyright (C) 2004, 2007 Maciej W. Rozycki |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or | 8 | * This program is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU General Public License | 9 | * modify it under the terms of the GNU General Public License |
@@ -13,15 +13,35 @@ | |||
13 | #include <linux/console.h> | 13 | #include <linux/console.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/string.h> | ||
16 | 17 | ||
17 | #include <asm/dec/prom.h> | 18 | #include <asm/dec/prom.h> |
18 | 19 | ||
19 | void prom_putchar(char c) | 20 | static void __init prom_console_write(struct console *con, const char *s, |
21 | unsigned int c) | ||
20 | { | 22 | { |
21 | char s[2]; | 23 | char buf[81]; |
24 | unsigned int chunk = sizeof(buf) - 1; | ||
22 | 25 | ||
23 | s[0] = c; | 26 | while (c > 0) { |
24 | s[1] = '\0'; | 27 | if (chunk > c) |
28 | chunk = c; | ||
29 | memcpy(buf, s, chunk); | ||
30 | buf[chunk] = '\0'; | ||
31 | prom_printf("%s", buf); | ||
32 | s += chunk; | ||
33 | c -= chunk; | ||
34 | } | ||
35 | } | ||
36 | |||
37 | static struct console promcons __initdata = { | ||
38 | .name = "prom", | ||
39 | .write = prom_console_write, | ||
40 | .flags = CON_BOOT | CON_PRINTBUFFER, | ||
41 | .index = -1, | ||
42 | }; | ||
25 | 43 | ||
26 | prom_printf( s); | 44 | void __init register_prom_console(void) |
45 | { | ||
46 | register_console(&promcons); | ||
27 | } | 47 | } |
diff --git a/arch/mips/dec/prom/init.c b/arch/mips/dec/prom/init.c index a217aafe59f6..808c182fd3fa 100644 --- a/arch/mips/dec/prom/init.c +++ b/arch/mips/dec/prom/init.c | |||
@@ -86,7 +86,7 @@ void __init which_prom(s32 magic, s32 *prom_vec) | |||
86 | 86 | ||
87 | void __init prom_init(void) | 87 | void __init prom_init(void) |
88 | { | 88 | { |
89 | extern void ATTRIB_NORET dec_machine_halt(void); | 89 | extern void dec_machine_halt(void); |
90 | static char cpu_msg[] __initdata = | 90 | static char cpu_msg[] __initdata = |
91 | "Sorry, this kernel is compiled for a wrong CPU type!\n"; | 91 | "Sorry, this kernel is compiled for a wrong CPU type!\n"; |
92 | s32 argc = fw_arg0; | 92 | s32 argc = fw_arg0; |
@@ -103,6 +103,9 @@ void __init prom_init(void) | |||
103 | if (prom_is_rex(magic)) | 103 | if (prom_is_rex(magic)) |
104 | rex_clear_cache(); | 104 | rex_clear_cache(); |
105 | 105 | ||
106 | /* Register the early console. */ | ||
107 | register_prom_console(); | ||
108 | |||
106 | /* Were we compiled with the right CPU option? */ | 109 | /* Were we compiled with the right CPU option? */ |
107 | #if defined(CONFIG_CPU_R3000) | 110 | #if defined(CONFIG_CPU_R3000) |
108 | if ((current_cpu_data.cputype == CPU_R4000SC) || | 111 | if ((current_cpu_data.cputype == CPU_R4000SC) || |
diff --git a/arch/mips/dec/reset.c b/arch/mips/dec/reset.c index 56397227adb0..c15a879046e5 100644 --- a/arch/mips/dec/reset.c +++ b/arch/mips/dec/reset.c | |||
@@ -9,26 +9,26 @@ | |||
9 | 9 | ||
10 | #include <asm/addrspace.h> | 10 | #include <asm/addrspace.h> |
11 | 11 | ||
12 | typedef void ATTRIB_NORET (* noret_func_t)(void); | 12 | typedef void __noreturn (* noret_func_t)(void); |
13 | 13 | ||
14 | static inline void ATTRIB_NORET back_to_prom(void) | 14 | static inline void __noreturn back_to_prom(void) |
15 | { | 15 | { |
16 | noret_func_t func = (void *)CKSEG1ADDR(0x1fc00000); | 16 | noret_func_t func = (void *)CKSEG1ADDR(0x1fc00000); |
17 | 17 | ||
18 | func(); | 18 | func(); |
19 | } | 19 | } |
20 | 20 | ||
21 | void ATTRIB_NORET dec_machine_restart(char *command) | 21 | void __noreturn dec_machine_restart(char *command) |
22 | { | 22 | { |
23 | back_to_prom(); | 23 | back_to_prom(); |
24 | } | 24 | } |
25 | 25 | ||
26 | void ATTRIB_NORET dec_machine_halt(void) | 26 | void __noreturn dec_machine_halt(void) |
27 | { | 27 | { |
28 | back_to_prom(); | 28 | back_to_prom(); |
29 | } | 29 | } |
30 | 30 | ||
31 | void ATTRIB_NORET dec_machine_power_off(void) | 31 | void __noreturn dec_machine_power_off(void) |
32 | { | 32 | { |
33 | /* DECstations don't have a software power switch */ | 33 | /* DECstations don't have a software power switch */ |
34 | back_to_prom(); | 34 | back_to_prom(); |