[PATCH 2/2] cmd: pinmux: support pin name in status command

Simon Glass sjg at chromium.org
Thu Apr 29 18:10:12 CEST 2021


Hi Patrick,

On Wed, 28 Oct 2020 at 03:06, Patrick Delaunay <patrick.delaunay at st.com> wrote:
>
> Allow pin name parameter for pimux staus command,
> as gpio command to get status of one pin.
>
> The possible usage of the command is:
>
> > pinmux dev pinctrl
> > pinmux status
>
> > pinmux status -a
>
> > pinmux status <pin-name>
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
> ---
>
>  cmd/pinmux.c                 | 41 +++++++++++++++++++++++++-----------
>  test/py/tests/test_pinmux.py | 29 +++++++++++++++++++++++++
>  2 files changed, 58 insertions(+), 12 deletions(-)
>
> diff --git a/cmd/pinmux.c b/cmd/pinmux.c
> index af04c95a46..e096f16982 100644
> --- a/cmd/pinmux.c
> +++ b/cmd/pinmux.c
> @@ -41,19 +41,20 @@ static int do_dev(struct cmd_tbl *cmdtp, int flag, int argc,
>         return CMD_RET_SUCCESS;
>  }
>
> -static void show_pinmux(struct udevice *dev)
> +static bool show_pinmux(struct udevice *dev, char *name)

How about returning -ENOENT if there is no pin.

>  {
>         char pin_name[PINNAME_SIZE];
>         char pin_mux[PINMUX_SIZE];
>         int pins_count;
>         int i;
>         int ret;
> +       bool found = false;
>
>         pins_count = pinctrl_get_pins_count(dev);
>
>         if (pins_count < 0) {
>                 printf("Ops get_pins_count not supported by %s\n", dev->name);
> -               return;
> +               return found;

Here found will be false, so I think you are conflating different
errors. Better to return pins_count in this case.

>         }
>
>         for (i = 0; i < pins_count; i++) {
> @@ -61,43 +62,59 @@ static void show_pinmux(struct udevice *dev)
>                 if (ret) {
>                         printf("Ops get_pin_name error (%d) by %s\n",
>                                ret, dev->name);
> -                       return;
> +                       return found;
>                 }
> -
> +               if (name && strcmp(name, pin_name))
> +                       continue;
> +               found = true;
>                 ret = pinctrl_get_pin_muxing(dev, i, pin_mux, PINMUX_SIZE);
>                 if (ret) {
>                         printf("Ops get_pin_muxing error (%d) by %s in %s\n",
>                                ret, pin_name, dev->name);
> -                       return;
> +                       return found;
>                 }
>
>                 printf("%-*s: %-*s\n", PINNAME_SIZE, pin_name,
>                        PINMUX_SIZE, pin_mux);
>         }
> +
> +       return found;
>  }
>
>  static int do_status(struct cmd_tbl *cmdtp, int flag, int argc,
>                      char *const argv[])
>  {
>         struct udevice *dev;
> +       char *name;
> +       bool found = false;
>
>         if (argc < 2) {
>                 if (!currdev) {
>                         printf("pin-controller device not selected\n");
>                         return CMD_RET_FAILURE;
>                 }
> -               show_pinmux(currdev);
> +               show_pinmux(currdev, NULL);
>                 return CMD_RET_SUCCESS;
>         }
>
>         if (strcmp(argv[1], "-a"))
> -               return CMD_RET_USAGE;
> +               name = argv[1];
> +       else
> +               name = NULL;
>
>         uclass_foreach_dev_probe(UCLASS_PINCTRL, dev) {
> -               /* insert a separator between each pin-controller display */
> -               printf("--------------------------\n");
> -               printf("%s:\n", dev->name);
> -               show_pinmux(dev);
> +               if (!name) {
> +                       /* insert a separator between each pin-controller display */
> +                       printf("--------------------------\n");
> +                       printf("%s:\n", dev->name);
> +               }
> +               if (show_pinmux(dev, name))
> +                       found = true;
> +       }
> +
> +       if (name && !found) {
> +               printf("%s not found\n", name);
> +               return CMD_RET_FAILURE;
>         }
>
>         return CMD_RET_SUCCESS;
> @@ -148,5 +165,5 @@ U_BOOT_CMD(pinmux, CONFIG_SYS_MAXARGS, 1, do_pinmux,
>            "show pin-controller muxing",
>            "list                     - list UCLASS_PINCTRL devices\n"
>            "pinmux dev [pincontroller-name] - select pin-controller device\n"
> -          "pinmux status [-a]              - print pin-controller muxing [for all]\n"
> +          "pinmux status [-a | pin-name]   - print pin-controller muxing [for all | for pin-name]\n"
>  )
> diff --git a/test/py/tests/test_pinmux.py b/test/py/tests/test_pinmux.py
> index b3ae2ab024..fbde1d99b1 100644
> --- a/test/py/tests/test_pinmux.py
> +++ b/test/py/tests/test_pinmux.py
> @@ -82,3 +82,32 @@ def test_pinmux_status(u_boot_console):
>      assert ('P6        : GPIO1 drive-open-drain.' in output)
>      assert ('P7        : GPIO2 bias-pull-down input-enable.' in output)
>      assert ('P8        : GPIO3 bias-disable.' in output)
> +
> + at pytest.mark.buildconfigspec('cmd_pinmux')
> + at pytest.mark.boardspec('sandbox')
> +def test_pinmux_status_pinname(u_boot_console):
> +    """Test that 'pinmux status <pinname>' displays selected pin."""
> +
> +    output = u_boot_console.run_command('pinmux status a5')
> +    assert ('a5        : gpio output .' in output)
> +    assert (not 'pinctrl-gpio:' in output)
> +    assert (not 'pinctrl:' in output)
> +    assert (not 'a6' in output)
> +    assert (not 'P0' in output)
> +    assert (not 'P8' in output)
> +
> +    output = u_boot_console.run_command('pinmux status P7')
> +    assert (not 'pinctrl-gpio:' in output)
> +    assert (not 'pinctrl:' in output)
> +    assert (not 'a5' in output)
> +    assert (not 'P0' in output)
> +    assert (not 'P6' in output)
> +    assert ('P7        : GPIO2 bias-pull-down input-enable.' in output)
> +    assert (not 'P8' in output)
> +
> +    output = u_boot_console.run_command('pinmux status P9')
> +    assert (not 'pinctrl-gpio:' in output)
> +    assert (not 'pinctrl:' in output)
> +    assert (not 'a5' in output)
> +    assert (not 'P8' in output)
> +    assert ('P9 not found' in output)

Can we write this test in C? We can use run_command()...see acpi.c

> --
> 2.17.1
>

Regards,
Simon


More information about the U-Boot mailing list