Commit 4c9f8be7 authored by Colin Tuckley's avatar Colin Tuckley Committed by Russell King

ARM: 5873/1: ARM: Fix the reset logic for ARM RealView boards

Extend the patch from Philby John to the other "RealView" boards.
Rename the constants and offsets to reflect their actual functions.

Cc: Philby John <pjohn@in.mvista.com>
Signed-off-by: default avatarColin Tuckley <colin.tuckley@arm.com>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 62a8c5bc
...@@ -74,8 +74,8 @@ ...@@ -74,8 +74,8 @@
#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 * Control register SYS_RESETCTL Bit 8 is set to 1 to force a soft reset
*/ */
#define REALVIEW_PB1176_SYS_LOCKVAL_RSTCTL 0x0100 #define REALVIEW_PB1176_SYS_SOFT_RESET 0x0100
#endif /* __ASM_ARCH_BOARD_PB1176_H */ #endif /* __ASM_ARCH_BOARD_PB1176_H */
...@@ -140,7 +140,7 @@ ...@@ -140,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 0xA05F /* Enable write access */ #define REALVIEW_SYS_LOCK_VAL 0xA05F /* Enable write access */
/* /*
* REALVIEW_SYS_FLASH * REALVIEW_SYS_FLASH
......
...@@ -381,6 +381,20 @@ static struct sys_timer realview_eb_timer = { ...@@ -381,6 +381,20 @@ static struct sys_timer realview_eb_timer = {
.init = realview_eb_timer_init, .init = realview_eb_timer_init,
}; };
static void realview_eb_reset(char mode)
{
void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);
void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK);
/*
* To reset, we hit the on-board reset register
* in the system FPGA
*/
__raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);
if (core_tile_eb11mp())
__raw_writel(0x0008, reset_ctrl);
}
static void __init realview_eb_init(void) static void __init realview_eb_init(void)
{ {
int i; int i;
...@@ -408,6 +422,7 @@ static void __init realview_eb_init(void) ...@@ -408,6 +422,7 @@ static void __init realview_eb_init(void)
#ifdef CONFIG_LEDS #ifdef CONFIG_LEDS
leds_event = realview_leds_event; leds_event = realview_leds_event;
#endif #endif
realview_reset = realview_eb_reset;
} }
MACHINE_START(REALVIEW_EB, "ARM-RealView EB") MACHINE_START(REALVIEW_EB, "ARM-RealView EB")
......
...@@ -292,12 +292,10 @@ static struct sys_timer realview_pb1176_timer = { ...@@ -292,12 +292,10 @@ static struct sys_timer realview_pb1176_timer = {
static void realview_pb1176_reset(char mode) static void realview_pb1176_reset(char mode)
{ {
void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);
REALVIEW_SYS_RESETCTL_OFFSET; void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK);
void __iomem *rst_hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);
REALVIEW_SYS_LOCK_OFFSET; __raw_writel(REALVIEW_PB1176_SYS_SOFT_RESET, reset_ctrl);
__raw_writel(REALVIEW_SYS_LOCKVAL_MASK, rst_hdr_ctrl);
__raw_writel(REALVIEW_PB1176_SYS_LOCKVAL_RSTCTL, hdr_ctrl);
} }
static void realview_pb1176_fixup(struct machine_desc *mdesc, static void realview_pb1176_fixup(struct machine_desc *mdesc,
......
...@@ -301,17 +301,16 @@ static struct sys_timer realview_pb11mp_timer = { ...@@ -301,17 +301,16 @@ static struct sys_timer realview_pb11mp_timer = {
static void realview_pb11mp_reset(char mode) static void realview_pb11mp_reset(char mode)
{ {
void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);
REALVIEW_SYS_RESETCTL_OFFSET; void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK);
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); __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);
val |= REALVIEW_PB11MP_SYS_CTRL_RESET_CONFIGCLR; __raw_writel(0x0000, reset_ctrl);
__raw_writel(val, hdr_ctrl); __raw_writel(0x0004, reset_ctrl);
} }
static void __init realview_pb11mp_init(void) static void __init realview_pb11mp_init(void)
......
...@@ -272,6 +272,20 @@ static struct sys_timer realview_pba8_timer = { ...@@ -272,6 +272,20 @@ static struct sys_timer realview_pba8_timer = {
.init = realview_pba8_timer_init, .init = realview_pba8_timer_init,
}; };
static void realview_pba8_reset(char mode)
{
void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);
void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK);
/*
* To reset, we hit the on-board reset register
* in the system FPGA
*/
__raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);
__raw_writel(0x0000, reset_ctrl);
__raw_writel(0x0004, reset_ctrl);
}
static void __init realview_pba8_init(void) static void __init realview_pba8_init(void)
{ {
int i; int i;
...@@ -291,6 +305,7 @@ static void __init realview_pba8_init(void) ...@@ -291,6 +305,7 @@ static void __init realview_pba8_init(void)
#ifdef CONFIG_LEDS #ifdef CONFIG_LEDS
leds_event = realview_leds_event; leds_event = realview_leds_event;
#endif #endif
realview_reset = realview_pba8_reset;
} }
MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8")
......
...@@ -324,6 +324,20 @@ static void realview_pbx_fixup(struct machine_desc *mdesc, struct tag *tags, ...@@ -324,6 +324,20 @@ static void realview_pbx_fixup(struct machine_desc *mdesc, struct tag *tags,
#endif #endif
} }
static void realview_pbx_reset(char mode)
{
void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);
void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK);
/*
* To reset, we hit the on-board reset register
* in the system FPGA
*/
__raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);
__raw_writel(0x0000, reset_ctrl);
__raw_writel(0x0004, reset_ctrl);
}
static void __init realview_pbx_init(void) static void __init realview_pbx_init(void)
{ {
int i; int i;
...@@ -358,6 +372,7 @@ static void __init realview_pbx_init(void) ...@@ -358,6 +372,7 @@ static void __init realview_pbx_init(void)
#ifdef CONFIG_LEDS #ifdef CONFIG_LEDS
leds_event = realview_leds_event; leds_event = realview_leds_event;
#endif #endif
realview_reset = realview_pbx_reset;
} }
MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment