Commit 36da9f5f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'irq-urgent-2022-06-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq fixes from Thomas Gleixner:
 "A set of interrupt subsystem updates:

  Core:

   - Ensure runtime power management for chained interrupts

  Drivers:

   - A collection of OF node refcount fixes

   - Unbreak MIPS uniprocessor builds

   - Fix xilinx interrupt controller Kconfig dependencies

   - Add a missing compatible string to the Uniphier driver"

* tag 'irq-urgent-2022-06-19' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  irqchip/loongson-liointc: Use architecture register to get coreid
  irqchip/uniphier-aidet: Add compatible string for NX1 SoC
  dt-bindings: interrupt-controller/uniphier-aidet: Add bindings for NX1 SoC
  irqchip/realtek-rtl: Fix refcount leak in map_interrupts
  irqchip/gic-v3: Fix refcount leak in gic_populate_ppi_partitions
  irqchip/gic-v3: Fix error handling in gic_populate_ppi_partitions
  irqchip/apple-aic: Fix refcount leak in aic_of_ic_init
  irqchip/apple-aic: Fix refcount leak in build_fiq_affinity
  irqchip/gic/realview: Fix refcount leak in realview_gic_of_init
  irqchip/xilinx: Remove microblaze+zynq dependency
  genirq: PM: Use runtime PM for chained interrupts
parents bc94632c 6872fcac
...@@ -30,6 +30,7 @@ properties: ...@@ -30,6 +30,7 @@ properties:
- socionext,uniphier-ld11-aidet - socionext,uniphier-ld11-aidet
- socionext,uniphier-ld20-aidet - socionext,uniphier-ld20-aidet
- socionext,uniphier-pxs3-aidet - socionext,uniphier-pxs3-aidet
- socionext,uniphier-nx1-aidet
reg: reg:
maxItems: 1 maxItems: 1
......
...@@ -298,7 +298,7 @@ config XTENSA_MX ...@@ -298,7 +298,7 @@ config XTENSA_MX
config XILINX_INTC config XILINX_INTC
bool "Xilinx Interrupt Controller IP" bool "Xilinx Interrupt Controller IP"
depends on MICROBLAZE || ARCH_ZYNQ || ARCH_ZYNQMP depends on OF
select IRQ_DOMAIN select IRQ_DOMAIN
help help
Support for the Xilinx Interrupt Controller IP core. Support for the Xilinx Interrupt Controller IP core.
......
...@@ -1035,6 +1035,7 @@ static void build_fiq_affinity(struct aic_irq_chip *ic, struct device_node *aff) ...@@ -1035,6 +1035,7 @@ static void build_fiq_affinity(struct aic_irq_chip *ic, struct device_node *aff)
continue; continue;
cpu = of_cpu_node_to_id(cpu_node); cpu = of_cpu_node_to_id(cpu_node);
of_node_put(cpu_node);
if (WARN_ON(cpu < 0)) if (WARN_ON(cpu < 0))
continue; continue;
...@@ -1143,6 +1144,7 @@ static int __init aic_of_ic_init(struct device_node *node, struct device_node *p ...@@ -1143,6 +1144,7 @@ static int __init aic_of_ic_init(struct device_node *node, struct device_node *p
for_each_child_of_node(affs, chld) for_each_child_of_node(affs, chld)
build_fiq_affinity(irqc, chld); build_fiq_affinity(irqc, chld);
} }
of_node_put(affs);
set_handle_irq(aic_handle_irq); set_handle_irq(aic_handle_irq);
set_handle_fiq(aic_handle_fiq); set_handle_fiq(aic_handle_fiq);
......
...@@ -57,6 +57,7 @@ realview_gic_of_init(struct device_node *node, struct device_node *parent) ...@@ -57,6 +57,7 @@ realview_gic_of_init(struct device_node *node, struct device_node *parent)
/* The PB11MPCore GIC needs to be configured in the syscon */ /* The PB11MPCore GIC needs to be configured in the syscon */
map = syscon_node_to_regmap(np); map = syscon_node_to_regmap(np);
of_node_put(np);
if (!IS_ERR(map)) { if (!IS_ERR(map)) {
/* new irq mode with no DCC */ /* new irq mode with no DCC */
regmap_write(map, REALVIEW_SYS_LOCK_OFFSET, regmap_write(map, REALVIEW_SYS_LOCK_OFFSET,
......
...@@ -1932,7 +1932,7 @@ static void __init gic_populate_ppi_partitions(struct device_node *gic_node) ...@@ -1932,7 +1932,7 @@ static void __init gic_populate_ppi_partitions(struct device_node *gic_node)
gic_data.ppi_descs = kcalloc(gic_data.ppi_nr, sizeof(*gic_data.ppi_descs), GFP_KERNEL); gic_data.ppi_descs = kcalloc(gic_data.ppi_nr, sizeof(*gic_data.ppi_descs), GFP_KERNEL);
if (!gic_data.ppi_descs) if (!gic_data.ppi_descs)
return; goto out_put_node;
nr_parts = of_get_child_count(parts_node); nr_parts = of_get_child_count(parts_node);
...@@ -1973,12 +1973,15 @@ static void __init gic_populate_ppi_partitions(struct device_node *gic_node) ...@@ -1973,12 +1973,15 @@ static void __init gic_populate_ppi_partitions(struct device_node *gic_node)
continue; continue;
cpu = of_cpu_node_to_id(cpu_node); cpu = of_cpu_node_to_id(cpu_node);
if (WARN_ON(cpu < 0)) if (WARN_ON(cpu < 0)) {
of_node_put(cpu_node);
continue; continue;
}
pr_cont("%pOF[%d] ", cpu_node, cpu); pr_cont("%pOF[%d] ", cpu_node, cpu);
cpumask_set_cpu(cpu, &part->mask); cpumask_set_cpu(cpu, &part->mask);
of_node_put(cpu_node);
} }
pr_cont("}\n"); pr_cont("}\n");
......
...@@ -39,6 +39,12 @@ ...@@ -39,6 +39,12 @@
#define LIOINTC_ERRATA_IRQ 10 #define LIOINTC_ERRATA_IRQ 10
#if defined(CONFIG_MIPS)
#define liointc_core_id get_ebase_cpunum()
#else
#define liointc_core_id get_csr_cpuid()
#endif
struct liointc_handler_data { struct liointc_handler_data {
struct liointc_priv *priv; struct liointc_priv *priv;
u32 parent_int_map; u32 parent_int_map;
...@@ -57,7 +63,7 @@ static void liointc_chained_handle_irq(struct irq_desc *desc) ...@@ -57,7 +63,7 @@ static void liointc_chained_handle_irq(struct irq_desc *desc)
struct liointc_handler_data *handler = irq_desc_get_handler_data(desc); struct liointc_handler_data *handler = irq_desc_get_handler_data(desc);
struct irq_chip *chip = irq_desc_get_chip(desc); struct irq_chip *chip = irq_desc_get_chip(desc);
struct irq_chip_generic *gc = handler->priv->gc; struct irq_chip_generic *gc = handler->priv->gc;
int core = cpu_logical_map(smp_processor_id()) % LIOINTC_NUM_CORES; int core = liointc_core_id % LIOINTC_NUM_CORES;
u32 pending; u32 pending;
chained_irq_enter(chip, desc); chained_irq_enter(chip, desc);
......
...@@ -134,9 +134,9 @@ static int __init map_interrupts(struct device_node *node, struct irq_domain *do ...@@ -134,9 +134,9 @@ static int __init map_interrupts(struct device_node *node, struct irq_domain *do
if (!cpu_ictl) if (!cpu_ictl)
return -EINVAL; return -EINVAL;
ret = of_property_read_u32(cpu_ictl, "#interrupt-cells", &tmp); ret = of_property_read_u32(cpu_ictl, "#interrupt-cells", &tmp);
of_node_put(cpu_ictl);
if (ret || tmp != 1) if (ret || tmp != 1)
return -EINVAL; return -EINVAL;
of_node_put(cpu_ictl);
cpu_int = be32_to_cpup(imap + 2); cpu_int = be32_to_cpup(imap + 2);
if (cpu_int > 7 || cpu_int < 2) if (cpu_int > 7 || cpu_int < 2)
......
...@@ -237,6 +237,7 @@ static const struct of_device_id uniphier_aidet_match[] = { ...@@ -237,6 +237,7 @@ static const struct of_device_id uniphier_aidet_match[] = {
{ .compatible = "socionext,uniphier-ld11-aidet" }, { .compatible = "socionext,uniphier-ld11-aidet" },
{ .compatible = "socionext,uniphier-ld20-aidet" }, { .compatible = "socionext,uniphier-ld20-aidet" },
{ .compatible = "socionext,uniphier-pxs3-aidet" }, { .compatible = "socionext,uniphier-pxs3-aidet" },
{ .compatible = "socionext,uniphier-nx1-aidet" },
{ /* sentinel */ } { /* sentinel */ }
}; };
......
...@@ -1006,8 +1006,10 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle, ...@@ -1006,8 +1006,10 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
if (desc->irq_data.chip != &no_irq_chip) if (desc->irq_data.chip != &no_irq_chip)
mask_ack_irq(desc); mask_ack_irq(desc);
irq_state_set_disabled(desc); irq_state_set_disabled(desc);
if (is_chained) if (is_chained) {
desc->action = NULL; desc->action = NULL;
WARN_ON(irq_chip_pm_put(irq_desc_get_irq_data(desc)));
}
desc->depth = 1; desc->depth = 1;
} }
desc->handle_irq = handle; desc->handle_irq = handle;
...@@ -1033,6 +1035,7 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle, ...@@ -1033,6 +1035,7 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
irq_settings_set_norequest(desc); irq_settings_set_norequest(desc);
irq_settings_set_nothread(desc); irq_settings_set_nothread(desc);
desc->action = &chained_action; desc->action = &chained_action;
WARN_ON(irq_chip_pm_get(irq_desc_get_irq_data(desc)));
irq_activate_and_startup(desc, IRQ_RESEND); irq_activate_and_startup(desc, IRQ_RESEND);
} }
} }
......
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