|
|
@@ -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,
|