power: supply: ab8500_fg: Do not free non-requested IRQs in probe's error path
authorKrzysztof Kozlowski <krzk@kernel.org>
Fri, 4 Oct 2019 15:07:37 +0000 (17:07 +0200)
committerSebastian Reichel <sre@kernel.org>
Sun, 20 Oct 2019 13:18:08 +0000 (15:18 +0200)
When requesting interrupt fails, free only interrupts already requested,
not all of them.

Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/ab8500_fg.c

index 015f467..8a81728 100644 (file)
@@ -3165,7 +3165,7 @@ static int ab8500_fg_probe(struct platform_device *pdev)
                if (ret != 0) {
                        dev_err(di->dev, "failed to request %s IRQ %d: %d\n",
                                ab8500_fg_irq_th[i].name, irq, ret);
-                       goto free_irq;
+                       goto free_irq_th;
                }
                dev_dbg(di->dev, "Requested %s IRQ %d: %d\n",
                        ab8500_fg_irq_th[i].name, irq, ret);
@@ -3180,7 +3180,7 @@ static int ab8500_fg_probe(struct platform_device *pdev)
        if (ret != 0) {
                dev_err(di->dev, "failed to request %s IRQ %d: %d\n",
                        ab8500_fg_irq_bh[0].name, irq, ret);
-               goto free_irq;
+               goto free_irq_th;
        }
        dev_dbg(di->dev, "Requested %s IRQ %d: %d\n",
                ab8500_fg_irq_bh[0].name, irq, ret);
@@ -3222,7 +3222,9 @@ free_irq:
        /* We also have to free all registered irqs */
        irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
        free_irq(irq, di);
-       for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq_th); i++) {
+free_irq_th:
+       while (--i >= 0) {
+               /* Last assignment of i from primary interrupt handlers */
                irq = platform_get_irq_byname(pdev, ab8500_fg_irq_th[i].name);
                free_irq(irq, di);
        }