From 1e54b53deae3d9b58d478639d88000b2478cd4d7 Mon Sep 17 00:00:00 2001 From: Michael Ellerman Date: Mon, 4 Jun 2007 22:59:59 +1000 Subject: [PATCH] --- yaml --- r: 60555 b: refs/heads/master c: 6fde40f3f1a9641ea0a41471cea77f34c0cbb36f h: refs/heads/master i: 60553: 32b538daacbef3268c5c95f8280ecdb648e5d902 60551: b098cb857e4bb1d717906b773f8b9cc99f893a26 v: v3 --- [refs] | 2 +- trunk/arch/powerpc/kernel/irq.c | 32 +++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index fff5efad4c35..ce71dd7d7dbb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 35923f12e42a3baf4ac6da7c05cf5f7478e5a7c6 +refs/heads/master: 6fde40f3f1a9641ea0a41471cea77f34c0cbb36f diff --git a/trunk/arch/powerpc/kernel/irq.c b/trunk/arch/powerpc/kernel/irq.c index 0a769893c5c3..d806b18d9ff9 100644 --- a/trunk/arch/powerpc/kernel/irq.c +++ b/trunk/arch/powerpc/kernel/irq.c @@ -596,6 +596,25 @@ static void irq_radix_rdunlock(unsigned long flags) local_irq_restore(flags); } +static int irq_setup_virq(struct irq_host *host, unsigned int virq, + irq_hw_number_t hwirq) +{ + /* Clear IRQ_NOREQUEST flag */ + get_irq_desc(virq)->status &= ~IRQ_NOREQUEST; + + /* map it */ + smp_wmb(); + irq_map[virq].hwirq = hwirq; + smp_mb(); + + if (host->ops->map(host, virq, hwirq)) { + pr_debug("irq: -> mapping failed, freeing\n"); + irq_free_virt(virq, 1); + return -1; + } + + return 0; +} unsigned int irq_create_mapping(struct irq_host *host, irq_hw_number_t hwirq) @@ -644,18 +663,9 @@ unsigned int irq_create_mapping(struct irq_host *host, } pr_debug("irq: -> obtained virq %d\n", virq); - /* Clear IRQ_NOREQUEST flag */ - get_irq_desc(virq)->status &= ~IRQ_NOREQUEST; - - /* map it */ - smp_wmb(); - irq_map[virq].hwirq = hwirq; - smp_mb(); - if (host->ops->map(host, virq, hwirq)) { - pr_debug("irq: -> mapping failed, freeing\n"); - irq_free_virt(virq, 1); + if (irq_setup_virq(host, virq, hwirq)) return NO_IRQ; - } + return virq; } EXPORT_SYMBOL_GPL(irq_create_mapping);