1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef __ARCH_ARM_MACH_OMAP2_POWERDOMAIN_H
18#define __ARCH_ARM_MACH_OMAP2_POWERDOMAIN_H
19
20#include <linux/types.h>
21#include <linux/list.h>
22#include <linux/spinlock.h>
23
24#include "voltage.h"
25
26
27#define PWRDM_POWER_OFF 0x0
28#define PWRDM_POWER_RET 0x1
29#define PWRDM_POWER_INACTIVE 0x2
30#define PWRDM_POWER_ON 0x3
31
32#define PWRDM_MAX_PWRSTS 4
33
34
35#define PWRSTS_ON (1 << PWRDM_POWER_ON)
36#define PWRSTS_INACTIVE (1 << PWRDM_POWER_INACTIVE)
37#define PWRSTS_RET (1 << PWRDM_POWER_RET)
38#define PWRSTS_OFF (1 << PWRDM_POWER_OFF)
39
40#define PWRSTS_OFF_ON (PWRSTS_OFF | PWRSTS_ON)
41#define PWRSTS_OFF_RET (PWRSTS_OFF | PWRSTS_RET)
42#define PWRSTS_RET_ON (PWRSTS_RET | PWRSTS_ON)
43#define PWRSTS_OFF_RET_ON (PWRSTS_OFF_RET | PWRSTS_ON)
44
45
46
47
48
49
50
51
52
53
54
55
56
57#define PWRDM_HAS_HDWR_SAR BIT(0)
58#define PWRDM_HAS_MPU_QUIRK BIT(1)
59#define PWRDM_HAS_LOWPOWERSTATECHANGE BIT(2)
60
61
62
63
64
65#define PWRDM_MAX_MEM_BANKS 5
66
67
68
69
70
71#define PWRDM_MAX_CLKDMS 11
72
73
74#define PWRDM_TRANSITION_BAILOUT 100000
75
76struct clockdomain;
77struct powerdomain;
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112struct powerdomain {
113 const char *name;
114 union {
115 const char *name;
116 struct voltagedomain *ptr;
117 } voltdm;
118 const s16 prcm_offs;
119 const u8 pwrsts;
120 const u8 pwrsts_logic_ret;
121 const u8 flags;
122 const u8 banks;
123 const u8 pwrsts_mem_ret[PWRDM_MAX_MEM_BANKS];
124 const u8 pwrsts_mem_on[PWRDM_MAX_MEM_BANKS];
125 const u8 prcm_partition;
126 struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS];
127 struct list_head node;
128 struct list_head voltdm_node;
129 int state;
130 unsigned state_counter[PWRDM_MAX_PWRSTS];
131 unsigned ret_logic_off_counter;
132 unsigned ret_mem_off_counter[PWRDM_MAX_MEM_BANKS];
133 spinlock_t _lock;
134 unsigned long _lock_flags;
135 const u8 pwrstctrl_offs;
136 const u8 pwrstst_offs;
137 const u32 logicretstate_mask;
138 const u32 mem_on_mask[PWRDM_MAX_MEM_BANKS];
139 const u32 mem_ret_mask[PWRDM_MAX_MEM_BANKS];
140 const u32 mem_pwrst_mask[PWRDM_MAX_MEM_BANKS];
141 const u32 mem_retst_mask[PWRDM_MAX_MEM_BANKS];
142
143#ifdef CONFIG_PM_DEBUG
144 s64 timer;
145 s64 state_timer[PWRDM_MAX_PWRSTS];
146#endif
147};
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180struct pwrdm_ops {
181 int (*pwrdm_set_next_pwrst)(struct powerdomain *pwrdm, u8 pwrst);
182 int (*pwrdm_read_next_pwrst)(struct powerdomain *pwrdm);
183 int (*pwrdm_read_pwrst)(struct powerdomain *pwrdm);
184 int (*pwrdm_read_prev_pwrst)(struct powerdomain *pwrdm);
185 int (*pwrdm_set_logic_retst)(struct powerdomain *pwrdm, u8 pwrst);
186 int (*pwrdm_set_mem_onst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
187 int (*pwrdm_set_mem_retst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
188 int (*pwrdm_read_logic_pwrst)(struct powerdomain *pwrdm);
189 int (*pwrdm_read_prev_logic_pwrst)(struct powerdomain *pwrdm);
190 int (*pwrdm_read_logic_retst)(struct powerdomain *pwrdm);
191 int (*pwrdm_read_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
192 int (*pwrdm_read_prev_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
193 int (*pwrdm_read_mem_retst)(struct powerdomain *pwrdm, u8 bank);
194 int (*pwrdm_clear_all_prev_pwrst)(struct powerdomain *pwrdm);
195 int (*pwrdm_enable_hdwr_sar)(struct powerdomain *pwrdm);
196 int (*pwrdm_disable_hdwr_sar)(struct powerdomain *pwrdm);
197 int (*pwrdm_set_lowpwrstchange)(struct powerdomain *pwrdm);
198 int (*pwrdm_wait_transition)(struct powerdomain *pwrdm);
199};
200
201int pwrdm_register_platform_funcs(struct pwrdm_ops *custom_funcs);
202int pwrdm_register_pwrdms(struct powerdomain **pwrdm_list);
203int pwrdm_complete_init(void);
204
205struct powerdomain *pwrdm_lookup(const char *name);
206
207int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
208 void *user);
209int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user),
210 void *user);
211
212int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
213int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
214int pwrdm_for_each_clkdm(struct powerdomain *pwrdm,
215 int (*fn)(struct powerdomain *pwrdm,
216 struct clockdomain *clkdm));
217struct voltagedomain *pwrdm_get_voltdm(struct powerdomain *pwrdm);
218
219int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm);
220
221int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst);
222int pwrdm_read_next_pwrst(struct powerdomain *pwrdm);
223int pwrdm_read_pwrst(struct powerdomain *pwrdm);
224int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm);
225int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm);
226
227int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst);
228int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
229int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
230
231int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm);
232int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm);
233int pwrdm_read_logic_retst(struct powerdomain *pwrdm);
234int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank);
235int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank);
236int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank);
237
238int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm);
239int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm);
240bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm);
241
242int pwrdm_state_switch_nolock(struct powerdomain *pwrdm);
243int pwrdm_state_switch(struct powerdomain *pwrdm);
244int pwrdm_pre_transition(struct powerdomain *pwrdm);
245int pwrdm_post_transition(struct powerdomain *pwrdm);
246int pwrdm_get_context_loss_count(struct powerdomain *pwrdm);
247bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm);
248
249extern int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 state);
250
251extern void omap242x_powerdomains_init(void);
252extern void omap243x_powerdomains_init(void);
253extern void omap3xxx_powerdomains_init(void);
254extern void am33xx_powerdomains_init(void);
255extern void omap44xx_powerdomains_init(void);
256
257extern struct pwrdm_ops omap2_pwrdm_operations;
258extern struct pwrdm_ops omap3_pwrdm_operations;
259extern struct pwrdm_ops am33xx_pwrdm_operations;
260extern struct pwrdm_ops omap4_pwrdm_operations;
261
262
263extern u32 omap2_pwrdm_get_mem_bank_onstate_mask(u8 bank);
264extern u32 omap2_pwrdm_get_mem_bank_retst_mask(u8 bank);
265extern u32 omap2_pwrdm_get_mem_bank_stst_mask(u8 bank);
266
267extern struct powerdomain wkup_omap2_pwrdm;
268extern struct powerdomain gfx_omap2_pwrdm;
269
270extern void pwrdm_lock(struct powerdomain *pwrdm);
271extern void pwrdm_unlock(struct powerdomain *pwrdm);
272
273#endif
274