Commit 979292af authored by Thomas Gleixner's avatar Thomas Gleixner

Merge tag 'irqchip-fixes-5.16-1' of...

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

Pull irqchip fixes from Marc Zyngier:

  - Address an issue with the SiFive PLIC being unable to EOI
    a masked interrupt

  - Move the disable/enable methods in the CSky mpintc to
    mask/unmask

  - Fix a regression in the OF irq code where an interrupt-controller
    property in the same node as an interrupt-map property would get
    ignored

Link: https://lore.kernel.org/all/20211112173459.4015233-1-maz@kernel.org
parents 37354590 10a20b34
...@@ -78,7 +78,7 @@ static void csky_mpintc_handler(struct pt_regs *regs) ...@@ -78,7 +78,7 @@ static void csky_mpintc_handler(struct pt_regs *regs)
readl_relaxed(reg_base + INTCL_RDYIR)); readl_relaxed(reg_base + INTCL_RDYIR));
} }
static void csky_mpintc_enable(struct irq_data *d) static void csky_mpintc_unmask(struct irq_data *d)
{ {
void __iomem *reg_base = this_cpu_read(intcl_reg); void __iomem *reg_base = this_cpu_read(intcl_reg);
...@@ -87,7 +87,7 @@ static void csky_mpintc_enable(struct irq_data *d) ...@@ -87,7 +87,7 @@ static void csky_mpintc_enable(struct irq_data *d)
writel_relaxed(d->hwirq, reg_base + INTCL_SENR); writel_relaxed(d->hwirq, reg_base + INTCL_SENR);
} }
static void csky_mpintc_disable(struct irq_data *d) static void csky_mpintc_mask(struct irq_data *d)
{ {
void __iomem *reg_base = this_cpu_read(intcl_reg); void __iomem *reg_base = this_cpu_read(intcl_reg);
...@@ -164,8 +164,8 @@ static int csky_irq_set_affinity(struct irq_data *d, ...@@ -164,8 +164,8 @@ static int csky_irq_set_affinity(struct irq_data *d,
static struct irq_chip csky_irq_chip = { static struct irq_chip csky_irq_chip = {
.name = "C-SKY SMP Intc", .name = "C-SKY SMP Intc",
.irq_eoi = csky_mpintc_eoi, .irq_eoi = csky_mpintc_eoi,
.irq_enable = csky_mpintc_enable, .irq_unmask = csky_mpintc_unmask,
.irq_disable = csky_mpintc_disable, .irq_mask = csky_mpintc_mask,
.irq_set_type = csky_mpintc_set_type, .irq_set_type = csky_mpintc_set_type,
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
.irq_set_affinity = csky_irq_set_affinity, .irq_set_affinity = csky_irq_set_affinity,
......
...@@ -163,7 +163,13 @@ static void plic_irq_eoi(struct irq_data *d) ...@@ -163,7 +163,13 @@ static void plic_irq_eoi(struct irq_data *d)
{ {
struct plic_handler *handler = this_cpu_ptr(&plic_handlers); struct plic_handler *handler = this_cpu_ptr(&plic_handlers);
if (irqd_irq_masked(d)) {
plic_irq_unmask(d);
writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM); writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM);
plic_irq_mask(d);
} else {
writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM);
}
} }
static struct irq_chip plic_chip = { static struct irq_chip plic_chip = {
......
...@@ -161,9 +161,10 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq) ...@@ -161,9 +161,10 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
* if it is then we are done, unless there is an * if it is then we are done, unless there is an
* interrupt-map which takes precedence. * interrupt-map which takes precedence.
*/ */
bool intc = of_property_read_bool(ipar, "interrupt-controller");
imap = of_get_property(ipar, "interrupt-map", &imaplen); imap = of_get_property(ipar, "interrupt-map", &imaplen);
if (imap == NULL && if (imap == NULL && intc) {
of_property_read_bool(ipar, "interrupt-controller")) {
pr_debug(" -> got it !\n"); pr_debug(" -> got it !\n");
return 0; return 0;
} }
...@@ -244,8 +245,20 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq) ...@@ -244,8 +245,20 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
pr_debug(" -> imaplen=%d\n", imaplen); pr_debug(" -> imaplen=%d\n", imaplen);
} }
if (!match) if (!match) {
if (intc) {
/*
* The PASEMI Nemo is a known offender, so
* let's only warn for anyone else.
*/
WARN(!IS_ENABLED(CONFIG_PPC_PASEMI),
"%pOF interrupt-map failed, using interrupt-controller\n",
ipar);
return 0;
}
goto fail; goto fail;
}
/* /*
* Successfully parsed an interrrupt-map translation; copy new * Successfully parsed an interrrupt-map translation; copy new
......
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