diff options
Diffstat (limited to 'arch/sparc/kernel/leon_kernel.c')
-rw-r--r-- | arch/sparc/kernel/leon_kernel.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/sparc/kernel/leon_kernel.c b/arch/sparc/kernel/leon_kernel.c index 2f538ac2e139..d17255a2bbac 100644 --- a/arch/sparc/kernel/leon_kernel.c +++ b/arch/sparc/kernel/leon_kernel.c | |||
@@ -236,6 +236,21 @@ static unsigned int _leon_build_device_irq(struct platform_device *op, | |||
236 | return leon_build_device_irq(real_irq, handle_simple_irq, "edge", 0); | 236 | return leon_build_device_irq(real_irq, handle_simple_irq, "edge", 0); |
237 | } | 237 | } |
238 | 238 | ||
239 | void leon_update_virq_handling(unsigned int virq, | ||
240 | irq_flow_handler_t flow_handler, | ||
241 | const char *name, int do_ack) | ||
242 | { | ||
243 | unsigned long mask = (unsigned long)irq_get_chip_data(virq); | ||
244 | |||
245 | mask &= ~LEON_DO_ACK_HW; | ||
246 | if (do_ack) | ||
247 | mask |= LEON_DO_ACK_HW; | ||
248 | |||
249 | irq_set_chip_and_handler_name(virq, &leon_irq, | ||
250 | flow_handler, name); | ||
251 | irq_set_chip_data(virq, (void *)mask); | ||
252 | } | ||
253 | |||
239 | void __init leon_init_timers(irq_handler_t counter_fn) | 254 | void __init leon_init_timers(irq_handler_t counter_fn) |
240 | { | 255 | { |
241 | int irq, eirq; | 256 | int irq, eirq; |
@@ -361,6 +376,22 @@ void __init leon_init_timers(irq_handler_t counter_fn) | |||
361 | prom_halt(); | 376 | prom_halt(); |
362 | } | 377 | } |
363 | 378 | ||
379 | #ifdef CONFIG_SMP | ||
380 | { | ||
381 | unsigned long flags; | ||
382 | |||
383 | /* | ||
384 | * In SMP, sun4m adds a IPI handler to IRQ trap handler that | ||
385 | * LEON never must take, sun4d and LEON overwrites the branch | ||
386 | * with a NOP. | ||
387 | */ | ||
388 | local_irq_save(flags); | ||
389 | patchme_maybe_smp_msg[0] = 0x01000000; /* NOP out the branch */ | ||
390 | local_flush_cache_all(); | ||
391 | local_irq_restore(flags); | ||
392 | } | ||
393 | #endif | ||
394 | |||
364 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, | 395 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, |
365 | LEON3_GPTIMER_EN | | 396 | LEON3_GPTIMER_EN | |
366 | LEON3_GPTIMER_RL | | 397 | LEON3_GPTIMER_RL | |