]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
board: freescale: p1_p2_rdb_pc: Turn off watchdog before reset
authorPali Rohár <pali@kernel.org>
Mon, 1 Aug 2022 13:31:46 +0000 (15:31 +0200)
committerPeng Fan <peng.fan@nxp.com>
Tue, 6 Sep 2022 06:08:35 +0000 (14:08 +0800)
P1/P2 RDB boards have external max6370 watchdog connected to CPLD and this
watchdog is not deactivated on board reset. So if it is active during board
reset, it can trigger another reset when CPU is booting U-Boot. To prevent
possible infinite reset loop caused by external watchdog, turn it off
before reset.

Do it via a new board_reset_prepare() callback which is called from
do_reset() function before any reset sequence.

Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
arch/powerpc/cpu/mpc85xx/cpu.c
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c

index 3a503b9b4f2c18642f8e6d2015ddc9dc772cd315..14d5c560bf832f09026e41c07b2583c16b4d4c0d 100644 (file)
@@ -44,6 +44,7 @@ __board_reset(void)
 {
        /* Do nothing */
 }
+void board_reset_prepare(void) __attribute__((weak, alias("__board_reset")));
 void board_reset(void) __attribute__((weak, alias("__board_reset")));
 void board_reset_last(void) __attribute__((weak, alias("__board_reset")));
 
@@ -320,6 +321,9 @@ int do_reset(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 #else
        volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 
+       /* Call board-specific preparation for reset */
+       board_reset_prepare();
+
        /* Attempt board-specific reset */
        board_reset();
 
index e690fb4fbceae156d4acffea0806c3b7462a4db7..25906d3fc01384abb19f1c4bd55ef983e9bc8d80 100644 (file)
@@ -83,6 +83,18 @@ struct cpld_data {
 #define CPLD_FXS_LED   0x0F
 #define CPLD_SYS_RST   0x00
 
+void board_reset_prepare(void)
+{
+       /*
+        * During reset preparation, turn off external watchdog.
+        * This ensures that external watchdog does not trigger
+        * another reset or possible infinite reset loop.
+        */
+       struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);
+       out_8(&cpld_data->wd_cfg, CPLD_WD_CFG);
+       in_8(&cpld_data->wd_cfg); /* Read back to sync write */
+}
+
 void board_reset_last(void)
 {
        struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);