regmap: irq: dispose all virtual irq before removing domain

It is require to dispose all virtual irq of hwirq on chip
created on given irq domain before removing this irq domain.
Hence dispose all mapped irqs before deleting the irq domains
in regmap_del_irq_chip();

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Javier Martinez Canillas <javier@osg.samsung.com>
Tested-by: Javier Martinez Canillas <javier@osg.samsung.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Laxman Dewangan 2016-02-09 17:58:22 +05:30 committed by Mark Brown
parent 92e963f50f
commit 46189518d7

View File

@ -655,13 +655,34 @@ EXPORT_SYMBOL_GPL(regmap_add_irq_chip);
* *
* @irq: Primary IRQ for the device * @irq: Primary IRQ for the device
* @d: regmap_irq_chip_data allocated by regmap_add_irq_chip() * @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) void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *d)
{ {
unsigned int virq;
int hwirq;
if (!d) if (!d)
return; return;
free_irq(irq, d); 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); irq_domain_remove(d->domain);
kfree(d->type_buf); kfree(d->type_buf);
kfree(d->type_buf_def); kfree(d->type_buf_def);