[PATCH] Cleanup mpc83xx_restart() code

Wolfgang Denk wd at denx.de
Sun Oct 23 07:28:39 EST 2005


The current Linux 2.6 mpc83xx_restart() routine which is supposed to
be common for all MPC83xx boards actually performs mpc834x_sys board
specific operations. This code was moved to
arch/ppc/platforms/83xx/mpc834x_sys.c, and mpc83xx_restart() was
replaced with generic MPC83xx reset code. Now mpc834x_sys uses it's
platform specific restart code and we can use common MPC83xx reset
code in other MPC83xx boards


---
ppc83xx common code cleanup, MPC834x_SYS platform specific code moved to
arch/ppc/platform/83xx/mpc834x_sys.c

Signed-off-by: Marian Balakowicz <m8 at semihalf.com>
Signed-off-by: Wolfgang Denk <wd at denx.de>

---
commit 8176ad2d83c41be9697b475c8c0b975908cb7843
tree 16a5246f615529cf423b63231990723ab8a6bd13
parent 80387b45146a9e397c1fec1138f3eb3884c42ed8
author Marian Balakowicz <m8 at semihalf.com> Tue, 18 Oct 2005 18:35:07 +0200
committer Marian Balakowicz <m8 at semihalf.com> Tue, 18 Oct 2005 18:35:07 +0200

 arch/ppc/platforms/83xx/mpc834x_sys.c |   36 ++++++++++++++++++++++++
 arch/ppc/syslib/ppc83xx_setup.c       |   49 +++++++++++----------------------
 include/asm-ppc/mpc83xx.h             |   13 +++++++++
 3 files changed, 65 insertions(+), 33 deletions(-)

diff --git a/arch/ppc/platforms/83xx/mpc834x_sys.c b/arch/ppc/platforms/83xx/mpc834x_sys.c
--- a/arch/ppc/platforms/83xx/mpc834x_sys.c
+++ b/arch/ppc/platforms/83xx/mpc834x_sys.c
@@ -245,6 +245,40 @@ mpc834x_sys_set_bat(void)
 	mb();
 }
 
+void
+mpc83xx_sys_restart(char *cmd)
+{
+	volatile unsigned char __iomem *reg;
+	unsigned char tmp;
+
+	reg = ioremap(BCSR_PHYS_ADDR, BCSR_SIZE);
+
+	local_irq_disable();
+
+	/*
+	 * Unlock the BCSR bits so a PRST will update the contents.
+	 * Otherwise the reset asserts but doesn't clear.
+	 */
+	tmp = in_8(reg + BCSR_MISC_REG3_OFF);
+	tmp |= BCSR_MISC_REG3_CNFLOCK; /* low true, high false */
+	out_8(reg + BCSR_MISC_REG3_OFF, tmp);
+
+	/*
+	 * Trigger a reset via a low->high transition of the
+	 * PORESET bit.
+	 */
+	tmp = in_8(reg + BCSR_MISC_REG2_OFF);
+	tmp &= ~BCSR_MISC_REG2_PORESET;
+	out_8(reg + BCSR_MISC_REG2_OFF, tmp);
+
+	udelay(1);
+
+	tmp |= BCSR_MISC_REG2_PORESET;
+	out_8(reg + BCSR_MISC_REG2_OFF, tmp);
+
+	for(;;);
+}
+
 void __init
 platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
 	      unsigned long r6, unsigned long r7)
@@ -313,7 +347,7 @@ platform_init(unsigned long r3, unsigned
 	ppc_md.init_IRQ = mpc834x_sys_init_IRQ;
 	ppc_md.get_irq = ipic_get_irq;
 
-	ppc_md.restart = mpc83xx_restart;
+	ppc_md.restart = mpc83xx_sys_restart;
 	ppc_md.power_off = mpc83xx_power_off;
 	ppc_md.halt = mpc83xx_halt;
 
diff --git a/arch/ppc/syslib/ppc83xx_setup.c b/arch/ppc/syslib/ppc83xx_setup.c
--- a/arch/ppc/syslib/ppc83xx_setup.c
+++ b/arch/ppc/syslib/ppc83xx_setup.c
@@ -63,13 +63,10 @@ mpc83xx_find_end_of_memory(void)
 long __init
 mpc83xx_time_init(void)
 {
-#define SPCR_OFFS   0x00000110
-#define SPCR_TBEN   0x00400000
-
 	bd_t *binfo = (bd_t *)__res;
-	u32 *spcr = ioremap(binfo->bi_immr_base + SPCR_OFFS, 4);
+	u32 *spcr = ioremap(binfo->bi_immr_base + MPC83xx_SPCR, 4);
 
-	*spcr |= SPCR_TBEN;
+	*spcr |= MPC83xx_SPCR_TBEN;
 
 	iounmap(spcr);
 
@@ -132,35 +129,23 @@ mpc83xx_early_serial_map(void)
 void
 mpc83xx_restart(char *cmd)
 {
-	volatile unsigned char __iomem *reg;
-	unsigned char tmp;
-
-	reg = ioremap(BCSR_PHYS_ADDR, BCSR_SIZE);
-
-	local_irq_disable();
-
-	/*
-	 * Unlock the BCSR bits so a PRST will update the contents.
-	 * Otherwise the reset asserts but doesn't clear.
-	 */
-	tmp = in_8(reg + BCSR_MISC_REG3_OFF);
-	tmp |= BCSR_MISC_REG3_CNFLOCK; /* low true, high false */
-	out_8(reg + BCSR_MISC_REG3_OFF, tmp);
-
-	/*
-	 * Trigger a reset via a low->high transition of the
-	 * PORESET bit.
-	 */
-	tmp = in_8(reg + BCSR_MISC_REG2_OFF);
-	tmp &= ~BCSR_MISC_REG2_PORESET;
-	out_8(reg + BCSR_MISC_REG2_OFF, tmp);
-
-	udelay(1);
+	bd_t *binfo = (bd_t *)__res;
 
-	tmp |= BCSR_MISC_REG2_PORESET;
-	out_8(reg + BCSR_MISC_REG2_OFF, tmp);
+	u32 *rcr = ioremap(binfo->bi_immr_base + MPC83xx_RCR, 4);
+	u32 *rpr = ioremap(binfo->bi_immr_base + MPC83xx_RPR, 4);
 
-	for(;;);
+	/* apply reset protect unlock command to
+	 * reset control protection  register */
+	*rpr = MPC83xx_RPR_RSTE;
+
+	/* apply software hard reset to
+	 * reset control register*/
+	*rcr = MPC83xx_RCR_SWHR;
+
+	/* not reached, but... */
+	iounmap(rcr);
+	iounmap(rpr);
+	for (;;) ;
 }
 
 void
diff --git a/include/asm-ppc/mpc83xx.h b/include/asm-ppc/mpc83xx.h
--- a/include/asm-ppc/mpc83xx.h
+++ b/include/asm-ppc/mpc83xx.h
@@ -95,6 +95,19 @@ extern unsigned char __res[];
 
 #define MPC83xx_CCSRBAR_SIZE	(1024*1024)
 
+/* system priority and configuration register */
+#define MPC83xx_SPCR            0x00000110
+#define MPC83xx_SPCR_TBEN       0x00400000
+
+/* reset protection register */
+#define MPC83xx_RPR		0x00000918
+#define MPC83xx_RPR_RSTE	0x52535445      /* "RSTE" in ASCII */
+
+/* reset control register*/
+#define MPC83xx_RCR		0x0000091c
+#define MPC83xx_RCR_SWHR	0x00000002      /* sw hard reset */
+#define MPC83xx_RCR_SWSR	0x00000001      /* sw soft reset */
+
 /* Let modules/drivers get at immrbar (physical) */
 extern phys_addr_t immrbar;
 



!-------------------------------------------------------------flip-




Best regards,

Wolfgang Denk

-- 
Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
You can observe a lot just by watching.                  - Yogi Berra



More information about the Linuxppc-dev mailing list