diff options
author | Olof Johansson <olof@lixom.net> | 2014-07-19 18:03:08 -0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2014-07-19 18:03:08 -0400 |
commit | f37ac9e5a47d72eab5185b0ddc14dfc943cc9589 (patch) | |
tree | 53577aa529e3bbe718459d0626fc6d45ada3dcdd /arch/arm/mach-sunxi | |
parent | 4338925434e4bf5ff714055713f3fb9b5fae9037 (diff) | |
parent | fc2cac41ebbfb16da8b036cba6ec6714ab780a6d (diff) |
Merge tag 'exynos-cpuidle' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into next/soc
Merge "Samsung exynos cpuidle update for v3.17" from Kukjin Kim:
- add callbacks exynos_suspend() and exynos_powered_up()
for support cpuidle through mcpm
- skip exynos_cpuidle for exynos5420 because is uses
cpuidle-big-liggle generic cpuidle driver
- add generic functions to calculate cpu number is used
for pmu and this is required for exynos5420 multi-cluster
- add of_device_id structure for big.LITTLE cpuidle and
add "samsung,exynos5420" compatible string for exynos5420
* tag 'exynos-cpuidle' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung:
ARM: EXYNOS: populate suspend and powered_up callbacks for mcpm
ARM: EXYNOS: do not allow cpuidle registration for exynos5420
cpuidle: big.LITTLE: init driver for exynos5420
cpuidle: big.LITTLE: Add ARCH_EXYNOS entry in config
ARM: EXYNOS: add generic function to calculate cpu number
cpuidle: big.LITTLE: add of_device_id structure
+ Linux 3.16-rc5
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'arch/arm/mach-sunxi')
-rw-r--r-- | arch/arm/mach-sunxi/sunxi.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c index 4d09469320c8..42d4753683ce 100644 --- a/arch/arm/mach-sunxi/sunxi.c +++ b/arch/arm/mach-sunxi/sunxi.c | |||
@@ -12,8 +12,81 @@ | |||
12 | 12 | ||
13 | #include <linux/clk-provider.h> | 13 | #include <linux/clk-provider.h> |
14 | #include <linux/clocksource.h> | 14 | #include <linux/clocksource.h> |
15 | #include <linux/delay.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/of_address.h> | ||
19 | #include <linux/of_irq.h> | ||
20 | #include <linux/of_platform.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/reboot.h> | ||
15 | 23 | ||
16 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
25 | #include <asm/mach/map.h> | ||
26 | #include <asm/system_misc.h> | ||
27 | |||
28 | #define SUN4I_WATCHDOG_CTRL_REG 0x00 | ||
29 | #define SUN4I_WATCHDOG_CTRL_RESTART BIT(0) | ||
30 | #define SUN4I_WATCHDOG_MODE_REG 0x04 | ||
31 | #define SUN4I_WATCHDOG_MODE_ENABLE BIT(0) | ||
32 | #define SUN4I_WATCHDOG_MODE_RESET_ENABLE BIT(1) | ||
33 | |||
34 | #define SUN6I_WATCHDOG1_IRQ_REG 0x00 | ||
35 | #define SUN6I_WATCHDOG1_CTRL_REG 0x10 | ||
36 | #define SUN6I_WATCHDOG1_CTRL_RESTART BIT(0) | ||
37 | #define SUN6I_WATCHDOG1_CONFIG_REG 0x14 | ||
38 | #define SUN6I_WATCHDOG1_CONFIG_RESTART BIT(0) | ||
39 | #define SUN6I_WATCHDOG1_CONFIG_IRQ BIT(1) | ||
40 | #define SUN6I_WATCHDOG1_MODE_REG 0x18 | ||
41 | #define SUN6I_WATCHDOG1_MODE_ENABLE BIT(0) | ||
42 | |||
43 | static void __iomem *wdt_base; | ||
44 | |||
45 | static void sun4i_restart(enum reboot_mode mode, const char *cmd) | ||
46 | { | ||
47 | if (!wdt_base) | ||
48 | return; | ||
49 | |||
50 | /* Enable timer and set reset bit in the watchdog */ | ||
51 | writel(SUN4I_WATCHDOG_MODE_ENABLE | SUN4I_WATCHDOG_MODE_RESET_ENABLE, | ||
52 | wdt_base + SUN4I_WATCHDOG_MODE_REG); | ||
53 | |||
54 | /* | ||
55 | * Restart the watchdog. The default (and lowest) interval | ||
56 | * value for the watchdog is 0.5s. | ||
57 | */ | ||
58 | writel(SUN4I_WATCHDOG_CTRL_RESTART, wdt_base + SUN4I_WATCHDOG_CTRL_REG); | ||
59 | |||
60 | while (1) { | ||
61 | mdelay(5); | ||
62 | writel(SUN4I_WATCHDOG_MODE_ENABLE | SUN4I_WATCHDOG_MODE_RESET_ENABLE, | ||
63 | wdt_base + SUN4I_WATCHDOG_MODE_REG); | ||
64 | } | ||
65 | } | ||
66 | |||
67 | static struct of_device_id sunxi_restart_ids[] = { | ||
68 | { .compatible = "allwinner,sun4i-a10-wdt" }, | ||
69 | { /*sentinel*/ } | ||
70 | }; | ||
71 | |||
72 | static void sunxi_setup_restart(void) | ||
73 | { | ||
74 | struct device_node *np; | ||
75 | |||
76 | np = of_find_matching_node(NULL, sunxi_restart_ids); | ||
77 | if (WARN(!np, "unable to setup watchdog restart")) | ||
78 | return; | ||
79 | |||
80 | wdt_base = of_iomap(np, 0); | ||
81 | WARN(!wdt_base, "failed to map watchdog base address"); | ||
82 | } | ||
83 | |||
84 | static void __init sunxi_dt_init(void) | ||
85 | { | ||
86 | sunxi_setup_restart(); | ||
87 | |||
88 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | ||
89 | } | ||
17 | 90 | ||
18 | static const char * const sunxi_board_dt_compat[] = { | 91 | static const char * const sunxi_board_dt_compat[] = { |
19 | "allwinner,sun4i-a10", | 92 | "allwinner,sun4i-a10", |
@@ -23,7 +96,9 @@ static const char * const sunxi_board_dt_compat[] = { | |||
23 | }; | 96 | }; |
24 | 97 | ||
25 | DT_MACHINE_START(SUNXI_DT, "Allwinner A1X (Device Tree)") | 98 | DT_MACHINE_START(SUNXI_DT, "Allwinner A1X (Device Tree)") |
99 | .init_machine = sunxi_dt_init, | ||
26 | .dt_compat = sunxi_board_dt_compat, | 100 | .dt_compat = sunxi_board_dt_compat, |
101 | .restart = sun4i_restart, | ||
27 | MACHINE_END | 102 | MACHINE_END |
28 | 103 | ||
29 | static const char * const sun6i_board_dt_compat[] = { | 104 | static const char * const sun6i_board_dt_compat[] = { |
@@ -51,7 +126,9 @@ static const char * const sun7i_board_dt_compat[] = { | |||
51 | }; | 126 | }; |
52 | 127 | ||
53 | DT_MACHINE_START(SUN7I_DT, "Allwinner sun7i (A20) Family") | 128 | DT_MACHINE_START(SUN7I_DT, "Allwinner sun7i (A20) Family") |
129 | .init_machine = sunxi_dt_init, | ||
54 | .dt_compat = sun7i_board_dt_compat, | 130 | .dt_compat = sun7i_board_dt_compat, |
131 | .restart = sun4i_restart, | ||
55 | MACHINE_END | 132 | MACHINE_END |
56 | 133 | ||
57 | static const char * const sun8i_board_dt_compat[] = { | 134 | static const char * const sun8i_board_dt_compat[] = { |