Commit 1e1d137f authored by Marc Zyngier's avatar Marc Zyngier

Merge branch irq/modular-irqchips into irq/irqchip-next

* irq/modular-irqchips:
  : .
  : Update a set of irqchip drivers to be build as modules.
  :
  : This includes an Amlogic and multiple Broadcom drivers, triggering
  : a cascade of other changes (MIPS arch code, symbols being exported,
  : config changes)
  : .
  irqchip: Fix kernel-doc parameter typo for IRQCHIP_DECLARE
  ARM: bcm: Removed forced select of interrupt controllers
  arm64: broadcom: Removed forced select of interrupt controllers
  irqchip/irq-bcm7120-l2: Switch to IRQCHIP_PLATFORM_DRIVER
  genirq: Export irq_gc_noop()
  irqchip/irq-brcmstb-l2: Switch to IRQCHIP_PLATFORM_DRIVER
  genirq: Export irq_gc_{unmask_enable,mask_disable}_reg
  irqchip/irq-bcm7038-l1: Switch to IRQCHIP_PLATFORM_DRIVER
  irqchip/irq-bcm7038-l1: Restrict affinity setting to MIPS
  irqchip/irq-bcm7038-l1: Gate use of CPU logical map to MIPS
  irqchip/irq-bcm7038-l1: Use irq_get_irq_data()
  irqchip/irq-bcm7038-l1: Remove .irq_cpu_offline()
  MIPS: BMIPS: Remove use of irq_cpu_offline
  arm64: meson: remove MESON_IRQ_GPIO selection
  irqchip/meson-gpio: Make it possible to build as a module
  irqchip: Provide stronger type checking for IRQCHIP_MATCH/IRQCHIP_DECLARE
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parents 12f04f9f b8419e7b
...@@ -161,7 +161,6 @@ config ARCH_BCM2835 ...@@ -161,7 +161,6 @@ config ARCH_BCM2835
select ARM_TIMER_SP804 select ARM_TIMER_SP804
select HAVE_ARM_ARCH_TIMER if ARCH_MULTI_V7 select HAVE_ARM_ARCH_TIMER if ARCH_MULTI_V7
select BCM2835_TIMER select BCM2835_TIMER
select BRCMSTB_L2_IRQ
select PINCTRL select PINCTRL
select PINCTRL_BCM2835 select PINCTRL_BCM2835
select MFD_CORE select MFD_CORE
...@@ -209,9 +208,6 @@ config ARCH_BRCMSTB ...@@ -209,9 +208,6 @@ config ARCH_BRCMSTB
select ARM_GIC select ARM_GIC
select ARM_ERRATA_798181 if SMP select ARM_ERRATA_798181 if SMP
select HAVE_ARM_ARCH_TIMER select HAVE_ARM_ARCH_TIMER
select BCM7038_L1_IRQ
select BRCMSTB_L2_IRQ
select BCM7120_L2_IRQ
select ZONE_DMA if ARM_LPAE select ZONE_DMA if ARM_LPAE
select SOC_BRCMSTB select SOC_BRCMSTB
select SOC_BUS select SOC_BUS
......
...@@ -44,7 +44,6 @@ config ARCH_BCM2835 ...@@ -44,7 +44,6 @@ config ARCH_BCM2835
select ARM_AMBA select ARM_AMBA
select ARM_GIC select ARM_GIC
select ARM_TIMER_SP804 select ARM_TIMER_SP804
select BRCMSTB_L2_IRQ
help help
This enables support for the Broadcom BCM2837 and BCM2711 SoC. This enables support for the Broadcom BCM2837 and BCM2711 SoC.
These SoCs are used in the Raspberry Pi 3 and 4 devices. These SoCs are used in the Raspberry Pi 3 and 4 devices.
...@@ -82,8 +81,6 @@ config ARCH_BITMAIN ...@@ -82,8 +81,6 @@ config ARCH_BITMAIN
config ARCH_BRCMSTB config ARCH_BRCMSTB
bool "Broadcom Set-Top-Box SoCs" bool "Broadcom Set-Top-Box SoCs"
select ARCH_HAS_RESET_CONTROLLER select ARCH_HAS_RESET_CONTROLLER
select BCM7038_L1_IRQ
select BRCMSTB_L2_IRQ
select GENERIC_IRQ_CHIP select GENERIC_IRQ_CHIP
select PINCTRL select PINCTRL
help help
...@@ -167,7 +164,6 @@ config ARCH_MEDIATEK ...@@ -167,7 +164,6 @@ config ARCH_MEDIATEK
config ARCH_MESON config ARCH_MESON
bool "Amlogic Platforms" bool "Amlogic Platforms"
select COMMON_CLK select COMMON_CLK
select MESON_IRQ_GPIO
help help
This enables support for the arm64 based Amlogic SoCs This enables support for the arm64 based Amlogic SoCs
such as the s905, S905X/D, S912, A113X/D or S905X/D2 such as the s905, S905X/D, S912, A113X/D or S905X/D2
......
...@@ -1782,6 +1782,7 @@ config CPU_BMIPS ...@@ -1782,6 +1782,7 @@ config CPU_BMIPS
select CPU_HAS_PREFETCH select CPU_HAS_PREFETCH
select CPU_SUPPORTS_CPUFREQ select CPU_SUPPORTS_CPUFREQ
select MIPS_EXTERNAL_TIMER select MIPS_EXTERNAL_TIMER
select GENERIC_IRQ_MIGRATION if HOTPLUG_CPU
help help
Support for BMIPS32/3300/4350/4380 and BMIPS5000 processors. Support for BMIPS32/3300/4350/4380 and BMIPS5000 processors.
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/bug.h> #include <linux/bug.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/kexec.h> #include <linux/kexec.h>
#include <linux/irq.h>
#include <asm/time.h> #include <asm/time.h>
#include <asm/processor.h> #include <asm/processor.h>
...@@ -373,7 +374,7 @@ static int bmips_cpu_disable(void) ...@@ -373,7 +374,7 @@ static int bmips_cpu_disable(void)
set_cpu_online(cpu, false); set_cpu_online(cpu, false);
calculate_cpu_foreign_map(); calculate_cpu_foreign_map();
irq_cpu_offline(); irq_migrate_all_off_this_cpu();
clear_c0_status(IE_IRQ5); clear_c0_status(IE_IRQ5);
local_flush_tlb_all(); local_flush_tlb_all();
......
...@@ -115,18 +115,24 @@ config BCM6345_L1_IRQ ...@@ -115,18 +115,24 @@ config BCM6345_L1_IRQ
select GENERIC_IRQ_EFFECTIVE_AFF_MASK select GENERIC_IRQ_EFFECTIVE_AFF_MASK
config BCM7038_L1_IRQ config BCM7038_L1_IRQ
bool tristate "Broadcom STB 7038-style L1/L2 interrupt controller driver"
depends on ARCH_BRCMSTB || BMIPS_GENERIC
default ARCH_BRCMSTB || BMIPS_GENERIC
select GENERIC_IRQ_CHIP select GENERIC_IRQ_CHIP
select IRQ_DOMAIN select IRQ_DOMAIN
select GENERIC_IRQ_EFFECTIVE_AFF_MASK select GENERIC_IRQ_EFFECTIVE_AFF_MASK
config BCM7120_L2_IRQ config BCM7120_L2_IRQ
bool tristate "Broadcom STB 7120-style L2 interrupt controller driver"
depends on ARCH_BRCMSTB || BMIPS_GENERIC
default ARCH_BRCMSTB || BMIPS_GENERIC
select GENERIC_IRQ_CHIP select GENERIC_IRQ_CHIP
select IRQ_DOMAIN select IRQ_DOMAIN
config BRCMSTB_L2_IRQ config BRCMSTB_L2_IRQ
bool tristate "Broadcom STB generic L2 interrupt controller driver"
depends on ARCH_BCM2835 || ARCH_BRCMSTB || BMIPS_GENERIC
default ARCH_BCM2835 || ARCH_BRCMSTB || BMIPS_GENERIC
select GENERIC_IRQ_CHIP select GENERIC_IRQ_CHIP
select IRQ_DOMAIN select IRQ_DOMAIN
...@@ -400,8 +406,9 @@ config IRQ_UNIPHIER_AIDET ...@@ -400,8 +406,9 @@ config IRQ_UNIPHIER_AIDET
Support for the UniPhier AIDET (ARM Interrupt Detector). Support for the UniPhier AIDET (ARM Interrupt Detector).
config MESON_IRQ_GPIO config MESON_IRQ_GPIO
bool "Meson GPIO Interrupt Multiplexer" tristate "Meson GPIO Interrupt Multiplexer"
depends on ARCH_MESON depends on ARCH_MESON || COMPILE_TEST
default ARCH_MESON
select IRQ_DOMAIN_HIERARCHY select IRQ_DOMAIN_HIERARCHY
help help
Support Meson SoC Family GPIO Interrupt Multiplexer Support Meson SoC Family GPIO Interrupt Multiplexer
......
...@@ -28,9 +28,6 @@ ...@@ -28,9 +28,6 @@
#include <linux/irqchip.h> #include <linux/irqchip.h>
#include <linux/irqchip/chained_irq.h> #include <linux/irqchip/chained_irq.h>
#include <linux/syscore_ops.h> #include <linux/syscore_ops.h>
#ifdef CONFIG_ARM
#include <asm/smp_plat.h>
#endif
#define IRQS_PER_WORD 32 #define IRQS_PER_WORD 32
#define REG_BYTES_PER_IRQ_WORD (sizeof(u32) * 4) #define REG_BYTES_PER_IRQ_WORD (sizeof(u32) * 4)
...@@ -127,7 +124,7 @@ static void bcm7038_l1_irq_handle(struct irq_desc *desc) ...@@ -127,7 +124,7 @@ static void bcm7038_l1_irq_handle(struct irq_desc *desc)
struct irq_chip *chip = irq_desc_get_chip(desc); struct irq_chip *chip = irq_desc_get_chip(desc);
unsigned int idx; unsigned int idx;
#ifdef CONFIG_SMP #if defined(CONFIG_SMP) && defined(CONFIG_MIPS)
cpu = intc->cpus[cpu_logical_map(smp_processor_id())]; cpu = intc->cpus[cpu_logical_map(smp_processor_id())];
#else #else
cpu = intc->cpus[0]; cpu = intc->cpus[0];
...@@ -194,6 +191,7 @@ static void bcm7038_l1_mask(struct irq_data *d) ...@@ -194,6 +191,7 @@ static void bcm7038_l1_mask(struct irq_data *d)
raw_spin_unlock_irqrestore(&intc->lock, flags); raw_spin_unlock_irqrestore(&intc->lock, flags);
} }
#if defined(CONFIG_MIPS) && defined(CONFIG_SMP)
static int bcm7038_l1_set_affinity(struct irq_data *d, static int bcm7038_l1_set_affinity(struct irq_data *d,
const struct cpumask *dest, const struct cpumask *dest,
bool force) bool force)
...@@ -220,32 +218,6 @@ static int bcm7038_l1_set_affinity(struct irq_data *d, ...@@ -220,32 +218,6 @@ static int bcm7038_l1_set_affinity(struct irq_data *d,
return 0; return 0;
} }
#ifdef CONFIG_SMP
static void bcm7038_l1_cpu_offline(struct irq_data *d)
{
struct cpumask *mask = irq_data_get_affinity_mask(d);
int cpu = smp_processor_id();
cpumask_t new_affinity;
/* This CPU was not on the affinity mask */
if (!cpumask_test_cpu(cpu, mask))
return;
if (cpumask_weight(mask) > 1) {
/*
* Multiple CPU affinity, remove this CPU from the affinity
* mask
*/
cpumask_copy(&new_affinity, mask);
cpumask_clear_cpu(cpu, &new_affinity);
} else {
/* Only CPU, put on the lowest online CPU */
cpumask_clear(&new_affinity);
cpumask_set_cpu(cpumask_first(cpu_online_mask), &new_affinity);
}
irq_set_affinity_locked(d, &new_affinity, false);
}
#endif #endif
static int __init bcm7038_l1_init_one(struct device_node *dn, static int __init bcm7038_l1_init_one(struct device_node *dn,
...@@ -328,7 +300,7 @@ static int bcm7038_l1_suspend(void) ...@@ -328,7 +300,7 @@ static int bcm7038_l1_suspend(void)
u32 val; u32 val;
/* Wakeup interrupt should only come from the boot cpu */ /* Wakeup interrupt should only come from the boot cpu */
#ifdef CONFIG_SMP #if defined(CONFIG_SMP) && defined(CONFIG_MIPS)
boot_cpu = cpu_logical_map(0); boot_cpu = cpu_logical_map(0);
#else #else
boot_cpu = 0; boot_cpu = 0;
...@@ -352,7 +324,7 @@ static void bcm7038_l1_resume(void) ...@@ -352,7 +324,7 @@ static void bcm7038_l1_resume(void)
struct bcm7038_l1_chip *intc; struct bcm7038_l1_chip *intc;
int boot_cpu, word; int boot_cpu, word;
#ifdef CONFIG_SMP #if defined(CONFIG_SMP) && defined(CONFIG_MIPS)
boot_cpu = cpu_logical_map(0); boot_cpu = cpu_logical_map(0);
#else #else
boot_cpu = 0; boot_cpu = 0;
...@@ -395,9 +367,8 @@ static struct irq_chip bcm7038_l1_irq_chip = { ...@@ -395,9 +367,8 @@ static struct irq_chip bcm7038_l1_irq_chip = {
.name = "bcm7038-l1", .name = "bcm7038-l1",
.irq_mask = bcm7038_l1_mask, .irq_mask = bcm7038_l1_mask,
.irq_unmask = bcm7038_l1_unmask, .irq_unmask = bcm7038_l1_unmask,
#if defined(CONFIG_SMP) && defined(CONFIG_MIPS)
.irq_set_affinity = bcm7038_l1_set_affinity, .irq_set_affinity = bcm7038_l1_set_affinity,
#ifdef CONFIG_SMP
.irq_cpu_offline = bcm7038_l1_cpu_offline,
#endif #endif
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
.irq_set_wake = bcm7038_l1_set_wake, .irq_set_wake = bcm7038_l1_set_wake,
...@@ -416,7 +387,7 @@ static int bcm7038_l1_map(struct irq_domain *d, unsigned int virq, ...@@ -416,7 +387,7 @@ static int bcm7038_l1_map(struct irq_domain *d, unsigned int virq,
irq_set_chip_and_handler(virq, &bcm7038_l1_irq_chip, handle_level_irq); irq_set_chip_and_handler(virq, &bcm7038_l1_irq_chip, handle_level_irq);
irq_set_chip_data(virq, d->host_data); irq_set_chip_data(virq, d->host_data);
irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(virq))); irqd_set_single_target(irq_get_irq_data(virq));
return 0; return 0;
} }
...@@ -484,4 +455,8 @@ static int __init bcm7038_l1_of_init(struct device_node *dn, ...@@ -484,4 +455,8 @@ static int __init bcm7038_l1_of_init(struct device_node *dn,
return ret; return ret;
} }
IRQCHIP_DECLARE(bcm7038_l1, "brcm,bcm7038-l1-intc", bcm7038_l1_of_init); IRQCHIP_PLATFORM_DRIVER_BEGIN(bcm7038_l1)
IRQCHIP_MATCH("brcm,bcm7038-l1-intc", bcm7038_l1_of_init)
IRQCHIP_PLATFORM_DRIVER_END(bcm7038_l1)
MODULE_DESCRIPTION("Broadcom STB 7038-style L1/L2 interrupt controller");
MODULE_LICENSE("GPL v2");
...@@ -220,6 +220,7 @@ static int __init bcm7120_l2_intc_probe(struct device_node *dn, ...@@ -220,6 +220,7 @@ static int __init bcm7120_l2_intc_probe(struct device_node *dn,
{ {
unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN; unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
struct bcm7120_l2_intc_data *data; struct bcm7120_l2_intc_data *data;
struct platform_device *pdev;
struct irq_chip_generic *gc; struct irq_chip_generic *gc;
struct irq_chip_type *ct; struct irq_chip_type *ct;
int ret = 0; int ret = 0;
...@@ -230,7 +231,13 @@ static int __init bcm7120_l2_intc_probe(struct device_node *dn, ...@@ -230,7 +231,13 @@ static int __init bcm7120_l2_intc_probe(struct device_node *dn,
if (!data) if (!data)
return -ENOMEM; return -ENOMEM;
data->num_parent_irqs = of_irq_count(dn); pdev = of_find_device_by_node(dn);
if (!pdev) {
ret = -ENODEV;
goto out_free_data;
}
data->num_parent_irqs = platform_irq_count(pdev);
if (data->num_parent_irqs <= 0) { if (data->num_parent_irqs <= 0) {
pr_err("invalid number of parent interrupts\n"); pr_err("invalid number of parent interrupts\n");
ret = -ENOMEM; ret = -ENOMEM;
...@@ -329,6 +336,7 @@ static int __init bcm7120_l2_intc_probe(struct device_node *dn, ...@@ -329,6 +336,7 @@ static int __init bcm7120_l2_intc_probe(struct device_node *dn,
if (data->map_base[idx]) if (data->map_base[idx])
iounmap(data->map_base[idx]); iounmap(data->map_base[idx]);
} }
out_free_data:
kfree(data); kfree(data);
return ret; return ret;
} }
...@@ -347,8 +355,9 @@ static int __init bcm7120_l2_intc_probe_3380(struct device_node *dn, ...@@ -347,8 +355,9 @@ static int __init bcm7120_l2_intc_probe_3380(struct device_node *dn,
"BCM3380 L2"); "BCM3380 L2");
} }
IRQCHIP_DECLARE(bcm7120_l2_intc, "brcm,bcm7120-l2-intc", IRQCHIP_PLATFORM_DRIVER_BEGIN(bcm7120_l2)
bcm7120_l2_intc_probe_7120); IRQCHIP_MATCH("brcm,bcm7120-l2-intc", bcm7120_l2_intc_probe_7120)
IRQCHIP_MATCH("brcm,bcm3380-l2-intc", bcm7120_l2_intc_probe_3380)
IRQCHIP_DECLARE(bcm3380_l2_intc, "brcm,bcm3380-l2-intc", IRQCHIP_PLATFORM_DRIVER_END(bcm7120_l2)
bcm7120_l2_intc_probe_3380); MODULE_DESCRIPTION("Broadcom STB 7120-style L2 interrupt controller driver");
MODULE_LICENSE("GPL v2");
...@@ -275,16 +275,18 @@ static int __init brcmstb_l2_edge_intc_of_init(struct device_node *np, ...@@ -275,16 +275,18 @@ static int __init brcmstb_l2_edge_intc_of_init(struct device_node *np,
{ {
return brcmstb_l2_intc_of_init(np, parent, &l2_edge_intc_init); return brcmstb_l2_intc_of_init(np, parent, &l2_edge_intc_init);
} }
IRQCHIP_DECLARE(brcmstb_l2_intc, "brcm,l2-intc", brcmstb_l2_edge_intc_of_init);
IRQCHIP_DECLARE(brcmstb_hif_spi_l2_intc, "brcm,hif-spi-l2-intc",
brcmstb_l2_edge_intc_of_init);
IRQCHIP_DECLARE(brcmstb_upg_aux_aon_l2_intc, "brcm,upg-aux-aon-l2-intc",
brcmstb_l2_edge_intc_of_init);
static int __init brcmstb_l2_lvl_intc_of_init(struct device_node *np, static int __init brcmstb_l2_lvl_intc_of_init(struct device_node *np,
struct device_node *parent) struct device_node *parent)
{ {
return brcmstb_l2_intc_of_init(np, parent, &l2_lvl_intc_init); return brcmstb_l2_intc_of_init(np, parent, &l2_lvl_intc_init);
} }
IRQCHIP_DECLARE(bcm7271_l2_intc, "brcm,bcm7271-l2-intc",
brcmstb_l2_lvl_intc_of_init); IRQCHIP_PLATFORM_DRIVER_BEGIN(brcmstb_l2)
IRQCHIP_MATCH("brcm,l2-intc", brcmstb_l2_edge_intc_of_init)
IRQCHIP_MATCH("brcm,hif-spi-l2-intc", brcmstb_l2_edge_intc_of_init)
IRQCHIP_MATCH("brcm,upg-aux-aon-l2-intc", brcmstb_l2_edge_intc_of_init)
IRQCHIP_MATCH("brcm,bcm7271-l2-intc", brcmstb_l2_lvl_intc_of_init)
IRQCHIP_PLATFORM_DRIVER_END(brcmstb_l2)
MODULE_DESCRIPTION("Broadcom STB generic L2 interrupt controller");
MODULE_LICENSE("GPL v2");
...@@ -436,8 +436,7 @@ static const struct irq_domain_ops meson_gpio_irq_domain_ops = { ...@@ -436,8 +436,7 @@ static const struct irq_domain_ops meson_gpio_irq_domain_ops = {
.translate = meson_gpio_irq_domain_translate, .translate = meson_gpio_irq_domain_translate,
}; };
static int __init meson_gpio_irq_parse_dt(struct device_node *node, static int meson_gpio_irq_parse_dt(struct device_node *node, struct meson_gpio_irq_controller *ctl)
struct meson_gpio_irq_controller *ctl)
{ {
const struct of_device_id *match; const struct of_device_id *match;
int ret; int ret;
...@@ -463,8 +462,7 @@ static int __init meson_gpio_irq_parse_dt(struct device_node *node, ...@@ -463,8 +462,7 @@ static int __init meson_gpio_irq_parse_dt(struct device_node *node,
return 0; return 0;
} }
static int __init meson_gpio_irq_of_init(struct device_node *node, static int meson_gpio_irq_of_init(struct device_node *node, struct device_node *parent)
struct device_node *parent)
{ {
struct irq_domain *domain, *parent_domain; struct irq_domain *domain, *parent_domain;
struct meson_gpio_irq_controller *ctl; struct meson_gpio_irq_controller *ctl;
...@@ -521,5 +519,10 @@ static int __init meson_gpio_irq_of_init(struct device_node *node, ...@@ -521,5 +519,10 @@ static int __init meson_gpio_irq_of_init(struct device_node *node,
return ret; return ret;
} }
IRQCHIP_DECLARE(meson_gpio_intc, "amlogic,meson-gpio-intc", IRQCHIP_PLATFORM_DRIVER_BEGIN(meson_gpio_intc)
meson_gpio_irq_of_init); IRQCHIP_MATCH("amlogic,meson-gpio-intc", meson_gpio_irq_of_init)
IRQCHIP_PLATFORM_DRIVER_END(meson_gpio_intc)
MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:meson-gpio-intc");
...@@ -14,8 +14,15 @@ ...@@ -14,8 +14,15 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
/* Undefined on purpose */
extern of_irq_init_cb_t typecheck_irq_init_cb;
#define typecheck_irq_init_cb(fn) \
(__typecheck(typecheck_irq_init_cb, &fn) ? fn : fn)
/* /*
* This macro must be used by the different irqchip drivers to declare * This macro must be used by the different irqchip drivers to declare
* the association between their DT compatible string and their * the association between their DT compatible string and their
...@@ -23,17 +30,19 @@ ...@@ -23,17 +30,19 @@
* *
* @name: name that must be unique across all IRQCHIP_DECLARE of the * @name: name that must be unique across all IRQCHIP_DECLARE of the
* same file. * same file.
* @compstr: compatible string of the irqchip driver * @compat: compatible string of the irqchip driver
* @fn: initialization function * @fn: initialization function
*/ */
#define IRQCHIP_DECLARE(name, compat, fn) OF_DECLARE_2(irqchip, name, compat, fn) #define IRQCHIP_DECLARE(name, compat, fn) \
OF_DECLARE_2(irqchip, name, compat, typecheck_irq_init_cb(fn))
extern int platform_irqchip_probe(struct platform_device *pdev); extern int platform_irqchip_probe(struct platform_device *pdev);
#define IRQCHIP_PLATFORM_DRIVER_BEGIN(drv_name) \ #define IRQCHIP_PLATFORM_DRIVER_BEGIN(drv_name) \
static const struct of_device_id drv_name##_irqchip_match_table[] = { static const struct of_device_id drv_name##_irqchip_match_table[] = {
#define IRQCHIP_MATCH(compat, fn) { .compatible = compat, .data = fn }, #define IRQCHIP_MATCH(compat, fn) { .compatible = compat, \
.data = typecheck_irq_init_cb(fn), },
#define IRQCHIP_PLATFORM_DRIVER_END(drv_name) \ #define IRQCHIP_PLATFORM_DRIVER_END(drv_name) \
{}, \ {}, \
......
...@@ -25,6 +25,7 @@ static DEFINE_RAW_SPINLOCK(gc_lock); ...@@ -25,6 +25,7 @@ static DEFINE_RAW_SPINLOCK(gc_lock);
void irq_gc_noop(struct irq_data *d) void irq_gc_noop(struct irq_data *d)
{ {
} }
EXPORT_SYMBOL_GPL(irq_gc_noop);
/** /**
* irq_gc_mask_disable_reg - Mask chip via disable register * irq_gc_mask_disable_reg - Mask chip via disable register
...@@ -44,6 +45,7 @@ void irq_gc_mask_disable_reg(struct irq_data *d) ...@@ -44,6 +45,7 @@ void irq_gc_mask_disable_reg(struct irq_data *d)
*ct->mask_cache &= ~mask; *ct->mask_cache &= ~mask;
irq_gc_unlock(gc); irq_gc_unlock(gc);
} }
EXPORT_SYMBOL_GPL(irq_gc_mask_disable_reg);
/** /**
* irq_gc_mask_set_bit - Mask chip via setting bit in mask register * irq_gc_mask_set_bit - Mask chip via setting bit in mask register
...@@ -103,6 +105,7 @@ void irq_gc_unmask_enable_reg(struct irq_data *d) ...@@ -103,6 +105,7 @@ void irq_gc_unmask_enable_reg(struct irq_data *d)
*ct->mask_cache |= mask; *ct->mask_cache |= mask;
irq_gc_unlock(gc); irq_gc_unlock(gc);
} }
EXPORT_SYMBOL_GPL(irq_gc_unmask_enable_reg);
/** /**
* irq_gc_ack_set_bit - Ack pending interrupt via setting bit * irq_gc_ack_set_bit - Ack pending interrupt via setting bit
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment