mirror of
				https://source.denx.de/u-boot/u-boot.git
				synced 2025-10-31 16:31:25 +01:00 
			
		
		
		
	We should not use typedefs in U-Boot. They cannot be used as forward declarations which means that header files must include the full header to access them. Drop the typedef and rename the struct to remove the _s suffix which is now not useful. This requires quite a few header-file additions. Signed-off-by: Simon Glass <sjg@chromium.org>
		
			
				
	
	
		
			175 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0+
 | |
| /*
 | |
|  * Watchdog commands
 | |
|  *
 | |
|  * Copyright (c) 2019 Michael Walle <michael@walle.cc>
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <command.h>
 | |
| #include <dm.h>
 | |
| #include <wdt.h>
 | |
| 
 | |
| static struct udevice *currdev;
 | |
| 
 | |
| static int do_wdt_list(struct cmd_tbl *cmdtp, int flag, int argc,
 | |
| 		       char *const argv[])
 | |
| {
 | |
| 	struct udevice *dev;
 | |
| 	struct uclass *uc;
 | |
| 	int ret;
 | |
| 
 | |
| 	ret = uclass_get(UCLASS_WDT, &uc);
 | |
| 	if (ret)
 | |
| 		return CMD_RET_FAILURE;
 | |
| 
 | |
| 	uclass_foreach_dev(dev, uc)
 | |
| 		printf("%s (%s)\n", dev->name, dev->driver->name);
 | |
| 
 | |
| 	return CMD_RET_SUCCESS;
 | |
| }
 | |
| 
 | |
| static int do_wdt_dev(struct cmd_tbl *cmdtp, int flag, int argc,
 | |
| 		      char *const argv[])
 | |
| {
 | |
| 	int ret;
 | |
| 
 | |
| 	if (argc > 1) {
 | |
| 		ret = uclass_get_device_by_name(UCLASS_WDT, argv[1], &currdev);
 | |
| 		if (ret) {
 | |
| 			printf("Can't get the watchdog timer: %s\n", argv[1]);
 | |
| 			return CMD_RET_FAILURE;
 | |
| 		}
 | |
| 	} else {
 | |
| 		if (!currdev) {
 | |
| 			printf("No watchdog timer device set!\n");
 | |
| 			return CMD_RET_FAILURE;
 | |
| 		}
 | |
| 		printf("dev: %s\n", currdev->name);
 | |
| 	}
 | |
| 
 | |
| 	return CMD_RET_SUCCESS;
 | |
| }
 | |
| 
 | |
| static int check_currdev(void)
 | |
| {
 | |
| 	if (!currdev) {
 | |
| 		printf("No device set, use 'wdt dev' first\n");
 | |
| 		return CMD_RET_FAILURE;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static int do_wdt_start(struct cmd_tbl *cmdtp, int flag, int argc,
 | |
| 			char *const argv[])
 | |
| {
 | |
| 	int ret;
 | |
| 	u64 timeout;
 | |
| 	ulong flags = 0;
 | |
| 
 | |
| 	if (argc < 2)
 | |
| 		return CMD_RET_USAGE;
 | |
| 
 | |
| 	ret = check_currdev();
 | |
| 	if (ret)
 | |
| 		return ret;
 | |
| 
 | |
| 	timeout = simple_strtoull(argv[1], NULL, 0);
 | |
| 	if (argc > 2)
 | |
| 		flags = simple_strtoul(argv[2], NULL, 0);
 | |
| 
 | |
| 	ret = wdt_start(currdev, timeout, flags);
 | |
| 	if (ret == -ENOSYS) {
 | |
| 		printf("Starting watchdog timer not supported.\n");
 | |
| 		return CMD_RET_FAILURE;
 | |
| 	} else if (ret) {
 | |
| 		printf("Starting watchdog timer failed (%d)\n", ret);
 | |
| 		return CMD_RET_FAILURE;
 | |
| 	}
 | |
| 
 | |
| 	return CMD_RET_SUCCESS;
 | |
| }
 | |
| 
 | |
| static int do_wdt_stop(struct cmd_tbl *cmdtp, int flag, int argc,
 | |
| 		       char *const argv[])
 | |
| {
 | |
| 	int ret;
 | |
| 
 | |
| 	ret = check_currdev();
 | |
| 	if (ret)
 | |
| 		return ret;
 | |
| 
 | |
| 	ret = wdt_stop(currdev);
 | |
| 	if (ret == -ENOSYS) {
 | |
| 		printf("Stopping watchdog timer not supported.\n");
 | |
| 		return CMD_RET_FAILURE;
 | |
| 	} else if (ret) {
 | |
| 		printf("Stopping watchdog timer failed (%d)\n", ret);
 | |
| 		return CMD_RET_FAILURE;
 | |
| 	}
 | |
| 
 | |
| 	return CMD_RET_SUCCESS;
 | |
| }
 | |
| 
 | |
| static int do_wdt_reset(struct cmd_tbl *cmdtp, int flag, int argc,
 | |
| 			char *const argv[])
 | |
| {
 | |
| 	int ret;
 | |
| 
 | |
| 	ret = check_currdev();
 | |
| 	if (ret)
 | |
| 		return ret;
 | |
| 
 | |
| 	ret = wdt_reset(currdev);
 | |
| 	if (ret == -ENOSYS) {
 | |
| 		printf("Resetting watchdog timer not supported.\n");
 | |
| 		return CMD_RET_FAILURE;
 | |
| 	} else if (ret) {
 | |
| 		printf("Resetting watchdog timer failed (%d)\n", ret);
 | |
| 		return CMD_RET_FAILURE;
 | |
| 	}
 | |
| 
 | |
| 	return CMD_RET_SUCCESS;
 | |
| }
 | |
| 
 | |
| static int do_wdt_expire(struct cmd_tbl *cmdtp, int flag, int argc,
 | |
| 			 char *const argv[])
 | |
| {
 | |
| 	int ret;
 | |
| 	ulong flags = 0;
 | |
| 
 | |
| 	ret = check_currdev();
 | |
| 	if (ret)
 | |
| 		return ret;
 | |
| 
 | |
| 	if (argc > 1)
 | |
| 		flags = simple_strtoul(argv[1], NULL, 0);
 | |
| 
 | |
| 	ret = wdt_expire_now(currdev, flags);
 | |
| 	if (ret == -ENOSYS) {
 | |
| 		printf("Expiring watchdog timer not supported.\n");
 | |
| 		return CMD_RET_FAILURE;
 | |
| 	} else if (ret) {
 | |
| 		printf("Expiring watchdog timer failed (%d)\n", ret);
 | |
| 		return CMD_RET_FAILURE;
 | |
| 	}
 | |
| 
 | |
| 	return CMD_RET_SUCCESS;
 | |
| }
 | |
| 
 | |
| static char wdt_help_text[] =
 | |
| 	"list - list watchdog devices\n"
 | |
| 	"wdt dev [<name>] - get/set current watchdog device\n"
 | |
| 	"wdt start <timeout ms> [flags] - start watchdog timer\n"
 | |
| 	"wdt stop - stop watchdog timer\n"
 | |
| 	"wdt reset - reset watchdog timer\n"
 | |
| 	"wdt expire [flags] - expire watchdog timer immediately\n";
 | |
| 
 | |
| U_BOOT_CMD_WITH_SUBCMDS(wdt, "Watchdog sub-system", wdt_help_text,
 | |
| 	U_BOOT_SUBCMD_MKENT(list, 1, 1, do_wdt_list),
 | |
| 	U_BOOT_SUBCMD_MKENT(dev, 2, 1, do_wdt_dev),
 | |
| 	U_BOOT_SUBCMD_MKENT(start, 3, 1, do_wdt_start),
 | |
| 	U_BOOT_SUBCMD_MKENT(stop, 1, 1, do_wdt_stop),
 | |
| 	U_BOOT_SUBCMD_MKENT(reset, 1, 1, do_wdt_reset),
 | |
| 	U_BOOT_SUBCMD_MKENT(expire, 2, 1, do_wdt_expire));
 |