Commit eef56c3a authored by Marc Zyngier's avatar Marc Zyngier
Browse files

sh: intc: Drop the use of irq_create_identity_mapping()



Instead of playing games with using irq_create_identity_mapping()
and irq_domain_associate(), drop the use of the former and only
use the latter, together with the allocation of the irq_desc
as needed.

It doesn't make the code less awful, but at least the intent
is clearer.

Tested-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 5fbecd23
Loading
Loading
Loading
Loading
+19 −30
Original line number Diff line number Diff line
@@ -179,6 +179,21 @@ static unsigned int __init save_reg(struct intc_desc_int *d,
	return 0;
}

static bool __init intc_map(struct irq_domain *domain, int irq)
{
	if (!irq_to_desc(irq) && irq_alloc_desc_at(irq, NUMA_NO_NODE) != irq) {
		pr_err("uname to allocate IRQ %d\n", irq);
		return false;
	}

	if (irq_domain_associate(domain, irq, irq)) {
		pr_err("domain association failure\n");
		return false;
	}

	return true;
}

int __init register_intc_controller(struct intc_desc *desc)
{
	unsigned int i, k, smp;
@@ -311,24 +326,12 @@ int __init register_intc_controller(struct intc_desc *desc)
	for (i = 0; i < hw->nr_vectors; i++) {
		struct intc_vect *vect = hw->vectors + i;
		unsigned int irq = evt2irq(vect->vect);
		int res;

		if (!vect->enum_id)
			continue;

		res = irq_create_identity_mapping(d->domain, irq);
		if (unlikely(res)) {
			if (res == -EEXIST) {
				res = irq_domain_associate(d->domain, irq, irq);
				if (unlikely(res)) {
					pr_err("domain association failure\n");
		if (!intc_map(d->domain, irq))
			continue;
				}
			} else {
				pr_err("can't identity map IRQ %d\n", irq);
				continue;
			}
		}

		intc_irq_xlate_set(irq, vect->enum_id, d);
		intc_register_irq(desc, d, vect->enum_id, irq);
@@ -345,22 +348,8 @@ int __init register_intc_controller(struct intc_desc *desc)
			 * IRQ support, each vector still needs to have
			 * its own backing irq_desc.
			 */
			res = irq_create_identity_mapping(d->domain, irq2);
			if (unlikely(res)) {
				if (res == -EEXIST) {
					res = irq_domain_associate(d->domain,
								   irq2, irq2);
					if (unlikely(res)) {
						pr_err("domain association "
						       "failure\n");
			if (!intc_map(d->domain, irq2))
				continue;
					}
				} else {
					pr_err("can't identity map IRQ %d\n",
					       irq);
					continue;
				}
			}

			vect2->enum_id = 0;