
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@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) { 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; }
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) + +@pytest.mark.buildconfigspec('cmd_pinmux') +@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)