aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r--arch/arm/kernel/setup.c4
-rw-r--r--arch/arm/kernel/smp.c21
-rw-r--r--arch/arm/kernel/time.c7
-rw-r--r--arch/arm/kernel/vmlinux.lds.S8
4 files changed, 22 insertions, 18 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 6bbd93dd186a..29efc9f82057 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -357,6 +357,9 @@ static void __init setup_processor(void)
357#ifndef CONFIG_VFP 357#ifndef CONFIG_VFP
358 elf_hwcap &= ~HWCAP_VFP; 358 elf_hwcap &= ~HWCAP_VFP;
359#endif 359#endif
360#ifndef CONFIG_IWMMXT
361 elf_hwcap &= ~HWCAP_IWMMXT;
362#endif
360 363
361 cpu_proc_init(); 364 cpu_proc_init();
362} 365}
@@ -854,6 +857,7 @@ static const char *hwcap_str[] = {
854 "vfp", 857 "vfp",
855 "edsp", 858 "edsp",
856 "java", 859 "java",
860 "iwmmxt",
857 NULL 861 NULL
858}; 862};
859 863
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index 421329f5e18e..070bcb7a6306 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -7,6 +7,7 @@
7 * it under the terms of the GNU General Public License version 2 as 7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation. 8 * published by the Free Software Foundation.
9 */ 9 */
10#include <linux/module.h>
10#include <linux/delay.h> 11#include <linux/delay.h>
11#include <linux/init.h> 12#include <linux/init.h>
12#include <linux/spinlock.h> 13#include <linux/spinlock.h>
@@ -19,6 +20,7 @@
19#include <linux/cpu.h> 20#include <linux/cpu.h>
20#include <linux/smp.h> 21#include <linux/smp.h>
21#include <linux/seq_file.h> 22#include <linux/seq_file.h>
23#include <linux/irq.h>
22 24
23#include <asm/atomic.h> 25#include <asm/atomic.h>
24#include <asm/cacheflush.h> 26#include <asm/cacheflush.h>
@@ -449,6 +451,7 @@ int smp_call_function(void (*func)(void *info), void *info, int retry,
449 return smp_call_function_on_cpu(func, info, retry, wait, 451 return smp_call_function_on_cpu(func, info, retry, wait,
450 cpu_online_map); 452 cpu_online_map);
451} 453}
454EXPORT_SYMBOL_GPL(smp_call_function);
452 455
453void show_ipi_list(struct seq_file *p) 456void show_ipi_list(struct seq_file *p)
454{ 457{
@@ -474,25 +477,26 @@ void show_local_irqs(struct seq_file *p)
474 seq_putc(p, '\n'); 477 seq_putc(p, '\n');
475} 478}
476 479
477static void ipi_timer(struct pt_regs *regs) 480static void ipi_timer(void)
478{ 481{
479 int user = user_mode(regs);
480
481 irq_enter(); 482 irq_enter();
482 profile_tick(CPU_PROFILING, regs); 483 profile_tick(CPU_PROFILING);
483 update_process_times(user); 484 update_process_times(user_mode(get_irq_regs()));
484 irq_exit(); 485 irq_exit();
485} 486}
486 487
487#ifdef CONFIG_LOCAL_TIMERS 488#ifdef CONFIG_LOCAL_TIMERS
488asmlinkage void do_local_timer(struct pt_regs *regs) 489asmlinkage void do_local_timer(struct pt_regs *regs)
489{ 490{
491 struct pt_regs *old_regs = set_irq_regs(regs);
490 int cpu = smp_processor_id(); 492 int cpu = smp_processor_id();
491 493
492 if (local_timer_ack()) { 494 if (local_timer_ack()) {
493 irq_stat[cpu].local_timer_irqs++; 495 irq_stat[cpu].local_timer_irqs++;
494 ipi_timer(regs); 496 ipi_timer();
495 } 497 }
498
499 set_irq_regs(old_regs);
496} 500}
497#endif 501#endif
498 502
@@ -551,6 +555,7 @@ asmlinkage void do_IPI(struct pt_regs *regs)
551{ 555{
552 unsigned int cpu = smp_processor_id(); 556 unsigned int cpu = smp_processor_id();
553 struct ipi_data *ipi = &per_cpu(ipi_data, cpu); 557 struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
558 struct pt_regs *old_regs = set_irq_regs(regs);
554 559
555 ipi->ipi_count++; 560 ipi->ipi_count++;
556 561
@@ -574,7 +579,7 @@ asmlinkage void do_IPI(struct pt_regs *regs)
574 579
575 switch (nextmsg) { 580 switch (nextmsg) {
576 case IPI_TIMER: 581 case IPI_TIMER:
577 ipi_timer(regs); 582 ipi_timer();
578 break; 583 break;
579 584
580 case IPI_RESCHEDULE: 585 case IPI_RESCHEDULE:
@@ -599,6 +604,8 @@ asmlinkage void do_IPI(struct pt_regs *regs)
599 } 604 }
600 } while (msgs); 605 } while (msgs);
601 } 606 }
607
608 set_irq_regs(old_regs);
602} 609}
603 610
604void smp_send_reschedule(int cpu) 611void smp_send_reschedule(int cpu)
diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c
index c03cab5c4c79..6ff5e3ff6cb5 100644
--- a/arch/arm/kernel/time.c
+++ b/arch/arm/kernel/time.c
@@ -220,10 +220,10 @@ EXPORT_SYMBOL(leds_event);
220#ifdef CONFIG_LEDS_TIMER 220#ifdef CONFIG_LEDS_TIMER
221static inline void do_leds(void) 221static inline void do_leds(void)
222{ 222{
223 static unsigned int count = 50; 223 static unsigned int count = HZ/2;
224 224
225 if (--count == 0) { 225 if (--count == 0) {
226 count = 50; 226 count = HZ/2;
227 leds_event(led_timer); 227 leds_event(led_timer);
228 } 228 }
229} 229}
@@ -327,13 +327,12 @@ EXPORT_SYMBOL(restore_time_delta);
327 */ 327 */
328void timer_tick(void) 328void timer_tick(void)
329{ 329{
330 struct pt_regs *regs = get_irq_regs();
331 profile_tick(CPU_PROFILING); 330 profile_tick(CPU_PROFILING);
332 do_leds(); 331 do_leds();
333 do_set_rtc(); 332 do_set_rtc();
334 do_timer(1); 333 do_timer(1);
335#ifndef CONFIG_SMP 334#ifndef CONFIG_SMP
336 update_process_times(user_mode(regs)); 335 update_process_times(user_mode(get_irq_regs()));
337#endif 336#endif
338} 337}
339 338
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index 3ca574ee2772..a8fa75ea07a9 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -45,13 +45,7 @@ SECTIONS
45 *(.early_param.init) 45 *(.early_param.init)
46 __early_end = .; 46 __early_end = .;
47 __initcall_start = .; 47 __initcall_start = .;
48 *(.initcall1.init) 48 INITCALLS
49 *(.initcall2.init)
50 *(.initcall3.init)
51 *(.initcall4.init)
52 *(.initcall5.init)
53 *(.initcall6.init)
54 *(.initcall7.init)
55 __initcall_end = .; 49 __initcall_end = .;
56 __con_initcall_start = .; 50 __con_initcall_start = .;
57 *(.con_initcall.init) 51 *(.con_initcall.init)