|
@@ -655,13 +655,34 @@ EXPORT_SYMBOL_GPL(regmap_add_irq_chip);
|
|
|
*
|
|
|
* @irq: Primary IRQ for the device
|
|
|
* @d: regmap_irq_chip_data allocated by regmap_add_irq_chip()
|
|
|
+ *
|
|
|
+ * This function also dispose all mapped irq on chip.
|
|
|
*/
|
|
|
void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *d)
|
|
|
{
|
|
|
+ unsigned int virq;
|
|
|
+ int hwirq;
|
|
|
+
|
|
|
if (!d)
|
|
|
return;
|
|
|
|
|
|
free_irq(irq, d);
|
|
|
+
|
|
|
+ /* Dispose all virtual irq from irq domain before removing it */
|
|
|
+ for (hwirq = 0; hwirq < d->chip->num_irqs; hwirq++) {
|
|
|
+ /* Ignore hwirq if holes in the IRQ list */
|
|
|
+ if (!d->chip->irqs[hwirq].mask)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Find the virtual irq of hwirq on chip and if it is
|
|
|
+ * there then dispose it
|
|
|
+ */
|
|
|
+ virq = irq_find_mapping(d->domain, hwirq);
|
|
|
+ if (virq)
|
|
|
+ irq_dispose_mapping(virq);
|
|
|
+ }
|
|
|
+
|
|
|
irq_domain_remove(d->domain);
|
|
|
kfree(d->type_buf);
|
|
|
kfree(d->type_buf_def);
|