aboutsummaryrefslogtreecommitdiffstats
path: root/arch/xtensa/kernel/irq.c
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2012-11-03 16:30:13 -0400
committerChris Zankel <chris@zankel.net>2012-12-19 00:10:23 -0500
commitda844a81779e2bb263eca4ecb1046541fdb11cf8 (patch)
tree22f332194e7c13b1b4e2f9715c047722d0dd958a /arch/xtensa/kernel/irq.c
parent2206d5dd9a785a74afc6981f2b13b7a4d4da6f31 (diff)
xtensa: add device trees support
Device trees allow specification of hardware topology and device parameters at runtime instead of hard-coding them in platform setup code. This allows running single binary kernel on a range of compatible boards. New boot parameters tag BP_TAG_FDT is allocated and a pointer to flat device tree is passed in it. Note that current interrupt mapping scheme uses single cell for interrupt identification. That means that IRQ numbers used in DTS must be CPU internal IRQ numbers, not external. It is possible to extend interrupt identification to two cells, and use second cell to tell external IRQ numbers form internal. That would allow to use single DTS on multiple boards with different mapping of external IRQ numbers. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> Signed-off-by: Chris Zankel <chris@zankel.net>
Diffstat (limited to 'arch/xtensa/kernel/irq.c')
-rw-r--r--arch/xtensa/kernel/irq.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/arch/xtensa/kernel/irq.c b/arch/xtensa/kernel/irq.c
index e90d78211195..6f4f9749cff7 100644
--- a/arch/xtensa/kernel/irq.c
+++ b/arch/xtensa/kernel/irq.c
@@ -19,6 +19,7 @@
19#include <linux/irq.h> 19#include <linux/irq.h>
20#include <linux/kernel_stat.h> 20#include <linux/kernel_stat.h>
21#include <linux/irqdomain.h> 21#include <linux/irqdomain.h>
22#include <linux/of.h>
22 23
23#include <asm/uaccess.h> 24#include <asm/uaccess.h>
24#include <asm/platform.h> 25#include <asm/platform.h>
@@ -199,8 +200,17 @@ void __init init_IRQ(void)
199 cached_irq_mask = 0; 200 cached_irq_mask = 0;
200 set_sr(~0, intclear); 201 set_sr(~0, intclear);
201 202
203#ifdef CONFIG_OF
204 /* The interrupt controller device node is mandatory */
205 intc = of_find_compatible_node(NULL, NULL, "xtensa,pic");
206 BUG_ON(!intc);
207
208 root_domain = irq_domain_add_linear(intc, NR_IRQS,
209 &xtensa_irq_domain_ops, NULL);
210#else
202 root_domain = irq_domain_add_legacy(intc, NR_IRQS, 0, 0, 211 root_domain = irq_domain_add_legacy(intc, NR_IRQS, 0, 0,
203 &xtensa_irq_domain_ops, NULL); 212 &xtensa_irq_domain_ops, NULL);
213#endif
204 irq_set_default_host(root_domain); 214 irq_set_default_host(root_domain);
205 215
206 variant_init_irq(); 216 variant_init_irq();