diff options
| author | Philby John <pjohn@in.mvista.com> | 2009-10-28 14:09:12 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-11-01 09:19:34 -0500 |
| commit | 426fcd2a351e4bf662fee9fa2cf2603a48223164 (patch) | |
| tree | 8abcf507bc2d7d4e285073add55729ceeddb5c44 | |
| parent | df71dfd4ca01130f98d9dbfab76c440d72a177c6 (diff) | |
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>
| -rw-r--r-- | arch/arm/mach-realview/core.h | 2 | ||||
| -rw-r--r-- | arch/arm/mach-realview/include/mach/board-pb1176.h | 5 | ||||
| -rw-r--r-- | arch/arm/mach-realview/include/mach/board-pb11mp.h | 12 | ||||
| -rw-r--r-- | arch/arm/mach-realview/include/mach/platform.h | 15 | ||||
| -rw-r--r-- | arch/arm/mach-realview/include/mach/system.h | 10 | ||||
| -rw-r--r-- | arch/arm/mach-realview/realview_pb1176.c | 11 | ||||
| -rw-r--r-- | arch/arm/mach-realview/realview_pb11mp.c | 16 |
7 files changed, 50 insertions, 21 deletions
diff --git a/arch/arm/mach-realview/core.h b/arch/arm/mach-realview/core.h index 46cd6acb4d40..699671fa6e0b 100644 --- a/arch/arm/mach-realview/core.h +++ b/arch/arm/mach-realview/core.h | |||
| @@ -61,5 +61,5 @@ extern void realview_timer_init(unsigned int timer_irq); | |||
| 61 | extern int realview_flash_register(struct resource *res, u32 num); | 61 | extern int realview_flash_register(struct resource *res, u32 num); |
| 62 | extern int realview_eth_register(const char *name, struct resource *res); | 62 | extern int realview_eth_register(const char *name, struct resource *res); |
| 63 | extern int realview_usb_register(struct resource *res); | 63 | extern int realview_usb_register(struct resource *res); |
| 64 | 64 | extern void (*realview_reset)(char); | |
| 65 | #endif | 65 | #endif |
diff --git a/arch/arm/mach-realview/include/mach/board-pb1176.h b/arch/arm/mach-realview/include/mach/board-pb1176.h index 98f8e7eeacc2..34b80b7d40b8 100644 --- a/arch/arm/mach-realview/include/mach/board-pb1176.h +++ b/arch/arm/mach-realview/include/mach/board-pb1176.h | |||
| @@ -73,4 +73,9 @@ | |||
| 73 | #define REALVIEW_PB1176_GIC_DIST_BASE 0x10041000 /* GIC distributor, on FPGA */ | 73 | #define REALVIEW_PB1176_GIC_DIST_BASE 0x10041000 /* GIC distributor, on FPGA */ |
| 74 | #define REALVIEW_PB1176_L220_BASE 0x10110000 /* L220 registers */ | 74 | #define REALVIEW_PB1176_L220_BASE 0x10110000 /* L220 registers */ |
| 75 | 75 | ||
| 76 | /* | ||
| 77 | * Control register SYS_RESETCTL is set to 1 to force a soft reset | ||
| 78 | */ | ||
| 79 | #define REALVIEW_PB1176_SYS_LOCKVAL_RSTCTL 0x0100 | ||
| 80 | |||
| 76 | #endif /* __ASM_ARCH_BOARD_PB1176_H */ | 81 | #endif /* __ASM_ARCH_BOARD_PB1176_H */ |
diff --git a/arch/arm/mach-realview/include/mach/board-pb11mp.h b/arch/arm/mach-realview/include/mach/board-pb11mp.h index f0d68e0fea01..7abf918b77e9 100644 --- a/arch/arm/mach-realview/include/mach/board-pb11mp.h +++ b/arch/arm/mach-realview/include/mach/board-pb11mp.h | |||
| @@ -81,4 +81,16 @@ | |||
| 81 | #define REALVIEW_TC11MP_GIC_DIST_BASE 0x1F001000 /* Test chip interrupt controller distributor */ | 81 | #define REALVIEW_TC11MP_GIC_DIST_BASE 0x1F001000 /* Test chip interrupt controller distributor */ |
| 82 | #define REALVIEW_TC11MP_L220_BASE 0x1F002000 /* L220 registers */ | 82 | #define REALVIEW_TC11MP_L220_BASE 0x1F002000 /* L220 registers */ |
| 83 | 83 | ||
| 84 | /* | ||
| 85 | * Values for REALVIEW_SYS_RESET_CTRL | ||
| 86 | */ | ||
| 87 | #define REALVIEW_PB11MP_SYS_CTRL_RESET_CONFIGCLR 0x01 | ||
| 88 | #define REALVIEW_PB11MP_SYS_CTRL_RESET_CONFIGINIT 0x02 | ||
| 89 | #define REALVIEW_PB11MP_SYS_CTRL_RESET_DLLRESET 0x03 | ||
| 90 | #define REALVIEW_PB11MP_SYS_CTRL_RESET_PLLRESET 0x04 | ||
| 91 | #define REALVIEW_PB11MP_SYS_CTRL_RESET_POR 0x05 | ||
| 92 | #define REALVIEW_PB11MP_SYS_CTRL_RESET_DoC 0x06 | ||
| 93 | |||
| 94 | #define REALVIEW_PB11MP_SYS_CTRL_LED (1 << 0) | ||
| 95 | |||
| 84 | #endif /* __ASM_ARCH_BOARD_PB11MP_H */ | 96 | #endif /* __ASM_ARCH_BOARD_PB11MP_H */ |
diff --git a/arch/arm/mach-realview/include/mach/platform.h b/arch/arm/mach-realview/include/mach/platform.h index c8f50835fed2..4f46bf71e752 100644 --- a/arch/arm/mach-realview/include/mach/platform.h +++ b/arch/arm/mach-realview/include/mach/platform.h | |||
| @@ -119,19 +119,6 @@ | |||
| 119 | #define REALVIEW_SYS_TEST_OSC3 (REALVIEW_SYS_BASE + REALVIEW_SYS_TEST_OSC3_OFFSET) | 119 | #define REALVIEW_SYS_TEST_OSC3 (REALVIEW_SYS_BASE + REALVIEW_SYS_TEST_OSC3_OFFSET) |
| 120 | #define REALVIEW_SYS_TEST_OSC4 (REALVIEW_SYS_BASE + REALVIEW_SYS_TEST_OSC4_OFFSET) | 120 | #define REALVIEW_SYS_TEST_OSC4 (REALVIEW_SYS_BASE + REALVIEW_SYS_TEST_OSC4_OFFSET) |
| 121 | 121 | ||
| 122 | /* | ||
| 123 | * Values for REALVIEW_SYS_RESET_CTRL | ||
| 124 | */ | ||
| 125 | #define REALVIEW_SYS_CTRL_RESET_CONFIGCLR 0x01 | ||
| 126 | #define REALVIEW_SYS_CTRL_RESET_CONFIGINIT 0x02 | ||
| 127 | #define REALVIEW_SYS_CTRL_RESET_DLLRESET 0x03 | ||
| 128 | #define REALVIEW_SYS_CTRL_RESET_PLLRESET 0x04 | ||
| 129 | #define REALVIEW_SYS_CTRL_RESET_POR 0x05 | ||
| 130 | #define REALVIEW_SYS_CTRL_RESET_DoC 0x06 | ||
| 131 | |||
| 132 | #define REALVIEW_SYS_CTRL_LED (1 << 0) | ||
| 133 | |||
| 134 | |||
| 135 | /* ------------------------------------------------------------------------ | 122 | /* ------------------------------------------------------------------------ |
| 136 | * RealView control registers | 123 | * RealView control registers |
| 137 | * ------------------------------------------------------------------------ | 124 | * ------------------------------------------------------------------------ |
| @@ -153,7 +140,7 @@ | |||
| 153 | * SYS_CLD, SYS_BOOTCS | 140 | * SYS_CLD, SYS_BOOTCS |
| 154 | */ | 141 | */ |
| 155 | #define REALVIEW_SYS_LOCK_LOCKED (1 << 16) | 142 | #define REALVIEW_SYS_LOCK_LOCKED (1 << 16) |
| 156 | #define REALVIEW_SYS_LOCKVAL_MASK 0xFFFF /* write 0xA05F to enable write access */ | 143 | #define REALVIEW_SYS_LOCKVAL_MASK 0xA05F /* Enable write access */ |
| 157 | 144 | ||
| 158 | /* | 145 | /* |
| 159 | * REALVIEW_SYS_FLASH | 146 | * REALVIEW_SYS_FLASH |
diff --git a/arch/arm/mach-realview/include/mach/system.h b/arch/arm/mach-realview/include/mach/system.h index 1a15a441e027..a30f2e3ec178 100644 --- a/arch/arm/mach-realview/include/mach/system.h +++ b/arch/arm/mach-realview/include/mach/system.h | |||
| @@ -25,6 +25,8 @@ | |||
| 25 | #include <mach/hardware.h> | 25 | #include <mach/hardware.h> |
| 26 | #include <mach/platform.h> | 26 | #include <mach/platform.h> |
| 27 | 27 | ||
| 28 | void (*realview_reset)(char mode); | ||
| 29 | |||
| 28 | static inline void arch_idle(void) | 30 | static inline void arch_idle(void) |
| 29 | { | 31 | { |
| 30 | /* | 32 | /* |
| @@ -36,16 +38,12 @@ static inline void arch_idle(void) | |||
| 36 | 38 | ||
| 37 | static inline void arch_reset(char mode, const char *cmd) | 39 | static inline void arch_reset(char mode, const char *cmd) |
| 38 | { | 40 | { |
| 39 | void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_RESETCTL_OFFSET; | ||
| 40 | unsigned int val; | ||
| 41 | |||
| 42 | /* | 41 | /* |
| 43 | * To reset, we hit the on-board reset register | 42 | * To reset, we hit the on-board reset register |
| 44 | * in the system FPGA | 43 | * in the system FPGA |
| 45 | */ | 44 | */ |
| 46 | val = __raw_readl(hdr_ctrl); | 45 | if (realview_reset) |
| 47 | val |= REALVIEW_SYS_CTRL_RESET_CONFIGCLR; | 46 | realview_reset(mode); |
| 48 | __raw_writel(val, hdr_ctrl); | ||
| 49 | } | 47 | } |
| 50 | 48 | ||
| 51 | #endif | 49 | #endif |
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index 2817fe099319..a6ba147692c1 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c | |||
| @@ -290,6 +290,16 @@ static struct sys_timer realview_pb1176_timer = { | |||
| 290 | .init = realview_pb1176_timer_init, | 290 | .init = realview_pb1176_timer_init, |
| 291 | }; | 291 | }; |
| 292 | 292 | ||
| 293 | static void realview_pb1176_reset(char mode) | ||
| 294 | { | ||
| 295 | void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + | ||
| 296 | REALVIEW_SYS_RESETCTL_OFFSET; | ||
| 297 | void __iomem *rst_hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + | ||
| 298 | REALVIEW_SYS_LOCK_OFFSET; | ||
| 299 | __raw_writel(REALVIEW_SYS_LOCKVAL_MASK, rst_hdr_ctrl); | ||
| 300 | __raw_writel(REALVIEW_PB1176_SYS_LOCKVAL_RSTCTL, hdr_ctrl); | ||
| 301 | } | ||
| 302 | |||
| 293 | static void __init realview_pb1176_init(void) | 303 | static void __init realview_pb1176_init(void) |
| 294 | { | 304 | { |
| 295 | int i; | 305 | int i; |
| @@ -313,6 +323,7 @@ static void __init realview_pb1176_init(void) | |||
| 313 | #ifdef CONFIG_LEDS | 323 | #ifdef CONFIG_LEDS |
| 314 | leds_event = realview_leds_event; | 324 | leds_event = realview_leds_event; |
| 315 | #endif | 325 | #endif |
| 326 | realview_reset = realview_pb1176_reset; | ||
| 316 | } | 327 | } |
| 317 | 328 | ||
| 318 | MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") | 329 | MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") |
diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 94680fcf726d..070d284ce96e 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c | |||
| @@ -299,6 +299,21 @@ static struct sys_timer realview_pb11mp_timer = { | |||
| 299 | .init = realview_pb11mp_timer_init, | 299 | .init = realview_pb11mp_timer_init, |
| 300 | }; | 300 | }; |
| 301 | 301 | ||
| 302 | static void realview_pb11mp_reset(char mode) | ||
| 303 | { | ||
| 304 | void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + | ||
| 305 | REALVIEW_SYS_RESETCTL_OFFSET; | ||
| 306 | unsigned int val; | ||
| 307 | |||
| 308 | /* | ||
| 309 | * To reset, we hit the on-board reset register | ||
| 310 | * in the system FPGA | ||
| 311 | */ | ||
| 312 | val = __raw_readl(hdr_ctrl); | ||
| 313 | val |= REALVIEW_PB11MP_SYS_CTRL_RESET_CONFIGCLR; | ||
| 314 | __raw_writel(val, hdr_ctrl); | ||
| 315 | } | ||
| 316 | |||
| 302 | static void __init realview_pb11mp_init(void) | 317 | static void __init realview_pb11mp_init(void) |
| 303 | { | 318 | { |
| 304 | int i; | 319 | int i; |
| @@ -324,6 +339,7 @@ static void __init realview_pb11mp_init(void) | |||
| 324 | #ifdef CONFIG_LEDS | 339 | #ifdef CONFIG_LEDS |
| 325 | leds_event = realview_leds_event; | 340 | leds_event = realview_leds_event; |
| 326 | #endif | 341 | #endif |
| 342 | realview_reset = realview_pb11mp_reset; | ||
| 327 | } | 343 | } |
| 328 | 344 | ||
| 329 | MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") | 345 | MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") |
