Default is a second global reset which causes a system hang on a timeout
in U-Boot.

Access the register through the rk3568_cru struct to match how PX30 does
it in arch_cpu_init().

Verified on the Hardkernel ODROID-M1S (RK3566): a watchdog timeout now
cleanly reboots the board.

Signed-off-by: Andreas Zdziarstek <[email protected]>
---
 arch/arm/mach-rockchip/rk3568/rk3568.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/arch/arm/mach-rockchip/rk3568/rk3568.c 
b/arch/arm/mach-rockchip/rk3568/rk3568.c
index 2b1eafee37c..8bed529a5c1 100644
--- a/arch/arm/mach-rockchip/rk3568/rk3568.c
+++ b/arch/arm/mach-rockchip/rk3568/rk3568.c
@@ -9,6 +9,7 @@
 #include <misc.h>
 #include <asm/armv8/mmu.h>
 #include <asm/arch-rockchip/bootrom.h>
+#include <asm/arch-rockchip/cru_rk3568.h>
 #include <asm/arch-rockchip/grf_rk3568.h>
 #include <asm/arch-rockchip/hardware.h>
 #include <dt-bindings/clock/rk3568-cru.h>
@@ -37,6 +38,9 @@
 #define CPU_GRF_BASE           0xfdc30000
 #define GRF_CORE_PVTPLL_CON0   (0x10)
 
+#define CRU_BASE               0xfdd20000
+#define WDT_GLB_SRST_CTRL      BIT(1)
+
 /* PMU_GRF_GPIO0D_IOMUX_L */
 enum {
        GPIO0D1_SHIFT           = 4,
@@ -117,6 +121,8 @@ void board_debug_uart_init(void)
 int arch_cpu_init(void)
 {
 #ifdef CONFIG_XPL_BUILD
+       static struct rk3568_cru * const cru = (void *)CRU_BASE;
+
        /*
         * When perform idle operation, corresponding clock can
         * be opened or gated automatically.
@@ -145,6 +151,9 @@ int arch_cpu_init(void)
        /* Enable VO power domain for display */
        writel((PMU_PD_VO_DWN_ENA << 16),
               PMU_BASE_ADDR + PMU_PWR_GATE_SFTCON);
+
+       /* Make WDT trigger a first global reset */
+       setbits_le32(&cru->glb_rst_con, WDT_GLB_SRST_CTRL);
 #endif
        return 0;
 }
-- 
2.53.0

Reply via email to