diff options
| -rw-r--r-- | arch/arc/kernel/intc-arcv2.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/arc/kernel/intc-arcv2.c b/arch/arc/kernel/intc-arcv2.c index 26c156827479..0394f9f61b46 100644 --- a/arch/arc/kernel/intc-arcv2.c +++ b/arch/arc/kernel/intc-arcv2.c | |||
| @@ -106,10 +106,21 @@ static struct irq_chip arcv2_irq_chip = { | |||
| 106 | static int arcv2_irq_map(struct irq_domain *d, unsigned int irq, | 106 | static int arcv2_irq_map(struct irq_domain *d, unsigned int irq, |
| 107 | irq_hw_number_t hw) | 107 | irq_hw_number_t hw) |
| 108 | { | 108 | { |
| 109 | if (irq == TIMER0_IRQ || irq == IPI_IRQ) | 109 | /* |
| 110 | * core intc IRQs [16, 23]: | ||
| 111 | * Statically assigned always private-per-core (Timers, WDT, IPI, PCT) | ||
| 112 | */ | ||
| 113 | if (hw < 24) { | ||
| 114 | /* | ||
| 115 | * A subsequent request_percpu_irq() fails if percpu_devid is | ||
| 116 | * not set. That in turns sets NOAUTOEN, meaning each core needs | ||
| 117 | * to call enable_percpu_irq() | ||
| 118 | */ | ||
| 119 | irq_set_percpu_devid(irq); | ||
| 110 | irq_set_chip_and_handler(irq, &arcv2_irq_chip, handle_percpu_irq); | 120 | irq_set_chip_and_handler(irq, &arcv2_irq_chip, handle_percpu_irq); |
| 111 | else | 121 | } else { |
| 112 | irq_set_chip_and_handler(irq, &arcv2_irq_chip, handle_level_irq); | 122 | irq_set_chip_and_handler(irq, &arcv2_irq_chip, handle_level_irq); |
| 123 | } | ||
| 113 | 124 | ||
| 114 | return 0; | 125 | return 0; |
| 115 | } | 126 | } |
