/* Lowlevel init isn't used on i.MX28, so just have a dummy here */
inline void lowlevel_init(void) {}
+#define BOOT_CAUSE_MASK (RTC_PERSISTENT0_EXTERNAL_RESET | \
+ RTC_PERSISTENT0_ALARM_WAKE | \
+ RTC_PERSISTENT0_THERMAL_RESET)
+
+static int wait_rtc_stat(u32 mask)
+{
+ int timeout = 5000;
+ u32 val;
+ struct mxs_rtc_regs *rtc_regs = (void *)MXS_RTC_BASE;
+ u32 old_val = readl(&rtc_regs->hw_rtc_stat);
+
+ debug("stat=%x\n", old_val);
+
+ while ((val = readl(&rtc_regs->hw_rtc_stat)) & mask) {
+ if (val != old_val) {
+ old_val = val;
+ debug("stat: %x -> %x\n", old_val, val);
+ }
+ udelay(1);
+ if (timeout-- < 0)
+ break;
+ }
+ return !!(readl(&rtc_regs->hw_rtc_stat) & mask);
+}
+
void reset_cpu(ulong ignored) __attribute__((noreturn));
void reset_cpu(ulong ignored)
(struct mxs_rtc_regs *)MXS_RTC_BASE;
struct mxs_lcdif_regs *lcdif_regs =
(struct mxs_lcdif_regs *)MXS_LCDIF_BASE;
+ u32 reg;
/*
* Shut down the LCD controller as it interferes with BootROM boot mode
*/
writel(LCDIF_CTRL_RUN, &lcdif_regs->hw_lcdif_ctrl_clr);
- /* Wait 1 uS before doing the actual watchdog reset */
+ reg = readl(&rtc_regs->hw_rtc_persistent0);
+ if (reg & BOOT_CAUSE_MASK) {
+ writel(reg & ~BOOT_CAUSE_MASK, &rtc_regs->hw_rtc_persistent0);
+ wait_rtc_stat(RTC_STAT_NEW_REGS_PERSISTENT0);
+ }
+
+ /* Wait 1 mS before doing the actual watchdog reset */
writel(1, &rtc_regs->hw_rtc_watchdog);
writel(RTC_CTRL_WATCHDOGEN, &rtc_regs->hw_rtc_ctrl_set);
}
#endif
+#ifdef CONFIG_ARCH_CPU_INIT
int arch_cpu_init(void)
{
struct mxs_clkctrl_regs *clkctrl_regs =
return 0;
}
+#endif
#if defined(CONFIG_DISPLAY_CPUINFO)
static const char *get_cpu_type(void)
udelay(10);
+ /*
+ * Enable pad output; must be done BEFORE enabling PLL
+ * according to i.MX28 Ref. Manual Rev. 1, 2010 p. 883
+ */
+ setbits_le32(&clkctrl_regs->hw_clkctrl_enet, CLKCTRL_ENET_CLK_OUT_EN);
+
/* Gate on ENET PLL */
writel(CLKCTRL_PLL2CTRL0_CLKGATE,
&clkctrl_regs->hw_clkctrl_pll2ctrl0_clr);
- /* Enable pad output */
- setbits_le32(&clkctrl_regs->hw_clkctrl_enet, CLKCTRL_ENET_CLK_OUT_EN);
-
return 0;
}
#endif