Commit a32fe93daf9c6b6ffbab1d9b9e2a8e4c335bda5c
Committed by
Josh Boyer
1 parent
101c192e11
Exists in
master
and in
4 other branches
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>
Showing 2 changed files with 40 additions and 2 deletions Side-by-side Diff
Documentation/powerpc/dts-bindings/4xx/reboot.txt
1 | +Reboot property to control system reboot on PPC4xx systems: | |
2 | + | |
3 | +By setting "reset_type" to one of the following values, the default | |
4 | +software reset mechanism may be overidden. Here the possible values of | |
5 | +"reset_type": | |
6 | + | |
7 | + 1 - PPC4xx core reset | |
8 | + 2 - PPC4xx chip reset | |
9 | + 3 - PPC4xx system reset (default) | |
10 | + | |
11 | +Example: | |
12 | + | |
13 | + cpu@0 { | |
14 | + device_type = "cpu"; | |
15 | + model = "PowerPC,440SPe"; | |
16 | + ... | |
17 | + reset-type = <2>; /* Use chip-reset */ | |
18 | + }; |
arch/powerpc/sysdev/ppc4xx_soc.c
... | ... | @@ -191,11 +191,31 @@ |
191 | 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 | 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 | 219 | while (1) |
200 | 220 | ; /* Just in case the reset doesn't work */ |
201 | 221 | } |