[PATCH v3 2/7] ARM: exynos: Modify to use new common cpuidle code.
Barry Song
21cnbao at gmail.com
Sat Jan 28 23:47:27 EST 2012
2012/1/24 Robert Lee <rob.lee at linaro.org>:
> Make necessary changes for consolidation with new common cpuidle code.
>
> Signed-off-by: Robert Lee <rob.lee at linaro.org>
Reviewed-by: Barry Song <Baohua.Song at csr.com>
> ---
> arch/arm/mach-exynos/cpuidle.c | 73 +++------------------------------------
> 1 files changed, 6 insertions(+), 67 deletions(-)
>
> diff --git a/arch/arm/mach-exynos/cpuidle.c b/arch/arm/mach-exynos/cpuidle.c
> index 4ebb382..baa1178 100644
> --- a/arch/arm/mach-exynos/cpuidle.c
> +++ b/arch/arm/mach-exynos/cpuidle.c
> @@ -13,80 +13,19 @@
> #include <linux/cpuidle.h>
> #include <linux/io.h>
> #include <linux/export.h>
> -#include <linux/time.h>
> -
> #include <asm/proc-fns.h>
>
> -static int exynos4_enter_idle(struct cpuidle_device *dev,
> - struct cpuidle_driver *drv,
> - int index);
> -
> -static struct cpuidle_state exynos4_cpuidle_set[] = {
> - [0] = {
> - .enter = exynos4_enter_idle,
> - .exit_latency = 1,
> - .target_residency = 100000,
> - .flags = CPUIDLE_FLAG_TIME_VALID,
> - .name = "IDLE",
> - .desc = "ARM clock gating(WFI)",
> - },
> -};
> -
> -static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device);
> -
> -static struct cpuidle_driver exynos4_idle_driver = {
> +static struct cpuidle_driver exynos4_idle_driver __initdata = {
> .name = "exynos4_idle",
> .owner = THIS_MODULE,
> + .states[0] = CPUIDLE_ARM_WFI_STATE,
> + .state_count = 1,
> };
>
> -static int exynos4_enter_idle(struct cpuidle_device *dev,
> - struct cpuidle_driver *drv,
> - int index)
> -{
> - struct timeval before, after;
> - int idle_time;
> -
> - local_irq_disable();
> - do_gettimeofday(&before);
> -
> - cpu_do_idle();
> -
> - do_gettimeofday(&after);
> - local_irq_enable();
> - idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
> - (after.tv_usec - before.tv_usec);
> -
> - dev->last_residency = idle_time;
> - return index;
> -}
> -
> static int __init exynos4_init_cpuidle(void)
> {
> - int i, max_cpuidle_state, cpu_id;
> - struct cpuidle_device *device;
> - struct cpuidle_driver *drv = &exynos4_idle_driver;
> -
> - /* Setup cpuidle driver */
> - drv->state_count = (sizeof(exynos4_cpuidle_set) /
> - sizeof(struct cpuidle_state));
> - max_cpuidle_state = drv->state_count;
> - for (i = 0; i < max_cpuidle_state; i++) {
> - memcpy(&drv->states[i], &exynos4_cpuidle_set[i],
> - sizeof(struct cpuidle_state));
> - }
> - cpuidle_register_driver(&exynos4_idle_driver);
> -
> - for_each_cpu(cpu_id, cpu_online_mask) {
> - device = &per_cpu(exynos4_cpuidle_device, cpu_id);
> - device->cpu = cpu_id;
> -
> - device->state_count = drv->state_count;
> -
> - if (cpuidle_register_device(device)) {
> - printk(KERN_ERR "CPUidle register device failed\n,");
> - return -EIO;
> - }
> - }
> - return 0;
> + return common_cpuidle_init(&exynos4_idle_driver,
> + true,
> + NULL);
> }
> device_initcall(exynos4_init_cpuidle);
> --
> 1.7.1
More information about the linux-arm-kernel
mailing list