Commit 10260237 authored by Paul Mundt's avatar Paul Mundt

sh: intc: Handle domain association for sparseirq pre-allocated vectors.

Presently it's assumed that the irqdomain code handles the irq_desc
allocation for us, but this isn't necessarily the case when we've
pre-allocated IRQs via sparseirq. Previously we had a -EEXIST check in
the code that attempted to trap these cases and simply update them
in-place, but this behaviour was inadvertently lost in the transition to
irqdomains.

This simply restores the previous behaviour, first attempting to let the
irqdomain core fetch the allocation for us, and falling back to an
in-place domain association in the extant IRQ case. Fixes up regressions
on platforms that pre-allocate legacy IRQs (specifically ARM-based
SH-Mobile platforms, as SH stopped pre-allocating vectors some time ago).
Reported-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 800fb3dd
...@@ -324,8 +324,16 @@ int __init register_intc_controller(struct intc_desc *desc) ...@@ -324,8 +324,16 @@ int __init register_intc_controller(struct intc_desc *desc)
res = irq_create_identity_mapping(d->domain, irq); res = irq_create_identity_mapping(d->domain, irq);
if (unlikely(res)) { if (unlikely(res)) {
pr_err("can't get irq_desc for %d\n", irq); if (res == -EEXIST) {
continue; res = irq_domain_associate(d->domain, irq, irq);
if (unlikely(res)) {
pr_err("domain association failure\n");
continue;
}
} else {
pr_err("can't identity map IRQ %d\n", irq);
continue;
}
} }
intc_irq_xlate_set(irq, vect->enum_id, d); intc_irq_xlate_set(irq, vect->enum_id, d);
...@@ -345,8 +353,19 @@ int __init register_intc_controller(struct intc_desc *desc) ...@@ -345,8 +353,19 @@ int __init register_intc_controller(struct intc_desc *desc)
*/ */
res = irq_create_identity_mapping(d->domain, irq2); res = irq_create_identity_mapping(d->domain, irq2);
if (unlikely(res)) { if (unlikely(res)) {
pr_err("can't get irq_desc for %d\n", irq2); if (res == -EEXIST) {
continue; res = irq_domain_associate(d->domain,
irq, irq);
if (unlikely(res)) {
pr_err("domain association "
"failure\n");
continue;
}
} else {
pr_err("can't identity map IRQ %d\n",
irq);
continue;
}
} }
vect2->enum_id = 0; vect2->enum_id = 0;
......
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