rockchip: disable watchdog during suspend
The CA53 and CM0 WDT clock gating in rk3399 SGRF, and ATF is in charge of
it because the kernel can't touch SGRF.
Basically the WDT didn't stop at suspend time, it just switched from the
24M to the 32k clock. That meant that the WDT would fire if you slept for
long enough. In other word, the watchdog timer over count will increase to
750 (24*1000/32) times.
The RK3399 HW watchdog interval is 21 seconds. When machine enters the
suspend, the watchdog will reset the system after 35.7 (750/21) hours.
BUG=chrome-os-partner:59257
TEST=daisydog checked and set value, powerd_dbus_suspend to verify.
Change-Id: I88bb2a05b7d67d5ffd292f9d05d033ae9a6a3593
Signed-off-by: Caesar Wang <wxt@rock-chips.com>
diff --git a/plat/rockchip/rk3399/drivers/soc/soc.c b/plat/rockchip/rk3399/drivers/soc/soc.c
index 9529cb2..f77b74f 100644
--- a/plat/rockchip/rk3399/drivers/soc/soc.c
+++ b/plat/rockchip/rk3399/drivers/soc/soc.c
@@ -192,6 +192,28 @@
/* pll suspend */
struct deepsleep_data_s slp_data;
+void secure_watchdog_disable(void)
+{
+ slp_data.sgrf_con[3] = mmio_read_32(SGRF_BASE + SGRF_SOC_CON3_7(3));
+
+ /* disable CA53 wdt pclk */
+ mmio_write_32(SGRF_BASE + SGRF_SOC_CON3_7(3),
+ BITS_WITH_WMASK(WDT_CA53_DIS, WDT_CA53_1BIT_MASK,
+ PCLK_WDT_CA53_GATE_SHIFT));
+ /* disable CM0 wdt pclk */
+ mmio_write_32(SGRF_BASE + SGRF_SOC_CON3_7(3),
+ BITS_WITH_WMASK(WDT_CM0_DIS, WDT_CM0_1BIT_MASK,
+ PCLK_WDT_CM0_GATE_SHIFT));
+}
+
+void secure_watchdog_restore(void)
+{
+ mmio_write_32(SGRF_BASE + SGRF_SOC_CON3_7(3),
+ slp_data.sgrf_con[3] |
+ WMSK_BIT(PCLK_WDT_CA53_GATE_SHIFT) |
+ WMSK_BIT(PCLK_WDT_CM0_GATE_SHIFT));
+}
+
static void pll_suspend_prepare(uint32_t pll_id)
{
int i;