cmd: pinmux: support pin name in status command
authorPatrick Delaunay <patrick.delaunay@foss.st.com>
Fri, 21 May 2021 07:47:32 +0000 (09:47 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 23 Jul 2021 11:13:25 +0000 (07:13 -0400)
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>
cmd/pinmux.c
test/cmd/Makefile
test/cmd/pinmux.c [new file with mode: 0644]

index 0df78c7..2d23357 100644 (file)
@@ -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"
 )
index 2cfe43a..a59adb1 100644 (file)
@@ -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 (file)
index 0000000..8ae807b
--- /dev/null
@@ -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);