diff options
30 files changed, 309 insertions, 237 deletions
diff --git a/arch/mips/alchemy/board-gpr.c b/arch/mips/alchemy/board-gpr.c index cb0f6afb7389..9edc35ff8cf1 100644 --- a/arch/mips/alchemy/board-gpr.c +++ b/arch/mips/alchemy/board-gpr.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/i2c.h> | 31 | #include <linux/i2c.h> |
32 | #include <linux/i2c-gpio.h> | 32 | #include <linux/i2c-gpio.h> |
33 | #include <asm/bootinfo.h> | 33 | #include <asm/bootinfo.h> |
34 | #include <asm/idle.h> | ||
34 | #include <asm/reboot.h> | 35 | #include <asm/reboot.h> |
35 | #include <asm/mach-au1x00/au1000.h> | 36 | #include <asm/mach-au1x00/au1000.h> |
36 | #include <prom.h> | 37 | #include <prom.h> |
diff --git a/arch/mips/alchemy/common/time.c b/arch/mips/alchemy/common/time.c index 38afb11ba2c4..93fa586d52e2 100644 --- a/arch/mips/alchemy/common/time.c +++ b/arch/mips/alchemy/common/time.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/interrupt.h> | 36 | #include <linux/interrupt.h> |
37 | #include <linux/spinlock.h> | 37 | #include <linux/spinlock.h> |
38 | 38 | ||
39 | #include <asm/idle.h> | ||
39 | #include <asm/processor.h> | 40 | #include <asm/processor.h> |
40 | #include <asm/time.h> | 41 | #include <asm/time.h> |
41 | #include <asm/mach-au1x00/au1000.h> | 42 | #include <asm/mach-au1x00/au1000.h> |
diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c index a0233a2c1988..8be4e856b8b8 100644 --- a/arch/mips/ath79/setup.c +++ b/arch/mips/ath79/setup.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/clk.h> | 19 | #include <linux/clk.h> |
20 | 20 | ||
21 | #include <asm/bootinfo.h> | 21 | #include <asm/bootinfo.h> |
22 | #include <asm/idle.h> | ||
22 | #include <asm/time.h> /* for mips_hpt_frequency */ | 23 | #include <asm/time.h> /* for mips_hpt_frequency */ |
23 | #include <asm/reboot.h> /* for _machine_{restart,halt} */ | 24 | #include <asm/reboot.h> /* for _machine_{restart,halt} */ |
24 | #include <asm/mips_machine.h> | 25 | #include <asm/mips_machine.h> |
diff --git a/arch/mips/cobalt/reset.c b/arch/mips/cobalt/reset.c index 516b4428df4e..4eedd481dd00 100644 --- a/arch/mips/cobalt/reset.c +++ b/arch/mips/cobalt/reset.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/io.h> | 12 | #include <linux/io.h> |
13 | #include <linux/leds.h> | 13 | #include <linux/leds.h> |
14 | 14 | ||
15 | #include <asm/idle.h> | ||
15 | #include <asm/processor.h> | 16 | #include <asm/processor.h> |
16 | 17 | ||
17 | #include <cobalt.h> | 18 | #include <cobalt.h> |
diff --git a/arch/mips/include/asm/clock.h b/arch/mips/include/asm/clock.h index c9456e7a7283..778e32d817bc 100644 --- a/arch/mips/include/asm/clock.h +++ b/arch/mips/include/asm/clock.h | |||
@@ -6,8 +6,6 @@ | |||
6 | #include <linux/seq_file.h> | 6 | #include <linux/seq_file.h> |
7 | #include <linux/clk.h> | 7 | #include <linux/clk.h> |
8 | 8 | ||
9 | extern void (*cpu_wait) (void); | ||
10 | |||
11 | struct clk; | 9 | struct clk; |
12 | 10 | ||
13 | struct clk_ops { | 11 | struct clk_ops { |
diff --git a/arch/mips/include/asm/idle.h b/arch/mips/include/asm/idle.h new file mode 100644 index 000000000000..d192158886b1 --- /dev/null +++ b/arch/mips/include/asm/idle.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef __ASM_IDLE_H | ||
2 | #define __ASM_IDLE_H | ||
3 | |||
4 | #include <linux/linkage.h> | ||
5 | |||
6 | extern void (*cpu_wait)(void); | ||
7 | extern void r4k_wait(void); | ||
8 | extern asmlinkage void __r4k_wait(void); | ||
9 | extern void r4k_wait_irqoff(void); | ||
10 | extern void __pastwait(void); | ||
11 | |||
12 | static inline int using_rollback_handler(void) | ||
13 | { | ||
14 | return cpu_wait == r4k_wait; | ||
15 | } | ||
16 | |||
17 | static inline int address_is_in_r4k_wait_irqoff(unsigned long addr) | ||
18 | { | ||
19 | return addr >= (unsigned long)r4k_wait_irqoff && | ||
20 | addr < (unsigned long)__pastwait; | ||
21 | } | ||
22 | |||
23 | #endif /* __ASM_IDLE_H */ | ||
diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h index ec1ca537fbc1..f59552fae917 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h | |||
@@ -171,14 +171,13 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
171 | 171 | ||
172 | #ifdef CONFIG_FLATMEM | 172 | #ifdef CONFIG_FLATMEM |
173 | 173 | ||
174 | #define pfn_valid(pfn) \ | 174 | static inline int pfn_valid(unsigned long pfn) |
175 | ({ \ | 175 | { |
176 | unsigned long __pfn = (pfn); \ | 176 | /* avoid <linux/mm.h> include hell */ |
177 | /* avoid <linux/bootmem.h> include hell */ \ | 177 | extern unsigned long max_mapnr; |
178 | extern unsigned long min_low_pfn; \ | 178 | |
179 | \ | 179 | return pfn >= ARCH_PFN_OFFSET && pfn < max_mapnr; |
180 | __pfn >= min_low_pfn && __pfn < max_mapnr; \ | 180 | } |
181 | }) | ||
182 | 181 | ||
183 | #elif defined(CONFIG_SPARSEMEM) | 182 | #elif defined(CONFIG_SPARSEMEM) |
184 | 183 | ||
diff --git a/arch/mips/include/asm/processor.h b/arch/mips/include/asm/processor.h index 71686c897dea..1470b7b68b0e 100644 --- a/arch/mips/include/asm/processor.h +++ b/arch/mips/include/asm/processor.h | |||
@@ -28,7 +28,6 @@ | |||
28 | /* | 28 | /* |
29 | * System setup and hardware flags.. | 29 | * System setup and hardware flags.. |
30 | */ | 30 | */ |
31 | extern void (*cpu_wait)(void); | ||
32 | 31 | ||
33 | extern unsigned int vced_count, vcei_count; | 32 | extern unsigned int vced_count, vcei_count; |
34 | 33 | ||
diff --git a/arch/mips/include/uapi/asm/unistd.h b/arch/mips/include/uapi/asm/unistd.h index 16338b84fa79..1dee279f9665 100644 --- a/arch/mips/include/uapi/asm/unistd.h +++ b/arch/mips/include/uapi/asm/unistd.h | |||
@@ -694,16 +694,17 @@ | |||
694 | #define __NR_process_vm_writev (__NR_Linux + 305) | 694 | #define __NR_process_vm_writev (__NR_Linux + 305) |
695 | #define __NR_kcmp (__NR_Linux + 306) | 695 | #define __NR_kcmp (__NR_Linux + 306) |
696 | #define __NR_finit_module (__NR_Linux + 307) | 696 | #define __NR_finit_module (__NR_Linux + 307) |
697 | #define __NR_getdents64 (__NR_Linux + 308) | ||
697 | 698 | ||
698 | /* | 699 | /* |
699 | * Offset of the last Linux 64-bit flavoured syscall | 700 | * Offset of the last Linux 64-bit flavoured syscall |
700 | */ | 701 | */ |
701 | #define __NR_Linux_syscalls 307 | 702 | #define __NR_Linux_syscalls 308 |
702 | 703 | ||
703 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | 704 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ |
704 | 705 | ||
705 | #define __NR_64_Linux 5000 | 706 | #define __NR_64_Linux 5000 |
706 | #define __NR_64_Linux_syscalls 307 | 707 | #define __NR_64_Linux_syscalls 308 |
707 | 708 | ||
708 | #if _MIPS_SIM == _MIPS_SIM_NABI32 | 709 | #if _MIPS_SIM == _MIPS_SIM_NABI32 |
709 | 710 | ||
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index 6ad9e04bdf62..423d871a946b 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | extra-y := head.o vmlinux.lds | 5 | extra-y := head.o vmlinux.lds |
6 | 6 | ||
7 | obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ | 7 | obj-y += cpu-probe.o branch.o entry.o genex.o idle.o irq.o process.o \ |
8 | prom.o ptrace.o reset.o setup.o signal.o syscall.o \ | 8 | prom.o ptrace.o reset.o setup.o signal.o syscall.o \ |
9 | time.o topology.o traps.o unaligned.o watch.o vdso.o | 9 | time.o topology.o traps.o unaligned.o watch.o vdso.o |
10 | 10 | ||
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 4bbffdb9024f..c6568bf4b1b0 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
@@ -27,105 +27,6 @@ | |||
27 | #include <asm/spram.h> | 27 | #include <asm/spram.h> |
28 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
29 | 29 | ||
30 | /* | ||
31 | * Not all of the MIPS CPUs have the "wait" instruction available. Moreover, | ||
32 | * the implementation of the "wait" feature differs between CPU families. This | ||
33 | * points to the function that implements CPU specific wait. | ||
34 | * The wait instruction stops the pipeline and reduces the power consumption of | ||
35 | * the CPU very much. | ||
36 | */ | ||
37 | void (*cpu_wait)(void); | ||
38 | EXPORT_SYMBOL(cpu_wait); | ||
39 | |||
40 | static void r3081_wait(void) | ||
41 | { | ||
42 | unsigned long cfg = read_c0_conf(); | ||
43 | write_c0_conf(cfg | R30XX_CONF_HALT); | ||
44 | } | ||
45 | |||
46 | static void r39xx_wait(void) | ||
47 | { | ||
48 | local_irq_disable(); | ||
49 | if (!need_resched()) | ||
50 | write_c0_conf(read_c0_conf() | TX39_CONF_HALT); | ||
51 | local_irq_enable(); | ||
52 | } | ||
53 | |||
54 | extern void r4k_wait(void); | ||
55 | |||
56 | /* | ||
57 | * This variant is preferable as it allows testing need_resched and going to | ||
58 | * sleep depending on the outcome atomically. Unfortunately the "It is | ||
59 | * implementation-dependent whether the pipeline restarts when a non-enabled | ||
60 | * interrupt is requested" restriction in the MIPS32/MIPS64 architecture makes | ||
61 | * using this version a gamble. | ||
62 | */ | ||
63 | void r4k_wait_irqoff(void) | ||
64 | { | ||
65 | local_irq_disable(); | ||
66 | if (!need_resched()) | ||
67 | __asm__(" .set push \n" | ||
68 | " .set mips3 \n" | ||
69 | " wait \n" | ||
70 | " .set pop \n"); | ||
71 | local_irq_enable(); | ||
72 | __asm__(" .globl __pastwait \n" | ||
73 | "__pastwait: \n"); | ||
74 | } | ||
75 | |||
76 | /* | ||
77 | * The RM7000 variant has to handle erratum 38. The workaround is to not | ||
78 | * have any pending stores when the WAIT instruction is executed. | ||
79 | */ | ||
80 | static void rm7k_wait_irqoff(void) | ||
81 | { | ||
82 | local_irq_disable(); | ||
83 | if (!need_resched()) | ||
84 | __asm__( | ||
85 | " .set push \n" | ||
86 | " .set mips3 \n" | ||
87 | " .set noat \n" | ||
88 | " mfc0 $1, $12 \n" | ||
89 | " sync \n" | ||
90 | " mtc0 $1, $12 # stalls until W stage \n" | ||
91 | " wait \n" | ||
92 | " mtc0 $1, $12 # stalls until W stage \n" | ||
93 | " .set pop \n"); | ||
94 | local_irq_enable(); | ||
95 | } | ||
96 | |||
97 | /* | ||
98 | * The Au1xxx wait is available only if using 32khz counter or | ||
99 | * external timer source, but specifically not CP0 Counter. | ||
100 | * alchemy/common/time.c may override cpu_wait! | ||
101 | */ | ||
102 | static void au1k_wait(void) | ||
103 | { | ||
104 | __asm__(" .set mips3 \n" | ||
105 | " cache 0x14, 0(%0) \n" | ||
106 | " cache 0x14, 32(%0) \n" | ||
107 | " sync \n" | ||
108 | " nop \n" | ||
109 | " wait \n" | ||
110 | " nop \n" | ||
111 | " nop \n" | ||
112 | " nop \n" | ||
113 | " nop \n" | ||
114 | " .set mips0 \n" | ||
115 | : : "r" (au1k_wait)); | ||
116 | } | ||
117 | |||
118 | static int __initdata nowait; | ||
119 | |||
120 | static int __init wait_disable(char *s) | ||
121 | { | ||
122 | nowait = 1; | ||
123 | |||
124 | return 1; | ||
125 | } | ||
126 | |||
127 | __setup("nowait", wait_disable); | ||
128 | |||
129 | static int __cpuinitdata mips_fpu_disabled; | 30 | static int __cpuinitdata mips_fpu_disabled; |
130 | 31 | ||
131 | static int __init fpu_disable(char *s) | 32 | static int __init fpu_disable(char *s) |
@@ -150,105 +51,6 @@ static int __init dsp_disable(char *s) | |||
150 | 51 | ||
151 | __setup("nodsp", dsp_disable); | 52 | __setup("nodsp", dsp_disable); |
152 | 53 | ||
153 | void __init check_wait(void) | ||
154 | { | ||
155 | struct cpuinfo_mips *c = ¤t_cpu_data; | ||
156 | |||
157 | if (nowait) { | ||
158 | printk("Wait instruction disabled.\n"); | ||
159 | return; | ||
160 | } | ||
161 | |||
162 | switch (c->cputype) { | ||
163 | case CPU_R3081: | ||
164 | case CPU_R3081E: | ||
165 | cpu_wait = r3081_wait; | ||
166 | break; | ||
167 | case CPU_TX3927: | ||
168 | cpu_wait = r39xx_wait; | ||
169 | break; | ||
170 | case CPU_R4200: | ||
171 | /* case CPU_R4300: */ | ||
172 | case CPU_R4600: | ||
173 | case CPU_R4640: | ||
174 | case CPU_R4650: | ||
175 | case CPU_R4700: | ||
176 | case CPU_R5000: | ||
177 | case CPU_R5500: | ||
178 | case CPU_NEVADA: | ||
179 | case CPU_4KC: | ||
180 | case CPU_4KEC: | ||
181 | case CPU_4KSC: | ||
182 | case CPU_5KC: | ||
183 | case CPU_25KF: | ||
184 | case CPU_PR4450: | ||
185 | case CPU_BMIPS3300: | ||
186 | case CPU_BMIPS4350: | ||
187 | case CPU_BMIPS4380: | ||
188 | case CPU_BMIPS5000: | ||
189 | case CPU_CAVIUM_OCTEON: | ||
190 | case CPU_CAVIUM_OCTEON_PLUS: | ||
191 | case CPU_CAVIUM_OCTEON2: | ||
192 | case CPU_JZRISC: | ||
193 | case CPU_LOONGSON1: | ||
194 | case CPU_XLR: | ||
195 | case CPU_XLP: | ||
196 | cpu_wait = r4k_wait; | ||
197 | break; | ||
198 | |||
199 | case CPU_RM7000: | ||
200 | cpu_wait = rm7k_wait_irqoff; | ||
201 | break; | ||
202 | |||
203 | case CPU_M14KC: | ||
204 | case CPU_M14KEC: | ||
205 | case CPU_24K: | ||
206 | case CPU_34K: | ||
207 | case CPU_1004K: | ||
208 | cpu_wait = r4k_wait; | ||
209 | if (read_c0_config7() & MIPS_CONF7_WII) | ||
210 | cpu_wait = r4k_wait_irqoff; | ||
211 | break; | ||
212 | |||
213 | case CPU_74K: | ||
214 | cpu_wait = r4k_wait; | ||
215 | if ((c->processor_id & 0xff) >= PRID_REV_ENCODE_332(2, 1, 0)) | ||
216 | cpu_wait = r4k_wait_irqoff; | ||
217 | break; | ||
218 | |||
219 | case CPU_TX49XX: | ||
220 | cpu_wait = r4k_wait_irqoff; | ||
221 | break; | ||
222 | case CPU_ALCHEMY: | ||
223 | cpu_wait = au1k_wait; | ||
224 | break; | ||
225 | case CPU_20KC: | ||
226 | /* | ||
227 | * WAIT on Rev1.0 has E1, E2, E3 and E16. | ||
228 | * WAIT on Rev2.0 and Rev3.0 has E16. | ||
229 | * Rev3.1 WAIT is nop, why bother | ||
230 | */ | ||
231 | if ((c->processor_id & 0xff) <= 0x64) | ||
232 | break; | ||
233 | |||
234 | /* | ||
235 | * Another rev is incremeting c0_count at a reduced clock | ||
236 | * rate while in WAIT mode. So we basically have the choice | ||
237 | * between using the cp0 timer as clocksource or avoiding | ||
238 | * the WAIT instruction. Until more details are known, | ||
239 | * disable the use of WAIT for 20Kc entirely. | ||
240 | cpu_wait = r4k_wait; | ||
241 | */ | ||
242 | break; | ||
243 | case CPU_RM9000: | ||
244 | if ((c->processor_id & 0x00ff) >= 0x40) | ||
245 | cpu_wait = r4k_wait; | ||
246 | break; | ||
247 | default: | ||
248 | break; | ||
249 | } | ||
250 | } | ||
251 | |||
252 | static inline void check_errata(void) | 54 | static inline void check_errata(void) |
253 | { | 55 | { |
254 | struct cpuinfo_mips *c = ¤t_cpu_data; | 56 | struct cpuinfo_mips *c = ¤t_cpu_data; |
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index 9098829bfcb0..31fa856829cb 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
@@ -122,7 +122,7 @@ handle_vcei: | |||
122 | __FINIT | 122 | __FINIT |
123 | 123 | ||
124 | .align 5 /* 32 byte rollback region */ | 124 | .align 5 /* 32 byte rollback region */ |
125 | LEAF(r4k_wait) | 125 | LEAF(__r4k_wait) |
126 | .set push | 126 | .set push |
127 | .set noreorder | 127 | .set noreorder |
128 | /* start of rollback region */ | 128 | /* start of rollback region */ |
@@ -146,14 +146,14 @@ LEAF(r4k_wait) | |||
146 | jr ra | 146 | jr ra |
147 | nop | 147 | nop |
148 | .set pop | 148 | .set pop |
149 | END(r4k_wait) | 149 | END(__r4k_wait) |
150 | 150 | ||
151 | .macro BUILD_ROLLBACK_PROLOGUE handler | 151 | .macro BUILD_ROLLBACK_PROLOGUE handler |
152 | FEXPORT(rollback_\handler) | 152 | FEXPORT(rollback_\handler) |
153 | .set push | 153 | .set push |
154 | .set noat | 154 | .set noat |
155 | MFC0 k0, CP0_EPC | 155 | MFC0 k0, CP0_EPC |
156 | PTR_LA k1, r4k_wait | 156 | PTR_LA k1, __r4k_wait |
157 | ori k0, 0x1f /* 32 byte rollback region */ | 157 | ori k0, 0x1f /* 32 byte rollback region */ |
158 | xori k0, 0x1f | 158 | xori k0, 0x1f |
159 | bne k0, k1, 9f | 159 | bne k0, k1, 9f |
diff --git a/arch/mips/kernel/idle.c b/arch/mips/kernel/idle.c new file mode 100644 index 000000000000..3b09b888afa9 --- /dev/null +++ b/arch/mips/kernel/idle.c | |||
@@ -0,0 +1,244 @@ | |||
1 | /* | ||
2 | * MIPS idle loop and WAIT instruction support. | ||
3 | * | ||
4 | * Copyright (C) xxxx the Anonymous | ||
5 | * Copyright (C) 1994 - 2006 Ralf Baechle | ||
6 | * Copyright (C) 2003, 2004 Maciej W. Rozycki | ||
7 | * Copyright (C) 2001, 2004, 2011, 2012 MIPS Technologies, Inc. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * as published by the Free Software Foundation; either version | ||
12 | * 2 of the License, or (at your option) any later version. | ||
13 | */ | ||
14 | #include <linux/export.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/irqflags.h> | ||
17 | #include <linux/printk.h> | ||
18 | #include <linux/sched.h> | ||
19 | #include <asm/cpu.h> | ||
20 | #include <asm/cpu-info.h> | ||
21 | #include <asm/idle.h> | ||
22 | #include <asm/mipsregs.h> | ||
23 | |||
24 | /* | ||
25 | * Not all of the MIPS CPUs have the "wait" instruction available. Moreover, | ||
26 | * the implementation of the "wait" feature differs between CPU families. This | ||
27 | * points to the function that implements CPU specific wait. | ||
28 | * The wait instruction stops the pipeline and reduces the power consumption of | ||
29 | * the CPU very much. | ||
30 | */ | ||
31 | void (*cpu_wait)(void); | ||
32 | EXPORT_SYMBOL(cpu_wait); | ||
33 | |||
34 | static void r3081_wait(void) | ||
35 | { | ||
36 | unsigned long cfg = read_c0_conf(); | ||
37 | write_c0_conf(cfg | R30XX_CONF_HALT); | ||
38 | local_irq_enable(); | ||
39 | } | ||
40 | |||
41 | static void r39xx_wait(void) | ||
42 | { | ||
43 | if (!need_resched()) | ||
44 | write_c0_conf(read_c0_conf() | TX39_CONF_HALT); | ||
45 | local_irq_enable(); | ||
46 | } | ||
47 | |||
48 | void r4k_wait(void) | ||
49 | { | ||
50 | local_irq_enable(); | ||
51 | __r4k_wait(); | ||
52 | } | ||
53 | |||
54 | /* | ||
55 | * This variant is preferable as it allows testing need_resched and going to | ||
56 | * sleep depending on the outcome atomically. Unfortunately the "It is | ||
57 | * implementation-dependent whether the pipeline restarts when a non-enabled | ||
58 | * interrupt is requested" restriction in the MIPS32/MIPS64 architecture makes | ||
59 | * using this version a gamble. | ||
60 | */ | ||
61 | void r4k_wait_irqoff(void) | ||
62 | { | ||
63 | if (!need_resched()) | ||
64 | __asm__( | ||
65 | " .set push \n" | ||
66 | " .set mips3 \n" | ||
67 | " wait \n" | ||
68 | " .set pop \n"); | ||
69 | local_irq_enable(); | ||
70 | __asm__( | ||
71 | " .globl __pastwait \n" | ||
72 | "__pastwait: \n"); | ||
73 | } | ||
74 | |||
75 | /* | ||
76 | * The RM7000 variant has to handle erratum 38. The workaround is to not | ||
77 | * have any pending stores when the WAIT instruction is executed. | ||
78 | */ | ||
79 | static void rm7k_wait_irqoff(void) | ||
80 | { | ||
81 | if (!need_resched()) | ||
82 | __asm__( | ||
83 | " .set push \n" | ||
84 | " .set mips3 \n" | ||
85 | " .set noat \n" | ||
86 | " mfc0 $1, $12 \n" | ||
87 | " sync \n" | ||
88 | " mtc0 $1, $12 # stalls until W stage \n" | ||
89 | " wait \n" | ||
90 | " mtc0 $1, $12 # stalls until W stage \n" | ||
91 | " .set pop \n"); | ||
92 | local_irq_enable(); | ||
93 | } | ||
94 | |||
95 | /* | ||
96 | * The Au1xxx wait is available only if using 32khz counter or | ||
97 | * external timer source, but specifically not CP0 Counter. | ||
98 | * alchemy/common/time.c may override cpu_wait! | ||
99 | */ | ||
100 | static void au1k_wait(void) | ||
101 | { | ||
102 | __asm__( | ||
103 | " .set mips3 \n" | ||
104 | " cache 0x14, 0(%0) \n" | ||
105 | " cache 0x14, 32(%0) \n" | ||
106 | " sync \n" | ||
107 | " nop \n" | ||
108 | " wait \n" | ||
109 | " nop \n" | ||
110 | " nop \n" | ||
111 | " nop \n" | ||
112 | " nop \n" | ||
113 | " .set mips0 \n" | ||
114 | : : "r" (au1k_wait)); | ||
115 | local_irq_enable(); | ||
116 | } | ||
117 | |||
118 | static int __initdata nowait; | ||
119 | |||
120 | static int __init wait_disable(char *s) | ||
121 | { | ||
122 | nowait = 1; | ||
123 | |||
124 | return 1; | ||
125 | } | ||
126 | |||
127 | __setup("nowait", wait_disable); | ||
128 | |||
129 | void __init check_wait(void) | ||
130 | { | ||
131 | struct cpuinfo_mips *c = ¤t_cpu_data; | ||
132 | |||
133 | if (nowait) { | ||
134 | printk("Wait instruction disabled.\n"); | ||
135 | return; | ||
136 | } | ||
137 | |||
138 | switch (c->cputype) { | ||
139 | case CPU_R3081: | ||
140 | case CPU_R3081E: | ||
141 | cpu_wait = r3081_wait; | ||
142 | break; | ||
143 | case CPU_TX3927: | ||
144 | cpu_wait = r39xx_wait; | ||
145 | break; | ||
146 | case CPU_R4200: | ||
147 | /* case CPU_R4300: */ | ||
148 | case CPU_R4600: | ||
149 | case CPU_R4640: | ||
150 | case CPU_R4650: | ||
151 | case CPU_R4700: | ||
152 | case CPU_R5000: | ||
153 | case CPU_R5500: | ||
154 | case CPU_NEVADA: | ||
155 | case CPU_4KC: | ||
156 | case CPU_4KEC: | ||
157 | case CPU_4KSC: | ||
158 | case CPU_5KC: | ||
159 | case CPU_25KF: | ||
160 | case CPU_PR4450: | ||
161 | case CPU_BMIPS3300: | ||
162 | case CPU_BMIPS4350: | ||
163 | case CPU_BMIPS4380: | ||
164 | case CPU_BMIPS5000: | ||
165 | case CPU_CAVIUM_OCTEON: | ||
166 | case CPU_CAVIUM_OCTEON_PLUS: | ||
167 | case CPU_CAVIUM_OCTEON2: | ||
168 | case CPU_JZRISC: | ||
169 | case CPU_LOONGSON1: | ||
170 | case CPU_XLR: | ||
171 | case CPU_XLP: | ||
172 | cpu_wait = r4k_wait; | ||
173 | break; | ||
174 | |||
175 | case CPU_RM7000: | ||
176 | cpu_wait = rm7k_wait_irqoff; | ||
177 | break; | ||
178 | |||
179 | case CPU_M14KC: | ||
180 | case CPU_M14KEC: | ||
181 | case CPU_24K: | ||
182 | case CPU_34K: | ||
183 | case CPU_1004K: | ||
184 | cpu_wait = r4k_wait; | ||
185 | if (read_c0_config7() & MIPS_CONF7_WII) | ||
186 | cpu_wait = r4k_wait_irqoff; | ||
187 | break; | ||
188 | |||
189 | case CPU_74K: | ||
190 | cpu_wait = r4k_wait; | ||
191 | if ((c->processor_id & 0xff) >= PRID_REV_ENCODE_332(2, 1, 0)) | ||
192 | cpu_wait = r4k_wait_irqoff; | ||
193 | break; | ||
194 | |||
195 | case CPU_TX49XX: | ||
196 | cpu_wait = r4k_wait_irqoff; | ||
197 | break; | ||
198 | case CPU_ALCHEMY: | ||
199 | cpu_wait = au1k_wait; | ||
200 | break; | ||
201 | case CPU_20KC: | ||
202 | /* | ||
203 | * WAIT on Rev1.0 has E1, E2, E3 and E16. | ||
204 | * WAIT on Rev2.0 and Rev3.0 has E16. | ||
205 | * Rev3.1 WAIT is nop, why bother | ||
206 | */ | ||
207 | if ((c->processor_id & 0xff) <= 0x64) | ||
208 | break; | ||
209 | |||
210 | /* | ||
211 | * Another rev is incremeting c0_count at a reduced clock | ||
212 | * rate while in WAIT mode. So we basically have the choice | ||
213 | * between using the cp0 timer as clocksource or avoiding | ||
214 | * the WAIT instruction. Until more details are known, | ||
215 | * disable the use of WAIT for 20Kc entirely. | ||
216 | cpu_wait = r4k_wait; | ||
217 | */ | ||
218 | break; | ||
219 | case CPU_RM9000: | ||
220 | if ((c->processor_id & 0x00ff) >= 0x40) | ||
221 | cpu_wait = r4k_wait; | ||
222 | break; | ||
223 | default: | ||
224 | break; | ||
225 | } | ||
226 | } | ||
227 | |||
228 | static void smtc_idle_hook(void) | ||
229 | { | ||
230 | #ifdef CONFIG_MIPS_MT_SMTC | ||
231 | void smtc_idle_loop_hook(void); | ||
232 | |||
233 | smtc_idle_loop_hook(); | ||
234 | #endif | ||
235 | } | ||
236 | |||
237 | void arch_cpu_idle(void) | ||
238 | { | ||
239 | smtc_idle_hook(); | ||
240 | if (cpu_wait) | ||
241 | cpu_wait(); | ||
242 | else | ||
243 | local_irq_enable(); | ||
244 | } | ||
diff --git a/arch/mips/kernel/kprobes.c b/arch/mips/kernel/kprobes.c index 12bc4ebdf55b..1f8187ab0997 100644 --- a/arch/mips/kernel/kprobes.c +++ b/arch/mips/kernel/kprobes.c | |||
@@ -207,7 +207,10 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
207 | 207 | ||
208 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 208 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
209 | { | 209 | { |
210 | free_insn_slot(p->ainsn.insn, 0); | 210 | if (p->ainsn.insn) { |
211 | free_insn_slot(p->ainsn.insn, 0); | ||
212 | p->ainsn.insn = NULL; | ||
213 | } | ||
211 | } | 214 | } |
212 | 215 | ||
213 | static void save_previous_kprobe(struct kprobe_ctlblk *kcb) | 216 | static void save_previous_kprobe(struct kprobe_ctlblk *kcb) |
diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c index a3e461408b7e..acb34373679e 100644 --- a/arch/mips/kernel/proc.c +++ b/arch/mips/kernel/proc.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <asm/bootinfo.h> | 10 | #include <asm/bootinfo.h> |
11 | #include <asm/cpu.h> | 11 | #include <asm/cpu.h> |
12 | #include <asm/cpu-features.h> | 12 | #include <asm/cpu-features.h> |
13 | #include <asm/idle.h> | ||
13 | #include <asm/mipsregs.h> | 14 | #include <asm/mipsregs.h> |
14 | #include <asm/processor.h> | 15 | #include <asm/processor.h> |
15 | #include <asm/prom.h> | 16 | #include <asm/prom.h> |
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index a682a87bcc04..c6a041d9d05d 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
@@ -51,19 +51,6 @@ void arch_cpu_idle_dead(void) | |||
51 | } | 51 | } |
52 | #endif | 52 | #endif |
53 | 53 | ||
54 | void arch_cpu_idle(void) | ||
55 | { | ||
56 | #ifdef CONFIG_MIPS_MT_SMTC | ||
57 | extern void smtc_idle_loop_hook(void); | ||
58 | |||
59 | smtc_idle_loop_hook(); | ||
60 | #endif | ||
61 | if (cpu_wait) | ||
62 | (*cpu_wait)(); | ||
63 | else | ||
64 | local_irq_enable(); | ||
65 | } | ||
66 | |||
67 | asmlinkage void ret_from_fork(void); | 54 | asmlinkage void ret_from_fork(void); |
68 | asmlinkage void ret_from_kernel_thread(void); | 55 | asmlinkage void ret_from_kernel_thread(void); |
69 | 56 | ||
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 36cfd4060e1f..97a5909a61cf 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
@@ -423,4 +423,5 @@ sys_call_table: | |||
423 | PTR sys_process_vm_writev /* 5305 */ | 423 | PTR sys_process_vm_writev /* 5305 */ |
424 | PTR sys_kcmp | 424 | PTR sys_kcmp |
425 | PTR sys_finit_module | 425 | PTR sys_finit_module |
426 | PTR sys_getdents64 | ||
426 | .size sys_call_table,.-sys_call_table | 427 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index c17619fe18e3..6e7862ab46cc 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/atomic.h> | 37 | #include <linux/atomic.h> |
38 | #include <asm/cpu.h> | 38 | #include <asm/cpu.h> |
39 | #include <asm/processor.h> | 39 | #include <asm/processor.h> |
40 | #include <asm/idle.h> | ||
40 | #include <asm/r4k-timer.h> | 41 | #include <asm/r4k-timer.h> |
41 | #include <asm/mmu_context.h> | 42 | #include <asm/mmu_context.h> |
42 | #include <asm/time.h> | 43 | #include <asm/time.h> |
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c index 7186222dc5bb..75a4fd709841 100644 --- a/arch/mips/kernel/smtc.c +++ b/arch/mips/kernel/smtc.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/hardirq.h> | 34 | #include <asm/hardirq.h> |
35 | #include <asm/hazards.h> | 35 | #include <asm/hazards.h> |
36 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
37 | #include <asm/idle.h> | ||
37 | #include <asm/mmu_context.h> | 38 | #include <asm/mmu_context.h> |
38 | #include <asm/mipsregs.h> | 39 | #include <asm/mipsregs.h> |
39 | #include <asm/cacheflush.h> | 40 | #include <asm/cacheflush.h> |
@@ -858,7 +859,6 @@ void smtc_send_ipi(int cpu, int type, unsigned int action) | |||
858 | unsigned long flags; | 859 | unsigned long flags; |
859 | int mtflags; | 860 | int mtflags; |
860 | unsigned long tcrestart; | 861 | unsigned long tcrestart; |
861 | extern void r4k_wait_irqoff(void), __pastwait(void); | ||
862 | int set_resched_flag = (type == LINUX_SMP_IPI && | 862 | int set_resched_flag = (type == LINUX_SMP_IPI && |
863 | action == SMP_RESCHEDULE_YOURSELF); | 863 | action == SMP_RESCHEDULE_YOURSELF); |
864 | 864 | ||
@@ -914,8 +914,7 @@ void smtc_send_ipi(int cpu, int type, unsigned int action) | |||
914 | */ | 914 | */ |
915 | if (cpu_wait == r4k_wait_irqoff) { | 915 | if (cpu_wait == r4k_wait_irqoff) { |
916 | tcrestart = read_tc_c0_tcrestart(); | 916 | tcrestart = read_tc_c0_tcrestart(); |
917 | if (tcrestart >= (unsigned long)r4k_wait_irqoff | 917 | if (address_is_in_r4k_wait_irqoff(tcrestart)) { |
918 | && tcrestart < (unsigned long)__pastwait) { | ||
919 | write_tc_c0_tcrestart(__pastwait); | 918 | write_tc_c0_tcrestart(__pastwait); |
920 | tcstatus &= ~TCSTATUS_IXMT; | 919 | tcstatus &= ~TCSTATUS_IXMT; |
921 | write_tc_c0_tcstatus(tcstatus); | 920 | write_tc_c0_tcstatus(tcstatus); |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index cb14db3c5764..e3be67012d78 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <asm/dsp.h> | 41 | #include <asm/dsp.h> |
42 | #include <asm/fpu.h> | 42 | #include <asm/fpu.h> |
43 | #include <asm/fpu_emulator.h> | 43 | #include <asm/fpu_emulator.h> |
44 | #include <asm/idle.h> | ||
44 | #include <asm/mipsregs.h> | 45 | #include <asm/mipsregs.h> |
45 | #include <asm/mipsmtregs.h> | 46 | #include <asm/mipsmtregs.h> |
46 | #include <asm/module.h> | 47 | #include <asm/module.h> |
@@ -57,7 +58,6 @@ | |||
57 | #include <asm/uasm.h> | 58 | #include <asm/uasm.h> |
58 | 59 | ||
59 | extern void check_wait(void); | 60 | extern void check_wait(void); |
60 | extern asmlinkage void r4k_wait(void); | ||
61 | extern asmlinkage void rollback_handle_int(void); | 61 | extern asmlinkage void rollback_handle_int(void); |
62 | extern asmlinkage void handle_int(void); | 62 | extern asmlinkage void handle_int(void); |
63 | extern u32 handle_tlbl[]; | 63 | extern u32 handle_tlbl[]; |
@@ -1542,7 +1542,7 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
1542 | extern char except_vec_vi, except_vec_vi_lui; | 1542 | extern char except_vec_vi, except_vec_vi_lui; |
1543 | extern char except_vec_vi_ori, except_vec_vi_end; | 1543 | extern char except_vec_vi_ori, except_vec_vi_end; |
1544 | extern char rollback_except_vec_vi; | 1544 | extern char rollback_except_vec_vi; |
1545 | char *vec_start = (cpu_wait == r4k_wait) ? | 1545 | char *vec_start = using_rollback_handler() ? |
1546 | &rollback_except_vec_vi : &except_vec_vi; | 1546 | &rollback_except_vec_vi : &except_vec_vi; |
1547 | #ifdef CONFIG_MIPS_MT_SMTC | 1547 | #ifdef CONFIG_MIPS_MT_SMTC |
1548 | /* | 1548 | /* |
@@ -1812,10 +1812,8 @@ void __init trap_init(void) | |||
1812 | extern char except_vec4; | 1812 | extern char except_vec4; |
1813 | extern char except_vec3_r4000; | 1813 | extern char except_vec3_r4000; |
1814 | unsigned long i; | 1814 | unsigned long i; |
1815 | int rollback; | ||
1816 | 1815 | ||
1817 | check_wait(); | 1816 | check_wait(); |
1818 | rollback = (cpu_wait == r4k_wait); | ||
1819 | 1817 | ||
1820 | #if defined(CONFIG_KGDB) | 1818 | #if defined(CONFIG_KGDB) |
1821 | if (kgdb_early_setup) | 1819 | if (kgdb_early_setup) |
@@ -1892,7 +1890,8 @@ void __init trap_init(void) | |||
1892 | if (board_be_init) | 1890 | if (board_be_init) |
1893 | board_be_init(); | 1891 | board_be_init(); |
1894 | 1892 | ||
1895 | set_except_vector(0, rollback ? rollback_handle_int : handle_int); | 1893 | set_except_vector(0, using_rollback_handler() ? rollback_handle_int |
1894 | : handle_int); | ||
1896 | set_except_vector(1, handle_tlbm); | 1895 | set_except_vector(1, handle_tlbm); |
1897 | set_except_vector(2, handle_tlbl); | 1896 | set_except_vector(2, handle_tlbl); |
1898 | set_except_vector(3, handle_tlbs); | 1897 | set_except_vector(3, handle_tlbs); |
diff --git a/arch/mips/loongson/common/reset.c b/arch/mips/loongson/common/reset.c index 35c8c6468494..65bfbb5d06f4 100644 --- a/arch/mips/loongson/common/reset.c +++ b/arch/mips/loongson/common/reset.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/pm.h> | 13 | #include <linux/pm.h> |
14 | 14 | ||
15 | #include <asm/idle.h> | ||
15 | #include <asm/reboot.h> | 16 | #include <asm/reboot.h> |
16 | 17 | ||
17 | #include <loongson.h> | 18 | #include <loongson.h> |
diff --git a/arch/mips/loongson1/common/reset.c b/arch/mips/loongson1/common/reset.c index d4f610f9604a..547f34b69e4c 100644 --- a/arch/mips/loongson1/common/reset.c +++ b/arch/mips/loongson1/common/reset.c | |||
@@ -9,6 +9,7 @@ | |||
9 | 9 | ||
10 | #include <linux/io.h> | 10 | #include <linux/io.h> |
11 | #include <linux/pm.h> | 11 | #include <linux/pm.h> |
12 | #include <asm/idle.h> | ||
12 | #include <asm/reboot.h> | 13 | #include <asm/reboot.h> |
13 | 14 | ||
14 | #include <loongson1.h> | 15 | #include <loongson1.h> |
diff --git a/arch/mips/netlogic/xlp/setup.c b/arch/mips/netlogic/xlp/setup.c index af319143b591..eaa99d28cb8e 100644 --- a/arch/mips/netlogic/xlp/setup.c +++ b/arch/mips/netlogic/xlp/setup.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/pm.h> | 37 | #include <linux/pm.h> |
38 | #include <linux/bootmem.h> | 38 | #include <linux/bootmem.h> |
39 | 39 | ||
40 | #include <asm/idle.h> | ||
40 | #include <asm/reboot.h> | 41 | #include <asm/reboot.h> |
41 | #include <asm/time.h> | 42 | #include <asm/time.h> |
42 | #include <asm/bootinfo.h> | 43 | #include <asm/bootinfo.h> |
diff --git a/arch/mips/netlogic/xlr/setup.c b/arch/mips/netlogic/xlr/setup.c index e3e094100e3e..89c8c1066632 100644 --- a/arch/mips/netlogic/xlr/setup.c +++ b/arch/mips/netlogic/xlr/setup.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/serial_8250.h> | 36 | #include <linux/serial_8250.h> |
37 | #include <linux/pm.h> | 37 | #include <linux/pm.h> |
38 | 38 | ||
39 | #include <asm/idle.h> | ||
39 | #include <asm/reboot.h> | 40 | #include <asm/reboot.h> |
40 | #include <asm/time.h> | 41 | #include <asm/time.h> |
41 | #include <asm/bootinfo.h> | 42 | #include <asm/bootinfo.h> |
diff --git a/arch/mips/pmcs-msp71xx/msp_setup.c b/arch/mips/pmcs-msp71xx/msp_setup.c index 1651cfdbfe7b..396b2967ad85 100644 --- a/arch/mips/pmcs-msp71xx/msp_setup.c +++ b/arch/mips/pmcs-msp71xx/msp_setup.c | |||
@@ -12,6 +12,7 @@ | |||
12 | 12 | ||
13 | #include <asm/bootinfo.h> | 13 | #include <asm/bootinfo.h> |
14 | #include <asm/cacheflush.h> | 14 | #include <asm/cacheflush.h> |
15 | #include <asm/idle.h> | ||
15 | #include <asm/r4kcache.h> | 16 | #include <asm/r4kcache.h> |
16 | #include <asm/reboot.h> | 17 | #include <asm/reboot.h> |
17 | #include <asm/smp-ops.h> | 18 | #include <asm/smp-ops.h> |
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c index 5364aabc2102..681e7f86c080 100644 --- a/arch/mips/txx9/generic/setup.c +++ b/arch/mips/txx9/generic/setup.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
27 | #include <linux/irq.h> | 27 | #include <linux/irq.h> |
28 | #include <asm/bootinfo.h> | 28 | #include <asm/bootinfo.h> |
29 | #include <asm/idle.h> | ||
29 | #include <asm/time.h> | 30 | #include <asm/time.h> |
30 | #include <asm/reboot.h> | 31 | #include <asm/reboot.h> |
31 | #include <asm/r4kcache.h> | 32 | #include <asm/r4kcache.h> |
diff --git a/arch/mips/vr41xx/common/pmu.c b/arch/mips/vr41xx/common/pmu.c index 70a3f90131d8..d7f755833c3f 100644 --- a/arch/mips/vr41xx/common/pmu.c +++ b/arch/mips/vr41xx/common/pmu.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include <asm/cacheflush.h> | 28 | #include <asm/cacheflush.h> |
29 | #include <asm/cpu.h> | 29 | #include <asm/cpu.h> |
30 | #include <asm/idle.h> | ||
30 | #include <asm/io.h> | 31 | #include <asm/io.h> |
31 | #include <asm/processor.h> | 32 | #include <asm/processor.h> |
32 | #include <asm/reboot.h> | 33 | #include <asm/reboot.h> |
diff --git a/arch/mips/wrppmc/reset.c b/arch/mips/wrppmc/reset.c index cc5474b24f06..80beb188ed47 100644 --- a/arch/mips/wrppmc/reset.c +++ b/arch/mips/wrppmc/reset.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
10 | 10 | ||
11 | #include <asm/cacheflush.h> | 11 | #include <asm/cacheflush.h> |
12 | #include <asm/idle.h> | ||
12 | #include <asm/mipsregs.h> | 13 | #include <asm/mipsregs.h> |
13 | #include <asm/processor.h> | 14 | #include <asm/processor.h> |
14 | 15 | ||
diff --git a/drivers/cpufreq/loongson2_cpufreq.c b/drivers/cpufreq/loongson2_cpufreq.c index 84889573b566..d53912768946 100644 --- a/drivers/cpufreq/loongson2_cpufreq.c +++ b/drivers/cpufreq/loongson2_cpufreq.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | 19 | ||
20 | #include <asm/clock.h> | 20 | #include <asm/clock.h> |
21 | #include <asm/idle.h> | ||
21 | 22 | ||
22 | #include <asm/mach-loongson/loongson.h> | 23 | #include <asm/mach-loongson/loongson.h> |
23 | 24 | ||
@@ -200,6 +201,7 @@ static void loongson2_cpu_wait(void) | |||
200 | LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */ | 201 | LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */ |
201 | LOONGSON_CHIPCFG0 = cpu_freq; /* Restore CPU state */ | 202 | LOONGSON_CHIPCFG0 = cpu_freq; /* Restore CPU state */ |
202 | spin_unlock_irqrestore(&loongson2_wait_lock, flags); | 203 | spin_unlock_irqrestore(&loongson2_wait_lock, flags); |
204 | local_irq_enable(); | ||
203 | } | 205 | } |
204 | 206 | ||
205 | static int __init cpufreq_init(void) | 207 | static int __init cpufreq_init(void) |
diff --git a/include/linux/printk.h b/include/linux/printk.h index 6af944ab38f0..22c7052e9372 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <stdarg.h> | 4 | #include <stdarg.h> |
5 | #include <linux/init.h> | 5 | #include <linux/init.h> |
6 | #include <linux/kern_levels.h> | 6 | #include <linux/kern_levels.h> |
7 | #include <linux/linkage.h> | ||
7 | 8 | ||
8 | extern const char linux_banner[]; | 9 | extern const char linux_banner[]; |
9 | extern const char linux_proc_banner[]; | 10 | extern const char linux_proc_banner[]; |