[POWERPC] 83xx: Don't call ioremap in the reset function
It's possibly that we get an reset requestion when interrupts are disabled. (For example an oops in an interrupt handler). Therefor, we can't call ioremap in the reset function. Moving the ioremap of the registers we need access to an arch_initcall helps the problem. However we still have a window between boot and the arch_initcall in which the register pointer will not be setup and thus we spin if the reset function is called. If one needs to ensure even this case is covered, look at use of the watchdog provided on 83xx to reset the processor. Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
parent
4d52719a76
commit
c75f902b93
|
@ -18,23 +18,36 @@
|
|||
|
||||
#include "mpc83xx.h"
|
||||
|
||||
static __be32 __iomem *restart_reg_base;
|
||||
|
||||
static int __init mpc83xx_restart_init(void)
|
||||
{
|
||||
/* map reset restart_reg_baseister space */
|
||||
restart_reg_base = ioremap(get_immrbase() + 0x900, 0xff);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(mpc83xx_restart_init);
|
||||
|
||||
void mpc83xx_restart(char *cmd)
|
||||
{
|
||||
#define RST_OFFSET 0x00000900
|
||||
#define RST_PROT_REG 0x00000018
|
||||
#define RST_CTRL_REG 0x0000001c
|
||||
__be32 __iomem *reg;
|
||||
|
||||
/* map reset register space */
|
||||
reg = ioremap(get_immrbase() + 0x900, 0xff);
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
if (restart_reg_base) {
|
||||
/* enable software reset "RSTE" */
|
||||
out_be32(reg + (RST_PROT_REG >> 2), 0x52535445);
|
||||
out_be32(restart_reg_base + (RST_PROT_REG >> 2), 0x52535445);
|
||||
|
||||
/* set software hard reset */
|
||||
out_be32(reg + (RST_CTRL_REG >> 2), 0x2);
|
||||
out_be32(restart_reg_base + (RST_CTRL_REG >> 2), 0x2);
|
||||
} else {
|
||||
printk (KERN_EMERG "Error: Restart registers not mapped, spinning!\n");
|
||||
}
|
||||
|
||||
for (;;) ;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue