lpc32xx_gpio_probe() registers each gpio chip with
devm_gpiochip_add_data() but ignores the return value. If registering
a chip fails, probe still returns 0, so the driver binds with a chip
missing and no error is reported.
Check the return value, print an error naming the failing chip and
return the error code. Chips registered earlier in the loop are devm
managed and are removed automatically on failure.
Signed-off-by: Jayaraj Devaraj <jayarajdmit@gmail.com>
---
drivers/gpio/gpio-lpc32xx.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/gpio/gpio-lpc32xx.c b/drivers/gpio/gpio-lpc32xx.c
index 37fc54fc7385..014eb8bc70da 100644
--- a/drivers/gpio/gpio-lpc32xx.c
+++ b/drivers/gpio/gpio-lpc32xx.c
@@ -510,7 +510,7 @@ static int lpc32xx_of_xlate(struct gpio_chip *gc,
static int lpc32xx_gpio_probe(struct platform_device *pdev)
{
- int i;
+ int i, ret;
void __iomem *reg_base;
reg_base = devm_platform_ioremap_resource(pdev, 0);
@@ -524,8 +524,12 @@ static int lpc32xx_gpio_probe(struct platform_device *pdev)
lpc32xx_gpiochip[i].chip.of_gpio_n_cells = 3;
lpc32xx_gpiochip[i].reg_base = reg_base;
}
- devm_gpiochip_add_data(&pdev->dev, &lpc32xx_gpiochip[i].chip,
- &lpc32xx_gpiochip[i]);
+ ret = devm_gpiochip_add_data(&pdev->dev, &lpc32xx_gpiochip[i].chip,
+ &lpc32xx_gpiochip[i]);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to register gpio chip %d: %d\n", i, ret);
+ return ret;
+ }
}
return 0;
--
2.34.1