xref: /linux/arch/arm/mach-imx/pm-imx27.c (revision 4413e16d9d21673bb5048a2e542f1aaa00015c2e)
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/kernel.h>
11 #include <linux/suspend.h>
12 #include <linux/io.h>
13 #include <mach/hardware.h>
14 
15 static int mx27_suspend_enter(suspend_state_t state)
16 {
17 	u32 cscr;
18 	switch (state) {
19 	case PM_SUSPEND_MEM:
20 		/* Clear MPEN and SPEN to disable MPLL/SPLL */
21 		cscr = __raw_readl(MX27_IO_ADDRESS(MX27_CCM_BASE_ADDR));
22 		cscr &= 0xFFFFFFFC;
23 		__raw_writel(cscr, MX27_IO_ADDRESS(MX27_CCM_BASE_ADDR));
24 		/* Executes WFI */
25 		cpu_do_idle();
26 		break;
27 
28 	default:
29 		return -EINVAL;
30 	}
31 	return 0;
32 }
33 
34 static const struct platform_suspend_ops mx27_suspend_ops = {
35 	.enter = mx27_suspend_enter,
36 	.valid = suspend_valid_only_mem,
37 };
38 
39 static int __init mx27_pm_init(void)
40 {
41 	if (!cpu_is_mx27())
42 		return 0;
43 
44 	suspend_set_ops(&mx27_suspend_ops);
45 	return 0;
46 }
47 
48 device_initcall(mx27_pm_init);
49