Commit 3dfaff27 authored by Charles Keepax's avatar Charles Keepax Committed by Lee Jones

mfd: arizona: Correctly clean up after IRQs

Currently we leak a lot of things when tearing down the IRQs this patch
fixes this cleaning up both the IRQ mappings and the IRQ domain itself.
Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 1a86dcb3
...@@ -210,6 +210,7 @@ int arizona_irq_init(struct arizona *arizona) ...@@ -210,6 +210,7 @@ int arizona_irq_init(struct arizona *arizona)
int ret; int ret;
const struct regmap_irq_chip *aod, *irq; const struct regmap_irq_chip *aod, *irq;
struct irq_data *irq_data; struct irq_data *irq_data;
unsigned int virq;
arizona->ctrlif_error = true; arizona->ctrlif_error = true;
...@@ -321,26 +322,34 @@ int arizona_irq_init(struct arizona *arizona) ...@@ -321,26 +322,34 @@ int arizona_irq_init(struct arizona *arizona)
} }
if (aod) { if (aod) {
ret = regmap_add_irq_chip(arizona->regmap, virq = irq_create_mapping(arizona->virq, ARIZONA_AOD_IRQ_INDEX);
irq_create_mapping(arizona->virq, if (!virq) {
ARIZONA_AOD_IRQ_INDEX), dev_err(arizona->dev, "Failed to map AOD IRQs\n");
IRQF_ONESHOT, 0, aod, ret = -EINVAL;
&arizona->aod_irq_chip); goto err_domain;
}
ret = regmap_add_irq_chip(arizona->regmap, virq, IRQF_ONESHOT,
0, aod, &arizona->aod_irq_chip);
if (ret != 0) { if (ret != 0) {
dev_err(arizona->dev, dev_err(arizona->dev,
"Failed to add AOD IRQs: %d\n", ret); "Failed to add AOD IRQs: %d\n", ret);
goto err; goto err_map_aod;
} }
} }
ret = regmap_add_irq_chip(arizona->regmap, virq = irq_create_mapping(arizona->virq, ARIZONA_MAIN_IRQ_INDEX);
irq_create_mapping(arizona->virq, if (!virq) {
ARIZONA_MAIN_IRQ_INDEX), dev_err(arizona->dev, "Failed to map main IRQs\n");
IRQF_ONESHOT, 0, irq, ret = -EINVAL;
&arizona->irq_chip); goto err_aod;
}
ret = regmap_add_irq_chip(arizona->regmap, virq, IRQF_ONESHOT,
0, irq, &arizona->irq_chip);
if (ret != 0) { if (ret != 0) {
dev_err(arizona->dev, "Failed to add main IRQs: %d\n", ret); dev_err(arizona->dev, "Failed to add main IRQs: %d\n", ret);
goto err_aod; goto err_map_main_irq;
} }
/* Used to emulate edge trigger and to work around broken pinmux */ /* Used to emulate edge trigger and to work around broken pinmux */
...@@ -404,26 +413,40 @@ int arizona_irq_init(struct arizona *arizona) ...@@ -404,26 +413,40 @@ int arizona_irq_init(struct arizona *arizona)
regmap_del_irq_chip(irq_find_mapping(arizona->virq, regmap_del_irq_chip(irq_find_mapping(arizona->virq,
ARIZONA_MAIN_IRQ_INDEX), ARIZONA_MAIN_IRQ_INDEX),
arizona->irq_chip); arizona->irq_chip);
err_map_main_irq:
irq_dispose_mapping(irq_find_mapping(arizona->virq,
ARIZONA_MAIN_IRQ_INDEX));
err_aod: err_aod:
regmap_del_irq_chip(irq_find_mapping(arizona->virq, regmap_del_irq_chip(irq_find_mapping(arizona->virq,
ARIZONA_AOD_IRQ_INDEX), ARIZONA_AOD_IRQ_INDEX),
arizona->aod_irq_chip); arizona->aod_irq_chip);
err_map_aod:
irq_dispose_mapping(irq_find_mapping(arizona->virq,
ARIZONA_AOD_IRQ_INDEX));
err_domain:
irq_domain_remove(arizona->virq);
err: err:
return ret; return ret;
} }
int arizona_irq_exit(struct arizona *arizona) int arizona_irq_exit(struct arizona *arizona)
{ {
unsigned int virq;
if (arizona->ctrlif_error) if (arizona->ctrlif_error)
arizona_free_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR, arizona); arizona_free_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR, arizona);
arizona_free_irq(arizona, ARIZONA_IRQ_BOOT_DONE, arizona); arizona_free_irq(arizona, ARIZONA_IRQ_BOOT_DONE, arizona);
regmap_del_irq_chip(irq_find_mapping(arizona->virq, virq = irq_find_mapping(arizona->virq, ARIZONA_MAIN_IRQ_INDEX);
ARIZONA_MAIN_IRQ_INDEX), regmap_del_irq_chip(virq, arizona->irq_chip);
arizona->irq_chip); irq_dispose_mapping(virq);
regmap_del_irq_chip(irq_find_mapping(arizona->virq,
ARIZONA_AOD_IRQ_INDEX), virq = irq_find_mapping(arizona->virq, ARIZONA_AOD_IRQ_INDEX);
arizona->aod_irq_chip); regmap_del_irq_chip(virq, arizona->aod_irq_chip);
irq_dispose_mapping(virq);
irq_domain_remove(arizona->virq);
free_irq(arizona->irq, arizona); free_irq(arizona->irq, arizona);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment