diff options
Diffstat (limited to 'arch/arm/mach-mxs/system.c')
-rw-r--r-- | arch/arm/mach-mxs/system.c | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/arch/arm/mach-mxs/system.c b/arch/arm/mach-mxs/system.c index 30042e23bfa7..2d64ee9bbd3f 100644 --- a/arch/arm/mach-mxs/system.c +++ b/arch/arm/mach-mxs/system.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/of.h> | ||
27 | #include <linux/of_address.h> | ||
26 | 28 | ||
27 | #include <asm/proc-fns.h> | 29 | #include <asm/proc-fns.h> |
28 | #include <asm/system_misc.h> | 30 | #include <asm/system_misc.h> |
@@ -37,41 +39,37 @@ | |||
37 | #define MXS_MODULE_CLKGATE (1 << 30) | 39 | #define MXS_MODULE_CLKGATE (1 << 30) |
38 | #define MXS_MODULE_SFTRST (1 << 31) | 40 | #define MXS_MODULE_SFTRST (1 << 31) |
39 | 41 | ||
40 | static void __iomem *mxs_clkctrl_reset_addr; | ||
41 | |||
42 | /* | 42 | /* |
43 | * Reset the system. It is called by machine_restart(). | 43 | * Reset the system. It is called by machine_restart(). |
44 | */ | 44 | */ |
45 | void mxs_restart(char mode, const char *cmd) | 45 | void mxs_restart(char mode, const char *cmd) |
46 | { | 46 | { |
47 | struct device_node *np; | ||
48 | void __iomem *reset_addr; | ||
49 | |||
50 | np = of_find_compatible_node(NULL, NULL, "fsl,clkctrl"); | ||
51 | reset_addr = of_iomap(np, 0); | ||
52 | if (!reset_addr) | ||
53 | goto soft; | ||
54 | |||
55 | if (of_device_is_compatible(np, "fsl,imx23-clkctrl")) | ||
56 | reset_addr += MX23_CLKCTRL_RESET_OFFSET; | ||
57 | else | ||
58 | reset_addr += MX28_CLKCTRL_RESET_OFFSET; | ||
59 | |||
47 | /* reset the chip */ | 60 | /* reset the chip */ |
48 | __mxs_setl(MXS_CLKCTRL_RESET_CHIP, mxs_clkctrl_reset_addr); | 61 | __mxs_setl(MXS_CLKCTRL_RESET_CHIP, reset_addr); |
49 | 62 | ||
50 | pr_err("Failed to assert the chip reset\n"); | 63 | pr_err("Failed to assert the chip reset\n"); |
51 | 64 | ||
52 | /* Delay to allow the serial port to show the message */ | 65 | /* Delay to allow the serial port to show the message */ |
53 | mdelay(50); | 66 | mdelay(50); |
54 | 67 | ||
68 | soft: | ||
55 | /* We'll take a jump through zero as a poor second */ | 69 | /* We'll take a jump through zero as a poor second */ |
56 | soft_restart(0); | 70 | soft_restart(0); |
57 | } | 71 | } |
58 | 72 | ||
59 | static int __init mxs_arch_reset_init(void) | ||
60 | { | ||
61 | struct clk *clk; | ||
62 | |||
63 | mxs_clkctrl_reset_addr = MXS_IO_ADDRESS(MXS_CLKCTRL_BASE_ADDR) + | ||
64 | (cpu_is_mx23() ? MX23_CLKCTRL_RESET_OFFSET : | ||
65 | MX28_CLKCTRL_RESET_OFFSET); | ||
66 | |||
67 | clk = clk_get_sys("rtc", NULL); | ||
68 | if (!IS_ERR(clk)) | ||
69 | clk_prepare_enable(clk); | ||
70 | |||
71 | return 0; | ||
72 | } | ||
73 | core_initcall(mxs_arch_reset_init); | ||
74 | |||
75 | /* | 73 | /* |
76 | * Clear the bit and poll it cleared. This is usually called with | 74 | * Clear the bit and poll it cleared. This is usually called with |
77 | * a reset address and mask being either SFTRST(bit 31) or CLKGATE | 75 | * a reset address and mask being either SFTRST(bit 31) or CLKGATE |