linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] gpiolib: of: Introduce hook for missing gpio-ranges
@ 2022-04-09  9:51 Stefan Wahren
  2022-04-09  9:51 ` [PATCH 1/2] " Stefan Wahren
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Stefan Wahren @ 2022-04-09  9:51 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Florian Fainelli, Ray Jui,
	Scott Branden
  Cc: bcm-kernel-feedback-list, Nicolas Saenz Julienne, Phil Elwell,
	Krzysztof Kozlowski, linux-gpio, linux-kernel, linux-rpi-kernel,
	linux-arm-kernel, Stefan Wahren

This patch series tries to provide backward compatibility for DTB which
lacks the gpio-ranges property.

The commit ("pinctrl: msm: fix gpio-hog related boot issues") by Christian
Lamparter already contains a fallback in case the gpio-ranges property
is missing. But this approach doesn't work on BCM2835 with a gpio-hog
defined for the SoC GPIOs.

Based Christian's on explanation i conclude that the fallback must happen
during the gpiochip_add() call and not afterwards. So the approach is to
call an optional hook, which can be implemented in the platform driver.

This series has been tested on Raspberry Pi 3 B Plus.

Changes since RFC:
- just add all collected Fixes, Reviewed-by, Tested-by and Acked-by

Stefan Wahren (2):
  gpiolib: of: Introduce hook for missing gpio-ranges
  pinctrl: bcm2835: implement hook for missing gpio-ranges

 drivers/gpio/gpiolib-of.c             |  5 +++++
 drivers/pinctrl/bcm/pinctrl-bcm2835.c | 18 ++++++++++++++++++
 include/linux/gpio/driver.h           | 12 ++++++++++++
 3 files changed, 35 insertions(+)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] gpiolib: of: Introduce hook for missing gpio-ranges
  2022-04-09  9:51 [PATCH 0/2] gpiolib: of: Introduce hook for missing gpio-ranges Stefan Wahren
@ 2022-04-09  9:51 ` Stefan Wahren
  2022-04-09  9:51 ` [PATCH 2/2] pinctrl: bcm2835: implement " Stefan Wahren
  2022-04-19 21:18 ` [PATCH 0/2] gpiolib: of: Introduce " Linus Walleij
  2 siblings, 0 replies; 4+ messages in thread
From: Stefan Wahren @ 2022-04-09  9:51 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Florian Fainelli, Ray Jui,
	Scott Branden
  Cc: bcm-kernel-feedback-list, Nicolas Saenz Julienne, Phil Elwell,
	Krzysztof Kozlowski, linux-gpio, linux-kernel, linux-rpi-kernel,
	linux-arm-kernel, Stefan Wahren

Since commit 2ab73c6d8323 ("gpio: Support GPIO controllers without pin-ranges")
the device tree nodes of GPIO controller need the gpio-ranges property to
handle gpio-hogs. Unfortunately it's impossible to guarantee that every new
kernel is shipped with an updated device tree binary.

In order to provide backward compatibility with those older DTB, we need a
callback within of_gpiochip_add_pin_range() so the relevant platform driver
can handle this case.

Fixes: 2ab73c6d8323 ("gpio: Support GPIO controllers without pin-ranges")
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>
Acked-by: Bartosz Golaszewski <brgl@bgdev.pl>
---
 drivers/gpio/gpiolib-of.c   |  5 +++++
 include/linux/gpio/driver.h | 12 ++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index ae1ce319cd78..d9b235c88b54 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -931,6 +931,11 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
 	if (!np)
 		return 0;
 
+	if (!of_property_read_bool(np, "gpio-ranges") &&
+	    chip->of_gpio_ranges_fallback) {
+		return chip->of_gpio_ranges_fallback(chip, np);
+	}
+
 	group_names = of_find_property(np, group_names_propname, NULL);
 
 	for (;; index++) {
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h
index 98c93510640e..b5d53decea5a 100644
--- a/include/linux/gpio/driver.h
+++ b/include/linux/gpio/driver.h
@@ -492,6 +492,18 @@ struct gpio_chip {
 	 */
 	int (*of_xlate)(struct gpio_chip *gc,
 			const struct of_phandle_args *gpiospec, u32 *flags);
+
+	/**
+	 * @of_gpio_ranges_fallback
+	 *
+	 * Optional hook for the case that no gpio-ranges property is defined
+	 * within the device tree node "np" (usually DT before introduction
+	 * of gpio-ranges). So this callback is helpful to provide the
+	 * necessary backward compatibility for the pin ranges.
+	 */
+	int (*of_gpio_ranges_fallback)(struct gpio_chip *gc,
+				       struct device_node *np);
+
 #endif /* CONFIG_OF_GPIO */
 };
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/2] pinctrl: bcm2835: implement hook for missing gpio-ranges
  2022-04-09  9:51 [PATCH 0/2] gpiolib: of: Introduce hook for missing gpio-ranges Stefan Wahren
  2022-04-09  9:51 ` [PATCH 1/2] " Stefan Wahren
@ 2022-04-09  9:51 ` Stefan Wahren
  2022-04-19 21:18 ` [PATCH 0/2] gpiolib: of: Introduce " Linus Walleij
  2 siblings, 0 replies; 4+ messages in thread
From: Stefan Wahren @ 2022-04-09  9:51 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Florian Fainelli, Ray Jui,
	Scott Branden
  Cc: bcm-kernel-feedback-list, Nicolas Saenz Julienne, Phil Elwell,
	Krzysztof Kozlowski, linux-gpio, linux-kernel, linux-rpi-kernel,
	linux-arm-kernel, Stefan Wahren

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>
---
 drivers/pinctrl/bcm/pinctrl-bcm2835.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
index 47e433e09c5c..dad453054776 100644
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
@@ -358,6 +358,22 @@ static int bcm2835_gpio_direction_output(struct gpio_chip *chip,
 	return 0;
 }
 
+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,
@@ -372,6 +388,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 = {
@@ -388,6 +405,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,
-- 
2.25.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] gpiolib: of: Introduce hook for missing gpio-ranges
  2022-04-09  9:51 [PATCH 0/2] gpiolib: of: Introduce hook for missing gpio-ranges Stefan Wahren
  2022-04-09  9:51 ` [PATCH 1/2] " Stefan Wahren
  2022-04-09  9:51 ` [PATCH 2/2] pinctrl: bcm2835: implement " Stefan Wahren
@ 2022-04-19 21:18 ` Linus Walleij
  2 siblings, 0 replies; 4+ messages in thread
From: Linus Walleij @ 2022-04-19 21:18 UTC (permalink / raw)
  To: Stefan Wahren
  Cc: Bartosz Golaszewski, Florian Fainelli, Ray Jui, Scott Branden,
	bcm-kernel-feedback-list, Nicolas Saenz Julienne, Phil Elwell,
	Krzysztof Kozlowski, linux-gpio, linux-kernel, linux-rpi-kernel,
	linux-arm-kernel

On Sat, Apr 9, 2022 at 11:52 AM Stefan Wahren <stefan.wahren@i2se.com> wrote:

> This patch series tries to provide backward compatibility for DTB which
> lacks the gpio-ranges property.
>
> The commit ("pinctrl: msm: fix gpio-hog related boot issues") by Christian
> Lamparter already contains a fallback in case the gpio-ranges property
> is missing. But this approach doesn't work on BCM2835 with a gpio-hog
> defined for the SoC GPIOs.
>
> Based Christian's on explanation i conclude that the fallback must happen
> during the gpiochip_add() call and not afterwards. So the approach is to
> call an optional hook, which can be implemented in the platform driver.
>
> This series has been tested on Raspberry Pi 3 B Plus.
>
> Changes since RFC:
> - just add all collected Fixes, Reviewed-by, Tested-by and Acked-by

Patches applied!

Sorry for being a bit slow on this :/

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-04-19 21:19 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-09  9:51 [PATCH 0/2] gpiolib: of: Introduce hook for missing gpio-ranges Stefan Wahren
2022-04-09  9:51 ` [PATCH 1/2] " Stefan Wahren
2022-04-09  9:51 ` [PATCH 2/2] pinctrl: bcm2835: implement " Stefan Wahren
2022-04-19 21:18 ` [PATCH 0/2] gpiolib: of: Introduce " Linus Walleij

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).