diff options
author | Stefan Roese <sr@denx.de> | 2010-04-27 18:13:34 -0400 |
---|---|---|
committer | Josh Boyer <jwboyer@linux.vnet.ibm.com> | 2010-05-05 12:51:54 -0400 |
commit | a32fe93daf9c6b6ffbab1d9b9e2a8e4c335bda5c (patch) | |
tree | 66a68d8817ba3c86f1f38ee2cd1b5f92a9d56076 /arch/powerpc/sysdev | |
parent | 101c192e1163c1c7e8d29748108b582929975038 (diff) |
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.
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Diffstat (limited to 'arch/powerpc/sysdev')
-rw-r--r-- | arch/powerpc/sysdev/ppc4xx_soc.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/arch/powerpc/sysdev/ppc4xx_soc.c b/arch/powerpc/sysdev/ppc4xx_soc.c index 5c014350bf16..d3d6ce3c33b4 100644 --- a/arch/powerpc/sysdev/ppc4xx_soc.c +++ b/arch/powerpc/sysdev/ppc4xx_soc.c | |||
@@ -191,11 +191,31 @@ static int __init ppc4xx_l2c_probe(void) | |||
191 | arch_initcall(ppc4xx_l2c_probe); | 191 | arch_initcall(ppc4xx_l2c_probe); |
192 | 192 | ||
193 | /* | 193 | /* |
194 | * At present, this routine just applies a system reset. | 194 | * Apply a system reset. Alternatively a board specific value may be |
195 | * provided via the "reset-type" property in the cpu node. | ||
195 | */ | 196 | */ |
196 | void ppc4xx_reset_system(char *cmd) | 197 | void ppc4xx_reset_system(char *cmd) |
197 | { | 198 | { |
198 | mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_RST_SYSTEM); | 199 | struct device_node *np; |
200 | u32 reset_type = DBCR0_RST_SYSTEM; | ||
201 | const u32 *prop; | ||
202 | |||
203 | np = of_find_node_by_type(NULL, "cpu"); | ||
204 | if (np) { | ||
205 | prop = of_get_property(np, "reset-type", NULL); | ||
206 | |||
207 | /* | ||
208 | * Check if property exists and if it is in range: | ||
209 | * 1 - PPC4xx core reset | ||
210 | * 2 - PPC4xx chip reset | ||
211 | * 3 - PPC4xx system reset (default) | ||
212 | */ | ||
213 | if ((prop) && ((prop[0] >= 1) && (prop[0] <= 3))) | ||
214 | reset_type = prop[0] << 28; | ||
215 | } | ||
216 | |||
217 | mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | reset_type); | ||
218 | |||
199 | while (1) | 219 | while (1) |
200 | ; /* Just in case the reset doesn't work */ | 220 | ; /* Just in case the reset doesn't work */ |
201 | } | 221 | } |