powerpc/4xx: Add optional "reset_type" property to control reboot via dts
Subsystems (2)
PATCH v2 1/1 powerpc/4xx: Add optional "reset_type" property to control reboot via dts
By setting "reset_type" to one of the following values, the default software reset mechanism may be overidden. Here the possible values of "reset_type":
1 - PPC4xx core reset
2 - PPC4xx chip reset
3 - PPC4xx system reset (default)
This will be used by a new PPC440SPe board port, which needs a "chip reset" instead of the default "system reset" to be asserted.
---
v2:
- Add small property description to Documentation
- Add sanity check for property value
Documentation/powerpc/dts-bindings/4xx/reboot.txt | 18 +++++++++++++++ arch/powerpc/sysdev/ppc4xx_soc.c | 24 +++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 Documentation/powerpc/dts-bindings/4xx/reboot.txt
Documentation/powerpc/dts-bindings/4xx/reboot.txt new file +18 -0
@@ -0,0 +1,18 @@ +Reboot property to control system reboot on PPC4xx systems: + +By setting "reset_type" to one of the following values, the default +software reset mechanism may be overidden. Here the possible values of +"reset_type": + + 1 - PPC4xx core reset + 2 - PPC4xx chip reset + 3 - PPC4xx system reset (default) + +Example: + + cpu@0 { + device_type = "cpu"; + model = "PowerPC,440SPe"; + ... + reset-type = <2>; /* Use chip-reset */ + };
arch/powerpc/sysdev/ppc4xx_soc.c +22 -2
@@ -191,11 +191,31 @@ static int __init ppc4xx_l2c_probe(void)arch_initcall (ppc4xx_l2c_probe);/* -* At present, this routine just applies a system reset. +* Apply a system reset. Alternatively a board specific value may be +* provided via the "reset-type" property in the cpu node. */ void ppc4xx_reset_system (char *cmd) { -mtspr (SPRN_DBCR0 ,mfspr (SPRN_DBCR0 ) |DBCR0_RST_SYSTEM ); +struct device_node *np; +u32 reset_type =DBCR0_RST_SYSTEM ; +const u32 *prop; + + np =of_find_node_by_type (NULL ,"cpu" ); +if (np) { + prop =of_get_property (np,"reset-type" ,NULL ); + +/* +* Check if property exists and if it is in range: +* 1 - PPC4xx core reset +* 2 - PPC4xx chip reset +* 3 - PPC4xx system reset (default) +*/ +if ((prop) && ((prop[0 ] >=1 ) && (prop[0 ] <=3 ))) + reset_type = prop[0 ] <<28 ; + } + +mtspr (SPRN_DBCR0 ,mfspr (SPRN_DBCR0 ) | reset_type); +while (1 ) ;/* Just in case the reset doesn't work */ }
Signature · 1 line
1.7.1
Quoted 11 lines · Stefan Roese
By setting "
reset_type" to one of the following values, the default software reset mechanism may be overidden. Here the possible values of "reset_type":1 - PPC4xx core reset
2 - PPC4xx chip reset
3 - PPC4xx system reset (default)This will be used by a new PPC440SPe board port, which needs a "chip reset" instead of the default "system reset" to be asserted.
Quoted 7 lines
Signed-off-by Stefan Roese <[email protected]>Cc Josh Boyer <[email protected]>Cc Benjamin Herrenschmidt <[email protected]>---
v2:
- Add small property description to Documentation
- Add sanity check for property value
Thanks for the quick respin.
Ben, I don't have anything else pending for -next at the moment. Can you pick this up yourself, or do you want me to create a pull request for just this patch?
josh
Quoted 71 lines
Documentation/powerpc/dts-bindings/4xx/reboot.txt | 18 +++++++++++++++ arch/powerpc/sysdev/ppc4xx_soc.c | 24 +++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-)create mode 100644
Documentation/powerpc/dts-bindings/4xx/reboot.txtDocumentation/powerpc/dts-bindings/4xx/reboot.txt new file +18
-0@@ -0,0 +1,18 @@ +Reboot property to control system reboot on PPC4xx systems: + +By setting "reset_type" to one of the following values, the default +software reset mechanism may be overidden. Here the possible values of +"reset_type": + + 1 - PPC4xx core reset + 2 - PPC4xx chip reset + 3 - PPC4xx system reset (default) + +Example: + + cpu@0 { + device_type = "cpu"; + model = "PowerPC,440SPe"; + ... + reset-type = <2>; /* Use chip-reset */ + };arch/powerpc/sysdev/ppc4xx_soc.c +22
-2@@ -191,11 +191,31 @@ static int __init ppc4xx_l2c_probe(void)arch_initcall (ppc4xx_l2c_probe);/* -* At present, this routine just applies a system reset. +* Apply a system reset. Alternatively a board specific value may be +* provided via the "reset-type" property in the cpu node. */ void ppc4xx_reset_system (char *cmd) { -mtspr (SPRN_DBCR0 ,mfspr (SPRN_DBCR0 ) |DBCR0_RST_SYSTEM ); +struct device_node *np; +u32 reset_type =DBCR0_RST_SYSTEM ; +const u32 *prop; + + np =of_find_node_by_type (NULL ,"cpu" ); +if (np) { + prop =of_get_property (np,"reset-type" ,NULL ); + +/* +* Check if property exists and if it is in range: +* 1 - PPC4xx core reset +* 2 - PPC4xx chip reset +* 3 - PPC4xx system reset (default) +*/ +if ((prop) && ((prop[0 ] >=1 ) && (prop[0 ] <=3 ))) + reset_type = prop[0 ] <<28 ; + } + +mtspr (SPRN_DBCR0 ,mfspr (SPRN_DBCR0 ) | reset_type); +while (1 ) ;/* Just in case the reset doesn't work */ }Signature · 1 line
1.7.1