| diff --git a/board/solidrun/clearfog/clearfog.c b/board/solidrun/clearfog/clearfog.c |
| index 8906636f76..f94bd5e465 100644 |
| --- a/board/solidrun/clearfog/clearfog.c |
| +++ b/board/solidrun/clearfog/clearfog.c |
| @@ -11,10 +11,15 @@ |
| #include <asm/io.h> |
| #include <asm/arch/cpu.h> |
| #include <asm/arch/soc.h> |
| +#include <dm/uclass.h> |
| |
| #include "../drivers/ddr/marvell/a38x/ddr3_a38x_topology.h" |
| #include <../serdes/a38x/high_speed_env_spec.h> |
| |
| +#ifdef CONFIG_WDT_ORION |
| +# include <wdt.h> |
| +#endif |
| + |
| DECLARE_GLOBAL_DATA_PTR; |
| |
| #define ETH_PHY_CTRL_REG 0 |
| @@ -122,6 +127,10 @@ int board_early_init_f(void) |
| return 0; |
| } |
| |
| +#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT_ORION) |
| +static struct udevice *watchdog_dev = NULL; |
| +#endif |
| + |
| int board_init(void) |
| { |
| int i; |
| @@ -129,6 +138,18 @@ int board_init(void) |
| /* Address of boot parameters */ |
| gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100; |
| |
| +#ifndef CONFIG_SPL_BUILD |
| +# ifdef CONFIG_WDT_ORION |
| + if (uclass_get_device(UCLASS_WDT, 0, &watchdog_dev)) { |
| + puts("Cannot find Armada 385 watchdog!\n"); |
| + } else { |
| + puts("Enabling Armada 385 watchdog.\n"); |
| + /* one minute */ |
| + wdt_start(watchdog_dev, (u32) 25000000 * 60, 0); |
| + } |
| +# endif |
| +#endif |
| + |
| /* Toggle GPIO41 to reset onboard switch and phy */ |
| clrbits_le32(MVEBU_GPIO1_BASE + 0x0, BIT(9)); |
| clrbits_le32(MVEBU_GPIO1_BASE + 0x4, BIT(9)); |
| @@ -147,6 +168,28 @@ int board_init(void) |
| return 0; |
| } |
| |
| +#ifdef CONFIG_WATCHDOG |
| +/* Called by macro WATCHDOG_RESET */ |
| +void watchdog_reset(void) |
| +{ |
| +# if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT_ORION) |
| + static ulong next_reset = 0; |
| + ulong now; |
| + |
| + if (!watchdog_dev) |
| + return; |
| + |
| + now = timer_get_us(); |
| + |
| + /* Do not reset the watchdog too often */ |
| + if (now > next_reset) { |
| + wdt_reset(watchdog_dev); |
| + next_reset = now + 1000; |
| + } |
| +# endif |
| +} |
| +#endif |
| + |
| int checkboard(void) |
| { |
| puts("Board: SolidRun ClearFog\n"); |
| diff --git a/configs/clearfog_defconfig b/configs/clearfog_defconfig |
| index 5eceacf491..fd48b0db02 100644 |
| --- a/configs/clearfog_defconfig |
| +++ b/configs/clearfog_defconfig |
| @@ -46,3 +46,5 @@ CONFIG_USB=y |
| CONFIG_DM_USB=y |
| CONFIG_USB_EHCI_HCD=y |
| CONFIG_USB_STORAGE=y |
| +CONFIG_WDT=y |
| +CONFIG_WDT_ORION=y |
| diff --git a/include/configs/clearfog.h b/include/configs/clearfog.h |
| index 5061f6c6fd..fe9f515867 100644 |
| --- a/include/configs/clearfog.h |
| +++ b/include/configs/clearfog.h |
| @@ -32,6 +32,11 @@ |
| #define CONFIG_SYS_I2C_SLAVE 0x0 |
| #define CONFIG_SYS_I2C_SPEED 100000 |
| |
| +/* Watchdog */ |
| +#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT_ORION) |
| +# define CONFIG_WATCHDOG |
| +#endif |
| + |
| /* SPI NOR flash default params, used by sf commands */ |
| #define CONFIG_SF_DEFAULT_SPEED 1000000 |
| #define CONFIG_SF_DEFAULT_MODE SPI_MODE_3 |
| @@ -65,6 +70,9 @@ |
| #define CONFIG_ENV_OFFSET 0xf0000 |
| #define CONFIG_ENV_ADDR CONFIG_ENV_OFFSET |
| |
| +#define CONFIG_ENV_OFFSET_REDUND 0xe0000 |
| +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT |
| + |
| #define CONFIG_PHY_MARVELL /* there is a marvell phy */ |
| #define PHY_ANEG_TIMEOUT 8000 /* PHY needs a longer aneg time */ |
| |
| @@ -166,14 +174,47 @@ |
| "scriptaddr=" SCRIPT_ADDR_R "\0" \ |
| "pxefile_addr_r=" PXEFILE_ADDR_R "\0" |
| |
| -#include <config_distro_bootcmd.h> |
| - |
| #define CONFIG_EXTRA_ENV_SETTINGS \ |
| RELOCATION_LIMITS_ENV_SETTINGS \ |
| LOAD_ADDRESS_ENV_SETTINGS \ |
| - "fdtfile=" CONFIG_DEFAULT_DEVICE_TREE ".dtb\0" \ |
| "console=ttyS0,115200\0" \ |
| - BOOTENV |
| + "extra_bootargs=panic=10 oops=panic\0" \ |
| + "bootcmd=test -n \"${BOOT_A_LEFT}\" || setenv BOOT_A_LEFT 3;" \ |
| + "test -n \"${BOOT_B_LEFT}\" || setenv BOOT_B_LEFT 3;" \ |
| + "test -n \"${BOOT_ORDER}\" || setenv BOOT_ORDER \"A B\";" \ |
| + "setenv rauc_part;" \ |
| + "for BOOT_SLOT in \"${BOOT_ORDER}\"; do" \ |
| + " if test \"x${rauc_part}\" != \"x\"; then" \ |
| + " ;" \ |
| + " elif test \"x${BOOT_SLOT}\" = \"xA\"; then" \ |
| + " if test ${BOOT_A_LEFT} -gt 0; then" \ |
| + " setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1;" \ |
| + " echo \"Found valid slot A, ${BOOT_A_LEFT} attempts remaining\";" \ |
| + " setenv rauc_part 1;" \ |
| + " setenv rauc_slot A;" \ |
| + " fi;" \ |
| + " elif test \"x${BOOT_SLOT}\" = \"xB\"; then" \ |
| + " if test ${BOOT_B_LEFT} -gt 0; then" \ |
| + " setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1;" \ |
| + " echo \"Found valid slot B, ${BOOT_B_LEFT} attempts remaining\";" \ |
| + " setenv rauc_part 3;" \ |
| + " setenv rauc_slot B;" \ |
| + " fi;" \ |
| + " fi;" \ |
| + "done;" \ |
| + "if test -n \"${rauc_part}\"; then" \ |
| + " saveenv ;" \ |
| + "else" \ |
| + " echo \"No valid slot found, resetting tries to 3\";" \ |
| + " setenv BOOT_A_LEFT 3;" \ |
| + " setenv BOOT_B_LEFT 3;" \ |
| + " saveenv;" \ |
| + " reset;" \ |
| + "fi;" \ |
| + "setenv bootargs root=/dev/mmcblk0p${rauc_part} rauc.slot=${rauc_slot} czechlight=${czechlight} systemd.machine_id=${machineid} ${extra_bootargs};" \ |
| + "load mmc 0:${rauc_part} ${fdt_addr_r} /boot/czechlight-clearfog.dtb || reset;" \ |
| + "load mmc 0:${rauc_part} ${kernel_addr_r} /boot/zImage || reset;" \ |
| + "bootz ${kernel_addr_r} - ${fdt_addr_r} || reset\0" |
| |
| #endif /* CONFIG_SPL_BUILD */ |
| |