]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
pinctrl: bcm2835: implement hook for missing gpio-ranges
authorStefan Wahren <stefan.wahren@i2se.com>
Sat, 9 Apr 2022 09:51:29 +0000 (11:51 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 10 Aug 2022 07:24:46 +0000 (09:24 +0200)
BugLink: https://bugs.launchpad.net/bugs/1981864
[ Upstream commit d2b67744fd99b06555b7e4d67302ede6c7c6a638 ]

The commit c8013355ead6 ("ARM: dts: gpio-ranges property is now required")
fixed the GPIO probing issues caused by "pinctrl: bcm2835: Change init
order for gpio hogs". This changed only the kernel DTS files. Unfortunately
it isn't guaranteed that these files are shipped to all users.

So implement the necessary backward compatibility for BCM2835 and
BCM2711 platform.

Fixes: 266423e60ea1 ("pinctrl: bcm2835: Change init order for gpio hogs")
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Tested-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20220409095129.45786-3-stefan.wahren@i2se.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
drivers/pinctrl/bcm/pinctrl-bcm2835.c

index cb339299adf9295a88e79abda4be9735957c2f3d..a2938995c7c142a3de2bd17a846eb53b0ece3953 100644 (file)
@@ -351,6 +351,22 @@ static int bcm2835_gpio_direction_output(struct gpio_chip *chip,
        return pinctrl_gpio_direction_output(chip->base + offset);
 }
 
+static int bcm2835_of_gpio_ranges_fallback(struct gpio_chip *gc,
+                                          struct device_node *np)
+{
+       struct pinctrl_dev *pctldev = of_pinctrl_get(np);
+
+       of_node_put(np);
+
+       if (!pctldev)
+               return 0;
+
+       gpiochip_add_pin_range(gc, pinctrl_dev_get_devname(pctldev), 0, 0,
+                              gc->ngpio);
+
+       return 0;
+}
+
 static const struct gpio_chip bcm2835_gpio_chip = {
        .label = MODULE_NAME,
        .owner = THIS_MODULE,
@@ -365,6 +381,7 @@ static const struct gpio_chip bcm2835_gpio_chip = {
        .base = -1,
        .ngpio = BCM2835_NUM_GPIOS,
        .can_sleep = false,
+       .of_gpio_ranges_fallback = bcm2835_of_gpio_ranges_fallback,
 };
 
 static const struct gpio_chip bcm2711_gpio_chip = {
@@ -381,6 +398,7 @@ static const struct gpio_chip bcm2711_gpio_chip = {
        .base = -1,
        .ngpio = BCM2711_NUM_GPIOS,
        .can_sleep = false,
+       .of_gpio_ranges_fallback = bcm2835_of_gpio_ranges_fallback,
 };
 
 static void bcm2835_gpio_irq_handle_bank(struct bcm2835_pinctrl *pc,