summaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'cpu')
-rw-r--r--cpu/arm_cortexa8/mx6/generic.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/cpu/arm_cortexa8/mx6/generic.c b/cpu/arm_cortexa8/mx6/generic.c
index 47b9cd1..216308b 100644
--- a/cpu/arm_cortexa8/mx6/generic.c
+++ b/cpu/arm_cortexa8/mx6/generic.c
@@ -82,6 +82,8 @@ enum pll_clocks {
#define NFC_CLK_MAX PLL2_FREQ_MAX
#endif
+#define SNVS_LPGPR_OFFSET 0x68
+
static u32 __decode_pll(enum pll_clocks pll, u32 infreq)
{
u32 div;
@@ -843,6 +845,29 @@ int cpu_eth_init(bd_t *bis)
int arch_cpu_init(void)
{
int val;
+ unsigned int reg;
+
+ /* Check the flag of SNVS_LPGPR[0], SRC register will not reset
+ when we do a wdog reset, so we keep flag in SNVS_LPGPR[0],
+ when we finish this workaround, we will clear it */
+ reg = readl(SNVS_BASE_ADDR + SNVS_LPGPR_OFFSET);
+ /* If flagg is not set */
+ if (!(reg & 0x1)) {
+ /* Set flag in SNVS_LPGPR[0] */
+ writel(readl(SNVS_BASE_ADDR + SNVS_LPGPR_OFFSET) | 0x1,
+ SNVS_BASE_ADDR + SNVS_LPGPR_OFFSET);
+ /* Set wdog to timeout in 0.5 second */
+ writew(0x34, WDOG1_BASE_ADDR);
+ /* Disable CORE LDO */
+ writel(0x0, ANATOP_BASE_ADDR + HW_ANADIG_REG_CORE);
+ /* Wait for wdog timeout */
+ while (1)
+ ;
+ } else {
+ /* Clear flag */
+ writel(readl(SNVS_BASE_ADDR + SNVS_LPGPR_OFFSET) & (~0x1),
+ SNVS_BASE_ADDR + SNVS_LPGPR_OFFSET);
+ }
icache_enable();
dcache_enable();