]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
gpio: ml-ioh: check the return value of irq_alloc_generic_chip()
authorBartosz Golaszewski <brgl@bgdev.pl>
Thu, 25 May 2017 08:37:38 +0000 (10:37 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 29 May 2017 11:34:22 +0000 (13:34 +0200)
This function can fail, so check the return value before dereferencing
the returned pointer.

Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-ml-ioh.c

index 78896a869fd9bb12c822f0e9a45f4d237ff72080..74fdce096c26eddd57982bd455f56a26d0036219 100644 (file)
@@ -385,14 +385,18 @@ static irqreturn_t ioh_gpio_handler(int irq, void *dev_id)
        return ret;
 }
 
-static void ioh_gpio_alloc_generic_chip(struct ioh_gpio *chip,
-                               unsigned int irq_start, unsigned int num)
+static int ioh_gpio_alloc_generic_chip(struct ioh_gpio *chip,
+                                      unsigned int irq_start,
+                                      unsigned int num)
 {
        struct irq_chip_generic *gc;
        struct irq_chip_type *ct;
 
        gc = irq_alloc_generic_chip("ioh_gpio", 1, irq_start, chip->base,
                                    handle_simple_irq);
+       if (!gc)
+               return -ENOMEM;
+
        gc->private = chip;
        ct = gc->chip_types;
 
@@ -404,6 +408,8 @@ static void ioh_gpio_alloc_generic_chip(struct ioh_gpio *chip,
 
        irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
                               IRQ_NOREQUEST | IRQ_NOPROBE, 0);
+
+       return 0;
 }
 
 static int ioh_gpio_probe(struct pci_dev *pdev,
@@ -468,7 +474,11 @@ static int ioh_gpio_probe(struct pci_dev *pdev,
                        goto err_gpiochip_add;
                }
                chip->irq_base = irq_base;
-               ioh_gpio_alloc_generic_chip(chip, irq_base, num_ports[j]);
+
+               ret = ioh_gpio_alloc_generic_chip(chip,
+                                                 irq_base, num_ports[j]);
+               if (ret)
+                       goto err_gpiochip_add;
        }
 
        chip = chip_save;