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: Marc Zyngier <maz@kernel.org>
This commit is contained in:
commit
1e1d137f20
@ -161,7 +161,6 @@ config ARCH_BCM2835
|
||||
select ARM_TIMER_SP804
|
||||
select HAVE_ARM_ARCH_TIMER if ARCH_MULTI_V7
|
||||
select BCM2835_TIMER
|
||||
select BRCMSTB_L2_IRQ
|
||||
select PINCTRL
|
||||
select PINCTRL_BCM2835
|
||||
select MFD_CORE
|
||||
@ -209,9 +208,6 @@ config ARCH_BRCMSTB
|
||||
select ARM_GIC
|
||||
select ARM_ERRATA_798181 if SMP
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select BCM7038_L1_IRQ
|
||||
select BRCMSTB_L2_IRQ
|
||||
select BCM7120_L2_IRQ
|
||||
select ZONE_DMA if ARM_LPAE
|
||||
select SOC_BRCMSTB
|
||||
select SOC_BUS
|
||||
|
@ -44,7 +44,6 @@ config ARCH_BCM2835
|
||||
select ARM_AMBA
|
||||
select ARM_GIC
|
||||
select ARM_TIMER_SP804
|
||||
select BRCMSTB_L2_IRQ
|
||||
help
|
||||
This enables support for the Broadcom BCM2837 and BCM2711 SoC.
|
||||
These SoCs are used in the Raspberry Pi 3 and 4 devices.
|
||||
@ -82,8 +81,6 @@ config ARCH_BITMAIN
|
||||
config ARCH_BRCMSTB
|
||||
bool "Broadcom Set-Top-Box SoCs"
|
||||
select ARCH_HAS_RESET_CONTROLLER
|
||||
select BCM7038_L1_IRQ
|
||||
select BRCMSTB_L2_IRQ
|
||||
select GENERIC_IRQ_CHIP
|
||||
select PINCTRL
|
||||
help
|
||||
@ -167,7 +164,6 @@ config ARCH_MEDIATEK
|
||||
config ARCH_MESON
|
||||
bool "Amlogic Platforms"
|
||||
select COMMON_CLK
|
||||
select MESON_IRQ_GPIO
|
||||
help
|
||||
This enables support for the arm64 based Amlogic SoCs
|
||||
such as the s905, S905X/D, S912, A113X/D or S905X/D2
|
||||
|
@ -1782,6 +1782,7 @@ config CPU_BMIPS
|
||||
select CPU_HAS_PREFETCH
|
||||
select CPU_SUPPORTS_CPUFREQ
|
||||
select MIPS_EXTERNAL_TIMER
|
||||
select GENERIC_IRQ_MIGRATION if HOTPLUG_CPU
|
||||
help
|
||||
Support for BMIPS32/3300/4350/4380 and BMIPS5000 processors.
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/bug.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/time.h>
|
||||
#include <asm/processor.h>
|
||||
@ -373,7 +374,7 @@ static int bmips_cpu_disable(void)
|
||||
|
||||
set_cpu_online(cpu, false);
|
||||
calculate_cpu_foreign_map();
|
||||
irq_cpu_offline();
|
||||
irq_migrate_all_off_this_cpu();
|
||||
clear_c0_status(IE_IRQ5);
|
||||
|
||||
local_flush_tlb_all();
|
||||
|
@ -115,18 +115,24 @@ config BCM6345_L1_IRQ
|
||||
select GENERIC_IRQ_EFFECTIVE_AFF_MASK
|
||||
|
||||
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 IRQ_DOMAIN
|
||||
select GENERIC_IRQ_EFFECTIVE_AFF_MASK
|
||||
|
||||
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 IRQ_DOMAIN
|
||||
|
||||
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 IRQ_DOMAIN
|
||||
|
||||
@ -400,8 +406,9 @@ config IRQ_UNIPHIER_AIDET
|
||||
Support for the UniPhier AIDET (ARM Interrupt Detector).
|
||||
|
||||
config MESON_IRQ_GPIO
|
||||
bool "Meson GPIO Interrupt Multiplexer"
|
||||
depends on ARCH_MESON
|
||||
tristate "Meson GPIO Interrupt Multiplexer"
|
||||
depends on ARCH_MESON || COMPILE_TEST
|
||||
default ARCH_MESON
|
||||
select IRQ_DOMAIN_HIERARCHY
|
||||
help
|
||||
Support Meson SoC Family GPIO Interrupt Multiplexer
|
||||
|
@ -28,9 +28,6 @@
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/irqchip/chained_irq.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#ifdef CONFIG_ARM
|
||||
#include <asm/smp_plat.h>
|
||||
#endif
|
||||
|
||||
#define IRQS_PER_WORD 32
|
||||
#define REG_BYTES_PER_IRQ_WORD (sizeof(u32) * 4)
|
||||
@ -127,7 +124,7 @@ static void bcm7038_l1_irq_handle(struct irq_desc *desc)
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
unsigned int idx;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#if defined(CONFIG_SMP) && defined(CONFIG_MIPS)
|
||||
cpu = intc->cpus[cpu_logical_map(smp_processor_id())];
|
||||
#else
|
||||
cpu = intc->cpus[0];
|
||||
@ -194,6 +191,7 @@ static void bcm7038_l1_mask(struct irq_data *d)
|
||||
raw_spin_unlock_irqrestore(&intc->lock, flags);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_MIPS) && defined(CONFIG_SMP)
|
||||
static int bcm7038_l1_set_affinity(struct irq_data *d,
|
||||
const struct cpumask *dest,
|
||||
bool force)
|
||||
@ -220,32 +218,6 @@ static int bcm7038_l1_set_affinity(struct irq_data *d,
|
||||
|
||||
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
|
||||
|
||||
static int __init bcm7038_l1_init_one(struct device_node *dn,
|
||||
@ -328,7 +300,7 @@ static int bcm7038_l1_suspend(void)
|
||||
u32 val;
|
||||
|
||||
/* 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);
|
||||
#else
|
||||
boot_cpu = 0;
|
||||
@ -352,7 +324,7 @@ static void bcm7038_l1_resume(void)
|
||||
struct bcm7038_l1_chip *intc;
|
||||
int boot_cpu, word;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#if defined(CONFIG_SMP) && defined(CONFIG_MIPS)
|
||||
boot_cpu = cpu_logical_map(0);
|
||||
#else
|
||||
boot_cpu = 0;
|
||||
@ -395,9 +367,8 @@ static struct irq_chip bcm7038_l1_irq_chip = {
|
||||
.name = "bcm7038-l1",
|
||||
.irq_mask = bcm7038_l1_mask,
|
||||
.irq_unmask = bcm7038_l1_unmask,
|
||||
#if defined(CONFIG_SMP) && defined(CONFIG_MIPS)
|
||||
.irq_set_affinity = bcm7038_l1_set_affinity,
|
||||
#ifdef CONFIG_SMP
|
||||
.irq_cpu_offline = bcm7038_l1_cpu_offline,
|
||||
#endif
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.irq_set_wake = bcm7038_l1_set_wake,
|
||||
@ -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_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;
|
||||
}
|
||||
|
||||
@ -484,4 +455,8 @@ out_free:
|
||||
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,
|
||||
{
|
||||
unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
|
||||
struct bcm7120_l2_intc_data *data;
|
||||
struct platform_device *pdev;
|
||||
struct irq_chip_generic *gc;
|
||||
struct irq_chip_type *ct;
|
||||
int ret = 0;
|
||||
@ -230,7 +231,13 @@ static int __init bcm7120_l2_intc_probe(struct device_node *dn,
|
||||
if (!data)
|
||||
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) {
|
||||
pr_err("invalid number of parent interrupts\n");
|
||||
ret = -ENOMEM;
|
||||
@ -329,6 +336,7 @@ out_unmap:
|
||||
if (data->map_base[idx])
|
||||
iounmap(data->map_base[idx]);
|
||||
}
|
||||
out_free_data:
|
||||
kfree(data);
|
||||
return ret;
|
||||
}
|
||||
@ -347,8 +355,9 @@ static int __init bcm7120_l2_intc_probe_3380(struct device_node *dn,
|
||||
"BCM3380 L2");
|
||||
}
|
||||
|
||||
IRQCHIP_DECLARE(bcm7120_l2_intc, "brcm,bcm7120-l2-intc",
|
||||
bcm7120_l2_intc_probe_7120);
|
||||
|
||||
IRQCHIP_DECLARE(bcm3380_l2_intc, "brcm,bcm3380-l2-intc",
|
||||
bcm7120_l2_intc_probe_3380);
|
||||
IRQCHIP_PLATFORM_DRIVER_BEGIN(bcm7120_l2)
|
||||
IRQCHIP_MATCH("brcm,bcm7120-l2-intc", bcm7120_l2_intc_probe_7120)
|
||||
IRQCHIP_MATCH("brcm,bcm3380-l2-intc", bcm7120_l2_intc_probe_3380)
|
||||
IRQCHIP_PLATFORM_DRIVER_END(bcm7120_l2)
|
||||
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,
|
||||
{
|
||||
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,
|
||||
struct device_node *parent)
|
||||
{
|
||||
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 = {
|
||||
.translate = meson_gpio_irq_domain_translate,
|
||||
};
|
||||
|
||||
static int __init meson_gpio_irq_parse_dt(struct device_node *node,
|
||||
struct meson_gpio_irq_controller *ctl)
|
||||
static int meson_gpio_irq_parse_dt(struct device_node *node, struct meson_gpio_irq_controller *ctl)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
int ret;
|
||||
@ -463,8 +462,7 @@ static int __init meson_gpio_irq_parse_dt(struct device_node *node,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init meson_gpio_irq_of_init(struct device_node *node,
|
||||
struct device_node *parent)
|
||||
static int meson_gpio_irq_of_init(struct device_node *node, struct device_node *parent)
|
||||
{
|
||||
struct irq_domain *domain, *parent_domain;
|
||||
struct meson_gpio_irq_controller *ctl;
|
||||
@ -521,5 +519,10 @@ free_ctl:
|
||||
return ret;
|
||||
}
|
||||
|
||||
IRQCHIP_DECLARE(meson_gpio_intc, "amlogic,meson-gpio-intc",
|
||||
meson_gpio_irq_of_init);
|
||||
IRQCHIP_PLATFORM_DRIVER_BEGIN(meson_gpio_intc)
|
||||
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 @@
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.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
|
||||
* the association between their DT compatible string and their
|
||||
@ -23,17 +30,19 @@
|
||||
*
|
||||
* @name: name that must be unique across all IRQCHIP_DECLARE of the
|
||||
* same file.
|
||||
* @compstr: compatible string of the irqchip driver
|
||||
* @compat: compatible string of the irqchip driver
|
||||
* @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);
|
||||
|
||||
#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_MATCH(compat, fn) { .compatible = compat, \
|
||||
.data = typecheck_irq_init_cb(fn), },
|
||||
|
||||
#define IRQCHIP_PLATFORM_DRIVER_END(drv_name) \
|
||||
{}, \
|
||||
|
@ -25,6 +25,7 @@ static DEFINE_RAW_SPINLOCK(gc_lock);
|
||||
void irq_gc_noop(struct irq_data *d)
|
||||
{
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(irq_gc_noop);
|
||||
|
||||
/**
|
||||
* irq_gc_mask_disable_reg - Mask chip via disable register
|
||||
@ -44,6 +45,7 @@ void irq_gc_mask_disable_reg(struct irq_data *d)
|
||||
*ct->mask_cache &= ~mask;
|
||||
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
|
||||
@ -103,6 +105,7 @@ void irq_gc_unmask_enable_reg(struct irq_data *d)
|
||||
*ct->mask_cache |= mask;
|
||||
irq_gc_unlock(gc);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(irq_gc_unmask_enable_reg);
|
||||
|
||||
/**
|
||||
* irq_gc_ack_set_bit - Ack pending interrupt via setting bit
|
||||
|
Loading…
Reference in New Issue
Block a user