irqchip/genirq fixes for 5.19, take #1

- Invoke runtime PM for chained interrupts, aligning the behaviour
   with that of 'normal' interrupts
 
 - A flurry of of_node refcounting fixes
 
 - A fix for the recently merged loongarch that broke UP MIPS
 
 - A configuration fix for the Xilinx interrupt controller
 
 - Yet another new compat string for the Uniphier interrupt controller
 -----BEGIN PGP SIGNATURE-----
 
 iQJDBAABCgAtFiEEn9UcU+C1Yxj9lZw9I9DQutE9ekMFAmKi/xcPHG1hekBrZXJu
 ZWwub3JnAAoJECPQ0LrRPXpDH3wP/1xTs9wqkg7tET8zhRE9sz9xOsID+gsv+m52
 7TwSErs5PoaqAGsa/l58X5GTURCs9YfU6l9jeU/VEhhfkkTvVomuVsrS3NMhchlf
 yB6Zty0NVjKawAHAaTewkoeZJ46uufRJPbnBzWom99SxjxY6kIWcWoC0qswe8iHV
 EAyAwoyqpbgb22A+tfEDNNgP8i7S4diwbWxN/Hs9kvNUyoq6MjvMV0A1d+IWu2ZH
 iZQhJO2GPbG27/TJx7le4U10xfcyABzlOzLaOzdBGfT6Ung4SwDIpreCOGgM+iSN
 Cj9Zq4Hy4YrKOd27PvcXUIyADWguhQA4A9hnH2sDUvEBdhpDj8N6kddZS9SP7ziS
 WlI4wxLj1dGq2NvhREKkOgcR9jNfuw4VbquJLptyQyXoxcHd0daIU7NhBgFVwg9x
 1rPELIfTDFuI1fm6DOjgmFJdgrakkNTlAQqYIfuWY0xMn6qR5w/zdJozM/qefi8E
 RIWZVR5Cvysonk+fhQJAqLRKs+R9jPfpXRdvjdflLr6ai6ewb6+KsmM08iugMrTl
 aptQ7q60efsdPJStOjHZjEZsptxwMAyGdp7/oZHx8sBjBmdGFgGbQLn6M7xCoNBT
 vqWKZuRkr/419TJsxvavNOGDVl6ZeCIrVqKBN6tQvKI3+vnArdlr6MfAueF1nWtK
 uVLPXkv+
 =QrkE
 -----END PGP SIGNATURE-----

Merge tag 'irqchip-fixes-5.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/urgent

Pull irqchip/genirq fixes from Marc Zyngier:

 - Invoke runtime PM for chained interrupts, aligning the behaviour
   with that of 'normal' interrupts

 - A flurry of of_node refcounting fixes

 - A fix for the recently merged loongarch that broke UP MIPS

 - A configuration fix for the Xilinx interrupt controller

 - Yet another new compat string for the Uniphier interrupt controller

Link: https://lore.kernel.org/lkml/20220610083628.1205136-1-maz@kernel.org
This commit is contained in:
Thomas Gleixner 2022-06-13 09:10:49 +02:00
commit 6872fcac71
9 changed files with 23 additions and 6 deletions

View File

@ -30,6 +30,7 @@ properties:
- socionext,uniphier-ld11-aidet
- socionext,uniphier-ld20-aidet
- socionext,uniphier-pxs3-aidet
- socionext,uniphier-nx1-aidet
reg:
maxItems: 1

View File

@ -298,7 +298,7 @@ config XTENSA_MX
config XILINX_INTC
bool "Xilinx Interrupt Controller IP"
depends on MICROBLAZE || ARCH_ZYNQ || ARCH_ZYNQMP
depends on OF
select IRQ_DOMAIN
help
Support for the Xilinx Interrupt Controller IP core.

View File

@ -1035,6 +1035,7 @@ static void build_fiq_affinity(struct aic_irq_chip *ic, struct device_node *aff)
continue;
cpu = of_cpu_node_to_id(cpu_node);
of_node_put(cpu_node);
if (WARN_ON(cpu < 0))
continue;
@ -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)
build_fiq_affinity(irqc, chld);
}
of_node_put(affs);
set_handle_irq(aic_handle_irq);
set_handle_fiq(aic_handle_fiq);

View File

@ -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 */
map = syscon_node_to_regmap(np);
of_node_put(np);
if (!IS_ERR(map)) {
/* new irq mode with no DCC */
regmap_write(map, REALVIEW_SYS_LOCK_OFFSET,

View File

@ -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);
if (!gic_data.ppi_descs)
return;
goto out_put_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)
continue;
cpu = of_cpu_node_to_id(cpu_node);
if (WARN_ON(cpu < 0))
if (WARN_ON(cpu < 0)) {
of_node_put(cpu_node);
continue;
}
pr_cont("%pOF[%d] ", cpu_node, cpu);
cpumask_set_cpu(cpu, &part->mask);
of_node_put(cpu_node);
}
pr_cont("}\n");

View File

@ -39,6 +39,12 @@
#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_priv *priv;
u32 parent_int_map;
@ -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 irq_chip *chip = irq_desc_get_chip(desc);
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;
chained_irq_enter(chip, desc);

View File

@ -134,9 +134,9 @@ static int __init map_interrupts(struct device_node *node, struct irq_domain *do
if (!cpu_ictl)
return -EINVAL;
ret = of_property_read_u32(cpu_ictl, "#interrupt-cells", &tmp);
of_node_put(cpu_ictl);
if (ret || tmp != 1)
return -EINVAL;
of_node_put(cpu_ictl);
cpu_int = be32_to_cpup(imap + 2);
if (cpu_int > 7 || cpu_int < 2)

View File

@ -237,6 +237,7 @@ static const struct of_device_id uniphier_aidet_match[] = {
{ .compatible = "socionext,uniphier-ld11-aidet" },
{ .compatible = "socionext,uniphier-ld20-aidet" },
{ .compatible = "socionext,uniphier-pxs3-aidet" },
{ .compatible = "socionext,uniphier-nx1-aidet" },
{ /* sentinel */ }
};

View File

@ -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)
mask_ack_irq(desc);
irq_state_set_disabled(desc);
if (is_chained)
if (is_chained) {
desc->action = NULL;
WARN_ON(irq_chip_pm_put(irq_desc_get_irq_data(desc)));
}
desc->depth = 1;
}
desc->handle_irq = 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_nothread(desc);
desc->action = &chained_action;
WARN_ON(irq_chip_pm_get(irq_desc_get_irq_data(desc)));
irq_activate_and_startup(desc, IRQ_RESEND);
}
}