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.delau...@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)
-- 
2.17.1

Reply via email to