diff options
| -rw-r--r-- | board/freescale/mpc8610hpcd/mpc8610hpcd.c | 8 | ||||
| -rw-r--r-- | board/freescale/mpc8641hpcn/mpc8641hpcn.c | 8 | ||||
| -rw-r--r-- | board/sbc8641d/sbc8641d.c | 29 | ||||
| -rw-r--r-- | cpu/mpc86xx/cpu.c | 80 | ||||
| -rw-r--r-- | include/configs/MPC8610HPCD.h | 2 | ||||
| -rw-r--r-- | include/configs/MPC8641HPCN.h | 2 | 
6 files changed, 64 insertions, 65 deletions
| diff --git a/board/freescale/mpc8610hpcd/mpc8610hpcd.c b/board/freescale/mpc8610hpcd/mpc8610hpcd.c index a2097a5af..b419dcc5b 100644 --- a/board/freescale/mpc8610hpcd/mpc8610hpcd.c +++ b/board/freescale/mpc8610hpcd/mpc8610hpcd.c @@ -484,3 +484,11 @@ int board_eth_init(bd_t *bis)  {  	return pci_eth_init(bis);  } + +void board_reset(void) +{ +	out8(PIXIS_BASE + PIXIS_RST, 0); + +	while (1) +		; +} diff --git a/board/freescale/mpc8641hpcn/mpc8641hpcn.c b/board/freescale/mpc8641hpcn/mpc8641hpcn.c index 28c16833d..49718dac6 100644 --- a/board/freescale/mpc8641hpcn/mpc8641hpcn.c +++ b/board/freescale/mpc8641hpcn/mpc8641hpcn.c @@ -363,3 +363,11 @@ int board_eth_init(bd_t *bis)  	cpu_eth_init(bis);  	return pci_eth_init(bis);  } + +void board_reset(void) +{ +	out8(PIXIS_BASE + PIXIS_RST, 0); + +	while (1) +		; +} diff --git a/board/sbc8641d/sbc8641d.c b/board/sbc8641d/sbc8641d.c index 508bdc5dd..52ad2d86c 100644 --- a/board/sbc8641d/sbc8641d.c +++ b/board/sbc8641d/sbc8641d.c @@ -384,3 +384,32 @@ unsigned long get_board_sys_clk (ulong dummy)  	return val;  } + +void board_reset(void) +{ +#ifdef CONFIG_SYS_RESET_ADDRESS +	ulong addr = CONFIG_SYS_RESET_ADDRESS; + +	/* 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"); + +	/* +	 * 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"); +#endif +} 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) +		;  } diff --git a/include/configs/MPC8610HPCD.h b/include/configs/MPC8610HPCD.h index 4bd3e0bd3..7a9e57fdc 100644 --- a/include/configs/MPC8610HPCD.h +++ b/include/configs/MPC8610HPCD.h @@ -34,8 +34,6 @@  #define CONFIG_SYS_DIAG_ADDR		0xff800000  #endif -#define CONFIG_SYS_RESET_ADDRESS	0xfff00100 -  /*   * virtual address to be used for temporary mappings.  There   * should be 128k free at this VA. diff --git a/include/configs/MPC8641HPCN.h b/include/configs/MPC8641HPCN.h index f1b7eb5a2..9a1b84756 100644 --- a/include/configs/MPC8641HPCN.h +++ b/include/configs/MPC8641HPCN.h @@ -45,8 +45,6 @@  #define CONFIG_SYS_DIAG_ADDR	     CONFIG_SYS_FLASH_BASE  #endif -#define CONFIG_SYS_RESET_ADDRESS    0xfff00100 -  /*   * virtual address to be used for temporary mappings.  There   * should be 128k free at this VA. |