ARM: 5873/1: ARM: Fix the reset logic for ARM RealView boards
authorColin Tuckley <colin.tuckley@arm.com>
Mon, 11 Jan 2010 10:09:15 +0000 (11:09 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 11 Jan 2010 15:39:21 +0000 (15:39 +0000)
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: Colin Tuckley <colin.tuckley@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-realview/include/mach/board-pb1176.h
arch/arm/mach-realview/include/mach/platform.h
arch/arm/mach-realview/realview_eb.c
arch/arm/mach-realview/realview_pb1176.c
arch/arm/mach-realview/realview_pb11mp.c
arch/arm/mach-realview/realview_pba8.c
arch/arm/mach-realview/realview_pbx.c

index 34b80b7d40b825d3d728779b056315f9b6d59fda..2f5ccb298858def61458ed544fdac81383718982 100644 (file)
@@ -74,8 +74,8 @@
 #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 */
index 4f46bf71e7524e485356950ea9e0f6373fc6235e..86c0c4435a466ee6319400d03d0983609c8406d9 100644 (file)
  *     SYS_CLD, SYS_BOOTCS
  */
 #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
index 917f8ca3abffd212e724c9133b23648c9986ba40..7d857d30055843c19d4a2e4916b9d191a09c2645 100644 (file)
@@ -381,6 +381,20 @@ static struct sys_timer realview_eb_timer = {
        .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)
 {
        int i;
@@ -408,6 +422,7 @@ static void __init realview_eb_init(void)
 #ifdef CONFIG_LEDS
        leds_event = realview_leds_event;
 #endif
+       realview_reset = realview_eb_reset;
 }
 
 MACHINE_START(REALVIEW_EB, "ARM-RealView EB")
index 7fb726d5f8b9bbb2cbefea38e3fa6b357de033de..44392e51dd50129a20a4405430f5b0a5ff1f590d 100644 (file)
@@ -292,12 +292,10 @@ static struct sys_timer realview_pb1176_timer = {
 
 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);
+       void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);
+       void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK);
+       __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);
+       __raw_writel(REALVIEW_PB1176_SYS_SOFT_RESET, reset_ctrl);
 }
 
 static void realview_pb1176_fixup(struct machine_desc *mdesc,
index 9bbbfc05f22596616f91b4394f5cd8ceee6f6d07..3e02731af9593414d181c2188feadab82cadcc2a 100644 (file)
@@ -301,17 +301,16 @@ static struct sys_timer realview_pb11mp_timer = {
 
 static void realview_pb11mp_reset(char mode)
 {
-       void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) +
-               REALVIEW_SYS_RESETCTL_OFFSET;
-       unsigned int val;
+       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
         */
-       val = __raw_readl(hdr_ctrl);
-       val |= REALVIEW_PB11MP_SYS_CTRL_RESET_CONFIGCLR;
-       __raw_writel(val, hdr_ctrl);
+       __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);
+       __raw_writel(0x0000, reset_ctrl);
+       __raw_writel(0x0004, reset_ctrl);
 }
 
 static void __init realview_pb11mp_init(void)
index fe861e96c5663011b5c1cbac5e723a9f008a3eab..fe4e25c4201a7e04ac30fa87e47a9fcf03e8f773 100644 (file)
@@ -272,6 +272,20 @@ static struct sys_timer realview_pba8_timer = {
        .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)
 {
        int i;
@@ -291,6 +305,7 @@ static void __init realview_pba8_init(void)
 #ifdef CONFIG_LEDS
        leds_event = realview_leds_event;
 #endif
+       realview_reset = realview_pba8_reset;
 }
 
 MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8")
index ec39488e2b42c838f2a24073af41f5b95c2b6e13..a21a4b395f733ad44a07ceae7371104375f2d2cd 100644 (file)
@@ -324,6 +324,20 @@ static void realview_pbx_fixup(struct machine_desc *mdesc, struct tag *tags,
 #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)
 {
        int i;
@@ -358,6 +372,7 @@ static void __init realview_pbx_init(void)
 #ifdef CONFIG_LEDS
        leds_event = realview_leds_event;
 #endif
+       realview_reset = realview_pbx_reset;
 }
 
 MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX")