|
@@ -32,6 +32,17 @@
|
|
|
#include <asm/fsl_law.h>
|
|
|
|
|
|
|
|
|
+/*
|
|
|
+ * Default board reset function
|
|
|
+ */
|
|
|
+static void
|
|
|
+__board_reset(void)
|
|
|
+{
|
|
|
+ /* Do nothing */
|
|
|
+}
|
|
|
+void board_reset(void) __attribute((weak, alias("__board_reset")));
|
|
|
+
|
|
|
+
|
|
|
int
|
|
|
checkcpu(void)
|
|
|
{
|
|
@@ -115,73 +126,20 @@ checkcpu(void)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static inline void
|
|
|
-soft_restart(unsigned long addr)
|
|
|
-{
|
|
|
-#if !defined(CONFIG_MPC8641HPCN) && !defined(CONFIG_MPC8610HPCD)
|
|
|
-
|
|
|
- /*
|
|
|
- * SRR0 has system reset vector, SRR1 has default MSR value
|
|
|
- * rfi restores MSR from SRR1 and sets the PC to the SRR0 value
|
|
|
- */
|
|
|
-
|
|
|
- __asm__ __volatile__ ("mtspr 26, %0" :: "r" (addr));
|
|
|
- __asm__ __volatile__ ("li 4, (1 << 6)" ::: "r4");
|
|
|
- __asm__ __volatile__ ("mtspr 27, 4");
|
|
|
- __asm__ __volatile__ ("rfi");
|
|
|
-
|
|
|
-#else /* CONFIG_MPC8641HPCN */
|
|
|
-
|
|
|
- out8(PIXIS_BASE + PIXIS_RST, 0);
|
|
|
-
|
|
|
-#endif /* !CONFIG_MPC8641HPCN */
|
|
|
-
|
|
|
- while (1) ; /* not reached */
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/*
|
|
|
- * No generic way to do board reset. Simply call soft_reset.
|
|
|
- */
|
|
|
void
|
|
|
do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|
|
{
|
|
|
-#if !defined(CONFIG_MPC8641HPCN) && !defined(CONFIG_MPC8610HPCD)
|
|
|
-
|
|
|
-#ifdef CONFIG_SYS_RESET_ADDRESS
|
|
|
- ulong addr = CONFIG_SYS_RESET_ADDRESS;
|
|
|
-#else
|
|
|
- /*
|
|
|
- * note: when CONFIG_SYS_MONITOR_BASE points to a RAM address,
|
|
|
- * CONFIG_SYS_MONITOR_BASE - sizeof (ulong) is usually a valid
|
|
|
- * address. Better pick an address known to be invalid on your
|
|
|
- * system and assign it to CONFIG_SYS_RESET_ADDRESS.
|
|
|
- */
|
|
|
- ulong addr = CONFIG_SYS_MONITOR_BASE - sizeof(ulong);
|
|
|
-#endif
|
|
|
-
|
|
|
- /* flush and disable I/D cache */
|
|
|
- __asm__ __volatile__ ("mfspr 3, 1008" ::: "r3");
|
|
|
- __asm__ __volatile__ ("ori 5, 5, 0xcc00" ::: "r5");
|
|
|
- __asm__ __volatile__ ("ori 4, 3, 0xc00" ::: "r4");
|
|
|
- __asm__ __volatile__ ("andc 5, 3, 5" ::: "r5");
|
|
|
- __asm__ __volatile__ ("sync");
|
|
|
- __asm__ __volatile__ ("mtspr 1008, 4");
|
|
|
- __asm__ __volatile__ ("isync");
|
|
|
- __asm__ __volatile__ ("sync");
|
|
|
- __asm__ __volatile__ ("mtspr 1008, 5");
|
|
|
- __asm__ __volatile__ ("isync");
|
|
|
- __asm__ __volatile__ ("sync");
|
|
|
-
|
|
|
- soft_restart(addr);
|
|
|
-
|
|
|
-#else /* CONFIG_MPC8641HPCN */
|
|
|
+ volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
|
|
|
+ volatile ccsr_gur_t *gur = &immap->im_gur;
|
|
|
|
|
|
- out8(PIXIS_BASE + PIXIS_RST, 0);
|
|
|
+ /* Attempt board-specific reset */
|
|
|
+ board_reset();
|
|
|
|
|
|
-#endif /* !CONFIG_MPC8641HPCN */
|
|
|
+ /* Next try asserting HRESET_REQ */
|
|
|
+ out_be32(&gur->rstcr, MPC86xx_RSTCR_HRST_REQ);
|
|
|
|
|
|
- while (1) ; /* not reached */
|
|
|
+ while (1)
|
|
|
+ ;
|
|
|
}
|
|
|
|
|
|
|