diff options
Diffstat (limited to 'drivers/sh/intc/core.c')
| -rw-r--r-- | drivers/sh/intc/core.c | 49 | 
1 files changed, 19 insertions, 30 deletions
| diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index a14684ffe4c1..ca4f4ca413f1 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c @@ -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"); -					continue; -				} -			} else { -				pr_err("can't identity map IRQ %d\n", irq); -				continue; -			} -		} +		if (!intc_map(d->domain, 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"); -						continue; -					} -				} else { -					pr_err("can't identity map IRQ %d\n", -					       irq); -					continue; -				} -			} +			if (!intc_map(d->domain, irq2)) +				continue;  			vect2->enum_id = 0; | 
