ulp_wdog.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2016 Freescale Semiconductor, Inc.
  4. */
  5. #include <common.h>
  6. #include <asm/io.h>
  7. #include <asm/arch/imx-regs.h>
  8. /*
  9. * MX7ULP WDOG Register Map
  10. */
  11. struct wdog_regs {
  12. u8 cs1;
  13. u8 cs2;
  14. u16 reserve0;
  15. u32 cnt;
  16. u32 toval;
  17. u32 win;
  18. };
  19. #ifndef CONFIG_WATCHDOG_TIMEOUT_MSECS
  20. #define CONFIG_WATCHDOG_TIMEOUT_MSECS 0x1500
  21. #endif
  22. #define REFRESH_WORD0 0xA602 /* 1st refresh word */
  23. #define REFRESH_WORD1 0xB480 /* 2nd refresh word */
  24. #define UNLOCK_WORD0 0xC520 /* 1st unlock word */
  25. #define UNLOCK_WORD1 0xD928 /* 2nd unlock word */
  26. #define WDGCS1_WDGE (1<<7)
  27. #define WDGCS1_WDGUPDATE (1<<5)
  28. #define WDGCS2_FLG (1<<6)
  29. #define WDG_BUS_CLK (0x0)
  30. #define WDG_LPO_CLK (0x1)
  31. #define WDG_32KHZ_CLK (0x2)
  32. #define WDG_EXT_CLK (0x3)
  33. void hw_watchdog_set_timeout(u16 val)
  34. {
  35. /* setting timeout value */
  36. struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
  37. writel(val, &wdog->toval);
  38. }
  39. void hw_watchdog_reset(void)
  40. {
  41. struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
  42. writel(REFRESH_WORD0, &wdog->cnt);
  43. writel(REFRESH_WORD1, &wdog->cnt);
  44. }
  45. void hw_watchdog_init(void)
  46. {
  47. u8 val;
  48. struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
  49. writel(UNLOCK_WORD0, &wdog->cnt);
  50. writel(UNLOCK_WORD1, &wdog->cnt);
  51. val = readb(&wdog->cs2);
  52. val |= WDGCS2_FLG;
  53. writeb(val, &wdog->cs2);
  54. hw_watchdog_set_timeout(CONFIG_WATCHDOG_TIMEOUT_MSECS);
  55. writel(0, &wdog->win);
  56. writeb(WDG_LPO_CLK, &wdog->cs2);/* setting 1-kHz clock source */
  57. writeb((WDGCS1_WDGE | WDGCS1_WDGUPDATE), &wdog->cs1);/* enable counter running */
  58. hw_watchdog_reset();
  59. }
  60. void reset_cpu(ulong addr)
  61. {
  62. struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
  63. writel(UNLOCK_WORD0, &wdog->cnt);
  64. writel(UNLOCK_WORD1, &wdog->cnt);
  65. hw_watchdog_set_timeout(5); /* 5ms timeout */
  66. writel(0, &wdog->win);
  67. writeb(WDG_LPO_CLK, &wdog->cs2);/* setting 1-kHz clock source */
  68. writeb(WDGCS1_WDGE, &wdog->cs1);/* enable counter running */
  69. hw_watchdog_reset();
  70. while (1);
  71. }