From 8679976d2ec08db4e4a14ecdd1ee022b70e51fc6 Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Tue, 30 Apr 2013 11:26:53 +0200 Subject: [PATCH 12/13] MIPS: BCM63XX: add cpumask argument to unmask Allow selective unmasking of IPIC irqs. Signed-off-by: Jonas Gorski --- arch/mips/bcm63xx/irq.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) --- a/arch/mips/bcm63xx/irq.c +++ b/arch/mips/bcm63xx/irq.c @@ -24,8 +24,10 @@ static void __dispatch_internal_32(int c static void __dispatch_internal_64(int cpu) __maybe_unused; static void __internal_irq_mask_32(unsigned int irq) __maybe_unused; static void __internal_irq_mask_64(unsigned int irq) __maybe_unused; -static void __internal_irq_unmask_32(unsigned int irq) __maybe_unused; -static void __internal_irq_unmask_64(unsigned int irq) __maybe_unused; +static void __internal_irq_unmask_32(unsigned int irq, + const struct cpumask *dest) __maybe_unused; +static void __internal_irq_unmask_64(unsigned int irq, + const struct cpumask *dest) __maybe_unused; static DEFINE_SPINLOCK(ipic_lock); static DEFINE_SPINLOCK(epic_lock); @@ -150,7 +152,8 @@ static unsigned int ext_irq_count; static unsigned int ext_irq_start, ext_irq_end; static unsigned int ext_irq_cfg_reg1, ext_irq_cfg_reg2; static void (*internal_irq_mask)(unsigned int irq); -static void (*internal_irq_unmask)(unsigned int irq); +static void (*internal_irq_unmask)(unsigned int irq, + const struct cpumask *dest); static void bcm63xx_init_irq(void) { @@ -340,7 +343,8 @@ static void __internal_irq_mask_##width( } \ } \ \ -static void __internal_irq_unmask_##width(unsigned int irq) \ +static void __internal_irq_unmask_##width(unsigned int irq, \ + const struct cpumask *dest) \ { \ u32 val; \ unsigned reg = (irq / 32) ^ (width/32 - 1); \ @@ -351,7 +355,10 @@ static void __internal_irq_unmask_##widt u32 irq_mask_addr = get_irq_mask_addr(cpu); \ \ val = bcm_readl(irq_mask_addr + reg * sizeof(u32)); \ - val |= (1 << bit); \ + if (cpu_isset(cpu, *dest)) \ + val |= (1 << bit); \ + else \ + val &= ~(1 << bit); \ bcm_writel(val, irq_mask_addr + reg * sizeof(u32)); \ } \ } @@ -413,7 +420,7 @@ static void bcm63xx_internal_irq_unmask( unsigned long flags; spin_lock_irqsave(&ipic_lock, flags); - internal_irq_unmask(d->irq - IRQ_INTERNAL_BASE); + internal_irq_unmask(d->irq - IRQ_INTERNAL_BASE, cpu_online_mask); spin_unlock_irqrestore(&ipic_lock, flags); }