reset.c 933 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
  4. */
  5. #include <common.h>
  6. #include <command.h>
  7. #include <asm/io.h>
  8. #define AONSYS_RSTGEN_BASE ((void __iomem *)0xFFFFF44000UL)
  9. #define REG_RST_REQ_EN_0 (AONSYS_RSTGEN_BASE + 0x140)
  10. #define WDT0_SYS_RST_REQ (1 << 8)
  11. static __attribute__((naked))void sys_wdt_reset(void)
  12. {
  13. uint32_t data;
  14. /* wdt0 reset enable */
  15. data = readl(REG_RST_REQ_EN_0);
  16. data |= WDT0_SYS_RST_REQ;
  17. writel(data, REG_RST_REQ_EN_0);
  18. asm volatile (
  19. "1: \n\r"
  20. "li a0, 0xFFEFC30000 \n\r"
  21. "li a1, 1 \n\r"
  22. "sw a1, 0(a0) \n\r"
  23. "sw a1, 4(a0) \n\r"
  24. "j 1b \n\r"
  25. "ret \n\r"
  26. );
  27. }
  28. int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  29. {
  30. printf("resetting ...\n");
  31. sys_wdt_reset();
  32. hang();
  33. return 0;
  34. }