diff options
-rw-r--r-- | arch/sparc/include/asm/leon.h | 4 | ||||
-rw-r--r-- | arch/sparc/kernel/irq.h | 24 | ||||
-rw-r--r-- | arch/sparc/kernel/leon_kernel.c | 13 | ||||
-rw-r--r-- | arch/sparc/kernel/pcic.c | 5 | ||||
-rw-r--r-- | arch/sparc/kernel/sun4d_irq.c | 5 | ||||
-rw-r--r-- | arch/sparc/kernel/sun4m_irq.c | 8 | ||||
-rw-r--r-- | arch/sparc/kernel/sun4m_smp.c | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/time_32.c | 11 |
8 files changed, 23 insertions, 49 deletions
diff --git a/arch/sparc/include/asm/leon.h b/arch/sparc/include/asm/leon.h index cf35a26454c8..8095be271825 100644 --- a/arch/sparc/include/asm/leon.h +++ b/arch/sparc/include/asm/leon.h | |||
@@ -321,11 +321,7 @@ extern unsigned int leon_build_device_irq(unsigned int real_irq, | |||
321 | extern void leon_update_virq_handling(unsigned int virq, | 321 | extern void leon_update_virq_handling(unsigned int virq, |
322 | irq_flow_handler_t flow_handler, | 322 | irq_flow_handler_t flow_handler, |
323 | const char *name, int do_ack); | 323 | const char *name, int do_ack); |
324 | extern void leon_clear_clock_irq(void); | ||
325 | extern void leon_load_profile_irq(int cpu, unsigned int limit); | ||
326 | extern void leon_init_timers(void); | 324 | extern void leon_init_timers(void); |
327 | extern void leon_clear_clock_irq(void); | ||
328 | extern void leon_load_profile_irq(int cpu, unsigned int limit); | ||
329 | extern void leon_trans_init(struct device_node *dp); | 325 | extern void leon_trans_init(struct device_node *dp); |
330 | extern void leon_node_init(struct device_node *dp, struct device_node ***nextp); | 326 | extern void leon_node_init(struct device_node *dp, struct device_node ***nextp); |
331 | extern void leon_init_IRQ(void); | 327 | extern void leon_init_IRQ(void); |
diff --git a/arch/sparc/kernel/irq.h b/arch/sparc/kernel/irq.h index e40ca6c0076a..f558f710ee51 100644 --- a/arch/sparc/kernel/irq.h +++ b/arch/sparc/kernel/irq.h | |||
@@ -70,6 +70,9 @@ struct sparc_config { | |||
70 | 70 | ||
71 | /* function to obtain offsett for cs period */ | 71 | /* function to obtain offsett for cs period */ |
72 | unsigned int (*get_cycles_offset)(void); | 72 | unsigned int (*get_cycles_offset)(void); |
73 | |||
74 | void (*clear_clock_irq)(void); | ||
75 | void (*load_profile_irq)(int cpu, unsigned int limit); | ||
73 | }; | 76 | }; |
74 | extern struct sparc_config sparc_config; | 77 | extern struct sparc_config sparc_config; |
75 | 78 | ||
@@ -78,27 +81,6 @@ void irq_link(unsigned int irq); | |||
78 | void irq_unlink(unsigned int irq); | 81 | void irq_unlink(unsigned int irq); |
79 | void handler_irq(unsigned int pil, struct pt_regs *regs); | 82 | void handler_irq(unsigned int pil, struct pt_regs *regs); |
80 | 83 | ||
81 | /* Dave Redman (djhr@tadpole.co.uk) | ||
82 | * changed these to function pointers.. it saves cycles and will allow | ||
83 | * the irq dependencies to be split into different files at a later date | ||
84 | * sun4m_irq.c etc so we could reduce the kernel size. | ||
85 | * Jakub Jelinek (jj@sunsite.mff.cuni.cz) | ||
86 | * Changed these to btfixup entities... It saves cycles :) | ||
87 | */ | ||
88 | |||
89 | BTFIXUPDEF_CALL(void, clear_clock_irq, void) | ||
90 | BTFIXUPDEF_CALL(void, load_profile_irq, int, unsigned int) | ||
91 | |||
92 | static inline void clear_clock_irq(void) | ||
93 | { | ||
94 | BTFIXUP_CALL(clear_clock_irq)(); | ||
95 | } | ||
96 | |||
97 | static inline void load_profile_irq(int cpu, int limit) | ||
98 | { | ||
99 | BTFIXUP_CALL(load_profile_irq)(cpu, limit); | ||
100 | } | ||
101 | |||
102 | unsigned long leon_get_irqmask(unsigned int irq); | 84 | unsigned long leon_get_irqmask(unsigned int irq); |
103 | 85 | ||
104 | #ifdef CONFIG_SMP | 86 | #ifdef CONFIG_SMP |
diff --git a/arch/sparc/kernel/leon_kernel.c b/arch/sparc/kernel/leon_kernel.c index 1770b3c1cc74..77c1b916e4dd 100644 --- a/arch/sparc/kernel/leon_kernel.c +++ b/arch/sparc/kernel/leon_kernel.c | |||
@@ -463,11 +463,11 @@ bad: | |||
463 | return; | 463 | return; |
464 | } | 464 | } |
465 | 465 | ||
466 | void leon_clear_clock_irq(void) | 466 | static void leon_clear_clock_irq(void) |
467 | { | 467 | { |
468 | } | 468 | } |
469 | 469 | ||
470 | void leon_load_profile_irq(int cpu, unsigned int limit) | 470 | static void leon_load_profile_irq(int cpu, unsigned int limit) |
471 | { | 471 | { |
472 | } | 472 | } |
473 | 473 | ||
@@ -517,12 +517,9 @@ void __init leon_init_IRQ(void) | |||
517 | { | 517 | { |
518 | sparc_config.init_timers = leon_init_timers; | 518 | sparc_config.init_timers = leon_init_timers; |
519 | sparc_config.build_device_irq = _leon_build_device_irq; | 519 | sparc_config.build_device_irq = _leon_build_device_irq; |
520 | sparc_config.clock_rate = 1000000; | 520 | sparc_config.clock_rate = 1000000; |
521 | 521 | sparc_config.clear_clock_irq = leon_clear_clock_irq; | |
522 | BTFIXUPSET_CALL(clear_clock_irq, leon_clear_clock_irq, | 522 | sparc_config.load_profile_irq = leon_load_profile_irq; |
523 | BTFIXUPCALL_NORM); | ||
524 | BTFIXUPSET_CALL(load_profile_irq, leon_load_profile_irq, | ||
525 | BTFIXUPCALL_NOP); | ||
526 | } | 523 | } |
527 | 524 | ||
528 | void __init leon_init(void) | 525 | void __init leon_init(void) |
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c index f0ec9396a408..ded3f6090c3f 100644 --- a/arch/sparc/kernel/pcic.c +++ b/arch/sparc/kernel/pcic.c | |||
@@ -880,9 +880,8 @@ static void pcic_load_profile_irq(int cpu, unsigned int limit) | |||
880 | void __init sun4m_pci_init_IRQ(void) | 880 | void __init sun4m_pci_init_IRQ(void) |
881 | { | 881 | { |
882 | sparc_config.build_device_irq = pcic_build_device_irq; | 882 | sparc_config.build_device_irq = pcic_build_device_irq; |
883 | 883 | sparc_config.clear_clock_irq = pcic_clear_clock_irq; | |
884 | BTFIXUPSET_CALL(clear_clock_irq, pcic_clear_clock_irq, BTFIXUPCALL_NORM); | 884 | sparc_config.load_profile_irq = pcic_load_profile_irq; |
885 | BTFIXUPSET_CALL(load_profile_irq, pcic_load_profile_irq, BTFIXUPCALL_NORM); | ||
886 | } | 885 | } |
887 | 886 | ||
888 | int pcibios_assign_resource(struct pci_dev *pdev, int resource) | 887 | int pcibios_assign_resource(struct pci_dev *pdev, int resource) |
diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c index e8e4f1411585..e490ac9327c7 100644 --- a/arch/sparc/kernel/sun4d_irq.c +++ b/arch/sparc/kernel/sun4d_irq.c | |||
@@ -506,12 +506,11 @@ void __init sun4d_init_IRQ(void) | |||
506 | { | 506 | { |
507 | local_irq_disable(); | 507 | local_irq_disable(); |
508 | 508 | ||
509 | BTFIXUPSET_CALL(clear_clock_irq, sun4d_clear_clock_irq, BTFIXUPCALL_NORM); | ||
510 | BTFIXUPSET_CALL(load_profile_irq, sun4d_load_profile_irq, BTFIXUPCALL_NORM); | ||
511 | |||
512 | sparc_config.init_timers = sun4d_init_timers; | 509 | sparc_config.init_timers = sun4d_init_timers; |
513 | sparc_config.build_device_irq = sun4d_build_device_irq; | 510 | sparc_config.build_device_irq = sun4d_build_device_irq; |
514 | sparc_config.clock_rate = SBUS_CLOCK_RATE; | 511 | sparc_config.clock_rate = SBUS_CLOCK_RATE; |
512 | sparc_config.clear_clock_irq = sun4d_clear_clock_irq; | ||
513 | sparc_config.load_profile_irq = sun4d_load_profile_irq; | ||
515 | 514 | ||
516 | /* Cannot enable interrupts until OBP ticker is disabled. */ | 515 | /* Cannot enable interrupts until OBP ticker is disabled. */ |
517 | } | 516 | } |
diff --git a/arch/sparc/kernel/sun4m_irq.c b/arch/sparc/kernel/sun4m_irq.c index eb2c277aaf94..c5ade9d27a1d 100644 --- a/arch/sparc/kernel/sun4m_irq.c +++ b/arch/sparc/kernel/sun4m_irq.c | |||
@@ -462,12 +462,12 @@ void __init sun4m_init_IRQ(void) | |||
462 | if (num_cpu_iregs == 4) | 462 | if (num_cpu_iregs == 4) |
463 | sbus_writel(0, &sun4m_irq_global->interrupt_target); | 463 | sbus_writel(0, &sun4m_irq_global->interrupt_target); |
464 | 464 | ||
465 | BTFIXUPSET_CALL(clear_clock_irq, sun4m_clear_clock_irq, BTFIXUPCALL_NORM); | 465 | sparc_config.init_timers = sun4m_init_timers; |
466 | BTFIXUPSET_CALL(load_profile_irq, sun4m_load_profile_irq, BTFIXUPCALL_NORM); | ||
467 | |||
468 | sparc_config.init_timers = sun4m_init_timers; | ||
469 | sparc_config.build_device_irq = sun4m_build_device_irq; | 466 | sparc_config.build_device_irq = sun4m_build_device_irq; |
470 | sparc_config.clock_rate = SBUS_CLOCK_RATE; | 467 | sparc_config.clock_rate = SBUS_CLOCK_RATE; |
468 | sparc_config.clear_clock_irq = sun4m_clear_clock_irq; | ||
469 | sparc_config.load_profile_irq = sun4m_load_profile_irq; | ||
470 | |||
471 | 471 | ||
472 | /* Cannot enable interrupts until OBP ticker is disabled. */ | 472 | /* Cannot enable interrupts until OBP ticker is disabled. */ |
473 | } | 473 | } |
diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index ee21c4375a90..960e8ab47b12 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c | |||
@@ -268,7 +268,7 @@ void smp4m_percpu_timer_interrupt(struct pt_regs *regs) | |||
268 | if (ce->mode & CLOCK_EVT_MODE_PERIODIC) | 268 | if (ce->mode & CLOCK_EVT_MODE_PERIODIC) |
269 | sun4m_clear_profile_irq(cpu); | 269 | sun4m_clear_profile_irq(cpu); |
270 | else | 270 | else |
271 | load_profile_irq(cpu, 0); /* Is this needless? */ | 271 | sparc_config.load_profile_irq(cpu, 0); /* Is this needless? */ |
272 | 272 | ||
273 | irq_enter(); | 273 | irq_enter(); |
274 | ce->event_handler(ce); | 274 | ce->event_handler(ce); |
diff --git a/arch/sparc/kernel/time_32.c b/arch/sparc/kernel/time_32.c index 1e25a7ab1ea5..459cf66c143c 100644 --- a/arch/sparc/kernel/time_32.c +++ b/arch/sparc/kernel/time_32.c | |||
@@ -95,10 +95,10 @@ irqreturn_t notrace timer_interrupt(int dummy, void *dev_id) | |||
95 | if (timer_cs_enabled) { | 95 | if (timer_cs_enabled) { |
96 | write_seqlock(&timer_cs_lock); | 96 | write_seqlock(&timer_cs_lock); |
97 | timer_cs_internal_counter++; | 97 | timer_cs_internal_counter++; |
98 | clear_clock_irq(); | 98 | sparc_config.clear_clock_irq(); |
99 | write_sequnlock(&timer_cs_lock); | 99 | write_sequnlock(&timer_cs_lock); |
100 | } else { | 100 | } else { |
101 | clear_clock_irq(); | 101 | sparc_config.clear_clock_irq(); |
102 | } | 102 | } |
103 | 103 | ||
104 | if (timer_ce_enabled) | 104 | if (timer_ce_enabled) |
@@ -200,12 +200,13 @@ static void percpu_ce_setup(enum clock_event_mode mode, | |||
200 | 200 | ||
201 | switch (mode) { | 201 | switch (mode) { |
202 | case CLOCK_EVT_MODE_PERIODIC: | 202 | case CLOCK_EVT_MODE_PERIODIC: |
203 | load_profile_irq(cpu, SBUS_CLOCK_RATE / HZ); | 203 | sparc_config.load_profile_irq(cpu, |
204 | SBUS_CLOCK_RATE / HZ); | ||
204 | break; | 205 | break; |
205 | case CLOCK_EVT_MODE_ONESHOT: | 206 | case CLOCK_EVT_MODE_ONESHOT: |
206 | case CLOCK_EVT_MODE_SHUTDOWN: | 207 | case CLOCK_EVT_MODE_SHUTDOWN: |
207 | case CLOCK_EVT_MODE_UNUSED: | 208 | case CLOCK_EVT_MODE_UNUSED: |
208 | load_profile_irq(cpu, 0); | 209 | sparc_config.load_profile_irq(cpu, 0); |
209 | break; | 210 | break; |
210 | default: | 211 | default: |
211 | break; | 212 | break; |
@@ -218,7 +219,7 @@ static int percpu_ce_set_next_event(unsigned long delta, | |||
218 | int cpu = __first_cpu(evt->cpumask); | 219 | int cpu = __first_cpu(evt->cpumask); |
219 | unsigned int next = (unsigned int)delta; | 220 | unsigned int next = (unsigned int)delta; |
220 | 221 | ||
221 | load_profile_irq(cpu, next); | 222 | sparc_config.load_profile_irq(cpu, next); |
222 | return 0; | 223 | return 0; |
223 | } | 224 | } |
224 | 225 | ||