[PATCH] ARM/gpio/dt-bindings: Clean out gpio alias from CLPS711X

Rob Herring robh+dt at kernel.org
Wed Mar 10 18:11:57 GMT 2021


On Tue, Mar 9, 2021 at 7:20 AM Linus Walleij <linus.walleij at linaro.org> wrote:
>
> This removes the use of GPIO alias from the CLPS711X GPIO
> driver.
>
> This driver only use it to add quirks to two GPIO blocks
> for which we can reuse the standard property "ngpios" and
> define a new Cirrus quirk to do it properly and get rid
> of the alias.
>
> The patch changes the driver, the one DTS file and the
> bindings in one go: my apologies but this is a lockstep
> solution to avoid any unclarities or inbetween states.

in between

I don't think a single patch really buys anything, but okay.

>
> Old device trees with aliases are supported but will
> produce a warning in dmesg and new properties will take
> precedence.
>
> Cc: devicetree at vger.kernel.org
> Cc: linux-gpio at vger.kernel.org
> Cc: Rob Herring <robh+dt at kernel.org>
> Link: https://lore.kernel.org/linux-gpio/CACRpkda8+Lvz+c=ohXsEDkNSQ63hPo613P4p_90fvKyC_kQ_GA@mail.gmail.com/T/#t
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
> This is a result of a discussion with Rob about whether
> we can get rid of GPIO aliases. I think we can at least
> get rid of this one.
> ---
>  .../bindings/gpio/gpio-clps711x.txt           | 10 +++---
>  arch/arm/boot/dts/ep7209.dtsi                 |  8 ++---
>  drivers/gpio/gpio-clps711x.c                  | 36 +++++++++----------
>  3 files changed, 26 insertions(+), 28 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/gpio/gpio-clps711x.txt b/Documentation/devicetree/bindings/gpio/gpio-clps711x.txt
> index 0a304ad29d81..c1ff20107607 100644
> --- a/Documentation/devicetree/bindings/gpio/gpio-clps711x.txt
> +++ b/Documentation/devicetree/bindings/gpio/gpio-clps711x.txt
> @@ -11,15 +11,13 @@ Required properties:
>      0 = active high
>      1 = active low
>
> -Note: Each GPIO port should have an alias correctly numbered in "aliases"
> -node.
> +Optional properties:
> +- cirrus,inverted-polarity: The polarity of the GPIO lines is
> +  inverted in hardware.
> +- ngpios: Number of available GPIO lines 0..n-1, see gpio.txt
>
>  Example:
>
> -aliases {
> -       gpio0 = &porta;
> -};
> -
>  porta: gpio at 80000000 {
>         compatible = "cirrus,ep7312-gpio","cirrus,ep7209-gpio";
>         reg = <0x80000000 0x1>, <0x80000040 0x1>;
> diff --git a/arch/arm/boot/dts/ep7209.dtsi b/arch/arm/boot/dts/ep7209.dtsi
> index 365931f8b48d..7d0f04959fdd 100644
> --- a/arch/arm/boot/dts/ep7209.dtsi
> +++ b/arch/arm/boot/dts/ep7209.dtsi
> @@ -11,10 +11,6 @@ / {
>         compatible = "cirrus,ep7209";
>
>         aliases {
> -               gpio0 = &porta;
> -               gpio1 = &portb;
> -               gpio3 = &portd;
> -               gpio4 = &porte;
>                 serial0 = &uart1;
>                 serial1 = &uart2;
>                 spi0 = &spi;
> @@ -72,6 +68,8 @@ portd: gpio at 80000003 {
>                         reg = <0x80000003 0x1 0x80000043 0x1>;
>                         gpio-controller;
>                         #gpio-cells = <2>;
> +                       /* This bank have all lines polarity inverted */
> +                       cirrus,inverted-polarity;
>                 };
>
>                 porte: gpio at 80000083 {
> @@ -79,6 +77,8 @@ porte: gpio at 80000083 {
>                         reg = <0x80000083 0x1 0x800000c3 0x1>;
>                         gpio-controller;
>                         #gpio-cells = <2>;
> +                       /* Only 3 GPIOs available on this bank */
> +                       ngpios = <3>;
>                 };
>
>                 syscon1: syscon at 80000100 {
> diff --git a/drivers/gpio/gpio-clps711x.c b/drivers/gpio/gpio-clps711x.c
> index 75f6f8d4323e..d2a20dc8f5d9 100644
> --- a/drivers/gpio/gpio-clps711x.c
> +++ b/drivers/gpio/gpio-clps711x.c
> @@ -16,14 +16,11 @@ static int clps711x_gpio_probe(struct platform_device *pdev)
>         void __iomem *dat, *dir;
>         struct gpio_chip *gc;
>         int err, id;
> +       u32 ngpios;
>
>         if (!np)
>                 return -ENODEV;
>
> -       id = of_alias_get_id(np, "gpio");
> -       if ((id < 0) || (id > 4))
> -               return -ENODEV;
> -
>         gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL);
>         if (!gc)
>                 return -ENOMEM;
> @@ -36,29 +33,32 @@ static int clps711x_gpio_probe(struct platform_device *pdev)
>         if (IS_ERR(dir))
>                 return PTR_ERR(dir);
>
> -       switch (id) {
> -       case 3:
> +       /* This ID will be negative if there is no alias node */
> +       id = of_alias_get_id(np, "gpio");
> +
> +       if (id >= 0)
> +               dev_info(&pdev->dev,
> +                        "DT is using deprecated alias, please remove this and "
> +                        "replace with proper node attributes\n");
> +
> +       if (of_property_read_bool(np, "cirrus,inverted-polarity") ||
> +           id == 3)
>                 /* PORTD is inverted logic for direction register */
>                 err = bgpio_init(gc, &pdev->dev, 1, dat, NULL, NULL,
>                                  NULL, dir, 0);
> -               break;
> -       default:
> +       else
>                 err = bgpio_init(gc, &pdev->dev, 1, dat, NULL, NULL,
>                                  dir, NULL, 0);
> -               break;
> -       }
> -
>         if (err)
>                 return err;
>
> -       switch (id) {
> -       case 4:
> -               /* PORTE is 3 lines only */
> +       if (id == 4)
> +               /* This is just for compatibility with older device trees */
>                 gc->ngpio = 3;
> -               break;
> -       default:
> -               break;
> -       }
> +
> +       if (!of_property_read_u32(np, "ngpios", &ngpios))
> +               /* PORTE is 3 lines only */
> +               gc->ngpio = ngpios;

Just this should work:

of_property_read_u32(np, "ngpios", &gc->ngpio);

The variable won't be touched on error.

Rob



More information about the linux-arm-kernel mailing list