mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 17:01:14 +00:00
62b7f5931c
bcm2708: boot tested on RPi B+ v1.2
bcm2709: boot tested on RPi 3B v1.2 and RPi 4B v1.1 4G
bcm2710: boot tested on RPi 3B v1.2
bcm2711: boot tested on RPi 4B v1.1 4G
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
(cherry-picked from commit f07e572f64
)
89 lines
2.8 KiB
Diff
89 lines
2.8 KiB
Diff
From 27cb8bf0442f677380a1df93b93b7589b7ce5243 Mon Sep 17 00:00:00 2001
|
|
From: Phil Elwell <phil@raspberrypi.org>
|
|
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 <phil@raspberrypi.org>
|
|
---
|
|
drivers/pinctrl/bcm/pinctrl-bcm2835.c | 40 ++++++++++++---------------
|
|
1 file changed, 17 insertions(+), 23 deletions(-)
|
|
|
|
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
|
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
|
@@ -1135,9 +1135,25 @@ static int bcm2835_pinctrl_probe(struct
|
|
raw_spin_lock_init(&pc->irq_lock[i]);
|
|
}
|
|
|
|
+ match = of_match_node(bcm2835_pinctrl_match, pdev->dev.of_node);
|
|
+ if (match) {
|
|
+ bcm2835_pinctrl_desc.confops =
|
|
+ (const struct pinconf_ops *)match->data;
|
|
+ }
|
|
+
|
|
+ pc->pctl_dev = devm_pinctrl_register(dev, &bcm2835_pinctrl_desc, pc);
|
|
+ if (IS_ERR(pc->pctl_dev))
|
|
+ return PTR_ERR(pc->pctl_dev);
|
|
+
|
|
+ pc->gpio_range = bcm2835_pinctrl_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);
|
|
+
|
|
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;
|
|
}
|
|
|
|
@@ -1145,6 +1161,7 @@ static int bcm2835_pinctrl_probe(struct
|
|
0, handle_level_irq, IRQ_TYPE_NONE);
|
|
if (err) {
|
|
dev_info(dev, "could not add irqchip\n");
|
|
+ pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
|
|
return err;
|
|
}
|
|
|
|
@@ -1167,29 +1184,6 @@ static int bcm2835_pinctrl_probe(struct
|
|
bcm2835_gpio_irq_handler);
|
|
}
|
|
|
|
- match = of_match_node(bcm2835_pinctrl_match, pdev->dev.of_node);
|
|
- if (match) {
|
|
- bcm2835_pinctrl_desc.confops =
|
|
- (const struct pinconf_ops *)match->data;
|
|
- }
|
|
-
|
|
- match = of_match_node(bcm2835_pinctrl_match, pdev->dev.of_node);
|
|
- if (match) {
|
|
- bcm2835_pinctrl_desc.confops =
|
|
- (const struct pinconf_ops *)match->data;
|
|
- }
|
|
-
|
|
- pc->pctl_dev = devm_pinctrl_register(dev, &bcm2835_pinctrl_desc, pc);
|
|
- if (IS_ERR(pc->pctl_dev)) {
|
|
- gpiochip_remove(&pc->gpio_chip);
|
|
- return PTR_ERR(pc->pctl_dev);
|
|
- }
|
|
-
|
|
- pc->gpio_range = bcm2835_pinctrl_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;
|
|
}
|
|
|