[PATCH v3 1/2] cmd: pinmux: update result of do_status

Update the result of do_status and always returns a CMD_RET_ value (-ENOSYS was a possible result of show_pinmux).
This patch also adds pincontrol name in error messages (dev->name) and treats correctly the status sub command when pin-controller device is not selected.
Signed-off-by: Patrick Delaunay patrick.delaunay@foss.st.com Reviewed-by: Simon Glass sjg@chromium.org ---
(no changes since v2)
Changes in v2: - keep result in show_pinmux - add comment in API pinctrl_get_pins_count() for -ENOSYS result
cmd/pinmux.c | 31 +++++++++++++++++-------------- include/dm/pinctrl.h | 2 +- test/py/tests/test_pinmux.py | 4 ++-- 3 files changed, 20 insertions(+), 17 deletions(-)
diff --git a/cmd/pinmux.c b/cmd/pinmux.c index 9942b15419..0df78c71da 100644 --- a/cmd/pinmux.c +++ b/cmd/pinmux.c @@ -52,20 +52,21 @@ static int show_pinmux(struct udevice *dev) pins_count = pinctrl_get_pins_count(dev);
if (pins_count == -ENOSYS) { - printf("Ops get_pins_count not supported\n"); + printf("Ops get_pins_count not supported by %s\n", dev->name); return pins_count; }
for (i = 0; i < pins_count; i++) { ret = pinctrl_get_pin_name(dev, i, pin_name, PINNAME_SIZE); - if (ret == -ENOSYS) { - printf("Ops get_pin_name not supported\n"); + if (ret) { + printf("Ops get_pin_name error (%d) by %s\n", ret, dev->name); return ret; }
ret = pinctrl_get_pin_muxing(dev, i, pin_mux, PINMUX_SIZE); if (ret) { - printf("Ops get_pin_muxing error (%d)\n", ret); + printf("Ops get_pin_muxing error (%d) by %s in %s\n", + ret, pin_name, dev->name); return ret; }
@@ -80,25 +81,27 @@ static int do_status(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct udevice *dev; - int ret = CMD_RET_USAGE;
- if (currdev && (argc < 2 || strcmp(argv[1], "-a"))) - return show_pinmux(currdev); + if (argc < 2) { + if (!currdev) { + printf("pin-controller device not selected\n"); + return CMD_RET_FAILURE; + } + show_pinmux(currdev); + return CMD_RET_SUCCESS; + }
- if (argc < 2 || strcmp(argv[1], "-a")) - return ret; + if (strcmp(argv[1], "-a")) + return CMD_RET_USAGE;
uclass_foreach_dev_probe(UCLASS_PINCTRL, dev) { /* insert a separator between each pin-controller display */ printf("--------------------------\n"); printf("%s:\n", dev->name); - ret = show_pinmux(dev); - if (ret < 0) - printf("Can't display pin muxing for %s\n", - dev->name); + show_pinmux(dev); }
- return ret; + return CMD_RET_SUCCESS; }
static int do_list(struct cmd_tbl *cmdtp, int flag, int argc, diff --git a/include/dm/pinctrl.h b/include/dm/pinctrl.h index 1bdc8d3cbd..695e78ad0d 100644 --- a/include/dm/pinctrl.h +++ b/include/dm/pinctrl.h @@ -587,7 +587,7 @@ int pinctrl_get_pin_muxing(struct udevice *dev, int selector, char *buf, * * This allows to know the number of pins owned by a given pin-controller * - * Return: Number of pins if OK, or negative error code on failure + * Return: Number of pins if OK, or -ENOSYS when not supported */ int pinctrl_get_pins_count(struct udevice *dev);
diff --git a/test/py/tests/test_pinmux.py b/test/py/tests/test_pinmux.py index 0cbbae000c..b3ae2ab024 100644 --- a/test/py/tests/test_pinmux.py +++ b/test/py/tests/test_pinmux.py @@ -13,9 +13,9 @@ def test_pinmux_usage_1(u_boot_console): @pytest.mark.buildconfigspec('cmd_pinmux') def test_pinmux_usage_2(u_boot_console): """Test that 'pinmux status' executed without previous "pinmux dev" - command displays pinmux usage.""" + command displays error message.""" output = u_boot_console.run_command('pinmux status') - assert 'Usage:' in output + assert 'pin-controller device not selected' in output
@pytest.mark.buildconfigspec('cmd_pinmux') @pytest.mark.boardspec('sandbox')

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@foss.st.com Reviewed-by: Simon Glass sjg@chromium.org ---
Changes in v3: - add comment on show_pinmux() arguments - add Simon reviewed-by
Changes in v2: - use -ENOENT when the pin name is not found - move the added pytests in a C file cmd/pinmux.c
cmd/pinmux.c | 46 +++++++++++++++++++++++++++++++++++++--------- test/cmd/Makefile | 1 + test/cmd/pinmux.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 test/cmd/pinmux.c
diff --git a/cmd/pinmux.c b/cmd/pinmux.c index 0df78c71da..2d23357526 100644 --- a/cmd/pinmux.c +++ b/cmd/pinmux.c @@ -41,13 +41,22 @@ static int do_dev(struct cmd_tbl *cmdtp, int flag, int argc, return CMD_RET_SUCCESS; }
-static int show_pinmux(struct udevice *dev) +/** + * Print the muxing information for one or all pins of one pinctrl device + * + * @param dev pinctrl device + * @param name NULL to display all the pins + * or name of the pin to display + * @return 0 on success, non-0 on error + */ +static int show_pinmux(struct udevice *dev, char *name) { 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);
@@ -62,7 +71,9 @@ static int show_pinmux(struct udevice *dev) printf("Ops get_pin_name error (%d) by %s\n", ret, dev->name); return ret; } - + 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", @@ -74,6 +85,9 @@ static int show_pinmux(struct udevice *dev) PINMUX_SIZE, pin_mux); }
+ if (!found) + return -ENOENT; + return 0; }
@@ -81,24 +95,38 @@ static int do_status(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct udevice *dev; + char *name; + int ret;
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); + } + ret = show_pinmux(dev, name); + /* stop when the status of requested pin is displayed */ + if (name && !ret) + return CMD_RET_SUCCESS; + } + + if (name) { + printf("%s not found\n", name); + return CMD_RET_FAILURE; }
return CMD_RET_SUCCESS; @@ -149,5 +177,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/cmd/Makefile b/test/cmd/Makefile index 2cfe43a6bd..a59adb1e6d 100644 --- a/test/cmd/Makefile +++ b/test/cmd/Makefile @@ -8,5 +8,6 @@ endif obj-y += mem.o obj-$(CONFIG_CMD_ADDRMAP) += addrmap.o obj-$(CONFIG_CMD_MEM_SEARCH) += mem_search.o +obj-$(CONFIG_CMD_PINMUX) += pinmux.o obj-$(CONFIG_CMD_PWM) += pwm.o obj-$(CONFIG_CMD_SETEXPR) += setexpr.o diff --git a/test/cmd/pinmux.c b/test/cmd/pinmux.c new file mode 100644 index 0000000000..8ae807b537 --- /dev/null +++ b/test/cmd/pinmux.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Executes tests for pinmux command + * + * Copyright (C) 2021, STMicroelectronics - All Rights Reserved + */ + +#include <common.h> +#include <command.h> +#include <dm/test.h> +#include <test/test.h> +#include <test/ut.h> + +static int dm_test_cmd_pinmux_status_pinname(struct unit_test_state *uts) +{ + /* Test that 'pinmux status <pinname>' displays the selected pin. */ + console_record_reset(); + run_command("pinmux status a5", 0); + ut_assert_nextline("a5 : gpio input . "); + ut_assert_console_end(); + + console_record_reset(); + run_command("pinmux status P7", 0); + ut_assert_nextline("P7 : GPIO2 bias-pull-down input-enable. "); + ut_assert_console_end(); + + console_record_reset(); + run_command("pinmux status P9", 0); + ut_assert_nextline("single-pinctrl pinctrl-single-no-width: missing register width"); + ut_assert_nextline("P9 not found"); + ut_assert_console_end(); + + return 0; +} + +DM_TEST(dm_test_cmd_pinmux_status_pinname, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);

On Fri, May 21, 2021 at 09:47:32AM +0200, Patrick Delaunay 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@foss.st.com Reviewed-by: Simon Glass sjg@chromium.org
Applied to u-boot/master, thanks!

On Fri, May 21, 2021 at 09:47:31AM +0200, Patrick Delaunay wrote:
Update the result of do_status and always returns a CMD_RET_ value (-ENOSYS was a possible result of show_pinmux).
This patch also adds pincontrol name in error messages (dev->name) and treats correctly the status sub command when pin-controller device is not selected.
Signed-off-by: Patrick Delaunay patrick.delaunay@foss.st.com Reviewed-by: Simon Glass sjg@chromium.org
Applied to u-boot/master, thanks!
participants (2)
-
Patrick Delaunay
-
Tom Rini