s5p_wdt.c 880 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /*
  2. * Copyright (C) 2012 Samsung Electronics
  3. * Minkyu Kang <mk7.kang@samsung.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <asm/io.h>
  9. #include <asm/arch/watchdog.h>
  10. #define PRESCALER_VAL 255
  11. void wdt_stop(void)
  12. {
  13. struct s5p_watchdog *wdt =
  14. (struct s5p_watchdog *)samsung_get_base_watchdog();
  15. unsigned int wtcon;
  16. wtcon = readl(&wdt->wtcon);
  17. wtcon &= ~(WTCON_EN | WTCON_INT | WTCON_RESET);
  18. writel(wtcon, &wdt->wtcon);
  19. }
  20. void wdt_start(unsigned int timeout)
  21. {
  22. struct s5p_watchdog *wdt =
  23. (struct s5p_watchdog *)samsung_get_base_watchdog();
  24. unsigned int wtcon;
  25. wdt_stop();
  26. wtcon = readl(&wdt->wtcon);
  27. wtcon |= (WTCON_EN | WTCON_CLK(WTCON_CLK_128));
  28. wtcon &= ~WTCON_INT;
  29. wtcon |= WTCON_RESET;
  30. wtcon |= WTCON_PRESCALER(PRESCALER_VAL);
  31. writel(timeout, &wdt->wtdat);
  32. writel(timeout, &wdt->wtcnt);
  33. writel(wtcon, &wdt->wtcon);
  34. }