diff options
author | Shawn Guo <shawn.guo@linaro.org> | 2013-05-09 21:13:44 -0400 |
---|---|---|
committer | Shawn Guo <shawn.guo@linaro.org> | 2013-06-17 03:45:10 -0400 |
commit | 18cb680f1a003a1a1ec0e6097d7b763516a27f04 (patch) | |
tree | f9ef6d5b1fe540a4bb070fcbd1a222c11458afb1 /arch/arm/mach-imx/system.c | |
parent | 24a83fe4b039ef3779efd6b1fc88ee020e8af52f (diff) |
ARM: imx: move clk_prepare() out from mxc_restart()
It's inappropriate to call clk_prepare() in mxc_restart(), because the
restart routine could be called in atomic context. Move clk_get() and
clk_prepare() into mxc_arch_reset_init() and only have the atomic part
clk_enable() be called in mxc_restart().
As a result, mxc_arch_reset_init() needs to be called after clk gets
initialized.
While there, it also changes printk(KERN_ERR ...) to pr_err() and adds
__init annotation for mxc_arch_reset_init().
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Diffstat (limited to 'arch/arm/mach-imx/system.c')
-rw-r--r-- | arch/arm/mach-imx/system.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/arch/arm/mach-imx/system.c b/arch/arm/mach-imx/system.c index 695e0d73bf85..02cf449094f1 100644 --- a/arch/arm/mach-imx/system.c +++ b/arch/arm/mach-imx/system.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include "hardware.h" | 30 | #include "hardware.h" |
31 | 31 | ||
32 | static void __iomem *wdog_base; | 32 | static void __iomem *wdog_base; |
33 | static struct clk *wdog_clk; | ||
33 | 34 | ||
34 | /* | 35 | /* |
35 | * Reset the system. It is called by machine_restart(). | 36 | * Reset the system. It is called by machine_restart(). |
@@ -38,16 +39,13 @@ void mxc_restart(char mode, const char *cmd) | |||
38 | { | 39 | { |
39 | unsigned int wcr_enable; | 40 | unsigned int wcr_enable; |
40 | 41 | ||
41 | if (cpu_is_mx1()) { | 42 | if (wdog_clk) |
42 | wcr_enable = (1 << 0); | 43 | clk_enable(wdog_clk); |
43 | } else { | ||
44 | struct clk *clk; | ||
45 | 44 | ||
46 | clk = clk_get_sys("imx2-wdt.0", NULL); | 45 | if (cpu_is_mx1()) |
47 | if (!IS_ERR(clk)) | 46 | wcr_enable = (1 << 0); |
48 | clk_prepare_enable(clk); | 47 | else |
49 | wcr_enable = (1 << 2); | 48 | wcr_enable = (1 << 2); |
50 | } | ||
51 | 49 | ||
52 | /* Assert SRS signal */ | 50 | /* Assert SRS signal */ |
53 | __raw_writew(wcr_enable, wdog_base); | 51 | __raw_writew(wcr_enable, wdog_base); |
@@ -55,7 +53,7 @@ void mxc_restart(char mode, const char *cmd) | |||
55 | /* wait for reset to assert... */ | 53 | /* wait for reset to assert... */ |
56 | mdelay(500); | 54 | mdelay(500); |
57 | 55 | ||
58 | printk(KERN_ERR "Watchdog reset failed to assert reset\n"); | 56 | pr_err("%s: Watchdog reset failed to assert reset\n", __func__); |
59 | 57 | ||
60 | /* delay to allow the serial port to show the message */ | 58 | /* delay to allow the serial port to show the message */ |
61 | mdelay(50); | 59 | mdelay(50); |
@@ -64,7 +62,16 @@ void mxc_restart(char mode, const char *cmd) | |||
64 | soft_restart(0); | 62 | soft_restart(0); |
65 | } | 63 | } |
66 | 64 | ||
67 | void mxc_arch_reset_init(void __iomem *base) | 65 | void __init mxc_arch_reset_init(void __iomem *base) |
68 | { | 66 | { |
69 | wdog_base = base; | 67 | wdog_base = base; |
68 | |||
69 | wdog_clk = clk_get_sys("imx2-wdt.0", NULL); | ||
70 | if (IS_ERR(wdog_clk)) { | ||
71 | pr_warn("%s: failed to get wdog clock\n", __func__); | ||
72 | wdog_clk = NULL; | ||
73 | return; | ||
74 | } | ||
75 | |||
76 | clk_prepare(wdog_clk); | ||
70 | } | 77 | } |