From 1d8c56e3677055e430998c219898b1ac770dbaa8 Mon Sep 17 00:00:00 2001 From: Robert Lee Date: Tue, 18 Oct 2011 22:33:13 -0500 Subject: ARM: imx: Add cpuidle for mach-mx5 Add functionality for initialization and handling of a cpuidle driver requests entering a cpu idle state. Signed-off-by: Robert Lee --- arch/arm/mach-mx5/cpuidle.c | 82 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 arch/arm/mach-mx5/cpuidle.c (limited to 'arch/arm/mach-mx5/cpuidle.c') diff --git a/arch/arm/mach-mx5/cpuidle.c b/arch/arm/mach-mx5/cpuidle.c new file mode 100644 index 00000000000..fa3ea6a66f8 --- /dev/null +++ b/arch/arm/mach-mx5/cpuidle.c @@ -0,0 +1,82 @@ +/* + * Copyright 2011 Freescale Semiconductor, Inc. + * Copyright 2011 Linaro Ltd. + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int mx5_cpuidle_init(void *init_data); +static int mx5_cpuidle(struct cpuidle_device *dev, struct cpuidle_state *state); + +static struct imx_cpuidle_state_data mx5_cpuidle_state_data[] __initdata = { + { + .name = "powered_noclock", + .desc = "idle cpu powered, unclocked.", + .exit_latency = 12, + .mach_cpu_pwr_state = WAIT_UNCLOCKED, + }, { + .name = "nopower_noclock", + .desc = "idle cpu unpowered, unclocked.", + .exit_latency = 20, + .mach_cpu_pwr_state = WAIT_UNCLOCKED_POWER_OFF, + } +}; + +static struct cpuidle_driver mx5_cpuidle_driver = { + .name = "imx5_cpuidle", + .owner = THIS_MODULE, +}; + +struct imx_cpuidle_data mx5_cpuidle_data __initdata = { + .imx_cpuidle_driver = &mx5_cpuidle_driver, + .state_data = mx5_cpuidle_state_data, + .mach_cpuidle = mx5_cpuidle, + .mach_cpuidle_init = mx5_cpuidle_init, + .num_states = ARRAY_SIZE(mx5_cpuidle_state_data), +}; + +int mx5_cpuidle(struct cpuidle_device *dev, struct cpuidle_state *state) +{ + mx5_cpu_lp_set((enum mxc_cpu_pwr_mode)state->driver_data); + + cpu_do_idle(); + + return 0; +} + +int __init mx5_cpuidle_init(void * init_data) +{ + int ret; + struct clk *gpc_dvfs_clk; + + gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); + + if (IS_ERR(gpc_dvfs_clk)) { + pr_err("%s: Failed to get gpc_dvfs clock\n", __func__); + return (int)gpc_dvfs_clk; + } + + ret = clk_enable(gpc_dvfs_clk); + + if (IS_ERR(&ret)) { + pr_err("%s: Failed to enable gpc_dvfs clock\n", __func__); + return ret; + } + + return 0; +} -- cgit v1.2.3