summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Delaunay <patrick.delaunay@foss.st.com>2021-05-21 10:47:32 +0300
committerTom Rini <trini@konsulko.com>2021-07-23 14:13:25 +0300
commitfea0345992fac2a2b2bd20d72b666ce948c9c99b (patch)
tree837a5e1bc9305ceef8460282dadf37cc434721f6
parent4c60fd993a21a285c645c6d46762d8c2992b7dd7 (diff)
downloadu-boot-fea0345992fac2a2b2bd20d72b666ce948c9c99b.tar.xz
cmd: pinmux: support pin name in status command
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>
-rw-r--r--cmd/pinmux.c46
-rw-r--r--test/cmd/Makefile1
-rw-r--r--test/cmd/pinmux.c36
3 files changed, 74 insertions, 9 deletions
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);