power: supply: ab8500: Handle invalid IRQ from platform_get_irq_byname()
authorKrzysztof Kozlowski <krzk@kernel.org>
Fri, 4 Oct 2019 15:07:38 +0000 (17:07 +0200)
committerSebastian Reichel <sre@kernel.org>
Sun, 20 Oct 2019 13:18:44 +0000 (15:18 +0200)
platform_get_irq_byname() might return -errno which later would be
cast to an unsigned int and used in request_irq().

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_btemp.c
drivers/power/supply/ab8500_charger.c
drivers/power/supply/ab8500_fg.c

index e9f5365..909f024 100644 (file)
@@ -1099,6 +1099,11 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
        /* Register interrupts */
        for (i = 0; i < ARRAY_SIZE(ab8500_btemp_irq); i++) {
                irq = platform_get_irq_byname(pdev, ab8500_btemp_irq[i].name);
+               if (irq < 0) {
+                       ret = irq;
+                       goto free_irq;
+               }
+
                ret = request_threaded_irq(irq, NULL, ab8500_btemp_irq[i].isr,
                        IRQF_SHARED | IRQF_NO_SUSPEND,
                        ab8500_btemp_irq[i].name, di);
index c053ede..ff2bb44 100644 (file)
@@ -3594,6 +3594,11 @@ static int ab8500_charger_probe(struct platform_device *pdev)
        /* Register interrupts */
        for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
                irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
+               if (irq < 0) {
+                       ret = irq;
+                       goto free_irq;
+               }
+
                ret = request_threaded_irq(irq, NULL, ab8500_charger_irq[i].isr,
                        IRQF_SHARED | IRQF_NO_SUSPEND,
                        ab8500_charger_irq[i].name, di);
index 8a81728..c3912ee 100644 (file)
@@ -3158,6 +3158,11 @@ static int ab8500_fg_probe(struct platform_device *pdev)
        /* Register primary interrupt handlers */
        for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq_th); i++) {
                irq = platform_get_irq_byname(pdev, ab8500_fg_irq_th[i].name);
+               if (irq < 0) {
+                       ret = irq;
+                       goto free_irq_th;
+               }
+
                ret = request_irq(irq, ab8500_fg_irq_th[i].isr,
                                  IRQF_SHARED | IRQF_NO_SUSPEND,
                                  ab8500_fg_irq_th[i].name, di);
@@ -3173,6 +3178,11 @@ static int ab8500_fg_probe(struct platform_device *pdev)
 
        /* Register threaded interrupt handler */
        irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
+       if (irq < 0) {
+               ret = irq;
+               goto free_irq_th;
+       }
+
        ret = request_threaded_irq(irq, NULL, ab8500_fg_irq_bh[0].isr,
                                IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
                        ab8500_fg_irq_bh[0].name, di);