Skip to contentSkip to conversation

sbc8560: Fix warm reboot with board specific reset function

PATCH Superseded Paul Gortmaker 2 participants 7 messages Aug 13, 2009 – Aug 14, 2009

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 sbc8560: Fix warm reboot with board specific reset function

From: Liang Li <[email protected]>

The existing fsl_rstcr_restart function fails to reset the sbc8560 board. This implements a board specific reset function that uses the RCR(Reset Control Register) of the board's EPLD to do a reset.

---
 arch/powerpc/platforms/85xx/sbc8560.c |   39 ++++++++++++++++++++++++++++++++-
 1 files changed, 38 insertions(+), 1 deletions(-)
arch/powerpc/platforms/85xx/sbc8560.c +38 -1
index cc27807..86dcca2 100644
@@ -267,6 +267,43 @@ arch_initcall(sbc8560_rtc_init);
 
 #endif	/* M48T59 */
 
+static __u8 __iomem *brstcr;
+
+static int __init sbc8560_bdrstcr_init(void)
+{
+	struct device_node *np;
+	struct resource res;
+
+	np = of_find_compatible_node(NULL, NULL, "wrs,sbc8560-brstcr");
+	if (np == NULL) {
+		printk(KERN_WARNING "sbc8560: No board specific RSTCR in DTB.\n");
+		return -ENODEV;
+	}
+
+	of_address_to_resource(np, 0, &res);
+
+	printk(KERN_INFO "sbc8560: Found BRSTCR at i/o 0x%x\n", res.start);
+
+	brstcr = ioremap(res.start, res.end - res.start);
+	if(!brstcr)
+		printk(KERN_WARNING "sbc8560: ioremap of brstcr failed.\n");
+
+	of_node_put(np);
+
+	return 0;
+}
+
+arch_initcall(sbc8560_bdrstcr_init);
+
+void sbc8560_rstcr_restart(char * cmd)
+{
+	local_irq_disable();
+	if(brstcr)
+		out_8(brstcr,in_8(brstcr) & 0x7f);
+
+	while(1);
+}
+
 define_machine(sbc8560) {
 	.name			= "SBC8560",
 	.probe			= sbc8560_probe,
@@ -274,7 +311,7 @@ define_machine(sbc8560) {
 	.init_IRQ		= sbc8560_pic_init,
 	.show_cpuinfo		= sbc8560_show_cpuinfo,
 	.get_irq		= mpic_get_irq,
-	.restart		= fsl_rstcr_restart,
+	.restart		= sbc8560_rstcr_restart,
 	.calibrate_decr		= generic_calibrate_decr,
 	.progress		= udbg_progress,
 };
Signature · 1 line
1.6.3.3
#1 lore raw
Quoted 6 lines · Paul Gortmaker

From: Liang Li <[email protected]>

The existing fsl_rstcr_restart function fails to reset the sbc8560 board. This implements a board specific reset function that uses the RCR(Reset Control Register) of the board's EPLD to do a reset.

Quoted 6 lines

---
arch/powerpc/platforms/85xx/sbc8560.c | 39 ++++++++++++++++++++++++
++++++++-

1 files changed, 38 insertions(+), 1 deletions(-)

The reason it didn't was that feature doesnt exist on the mpc8560 :)

- k

#2 lore raw
Quoted 9 lines · Kumar Gala
Quoted 6 lines · Paul Gortmaker

From: Liang Li <[email protected]>

The existing fsl_rstcr_restart function fails to reset the sbc8560 board. This implements a board specific reset function that uses the RCR(Reset Control Register) of the board's EPLD to do a reset.

Quoted 8 lines
Quoted 6 lines

---
arch/powerpc/platforms/85xx/sbc8560.c | 39
++++++++++++++++++++++++++++++++-

1 files changed, 38 insertions(+), 1 deletions(-)

The reason it didn't was that feature doesnt exist on the mpc8560 :)

I could see how that might have an impact on the
functionality.... :-)

So, what should the guts block of the 8560 dts look like? It currently has the standard:

------------
global-utilities@e0000 {
compatible = "fsl,mpc8560-guts";
reg = <0xe0000 0x1000>;
fsl,has-rstcr;
};
------------

MPC8560 has a guts block, but saying "has-rstcr", as you've pointed out, is a bit of a lie. If we remove that tag, then we'll trip the:

printk(KERN_INFO "rstcr compatible register does not exist!\n");

which isn't the end of the world, but at the moment it reads more like an error message, vs. an informative one.

Paul.

Quoted 2 lines

- k

#3 lore raw
Quoted 30 lines · Paul Gortmaker
Quoted 7 lines · Kumar Gala
Quoted 6 lines · Paul Gortmaker

From: Liang Li <[email protected]>

The existing fsl_rstcr_restart function fails to reset the sbc8560 board. This implements a board specific reset function that uses the RCR(Reset Control Register) of the board's EPLD to do a reset.

Quoted 7 lines
Quoted 6 lines

---
arch/powerpc/platforms/85xx/sbc8560.c | 39 ++++++++++++++++++++++
++++++++++-

1 files changed, 38 insertions(+), 1 deletions(-)

The reason it didn't was that feature doesnt exist on the mpc8560 :)

I could see how that might have an impact on the
functionality.... :-)

So, what should the guts block of the 8560 dts look like? It currently has the standard:

------------
global-utilities@e0000 {
compatible = "fsl,mpc8560-guts";
reg = <0xe0000 0x1000>;
fsl,has-rstcr;
};
------------

Quoted 8 lines

MPC8560 has a guts block, but saying "has-rstcr", as you've pointed out, is a bit of a lie. If we remove that tag, then we'll trip the:

printk(KERN_INFO "rstcr compatible register does not exist!\n");

which isn't the end of the world, but at the moment it reads more like an error message, vs. an informative one.

we should probably remove 'fsl,has-rstcr' from the .dts since that's just wrong. I've got no issue w/either removing the warning or changing its wording.

- k

#4 lore raw
In reply to Paul Gortmaker
Quoted 44 lines · Paul Gortmaker

From: Liang Li <[email protected]>

The existing fsl_rstcr_restart function fails to reset the sbc8560 board. This implements a board specific reset function that uses the RCR(Reset Control Register) of the board's EPLD to do a reset.

---
arch/powerpc/platforms/85xx/sbc8560.c | 39 ++++++++++++++++++++++++
++++++++-

1 files changed, 38 insertions(+), 1 deletions(-)
arch/powerpc/platforms/85xx/sbc8560.c +23 -0
index cc27807..86dcca2 100644
@@ -267,6 +267,43 @@ arch_initcall(sbc8560_rtc_init);
 
 #endif	/* M48T59 */
 
+static __u8 __iomem *brstcr;
+
+static int __init sbc8560_bdrstcr_init(void)
+{
+	struct device_node *np;
+	struct resource res;
+
+	np = of_find_compatible_node(NULL, NULL, "wrs,sbc8560-brstcr");
+	if (np == NULL) {
+		printk(KERN_WARNING "sbc8560: No board specific RSTCR in DTB.\n");
+		return -ENODEV;
+	}
+
+	of_address_to_resource(np, 0, &res);
+
+	printk(KERN_INFO "sbc8560: Found BRSTCR at i/o 0x%x\n", res.start);
+
+	brstcr = ioremap(res.start, res.end - res.start);
+	if(!brstcr)
+		printk(KERN_WARNING "sbc8560: ioremap of brstcr failed.\n");
+
+	of_node_put(np);
+

arch/powerpc/platforms/85xx/sbc8560.c arch_initcall(sbc8560_rtc_init); · line 302

Quoted 10 lines
arch/powerpc/platforms/85xx/sbc8560.c +10 -0
+	return 0;
+}
+
+arch_initcall(sbc8560_bdrstcr_init);
+
+void sbc8560_rstcr_restart(char * cmd)
+{
+	local_irq_disable();
+	if(brstcr)
+		out_8(brstcr,in_8(brstcr) & 0x7f);

how about using clrbits8()

Quoted 23 lines
arch/powerpc/platforms/85xx/sbc8560.c +5 -1
+
+	while(1);
+}
+
 define_machine(sbc8560) {
 	.name			= "SBC8560",
 	.probe			= sbc8560_probe,
@@ -274,7 +311,7 @@ define_machine(sbc8560) {
 	.init_IRQ		= sbc8560_pic_init,
 	.show_cpuinfo		= sbc8560_show_cpuinfo,
 	.get_irq		= mpic_get_irq,
-	.restart		= fsl_rstcr_restart,
+	.restart		= sbc8560_rstcr_restart,
 	.calibrate_decr		= generic_calibrate_decr,
 	.progress		= udbg_progress,
 };
Signature · 6 lines
1.6.3.3

_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://lists.ozlabs.org/listinfo/linuxppc-dev
#5 lore raw

PATCH v2 1/1 sbc8560: Fix warm reboot with board specific reset function

From: Liang Li <[email protected]>

The existing fsl_rstcr_restart function is not applicable to the mpc8560. The Global Utilities Block on this earlier CPU doesn't have the control/reset register at 0xe00b0. This implements a board specific reset function that uses the RCR(Reset Control Register) of the sbc8560's EPLD to do a reset.

---

v2: update comment, change outb(x, inb(x)&0x7f) --> clrbits(x,0x80)

 arch/powerpc/platforms/85xx/sbc8560.c |   39 ++++++++++++++++++++++++++++++++-
 1 files changed, 38 insertions(+), 1 deletions(-)
arch/powerpc/platforms/85xx/sbc8560.c +38 -1
index cc27807..a5ad1c7 100644
@@ -267,6 +267,43 @@ arch_initcall(sbc8560_rtc_init);
 
 #endif	/* M48T59 */
 
+static __u8 __iomem *brstcr;
+
+static int __init sbc8560_bdrstcr_init(void)
+{
+	struct device_node *np;
+	struct resource res;
+
+	np = of_find_compatible_node(NULL, NULL, "wrs,sbc8560-brstcr");
+	if (np == NULL) {
+		printk(KERN_WARNING "sbc8560: No board specific RSTCR in DTB.\n");
+		return -ENODEV;
+	}
+
+	of_address_to_resource(np, 0, &res);
+
+	printk(KERN_INFO "sbc8560: Found BRSTCR at i/o 0x%x\n", res.start);
+
+	brstcr = ioremap(res.start, res.end - res.start);
+	if(!brstcr)
+		printk(KERN_WARNING "sbc8560: ioremap of brstcr failed.\n");
+
+	of_node_put(np);
+
+	return 0;
+}
+
+arch_initcall(sbc8560_bdrstcr_init);
+
+void sbc8560_rstcr_restart(char * cmd)
+{
+	local_irq_disable();
+	if(brstcr)
+		clrbits8(brstcr, 0x80);
+
+	while(1);
+}
+
 define_machine(sbc8560) {
 	.name			= "SBC8560",
 	.probe			= sbc8560_probe,
@@ -274,7 +311,7 @@ define_machine(sbc8560) {
 	.init_IRQ		= sbc8560_pic_init,
 	.show_cpuinfo		= sbc8560_show_cpuinfo,
 	.get_irq		= mpic_get_irq,
-	.restart		= fsl_rstcr_restart,
+	.restart		= sbc8560_rstcr_restart,
 	.calibrate_decr		= generic_calibrate_decr,
 	.progress		= udbg_progress,
 };
Signature · 1 line
1.6.3.3
Applied
#6 lore raw
Quoted 8 lines · Paul Gortmaker

From: Liang Li <[email protected]>

The existing fsl_rstcr_restart function is not applicable to the mpc8560. The Global Utilities Block on this earlier CPU doesn't have the control/reset register at 0xe00b0. This implements a board specific reset function that uses the RCR(Reset Control Register) of the sbc8560's EPLD to do a reset.

Quoted 5 lines

---

v2: update comment, change outb(x, inb(x)&0x7f) --> clrbits(x,0x80)

applied to next

- k