0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef __ARCH_ARM_MACH_OMAP2_POWERDOMAIN_H
0015 #define __ARCH_ARM_MACH_OMAP2_POWERDOMAIN_H
0016
0017 #include <linux/types.h>
0018 #include <linux/list.h>
0019 #include <linux/spinlock.h>
0020
0021
0022 #define PWRDM_POWER_OFF 0x0
0023 #define PWRDM_POWER_RET 0x1
0024 #define PWRDM_POWER_INACTIVE 0x2
0025 #define PWRDM_POWER_ON 0x3
0026
0027 #define PWRDM_MAX_PWRSTS 4
0028
0029
0030 #define PWRSTS_ON (1 << PWRDM_POWER_ON)
0031 #define PWRSTS_INACTIVE (1 << PWRDM_POWER_INACTIVE)
0032 #define PWRSTS_RET (1 << PWRDM_POWER_RET)
0033 #define PWRSTS_OFF (1 << PWRDM_POWER_OFF)
0034
0035 #define PWRSTS_OFF_ON (PWRSTS_OFF | PWRSTS_ON)
0036 #define PWRSTS_OFF_RET (PWRSTS_OFF | PWRSTS_RET)
0037 #define PWRSTS_RET_ON (PWRSTS_RET | PWRSTS_ON)
0038 #define PWRSTS_OFF_RET_ON (PWRSTS_OFF_RET | PWRSTS_ON)
0039 #define PWRSTS_INA_ON (PWRSTS_INACTIVE | PWRSTS_ON)
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053 #define PWRDM_HAS_HDWR_SAR BIT(0)
0054 #define PWRDM_HAS_MPU_QUIRK BIT(1)
0055 #define PWRDM_HAS_LOWPOWERSTATECHANGE BIT(2)
0056
0057
0058
0059
0060
0061 #define PWRDM_MAX_MEM_BANKS 5
0062
0063
0064
0065
0066
0067 #define PWRDM_MAX_CLKDMS 11
0068
0069
0070 #define PWRDM_TRANSITION_BAILOUT 100000
0071
0072 struct clockdomain;
0073 struct powerdomain;
0074 struct voltagedomain;
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109 struct powerdomain {
0110 const char *name;
0111 union {
0112 const char *name;
0113 struct voltagedomain *ptr;
0114 } voltdm;
0115 const s16 prcm_offs;
0116 const u8 pwrsts;
0117 const u8 pwrsts_logic_ret;
0118 const u8 flags;
0119 const u8 banks;
0120 const u8 pwrsts_mem_ret[PWRDM_MAX_MEM_BANKS];
0121 const u8 pwrsts_mem_on[PWRDM_MAX_MEM_BANKS];
0122 const u8 prcm_partition;
0123 struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS];
0124 struct list_head node;
0125 struct list_head voltdm_node;
0126 int state;
0127 unsigned state_counter[PWRDM_MAX_PWRSTS];
0128 unsigned ret_logic_off_counter;
0129 unsigned ret_mem_off_counter[PWRDM_MAX_MEM_BANKS];
0130 spinlock_t _lock;
0131 unsigned long _lock_flags;
0132 const u8 pwrstctrl_offs;
0133 const u8 pwrstst_offs;
0134 const u32 logicretstate_mask;
0135 const u32 mem_on_mask[PWRDM_MAX_MEM_BANKS];
0136 const u32 mem_ret_mask[PWRDM_MAX_MEM_BANKS];
0137 const u32 mem_pwrst_mask[PWRDM_MAX_MEM_BANKS];
0138 const u32 mem_retst_mask[PWRDM_MAX_MEM_BANKS];
0139
0140 #ifdef CONFIG_PM_DEBUG
0141 s64 timer;
0142 s64 state_timer[PWRDM_MAX_PWRSTS];
0143 #endif
0144 u32 context;
0145 };
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179 struct pwrdm_ops {
0180 int (*pwrdm_set_next_pwrst)(struct powerdomain *pwrdm, u8 pwrst);
0181 int (*pwrdm_read_next_pwrst)(struct powerdomain *pwrdm);
0182 int (*pwrdm_read_pwrst)(struct powerdomain *pwrdm);
0183 int (*pwrdm_read_prev_pwrst)(struct powerdomain *pwrdm);
0184 int (*pwrdm_set_logic_retst)(struct powerdomain *pwrdm, u8 pwrst);
0185 int (*pwrdm_set_mem_onst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
0186 int (*pwrdm_set_mem_retst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
0187 int (*pwrdm_read_logic_pwrst)(struct powerdomain *pwrdm);
0188 int (*pwrdm_read_prev_logic_pwrst)(struct powerdomain *pwrdm);
0189 int (*pwrdm_read_logic_retst)(struct powerdomain *pwrdm);
0190 int (*pwrdm_read_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
0191 int (*pwrdm_read_prev_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
0192 int (*pwrdm_read_mem_retst)(struct powerdomain *pwrdm, u8 bank);
0193 int (*pwrdm_clear_all_prev_pwrst)(struct powerdomain *pwrdm);
0194 int (*pwrdm_enable_hdwr_sar)(struct powerdomain *pwrdm);
0195 int (*pwrdm_disable_hdwr_sar)(struct powerdomain *pwrdm);
0196 int (*pwrdm_set_lowpwrstchange)(struct powerdomain *pwrdm);
0197 int (*pwrdm_wait_transition)(struct powerdomain *pwrdm);
0198 int (*pwrdm_has_voltdm)(void);
0199 void (*pwrdm_save_context)(struct powerdomain *pwrdm);
0200 void (*pwrdm_restore_context)(struct powerdomain *pwrdm);
0201 };
0202
0203 int pwrdm_register_platform_funcs(struct pwrdm_ops *custom_funcs);
0204 int pwrdm_register_pwrdms(struct powerdomain **pwrdm_list);
0205 int pwrdm_complete_init(void);
0206
0207 struct powerdomain *pwrdm_lookup(const char *name);
0208
0209 int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
0210 void *user);
0211 int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user),
0212 void *user);
0213
0214 int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
0215
0216 int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm);
0217
0218 u8 pwrdm_get_valid_lp_state(struct powerdomain *pwrdm,
0219 bool is_logic_state, u8 req_state);
0220
0221 int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst);
0222 int pwrdm_read_next_pwrst(struct powerdomain *pwrdm);
0223 int pwrdm_read_pwrst(struct powerdomain *pwrdm);
0224 int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm);
0225 int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm);
0226
0227 int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst);
0228 int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
0229 int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
0230
0231 int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm);
0232 int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm);
0233 int pwrdm_read_logic_retst(struct powerdomain *pwrdm);
0234 int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank);
0235 int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank);
0236 int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank);
0237
0238 int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm);
0239 int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm);
0240 bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm);
0241
0242 int pwrdm_state_switch_nolock(struct powerdomain *pwrdm);
0243 int pwrdm_state_switch(struct powerdomain *pwrdm);
0244 int pwrdm_pre_transition(struct powerdomain *pwrdm);
0245 int pwrdm_post_transition(struct powerdomain *pwrdm);
0246 int pwrdm_get_context_loss_count(struct powerdomain *pwrdm);
0247 bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm);
0248
0249 extern int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 state);
0250
0251 extern void omap242x_powerdomains_init(void);
0252 extern void omap243x_powerdomains_init(void);
0253 extern void omap3xxx_powerdomains_init(void);
0254 extern void am33xx_powerdomains_init(void);
0255 extern void omap44xx_powerdomains_init(void);
0256 extern void omap54xx_powerdomains_init(void);
0257 extern void dra7xx_powerdomains_init(void);
0258 void am43xx_powerdomains_init(void);
0259
0260 extern struct pwrdm_ops omap2_pwrdm_operations;
0261 extern struct pwrdm_ops omap3_pwrdm_operations;
0262 extern struct pwrdm_ops am33xx_pwrdm_operations;
0263 extern struct pwrdm_ops omap4_pwrdm_operations;
0264
0265
0266 extern u32 omap2_pwrdm_get_mem_bank_onstate_mask(u8 bank);
0267 extern u32 omap2_pwrdm_get_mem_bank_retst_mask(u8 bank);
0268 extern u32 omap2_pwrdm_get_mem_bank_stst_mask(u8 bank);
0269
0270 extern struct powerdomain wkup_omap2_pwrdm;
0271 extern struct powerdomain gfx_omap2_pwrdm;
0272
0273 extern void pwrdm_lock(struct powerdomain *pwrdm);
0274 extern void pwrdm_unlock(struct powerdomain *pwrdm);
0275
0276 extern void pwrdms_save_context(void);
0277 extern void pwrdms_restore_context(void);
0278
0279 extern void pwrdms_lost_power(void);
0280 #endif