aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-imx/system.c
diff options
context:
space:
mode:
authorShawn Guo <shawn.guo@linaro.org>2013-05-09 21:13:44 -0400
committerShawn Guo <shawn.guo@linaro.org>2013-06-17 03:45:10 -0400
commit18cb680f1a003a1a1ec0e6097d7b763516a27f04 (patch)
treef9ef6d5b1fe540a4bb070fcbd1a222c11458afb1 /arch/arm/mach-imx/system.c
parent24a83fe4b039ef3779efd6b1fc88ee020e8af52f (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.c27
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
32static void __iomem *wdog_base; 32static void __iomem *wdog_base;
33static 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
67void mxc_arch_reset_init(void __iomem *base) 65void __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}