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
sh
kernel
cpu
shmobile
cpuidle.c
Go to the documentation of this file.
1
/*
2
* arch/sh/kernel/cpu/shmobile/cpuidle.c
3
*
4
* Cpuidle support code for SuperH Mobile
5
*
6
* Copyright (C) 2009 Magnus Damm
7
*
8
* This file is subject to the terms and conditions of the GNU General Public
9
* License. See the file "COPYING" in the main directory of this archive
10
* for more details.
11
*/
12
#include <
linux/init.h
>
13
#include <linux/kernel.h>
14
#include <
linux/io.h
>
15
#include <
linux/suspend.h
>
16
#include <
linux/cpuidle.h
>
17
#include <linux/export.h>
18
#include <asm/suspend.h>
19
#include <asm/uaccess.h>
20
21
static
unsigned
long
cpuidle_mode[] = {
22
SUSP_SH_SLEEP
,
/* regular sleep mode */
23
SUSP_SH_SLEEP
|
SUSP_SH_SF
,
/* sleep mode + self refresh */
24
SUSP_SH_STANDBY
|
SUSP_SH_SF
,
/* software standby mode + self refresh */
25
};
26
27
static
int
cpuidle_sleep_enter(
struct
cpuidle_device
*
dev
,
28
struct
cpuidle_driver
*drv,
29
int
index
)
30
{
31
unsigned
long
allowed_mode =
SUSP_SH_SLEEP
;
32
int
requested_state =
index
;
33
int
allowed_state;
34
int
k
;
35
36
/* convert allowed mode to allowed state */
37
for
(k =
ARRAY_SIZE
(cpuidle_mode) - 1; k > 0; k--)
38
if
(cpuidle_mode[k] == allowed_mode)
39
break
;
40
41
allowed_state =
k
;
42
43
/* take the following into account for sleep mode selection:
44
* - allowed_state: best mode allowed by hardware (clock deps)
45
* - requested_state: best mode allowed by software (latencies)
46
*/
47
k =
min_t
(
int
, allowed_state, requested_state);
48
49
sh_mobile_call_standby
(cpuidle_mode[k]);
50
51
return
k
;
52
}
53
54
static
struct
cpuidle_device
cpuidle_dev;
55
static
struct
cpuidle_driver
cpuidle_driver
= {
56
.
name
=
"sh_idle"
,
57
.owner =
THIS_MODULE
,
58
.en_core_tk_irqen = 1,
59
};
60
61
void
sh_mobile_setup_cpuidle
(
void
)
62
{
63
struct
cpuidle_device
*dev = &cpuidle_dev;
64
struct
cpuidle_driver *drv = &cpuidle_driver;
65
struct
cpuidle_state
*
state
;
66
int
i
;
67
68
69
for
(i = 0; i <
CPUIDLE_STATE_MAX
; i++) {
70
drv->
states
[
i
].name[0] =
'\0'
;
71
drv->
states
[
i
].desc[0] =
'\0'
;
72
}
73
74
i =
CPUIDLE_DRIVER_STATE_START
;
75
76
state = &drv->
states
[i++];
77
snprintf
(state->
name
,
CPUIDLE_NAME_LEN
,
"C1"
);
78
strncpy
(state->
desc
,
"SuperH Sleep Mode"
,
CPUIDLE_DESC_LEN
);
79
state->
exit_latency
= 1;
80
state->
target_residency
= 1 * 2;
81
state->
power_usage
= 3;
82
state->
flags
= 0;
83
state->
flags
|=
CPUIDLE_FLAG_TIME_VALID
;
84
state->
enter
= cpuidle_sleep_enter;
85
86
drv->
safe_state_index
= i-1;
87
88
if
(
sh_mobile_sleep_supported
&
SUSP_SH_SF
) {
89
state = &drv->
states
[i++];
90
snprintf
(state->
name
,
CPUIDLE_NAME_LEN
,
"C2"
);
91
strncpy
(state->
desc
,
"SuperH Sleep Mode [SF]"
,
92
CPUIDLE_DESC_LEN
);
93
state->
exit_latency
= 100;
94
state->
target_residency
= 1 * 2;
95
state->
power_usage
= 1;
96
state->
flags
= 0;
97
state->
flags
|=
CPUIDLE_FLAG_TIME_VALID
;
98
state->
enter
= cpuidle_sleep_enter;
99
}
100
101
if
(
sh_mobile_sleep_supported
&
SUSP_SH_STANDBY
) {
102
state = &drv->
states
[i++];
103
snprintf
(state->
name
,
CPUIDLE_NAME_LEN
,
"C3"
);
104
strncpy
(state->
desc
,
"SuperH Mobile Standby Mode [SF]"
,
105
CPUIDLE_DESC_LEN
);
106
state->
exit_latency
= 2300;
107
state->
target_residency
= 1 * 2;
108
state->
power_usage
= 1;
109
state->
flags
= 0;
110
state->
flags
|=
CPUIDLE_FLAG_TIME_VALID
;
111
state->
enter
= cpuidle_sleep_enter;
112
}
113
114
drv->
state_count
=
i
;
115
dev->
state_count
=
i
;
116
117
cpuidle_register_driver
(&cpuidle_driver);
118
119
cpuidle_register_device
(dev);
120
}
Generated on Thu Jan 10 2013 12:55:33 for Linux Kernel by
1.8.2