aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r--arch/powerpc/kernel/irq.c32
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
599static 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
600unsigned int irq_create_mapping(struct irq_host *host, 619unsigned 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}
661EXPORT_SYMBOL_GPL(irq_create_mapping); 671EXPORT_SYMBOL_GPL(irq_create_mapping);