diff mbox

[01/16] irqchip: add basic infrastructure

Message ID 1353448867-15008-2-git-send-email-thomas.petazzoni@free-electrons.com (mailing list archive)
State New, archived
Headers show

Commit Message

Thomas Petazzoni Nov. 20, 2012, 10 p.m. UTC
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>.

When proposing to also move another irq controller driver in
drivers/irqchip, Rob Herring raised the very valid point that moving
things to drivers/irqchip was good in order to remove more stuff from
arch/arm, but if it means adding gazillions of headers files in
include/linux/irqchip/, it would not be very nice.

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.

A global header, <linux/irqchip.h> is also added to expose the single
irqchip_init() function to the reset of the kernel.

A further commit moves the BCM2835 irq controller driver to this new
small infrastructure, therefore removing the include/linux/irqchip/
directory.

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>
---
 drivers/irqchip/Kconfig           |    4 +++-
 drivers/irqchip/Makefile          |    1 +
 drivers/irqchip/irqchip.c         |   30 ++++++++++++++++++++++++++++++
 drivers/irqchip/irqchip.h         |   29 +++++++++++++++++++++++++++++
 include/asm-generic/vmlinux.lds.h |   12 +++++++++++-
 include/linux/irqchip.h           |   16 ++++++++++++++++
 6 files changed, 90 insertions(+), 2 deletions(-)
 create mode 100644 drivers/irqchip/irqchip.c
 create mode 100644 drivers/irqchip/irqchip.h
 create mode 100644 include/linux/irqchip.h

Comments

Stephen Warren Nov. 20, 2012, 10:40 p.m. UTC | #1
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...
Thomas Petazzoni Nov. 20, 2012, 10:54 p.m. UTC | #2
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 mbox

Patch

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