1 | /* |
---|---|
2 | * i.MX27 Power Management Routines |
3 | * |
4 | * Based on Freescale's BSP |
5 | * |
6 | * This program is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU General Public License. |
8 | */ |
9 | |
10 | #include <linux/of_address.h> |
11 | #include <linux/kernel.h> |
12 | #include <linux/suspend.h> |
13 | #include <linux/io.h> |
14 | |
15 | #include "common.h" |
16 | #include "hardware.h" |
17 | |
18 | static int mx27_suspend_enter(suspend_state_t state) |
19 | { |
20 | void __iomem *ccm_base; |
21 | struct device_node *np; |
22 | u32 cscr; |
23 | |
24 | np = of_find_compatible_node(NULL, NULL, compat: "fsl,imx27-ccm"); |
25 | ccm_base = of_iomap(node: np, index: 0); |
26 | BUG_ON(!ccm_base); |
27 | |
28 | switch (state) { |
29 | case PM_SUSPEND_MEM: |
30 | /* Clear MPEN and SPEN to disable MPLL/SPLL */ |
31 | cscr = imx_readl(ccm_base); |
32 | cscr &= 0xFFFFFFFC; |
33 | imx_writel(cscr, ccm_base); |
34 | /* Executes WFI */ |
35 | cpu_do_idle(); |
36 | break; |
37 | |
38 | default: |
39 | return -EINVAL; |
40 | } |
41 | return 0; |
42 | } |
43 | |
44 | static const struct platform_suspend_ops mx27_suspend_ops = { |
45 | .enter = mx27_suspend_enter, |
46 | .valid = suspend_valid_only_mem, |
47 | }; |
48 | |
49 | void __init imx27_pm_init(void) |
50 | { |
51 | suspend_set_ops(ops: &mx27_suspend_ops); |
52 | } |
53 |