summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2019-10-23 18:56:01 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2019-10-29 10:23:43 +0100
commitb7a06921166d44f0bc3c6638144351382fef409d (patch)
treebdd1407dabf43a5a3a64cb879e1554c54c7c44c0 /commands
parent9ba3943ce613c179740957e85405b4c832323ddb (diff)
downloadbarebox-b7a06921166d44f0bc3c6638144351382fef409d.tar.gz
commands: wd: support configuring watchdog by name
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@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands')
-rw-r--r--commands/wd.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/commands/wd.c b/commands/wd.c
index f857291..8029bab 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