Commit a32fe93daf9c6b6ffbab1d9b9e2a8e4c335bda5c

Authored by Stefan Roese
Committed by Josh Boyer
1 parent 101c192e11

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 }