1 /* linux/arch/arm/mach-exynos4/cpuidle.c
3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/cpuidle.h>
16 #include <asm/proc-fns.h>
18 static int exynos4_enter_idle(struct cpuidle_device
*dev
,
19 struct cpuidle_state
*state
);
21 static struct cpuidle_state exynos4_cpuidle_set
[] = {
23 .enter
= exynos4_enter_idle
,
25 .target_residency
= 100000,
26 .flags
= CPUIDLE_FLAG_TIME_VALID
,
28 .desc
= "ARM clock gating(WFI)",
32 static DEFINE_PER_CPU(struct cpuidle_device
, exynos4_cpuidle_device
);
34 static struct cpuidle_driver exynos4_idle_driver
= {
35 .name
= "exynos4_idle",
39 static int exynos4_enter_idle(struct cpuidle_device
*dev
,
40 struct cpuidle_state
*state
)
42 struct timeval before
, after
;
46 do_gettimeofday(&before
);
50 do_gettimeofday(&after
);
52 idle_time
= (after
.tv_sec
- before
.tv_sec
) * USEC_PER_SEC
+
53 (after
.tv_usec
- before
.tv_usec
);
58 static int __init
exynos4_init_cpuidle(void)
60 int i
, max_cpuidle_state
, cpu_id
;
61 struct cpuidle_device
*device
;
63 cpuidle_register_driver(&exynos4_idle_driver
);
65 for_each_cpu(cpu_id
, cpu_online_mask
) {
66 device
= &per_cpu(exynos4_cpuidle_device
, cpu_id
);
69 device
->state_count
= (sizeof(exynos4_cpuidle_set
) /
70 sizeof(struct cpuidle_state
));
72 max_cpuidle_state
= device
->state_count
;
74 for (i
= 0; i
< max_cpuidle_state
; i
++) {
75 memcpy(&device
->states
[i
], &exynos4_cpuidle_set
[i
],
76 sizeof(struct cpuidle_state
));
79 if (cpuidle_register_device(device
)) {
80 printk(KERN_ERR
"CPUidle register device failed\n,");
86 device_initcall(exynos4_init_cpuidle
);