[PATCH 1/1] reboot: Fix Realview ARM1176PB board reboot
Philby John
pjohn at in.mvista.com
Thu Oct 22 08:58:00 EDT 2009
Catalin,
Ping on this one! Is there anything else that I must do here other
than the void* type cast that Russell asked me to correct?
Regards,
Philby
On Wed, 2008-06-18 at 15:23 +0100, Catalin Marinas wrote:
> On Thu, 2008-06-12 at 16:18 +0530, philby john wrote:
> > The implementation is now as per your recommendations. Also I adopted
> > the approach followed in at91cap9.c where they use the function ptr
> > at91_arch_reset(). But please note that I did not "export" this
> > function ptr in the implementation, because I could not find the same
> > in at91cap9.c and also I felt it wasn't required.
>
> That's strange, they define the pointer in the system.h file. Shouldn't
> this be an extern declaration and the pointer defined in a .c file?
>
> There are still a few (minor) issues, see below.
>
> > --- a/arch/arm/mach-realview/core.h
> > +++ b/arch/arm/mach-realview/core.h
> > @@ -63,5 +63,5 @@ extern void __iomem *timer3_va_base;
> > extern void realview_leds_event(led_event_t ledevt);
> > extern void realview_timer_init(unsigned int timer_irq);
> > extern int realview_flash_register(struct resource *res, u32 num);
> > -
> > +extern void (*realview_reset)(char);
>
> Maybe place this declaration in system.h if no one argues that the
> at91cap9.c case is wrong.
This I think is the correct place otherwise compiler would throw such
errors..
arch/arm/mach-realview/realview_pb11mp.c: In function
'realview_pb11mp_init':
arch/arm/mach-realview/realview_pb11mp.c:337: error: 'realview_reset'
undeclared (first use in this function)
arch/arm/mach-realview/realview_pb1176.c: In function
'realview_pb1176_init':
arch/arm/mach-realview/realview_pb1176.c:322: error: 'realview_reset'
undeclared (first use in this function)
>
> > +static void realview_pb1176_reset(char mode)
> > +{
> > + void __iomem *hdr_ctrl;
> > + void __iomem *rst_hdr_ctrl;
> > +
> > + hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_RESETCTL_OFFSET;
> > + rst_hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_LOCK_OFFSET;
>
> Can you not merge the above four lines into two? I.e. assign the values
> when you define the variable?
Changed.
>
> > @@ -278,6 +289,7 @@ static void __init realview_pb1176_init(void)
> > #ifdef CONFIG_LEDS
> > leds_event = realview_leds_event;
> > #endif
> > + realview_reset = (void *) realview_pb1176_reset;
>
> Minor point (it occurs a few times in this patch) - we don't leave a
> space after "(void *)".
>
> > --- a/include/asm-arm/arch-realview/board-pb1176.h
> > +++ b/include/asm-arm/arch-realview/board-pb1176.h
> > @@ -131,6 +131,11 @@
> > #define NR_GIC_PB1176 2
> >
> > /*
> > + * Control register SYS_RESETCTL is set to 1 to force a soft reset
> > + */
> > +#define REALVIEW_SYS_LOCKVAL_RSTCTL 0x0100
>
> If this value is specific to PB1176, could you change the name to
> REALVIEW_PB1176_... to avoid future overlap with other RealView
> definitions? You could also move it before the IRQ_* definitions.
Done
>
> > diff --git a/include/asm-arm/arch-realview/board-pb11mp.h b/include/asm-arm/arch-realview/board-pb11mp.h
> > index a1294d9...56da9ea 100644
> > --- a/include/asm-arm/arch-realview/board-pb11mp.h
> > +++ b/include/asm-arm/arch-realview/board-pb11mp.h
> > @@ -164,6 +164,18 @@
> >
> > #define NR_GIC_PB11MP 2
> >
> > + /*
> > + * 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)
>
> Same as above, change names to REALVIEW_PB11MP_*
Done
>
> > diff --git a/include/asm-arm/arch-realview/system.h b/include/asm-arm/arch-realview/system.h
> > index 6f3d0ce..46e613d 100644
> > --- a/include/asm-arm/arch-realview/system.h
> > +++ b/include/asm-arm/arch-realview/system.h
> > @@ -25,6 +25,8 @@
> > #include <asm/io.h>
> > #include <asm/arch/platform.h>
> >
> > +void (*realview_reset) (char mode) = NULL;
>
> I would move this to mach-realview/core.c (and remove the space after
> (*realview_reset)). No need for NULL declaration as the global variables
> will be automatically zero-initialised.
Done. Also a concern reviewers at Montavista had was that, they could
not find a similar specific reset code for ARM1176EB, since all code
setting reset control registers have been removed from arch_reset(). So
they advised,
1)Retention of old reset method and fall back to executing the old
method in arch_reset when realview_reset is NULL.
OR
2)Add proper stubs so that developers could add if they knew the proper
register values.
Preferring option 1 to 2.
PATCH FOLLOWS
>From 3f538d22df06ac9c5afa0e28d9513686043e3c9e Mon Sep 17 00:00:00 2001
From: pjohn <pjohn at in.mvista.com>
Date: Wed, 8 Jul 2009 17:53:01 +0530
Subject: [PATCH] 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 at in.mvista.com>
---
arch/arm/mach-realview/core.h | 2 +-
arch/arm/mach-realview/include/mach/board-pb1176.h | 5 +++++
arch/arm/mach-realview/include/mach/board-pb11mp.h | 12 ++++++++++++
arch/arm/mach-realview/include/mach/platform.h | 15 +--------------
arch/arm/mach-realview/include/mach/system.h | 10 ++++------
arch/arm/mach-realview/realview_pb1176.c | 11 +++++++++++
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 59a337b..ae9891c 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);
extern int realview_flash_register(struct resource *res, u32 num);
extern int realview_eth_register(const char *name, struct resource *res);
extern int realview_usb_register(struct resource *res);
-
+extern void (*realview_reset)(char);
#endif
diff --git a/arch/arm/mach-realview/include/mach/board-pb1176.h b/arch/arm/mach-realview/include/mach/board-pb1176.h
index 98f8e7e..34b80b7 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 @@
#define REALVIEW_PB1176_GIC_DIST_BASE 0x10041000 /* GIC distributor, on FPGA */
#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 */
diff --git a/arch/arm/mach-realview/include/mach/board-pb11mp.h b/arch/arm/mach-realview/include/mach/board-pb11mp.h
index f0d68e0..7abf918 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 @@
#define REALVIEW_TC11MP_GIC_DIST_BASE 0x1F001000 /* Test chip interrupt controller distributor */
#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 */
diff --git a/arch/arm/mach-realview/include/mach/platform.h b/arch/arm/mach-realview/include/mach/platform.h
index c8f5083..4f46bf7 100644
--- a/arch/arm/mach-realview/include/mach/platform.h
+++ b/arch/arm/mach-realview/include/mach/platform.h
@@ -119,19 +119,6 @@
#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)
-/*
- * 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
* ------------------------------------------------------------------------
@@ -153,7 +140,7 @@
* SYS_CLD, SYS_BOOTCS
*/
#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
diff --git a/arch/arm/mach-realview/include/mach/system.h b/arch/arm/mach-realview/include/mach/system.h
index 1a15a44..a30f2e3 100644
--- a/arch/arm/mach-realview/include/mach/system.h
+++ b/arch/arm/mach-realview/include/mach/system.h
@@ -25,6 +25,8 @@
#include <mach/hardware.h>
#include <mach/platform.h>
+void (*realview_reset)(char mode);
+
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)
{
- 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_SYS_CTRL_RESET_CONFIGCLR;
- __raw_writel(val, hdr_ctrl);
+ if (realview_reset)
+ realview_reset(mode);
}
#endif
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c
index 25efe71..215a6f8 100644
--- a/arch/arm/mach-realview/realview_pb1176.c
+++ b/arch/arm/mach-realview/realview_pb1176.c
@@ -274,6 +274,16 @@ static struct sys_timer realview_pb1176_timer = {
.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)
{
int i;
@@ -297,6 +307,7 @@ static void __init realview_pb1176_init(void)
#ifdef CONFIG_LEDS
leds_event = realview_leds_event;
#endif
+ realview_reset = (void *)realview_pb1176_reset;
}
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 dc4b169..bee9266 100644
--- a/arch/arm/mach-realview/realview_pb11mp.c
+++ b/arch/arm/mach-realview/realview_pb11mp.c
@@ -283,6 +283,21 @@ static struct sys_timer realview_pb11mp_timer = {
.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)
{
int i;
@@ -308,6 +323,7 @@ static void __init realview_pb11mp_init(void)
#ifdef CONFIG_LEDS
leds_event = realview_leds_event;
#endif
+ realview_reset = (void *) realview_pb11mp_reset;
}
MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore")
--
1.6.3.3.MVISTA
More information about the linux-arm-kernel
mailing list