Hi Patrick, On Thu, 6 May 2021 at 02:38, Patrick DELAUNAY <patrick.delau...@foss.st.com> wrote: > > Hi, > > On 4/29/21 6:10 PM, Simon Glass wrote: > > Hi Patrick, > > > > On Wed, 28 Oct 2020 at 03:06, Patrick Delaunay <patrick.delau...@st.com> > > wrote: > >> 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) > > How about returning -ENOENT if there is no pin. > > > OK > > > >> { > >> 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; > > Here found will be false, so I think you are conflating different > > errors. Better to return pins_count in this case. > OK > >> } > >> > >> 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) > > Can we write this test in C? We can use run_command()...see acpi.c > > > Any reason to prefer C test to python... > > I just complete the existing pinmux tests. > > For performance ?
I wrote this up here: https://u-boot.readthedocs.io/en/latest/develop/tests_writing.html > > other pinmux tests in already python should be migrate also ? They may as well be, to the extent that they only run on sandbox. Regards, SImon