aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2007-06-04 09:00:00 -0400
committerPaul Mackerras <paulus@samba.org>2007-06-25 03:02:07 -0400
commitee51de5645edee4124db6a479d2e135ebe436748 (patch)
treeac1ceab5d8051ca458b8a5f94377eec899dc97cc
parent6fde40f3f1a9641ea0a41471cea77f34c0cbb36f (diff)
[POWERPC] Add irq_create_direct_mapping()
This patch adds irq_create_direct_mapping(). This routine is an alternative to irq_create_mapping(), for irq controllers that can use linux virq numbers directly as hardware numbers. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r--arch/powerpc/kernel/irq.c24
-rw-r--r--include/asm-powerpc/irq.h9
2 files changed, 33 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index d806b18d9ff9..a3351561d283 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -616,6 +616,30 @@ static int irq_setup_virq(struct irq_host *host, unsigned int virq,
616 return 0; 616 return 0;
617} 617}
618 618
619unsigned int irq_create_direct_mapping(struct irq_host *host)
620{
621 unsigned int virq;
622
623 if (host == NULL)
624 host = irq_default_host;
625
626 BUG_ON(host == NULL);
627 WARN_ON(host->revmap_type != IRQ_HOST_MAP_NOMAP);
628
629 virq = irq_alloc_virt(host, 1, 0);
630 if (virq == NO_IRQ) {
631 pr_debug("irq: create_direct virq allocation failed\n");
632 return NO_IRQ;
633 }
634
635 pr_debug("irq: create_direct obtained virq %d\n", virq);
636
637 if (irq_setup_virq(host, virq, virq))
638 return NO_IRQ;
639
640 return virq;
641}
642
619unsigned int irq_create_mapping(struct irq_host *host, 643unsigned int irq_create_mapping(struct irq_host *host,
620 irq_hw_number_t hwirq) 644 irq_hw_number_t hwirq)
621{ 645{
diff --git a/include/asm-powerpc/irq.h b/include/asm-powerpc/irq.h
index 05dd5a3eb3aa..0485c53db2b5 100644
--- a/include/asm-powerpc/irq.h
+++ b/include/asm-powerpc/irq.h
@@ -223,6 +223,15 @@ extern void irq_dispose_mapping(unsigned int virq);
223extern unsigned int irq_find_mapping(struct irq_host *host, 223extern unsigned int irq_find_mapping(struct irq_host *host,
224 irq_hw_number_t hwirq); 224 irq_hw_number_t hwirq);
225 225
226/**
227 * irq_create_direct_mapping - Allocate a virq for direct mapping
228 * @host: host to allocate the virq for or NULL for default host
229 *
230 * This routine is used for irq controllers which can choose the hardware
231 * interrupt numbers they generate. In such a case it's simplest to use
232 * the linux virq as the hardware interrupt number.
233 */
234extern unsigned int irq_create_direct_mapping(struct irq_host *host);
226 235
227/** 236/**
228 * irq_radix_revmap - Find a linux virq from a hw irq number. 237 * irq_radix_revmap - Find a linux virq from a hw irq number.