Skip to content

Commit 36da9f5

Browse files
committed
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
2 parents bc94632 + 6872fca commit 36da9f5

File tree

9 files changed

+23
-6
lines changed

9 files changed

+23
-6
lines changed

Documentation/devicetree/bindings/interrupt-controller/socionext,uniphier-aidet.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ properties:
3030
- socionext,uniphier-ld11-aidet
3131
- socionext,uniphier-ld20-aidet
3232
- socionext,uniphier-pxs3-aidet
33+
- socionext,uniphier-nx1-aidet
3334

3435
reg:
3536
maxItems: 1

drivers/irqchip/Kconfig

+1-1
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ config XTENSA_MX
298298

299299
config XILINX_INTC
300300
bool "Xilinx Interrupt Controller IP"
301-
depends on MICROBLAZE || ARCH_ZYNQ || ARCH_ZYNQMP
301+
depends on OF
302302
select IRQ_DOMAIN
303303
help
304304
Support for the Xilinx Interrupt Controller IP core.

drivers/irqchip/irq-apple-aic.c

+2
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,7 @@ static void build_fiq_affinity(struct aic_irq_chip *ic, struct device_node *aff)
10351035
continue;
10361036

10371037
cpu = of_cpu_node_to_id(cpu_node);
1038+
of_node_put(cpu_node);
10381039
if (WARN_ON(cpu < 0))
10391040
continue;
10401041

@@ -1143,6 +1144,7 @@ static int __init aic_of_ic_init(struct device_node *node, struct device_node *p
11431144
for_each_child_of_node(affs, chld)
11441145
build_fiq_affinity(irqc, chld);
11451146
}
1147+
of_node_put(affs);
11461148

11471149
set_handle_irq(aic_handle_irq);
11481150
set_handle_fiq(aic_handle_fiq);

drivers/irqchip/irq-gic-realview.c

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ realview_gic_of_init(struct device_node *node, struct device_node *parent)
5757

5858
/* The PB11MPCore GIC needs to be configured in the syscon */
5959
map = syscon_node_to_regmap(np);
60+
of_node_put(np);
6061
if (!IS_ERR(map)) {
6162
/* new irq mode with no DCC */
6263
regmap_write(map, REALVIEW_SYS_LOCK_OFFSET,

drivers/irqchip/irq-gic-v3.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -1932,7 +1932,7 @@ static void __init gic_populate_ppi_partitions(struct device_node *gic_node)
19321932

19331933
gic_data.ppi_descs = kcalloc(gic_data.ppi_nr, sizeof(*gic_data.ppi_descs), GFP_KERNEL);
19341934
if (!gic_data.ppi_descs)
1935-
return;
1935+
goto out_put_node;
19361936

19371937
nr_parts = of_get_child_count(parts_node);
19381938

@@ -1973,12 +1973,15 @@ static void __init gic_populate_ppi_partitions(struct device_node *gic_node)
19731973
continue;
19741974

19751975
cpu = of_cpu_node_to_id(cpu_node);
1976-
if (WARN_ON(cpu < 0))
1976+
if (WARN_ON(cpu < 0)) {
1977+
of_node_put(cpu_node);
19771978
continue;
1979+
}
19781980

19791981
pr_cont("%pOF[%d] ", cpu_node, cpu);
19801982

19811983
cpumask_set_cpu(cpu, &part->mask);
1984+
of_node_put(cpu_node);
19821985
}
19831986

19841987
pr_cont("}\n");

drivers/irqchip/irq-loongson-liointc.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939

4040
#define LIOINTC_ERRATA_IRQ 10
4141

42+
#if defined(CONFIG_MIPS)
43+
#define liointc_core_id get_ebase_cpunum()
44+
#else
45+
#define liointc_core_id get_csr_cpuid()
46+
#endif
47+
4248
struct liointc_handler_data {
4349
struct liointc_priv *priv;
4450
u32 parent_int_map;
@@ -57,7 +63,7 @@ static void liointc_chained_handle_irq(struct irq_desc *desc)
5763
struct liointc_handler_data *handler = irq_desc_get_handler_data(desc);
5864
struct irq_chip *chip = irq_desc_get_chip(desc);
5965
struct irq_chip_generic *gc = handler->priv->gc;
60-
int core = cpu_logical_map(smp_processor_id()) % LIOINTC_NUM_CORES;
66+
int core = liointc_core_id % LIOINTC_NUM_CORES;
6167
u32 pending;
6268

6369
chained_irq_enter(chip, desc);

drivers/irqchip/irq-realtek-rtl.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,9 @@ static int __init map_interrupts(struct device_node *node, struct irq_domain *do
134134
if (!cpu_ictl)
135135
return -EINVAL;
136136
ret = of_property_read_u32(cpu_ictl, "#interrupt-cells", &tmp);
137+
of_node_put(cpu_ictl);
137138
if (ret || tmp != 1)
138139
return -EINVAL;
139-
of_node_put(cpu_ictl);
140140

141141
cpu_int = be32_to_cpup(imap + 2);
142142
if (cpu_int > 7 || cpu_int < 2)

drivers/irqchip/irq-uniphier-aidet.c

+1
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ static const struct of_device_id uniphier_aidet_match[] = {
237237
{ .compatible = "socionext,uniphier-ld11-aidet" },
238238
{ .compatible = "socionext,uniphier-ld20-aidet" },
239239
{ .compatible = "socionext,uniphier-pxs3-aidet" },
240+
{ .compatible = "socionext,uniphier-nx1-aidet" },
240241
{ /* sentinel */ }
241242
};
242243

kernel/irq/chip.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -1006,8 +1006,10 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
10061006
if (desc->irq_data.chip != &no_irq_chip)
10071007
mask_ack_irq(desc);
10081008
irq_state_set_disabled(desc);
1009-
if (is_chained)
1009+
if (is_chained) {
10101010
desc->action = NULL;
1011+
WARN_ON(irq_chip_pm_put(irq_desc_get_irq_data(desc)));
1012+
}
10111013
desc->depth = 1;
10121014
}
10131015
desc->handle_irq = handle;
@@ -1033,6 +1035,7 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
10331035
irq_settings_set_norequest(desc);
10341036
irq_settings_set_nothread(desc);
10351037
desc->action = &chained_action;
1038+
WARN_ON(irq_chip_pm_get(irq_desc_get_irq_data(desc)));
10361039
irq_activate_and_startup(desc, IRQ_RESEND);
10371040
}
10381041
}

0 commit comments

Comments
 (0)