From: Bryan O'Donoghue Date: Fri, 25 May 2018 15:45:27 +0000 (+0100) Subject: imx: imx_wdog: Add code to initialize the wdog block X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=b42ceebb40ae57ea18e77e2270fb131fa981c906;p=project%2Fbcm63xx%2Fatf.git imx: imx_wdog: Add code to initialize the wdog block The watchdog block on the IMX is mercifully simple. This patch maps the various registers and bits associated with the block. We are mostly only really interested in the power-down-enable (PDE) bits in the block for the purposes of ATF. The i.MX7 Solo Applications Processor Reference Manual details the PDE bit as follows: "Power Down Enable bit. Reset value of this bit is 1, which means the power down counter inside the WDOG is enabled after reset. The software must write 0 to this bit to disable the counter within 16 seconds of reset de-assertion. Once disabled this counter cannot be enabled again. See Power-down counter event for operation of this counter." This patch does that zero write in-lieu of later phases in the boot no-longer have the necessary permissions to rewrite the PDE bit directly. Signed-off-by: Bryan O'Donoghue --- diff --git a/plat/imx/common/imx_wdog.c b/plat/imx/common/imx_wdog.c new file mode 100644 index 00000000..86813dd0 --- /dev/null +++ b/plat/imx/common/imx_wdog.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include + +static void imx_wdog_power_down(unsigned long base) +{ + struct wdog_regs *wdog = (struct wdog_regs *)base; + + mmio_write_16((uintptr_t)&wdog->wmcr, 0); +} + +void imx_wdog_init(void) +{ + imx_wdog_power_down(WDOG1_BASE); + imx_wdog_power_down(WDOG2_BASE); + imx_wdog_power_down(WDOG3_BASE); + imx_wdog_power_down(WDOG4_BASE); +} diff --git a/plat/imx/common/include/imx_wdog.h b/plat/imx/common/include/imx_wdog.h new file mode 100644 index 00000000..8033e626 --- /dev/null +++ b/plat/imx/common/include/imx_wdog.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef __IMX_WDOG_H__ +#define __IMX_WDOG_H__ + +#include +#include + +struct wdog_regs { + uint16_t wcr; + uint16_t wsr; + uint16_t wrsr; + uint16_t wicr; + uint16_t wmcr; +}; + +/* WCR bits */ +#define WCR_WDZST BIT(0) +#define WCR_WDBG BIT(1) +#define WCR_WDE BIT(2) +#define WCR_WDT BIT(3) +#define WCR_SRS BIT(4) +#define WCR_WDA BIT(5) +#define WCR_SRE BIT(6) +#define WCR_WDW BIT(7) +#define WCR_WT(x) ((x) << 8) + +/* WSR bits */ +#define WSR_FIRST 0x5555 +#define WSR_SECOND 0xAAAA + +/* WRSR bits */ +#define WRSR_SFTW BIT(0) +#define WRSR_TOUT BIT(1) +#define WRSR_POR BIT(4) + +/* WICR bits */ +static inline int wicr_calc_wict(int sec, int half_sec) +{ + int wict_bits; + + /* Represents WICR bits 7 - 0 */ + wict_bits = ((sec << 1) | (half_sec ? 1 : 0)); + + return wict_bits; +} + +#define WICR_WTIS BIT(14) +#define WICR_WIE BIT(15) + +/* WMCR bits */ +#define WMCR_PDE BIT(0) + +/* External facing API */ +void imx_wdog_init(void); + +#endif /* __IMX_WDOG_H__ */