]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpio: htc-egpio: use managed gpiochip registration
authorPengpeng Hou <pengpeng@iscas.ac.cn>
Wed, 24 Jun 2026 13:18:28 +0000 (21:18 +0800)
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Fri, 26 Jun 2026 09:58:20 +0000 (11:58 +0200)
egpio_probe() registers each nested gpio_chip with gpiochip_add_data()
but ignores the return value. If one registration fails, probe still
returns success even though one of the chips was not published to
gpiolib.

Use devm_gpiochip_add_data() and fail probe if any chip registration
fails. This lets devres unwind already registered chips and prevents
the driver from publishing a partially initialized device.

Fixes: a1635b8fe59d ("[ARM] 4947/1: htc-egpio, a driver for GPIO/IRQ expanders with fixed input/output pins")
Signed-off-by: Pengpeng Hou <pengpeng@iscas.ac.cn>
Link: https://patch.msgid.link/20260624131828.94139-1-pengpeng@iscas.ac.cn
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
drivers/gpio/gpio-htc-egpio.c

index d15423c718d033e122a631e491b41083e3e732f2..25a4d4494f3c3a7be75130e510d049f823c21e24 100644 (file)
@@ -268,6 +268,7 @@ static int __init egpio_probe(struct platform_device *pdev)
        struct gpio_chip  *chip;
        unsigned int      irq, irq_end;
        int               i;
+       int               ret;
 
        /* Initialize ei data structure. */
        ei = devm_kzalloc(&pdev->dev, struct_size(ei, chip, pdata->num_chips), GFP_KERNEL);
@@ -326,7 +327,10 @@ static int __init egpio_probe(struct platform_device *pdev)
                chip->base            = pdata->chip[i].gpio_base;
                chip->ngpio           = pdata->chip[i].num_gpios;
 
-               gpiochip_add_data(chip, &ei->chip[i]);
+               ret = devm_gpiochip_add_data(&pdev->dev, chip, &ei->chip[i]);
+               if (ret)
+                       return dev_err_probe(&pdev->dev, ret,
+                                            "failed to register gpiochip %d\n", i);
        }
 
        /* Set initial pin values */