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