path: root/arch/blackfin/lib
diff options
authorSascha Hauer <>2015-08-26 09:04:45 +0200
committerSascha Hauer <>2015-08-27 21:37:03 +0200
commit83b0a5ae055bc084938dac96b3ea1c796d99d86c (patch)
treeba69e2015cbfeb1626f7ea3f6bf850556541095a /arch/blackfin/lib
parent167e93947e9b755b54900ae9870dbcc089f8d6c9 (diff)
restart: replace reset_cpu with registered restart handlers
This replaces the reset_cpu() function which every SoC or board must provide with registered handlers. This makes it possible to have multiple reset functions for boards which have multiple ways to reset the machine. Also boards which have no way at all to reset the machine no longer have to provide a dummy reset_cpu() function. The problem this solves is that some machines have external PMICs or similar to reset the system which have to be preferred over the internal SoC reset, because the PMIC can reset not only the SoC but also the external devices. To pick the right way to reset a machine each handler has a priority. The default priority is 100 and all currently existing restart handlers are registered with this priority. of_get_restart_priority() allows to retrieve the priority from the device tree which makes it possible for boards to give certain restart handlers a higher priority in order to use this one instead of the default one. Signed-off-by: Sascha Hauer <>
Diffstat (limited to 'arch/blackfin/lib')
2 files changed, 14 insertions, 4 deletions
diff --git a/arch/blackfin/lib/cpu.c b/arch/blackfin/lib/cpu.c
index 9d4c6e3e89..34b93e78ac 100644
--- a/arch/blackfin/lib/cpu.c
+++ b/arch/blackfin/lib/cpu.c
@@ -27,8 +27,9 @@
#include <asm/entry.h>
#include <asm/cpu.h>
#include <init.h>
+#include <restart.h>
-void __noreturn reset_cpu(unsigned long addr)
+static void __noreturn blackfin_restart_cpu(struct restart_handler *rst)
@@ -41,9 +42,17 @@ void __noreturn reset_cpu(unsigned long addr)
/* Not reached */
- while (1);
+ hang();
+static int restart_register_feature(void)
+ restart_handler_register_fn(blackfin_restart_cpu);
+ return 0;
void icache_disable(void)
#ifdef __ADSPBF537__
diff --git a/arch/blackfin/lib/traps.c b/arch/blackfin/lib/traps.c
index c2dda73465..2111d255fd 100644
--- a/arch/blackfin/lib/traps.c
+++ b/arch/blackfin/lib/traps.c
@@ -30,6 +30,7 @@
#include <common.h>
+#include <restart.h>
#include <linux/types.h>
#include <asm/system.h>
#include <asm/traps.h>
@@ -91,7 +92,7 @@ void trap_c (struct pt_regs *regs)
printf("\nPlease reset the board\n");
- reset_cpu(0);
+ restart_machine();
void blackfin_irq_panic(int reason, struct pt_regs *regs)
@@ -101,6 +102,6 @@ void blackfin_irq_panic(int reason, struct pt_regs *regs)
printf("Unhandled IRQ or exceptions!\n");
printf("Please reset the board \n");
- reset_cpu(0);
+ restart_machine();