diff options
-rw-r--r-- | arch/powerpc/kernel/irq.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 0a769893c5c3..d806b18d9ff9 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -596,6 +596,25 @@ static void irq_radix_rdunlock(unsigned long flags) | |||
596 | local_irq_restore(flags); | 596 | local_irq_restore(flags); |
597 | } | 597 | } |
598 | 598 | ||
599 | static int irq_setup_virq(struct irq_host *host, unsigned int virq, | ||
600 | irq_hw_number_t hwirq) | ||
601 | { | ||
602 | /* Clear IRQ_NOREQUEST flag */ | ||
603 | get_irq_desc(virq)->status &= ~IRQ_NOREQUEST; | ||
604 | |||
605 | /* map it */ | ||
606 | smp_wmb(); | ||
607 | irq_map[virq].hwirq = hwirq; | ||
608 | smp_mb(); | ||
609 | |||
610 | if (host->ops->map(host, virq, hwirq)) { | ||
611 | pr_debug("irq: -> mapping failed, freeing\n"); | ||
612 | irq_free_virt(virq, 1); | ||
613 | return -1; | ||
614 | } | ||
615 | |||
616 | return 0; | ||
617 | } | ||
599 | 618 | ||
600 | unsigned int irq_create_mapping(struct irq_host *host, | 619 | unsigned int irq_create_mapping(struct irq_host *host, |
601 | irq_hw_number_t hwirq) | 620 | irq_hw_number_t hwirq) |
@@ -644,18 +663,9 @@ unsigned int irq_create_mapping(struct irq_host *host, | |||
644 | } | 663 | } |
645 | pr_debug("irq: -> obtained virq %d\n", virq); | 664 | pr_debug("irq: -> obtained virq %d\n", virq); |
646 | 665 | ||
647 | /* Clear IRQ_NOREQUEST flag */ | 666 | if (irq_setup_virq(host, virq, hwirq)) |
648 | get_irq_desc(virq)->status &= ~IRQ_NOREQUEST; | ||
649 | |||
650 | /* map it */ | ||
651 | smp_wmb(); | ||
652 | irq_map[virq].hwirq = hwirq; | ||
653 | smp_mb(); | ||
654 | if (host->ops->map(host, virq, hwirq)) { | ||
655 | pr_debug("irq: -> mapping failed, freeing\n"); | ||
656 | irq_free_virt(virq, 1); | ||
657 | return NO_IRQ; | 667 | return NO_IRQ; |
658 | } | 668 | |
659 | return virq; | 669 | return virq; |
660 | } | 670 | } |
661 | EXPORT_SYMBOL_GPL(irq_create_mapping); | 671 | EXPORT_SYMBOL_GPL(irq_create_mapping); |