wdt.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Watchdog commands
  4. *
  5. * Copyright (c) 2019 Michael Walle <michael@walle.cc>
  6. */
  7. #include <common.h>
  8. #include <command.h>
  9. #include <dm.h>
  10. #include <wdt.h>
  11. static struct udevice *currdev;
  12. static int do_wdt_list(struct cmd_tbl *cmdtp, int flag, int argc,
  13. char *const argv[])
  14. {
  15. struct udevice *dev;
  16. struct uclass *uc;
  17. int ret;
  18. ret = uclass_get(UCLASS_WDT, &uc);
  19. if (ret)
  20. return CMD_RET_FAILURE;
  21. uclass_foreach_dev(dev, uc)
  22. printf("%s (%s)\n", dev->name, dev->driver->name);
  23. return CMD_RET_SUCCESS;
  24. }
  25. static int do_wdt_dev(struct cmd_tbl *cmdtp, int flag, int argc,
  26. char *const argv[])
  27. {
  28. int ret;
  29. if (argc > 1) {
  30. ret = uclass_get_device_by_name(UCLASS_WDT, argv[1], &currdev);
  31. if (ret) {
  32. printf("Can't get the watchdog timer: %s\n", argv[1]);
  33. return CMD_RET_FAILURE;
  34. }
  35. } else {
  36. if (!currdev) {
  37. printf("No watchdog timer device set!\n");
  38. return CMD_RET_FAILURE;
  39. }
  40. printf("dev: %s\n", currdev->name);
  41. }
  42. return CMD_RET_SUCCESS;
  43. }
  44. static int check_currdev(void)
  45. {
  46. if (!currdev) {
  47. printf("No device set, use 'wdt dev' first\n");
  48. return CMD_RET_FAILURE;
  49. }
  50. return 0;
  51. }
  52. static int do_wdt_start(struct cmd_tbl *cmdtp, int flag, int argc,
  53. char *const argv[])
  54. {
  55. int ret;
  56. u64 timeout;
  57. ulong flags = 0;
  58. if (argc < 2)
  59. return CMD_RET_USAGE;
  60. ret = check_currdev();
  61. if (ret)
  62. return ret;
  63. timeout = simple_strtoull(argv[1], NULL, 0);
  64. if (argc > 2)
  65. flags = simple_strtoul(argv[2], NULL, 0);
  66. ret = wdt_start(currdev, timeout, flags);
  67. if (ret == -ENOSYS) {
  68. printf("Starting watchdog timer not supported.\n");
  69. return CMD_RET_FAILURE;
  70. } else if (ret) {
  71. printf("Starting watchdog timer failed (%d)\n", ret);
  72. return CMD_RET_FAILURE;
  73. }
  74. return CMD_RET_SUCCESS;
  75. }
  76. static int do_wdt_stop(struct cmd_tbl *cmdtp, int flag, int argc,
  77. char *const argv[])
  78. {
  79. int ret;
  80. ret = check_currdev();
  81. if (ret)
  82. return ret;
  83. ret = wdt_stop(currdev);
  84. if (ret == -ENOSYS) {
  85. printf("Stopping watchdog timer not supported.\n");
  86. return CMD_RET_FAILURE;
  87. } else if (ret) {
  88. printf("Stopping watchdog timer failed (%d)\n", ret);
  89. return CMD_RET_FAILURE;
  90. }
  91. return CMD_RET_SUCCESS;
  92. }
  93. static int do_wdt_reset(struct cmd_tbl *cmdtp, int flag, int argc,
  94. char *const argv[])
  95. {
  96. int ret;
  97. ret = check_currdev();
  98. if (ret)
  99. return ret;
  100. ret = wdt_reset(currdev);
  101. if (ret == -ENOSYS) {
  102. printf("Resetting watchdog timer not supported.\n");
  103. return CMD_RET_FAILURE;
  104. } else if (ret) {
  105. printf("Resetting watchdog timer failed (%d)\n", ret);
  106. return CMD_RET_FAILURE;
  107. }
  108. return CMD_RET_SUCCESS;
  109. }
  110. static int do_wdt_expire(struct cmd_tbl *cmdtp, int flag, int argc,
  111. char *const argv[])
  112. {
  113. int ret;
  114. ulong flags = 0;
  115. ret = check_currdev();
  116. if (ret)
  117. return ret;
  118. if (argc > 1)
  119. flags = simple_strtoul(argv[1], NULL, 0);
  120. ret = wdt_expire_now(currdev, flags);
  121. if (ret == -ENOSYS) {
  122. printf("Expiring watchdog timer not supported.\n");
  123. return CMD_RET_FAILURE;
  124. } else if (ret) {
  125. printf("Expiring watchdog timer failed (%d)\n", ret);
  126. return CMD_RET_FAILURE;
  127. }
  128. return CMD_RET_SUCCESS;
  129. }
  130. static char wdt_help_text[] =
  131. "list - list watchdog devices\n"
  132. "wdt dev [<name>] - get/set current watchdog device\n"
  133. "wdt start <timeout ms> [flags] - start watchdog timer\n"
  134. "wdt stop - stop watchdog timer\n"
  135. "wdt reset - reset watchdog timer\n"
  136. "wdt expire [flags] - expire watchdog timer immediately\n";
  137. U_BOOT_CMD_WITH_SUBCMDS(wdt, "Watchdog sub-system", wdt_help_text,
  138. U_BOOT_SUBCMD_MKENT(list, 1, 1, do_wdt_list),
  139. U_BOOT_SUBCMD_MKENT(dev, 2, 1, do_wdt_dev),
  140. U_BOOT_SUBCMD_MKENT(start, 3, 1, do_wdt_start),
  141. U_BOOT_SUBCMD_MKENT(stop, 1, 1, do_wdt_stop),
  142. U_BOOT_SUBCMD_MKENT(reset, 1, 1, do_wdt_reset),
  143. U_BOOT_SUBCMD_MKENT(expire, 2, 1, do_wdt_expire));