Message ID | 1357235668-9450-2-git-send-email-robherring2@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thursday 03 January 2013, Rob Herring wrote: > So, upon the suggestion of Rob Herring and Arnd Bergmann, this commit > introduces a small infrastructure that defines a central > irqchip_init() function in drivers/irqchip/irqchip.c, which is meant > to be called as the ->init_irq() callback of ARM platforms. This > function calls of_irq_init() with an array that will progressively > contain the compatible strings of each irq controller driver, and also > a reference to the initialization functions of such drivers. The > drivers/irqchip/irqchip.h header file, currently empty, is added to > allow irq controller drivers to expose their initialization function > to the main irqchip.c file. Note that the irq controller driver > initialization function is responsible for setting the global > handle_arch_irq() variable, so that ARM platforms no longer have to > define the ->handle_irq field in their DT_MACHINE structure. This changeset text looks like it refers to an older version of the patch that did not have the section magic yet. > Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> > Reviewed-by: Stephen Warren <swarren@wwwdotorg.org> > Reviewed-by: Rob Herring <rob.herring@calxeda.com> I actually liked the old version better because it was more obvious to the casual reader how it fits together, but I'm not going to stand in the way if other people like it this way. Acked-by: Arnd Bergmann <arnd@arndb.de>
On 01/03/2013 03:36 PM, Arnd Bergmann wrote: > On Thursday 03 January 2013, Rob Herring wrote: >> So, upon the suggestion of Rob Herring and Arnd Bergmann, this commit >> introduces a small infrastructure that defines a central >> irqchip_init() function in drivers/irqchip/irqchip.c, which is meant >> to be called as the ->init_irq() callback of ARM platforms. This >> function calls of_irq_init() with an array that will progressively >> contain the compatible strings of each irq controller driver, and also >> a reference to the initialization functions of such drivers. The >> drivers/irqchip/irqchip.h header file, currently empty, is added to >> allow irq controller drivers to expose their initialization function >> to the main irqchip.c file. Note that the irq controller driver >> initialization function is responsible for setting the global >> handle_arch_irq() variable, so that ARM platforms no longer have to >> define the ->handle_irq field in their DT_MACHINE structure. > > This changeset text looks like it refers to an older version of the > patch that did not have the section magic yet. > >> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> >> Reviewed-by: Stephen Warren <swarren@wwwdotorg.org> >> Reviewed-by: Rob Herring <rob.herring@calxeda.com> > > I actually liked the old version better because it was more obvious > to the casual reader how it fits together, but I'm not going to > stand in the way if other people like it this way. > > Acked-by: Arnd Bergmann <arnd@arndb.de> The timers are going down the same route, so we should agree on the direction. I was concerned too that it is a little too much magic, but it is a bit cleaner and should have fewer merge conflicts. Rob
Dear Rob Herring, On Thu, 03 Jan 2013 17:59:15 -0600, Rob Herring wrote: > The timers are going down the same route, so we should agree on the > direction. I was concerned too that it is a little too much magic, but > it is a bit cleaner and should have fewer merge conflicts. Indeed. Before doing the section magic thing, there were explicit calls, and it was causing conflicts every time I was rebasing the patch series to shuffle things around. There are already gazillions of magic ELF sections being used all over the place, so I'd say this mechanism is no longer magic for most of the kernel people nowadays. Best regards, Thomas
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig index 62ca575..93dfd8f 100644 --- a/drivers/irqchip/Kconfig +++ b/drivers/irqchip/Kconfig @@ -1,3 +1,7 @@ +config IRQCHIP + def_bool y + depends on OF_IRQ + config VERSATILE_FPGA_IRQ bool select IRQ_DOMAIN diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile index bf4609a..29b78c9 100644 --- a/drivers/irqchip/Makefile +++ b/drivers/irqchip/Makefile @@ -1,3 +1,5 @@ +obj-$(CONFIG_IRQCHIP) += irqchip.o + obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o obj-$(CONFIG_ARCH_SUNXI) += irq-sunxi.o 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 0000000..f496afc --- /dev/null +++ b/drivers/irqchip/irqchip.c @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2012 Thomas Petazzoni + * + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <linux/init.h> +#include <linux/of_irq.h> + +#include "irqchip.h" + +/* + * This special of_device_id is the sentinel at the end of the + * of_device_id[] array of all irqchips. It is automatically placed at + * the end of the array by the linker, thanks to being part of a + * special section. + */ +static const struct of_device_id +irqchip_of_match_end __used __section(__irqchip_of_end); + +extern struct of_device_id __irqchip_begin[]; + +void __init irqchip_init(void) +{ + of_irq_init(__irqchip_begin); +} diff --git a/drivers/irqchip/irqchip.h b/drivers/irqchip/irqchip.h new file mode 100644 index 0000000..e445ba2 --- /dev/null +++ b/drivers/irqchip/irqchip.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2012 Thomas Petazzoni + * + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#ifndef _IRQCHIP_H +#define _IRQCHIP_H + +/* + * This macro must be used by the different irqchip drivers to declare + * the association between their DT compatible string and their + * initialization function. + * + * @name: name that must be unique accross all IRQCHIP_DECLARE of the + * same file. + * @compstr: compatible string of the irqchip driver + * @fn: initialization function + */ +#define IRQCHIP_DECLARE(name,compstr,fn) \ + static const struct of_device_id irqchip_of_match_##name \ + __used __section(__irqchip_of_table) \ + = { .compatible = compstr, .data = fn } + +#endif diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index d1ea7ce..c80c599 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -149,6 +149,15 @@ #define TRACE_SYSCALLS() #endif +#ifdef CONFIG_IRQCHIP +#define IRQCHIP_OF_MATCH_TABLE() \ + . = ALIGN(8); \ + VMLINUX_SYMBOL(__irqchip_begin) = .; \ + *(__irqchip_of_table) \ + *(__irqchip_of_end) +#else +#define IRQCHIP_OF_MATCH_TABLE() +#endif #define KERNEL_DTB() \ STRUCT_ALIGN(); \ @@ -493,7 +502,8 @@ DEV_DISCARD(init.rodata) \ CPU_DISCARD(init.rodata) \ MEM_DISCARD(init.rodata) \ - KERNEL_DTB() + KERNEL_DTB() \ + IRQCHIP_OF_MATCH_TABLE() #define INIT_TEXT \ *(.init.text) \ diff --git a/include/linux/irqchip.h b/include/linux/irqchip.h new file mode 100644 index 0000000..e0006f1 --- /dev/null +++ b/include/linux/irqchip.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2012 Thomas Petazzoni + * + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#ifndef _LINUX_IRQCHIP_H +#define _LINUX_IRQCHIP_H + +void irqchip_init(void); + +#endif