|
|
@@ -1,78 +0,0 @@
|
|
|
-From 069990e0b524a7acdcfef0505913ee20401fec5a Mon Sep 17 00:00:00 2001
|
|
|
-From: Phil Elwell <[email protected]>
|
|
|
-Date: Mon, 6 Jan 2020 14:05:42 +0000
|
|
|
-Subject: [PATCH] pinctrl: bcm2835: Change init order for gpio hogs
|
|
|
-
|
|
|
-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.
|
|
|
-
|
|
|
-See: https://www.raspberrypi.org/forums/viewtopic.php?f=107&t=260600
|
|
|
-
|
|
|
-Signed-off-by: Phil Elwell <[email protected]>
|
|
|
----
|
|
|
- drivers/pinctrl/bcm/pinctrl-bcm2835.c | 29 +++++++++++++++------------
|
|
|
- 1 file changed, 16 insertions(+), 13 deletions(-)
|
|
|
-
|
|
|
---- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
|
|
-+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
|
|
-@@ -1244,6 +1244,18 @@ static int bcm2835_pinctrl_probe(struct
|
|
|
- raw_spin_lock_init(&pc->irq_lock[i]);
|
|
|
- }
|
|
|
-
|
|
|
-+ pc->pctl_desc = *pdata->pctl_desc;
|
|
|
-+ pc->pctl_dev = devm_pinctrl_register(dev, &pc->pctl_desc, pc);
|
|
|
-+ if (IS_ERR(pc->pctl_dev)) {
|
|
|
-+ gpiochip_remove(&pc->gpio_chip);
|
|
|
-+ return PTR_ERR(pc->pctl_dev);
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ pc->gpio_range = *pdata->gpio_range;
|
|
|
-+ pc->gpio_range.base = pc->gpio_chip.base;
|
|
|
-+ pc->gpio_range.gc = &pc->gpio_chip;
|
|
|
-+ pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
|
|
|
-+
|
|
|
- girq = &pc->gpio_chip.irq;
|
|
|
- girq->chip = &bcm2835_gpio_irq_chip;
|
|
|
- girq->parent_handler = bcm2835_gpio_irq_handler;
|
|
|
-@@ -1251,8 +1263,10 @@ static int bcm2835_pinctrl_probe(struct
|
|
|
- girq->parents = devm_kcalloc(dev, BCM2835_NUM_IRQS,
|
|
|
- sizeof(*girq->parents),
|
|
|
- GFP_KERNEL);
|
|
|
-- if (!girq->parents)
|
|
|
-+ if (!girq->parents) {
|
|
|
-+ pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
|
|
|
- return -ENOMEM;
|
|
|
-+ }
|
|
|
-
|
|
|
- if (is_7211) {
|
|
|
- pc->wake_irq = devm_kcalloc(dev, BCM2835_NUM_IRQS,
|
|
|
-@@ -1303,21 +1317,10 @@ static int bcm2835_pinctrl_probe(struct
|
|
|
- err = devm_gpiochip_add_data(dev, &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;
|
|
|
- }
|
|
|
-
|
|
|
-- pc->pctl_desc = *pdata->pctl_desc;
|
|
|
-- pc->pctl_dev = devm_pinctrl_register(dev, &pc->pctl_desc, pc);
|
|
|
-- if (IS_ERR(pc->pctl_dev)) {
|
|
|
-- gpiochip_remove(&pc->gpio_chip);
|
|
|
-- return PTR_ERR(pc->pctl_dev);
|
|
|
-- }
|
|
|
--
|
|
|
-- pc->gpio_range = *pdata->gpio_range;
|
|
|
-- pc->gpio_range.base = pc->gpio_chip.base;
|
|
|
-- pc->gpio_range.gc = &pc->gpio_chip;
|
|
|
-- pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
|
|
|
--
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|