So far, wd has always configured the highest-priority watchdog when multiple are available. Add an optional -d parameter to support configuring the other watchdogs as well. The name passed can be either the watchdog device name (e.g. wdog0) or the hardware device name (e.g. efi-wdt). Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- commands/wd.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/commands/wd.c b/commands/wd.c index f857291f0362..8029bab1ce19 100644 --- a/commands/wd.c +++ b/commands/wd.c @@ -16,6 +16,8 @@ #include <command.h> #include <errno.h> #include <linux/ctype.h> +#include <getopt.h> +#include <complete.h> #include <watchdog.h> /* default timeout in [sec] */ @@ -23,18 +25,30 @@ static unsigned timeout = CONFIG_CMD_WD_DEFAULT_TIMOUT; static int do_wd(int argc, char *argv[]) { + struct watchdog *wd = watchdog_get_default(); + int opt; int rc; - if (argc > 1) { - if (isdigit(*argv[1])) { - timeout = simple_strtoul(argv[1], NULL, 0); + while ((opt = getopt(argc, argv, "d:")) > 0) { + switch (opt) { + case 'd': + wd = watchdog_get_by_name(optarg); + break; + default: + return COMMAND_ERROR_USAGE; + } + } + + if (optind < argc) { + if (isdigit(*argv[optind])) { + timeout = simple_strtoul(argv[optind], NULL, 0); } else { printf("numerical parameter expected\n"); - return 1; + return COMMAND_ERROR_USAGE; } } - rc = watchdog_set_timeout(watchdog_get_default(), timeout); + rc = watchdog_set_timeout(wd, timeout); if (rc < 0) { switch (rc) { case -EINVAL: @@ -43,12 +57,15 @@ static int do_wd(int argc, char *argv[]) case -ENOSYS: printf("Watchdog cannot be disabled\n"); break; + case -ENODEV: + printf("Watchdog device doesn't exist.\n"); + break; default: printf("Watchdog fails: '%s'\n", strerror(-rc)); break; } - return 1; + return COMMAND_ERROR; } return 0; @@ -58,12 +75,15 @@ BAREBOX_CMD_HELP_START(wd) BAREBOX_CMD_HELP_TEXT("Enable the watchdog to bark in TIME seconds.") BAREBOX_CMD_HELP_TEXT("When TIME is 0, the watchdog gets disabled,") BAREBOX_CMD_HELP_TEXT("Without a parameter the watchdog will be re-triggered.") +BAREBOX_CMD_HELP_TEXT("Options:") +BAREBOX_CMD_HELP_OPT("-d DEVICE\t", "watchdog name (default is highest priority watchdog)") BAREBOX_CMD_HELP_END BAREBOX_CMD_START(wd) .cmd = do_wd, BAREBOX_CMD_DESC("enable/disable/trigger the watchdog") - BAREBOX_CMD_OPTS("[TIME]") + BAREBOX_CMD_OPTS("[-d DEVICE] [TIME]") BAREBOX_CMD_GROUP(CMD_GRP_HWMANIP) BAREBOX_CMD_HELP(cmd_wd_help) + BAREBOX_CMD_COMPLETE(device_complete) BAREBOX_CMD_END -- 2.23.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox