Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
arm
mach-at91
cpuidle.c
Go to the documentation of this file.
1
/*
2
* based on arch/arm/mach-kirkwood/cpuidle.c
3
*
4
* CPU idle support for AT91 SoC
5
*
6
* This file is licensed under the terms of the GNU General Public
7
* License version 2. This program is licensed "as is" without any
8
* warranty of any kind, whether express or implied.
9
*
10
* The cpu idle uses wait-for-interrupt and RAM self refresh in order
11
* to implement two idle states -
12
* #1 wait-for-interrupt
13
* #2 wait-for-interrupt and RAM self refresh
14
*/
15
16
#include <linux/kernel.h>
17
#include <
linux/init.h
>
18
#include <
linux/platform_device.h
>
19
#include <
linux/cpuidle.h
>
20
#include <
linux/io.h
>
21
#include <linux/export.h>
22
#include <asm/proc-fns.h>
23
#include <
asm/cpuidle.h
>
24
#include <mach/cpu.h>
25
26
#include "
pm.h
"
27
28
#define AT91_MAX_STATES 2
29
30
static
DEFINE_PER_CPU
(
struct
cpuidle_device
, at91_cpuidle_device);
31
32
/* Actual code that puts the SoC in different idle states */
33
static
int
at91_enter_idle(
struct
cpuidle_device
*
dev
,
34
struct
cpuidle_driver
*drv,
35
int
index
)
36
{
37
if
(
cpu_is_at91rm9200
())
38
at91rm9200_standby();
39
else
if
(
cpu_is_at91sam9g45
())
40
at91sam9g45_standby();
41
else
42
at91sam9_standby();
43
44
return
index
;
45
}
46
47
static
struct
cpuidle_driver
at91_idle_driver = {
48
.name =
"at91_idle"
,
49
.owner =
THIS_MODULE
,
50
.en_core_tk_irqen = 1,
51
.states[0] =
ARM_CPUIDLE_WFI_STATE
,
52
.states[1] = {
53
.enter = at91_enter_idle,
54
.exit_latency = 10,
55
.target_residency = 100000,
56
.flags =
CPUIDLE_FLAG_TIME_VALID
,
57
.name =
"RAM_SR"
,
58
.desc =
"WFI and DDR Self Refresh"
,
59
},
60
.state_count =
AT91_MAX_STATES
,
61
};
62
63
/* Initialize CPU idle by registering the idle states */
64
static
int
at91_init_cpuidle(
void
)
65
{
66
struct
cpuidle_device
*
device
;
67
68
device = &
per_cpu
(at91_cpuidle_device,
smp_processor_id
());
69
device->
state_count
=
AT91_MAX_STATES
;
70
71
cpuidle_register_driver
(&at91_idle_driver);
72
73
if
(
cpuidle_register_device
(device)) {
74
printk
(
KERN_ERR
"at91_init_cpuidle: Failed registering\n"
);
75
return
-
EIO
;
76
}
77
return
0;
78
}
79
80
device_initcall
(at91_init_cpuidle);
Generated on Thu Jan 10 2013 12:55:33 for Linux Kernel by
1.8.2