diff options
Diffstat (limited to 'arch/arm/mach-imx/system.c')
-rw-r--r-- | arch/arm/mach-imx/system.c | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/arch/arm/mach-imx/system.c b/arch/arm/mach-imx/system.c index 695e0d73bf85..7cdc79a9657c 100644 --- a/arch/arm/mach-imx/system.c +++ b/arch/arm/mach-imx/system.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/err.h> | 22 | #include <linux/err.h> |
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/of.h> | ||
25 | #include <linux/of_address.h> | ||
24 | 26 | ||
25 | #include <asm/system_misc.h> | 27 | #include <asm/system_misc.h> |
26 | #include <asm/proc-fns.h> | 28 | #include <asm/proc-fns.h> |
@@ -30,6 +32,7 @@ | |||
30 | #include "hardware.h" | 32 | #include "hardware.h" |
31 | 33 | ||
32 | static void __iomem *wdog_base; | 34 | static void __iomem *wdog_base; |
35 | static struct clk *wdog_clk; | ||
33 | 36 | ||
34 | /* | 37 | /* |
35 | * Reset the system. It is called by machine_restart(). | 38 | * Reset the system. It is called by machine_restart(). |
@@ -38,16 +41,13 @@ void mxc_restart(char mode, const char *cmd) | |||
38 | { | 41 | { |
39 | unsigned int wcr_enable; | 42 | unsigned int wcr_enable; |
40 | 43 | ||
41 | if (cpu_is_mx1()) { | 44 | if (wdog_clk) |
42 | wcr_enable = (1 << 0); | 45 | clk_enable(wdog_clk); |
43 | } else { | ||
44 | struct clk *clk; | ||
45 | 46 | ||
46 | clk = clk_get_sys("imx2-wdt.0", NULL); | 47 | if (cpu_is_mx1()) |
47 | if (!IS_ERR(clk)) | 48 | wcr_enable = (1 << 0); |
48 | clk_prepare_enable(clk); | 49 | else |
49 | wcr_enable = (1 << 2); | 50 | wcr_enable = (1 << 2); |
50 | } | ||
51 | 51 | ||
52 | /* Assert SRS signal */ | 52 | /* Assert SRS signal */ |
53 | __raw_writew(wcr_enable, wdog_base); | 53 | __raw_writew(wcr_enable, wdog_base); |
@@ -55,7 +55,7 @@ void mxc_restart(char mode, const char *cmd) | |||
55 | /* wait for reset to assert... */ | 55 | /* wait for reset to assert... */ |
56 | mdelay(500); | 56 | mdelay(500); |
57 | 57 | ||
58 | printk(KERN_ERR "Watchdog reset failed to assert reset\n"); | 58 | pr_err("%s: Watchdog reset failed to assert reset\n", __func__); |
59 | 59 | ||
60 | /* delay to allow the serial port to show the message */ | 60 | /* delay to allow the serial port to show the message */ |
61 | mdelay(50); | 61 | mdelay(50); |
@@ -64,7 +64,34 @@ void mxc_restart(char mode, const char *cmd) | |||
64 | soft_restart(0); | 64 | soft_restart(0); |
65 | } | 65 | } |
66 | 66 | ||
67 | void mxc_arch_reset_init(void __iomem *base) | 67 | void __init mxc_arch_reset_init(void __iomem *base) |
68 | { | 68 | { |
69 | wdog_base = base; | 69 | wdog_base = base; |
70 | |||
71 | wdog_clk = clk_get_sys("imx2-wdt.0", NULL); | ||
72 | if (IS_ERR(wdog_clk)) { | ||
73 | pr_warn("%s: failed to get wdog clock\n", __func__); | ||
74 | wdog_clk = NULL; | ||
75 | return; | ||
76 | } | ||
77 | |||
78 | clk_prepare(wdog_clk); | ||
79 | } | ||
80 | |||
81 | void __init mxc_arch_reset_init_dt(void) | ||
82 | { | ||
83 | struct device_node *np; | ||
84 | |||
85 | np = of_find_compatible_node(NULL, NULL, "fsl,imx21-wdt"); | ||
86 | wdog_base = of_iomap(np, 0); | ||
87 | WARN_ON(!wdog_base); | ||
88 | |||
89 | wdog_clk = of_clk_get(np, 0); | ||
90 | if (IS_ERR(wdog_clk)) { | ||
91 | pr_warn("%s: failed to get wdog clock\n", __func__); | ||
92 | wdog_clk = NULL; | ||
93 | return; | ||
94 | } | ||
95 | |||
96 | clk_prepare(wdog_clk); | ||
70 | } | 97 | } |