Message ID | 1353448867-15008-2-git-send-email-thomas.petazzoni@free-electrons.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 11/20/2012 03:00 PM, Thomas Petazzoni wrote: > With the recent creation of the drivers/irqchip/ directory, it is > desirable to move irq controller drivers here. At the moment, the only > driver here is irq-bcm2835, the driver for the irq controller found in > the ARM BCM2835 SoC, present in Rasberry Pi systems. This irq > controller driver was exporting its initialization function and its > irq handling function through a header file in > <linux/irqchip/bcm2835.h>. ... > Reviewed-by: Stephen Warren <swarren@wwwdotorg.org> That still stands as: Reviewed-by: Stephen Warren <swarren@nvidia.com> ... although I think in this case the implementation changed enough it probably shouldn't have been kept in v4. > diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig > +config IRQCHIP I wonder if it should be IRQCHIP_OF, since it's OF-specific? > + def_bool y > + depends on OF_IRQ For the drivers/clocksource patch I created, I required the architecture/machine config option to select it rather than making it a def_bool. Would that be better? I suppose if it's going to be selected in a lot of places anyway, and since the code will just be dropped if it isn't used, then making it default to on is reasonable though. > diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h > @@ -493,7 +502,8 @@ > DEV_DISCARD(init.rodata) \ > CPU_DISCARD(init.rodata) \ > MEM_DISCARD(init.rodata) \ > - KERNEL_DTB() > + KERNEL_DTB() \ > + IRQCHIP_OF_MATCH_TABLE() Does it make sense to put that before KERNEL_DTB()? I did in my drivers/clocksource patch just in case anything depended on KERNEL_DTB being last along the lines of APPENDED_DTB. That said, now that I think about it, nothing really should depend on the order...
Stephen, On Tue, 20 Nov 2012 15:40:48 -0700, Stephen Warren wrote: > > Reviewed-by: Stephen Warren <swarren@wwwdotorg.org> > > That still stands as: > > Reviewed-by: Stephen Warren <swarren@nvidia.com> > > ... although I think in this case the implementation changed enough it > probably shouldn't have been kept in v4. Indeed, my apologies. I was seeing some interest in this irqchip thing in the recent days, and I wanted to show some of the progress but have been quite busy with the mvebu development. So I was quite certainly a bit too quick. > > diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig > > > +config IRQCHIP > > I wonder if it should be IRQCHIP_OF, since it's OF-specific? > > > + def_bool y > > + depends on OF_IRQ > > For the drivers/clocksource patch I created, I required the > architecture/machine config option to select it rather than making it a > def_bool. Would that be better? I suppose if it's going to be selected > in a lot of places anyway, and since the code will just be dropped if it > isn't used, then making it default to on is reasonable though. Well, Rob Herring suggesting this def_bool y originally, I think it makes sense as all new DT platforms will most likely this mechanism for their IRQ driver. But if people feel like having a per-platform 'select IRQCHIP', I'm fine as well. > > diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h > > > @@ -493,7 +502,8 @@ > > DEV_DISCARD(init.rodata) \ > > CPU_DISCARD(init.rodata) \ > > MEM_DISCARD(init.rodata) \ > > - KERNEL_DTB() > > + KERNEL_DTB() \ > > + IRQCHIP_OF_MATCH_TABLE() > > Does it make sense to put that before KERNEL_DTB()? I did in my > drivers/clocksource patch just in case anything depended on KERNEL_DTB > being last along the lines of APPENDED_DTB. That said, now that I think > about it, nothing really should depend on the order... I haven't thought about this, and I actually booted an APPENDED_DTB kernel with this IRQCHIP_OF_MATCH_TABLE thing on Armada XP, and it worked. I admit I haven't looked in details at what this KERNEL_DTB() thing was. Thanks! Thomas
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig index 1bb8bf6..88b0929 100644 --- a/drivers/irqchip/Kconfig +++ b/drivers/irqchip/Kconfig @@ -1 +1,3 @@ -# empty +config IRQCHIP + def_bool y + depends on OF_IRQ diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile index 054321d..6b5a6e0 100644 --- a/drivers/irqchip/Makefile +++ b/drivers/irqchip/Makefile @@ -1 +1,2 @@ +obj-$(CONFIG_IRQCHIP) += irqchip.o obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.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