diff options
Diffstat (limited to 'arch/sh/kernel')
-rw-r--r-- | arch/sh/kernel/cf-enabler.c | 2 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/clock.c | 7 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/irq/maskreg.c | 2 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4/fpu.c | 2 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4/setup-sh7750.c | 2 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/clock-sh7722.c | 34 | ||||
-rw-r--r-- | arch/sh/kernel/kgdb_stub.c | 4 | ||||
-rw-r--r-- | arch/sh/kernel/process.c | 33 | ||||
-rw-r--r-- | arch/sh/kernel/syscalls.S | 3 | ||||
-rw-r--r-- | arch/sh/kernel/traps.c | 13 |
10 files changed, 78 insertions, 24 deletions
diff --git a/arch/sh/kernel/cf-enabler.c b/arch/sh/kernel/cf-enabler.c index 0758d48147a0..849a9e191391 100644 --- a/arch/sh/kernel/cf-enabler.c +++ b/arch/sh/kernel/cf-enabler.c | |||
@@ -31,7 +31,7 @@ | |||
31 | */ | 31 | */ |
32 | #if defined(CONFIG_CPU_SH4) | 32 | #if defined(CONFIG_CPU_SH4) |
33 | /* SH4 can't access PCMCIA interface through P2 area. | 33 | /* SH4 can't access PCMCIA interface through P2 area. |
34 | * we must remap it with appropreate attribute bit of the page set. | 34 | * we must remap it with appropriate attribute bit of the page set. |
35 | * this part is based on Greg Banks' hd64465_ss.c implementation - Masahiro Abe */ | 35 | * this part is based on Greg Banks' hd64465_ss.c implementation - Masahiro Abe */ |
36 | 36 | ||
37 | #if defined(CONFIG_CF_AREA6) | 37 | #if defined(CONFIG_CF_AREA6) |
diff --git a/arch/sh/kernel/cpu/clock.c b/arch/sh/kernel/cpu/clock.c index 014f318f5a05..63251549e9a8 100644 --- a/arch/sh/kernel/cpu/clock.c +++ b/arch/sh/kernel/cpu/clock.c | |||
@@ -278,6 +278,11 @@ arch_init_clk_ops(struct clk_ops **ops, int type) | |||
278 | { | 278 | { |
279 | } | 279 | } |
280 | 280 | ||
281 | void __init __attribute__ ((weak)) | ||
282 | arch_clk_init(void) | ||
283 | { | ||
284 | } | ||
285 | |||
281 | static int show_clocks(char *buf, char **start, off_t off, | 286 | static int show_clocks(char *buf, char **start, off_t off, |
282 | int len, int *eof, void *data) | 287 | int len, int *eof, void *data) |
283 | { | 288 | { |
@@ -314,6 +319,8 @@ int __init clk_init(void) | |||
314 | ret |= clk_register(clk); | 319 | ret |= clk_register(clk); |
315 | } | 320 | } |
316 | 321 | ||
322 | arch_clk_init(); | ||
323 | |||
317 | /* Kick the child clocks.. */ | 324 | /* Kick the child clocks.. */ |
318 | propagate_rate(&master_clk); | 325 | propagate_rate(&master_clk); |
319 | propagate_rate(&bus_clk); | 326 | propagate_rate(&bus_clk); |
diff --git a/arch/sh/kernel/cpu/irq/maskreg.c b/arch/sh/kernel/cpu/irq/maskreg.c index 492db31b3cab..978992e367a5 100644 --- a/arch/sh/kernel/cpu/irq/maskreg.c +++ b/arch/sh/kernel/cpu/irq/maskreg.c | |||
@@ -38,7 +38,7 @@ static struct hw_interrupt_type maskreg_irq_type = { | |||
38 | .end = end_maskreg_irq | 38 | .end = end_maskreg_irq |
39 | }; | 39 | }; |
40 | 40 | ||
41 | /* actual implementatin */ | 41 | /* actual implementation */ |
42 | static unsigned int startup_maskreg_irq(unsigned int irq) | 42 | static unsigned int startup_maskreg_irq(unsigned int irq) |
43 | { | 43 | { |
44 | enable_maskreg_irq(irq); | 44 | enable_maskreg_irq(irq); |
diff --git a/arch/sh/kernel/cpu/sh4/fpu.c b/arch/sh/kernel/cpu/sh4/fpu.c index d61dd599169f..c5a4fc77fa06 100644 --- a/arch/sh/kernel/cpu/sh4/fpu.c +++ b/arch/sh/kernel/cpu/sh4/fpu.c | |||
@@ -138,7 +138,7 @@ restore_fpu(struct task_struct *tsk) | |||
138 | /* | 138 | /* |
139 | * Load the FPU with signalling NANS. This bit pattern we're using | 139 | * Load the FPU with signalling NANS. This bit pattern we're using |
140 | * has the property that no matter wether considered as single or as | 140 | * has the property that no matter wether considered as single or as |
141 | * double precission represents signaling NANS. | 141 | * double precision represents signaling NANS. |
142 | */ | 142 | */ |
143 | 143 | ||
144 | static void | 144 | static void |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7750.c b/arch/sh/kernel/cpu/sh4/setup-sh7750.c index 6f8f458912c7..03b14cf78ddf 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7750.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7750.c | |||
@@ -106,6 +106,7 @@ static struct ipr_data sh7750_ipr_map[] = { | |||
106 | { 38, 2, 8, 7 }, /* DMAC DMAE */ | 106 | { 38, 2, 8, 7 }, /* DMAC DMAE */ |
107 | }; | 107 | }; |
108 | 108 | ||
109 | #ifdef CONFIG_CPU_SUBTYPE_SH7751 | ||
109 | static struct ipr_data sh7751_ipr_map[] = { | 110 | static struct ipr_data sh7751_ipr_map[] = { |
110 | { 44, 2, 8, 7 }, /* DMAC DMTE4 */ | 111 | { 44, 2, 8, 7 }, /* DMAC DMTE4 */ |
111 | { 45, 2, 8, 7 }, /* DMAC DMTE5 */ | 112 | { 45, 2, 8, 7 }, /* DMAC DMTE5 */ |
@@ -117,6 +118,7 @@ static struct ipr_data sh7751_ipr_map[] = { | |||
117 | /*{ 72, INTPRI00, 8, ? },*/ /* TMU3 TUNI */ | 118 | /*{ 72, INTPRI00, 8, ? },*/ /* TMU3 TUNI */ |
118 | /*{ 76, INTPRI00, 12, ? },*/ /* TMU4 TUNI */ | 119 | /*{ 76, INTPRI00, 12, ? },*/ /* TMU4 TUNI */ |
119 | }; | 120 | }; |
121 | #endif | ||
120 | 122 | ||
121 | static unsigned long ipr_offsets[] = { | 123 | static unsigned long ipr_offsets[] = { |
122 | 0xffd00004UL, /* 0: IPRA */ | 124 | 0xffd00004UL, /* 0: IPRA */ |
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7722.c b/arch/sh/kernel/cpu/sh4a/clock-sh7722.c index 29090035bc5b..51b386d454de 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7722.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7722.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <asm/clock.h> | 17 | #include <asm/clock.h> |
18 | #include <asm/freq.h> | 18 | #include <asm/freq.h> |
19 | 19 | ||
20 | #define SH7722_PLL_FREQ (32000000/8) | ||
21 | #define N (-1) | 20 | #define N (-1) |
22 | #define NM (-2) | 21 | #define NM (-2) |
23 | #define ROUND_NEAREST 0 | 22 | #define ROUND_NEAREST 0 |
@@ -141,28 +140,36 @@ static void adjust_clocks(int originate, int *l, unsigned long v[], | |||
141 | */ | 140 | */ |
142 | static int divisors2[] = { 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40 }; | 141 | static int divisors2[] = { 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40 }; |
143 | 142 | ||
143 | static void master_clk_recalc(struct clk *clk) | ||
144 | { | ||
145 | unsigned frqcr = ctrl_inl(FRQCR); | ||
146 | |||
147 | clk->rate = CONFIG_SH_PCLK_FREQ * (((frqcr >> 24) & 0x1f) + 1); | ||
148 | } | ||
149 | |||
144 | static void master_clk_init(struct clk *clk) | 150 | static void master_clk_init(struct clk *clk) |
145 | { | 151 | { |
146 | clk_set_rate(clk, clk_get_rate(clk)); | 152 | clk->parent = NULL; |
153 | clk->flags |= CLK_RATE_PROPAGATES; | ||
154 | clk->rate = CONFIG_SH_PCLK_FREQ; | ||
155 | master_clk_recalc(clk); | ||
147 | } | 156 | } |
148 | 157 | ||
149 | static void master_clk_recalc(struct clk *clk) | 158 | |
159 | static void module_clk_recalc(struct clk *clk) | ||
150 | { | 160 | { |
151 | unsigned long frqcr = ctrl_inl(FRQCR); | 161 | unsigned long frqcr = ctrl_inl(FRQCR); |
152 | 162 | ||
153 | clk->rate = CONFIG_SH_PCLK_FREQ * (1 + (frqcr >> 24 & 0xF)); | 163 | clk->rate = clk->parent->rate / (((frqcr >> 24) & 0x1f) + 1); |
154 | } | 164 | } |
155 | 165 | ||
156 | static int master_clk_setrate(struct clk *clk, unsigned long rate, int id) | 166 | static int master_clk_setrate(struct clk *clk, unsigned long rate, int id) |
157 | { | 167 | { |
158 | int div = rate / SH7722_PLL_FREQ; | 168 | int div = rate / clk->rate; |
159 | int master_divs[] = { 2, 3, 4, 6, 8, 16 }; | 169 | int master_divs[] = { 2, 3, 4, 6, 8, 16 }; |
160 | int index; | 170 | int index; |
161 | unsigned long frqcr; | 171 | unsigned long frqcr; |
162 | 172 | ||
163 | if (rate < SH7722_PLL_FREQ * 2) | ||
164 | return -EINVAL; | ||
165 | |||
166 | for (index = 1; index < ARRAY_SIZE(master_divs); index++) | 173 | for (index = 1; index < ARRAY_SIZE(master_divs); index++) |
167 | if (div >= master_divs[index - 1] && div < master_divs[index]) | 174 | if (div >= master_divs[index - 1] && div < master_divs[index]) |
168 | break; | 175 | break; |
@@ -185,6 +192,10 @@ static struct clk_ops sh7722_master_clk_ops = { | |||
185 | .set_rate = master_clk_setrate, | 192 | .set_rate = master_clk_setrate, |
186 | }; | 193 | }; |
187 | 194 | ||
195 | static struct clk_ops sh7722_module_clk_ops = { | ||
196 | .recalc = module_clk_recalc, | ||
197 | }; | ||
198 | |||
188 | struct frqcr_context { | 199 | struct frqcr_context { |
189 | unsigned mask; | 200 | unsigned mask; |
190 | unsigned shift; | 201 | unsigned shift; |
@@ -489,7 +500,7 @@ static void sh7722_siu_recalc(struct clk *clk) | |||
489 | 500 | ||
490 | if (siu < 0) | 501 | if (siu < 0) |
491 | return /* siu */ ; | 502 | return /* siu */ ; |
492 | BUG_ON(siu > 1); | 503 | BUG_ON(siu > 2); |
493 | r = ctrl_inl(sh7722_siu_regs[siu]); | 504 | r = ctrl_inl(sh7722_siu_regs[siu]); |
494 | clk->rate = clk->parent->rate * 2 / divisors2[r & 0xF]; | 505 | clk->rate = clk->parent->rate * 2 / divisors2[r & 0xF]; |
495 | } | 506 | } |
@@ -571,7 +582,7 @@ static struct clk *sh7722_clocks[] = { | |||
571 | */ | 582 | */ |
572 | struct clk_ops *onchip_ops[] = { | 583 | struct clk_ops *onchip_ops[] = { |
573 | &sh7722_master_clk_ops, | 584 | &sh7722_master_clk_ops, |
574 | &sh7722_frqcr_clk_ops, | 585 | &sh7722_module_clk_ops, |
575 | &sh7722_frqcr_clk_ops, | 586 | &sh7722_frqcr_clk_ops, |
576 | &sh7722_frqcr_clk_ops, | 587 | &sh7722_frqcr_clk_ops, |
577 | }; | 588 | }; |
@@ -583,7 +594,7 @@ arch_init_clk_ops(struct clk_ops **ops, int type) | |||
583 | *ops = onchip_ops[type]; | 594 | *ops = onchip_ops[type]; |
584 | } | 595 | } |
585 | 596 | ||
586 | int __init sh7722_clock_init(void) | 597 | int __init arch_clk_init(void) |
587 | { | 598 | { |
588 | struct clk *master; | 599 | struct clk *master; |
589 | int i; | 600 | int i; |
@@ -597,4 +608,3 @@ int __init sh7722_clock_init(void) | |||
597 | clk_put(master); | 608 | clk_put(master); |
598 | return 0; | 609 | return 0; |
599 | } | 610 | } |
600 | arch_initcall(sh7722_clock_init); | ||
diff --git a/arch/sh/kernel/kgdb_stub.c b/arch/sh/kernel/kgdb_stub.c index a5323364cbca..edd1ec214e6d 100644 --- a/arch/sh/kernel/kgdb_stub.c +++ b/arch/sh/kernel/kgdb_stub.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * May be copied or modified under the terms of the GNU General Public | 2 | * May be copied or modified under the terms of the GNU General Public |
3 | * License. See linux/COPYING for more information. | 3 | * License. See linux/COPYING for more information. |
4 | * | 4 | * |
5 | * Containes extracts from code by Glenn Engel, Jim Kingdon, | 5 | * Contains extracts from code by Glenn Engel, Jim Kingdon, |
6 | * David Grothe <dave@gcom.com>, Tigran Aivazian <tigran@sco.com>, | 6 | * David Grothe <dave@gcom.com>, Tigran Aivazian <tigran@sco.com>, |
7 | * Amit S. Kale <akale@veritas.com>, William Gatliff <bgat@open-widgets.com>, | 7 | * Amit S. Kale <akale@veritas.com>, William Gatliff <bgat@open-widgets.com>, |
8 | * Ben Lee, Steve Chamberlain and Benoit Miller <fulg@iname.com>. | 8 | * Ben Lee, Steve Chamberlain and Benoit Miller <fulg@iname.com>. |
@@ -85,7 +85,7 @@ | |||
85 | * | 85 | * |
86 | * Responses can be run-length encoded to save space. A '*' means that | 86 | * Responses can be run-length encoded to save space. A '*' means that |
87 | * the next character is an ASCII encoding giving a repeat count which | 87 | * the next character is an ASCII encoding giving a repeat count which |
88 | * stands for that many repititions of the character preceding the '*'. | 88 | * stands for that many repetitions of the character preceding the '*'. |
89 | * The encoding is n+29, yielding a printable character where n >=3 | 89 | * The encoding is n+29, yielding a printable character where n >=3 |
90 | * (which is where RLE starts to win). Don't use an n > 126. | 90 | * (which is where RLE starts to win). Don't use an n > 126. |
91 | * | 91 | * |
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index 6b4f5748d0be..a11e2aa73cbc 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c | |||
@@ -26,8 +26,6 @@ | |||
26 | static int hlt_counter; | 26 | static int hlt_counter; |
27 | int ubc_usercnt = 0; | 27 | int ubc_usercnt = 0; |
28 | 28 | ||
29 | #define HARD_IDLE_TIMEOUT (HZ / 3) | ||
30 | |||
31 | void (*pm_idle)(void); | 29 | void (*pm_idle)(void); |
32 | void (*pm_power_off)(void); | 30 | void (*pm_power_off)(void); |
33 | EXPORT_SYMBOL(pm_power_off); | 31 | EXPORT_SYMBOL(pm_power_off); |
@@ -44,16 +42,39 @@ void enable_hlt(void) | |||
44 | } | 42 | } |
45 | EXPORT_SYMBOL(enable_hlt); | 43 | EXPORT_SYMBOL(enable_hlt); |
46 | 44 | ||
45 | static int __init nohlt_setup(char *__unused) | ||
46 | { | ||
47 | hlt_counter = 1; | ||
48 | return 1; | ||
49 | } | ||
50 | __setup("nohlt", nohlt_setup); | ||
51 | |||
52 | static int __init hlt_setup(char *__unused) | ||
53 | { | ||
54 | hlt_counter = 0; | ||
55 | return 1; | ||
56 | } | ||
57 | __setup("hlt", hlt_setup); | ||
58 | |||
47 | void default_idle(void) | 59 | void default_idle(void) |
48 | { | 60 | { |
49 | if (!hlt_counter) | 61 | if (!hlt_counter) { |
50 | cpu_sleep(); | 62 | clear_thread_flag(TIF_POLLING_NRFLAG); |
51 | else | 63 | smp_mb__after_clear_bit(); |
52 | cpu_relax(); | 64 | set_bl_bit(); |
65 | while (!need_resched()) | ||
66 | cpu_sleep(); | ||
67 | clear_bl_bit(); | ||
68 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
69 | } else | ||
70 | while (!need_resched()) | ||
71 | cpu_relax(); | ||
53 | } | 72 | } |
54 | 73 | ||
55 | void cpu_idle(void) | 74 | void cpu_idle(void) |
56 | { | 75 | { |
76 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
77 | |||
57 | /* endless idle loop with no priority at all */ | 78 | /* endless idle loop with no priority at all */ |
58 | while (1) { | 79 | while (1) { |
59 | void (*idle)(void) = pm_idle; | 80 | void (*idle)(void) = pm_idle; |
diff --git a/arch/sh/kernel/syscalls.S b/arch/sh/kernel/syscalls.S index 4357d1a6358f..7db1c2dc5992 100644 --- a/arch/sh/kernel/syscalls.S +++ b/arch/sh/kernel/syscalls.S | |||
@@ -355,3 +355,6 @@ ENTRY(sys_call_table) | |||
355 | .long sys_getcpu | 355 | .long sys_getcpu |
356 | .long sys_epoll_pwait | 356 | .long sys_epoll_pwait |
357 | .long sys_utimensat /* 320 */ | 357 | .long sys_utimensat /* 320 */ |
358 | .long sys_signalfd | ||
359 | .long sys_timerfd | ||
360 | .long sys_eventfd | ||
diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c index 3a197649cd83..5b75cb6f8f9b 100644 --- a/arch/sh/kernel/traps.c +++ b/arch/sh/kernel/traps.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/bug.h> | 21 | #include <linux/bug.h> |
22 | #include <linux/debug_locks.h> | 22 | #include <linux/debug_locks.h> |
23 | #include <linux/kdebug.h> | 23 | #include <linux/kdebug.h> |
24 | #include <linux/kexec.h> | ||
24 | #include <linux/limits.h> | 25 | #include <linux/limits.h> |
25 | #include <asm/system.h> | 26 | #include <asm/system.h> |
26 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
@@ -101,6 +102,16 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
101 | 102 | ||
102 | bust_spinlocks(0); | 103 | bust_spinlocks(0); |
103 | spin_unlock_irq(&die_lock); | 104 | spin_unlock_irq(&die_lock); |
105 | |||
106 | if (kexec_should_crash(current)) | ||
107 | crash_kexec(regs); | ||
108 | |||
109 | if (in_interrupt()) | ||
110 | panic("Fatal exception in interrupt"); | ||
111 | |||
112 | if (panic_on_oops) | ||
113 | panic("Fatal exception"); | ||
114 | |||
104 | do_exit(SIGSEGV); | 115 | do_exit(SIGSEGV); |
105 | } | 116 | } |
106 | 117 | ||
@@ -513,7 +524,7 @@ static int handle_unaligned_access(u16 instruction, struct pt_regs *regs) | |||
513 | * misaligned data access | 524 | * misaligned data access |
514 | * access to >= 0x80000000 is user mode | 525 | * access to >= 0x80000000 is user mode |
515 | * Unfortuntaly we can't distinguish between instruction address error | 526 | * Unfortuntaly we can't distinguish between instruction address error |
516 | * and data address errors caused by read acceses. | 527 | * and data address errors caused by read accesses. |
517 | */ | 528 | */ |
518 | asmlinkage void do_address_error(struct pt_regs *regs, | 529 | asmlinkage void do_address_error(struct pt_regs *regs, |
519 | unsigned long writeaccess, | 530 | unsigned long writeaccess, |