wd_timer.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /*
  2. * OMAP2+ MPU WD_TIMER-specific code
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. */
  9. #include <linux/kernel.h>
  10. #include <linux/io.h>
  11. #include <linux/err.h>
  12. #include <plat/omap_hwmod.h>
  13. /*
  14. * In order to avoid any assumptions from bootloader regarding WDT
  15. * settings, WDT module is reset during init. This enables the watchdog
  16. * timer. Hence it is required to disable the watchdog after the WDT reset
  17. * during init. Otherwise the system would reboot as per the default
  18. * watchdog timer registers settings.
  19. */
  20. #define OMAP_WDT_WPS 0x34
  21. #define OMAP_WDT_SPR 0x48
  22. int omap2_wd_timer_disable(struct omap_hwmod *oh)
  23. {
  24. void __iomem *base;
  25. if (!oh) {
  26. pr_err("%s: Could not look up wdtimer_hwmod\n", __func__);
  27. return -EINVAL;
  28. }
  29. base = omap_hwmod_get_mpu_rt_va(oh);
  30. if (!base) {
  31. pr_err("%s: Could not get the base address for %s\n",
  32. oh->name, __func__);
  33. return -EINVAL;
  34. }
  35. /* sequence required to disable watchdog */
  36. __raw_writel(0xAAAA, base + OMAP_WDT_SPR);
  37. while (__raw_readl(base + OMAP_WDT_WPS) & 0x10)
  38. cpu_relax();
  39. __raw_writel(0x5555, base + OMAP_WDT_SPR);
  40. while (__raw_readl(base + OMAP_WDT_WPS) & 0x10)
  41. cpu_relax();
  42. return 0;
  43. }