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

