Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bfba4e80 authored by Florian Fainelli's avatar Florian Fainelli Committed by Greg Kroah-Hartman
Browse files

pinctrl: bcm2835: Fix a few error paths



commit 5297c693d8c8e08fa742e3112cf70723f7a04da2 upstream.

After commit 266423e60ea1 ("pinctrl: bcm2835: Change init order for gpio
hogs") a few error paths would not unwind properly the registration of
gpio ranges. Correct that by assigning a single error label and goto it
whenever we encounter a fatal error.

Fixes: 266423e60ea1 ("pinctrl: bcm2835: Change init order for gpio hogs")
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20220127215033.267227-1-f.fainelli@gmail.com


Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 71e60c17
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -1261,16 +1261,18 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)
				     sizeof(*girq->parents),
				     GFP_KERNEL);
	if (!girq->parents) {
		pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
		return -ENOMEM;
		err = -ENOMEM;
		goto out_remove;
	}

	if (is_7211) {
		pc->wake_irq = devm_kcalloc(dev, BCM2835_NUM_IRQS,
					    sizeof(*pc->wake_irq),
					    GFP_KERNEL);
		if (!pc->wake_irq)
			return -ENOMEM;
		if (!pc->wake_irq) {
			err = -ENOMEM;
			goto out_remove;
		}
	}

	/*
@@ -1294,8 +1296,10 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)

		len = strlen(dev_name(pc->dev)) + 16;
		name = devm_kzalloc(pc->dev, len, GFP_KERNEL);
		if (!name)
			return -ENOMEM;
		if (!name) {
			err = -ENOMEM;
			goto out_remove;
		}

		snprintf(name, len, "%s:bank%d", dev_name(pc->dev), i);

@@ -1314,11 +1318,14 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)
	err = gpiochip_add_data(&pc->gpio_chip, pc);
	if (err) {
		dev_err(dev, "could not add GPIO chip\n");
		pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
		return err;
		goto out_remove;
	}

	return 0;

out_remove:
	pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
	return err;
}

static struct platform_driver bcm2835_pinctrl_driver = {