aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNishanth Menon <nm@ti.com>2023-05-16 18:06:21 -0500
committerTom Rini <trini@konsulko.com>2023-06-01 12:40:16 -0400
commitfb3474bef0b2a14cfa1295f90ee4eb5337765e83 (patch)
treea4146ed0251e6ca5ec99f64398bdf0291532869e
parente0feee58ac92cce16b6df624ffba1c75c05133d2 (diff)
downloadu-boot-fb3474bef0b2a14cfa1295f90ee4eb5337765e83.zip
u-boot-fb3474bef0b2a14cfa1295f90ee4eb5337765e83.tar.gz
u-boot-fb3474bef0b2a14cfa1295f90ee4eb5337765e83.tar.bz2
arm: mach-k3: am625_init: Add Erratum WA for RTC startupWIP/2023-06-01-assorted-platform-updates
In the first silicon revision of the am62x family of SoCs, the hardware wakeup event cannot be used if software is unable to unlock the RTC device within one second after boot. To work around this limitation unlock RTC as soon as possible in the boot flow to maximize our chance of linux being able to use this device. Add the erratum i2327 workaround to initialize the RTC. Signed-off-by: Nishanth Menon <nm@ti.com> [bb@ti.com: rebased from 2021.01 and expanded commit and code messages] Signed-off-by: Bryan Brattlof <bb@ti.com>
-rw-r--r--arch/arm/mach-k3/am625_init.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/arch/arm/mach-k3/am625_init.c b/arch/arm/mach-k3/am625_init.c
index 026c4f9..787fe92 100644
--- a/arch/arm/mach-k3/am625_init.c
+++ b/arch/arm/mach-k3/am625_init.c
@@ -15,6 +15,15 @@
#include <dm/uclass-internal.h>
#include <dm/pinctrl.h>
+#define RTC_BASE_ADDRESS 0x2b1f0000
+#define REG_K3RTC_S_CNT_LSW (RTC_BASE_ADDRESS + 0x18)
+#define REG_K3RTC_KICK0 (RTC_BASE_ADDRESS + 0x70)
+#define REG_K3RTC_KICK1 (RTC_BASE_ADDRESS + 0x74)
+
+/* Magic values for lock/unlock */
+#define K3RTC_KICK0_UNLOCK_VALUE 0x83e70b13
+#define K3RTC_KICK1_UNLOCK_VALUE 0x95a4f1e0
+
/*
* This uninitialized global variable would normal end up in the .bss section,
* but the .bss is cleared between writing and reading this variable, so move
@@ -71,6 +80,42 @@ static __maybe_unused void enable_mcu_esm_reset(void)
writel(stat, CTRLMMR_MCU_RST_CTRL);
}
+#if defined(CONFIG_CPU_V7R)
+
+/*
+ * RTC Erratum i2327 Workaround for Silicon Revision 1
+ *
+ * Due to a bug in initial synchronization out of cold power on,
+ * IRQ status can get locked infinitely if we do not unlock RTC
+ *
+ * This workaround *must* be applied within 1 second of power on,
+ * So, this is closest point to be able to guarantee the max
+ * timing.
+ *
+ * https://www.ti.com/lit/er/sprz487c/sprz487c.pdf
+ */
+void rtc_erratumi2327_init(void)
+{
+ u32 counter;
+
+ /*
+ * If counter has gone past 1, nothing we can do, leave
+ * system locked! This is the only way we know if RTC
+ * can be used for all practical purposes.
+ */
+ counter = readl(REG_K3RTC_S_CNT_LSW);
+ if (counter > 1)
+ return;
+ /*
+ * Need to set this up at the very start
+ * MUST BE DONE under 1 second of boot.
+ */
+ writel(K3RTC_KICK0_UNLOCK_VALUE, REG_K3RTC_KICK0);
+ writel(K3RTC_KICK1_UNLOCK_VALUE, REG_K3RTC_KICK1);
+ return;
+}
+#endif
+
void board_init_f(ulong dummy)
{
struct udevice *dev;
@@ -78,6 +123,7 @@ void board_init_f(ulong dummy)
#if defined(CONFIG_CPU_V7R)
setup_k3_mpu_regions();
+ rtc_erratumi2327_init();
#endif
/*