diff options
| author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2013-08-27 16:15:02 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-09-02 08:49:29 -0400 |
| commit | 6a7d2c625656df5f8ad6e33aa3d164eefb1df8dc (patch) | |
| tree | d3d43dccef6c32bd8fbbb70963d222f22f623760 | |
| parent | 84b6504f560157ff2077dd3757eee481b81dc39b (diff) | |
ARM: 7828/1: ARMv7-M: implement restart routine common to all v7-M machines
The newly introduced function is to be used as .restart callback for
ARMv7-M machines. The used register is architecturally defined, so it
should work for all M-class machines.
Acked-by: Jonathan Austin <jonathan.austin@arm.com>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/include/asm/v7m.h | 12 | ||||
| -rw-r--r-- | arch/arm/kernel/Makefile | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/v7m.c | 19 |
3 files changed, 32 insertions, 1 deletions
diff --git a/arch/arm/include/asm/v7m.h b/arch/arm/include/asm/v7m.h index fa88d09fa3d9..615781c61627 100644 --- a/arch/arm/include/asm/v7m.h +++ b/arch/arm/include/asm/v7m.h | |||
| @@ -15,6 +15,10 @@ | |||
| 15 | 15 | ||
| 16 | #define V7M_SCB_VTOR 0x08 | 16 | #define V7M_SCB_VTOR 0x08 |
| 17 | 17 | ||
| 18 | #define V7M_SCB_AIRCR 0x0c | ||
| 19 | #define V7M_SCB_AIRCR_VECTKEY (0x05fa << 16) | ||
| 20 | #define V7M_SCB_AIRCR_SYSRESETREQ (1 << 2) | ||
| 21 | |||
| 18 | #define V7M_SCB_SCR 0x10 | 22 | #define V7M_SCB_SCR 0x10 |
| 19 | #define V7M_SCB_SCR_SLEEPDEEP (1 << 2) | 23 | #define V7M_SCB_SCR_SLEEPDEEP (1 << 2) |
| 20 | 24 | ||
| @@ -42,3 +46,11 @@ | |||
| 42 | */ | 46 | */ |
| 43 | #define EXC_RET_STACK_MASK 0x00000004 | 47 | #define EXC_RET_STACK_MASK 0x00000004 |
| 44 | #define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd | 48 | #define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd |
| 49 | |||
| 50 | #ifndef __ASSEMBLY__ | ||
| 51 | |||
| 52 | enum reboot_mode; | ||
| 53 | |||
| 54 | void armv7m_restart(enum reboot_mode mode, const char *cmd); | ||
| 55 | |||
| 56 | #endif /* __ASSEMBLY__ */ | ||
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 86d10dd47dc4..5140df5f23aa 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
| @@ -24,7 +24,7 @@ obj-$(CONFIG_ATAGS_PROC) += atags_proc.o | |||
| 24 | obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o | 24 | obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o |
| 25 | 25 | ||
| 26 | ifeq ($(CONFIG_CPU_V7M),y) | 26 | ifeq ($(CONFIG_CPU_V7M),y) |
| 27 | obj-y += entry-v7m.o | 27 | obj-y += entry-v7m.o v7m.o |
| 28 | else | 28 | else |
| 29 | obj-y += entry-armv.o | 29 | obj-y += entry-armv.o |
| 30 | endif | 30 | endif |
diff --git a/arch/arm/kernel/v7m.c b/arch/arm/kernel/v7m.c new file mode 100644 index 000000000000..4d2cba94f5cc --- /dev/null +++ b/arch/arm/kernel/v7m.c | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013 Uwe Kleine-Koenig for Pengutronix | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify it under | ||
| 5 | * the terms of the GNU General Public License version 2 as published by the | ||
| 6 | * Free Software Foundation. | ||
| 7 | */ | ||
| 8 | #include <linux/io.h> | ||
| 9 | #include <linux/reboot.h> | ||
| 10 | #include <asm/barrier.h> | ||
| 11 | #include <asm/v7m.h> | ||
| 12 | |||
| 13 | void armv7m_restart(enum reboot_mode mode, const char *cmd) | ||
| 14 | { | ||
| 15 | dsb(); | ||
| 16 | __raw_writel(V7M_SCB_AIRCR_VECTKEY | V7M_SCB_AIRCR_SYSRESETREQ, | ||
| 17 | BASEADDR_V7M_SCB + V7M_SCB_AIRCR); | ||
| 18 | dsb(); | ||
| 19 | } | ||
