sbc8560: Fix warm reboot with board specific reset function
Subsystems (2)
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
@@ -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
Quoted 6 lines · Paul Gortmaker
From: Liang Li <[email protected]>
The existing
fsl_rstcr_restartfunction 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
Signed-off-by Liang Li <[email protected]>Signed-off-by Paul Gortmaker <[email protected]>---
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
Quoted 9 lines · Kumar Gala
Quoted 6 lines · Paul Gortmaker
From: Liang Li <[email protected]>
The existing
fsl_rstcr_restartfunction 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
Signed-off-by Liang Li <[email protected]>Signed-off-by Paul Gortmaker <[email protected]>---
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
Quoted 30 lines · Paul Gortmaker
Quoted 7 lines · Kumar Gala
Quoted 6 lines · Paul Gortmaker
From: Liang Li <[email protected]>
The existing
fsl_rstcr_restartfunction 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
Signed-off-by Liang Li <[email protected]>Signed-off-by Paul Gortmaker <[email protected]>---
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 = <0xe00000x1000>;
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
Quoted 44 lines · Paul Gortmaker
From: Liang Li <[email protected]>
The existing
fsl_rstcr_restartfunction 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.Signed-off-by Liang Li <[email protected]>Signed-off-by Paul Gortmaker <[email protected]>---
arch/powerpc/platforms/85xx/sbc8560.c| 39 ++++++++++++++++++++++++
++++++++-1 files changed, 38 insertions(+), 1 deletions(-)arch/powerpc/platforms/85xx/sbc8560.c +23
-0@@ -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
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
@@ -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
Kumar Gala
AppliedQuoted 8 lines · Paul Gortmaker
From: Liang Li <[email protected]>
The existing
fsl_rstcr_restartfunction is not applicable to the mpc8560. The Global Utilities Block on this earlier CPU doesn't have the control/reset register at0xe00b0. 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
Signed-off-by Liang Li <[email protected]>Signed-off-by Paul Gortmaker <[email protected]>---
v2: update comment, change
outb(x, inb(x)&0x7f)-->clrbits(x,0x80)
applied to next
- k