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 +#include +#include +#include +#include + +static int dm_test_cmd_pinmux_status_pinname(struct unit_test_state *uts) +{ + /* Test that 'pinmux status ' 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);