diff options
| -rw-r--r-- | drivers/irqchip/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/irqchip/Makefile | 2 | ||||
| -rw-r--r-- | drivers/irqchip/irqchip.c | 30 | ||||
| -rw-r--r-- | drivers/irqchip/irqchip.h | 29 | ||||
| -rw-r--r-- | include/asm-generic/vmlinux.lds.h | 12 | ||||
| -rw-r--r-- | include/linux/irqchip.h | 16 |
6 files changed, 92 insertions, 1 deletions
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig index 62ca575701d3..93dfd8fa66c7 100644 --- a/drivers/irqchip/Kconfig +++ b/drivers/irqchip/Kconfig | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | config IRQCHIP | ||
| 2 | def_bool y | ||
| 3 | depends on OF_IRQ | ||
| 4 | |||
| 1 | config VERSATILE_FPGA_IRQ | 5 | config VERSATILE_FPGA_IRQ |
| 2 | bool | 6 | bool |
| 3 | select IRQ_DOMAIN | 7 | select IRQ_DOMAIN |
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile index bf4609a5bd9d..29b78c9449c8 100644 --- a/drivers/irqchip/Makefile +++ b/drivers/irqchip/Makefile | |||
| @@ -1,3 +1,5 @@ | |||
| 1 | obj-$(CONFIG_IRQCHIP) += irqchip.o | ||
| 2 | |||
| 1 | obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o | 3 | obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o |
| 2 | obj-$(CONFIG_ARCH_SUNXI) += irq-sunxi.o | 4 | obj-$(CONFIG_ARCH_SUNXI) += irq-sunxi.o |
| 3 | obj-$(CONFIG_VERSATILE_FPGA_IRQ) += irq-versatile-fpga.o | 5 | obj-$(CONFIG_VERSATILE_FPGA_IRQ) += irq-versatile-fpga.o |
diff --git a/drivers/irqchip/irqchip.c b/drivers/irqchip/irqchip.c new file mode 100644 index 000000000000..f496afce29de --- /dev/null +++ b/drivers/irqchip/irqchip.c | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2012 Thomas Petazzoni | ||
| 3 | * | ||
| 4 | * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||
| 5 | * | ||
| 6 | * This file is licensed under the terms of the GNU General Public | ||
| 7 | * License version 2. This program is licensed "as is" without any | ||
| 8 | * warranty of any kind, whether express or implied. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/init.h> | ||
| 12 | #include <linux/of_irq.h> | ||
| 13 | |||
| 14 | #include "irqchip.h" | ||
| 15 | |||
| 16 | /* | ||
| 17 | * This special of_device_id is the sentinel at the end of the | ||
| 18 | * of_device_id[] array of all irqchips. It is automatically placed at | ||
| 19 | * the end of the array by the linker, thanks to being part of a | ||
| 20 | * special section. | ||
| 21 | */ | ||
| 22 | static const struct of_device_id | ||
| 23 | irqchip_of_match_end __used __section(__irqchip_of_end); | ||
| 24 | |||
| 25 | extern struct of_device_id __irqchip_begin[]; | ||
| 26 | |||
| 27 | void __init irqchip_init(void) | ||
| 28 | { | ||
| 29 | of_irq_init(__irqchip_begin); | ||
| 30 | } | ||
diff --git a/drivers/irqchip/irqchip.h b/drivers/irqchip/irqchip.h new file mode 100644 index 000000000000..e445ba2d6add --- /dev/null +++ b/drivers/irqchip/irqchip.h | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2012 Thomas Petazzoni | ||
| 3 | * | ||
| 4 | * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||
| 5 | * | ||
| 6 | * This file is licensed under the terms of the GNU General Public | ||
| 7 | * License version 2. This program is licensed "as is" without any | ||
| 8 | * warranty of any kind, whether express or implied. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef _IRQCHIP_H | ||
| 12 | #define _IRQCHIP_H | ||
| 13 | |||
| 14 | /* | ||
| 15 | * This macro must be used by the different irqchip drivers to declare | ||
| 16 | * the association between their DT compatible string and their | ||
| 17 | * initialization function. | ||
| 18 | * | ||
| 19 | * @name: name that must be unique accross all IRQCHIP_DECLARE of the | ||
| 20 | * same file. | ||
| 21 | * @compstr: compatible string of the irqchip driver | ||
| 22 | * @fn: initialization function | ||
| 23 | */ | ||
| 24 | #define IRQCHIP_DECLARE(name,compstr,fn) \ | ||
| 25 | static const struct of_device_id irqchip_of_match_##name \ | ||
| 26 | __used __section(__irqchip_of_table) \ | ||
| 27 | = { .compatible = compstr, .data = fn } | ||
| 28 | |||
| 29 | #endif | ||
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index d1ea7ce0b4cb..c80c599897b9 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
| @@ -149,6 +149,15 @@ | |||
| 149 | #define TRACE_SYSCALLS() | 149 | #define TRACE_SYSCALLS() |
| 150 | #endif | 150 | #endif |
| 151 | 151 | ||
| 152 | #ifdef CONFIG_IRQCHIP | ||
| 153 | #define IRQCHIP_OF_MATCH_TABLE() \ | ||
| 154 | . = ALIGN(8); \ | ||
| 155 | VMLINUX_SYMBOL(__irqchip_begin) = .; \ | ||
| 156 | *(__irqchip_of_table) \ | ||
| 157 | *(__irqchip_of_end) | ||
| 158 | #else | ||
| 159 | #define IRQCHIP_OF_MATCH_TABLE() | ||
| 160 | #endif | ||
| 152 | 161 | ||
| 153 | #define KERNEL_DTB() \ | 162 | #define KERNEL_DTB() \ |
| 154 | STRUCT_ALIGN(); \ | 163 | STRUCT_ALIGN(); \ |
| @@ -493,7 +502,8 @@ | |||
| 493 | DEV_DISCARD(init.rodata) \ | 502 | DEV_DISCARD(init.rodata) \ |
| 494 | CPU_DISCARD(init.rodata) \ | 503 | CPU_DISCARD(init.rodata) \ |
| 495 | MEM_DISCARD(init.rodata) \ | 504 | MEM_DISCARD(init.rodata) \ |
| 496 | KERNEL_DTB() | 505 | KERNEL_DTB() \ |
| 506 | IRQCHIP_OF_MATCH_TABLE() | ||
| 497 | 507 | ||
| 498 | #define INIT_TEXT \ | 508 | #define INIT_TEXT \ |
| 499 | *(.init.text) \ | 509 | *(.init.text) \ |
diff --git a/include/linux/irqchip.h b/include/linux/irqchip.h new file mode 100644 index 000000000000..e0006f1d35a0 --- /dev/null +++ b/include/linux/irqchip.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2012 Thomas Petazzoni | ||
| 3 | * | ||
| 4 | * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||
| 5 | * | ||
| 6 | * This file is licensed under the terms of the GNU General Public | ||
| 7 | * License version 2. This program is licensed "as is" without any | ||
| 8 | * warranty of any kind, whether express or implied. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef _LINUX_IRQCHIP_H | ||
| 12 | #define _LINUX_IRQCHIP_H | ||
| 13 | |||
| 14 | void irqchip_init(void); | ||
| 15 | |||
| 16 | #endif | ||
