]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
pinctrl: Fix pinctrl_gpio_get_pinctrl_and_offset()
authorJonas Karlman <jonas@kwiboo.se>
Fri, 10 May 2024 19:35:51 +0000 (19:35 +0000)
committerTom Rini <trini@konsulko.com>
Fri, 17 May 2024 18:52:15 +0000 (12:52 -0600)
Linux kernel Documentation/devicetree/bindings/gpio/gpio.txt define the
format of the gpio-ranges prop as:

  The format is: <[pin controller phandle], [GPIO controller offset],
                  [pin controller offset], [number of pins]>;

  Example:

      gpio-ranges = <&foo 0 20 10>, <&bar 10 50 20>;

  This means:
  - pins 20..29 on pin controller "foo" is mapped to GPIO line 0..9 and
  - pins 50..69 on pin controller "bar" is mapped to GPIO line 10..29

For this example, a call to pinctrl_gpio_get_pinctrl_and_offset() using
offset 10 incorrectly return pin controller "foo" instead of "bar".

Fix this by using an exclusive range check.

Fixes: d0bb00adccb8 ("pinctrl: fix pinctrl_gpio_get_pinctrl_and_offset for gpio-ranges array")
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Reviewed-by: Quanyang Wang <quanyang.wang@windriver.com>
drivers/pinctrl/pinctrl-uclass.c

index d9bda7494e23942e7d68c6f9ce50c1eb25d4d3f6..d9c76898a9692d40b7cd4eecf7cb2edf9e93a209 100644 (file)
@@ -209,7 +209,7 @@ pinctrl_gpio_get_pinctrl_and_offset(struct udevice *dev, unsigned offset,
                pfc_base = args.args[1];
                pfc_pins = args.args[2];
 
-               if (offset >= gpio_offset && offset <= gpio_offset + pfc_pins)
+               if (offset >= gpio_offset && offset < gpio_offset + pfc_pins)
                        break;
        }