diff options
Diffstat (limited to 'drivers/irqchip/irq-mips-gic.c')
| -rw-r--r-- | drivers/irqchip/irq-mips-gic.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c index 3b5e10aa48ab..8a4adbeb2b8c 100644 --- a/drivers/irqchip/irq-mips-gic.c +++ b/drivers/irqchip/irq-mips-gic.c @@ -746,6 +746,12 @@ static int gic_irq_domain_alloc(struct irq_domain *d, unsigned int virq,  		/* verify that it doesn't conflict with an IPI irq */  		if (test_bit(spec->hwirq, ipi_resrv))  			return -EBUSY; + +		hwirq = GIC_SHARED_TO_HWIRQ(spec->hwirq); + +		return irq_domain_set_hwirq_and_chip(d, virq, hwirq, +						     &gic_level_irq_controller, +						     NULL);  	} else {  		base_hwirq = find_first_bit(ipi_resrv, gic_shared_intrs);  		if (base_hwirq == gic_shared_intrs) { @@ -867,10 +873,14 @@ static int gic_dev_domain_alloc(struct irq_domain *d, unsigned int virq,  						    &gic_level_irq_controller,  						    NULL);  		if (ret) -			return ret; +			goto error;  	}  	return 0; + +error: +	irq_domain_free_irqs_parent(d, virq, nr_irqs); +	return ret;  }  void gic_dev_domain_free(struct irq_domain *d, unsigned int virq,  | 
