Skip to content

Commit 266423e

Browse files
pelwelllinusw
authored andcommitted
pinctrl: bcm2835: Change init order for gpio hogs
...and gpio-ranges pinctrl-bcm2835 is a combined pinctrl/gpio driver. Currently the gpio side is registered first, but this breaks gpio hogs (which are configured during gpiochip_add_data). Part of the hog initialisation is a call to pinctrl_gpio_request, and since the pinctrl driver hasn't yet been registered this results in an -EPROBE_DEFER from which it can never recover. Change the initialisation sequence to register the pinctrl driver first. This also solves a similar problem with the gpio-ranges property, which is required in order for released pins to be returned to inputs. Fixes: 73345a1 ("pinctrl: bcm2835: Pass irqchip when adding gpiochip") Signed-off-by: Phil Elwell <[email protected]> Reviewed-by: Florian Fainelli <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Linus Walleij <[email protected]>
1 parent 2d5446d commit 266423e

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

drivers/pinctrl/bcm/pinctrl-bcm2835.c

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,15 +1244,29 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)
12441244
raw_spin_lock_init(&pc->irq_lock[i]);
12451245
}
12461246

1247+
pc->pctl_desc = *pdata->pctl_desc;
1248+
pc->pctl_dev = devm_pinctrl_register(dev, &pc->pctl_desc, pc);
1249+
if (IS_ERR(pc->pctl_dev)) {
1250+
gpiochip_remove(&pc->gpio_chip);
1251+
return PTR_ERR(pc->pctl_dev);
1252+
}
1253+
1254+
pc->gpio_range = *pdata->gpio_range;
1255+
pc->gpio_range.base = pc->gpio_chip.base;
1256+
pc->gpio_range.gc = &pc->gpio_chip;
1257+
pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
1258+
12471259
girq = &pc->gpio_chip.irq;
12481260
girq->chip = &bcm2835_gpio_irq_chip;
12491261
girq->parent_handler = bcm2835_gpio_irq_handler;
12501262
girq->num_parents = BCM2835_NUM_IRQS;
12511263
girq->parents = devm_kcalloc(dev, BCM2835_NUM_IRQS,
12521264
sizeof(*girq->parents),
12531265
GFP_KERNEL);
1254-
if (!girq->parents)
1266+
if (!girq->parents) {
1267+
pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
12551268
return -ENOMEM;
1269+
}
12561270

12571271
if (is_7211) {
12581272
pc->wake_irq = devm_kcalloc(dev, BCM2835_NUM_IRQS,
@@ -1307,21 +1321,10 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)
13071321
err = gpiochip_add_data(&pc->gpio_chip, pc);
13081322
if (err) {
13091323
dev_err(dev, "could not add GPIO chip\n");
1324+
pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
13101325
return err;
13111326
}
13121327

1313-
pc->pctl_desc = *pdata->pctl_desc;
1314-
pc->pctl_dev = devm_pinctrl_register(dev, &pc->pctl_desc, pc);
1315-
if (IS_ERR(pc->pctl_dev)) {
1316-
gpiochip_remove(&pc->gpio_chip);
1317-
return PTR_ERR(pc->pctl_dev);
1318-
}
1319-
1320-
pc->gpio_range = *pdata->gpio_range;
1321-
pc->gpio_range.base = pc->gpio_chip.base;
1322-
pc->gpio_range.gc = &pc->gpio_chip;
1323-
pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
1324-
13251328
return 0;
13261329
}
13271330

0 commit comments

Comments
 (0)