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 <bryan.odonoghue@linaro.org>
diff --git a/plat/imx/common/imx_wdog.c b/plat/imx/common/imx_wdog.c
new file mode 100644
index 0000000..86813dd
--- /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 <mmio.h>
+#include <imx_regs.h>
+#include <imx_wdog.h>
+
+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 0000000..8033e62
--- /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 <arch.h>
+#include <stdint.h>
+
+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__ */