summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorNoam Camus <noamc@ezchip.com>2013-02-28 11:07:06 +0200
committerVineet Gupta <vgupta@synopsys.com>2014-06-26 11:58:25 +0530
commit7e5122190b47c2574eda26aa0bbda693b2821449 (patch)
tree1915b48d1e4738c77870222c804d48f461b627c9 /arch
parenta4b6cb735b25aa84a462a1985e3e43bebaf5beb4 (diff)
downloadlinux-7e5122190b47c2574eda26aa0bbda693b2821449.tar.gz
linux-7e5122190b47c2574eda26aa0bbda693b2821449.tar.bz2
linux-7e5122190b47c2574eda26aa0bbda693b2821449.zip
ARC: [SMP] Fix IPI IRQ registration
Handle it just like timer. Current request_percpu_irq() would fail on non-boot cpus and thus IRQ will remian unmasked on those cpus. [vgupta: fix changelong] Signed-off-by: Noam Camus <noamc@ezchip.com> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arc/kernel/smp.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/arc/kernel/smp.c b/arch/arc/kernel/smp.c
index cf90b6f4d3e0..c802bb500602 100644
--- a/arch/arc/kernel/smp.c
+++ b/arch/arc/kernel/smp.c
@@ -337,8 +337,19 @@ irqreturn_t do_IPI(int irq, void *dev_id)
* API called by platform code to hookup arch-common ISR to their IPI IRQ
*/
static DEFINE_PER_CPU(int, ipi_dev);
+
+static struct irqaction arc_ipi_irq = {
+ .name = "IPI Interrupt",
+ .flags = IRQF_PERCPU,
+ .handler = do_IPI,
+};
+
int smp_ipi_irq_setup(int cpu, int irq)
{
- int *dev_id = &per_cpu(ipi_dev, smp_processor_id());
- return request_percpu_irq(irq, do_IPI, "IPI Interrupt", dev_id);
+ if (!cpu)
+ return setup_irq(irq, &arc_ipi_irq);
+ else
+ arch_unmask_irq(irq);
+
+ return 0;
}