diff options
author | Michael Ellerman <michael@ellerman.id.au> | 2007-06-04 09:00:00 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-06-25 03:02:07 -0400 |
commit | ee51de5645edee4124db6a479d2e135ebe436748 (patch) | |
tree | ac1ceab5d8051ca458b8a5f94377eec899dc97cc | |
parent | 6fde40f3f1a9641ea0a41471cea77f34c0cbb36f (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.c | 24 | ||||
-rw-r--r-- | include/asm-powerpc/irq.h | 9 |
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 | ||
619 | unsigned 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 | |||
619 | unsigned int irq_create_mapping(struct irq_host *host, | 643 | unsigned 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); | |||
223 | extern unsigned int irq_find_mapping(struct irq_host *host, | 223 | extern 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 | */ | ||
234 | extern 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. |