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>
15 #include <linux/export.h>
16 #include <linux/time.h>
18 #include <asm/proc-fns.h>
20 static int exynos4_enter_idle(struct cpuidle_device
*dev
,
21 struct cpuidle_driver
*drv
,
24 static struct cpuidle_state exynos4_cpuidle_set
[] = {
26 .enter
= exynos4_enter_idle
,
28 .target_residency
= 100000,
29 .flags
= CPUIDLE_FLAG_TIME_VALID
,
31 .desc
= "ARM clock gating(WFI)",
35 static DEFINE_PER_CPU(struct cpuidle_device
, exynos4_cpuidle_device
);
37 static struct cpuidle_driver exynos4_idle_driver
= {
38 .name
= "exynos4_idle",
42 static int exynos4_enter_idle(struct cpuidle_device
*dev
,
43 struct cpuidle_driver
*drv
,
46 struct timeval before
, after
;
50 do_gettimeofday(&before
);
54 do_gettimeofday(&after
);
56 idle_time
= (after
.tv_sec
- before
.tv_sec
) * USEC_PER_SEC
+
57 (after
.tv_usec
- before
.tv_usec
);
59 dev
->last_residency
= idle_time
;
63 static int __init
exynos4_init_cpuidle(void)
65 int i
, max_cpuidle_state
, cpu_id
;
66 struct cpuidle_device
*device
;
67 struct cpuidle_driver
*drv
= &exynos4_idle_driver
;
69 /* Setup cpuidle driver */
70 drv
->state_count
= (sizeof(exynos4_cpuidle_set
) /
71 sizeof(struct cpuidle_state
));
72 max_cpuidle_state
= drv
->state_count
;
73 for (i
= 0; i
< max_cpuidle_state
; i
++) {
74 memcpy(&drv
->states
[i
], &exynos4_cpuidle_set
[i
],
75 sizeof(struct cpuidle_state
));
77 cpuidle_register_driver(&exynos4_idle_driver
);
79 for_each_cpu(cpu_id
, cpu_online_mask
) {
80 device
= &per_cpu(exynos4_cpuidle_device
, cpu_id
);
83 device
->state_count
= drv
->state_count
;
85 if (cpuidle_register_device(device
)) {
86 printk(KERN_ERR
"CPUidle register device failed\n,");
92 device_initcall(exynos4_init_cpuidle
);