diff options
Diffstat (limited to 'arch/arm/mach-keystone/keystone.c')
-rw-r--r-- | arch/arm/mach-keystone/keystone.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/arch/arm/mach-keystone/keystone.c b/arch/arm/mach-keystone/keystone.c new file mode 100644 index 000000000000..fe4d9ff93a7e --- /dev/null +++ b/arch/arm/mach-keystone/keystone.c | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | * Keystone2 based boards and SOC related code. | ||
3 | * | ||
4 | * Copyright 2013 Texas Instruments, Inc. | ||
5 | * Cyril Chemparathy <cyril@ti.com> | ||
6 | * Santosh Shilimkar <santosh.shillimkar@ti.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms and conditions of the GNU General Public License, | ||
10 | * version 2, as published by the Free Software Foundation. | ||
11 | */ | ||
12 | #include <linux/io.h> | ||
13 | #include <linux/of.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/of_platform.h> | ||
16 | #include <linux/of_address.h> | ||
17 | |||
18 | #include <asm/setup.h> | ||
19 | #include <asm/mach/map.h> | ||
20 | #include <asm/mach/arch.h> | ||
21 | #include <asm/mach/time.h> | ||
22 | #include <asm/smp_plat.h> | ||
23 | |||
24 | #include "keystone.h" | ||
25 | |||
26 | #define PLL_RESET_WRITE_KEY_MASK 0xffff0000 | ||
27 | #define PLL_RESET_WRITE_KEY 0x5a69 | ||
28 | #define PLL_RESET BIT(16) | ||
29 | |||
30 | static void __iomem *keystone_rstctrl; | ||
31 | |||
32 | static void __init keystone_init(void) | ||
33 | { | ||
34 | struct device_node *node; | ||
35 | |||
36 | node = of_find_compatible_node(NULL, NULL, "ti,keystone-reset"); | ||
37 | if (WARN_ON(!node)) | ||
38 | pr_warn("ti,keystone-reset node undefined\n"); | ||
39 | |||
40 | keystone_rstctrl = of_iomap(node, 0); | ||
41 | if (WARN_ON(!keystone_rstctrl)) | ||
42 | pr_warn("ti,keystone-reset iomap error\n"); | ||
43 | |||
44 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | ||
45 | } | ||
46 | |||
47 | static const char *keystone_match[] __initconst = { | ||
48 | "ti,keystone-evm", | ||
49 | NULL, | ||
50 | }; | ||
51 | |||
52 | void keystone_restart(char mode, const char *cmd) | ||
53 | { | ||
54 | u32 val; | ||
55 | |||
56 | BUG_ON(!keystone_rstctrl); | ||
57 | |||
58 | /* Enable write access to RSTCTRL */ | ||
59 | val = readl(keystone_rstctrl); | ||
60 | val &= PLL_RESET_WRITE_KEY_MASK; | ||
61 | val |= PLL_RESET_WRITE_KEY; | ||
62 | writel(val, keystone_rstctrl); | ||
63 | |||
64 | /* Reset the SOC */ | ||
65 | val = readl(keystone_rstctrl); | ||
66 | val &= ~PLL_RESET; | ||
67 | writel(val, keystone_rstctrl); | ||
68 | } | ||
69 | |||
70 | DT_MACHINE_START(KEYSTONE, "Keystone") | ||
71 | .smp = smp_ops(keystone_smp_ops), | ||
72 | .init_machine = keystone_init, | ||
73 | .dt_compat = keystone_match, | ||
74 | .restart = keystone_restart, | ||
75 | MACHINE_END | ||