diff options
Diffstat (limited to 'cpu/mpc86xx/cpu.c')
| -rw-r--r-- | cpu/mpc86xx/cpu.c | 80 | 
1 files changed, 19 insertions, 61 deletions
| diff --git a/cpu/mpc86xx/cpu.c b/cpu/mpc86xx/cpu.c index dc53bee58..b2a107d3b 100644 --- a/cpu/mpc86xx/cpu.c +++ b/cpu/mpc86xx/cpu.c @@ -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) +		;  } |