[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