ARM: 5774/1: Fix Realview ARM1176PB board reboot
This is the fix for proper reboot of Realview ARM1176PB board when issuing the reboot command. Setting the eighth bit of control register SYS_RESETCTL to 1 to force a soft reset. arch_reset() is modified for realview machines to call machine specific reset function pointers. Signed-off-by: Philby John <pjohn@in.mvista.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
df71dfd4ca
commit
426fcd2a35
7 changed files with 50 additions and 21 deletions
|
@ -61,5 +61,5 @@ extern void realview_timer_init(unsigned int timer_irq);
|
||||||
extern int realview_flash_register(struct resource *res, u32 num);
|
extern int realview_flash_register(struct resource *res, u32 num);
|
||||||
extern int realview_eth_register(const char *name, struct resource *res);
|
extern int realview_eth_register(const char *name, struct resource *res);
|
||||||
extern int realview_usb_register(struct resource *res);
|
extern int realview_usb_register(struct resource *res);
|
||||||
|
extern void (*realview_reset)(char);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -73,4 +73,9 @@
|
||||||
#define REALVIEW_PB1176_GIC_DIST_BASE 0x10041000 /* GIC distributor, on FPGA */
|
#define REALVIEW_PB1176_GIC_DIST_BASE 0x10041000 /* GIC distributor, on FPGA */
|
||||||
#define REALVIEW_PB1176_L220_BASE 0x10110000 /* L220 registers */
|
#define REALVIEW_PB1176_L220_BASE 0x10110000 /* L220 registers */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Control register SYS_RESETCTL is set to 1 to force a soft reset
|
||||||
|
*/
|
||||||
|
#define REALVIEW_PB1176_SYS_LOCKVAL_RSTCTL 0x0100
|
||||||
|
|
||||||
#endif /* __ASM_ARCH_BOARD_PB1176_H */
|
#endif /* __ASM_ARCH_BOARD_PB1176_H */
|
||||||
|
|
|
@ -81,4 +81,16 @@
|
||||||
#define REALVIEW_TC11MP_GIC_DIST_BASE 0x1F001000 /* Test chip interrupt controller distributor */
|
#define REALVIEW_TC11MP_GIC_DIST_BASE 0x1F001000 /* Test chip interrupt controller distributor */
|
||||||
#define REALVIEW_TC11MP_L220_BASE 0x1F002000 /* L220 registers */
|
#define REALVIEW_TC11MP_L220_BASE 0x1F002000 /* L220 registers */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Values for REALVIEW_SYS_RESET_CTRL
|
||||||
|
*/
|
||||||
|
#define REALVIEW_PB11MP_SYS_CTRL_RESET_CONFIGCLR 0x01
|
||||||
|
#define REALVIEW_PB11MP_SYS_CTRL_RESET_CONFIGINIT 0x02
|
||||||
|
#define REALVIEW_PB11MP_SYS_CTRL_RESET_DLLRESET 0x03
|
||||||
|
#define REALVIEW_PB11MP_SYS_CTRL_RESET_PLLRESET 0x04
|
||||||
|
#define REALVIEW_PB11MP_SYS_CTRL_RESET_POR 0x05
|
||||||
|
#define REALVIEW_PB11MP_SYS_CTRL_RESET_DoC 0x06
|
||||||
|
|
||||||
|
#define REALVIEW_PB11MP_SYS_CTRL_LED (1 << 0)
|
||||||
|
|
||||||
#endif /* __ASM_ARCH_BOARD_PB11MP_H */
|
#endif /* __ASM_ARCH_BOARD_PB11MP_H */
|
||||||
|
|
|
@ -119,19 +119,6 @@
|
||||||
#define REALVIEW_SYS_TEST_OSC3 (REALVIEW_SYS_BASE + REALVIEW_SYS_TEST_OSC3_OFFSET)
|
#define REALVIEW_SYS_TEST_OSC3 (REALVIEW_SYS_BASE + REALVIEW_SYS_TEST_OSC3_OFFSET)
|
||||||
#define REALVIEW_SYS_TEST_OSC4 (REALVIEW_SYS_BASE + REALVIEW_SYS_TEST_OSC4_OFFSET)
|
#define REALVIEW_SYS_TEST_OSC4 (REALVIEW_SYS_BASE + REALVIEW_SYS_TEST_OSC4_OFFSET)
|
||||||
|
|
||||||
/*
|
|
||||||
* Values for REALVIEW_SYS_RESET_CTRL
|
|
||||||
*/
|
|
||||||
#define REALVIEW_SYS_CTRL_RESET_CONFIGCLR 0x01
|
|
||||||
#define REALVIEW_SYS_CTRL_RESET_CONFIGINIT 0x02
|
|
||||||
#define REALVIEW_SYS_CTRL_RESET_DLLRESET 0x03
|
|
||||||
#define REALVIEW_SYS_CTRL_RESET_PLLRESET 0x04
|
|
||||||
#define REALVIEW_SYS_CTRL_RESET_POR 0x05
|
|
||||||
#define REALVIEW_SYS_CTRL_RESET_DoC 0x06
|
|
||||||
|
|
||||||
#define REALVIEW_SYS_CTRL_LED (1 << 0)
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------
|
||||||
* RealView control registers
|
* RealView control registers
|
||||||
* ------------------------------------------------------------------------
|
* ------------------------------------------------------------------------
|
||||||
|
@ -153,7 +140,7 @@
|
||||||
* SYS_CLD, SYS_BOOTCS
|
* SYS_CLD, SYS_BOOTCS
|
||||||
*/
|
*/
|
||||||
#define REALVIEW_SYS_LOCK_LOCKED (1 << 16)
|
#define REALVIEW_SYS_LOCK_LOCKED (1 << 16)
|
||||||
#define REALVIEW_SYS_LOCKVAL_MASK 0xFFFF /* write 0xA05F to enable write access */
|
#define REALVIEW_SYS_LOCKVAL_MASK 0xA05F /* Enable write access */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* REALVIEW_SYS_FLASH
|
* REALVIEW_SYS_FLASH
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <mach/platform.h>
|
#include <mach/platform.h>
|
||||||
|
|
||||||
|
void (*realview_reset)(char mode);
|
||||||
|
|
||||||
static inline void arch_idle(void)
|
static inline void arch_idle(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -36,16 +38,12 @@ static inline void arch_idle(void)
|
||||||
|
|
||||||
static inline void arch_reset(char mode, const char *cmd)
|
static inline void arch_reset(char mode, const char *cmd)
|
||||||
{
|
{
|
||||||
void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_RESETCTL_OFFSET;
|
|
||||||
unsigned int val;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* To reset, we hit the on-board reset register
|
* To reset, we hit the on-board reset register
|
||||||
* in the system FPGA
|
* in the system FPGA
|
||||||
*/
|
*/
|
||||||
val = __raw_readl(hdr_ctrl);
|
if (realview_reset)
|
||||||
val |= REALVIEW_SYS_CTRL_RESET_CONFIGCLR;
|
realview_reset(mode);
|
||||||
__raw_writel(val, hdr_ctrl);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -290,6 +290,16 @@ static struct sys_timer realview_pb1176_timer = {
|
||||||
.init = realview_pb1176_timer_init,
|
.init = realview_pb1176_timer_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void realview_pb1176_reset(char mode)
|
||||||
|
{
|
||||||
|
void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) +
|
||||||
|
REALVIEW_SYS_RESETCTL_OFFSET;
|
||||||
|
void __iomem *rst_hdr_ctrl = __io_address(REALVIEW_SYS_BASE) +
|
||||||
|
REALVIEW_SYS_LOCK_OFFSET;
|
||||||
|
__raw_writel(REALVIEW_SYS_LOCKVAL_MASK, rst_hdr_ctrl);
|
||||||
|
__raw_writel(REALVIEW_PB1176_SYS_LOCKVAL_RSTCTL, hdr_ctrl);
|
||||||
|
}
|
||||||
|
|
||||||
static void __init realview_pb1176_init(void)
|
static void __init realview_pb1176_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -313,6 +323,7 @@ static void __init realview_pb1176_init(void)
|
||||||
#ifdef CONFIG_LEDS
|
#ifdef CONFIG_LEDS
|
||||||
leds_event = realview_leds_event;
|
leds_event = realview_leds_event;
|
||||||
#endif
|
#endif
|
||||||
|
realview_reset = realview_pb1176_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176")
|
MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176")
|
||||||
|
|
|
@ -299,6 +299,21 @@ static struct sys_timer realview_pb11mp_timer = {
|
||||||
.init = realview_pb11mp_timer_init,
|
.init = realview_pb11mp_timer_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void realview_pb11mp_reset(char mode)
|
||||||
|
{
|
||||||
|
void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) +
|
||||||
|
REALVIEW_SYS_RESETCTL_OFFSET;
|
||||||
|
unsigned int val;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To reset, we hit the on-board reset register
|
||||||
|
* in the system FPGA
|
||||||
|
*/
|
||||||
|
val = __raw_readl(hdr_ctrl);
|
||||||
|
val |= REALVIEW_PB11MP_SYS_CTRL_RESET_CONFIGCLR;
|
||||||
|
__raw_writel(val, hdr_ctrl);
|
||||||
|
}
|
||||||
|
|
||||||
static void __init realview_pb11mp_init(void)
|
static void __init realview_pb11mp_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -324,6 +339,7 @@ static void __init realview_pb11mp_init(void)
|
||||||
#ifdef CONFIG_LEDS
|
#ifdef CONFIG_LEDS
|
||||||
leds_event = realview_leds_event;
|
leds_event = realview_leds_event;
|
||||||
#endif
|
#endif
|
||||||
|
realview_reset = realview_pb11mp_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore")
|
MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore")
|
||||||
|
|
Loading…
Add table
Reference in a new issue