irqchip: add basic infrastructure
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 of match strings and init
functions generated from a special linker section.
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>
Acked-by: Arnd Bergmann <arnd@arndb.de>
[rob.herring: reword commit message to reflect use of linker sections.]
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
2012-11-21 06:00:52 +08:00
|
|
|
/*
|
|
|
|
* 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
|
|
|
|
|
2015-09-28 22:49:13 +08:00
|
|
|
#include <linux/acpi.h>
|
2020-07-26 18:12:36 +08:00
|
|
|
#include <linux/module.h>
|
2015-07-03 03:32:00 +08:00
|
|
|
#include <linux/of.h>
|
2020-07-18 08:06:34 +08:00
|
|
|
#include <linux/platform_device.h>
|
2015-07-03 03:32:00 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This macro must be used by the different irqchip drivers to declare
|
|
|
|
* the association between their DT compatible string and their
|
|
|
|
* initialization function.
|
|
|
|
*
|
2018-12-03 18:44:51 +08:00
|
|
|
* @name: name that must be unique across all IRQCHIP_DECLARE of the
|
2015-07-03 03:32:00 +08:00
|
|
|
* same file.
|
|
|
|
* @compstr: compatible string of the irqchip driver
|
|
|
|
* @fn: initialization function
|
|
|
|
*/
|
|
|
|
#define IRQCHIP_DECLARE(name, compat, fn) OF_DECLARE_2(irqchip, name, compat, fn)
|
|
|
|
|
2020-07-18 08:06:34 +08:00
|
|
|
extern int platform_irqchip_probe(struct platform_device *pdev);
|
|
|
|
|
|
|
|
#define IRQCHIP_PLATFORM_DRIVER_BEGIN(drv_name) \
|
|
|
|
static const struct of_device_id drv_name##_irqchip_match_table[] = {
|
|
|
|
|
|
|
|
#define IRQCHIP_MATCH(compat, fn) { .compatible = compat, .data = fn },
|
|
|
|
|
|
|
|
#define IRQCHIP_PLATFORM_DRIVER_END(drv_name) \
|
|
|
|
{}, \
|
|
|
|
}; \
|
|
|
|
MODULE_DEVICE_TABLE(of, drv_name##_irqchip_match_table); \
|
|
|
|
static struct platform_driver drv_name##_driver = { \
|
|
|
|
.probe = platform_irqchip_probe, \
|
|
|
|
.driver = { \
|
|
|
|
.name = #drv_name, \
|
|
|
|
.owner = THIS_MODULE, \
|
|
|
|
.of_match_table = drv_name##_irqchip_match_table, \
|
|
|
|
.suppress_bind_attrs = true, \
|
|
|
|
}, \
|
|
|
|
}; \
|
|
|
|
builtin_platform_driver(drv_name##_driver)
|
|
|
|
|
2015-09-28 22:49:13 +08:00
|
|
|
/*
|
|
|
|
* This macro must be used by the different irqchip drivers to declare
|
|
|
|
* the association between their version and their initialization function.
|
|
|
|
*
|
2018-12-03 18:44:51 +08:00
|
|
|
* @name: name that must be unique across all IRQCHIP_ACPI_DECLARE of the
|
2015-09-28 22:49:13 +08:00
|
|
|
* same file.
|
|
|
|
* @subtable: Subtable to be identified in MADT
|
|
|
|
* @validate: Function to be called on that subtable to check its validity.
|
|
|
|
* Can be NULL.
|
|
|
|
* @data: data to be checked by the validate function.
|
|
|
|
* @fn: initialization function
|
|
|
|
*/
|
|
|
|
#define IRQCHIP_ACPI_DECLARE(name, subtable, validate, data, fn) \
|
2020-05-30 22:34:29 +08:00
|
|
|
ACPI_DECLARE_SUBTABLE_PROBE_ENTRY(irqchip, name, \
|
|
|
|
ACPI_SIG_MADT, subtable, \
|
|
|
|
validate, data, fn)
|
2015-09-28 22:49:13 +08:00
|
|
|
|
2013-05-08 21:20:04 +08:00
|
|
|
#ifdef CONFIG_IRQCHIP
|
irqchip: add basic infrastructure
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 of match strings and init
functions generated from a special linker section.
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>
Acked-by: Arnd Bergmann <arnd@arndb.de>
[rob.herring: reword commit message to reflect use of linker sections.]
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
2012-11-21 06:00:52 +08:00
|
|
|
void irqchip_init(void);
|
2013-05-08 21:20:04 +08:00
|
|
|
#else
|
|
|
|
static inline void irqchip_init(void) {}
|
|
|
|
#endif
|
irqchip: add basic infrastructure
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 of match strings and init
functions generated from a special linker section.
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>
Acked-by: Arnd Bergmann <arnd@arndb.de>
[rob.herring: reword commit message to reflect use of linker sections.]
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
2012-11-21 06:00:52 +08:00
|
|
|
|
|
|
|
#endif
|