Skip to content
Snippets Groups Projects
Commit 6e4741e7 authored by Andreas Larsson's avatar Andreas Larsson Committed by David S. Miller
Browse files

sparc32, leon: Do not overwrite previously set irq flow handlers


This is needed because when scan_of_devices finds the GAISLER_GPTIMER
core that corresponds to the SMP "ticker" timer, the previously set
proper irq flow handler gets overwritten with an incorrect one. This
leads to very flaky timer interrupt handling on some hardware. Proper
updates to handlers can still be done using leon_update_virq_handling.

Signed-off-by: default avatarAndreas Larsson <andreas@gaisler.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 75e44803
No related branches found
No related tags found
No related merge requests found
...@@ -213,6 +213,7 @@ unsigned int leon_build_device_irq(unsigned int real_irq, ...@@ -213,6 +213,7 @@ unsigned int leon_build_device_irq(unsigned int real_irq,
{ {
unsigned int irq; unsigned int irq;
unsigned long mask; unsigned long mask;
struct irq_desc *desc;
irq = 0; irq = 0;
mask = leon_get_irqmask(real_irq); mask = leon_get_irqmask(real_irq);
...@@ -226,9 +227,12 @@ unsigned int leon_build_device_irq(unsigned int real_irq, ...@@ -226,9 +227,12 @@ unsigned int leon_build_device_irq(unsigned int real_irq,
if (do_ack) if (do_ack)
mask |= LEON_DO_ACK_HW; mask |= LEON_DO_ACK_HW;
irq_set_chip_and_handler_name(irq, &leon_irq, desc = irq_to_desc(irq);
flow_handler, name); if (!desc || !desc->handle_irq || desc->handle_irq == handle_bad_irq) {
irq_set_chip_data(irq, (void *)mask); irq_set_chip_and_handler_name(irq, &leon_irq,
flow_handler, name);
irq_set_chip_data(irq, (void *)mask);
}
out: out:
return irq; return irq;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment